@finbourne/lusid-sdk-angular6
Version:
An angular (6+) SDK for secure access to the LUSID® by FINBOURNE web API
25 lines (24 loc) • 44.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* LUSID API
* # Introduction This page documents the [LUSID APIs](https://api.finbourne.com/swagger), which allows authorised clients to query and update their data within the LUSID platform. SDKs to interact with the LUSID APIs are available in the following languages : * [C#](https://github.com/finbourne/lusid-sdk-csharp) * [Java](https://github.com/finbourne/lusid-sdk-java) * [JavaScript](https://github.com/finbourne/lusid-sdk-js) * [Python](https://github.com/finbourne/lusid-sdk-python) # Data Model The LUSID API has a relatively lightweight but extremely powerful data model. One of the goals of LUSID was not to enforce on clients a single rigid data model but rather to provide a flexible foundation onto which clients can streamline their data. One of the primary tools to extend the data model is through using properties. Properties can be associated with amongst others: - * Transactions * Instruments * Portfolios The LUSID data model is exposed through the LUSID APIs. The APIs provide access to both business objects and the meta data used to configure the systems behaviours. The key business entities are: - * **Portfolios** A portfolio is the primary container for transactions and holdings. * **Derived Portfolios** Derived portfolios allow portfolios to be created based on other portfolios, by overriding or overlaying specific items * **Holdings** A holding is a position account for a instrument within a portfolio. Holdings can only be adjusted via transactions. * **Transactions** A Transaction is a source of transactions used to manipulate holdings. * **Corporate Actions** A corporate action is a market event which occurs to a instrument, for example a stock split * **Instruments** A instrument represents a currency, tradable instrument or OTC contract that is attached to a transaction and a holding. * **Properties** Several entities allow additional user defined properties to be associated with them. For example, a Portfolio manager may be associated with a portfolio Meta data includes: - * **Transaction Types** Transactions are booked with a specific transaction type. The types are client defined and are used to map the Transaction to a series of movements which update the portfolio holdings. * **Properties Types** Types of user defined properties used within the system. This section describes the data model that LUSID exposes via the APIs. ## Scope All data in LUSID is segregated at the client level. Entities in LUSID are identifiable by a unique code. Every entity lives within a logical data partition known as a Scope. Scope is an identity namespace allowing two entities with the same unique code to co-exist within individual address spaces. For example, prices for equities from different vendors may be uploaded into different scopes such as `client/vendor1` and `client/vendor2`. A portfolio may then be valued using either of the price sources by referencing the appropriate scope. LUSID Clients cannot access scopes of other clients. ## Schema A detailed description of the entities used by the API and parameters for endpoints which take a JSON document can be retrieved via the `schema` endpoint. ## Instruments LUSID has its own built-in instrument master which you can use to master your own instrument universe. Every instrument must be created with one or more unique market identifiers, such as [FIGI](https://openfigi.com/) or RIC code. For any non-listed instruments (eg OTCs), you can upload an instrument against a custom ID of your choosing. In addition, LUSID will allocate each instrument a unique 'LUSID instrument identifier'. The LUSID instrument identifier is what is used when uploading transactions, holdings, prices, etc. The API exposes an `instrument/lookup` endpoint which can be used to lookup these LUSID identifiers using their market identifiers. Cash can be referenced using the ISO currency code prefixed with \"`CCY_`\" e.g. `CCY_GBP` ## Instrument Prices (Analytics) Instrument prices are stored in LUSID's Analytics Store | Field|Type|Description | | ---|---|--- | | InstrumentUid|string|Unique instrument identifier | | Value|decimal|Value of the analytic, eg price | | Denomination|string|Underlying unit of the analytic, eg currency, EPS etc. | ## Instrument Data Instrument data can be uploaded to the system using the [Instrument Properties](#tag/InstrumentProperties) endpoint. | Field|Type|Description | | ---|---|--- | | InstrumentUid|string|Unique instrument identifier | ## Portfolios Portfolios are the top-level entity containers within LUSID, containing transactions, corporate actions and holdings. The transactions build up the portfolio holdings on which valuations, analytics profit & loss and risk can be calculated. Properties can be associated with Portfolios to add in additional model data. Portfolio properties can be changed over time as well. For example, to allow a Portfolio Manager to be linked with a Portfolio. Additionally, portfolios can be securitised and held by other portfolios, allowing LUSID to perform \"drill-through\" into underlying fund holdings ### Reference Portfolios Reference portfolios are portfolios that contain only weights, as opposed to transactions, and are designed to represent entities such as indices. ### Derived Portfolios LUSID also allows for a portfolio to be composed of another portfolio via derived portfolios. A derived portfolio can contain its own transactions and also inherits any transactions from its parent portfolio. Any changes made to the parent portfolio are automatically reflected in derived portfolio. Derived portfolios in conjunction with scopes are a powerful construct. For example, to do pre-trade what-if analysis, a derived portfolio could be created a new namespace linked to the underlying live (parent) portfolio. Analysis can then be undertaken on the derived portfolio without affecting the live portfolio. ### Portfolio Groups Portfolio groups allow the construction of a hierarchy from portfolios and groups. Portfolio operations on the group are executed on an aggregated set of portfolios in the hierarchy. For example: * Global Portfolios _(group)_ * APAC _(group)_ * Hong Kong _(portfolio)_ * Japan _(portfolio)_ * Europe _(group)_ * France _(portfolio)_ * Germany _(portfolio)_ * UK _(portfolio)_ In this example **Global Portfolios** is a group that consists of an aggregate of **Hong Kong**, **Japan**, **France**, **Germany** and **UK** portfolios. ### Movements Engine The Movements engine sits on top of the immutable event store and is used to manage the relationship between input trading actions and their associated portfolio holdings. The movements engine reads in the following entity types:- * Posting Transactions * Applying Corporate Actions * Holding Adjustments These are converted to one or more movements and used by the movements engine to calculate holdings. At the same time it also calculates running balances, and realised P&L. The outputs from the movements engine are holdings and transactions. ## Transactions A transaction represents an economic activity against a Portfolio. Transactions are processed according to a configuration. This will tell the LUSID engine how to interpret the transaction and correctly update the holdings. LUSID comes with a set of transaction types you can use out of the box, or you can configure your own set(s) of transactions. For more details see the [LUSID Getting Started Guide for transaction configuration.](https://support.finbourne.com/hc/en-us/articles/360016737511-Configuring-Transaction-Types) | Field|Type|Description | | ---|---|--- | | TransactionId|string|Unique transaction identifier | | Type|string|LUSID transaction type code - Buy, Sell, StockIn, StockOut, etc | | InstrumentUid|string|Unique instrument identifier | | TransactionDate|datetime|Transaction date | | SettlementDate|datetime|Settlement date | | Units|decimal|Quantity of transaction in units of the instrument | | TransactionPrice|tradeprice|Execution price for the transaction | | TotalConsideration|currencyandamount|Total value of the transaction | | ExchangeRate|decimal|Rate between transaction and settle currency | | TransactionCurrency|currency|Transaction currency | | CounterpartyId|string|Counterparty identifier | | Source|string|Where this transaction came from | | NettingSet|string| | ### Example Transactions #### A Common Purchase Example Three example transactions are shown in the table below. They represent a purchase of USD denominated IBM shares within a Sterling denominated portfolio. * The first two transactions are for separate buy and fx trades * Buying 500 IBM shares for $71,480.00 * A foreign exchange conversion to fund the IBM purchase. (Buy $71,480.00 for £54,846.60) * The third transaction is an alternate version of the above trades. Buying 500 IBM shares and settling directly in Sterling. | Column | Buy Trade | Fx Trade | Buy Trade with foreign Settlement | | ----- | ----- | ----- | ----- | | TransactionId | FBN00001 | FBN00002 | FBN00003 | | Type | Buy | FxBuy | Buy | | InstrumentUid | FIGI_BBG000BLNNH6 | CCY_USD | FIGI_BBG000BLNNH6 | | TransactionDate | 2018-08-02 | 2018-08-02 | 2018-08-02 | | SettlementDate | 2018-08-06 | 2018-08-06 | 2018-08-06 | | Units | 500 | 71480 | 500 | | TransactionPrice | 142.96 | 1 | 142.96 | | TradeCurrency | USD | USD | USD | | ExchangeRate | 1 | 0.7673 | 0.7673 | | TotalConsideration.Amount | 71480.00 | 54846.60 | 54846.60 | | TotalConsideration.Currency | USD | GBP | GBP | | Trade/default/TradeToPortfolioRate* | 0.7673 | 0.7673 | 0.7673 | [* This is a property field] #### A Forward FX Example LUSID has a flexible transaction modelling system, and there are a number of different ways of modelling forward fx trades. The default LUSID transaction types are FwdFxBuy and FwdFxSell. Other types and behaviours can be configured as required. Using these transaction types, the holdings query will report two forward positions. One in each currency. Since an FX trade is an exchange of one currency for another, the following two 6 month forward transactions are equivalent: | Column | Forward 'Sell' Trade | Forward 'Buy' Trade | | ----- | ----- | ----- | | TransactionId | FBN00004 | FBN00005 | | Type | FwdFxSell | FwdFxBuy | | InstrumentUid | CCY_GBP | CCY_USD | | TransactionDate | 2018-08-02 | 2018-08-02 | | SettlementDate | 2019-02-06 | 2019-02-06 | | Units | 10000.00 | 13142.00 | | TransactionPrice |1 | 1 | | TradeCurrency | GBP | USD | | ExchangeRate | 1.3142 | 0.760919 | | TotalConsideration.Amount | 13142.00 | 10000.00 | | TotalConsideration.Currency | USD | GBP | | Trade/default/TradeToPortfolioRate | 1.0 | 0.760919 | ## Holdings A holding represents a position in a instrument or cash on a given date. | Field|Type|Description | | ---|---|--- | | InstrumentUid|string|Unique instrument identifier | | HoldingType|string|Type of holding, eg Position, Balance, CashCommitment, Receivable, ForwardFX | | Units|decimal|Quantity of holding | | SettledUnits|decimal|Settled quantity of holding | | Cost|currencyandamount|Book cost of holding in transaction currency | | CostPortfolioCcy|currencyandamount|Book cost of holding in portfolio currency | | Transaction|TransactionDto|If this is commitment-type holding, the transaction behind it | ## Corporate Actions Corporate actions are represented within LUSID in terms of a set of instrument-specific 'transitions'. These transitions are used to specify the participants of the corporate action, and the effect that the corporate action will have on holdings in those participants. *Corporate action* | Field|Type|Description | | ---|---|--- | | SourceId|id| | | CorporateActionCode|code| | | AnnouncementDate|datetime| | | ExDate|datetime| | | RecordDate|datetime| | | PaymentDate|datetime| | *Transition* | Field|Type|Description | | ---|---|--- | ## Property Properties are key-value pairs that can be applied to any entity within a domain (where a domain is `trade`, `portfolio`, `security` etc). Properties must be defined before use with a `PropertyDefinition` and can then subsequently be added to entities. # Schemas The following headers are returned on all responses from LUSID | Name | Purpose | | --- | --- | | lusid-meta-duration | Duration of the request | | lusid-meta-success | Whether or not LUSID considered the request to be successful | | lusid-meta-requestId | The unique identifier for the request | | lusid-schema-url | Url of the schema for the data being returned | | lusid-property-schema-url | Url of the schema for any properties | # Error Codes | Code|Name|Description | | ---|---|--- | | <a name=\"100\">100</a>|Personalisations not found|The personalisation(s) identified by the pattern provided could not be found, either because it does not exist or it has been deleted. Please check the pattern your provided. | | <a name=\"101\">101</a>|NonRecursivePersonalisation| | | <a name=\"102\">102</a>|VersionNotFound| | | <a name=\"104\">104</a>|InstrumentNotFound| | | <a name=\"105\">105</a>|PropertyNotFound| | | <a name=\"106\">106</a>|PortfolioRecursionDepth| | | <a name=\"108\">108</a>|GroupNotFound| | | <a name=\"109\">109</a>|PortfolioNotFound| | | <a name=\"110\">110</a>|PropertySchemaNotFound| | | <a name=\"111\">111</a>|PortfolioAncestryNotFound| | | <a name=\"112\">112</a>|PortfolioWithIdAlreadyExists| | | <a name=\"113\">113</a>|OrphanedPortfolio| | | <a name=\"119\">119</a>|MissingBaseClaims| | | <a name=\"121\">121</a>|PropertyNotDefined| | | <a name=\"122\">122</a>|CannotDeleteSystemProperty| | | <a name=\"123\">123</a>|CannotModifyImmutablePropertyField| | | <a name=\"124\">124</a>|PropertyAlreadyExists| | | <a name=\"125\">125</a>|InvalidPropertyLifeTime| | | <a name=\"127\">127</a>|CannotModifyDefaultDataType| | | <a name=\"128\">128</a>|GroupAlreadyExists| | | <a name=\"129\">129</a>|NoSuchDataType| | | <a name=\"132\">132</a>|ValidationError| | | <a name=\"133\">133</a>|LoopDetectedInGroupHierarchy| | | <a name=\"135\">135</a>|SubGroupAlreadyExists| | | <a name=\"138\">138</a>|PriceSourceNotFound| | | <a name=\"139\">139</a>|AnalyticStoreNotFound| | | <a name=\"141\">141</a>|AnalyticStoreAlreadyExists| | | <a name=\"143\">143</a>|ClientInstrumentAlreadyExists| | | <a name=\"144\">144</a>|DuplicateInParameterSet| | | <a name=\"147\">147</a>|ResultsNotFound| | | <a name=\"148\">148</a>|OrderFieldNotInResultSet| | | <a name=\"149\">149</a>|OperationFailed| | | <a name=\"150\">150</a>|ElasticSearchError| | | <a name=\"151\">151</a>|InvalidParameterValue| | | <a name=\"153\">153</a>|CommandProcessingFailure| | | <a name=\"154\">154</a>|EntityStateConstructionFailure| | | <a name=\"155\">155</a>|EntityTimelineDoesNotExist| | | <a name=\"156\">156</a>|EventPublishFailure| | | <a name=\"157\">157</a>|InvalidRequestFailure| | | <a name=\"158\">158</a>|EventPublishUnknown| | | <a name=\"159\">159</a>|EventQueryFailure| | | <a name=\"160\">160</a>|BlobDidNotExistFailure| | | <a name=\"162\">162</a>|SubSystemRequestFailure| | | <a name=\"163\">163</a>|SubSystemConfigurationFailure| | | <a name=\"165\">165</a>|FailedToDelete| | | <a name=\"166\">166</a>|UpsertClientInstrumentFailure| | | <a name=\"167\">167</a>|IllegalAsAtInterval| | | <a name=\"168\">168</a>|IllegalBitemporalQuery| | | <a name=\"169\">169</a>|InvalidAlternateId| | | <a name=\"170\">170</a>|CannotAddSourcePortfolioPropertyExplicitly| | | <a name=\"171\">171</a>|EntityAlreadyExistsInGroup| | | <a name=\"173\">173</a>|EntityWithIdAlreadyExists| | | <a name=\"174\">174</a>|PortfolioDetailsDoNotExist| | | <a name=\"176\">176</a>|PortfolioWithNameAlreadyExists| | | <a name=\"177\">177</a>|InvalidTransactions| | | <a name=\"178\">178</a>|ReferencePortfolioNotFound| | | <a name=\"179\">179</a>|DuplicateIdFailure| | | <a name=\"180\">180</a>|CommandRetrievalFailure| | | <a name=\"181\">181</a>|DataFilterApplicationFailure| | | <a name=\"182\">182</a>|SearchFailed| | | <a name=\"183\">183</a>|MovementsEngineConfigurationKeyFailure| | | <a name=\"184\">184</a>|FxRateSourceNotFound| | | <a name=\"185\">185</a>|AccrualSourceNotFound| | | <a name=\"186\">186</a>|EntitlementsFailure| | | <a name=\"187\">187</a>|InvalidIdentityToken| | | <a name=\"188\">188</a>|InvalidRequestHeaders| | | <a name=\"189\">189</a>|PriceNotFound| | | <a name=\"190\">190</a>|InvalidSubHoldingKeysProvided| | | <a name=\"191\">191</a>|DuplicateSubHoldingKeysProvided| | | <a name=\"192\">192</a>|CutDefinitionNotFound| | | <a name=\"193\">193</a>|CutDefinitionInvalid| | | <a name=\"200\">200</a>|InvalidUnitForDataType| | | <a name=\"201\">201</a>|InvalidTypeForDataType| | | <a name=\"202\">202</a>|InvalidValueForDataType| | | <a name=\"203\">203</a>|UnitNotDefinedForDataType| | | <a name=\"204\">204</a>|UnitsNotSupportedOnDataType| | | <a name=\"205\">205</a>|CannotSpecifyUnitsOnDataType| | | <a name=\"206\">206</a>|UnitSchemaInconsistentWithDataType| | | <a name=\"207\">207</a>|UnitDefinitionNotSpecified| | | <a name=\"208\">208</a>|DuplicateUnitDefinitionsSpecified| | | <a name=\"209\">209</a>|InvalidUnitsDefinition| | | <a name=\"210\">210</a>|InvalidInstrumentIdentifierUnit| | | <a name=\"211\">211</a>|HoldingsAdjustmentDoesNotExist| | | <a name=\"212\">212</a>|CouldNotBuildExcelUrl| | | <a name=\"213\">213</a>|CouldNotGetExcelVersion| | | <a name=\"214\">214</a>|InstrumentByCodeNotFound| | | <a name=\"215\">215</a>|EntitySchemaDoesNotExist| | | <a name=\"216\">216</a>|FeatureNotSupportedOnPortfolioType| | | <a name=\"217\">217</a>|QuoteNotFoundFailure| | | <a name=\"219\">219</a>|InvalidInstrumentDefinition| | | <a name=\"221\">221</a>|InstrumentUpsertFailure| | | <a name=\"222\">222</a>|ReferencePortfolioRequestNotSupported| | | <a name=\"223\">223</a>|TransactionPortfolioRequestNotSupported| | | <a name=\"224\">224</a>|InvalidPropertyValueAssignment| | | <a name=\"230\">230</a>|TransactionTypeNotFound| | | <a name=\"231\">231</a>|TransactionTypeDuplication| | | <a name=\"-10\">-10</a>|ServerConfigurationError| | | <a name=\"-1\">-1</a>|Unknown error| |
*
* OpenAPI spec version: 0.7.124
* Contact: info\@finbourne.com
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
* @record
*/
export function ErrorDetailBase() { }
/** @type {?|undefined} */
ErrorDetailBase.prototype.id;
/** @type {?|undefined} */
ErrorDetailBase.prototype.type;
/** @type {?|undefined} */
ErrorDetailBase.prototype.detail;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JEZXRhaWxCYXNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGZpbmJvdXJuZS9sdXNpZC1zZGstYW5ndWxhcjYvIiwic291cmNlcyI6WyJsaWIvZ2VuZXJhdGVkL21vZGVsL2Vycm9yRGV0YWlsQmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIExVU0lEIEFQSVxyXG4gKiAjIEludHJvZHVjdGlvbiAgVGhpcyBwYWdlIGRvY3VtZW50cyB0aGUgW0xVU0lEIEFQSXNdKGh0dHBzOi8vYXBpLmZpbmJvdXJuZS5jb20vc3dhZ2dlciksIHdoaWNoIGFsbG93cyBhdXRob3Jpc2VkIGNsaWVudHMgdG8gcXVlcnkgYW5kIHVwZGF0ZSB0aGVpciBkYXRhIHdpdGhpbiB0aGUgTFVTSUQgcGxhdGZvcm0uICBTREtzIHRvIGludGVyYWN0IHdpdGggdGhlIExVU0lEIEFQSXMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgZm9sbG93aW5nIGxhbmd1YWdlcyA6ICAqIFtDI10oaHR0cHM6Ly9naXRodWIuY29tL2ZpbmJvdXJuZS9sdXNpZC1zZGstY3NoYXJwKSAqIFtKYXZhXShodHRwczovL2dpdGh1Yi5jb20vZmluYm91cm5lL2x1c2lkLXNkay1qYXZhKSAqIFtKYXZhU2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vZmluYm91cm5lL2x1c2lkLXNkay1qcykgKiBbUHl0aG9uXShodHRwczovL2dpdGh1Yi5jb20vZmluYm91cm5lL2x1c2lkLXNkay1weXRob24pICAjIERhdGEgTW9kZWwgIFRoZSBMVVNJRCBBUEkgaGFzIGEgcmVsYXRpdmVseSBsaWdodHdlaWdodCBidXQgZXh0cmVtZWx5IHBvd2VyZnVsIGRhdGEgbW9kZWwuICAgT25lIG9mIHRoZSBnb2FscyBvZiBMVVNJRCB3YXMgbm90IHRvIGVuZm9yY2Ugb24gY2xpZW50cyBhIHNpbmdsZSByaWdpZCBkYXRhIG1vZGVsIGJ1dCByYXRoZXIgdG8gcHJvdmlkZSBhIGZsZXhpYmxlIGZvdW5kYXRpb24gb250byB3aGljaCBjbGllbnRzIGNhbiBzdHJlYW1saW5lIHRoZWlyIGRhdGEuICAgT25lIG9mIHRoZSBwcmltYXJ5IHRvb2xzIHRvIGV4dGVuZCB0aGUgZGF0YSBtb2RlbCBpcyB0aHJvdWdoIHVzaW5nIHByb3BlcnRpZXMuICBQcm9wZXJ0aWVzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYW1vbmdzdCBvdGhlcnM6IC0gKiBUcmFuc2FjdGlvbnMgKiBJbnN0cnVtZW50cyAqIFBvcnRmb2xpb3MgICBUaGUgTFVTSUQgZGF0YSBtb2RlbCBpcyBleHBvc2VkIHRocm91Z2ggdGhlIExVU0lEIEFQSXMuICBUaGUgQVBJcyBwcm92aWRlIGFjY2VzcyB0byBib3RoIGJ1c2luZXNzIG9iamVjdHMgYW5kIHRoZSBtZXRhIGRhdGEgdXNlZCB0byBjb25maWd1cmUgdGhlIHN5c3RlbXMgYmVoYXZpb3Vycy4gICBUaGUga2V5IGJ1c2luZXNzIGVudGl0aWVzIGFyZTogLSAqICoqUG9ydGZvbGlvcyoqIEEgcG9ydGZvbGlvIGlzIHRoZSBwcmltYXJ5IGNvbnRhaW5lciBmb3IgdHJhbnNhY3Rpb25zIGFuZCBob2xkaW5ncy4gICogKipEZXJpdmVkIFBvcnRmb2xpb3MqKiBEZXJpdmVkIHBvcnRmb2xpb3MgYWxsb3cgcG9ydGZvbGlvcyB0byBiZSBjcmVhdGVkIGJhc2VkIG9uIG90aGVyIHBvcnRmb2xpb3MsIGJ5IG92ZXJyaWRpbmcgb3Igb3ZlcmxheWluZyBzcGVjaWZpYyBpdGVtcyAqICoqSG9sZGluZ3MqKiBBIGhvbGRpbmcgaXMgYSBwb3NpdGlvbiBhY2NvdW50IGZvciBhIGluc3RydW1lbnQgd2l0aGluIGEgcG9ydGZvbGlvLiAgSG9sZGluZ3MgY2FuIG9ubHkgYmUgYWRqdXN0ZWQgdmlhIHRyYW5zYWN0aW9ucy4gKiAqKlRyYW5zYWN0aW9ucyoqIEEgVHJhbnNhY3Rpb24gaXMgYSBzb3VyY2Ugb2YgdHJhbnNhY3Rpb25zIHVzZWQgdG8gbWFuaXB1bGF0ZSBob2xkaW5ncy4gICogKipDb3Jwb3JhdGUgQWN0aW9ucyoqIEEgY29ycG9yYXRlIGFjdGlvbiBpcyBhIG1hcmtldCBldmVudCB3aGljaCBvY2N1cnMgdG8gYSBpbnN0cnVtZW50LCBmb3IgZXhhbXBsZSBhIHN0b2NrIHNwbGl0ICogKipJbnN0cnVtZW50cyoqICBBIGluc3RydW1lbnQgcmVwcmVzZW50cyBhIGN1cnJlbmN5LCB0cmFkYWJsZSBpbnN0cnVtZW50IG9yIE9UQyBjb250cmFjdCB0aGF0IGlzIGF0dGFjaGVkIHRvIGEgdHJhbnNhY3Rpb24gYW5kIGEgaG9sZGluZy4gKiAqKlByb3BlcnRpZXMqKiBTZXZlcmFsIGVudGl0aWVzIGFsbG93IGFkZGl0aW9uYWwgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZW0uICAgRm9yIGV4YW1wbGUsIGEgUG9ydGZvbGlvIG1hbmFnZXIgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHBvcnRmb2xpbyAgTWV0YSBkYXRhIGluY2x1ZGVzOiAtICogKipUcmFuc2FjdGlvbiBUeXBlcyoqIFRyYW5zYWN0aW9ucyBhcmUgYm9va2VkIHdpdGggYSBzcGVjaWZpYyB0cmFuc2FjdGlvbiB0eXBlLiAgVGhlIHR5cGVzIGFyZSBjbGllbnQgZGVmaW5lZCBhbmQgYXJlIHVzZWQgdG8gbWFwIHRoZSBUcmFuc2FjdGlvbiB0byBhIHNlcmllcyBvZiBtb3ZlbWVudHMgd2hpY2ggdXBkYXRlIHRoZSBwb3J0Zm9saW8gaG9sZGluZ3MuICAqICoqUHJvcGVydGllcyBUeXBlcyoqIFR5cGVzIG9mIHVzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzIHVzZWQgd2l0aGluIHRoZSBzeXN0ZW0uICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBkYXRhIG1vZGVsIHRoYXQgTFVTSUQgZXhwb3NlcyB2aWEgdGhlIEFQSXMuICAjIyBTY29wZSAgQWxsIGRhdGEgaW4gTFVTSUQgaXMgc2VncmVnYXRlZCBhdCB0aGUgY2xpZW50IGxldmVsLiAgRW50aXRpZXMgaW4gTFVTSUQgYXJlIGlkZW50aWZpYWJsZSBieSBhIHVuaXF1ZSBjb2RlLiAgRXZlcnkgZW50aXR5IGxpdmVzIHdpdGhpbiBhIGxvZ2ljYWwgZGF0YSBwYXJ0aXRpb24ga25vd24gYXMgYSBTY29wZS4gIFNjb3BlIGlzIGFuIGlkZW50aXR5IG5hbWVzcGFjZSBhbGxvd2luZyB0d28gZW50aXRpZXMgd2l0aCB0aGUgc2FtZSB1bmlxdWUgY29kZSB0byBjby1leGlzdCB3aXRoaW4gaW5kaXZpZHVhbCBhZGRyZXNzIHNwYWNlcy4gIEZvciBleGFtcGxlLCBwcmljZXMgZm9yIGVxdWl0aWVzIGZyb20gZGlmZmVyZW50IHZlbmRvcnMgbWF5IGJlIHVwbG9hZGVkIGludG8gZGlmZmVyZW50IHNjb3BlcyBzdWNoIGFzIGBjbGllbnQvdmVuZG9yMWAgYW5kIGBjbGllbnQvdmVuZG9yMmAuICBBIHBvcnRmb2xpbyBtYXkgdGhlbiBiZSB2YWx1ZWQgdXNpbmcgZWl0aGVyIG9mIHRoZSBwcmljZSBzb3VyY2VzIGJ5IHJlZmVyZW5jaW5nIHRoZSBhcHByb3ByaWF0ZSBzY29wZS4gIExVU0lEIENsaWVudHMgY2Fubm90IGFjY2VzcyBzY29wZXMgb2Ygb3RoZXIgY2xpZW50cy4gICMjIFNjaGVtYSAgQSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgZW50aXRpZXMgdXNlZCBieSB0aGUgQVBJIGFuZCBwYXJhbWV0ZXJzIGZvciBlbmRwb2ludHMgd2hpY2ggdGFrZSBhIEpTT04gZG9jdW1lbnQgY2FuIGJlIHJldHJpZXZlZCB2aWEgdGhlIGBzY2hlbWFgIGVuZHBvaW50LiAgIyMgSW5zdHJ1bWVudHMgIExVU0lEIGhhcyBpdHMgb3duIGJ1aWx0LWluIGluc3RydW1lbnQgbWFzdGVyIHdoaWNoIHlvdSBjYW4gdXNlIHRvIG1hc3RlciB5b3VyIG93biBpbnN0cnVtZW50IHVuaXZlcnNlLiAgRXZlcnkgaW5zdHJ1bWVudCBtdXN0IGJlIGNyZWF0ZWQgd2l0aCBvbmUgb3IgbW9yZSB1bmlxdWUgbWFya2V0IGlkZW50aWZpZXJzLCBzdWNoIGFzIFtGSUdJXShodHRwczovL29wZW5maWdpLmNvbS8pIG9yIFJJQyBjb2RlLiBGb3IgYW55IG5vbi1saXN0ZWQgaW5zdHJ1bWVudHMgKGVnIE9UQ3MpLCB5b3UgY2FuIHVwbG9hZCBhbiBpbnN0cnVtZW50IGFnYWluc3QgYSBjdXN0b20gSUQgb2YgeW91ciBjaG9vc2luZy4gIEluIGFkZGl0aW9uLCBMVVNJRCB3aWxsIGFsbG9jYXRlIGVhY2ggaW5zdHJ1bWVudCBhIHVuaXF1ZSAnTFVTSUQgaW5zdHJ1bWVudCBpZGVudGlmaWVyJy4gVGhlIExVU0lEIGluc3RydW1lbnQgaWRlbnRpZmllciBpcyB3aGF0IGlzIHVzZWQgd2hlbiB1cGxvYWRpbmcgdHJhbnNhY3Rpb25zLCBob2xkaW5ncywgcHJpY2VzLCBldGMuIFRoZSBBUEkgZXhwb3NlcyBhbiBgaW5zdHJ1bWVudC9sb29rdXBgIGVuZHBvaW50IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGxvb2t1cCB0aGVzZSBMVVNJRCBpZGVudGlmaWVycyB1c2luZyB0aGVpciBtYXJrZXQgaWRlbnRpZmllcnMuICBDYXNoIGNhbiBiZSByZWZlcmVuY2VkIHVzaW5nIHRoZSBJU08gY3VycmVuY3kgY29kZSBwcmVmaXhlZCB3aXRoIFxcXCJgQ0NZX2BcXFwiIGUuZy4gYENDWV9HQlBgICAjIyBJbnN0cnVtZW50IFByaWNlcyAoQW5hbHl0aWNzKSAgSW5zdHJ1bWVudCBwcmljZXMgYXJlIHN0b3JlZCBpbiBMVVNJRCdzIEFuYWx5dGljcyBTdG9yZSAgfCBGaWVsZHxUeXBlfERlc2NyaXB0aW9uIHwgfCAtLS18LS0tfC0tLSB8IHwgSW5zdHJ1bWVudFVpZHxzdHJpbmd8VW5pcXVlIGluc3RydW1lbnQgaWRlbnRpZmllciB8IHwgVmFsdWV8ZGVjaW1hbHxWYWx1ZSBvZiB0aGUgYW5hbHl0aWMsIGVnIHByaWNlIHwgfCBEZW5vbWluYXRpb258c3RyaW5nfFVuZGVybHlpbmcgdW5pdCBvZiB0aGUgYW5hbHl0aWMsIGVnIGN1cnJlbmN5LCBFUFMgZXRjLiB8ICAgIyMgSW5zdHJ1bWVudCBEYXRhICBJbnN0cnVtZW50IGRhdGEgY2FuIGJlIHVwbG9hZGVkIHRvIHRoZSBzeXN0ZW0gdXNpbmcgdGhlIFtJbnN0cnVtZW50IFByb3BlcnRpZXNdKCN0YWcvSW5zdHJ1bWVudFByb3BlcnRpZXMpIGVuZHBvaW50LiAgfCBGaWVsZHxUeXBlfERlc2NyaXB0aW9uIHwgfCAtLS18LS0tfC0tLSB8IHwgSW5zdHJ1bWVudFVpZHxzdHJpbmd8VW5pcXVlIGluc3RydW1lbnQgaWRlbnRpZmllciB8ICAgIyMgUG9ydGZvbGlvcyAgUG9ydGZvbGlvcyBhcmUgdGhlIHRvcC1sZXZlbCBlbnRpdHkgY29udGFpbmVycyB3aXRoaW4gTFVTSUQsIGNvbnRhaW5pbmcgdHJhbnNhY3Rpb25zLCBjb3Jwb3JhdGUgYWN0aW9ucyBhbmQgaG9sZGluZ3MuICAgIFRoZSB0cmFuc2FjdGlvbnMgYnVpbGQgdXAgdGhlIHBvcnRmb2xpbyBob2xkaW5ncyBvbiB3aGljaCB2YWx1YXRpb25zLCBhbmFseXRpY3MgcHJvZml0ICYgbG9zcyBhbmQgcmlzayBjYW4gYmUgY2FsY3VsYXRlZC4gICAgIFByb3BlcnRpZXMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBQb3J0Zm9saW9zIHRvIGFkZCBpbiBhZGRpdGlvbmFsIG1vZGVsIGRhdGEuICBQb3J0Zm9saW8gcHJvcGVydGllcyBjYW4gYmUgY2hhbmdlZCBvdmVyIHRpbWUgYXMgd2VsbC4gIEZvciBleGFtcGxlLCB0byBhbGxvdyBhIFBvcnRmb2xpbyBNYW5hZ2VyIHRvIGJlIGxpbmtlZCB3aXRoIGEgUG9ydGZvbGlvLiAgQWRkaXRpb25hbGx5LCBwb3J0Zm9saW9zIGNhbiBiZSBzZWN1cml0aXNlZCBhbmQgaGVsZCBieSBvdGhlciBwb3J0Zm9saW9zLCBhbGxvd2luZyBMVVNJRCB0byBwZXJmb3JtIFxcXCJkcmlsbC10aHJvdWdoXFxcIiBpbnRvIHVuZGVybHlpbmcgZnVuZCBob2xkaW5ncyAgIyMjIFJlZmVyZW5jZSBQb3J0Zm9saW9zIFJlZmVyZW5jZSBwb3J0Zm9saW9zIGFyZSBwb3J0Zm9saW9zIHRoYXQgY29udGFpbiBvbmx5IHdlaWdodHMsIGFzIG9wcG9zZWQgdG8gdHJhbnNhY3Rpb25zLCBhbmQgYXJlIGRlc2lnbmVkIHRvIHJlcHJlc2VudCBlbnRpdGllcyBzdWNoIGFzIGluZGljZXMuICAjIyMgRGVyaXZlZCBQb3J0Zm9saW9zICBMVVNJRCBhbHNvIGFsbG93cyBmb3IgYSBwb3J0Zm9saW8gdG8gYmUgY29tcG9zZWQgb2YgYW5vdGhlciBwb3J0Zm9saW8gdmlhIGRlcml2ZWQgcG9ydGZvbGlvcy4gIEEgZGVyaXZlZCBwb3J0Zm9saW8gY2FuIGNvbnRhaW4gaXRzIG93biB0cmFuc2FjdGlvbnMgYW5kIGFsc28gaW5oZXJpdHMgYW55IHRyYW5zYWN0aW9ucyBmcm9tIGl0cyBwYXJlbnQgcG9ydGZvbGlvLiAgQW55IGNoYW5nZXMgbWFkZSB0byB0aGUgcGFyZW50IHBvcnRmb2xpbyBhcmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gZGVyaXZlZCBwb3J0Zm9saW8uICBEZXJpdmVkIHBvcnRmb2xpb3MgaW4gY29uanVuY3Rpb24gd2l0aCBzY29wZXMgYXJlIGEgcG93ZXJmdWwgY29uc3RydWN0LiAgRm9yIGV4YW1wbGUsIHRvIGRvIHByZS10cmFkZSB3aGF0LWlmIGFuYWx5c2lzLCBhIGRlcml2ZWQgcG9ydGZvbGlvIGNvdWxkIGJlIGNyZWF0ZWQgYSBuZXcgbmFtZXNwYWNlIGxpbmtlZCB0byB0aGUgdW5kZXJseWluZyBsaXZlIChwYXJlbnQpIHBvcnRmb2xpby4gIEFuYWx5c2lzIGNhbiB0aGVuIGJlIHVuZGVydGFrZW4gb24gdGhlIGRlcml2ZWQgcG9ydGZvbGlvIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBsaXZlIHBvcnRmb2xpby4gICMjIyBQb3J0Zm9saW8gR3JvdXBzIFBvcnRmb2xpbyBncm91cHMgYWxsb3cgdGhlIGNvbnN0cnVjdGlvbiBvZiBhIGhpZXJhcmNoeSBmcm9tIHBvcnRmb2xpb3MgYW5kIGdyb3Vwcy4gIFBvcnRmb2xpbyBvcGVyYXRpb25zIG9uIHRoZSBncm91cCBhcmUgZXhlY3V0ZWQgb24gYW4gYWdncmVnYXRlZCBzZXQgb2YgcG9ydGZvbGlvcyBpbiB0aGUgaGllcmFyY2h5LiAgIEZvciBleGFtcGxlOiAgICogR2xvYmFsIFBvcnRmb2xpb3MgXyhncm91cClfICAgKiBBUEFDIF8oZ3JvdXApXyAgICAgKiBIb25nIEtvbmcgXyhwb3J0Zm9saW8pXyAgICAgKiBKYXBhbiBfKHBvcnRmb2xpbylfICAgKiBFdXJvcGUgXyhncm91cClfICAgICAqIEZyYW5jZSBfKHBvcnRmb2xpbylfICAgICAqIEdlcm1hbnkgXyhwb3J0Zm9saW8pXyAgICogVUsgXyhwb3J0Zm9saW8pXyAgIEluIHRoaXMgZXhhbXBsZSAqKkdsb2JhbCBQb3J0Zm9saW9zKiogaXMgYSBncm91cCB0aGF0IGNvbnNpc3RzIG9mIGFuIGFnZ3JlZ2F0ZSBvZiAqKkhvbmcgS29uZyoqLCAqKkphcGFuKiosICoqRnJhbmNlKiosICoqR2VybWFueSoqIGFuZCAqKlVLKiogcG9ydGZvbGlvcy4gICMjIyBNb3ZlbWVudHMgRW5naW5lIFRoZSBNb3ZlbWVudHMgZW5naW5lIHNpdHMgb24gdG9wIG9mIHRoZSBpbW11dGFibGUgZXZlbnQgc3RvcmUgYW5kIGlzIHVzZWQgdG8gbWFuYWdlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbnB1dCB0cmFkaW5nIGFjdGlvbnMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgcG9ydGZvbGlvIGhvbGRpbmdzLiAgICAgVGhlIG1vdmVtZW50cyBlbmdpbmUgcmVhZHMgaW4gdGhlIGZvbGxvd2luZyBlbnRpdHkgdHlwZXM6LSAqIFBvc3RpbmcgVHJhbnNhY3Rpb25zICogQXBwbHlpbmcgQ29ycG9yYXRlIEFjdGlvbnMgICogSG9sZGluZyBBZGp1c3RtZW50cyAgVGhlc2UgYXJlIGNvbnZlcnRlZCB0byBvbmUgb3IgbW9yZSBtb3ZlbWVudHMgYW5kIHVzZWQgYnkgdGhlIG1vdmVtZW50cyBlbmdpbmUgdG8gY2FsY3VsYXRlIGhvbGRpbmdzLiAgQXQgdGhlIHNhbWUgdGltZSBpdCBhbHNvIGNhbGN1bGF0ZXMgcnVubmluZyBiYWxhbmNlcywgYW5kIHJlYWxpc2VkIFAmTC4gIFRoZSBvdXRwdXRzIGZyb20gdGhlIG1vdmVtZW50cyBlbmdpbmUgYXJlIGhvbGRpbmdzIGFuZCB0cmFuc2FjdGlvbnMuICAjIyBUcmFuc2FjdGlvbnMgIEEgdHJhbnNhY3Rpb24gcmVwcmVzZW50cyBhbiBlY29ub21pYyBhY3Rpdml0eSBhZ2FpbnN0IGEgUG9ydGZvbGlvLiAgVHJhbnNhY3Rpb25zIGFyZSBwcm9jZXNzZWQgYWNjb3JkaW5nIHRvIGEgY29uZmlndXJhdGlvbi4gVGhpcyB3aWxsIHRlbGwgdGhlIExVU0lEIGVuZ2luZSBob3cgdG8gaW50ZXJwcmV0IHRoZSB0cmFuc2FjdGlvbiBhbmQgY29ycmVjdGx5IHVwZGF0ZSB0aGUgaG9sZGluZ3MuIExVU0lEIGNvbWVzIHdpdGggYSBzZXQgb2YgdHJhbnNhY3Rpb24gdHlwZXMgeW91IGNhbiB1c2Ugb3V0IG9mIHRoZSBib3gsIG9yIHlvdSBjYW4gY29uZmlndXJlIHlvdXIgb3duIHNldChzKSBvZiB0cmFuc2FjdGlvbnMuICBGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgW0xVU0lEIEdldHRpbmcgU3RhcnRlZCBHdWlkZSBmb3IgdHJhbnNhY3Rpb24gY29uZmlndXJhdGlvbi5dKGh0dHBzOi8vc3VwcG9ydC5maW5ib3VybmUuY29tL2hjL2VuLXVzL2FydGljbGVzLzM2MDAxNjczNzUxMS1Db25maWd1cmluZy1UcmFuc2FjdGlvbi1UeXBlcykgIHwgRmllbGR8VHlwZXxEZXNjcmlwdGlvbiB8IHwgLS0tfC0tLXwtLS0gfCB8IFRyYW5zYWN0aW9uSWR8c3RyaW5nfFVuaXF1ZSB0cmFuc2FjdGlvbiBpZGVudGlmaWVyIHwgfCBUeXBlfHN0cmluZ3xMVVNJRCB0cmFuc2FjdGlvbiB0eXBlIGNvZGUgLSBCdXksIFNlbGwsIFN0b2NrSW4sIFN0b2NrT3V0LCBldGMgfCB8IEluc3RydW1lbnRVaWR8c3RyaW5nfFVuaXF1ZSBpbnN0cnVtZW50IGlkZW50aWZpZXIgfCB8IFRyYW5zYWN0aW9uRGF0ZXxkYXRldGltZXxUcmFuc2FjdGlvbiBkYXRlIHwgfCBTZXR0bGVtZW50RGF0ZXxkYXRldGltZXxTZXR0bGVtZW50IGRhdGUgfCB8IFVuaXRzfGRlY2ltYWx8UXVhbnRpdHkgb2YgdHJhbnNhY3Rpb24gaW4gdW5pdHMgb2YgdGhlIGluc3RydW1lbnQgfCB8IFRyYW5zYWN0aW9uUHJpY2V8dHJhZGVwcmljZXxFeGVjdXRpb24gcHJpY2UgZm9yIHRoZSB0cmFuc2FjdGlvbiB8IHwgVG90YWxDb25zaWRlcmF0aW9ufGN1cnJlbmN5YW5kYW1vdW50fFRvdGFsIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiB8IHwgRXhjaGFuZ2VSYXRlfGRlY2ltYWx8UmF0ZSBiZXR3ZWVuIHRyYW5zYWN0aW9uIGFuZCBzZXR0bGUgY3VycmVuY3kgfCB8IFRyYW5zYWN0aW9uQ3VycmVuY3l8Y3VycmVuY3l8VHJhbnNhY3Rpb24gY3VycmVuY3kgfCB8IENvdW50ZXJwYXJ0eUlkfHN0cmluZ3xDb3VudGVycGFydHkgaWRlbnRpZmllciB8IHwgU291cmNlfHN0cmluZ3xXaGVyZSB0aGlzIHRyYW5zYWN0aW9uIGNhbWUgZnJvbSB8IHwgTmV0dGluZ1NldHxzdHJpbmd8ICB8ICAgIyMjIEV4YW1wbGUgVHJhbnNhY3Rpb25zICAjIyMjIEEgQ29tbW9uIFB1cmNoYXNlIEV4YW1wbGUgVGhyZWUgZXhhbXBsZSB0cmFuc2FjdGlvbnMgYXJlIHNob3duIGluIHRoZSB0YWJsZSBiZWxvdy4gICBUaGV5IHJlcHJlc2VudCBhIHB1cmNoYXNlIG9mIFVTRCBkZW5vbWluYXRlZCBJQk0gc2hhcmVzIHdpdGhpbiBhIFN0ZXJsaW5nIGRlbm9taW5hdGVkIHBvcnRmb2xpby4gICAqIFRoZSBmaXJzdCB0d28gdHJhbnNhY3Rpb25zIGFyZSBmb3Igc2VwYXJhdGUgYnV5IGFuZCBmeCB0cmFkZXMgICAgKiBCdXlpbmcgNTAwIElCTSBzaGFyZXMgZm9yICQ3MSw0ODAuMDAgICAgKiBBIGZvcmVpZ24gZXhjaGFuZ2UgY29udmVyc2lvbiB0byBmdW5kIHRoZSBJQk0gcHVyY2hhc2UuIChCdXkgJDcxLDQ4MC4wMCBmb3IgJiMxNjM7NTQsODQ2LjYwKSAgKiBUaGUgdGhpcmQgdHJhbnNhY3Rpb24gaXMgYW4gYWx0ZXJuYXRlIHZlcnNpb24gb2YgdGhlIGFib3ZlIHRyYWRlcy4gQnV5aW5nIDUwMCBJQk0gc2hhcmVzIGFuZCBzZXR0bGluZyBkaXJlY3RseSBpbiBTdGVybGluZy4gIHwgQ29sdW1uIHwgIEJ1eSBUcmFkZSB8IEZ4IFRyYWRlIHwgQnV5IFRyYWRlIHdpdGggZm9yZWlnbiBTZXR0bGVtZW50IHwgfCAtLS0tLSB8IC0tLS0tIHwgLS0tLS0gfCAtLS0tLSB8IHwgVHJhbnNhY3Rpb25JZCB8IEZCTjAwMDAxIHwgRkJOMDAwMDIgfCBGQk4wMDAwMyB8IHwgVHlwZSB8IEJ1eSB8IEZ4QnV5IHwgQnV5IHwgfCBJbnN0cnVtZW50VWlkIHwgRklHSV9CQkcwMDBCTE5OSDYgfCBDQ1lfVVNEIHwgRklHSV9CQkcwMDBCTE5OSDYgfCB8IFRyYW5zYWN0aW9uRGF0ZSB8IDIwMTgtMDgtMDIgfCAyMDE4LTA4LTAyIHwgMjAxOC0wOC0wMiB8IHwgU2V0dGxlbWVudERhdGUgfCAyMDE4LTA4LTA2IHwgMjAxOC0wOC0wNiB8IDIwMTgtMDgtMDYgfCB8IFVuaXRzIHwgNTAwIHwgNzE0ODAgfCA1MDAgfCB8IFRyYW5zYWN0aW9uUHJpY2UgfCAxNDIuOTYgfCAxIHwgMTQyLjk2IHwgfCBUcmFkZUN1cnJlbmN5IHwgVVNEIHwgVVNEIHwgVVNEIHwgfCBFeGNoYW5nZVJhdGUgfCAxIHwgMC43NjczIHwgMC43NjczIHwgfCBUb3RhbENvbnNpZGVyYXRpb24uQW1vdW50IHwgNzE0ODAuMDAgfCA1NDg0Ni42MCB8IDU0ODQ2LjYwIHwgfCBUb3RhbENvbnNpZGVyYXRpb24uQ3VycmVuY3kgfCBVU0QgfCBHQlAgfCBHQlAgfCB8IFRyYWRlL2RlZmF1bHQvVHJhZGVUb1BvcnRmb2xpb1JhdGUmYXN0OyB8IDAuNzY3MyB8IDAuNzY3MyB8IDAuNzY3MyB8ICBbJmFzdDsgVGhpcyBpcyBhIHByb3BlcnR5IGZpZWxkXSAgIyMjIyBBIEZvcndhcmQgRlggRXhhbXBsZSAgTFVTSUQgaGFzIGEgZmxleGlibGUgdHJhbnNhY3Rpb24gbW9kZWxsaW5nIHN5c3RlbSwgYW5kIHRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cyBvZiBtb2RlbGxpbmcgZm9yd2FyZCBmeCB0cmFkZXMuICBUaGUgZGVmYXVsdCBMVVNJRCB0cmFuc2FjdGlvbiB0eXBlcyBhcmUgRndkRnhCdXkgYW5kIEZ3ZEZ4U2VsbC4gT3RoZXIgdHlwZXMgYW5kIGJlaGF2aW91cnMgY2FuIGJlIGNvbmZpZ3VyZWQgYXMgcmVxdWlyZWQuICBVc2luZyB0aGVzZSB0cmFuc2FjdGlvbiB0eXBlcywgdGhlIGhvbGRpbmdzIHF1ZXJ5IHdpbGwgcmVwb3J0IHR3byBmb3J3YXJkIHBvc2l0aW9ucy4gT25lIGluIGVhY2ggY3VycmVuY3kuICAgU2luY2UgYW4gRlggdHJhZGUgaXMgYW4gZXhjaGFuZ2Ugb2Ygb25lIGN1cnJlbmN5IGZvciBhbm90aGVyLCB0aGUgZm9sbG93aW5nIHR3byA2IG1vbnRoIGZvcndhcmQgdHJhbnNhY3Rpb25zIGFyZSBlcXVpdmFsZW50OiAgfCBDb2x1bW4gfCAgRm9yd2FyZCAnU2VsbCcgVHJhZGUgfCBGb3J3YXJkICdCdXknIFRyYWRlIHwgfCAtLS0tLSB8IC0tLS0tIHwgLS0tLS0gfCB8IFRyYW5zYWN0aW9uSWQgfCBGQk4wMDAwNCB8IEZCTjAwMDA1IHwgfCBUeXBlIHwgRndkRnhTZWxsIHwgRndkRnhCdXkgfCB8IEluc3RydW1lbnRVaWQgfCBDQ1lfR0JQIHwgQ0NZX1VTRCB8IHwgVHJhbnNhY3Rpb25EYXRlIHwgMjAxOC0wOC0wMiB8IDIwMTgtMDgtMDIgfCB8IFNldHRsZW1lbnREYXRlIHwgMjAxOS0wMi0wNiB8IDIwMTktMDItMDYgfCB8IFVuaXRzIHwgMTAwMDAuMDAgfCAxMzE0Mi4wMCB8IHwgVHJhbnNhY3Rpb25QcmljZSB8MSB8IDEgfCB8IFRyYWRlQ3VycmVuY3kgfCBHQlAgfCBVU0QgfCB8IEV4Y2hhbmdlUmF0ZSB8IDEuMzE0MiB8IDAuNzYwOTE5IHwgfCBUb3RhbENvbnNpZGVyYXRpb24uQW1vdW50IHwgMTMxNDIuMDAgfCAxMDAwMC4wMCB8IHwgVG90YWxDb25zaWRlcmF0aW9uLkN1cnJlbmN5IHwgVVNEIHwgR0JQIHwgfCBUcmFkZS9kZWZhdWx0L1RyYWRlVG9Qb3J0Zm9saW9SYXRlIHwgMS4wIHwgMC43NjA5MTkgfCAgIyMgSG9sZGluZ3MgIEEgaG9sZGluZyByZXByZXNlbnRzIGEgcG9zaXRpb24gaW4gYSBpbnN0cnVtZW50IG9yIGNhc2ggb24gYSBnaXZlbiBkYXRlLiAgfCBGaWVsZHxUeXBlfERlc2NyaXB0aW9uIHwgfCAtLS18LS0tfC0tLSB8IHwgSW5zdHJ1bWVudFVpZHxzdHJpbmd8VW5pcXVlIGluc3RydW1lbnQgaWRlbnRpZmllciB8IHwgSG9sZGluZ1R5cGV8c3RyaW5nfFR5cGUgb2YgaG9sZGluZywgZWcgUG9zaXRpb24sIEJhbGFuY2UsIENhc2hDb21taXRtZW50LCBSZWNlaXZhYmxlLCBGb3J3YXJkRlggfCB8IFVuaXRzfGRlY2ltYWx8UXVhbnRpdHkgb2YgaG9sZGluZyB8IHwgU2V0dGxlZFVuaXRzfGRlY2ltYWx8U2V0dGxlZCBxdWFudGl0eSBvZiBob2xkaW5nIHwgfCBDb3N0fGN1cnJlbmN5YW5kYW1vdW50fEJvb2sgY29zdCBvZiBob2xkaW5nIGluIHRyYW5zYWN0aW9uIGN1cnJlbmN5IHwgfCBDb3N0UG9ydGZvbGlvQ2N5fGN1cnJlbmN5YW5kYW1vdW50fEJvb2sgY29zdCBvZiBob2xkaW5nIGluIHBvcnRmb2xpbyBjdXJyZW5jeSB8IHwgVHJhbnNhY3Rpb258VHJhbnNhY3Rpb25EdG98SWYgdGhpcyBpcyBjb21taXRtZW50LXR5cGUgaG9sZGluZywgdGhlIHRyYW5zYWN0aW9uIGJlaGluZCBpdCB8ICAgIyMgQ29ycG9yYXRlIEFjdGlvbnMgIENvcnBvcmF0ZSBhY3Rpb25zIGFyZSByZXByZXNlbnRlZCB3aXRoaW4gTFVTSUQgaW4gdGVybXMgb2YgYSBzZXQgb2YgaW5zdHJ1bWVudC1zcGVjaWZpYyAndHJhbnNpdGlvbnMnLiAgVGhlc2UgdHJhbnNpdGlvbnMgYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGFydGljaXBhbnRzIG9mIHRoZSBjb3Jwb3JhdGUgYWN0aW9uLCBhbmQgdGhlIGVmZmVjdCB0aGF0IHRoZSBjb3Jwb3JhdGUgYWN0aW9uIHdpbGwgaGF2ZSBvbiBob2xkaW5ncyBpbiB0aG9zZSBwYXJ0aWNpcGFudHMuICAqQ29ycG9yYXRlIGFjdGlvbiogIHwgRmllbGR8VHlwZXxEZXNjcmlwdGlvbiB8IHwgLS0tfC0tLXwtLS0gfCB8IFNvdXJjZUlkfGlkfCAgfCB8IENvcnBvcmF0ZUFjdGlvbkNvZGV8Y29kZXwgIHwgfCBBbm5vdW5jZW1lbnREYXRlfGRhdGV0aW1lfCAgfCB8IEV4RGF0ZXxkYXRldGltZXwgIHwgfCBSZWNvcmREYXRlfGRhdGV0aW1lfCAgfCB8IFBheW1lbnREYXRlfGRhdGV0aW1lfCAgfCAgICAqVHJhbnNpdGlvbiogIHwgRmllbGR8VHlwZXxEZXNjcmlwdGlvbiB8IHwgLS0tfC0tLXwtLS0gfCAgICMjIFByb3BlcnR5ICBQcm9wZXJ0aWVzIGFyZSBrZXktdmFsdWUgcGFpcnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhbnkgZW50aXR5IHdpdGhpbiBhIGRvbWFpbiAod2hlcmUgYSBkb21haW4gaXMgYHRyYWRlYCwgYHBvcnRmb2xpb2AsIGBzZWN1cml0eWAgZXRjKS4gIFByb3BlcnRpZXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSB1c2Ugd2l0aCBhIGBQcm9wZXJ0eURlZmluaXRpb25gIGFuZCBjYW4gdGhlbiBzdWJzZXF1ZW50bHkgYmUgYWRkZWQgdG8gZW50aXRpZXMuICAjIFNjaGVtYXMgIFRoZSBmb2xsb3dpbmcgaGVhZGVycyBhcmUgcmV0dXJuZWQgb24gYWxsIHJlc3BvbnNlcyBmcm9tIExVU0lEICB8IE5hbWUgfCBQdXJwb3NlIHwgfCAtLS0gfCAtLS0gfCB8IGx1c2lkLW1ldGEtZHVyYXRpb24gfCBEdXJhdGlvbiBvZiB0aGUgcmVxdWVzdCB8IHwgbHVzaWQtbWV0YS1zdWNjZXNzIHwgV2hldGhlciBvciBub3QgTFVTSUQgY29uc2lkZXJlZCB0aGUgcmVxdWVzdCB0byBiZSBzdWNjZXNzZnVsIHwgfCBsdXNpZC1tZXRhLXJlcXVlc3RJZCB8IFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QgfCB8IGx1c2lkLXNjaGVtYS11cmwgfCBVcmwgb2YgdGhlIHNjaGVtYSBmb3IgdGhlIGRhdGEgYmVpbmcgcmV0dXJuZWQgfCB8IGx1c2lkLXByb3BlcnR5LXNjaGVtYS11cmwgfCBVcmwgb2YgdGhlIHNjaGVtYSBmb3IgYW55IHByb3BlcnRpZXMgfCAgIyBFcnJvciBDb2RlcyAgfCBDb2RlfE5hbWV8RGVzY3JpcHRpb24gfCB8IC0tLXwtLS18LS0tIHwgfCA8YSBuYW1lPVxcXCIxMDBcXFwiPjEwMDwvYT58UGVyc29uYWxpc2F0aW9ucyBub3QgZm91bmR8VGhlIHBlcnNvbmFsaXNhdGlvbihzKSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJuIHByb3ZpZGVkIGNvdWxkIG5vdCBiZSBmb3VuZCwgZWl0aGVyIGJlY2F1c2UgaXQgZG9lcyBub3QgZXhpc3Qgb3IgaXQgaGFzIGJlZW4gZGVsZXRlZC4gUGxlYXNlIGNoZWNrIHRoZSBwYXR0ZXJuIHlvdXIgcHJvdmlkZWQuIHwgfCA8YSBuYW1lPVxcXCIxMDFcXFwiPjEwMTwvYT58Tm9uUmVjdXJzaXZlUGVyc29uYWxpc2F0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjEwMlxcXCI+MTAyPC9hPnxWZXJzaW9uTm90Rm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTA0XFxcIj4xMDQ8L2E+fEluc3RydW1lbnROb3RGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxMDVcXFwiPjEwNTwvYT58UHJvcGVydHlOb3RGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxMDZcXFwiPjEwNjwvYT58UG9ydGZvbGlvUmVjdXJzaW9uRGVwdGh8ICB8IHwgPGEgbmFtZT1cXFwiMTA4XFxcIj4xMDg8L2E+fEdyb3VwTm90Rm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTA5XFxcIj4xMDk8L2E+fFBvcnRmb2xpb05vdEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjExMFxcXCI+MTEwPC9hPnxQcm9wZXJ0eVNjaGVtYU5vdEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjExMVxcXCI+MTExPC9hPnxQb3J0Zm9saW9BbmNlc3RyeU5vdEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjExMlxcXCI+MTEyPC9hPnxQb3J0Zm9saW9XaXRoSWRBbHJlYWR5RXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjExM1xcXCI+MTEzPC9hPnxPcnBoYW5lZFBvcnRmb2xpb3wgIHwgfCA8YSBuYW1lPVxcXCIxMTlcXFwiPjExOTwvYT58TWlzc2luZ0Jhc2VDbGFpbXN8ICB8IHwgPGEgbmFtZT1cXFwiMTIxXFxcIj4xMjE8L2E+fFByb3BlcnR5Tm90RGVmaW5lZHwgIHwgfCA8YSBuYW1lPVxcXCIxMjJcXFwiPjEyMjwvYT58Q2Fubm90RGVsZXRlU3lzdGVtUHJvcGVydHl8ICB8IHwgPGEgbmFtZT1cXFwiMTIzXFxcIj4xMjM8L2E+fENhbm5vdE1vZGlmeUltbXV0YWJsZVByb3BlcnR5RmllbGR8ICB8IHwgPGEgbmFtZT1cXFwiMTI0XFxcIj4xMjQ8L2E+fFByb3BlcnR5QWxyZWFkeUV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxMjVcXFwiPjEyNTwvYT58SW52YWxpZFByb3BlcnR5TGlmZVRpbWV8ICB8IHwgPGEgbmFtZT1cXFwiMTI3XFxcIj4xMjc8L2E+fENhbm5vdE1vZGlmeURlZmF1bHREYXRhVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIxMjhcXFwiPjEyODwvYT58R3JvdXBBbHJlYWR5RXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjEyOVxcXCI+MTI5PC9hPnxOb1N1Y2hEYXRhVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIxMzJcXFwiPjEzMjwvYT58VmFsaWRhdGlvbkVycm9yfCAgfCB8IDxhIG5hbWU9XFxcIjEzM1xcXCI+MTMzPC9hPnxMb29wRGV0ZWN0ZWRJbkdyb3VwSGllcmFyY2h5fCAgfCB8IDxhIG5hbWU9XFxcIjEzNVxcXCI+MTM1PC9hPnxTdWJHcm91cEFscmVhZHlFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMTM4XFxcIj4xMzg8L2E+fFByaWNlU291cmNlTm90Rm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTM5XFxcIj4xMzk8L2E+fEFuYWx5dGljU3RvcmVOb3RGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxNDFcXFwiPjE0MTwvYT58QW5hbHl0aWNTdG9yZUFscmVhZHlFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMTQzXFxcIj4xNDM8L2E+fENsaWVudEluc3RydW1lbnRBbHJlYWR5RXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjE0NFxcXCI+MTQ0PC9hPnxEdXBsaWNhdGVJblBhcmFtZXRlclNldHwgIHwgfCA8YSBuYW1lPVxcXCIxNDdcXFwiPjE0NzwvYT58UmVzdWx0c05vdEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjE0OFxcXCI+MTQ4PC9hPnxPcmRlckZpZWxkTm90SW5SZXN1bHRTZXR8ICB8IHwgPGEgbmFtZT1cXFwiMTQ5XFxcIj4xNDk8L2E+fE9wZXJhdGlvbkZhaWxlZHwgIHwgfCA8YSBuYW1lPVxcXCIxNTBcXFwiPjE1MDwvYT58RWxhc3RpY1NlYXJjaEVycm9yfCAgfCB8IDxhIG5hbWU9XFxcIjE1MVxcXCI+MTUxPC9hPnxJbnZhbGlkUGFyYW1ldGVyVmFsdWV8ICB8IHwgPGEgbmFtZT1cXFwiMTUzXFxcIj4xNTM8L2E+fENvbW1hbmRQcm9jZXNzaW5nRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxNTRcXFwiPjE1NDwvYT58RW50aXR5U3RhdGVDb25zdHJ1Y3Rpb25GYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE1NVxcXCI+MTU1PC9hPnxFbnRpdHlUaW1lbGluZURvZXNOb3RFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCIxNTZcXFwiPjE1NjwvYT58RXZlbnRQdWJsaXNoRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxNTdcXFwiPjE1NzwvYT58SW52YWxpZFJlcXVlc3RGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE1OFxcXCI+MTU4PC9hPnxFdmVudFB1Ymxpc2hVbmtub3dufCAgfCB8IDxhIG5hbWU9XFxcIjE1OVxcXCI+MTU5PC9hPnxFdmVudFF1ZXJ5RmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxNjBcXFwiPjE2MDwvYT58QmxvYkRpZE5vdEV4aXN0RmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxNjJcXFwiPjE2MjwvYT58U3ViU3lzdGVtUmVxdWVzdEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTYzXFxcIj4xNjM8L2E+fFN1YlN5c3RlbUNvbmZpZ3VyYXRpb25GYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE2NVxcXCI+MTY1PC9hPnxGYWlsZWRUb0RlbGV0ZXwgIHwgfCA8YSBuYW1lPVxcXCIxNjZcXFwiPjE2NjwvYT58VXBzZXJ0Q2xpZW50SW5zdHJ1bWVudEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTY3XFxcIj4xNjc8L2E+fElsbGVnYWxBc0F0SW50ZXJ2YWx8ICB8IHwgPGEgbmFtZT1cXFwiMTY4XFxcIj4xNjg8L2E+fElsbGVnYWxCaXRlbXBvcmFsUXVlcnl8ICB8IHwgPGEgbmFtZT1cXFwiMTY5XFxcIj4xNjk8L2E+fEludmFsaWRBbHRlcm5hdGVJZHwgIHwgfCA8YSBuYW1lPVxcXCIxNzBcXFwiPjE3MDwvYT58Q2Fubm90QWRkU291cmNlUG9ydGZvbGlvUHJvcGVydHlFeHBsaWNpdGx5fCAgfCB8IDxhIG5hbWU9XFxcIjE3MVxcXCI+MTcxPC9hPnxFbnRpdHlBbHJlYWR5RXhpc3RzSW5Hcm91cHwgIHwgfCA8YSBuYW1lPVxcXCIxNzNcXFwiPjE3MzwvYT58RW50aXR5V2l0aElkQWxyZWFkeUV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxNzRcXFwiPjE3NDwvYT58UG9ydGZvbGlvRGV0YWlsc0RvTm90RXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMTc2XFxcIj4xNzY8L2E+fFBvcnRmb2xpb1dpdGhOYW1lQWxyZWFkeUV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxNzdcXFwiPjE3NzwvYT58SW52YWxpZFRyYW5zYWN0aW9uc3wgIHwgfCA8YSBuYW1lPVxcXCIxNzhcXFwiPjE3ODwvYT58UmVmZXJlbmNlUG9ydGZvbGlvTm90Rm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTc5XFxcIj4xNzk8L2E+fER1cGxpY2F0ZUlkRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxODBcXFwiPjE4MDwvYT58Q29tbWFuZFJldHJpZXZhbEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTgxXFxcIj4xODE8L2E+fERhdGFGaWx0ZXJBcHBsaWNhdGlvbkZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTgyXFxcIj4xODI8L2E+fFNlYXJjaEZhaWxlZHwgIHwgfCA8YSBuYW1lPVxcXCIxODNcXFwiPjE4MzwvYT58TW92ZW1lbnRzRW5naW5lQ29uZmlndXJhdGlvbktleUZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTg0XFxcIj4xODQ8L2E+fEZ4UmF0ZVNvdXJjZU5vdEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjE4NVxcXCI+MTg1PC9hPnxBY2NydWFsU291cmNlTm90Rm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTg2XFxcIj4xODY8L2E+fEVudGl0bGVtZW50c0ZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTg3XFxcIj4xODc8L2E+fEludmFsaWRJZGVudGl0eVRva2VufCAgfCB8IDxhIG5hbWU9XFxcIjE4OFxcXCI+MTg4PC9hPnxJbnZhbGlkUmVxdWVzdEhlYWRlcnN8ICB8IHwgPGEgbmFtZT1cXFwiMTg5XFxcIj4xODk8L2E+fFByaWNlTm90Rm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTkwXFxcIj4xOTA8L2E+fEludmFsaWRTdWJIb2xkaW5nS2V5c1Byb3ZpZGVkfCAgfCB8IDxhIG5hbWU9XFxcIjE5MVxcXCI+MTkxPC9hPnxEdXBsaWNhdGVTdWJIb2xkaW5nS2V5c1Byb3ZpZGVkfCAgfCB8IDxhIG5hbWU9XFxcIjE5MlxcXCI+MTkyPC9hPnxDdXREZWZpbml0aW9uTm90Rm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTkzXFxcIj4xOTM8L2E+fEN1dERlZmluaXRpb25JbnZhbGlkfCAgfCB8IDxhIG5hbWU9XFxcIjIwMFxcXCI+MjAwPC9hPnxJbnZhbGlkVW5pdEZvckRhdGFUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwMVxcXCI+MjAxPC9hPnxJbnZhbGlkVHlwZUZvckRhdGFUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwMlxcXCI+MjAyPC9hPnxJbnZhbGlkVmFsdWVGb3JEYXRhVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMDNcXFwiPjIwMzwvYT58VW5pdE5vdERlZmluZWRGb3JEYXRhVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMDRcXFwiPjIwNDwvYT58VW5pdHNOb3RTdXBwb3J0ZWRPbkRhdGFUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwNVxcXCI+MjA1PC9hPnxDYW5ub3RTcGVjaWZ5VW5pdHNPbkRhdGFUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwNlxcXCI+MjA2PC9hPnxVbml0U2NoZW1hSW5jb25zaXN0ZW50V2l0aERhdGFUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwN1xcXCI+MjA3PC9hPnxVbml0RGVmaW5pdGlvbk5vdFNwZWNpZmllZHwgIHwgfCA8YSBuYW1lPVxcXCIyMDhcXFwiPjIwODwvYT58RHVwbGljYXRlVW5pdERlZmluaXRpb25zU3BlY2lmaWVkfCAgfCB8IDxhIG5hbWU9XFxcIjIwOVxcXCI+MjA5PC9hPnxJbnZhbGlkVW5pdHNEZWZpbml0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjIxMFxcXCI+MjEwPC9hPnxJbnZhbGlkSW5zdHJ1bWVudElkZW50aWZpZXJVbml0fCAgfCB8IDxhIG5hbWU9XFxcIjIxMVxcXCI+MjExPC9hPnxIb2xkaW5nc0FkanVzdG1lbnREb2VzTm90RXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMjEyXFxcIj4yMTI8L2E+fENvdWxkTm90QnVpbGRFeGNlbFVybHwgIHwgfCA8YSBuYW1lPVxcXCIyMTNcXFwiPjIxMzwvYT58Q291bGROb3RHZXRFeGNlbFZlcnNpb258ICB8IHwgPGEgbmFtZT1cXFwiMjE0XFxcIj4yMTQ8L2E+fEluc3RydW1lbnRCeUNvZGVOb3RGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIyMTVcXFwiPjIxNTwvYT58RW50aXR5U2NoZW1hRG9lc05vdEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjIxNlxcXCI+MjE2PC9hPnxGZWF0dXJlTm90U3VwcG9ydGVkT25Qb3J0Zm9saW9UeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIxN1xcXCI+MjE3PC9hPnxRdW90ZU5vdEZvdW5kRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIyMTlcXFwiPjIxOTwvYT58SW52YWxpZEluc3RydW1lbnREZWZpbml0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjIyMVxcXCI+MjIxPC9hPnxJbnN0cnVtZW50VXBzZXJ0RmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIyMjJcXFwiPjIyMjwvYT58UmVmZXJlbmNlUG9ydGZvbGlvUmVxdWVzdE5vdFN1cHBvcnRlZHwgIHwgfCA8YSBuYW1lPVxcXCIyMjNcXFwiPjIyMzwvYT58VHJhbnNhY3Rpb25Qb3J0Zm9saW9SZXF1ZXN0Tm90U3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjIyNFxcXCI+MjI0PC9hPnxJbnZhbGlkUHJvcGVydHlWYWx1ZUFzc2lnbm1lbnR8ICB8IHwgPGEgbmFtZT1cXFwiMjMwXFxcIj4yMzA8L2E+fFRyYW5zYWN0aW9uVHlwZU5vdEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjIzMVxcXCI+MjMxPC9hPnxUcmFuc2FjdGlvblR5cGVEdXBsaWNhdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCItMTBcXFwiPi0xMDwvYT58U2VydmVyQ29uZmlndXJhdGlvbkVycm9yfCAgfCB8IDxhIG5hbWU9XFxcIi0xXFxcIj4tMTwvYT58VW5rbm93biBlcnJvcnwgIHwgXHJcbiAqXHJcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAwLjcuMTI0XHJcbiAqIENvbnRhY3Q6IGluZm9AZmluYm91cm5lLmNvbVxyXG4gKlxyXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XHJcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cclxuICovXHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFcnJvckRldGFpbEJhc2UgeyBcclxuICAgIGlkPzogc3RyaW5nO1xyXG4gICAgdHlwZT86IHN0cmluZztcclxuICAgIGRldGFpbD86IHN0cmluZztcclxufVxyXG4iXX0=