diff --git a/sdk/storage/azure-storage-blob/CHANGELOG.md b/sdk/storage/azure-storage-blob/CHANGELOG.md
index 37bcb49eb308..40c2be5a7f7f 100644
--- a/sdk/storage/azure-storage-blob/CHANGELOG.md
+++ b/sdk/storage/azure-storage-blob/CHANGELOG.md
@@ -1,5 +1,7 @@
# Release History
+## 12.9.0b1 (Unreleased)
+
## 12.8.1 (2021-04-20)
**Fixes**
- Fixed retry on large block upload
@@ -13,7 +15,6 @@
- Added retry for blob download (#17974, #10572)
- Fixed encryption algorithm hardcoded setting (#17835)
-
## 12.8.0 (2021-03-01)
**Stable release of preview features**
- Added `ContainerClient.exists()` method
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_azure_blob_storage.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_azure_blob_storage.py
index dff7e12276c2..eed3bbde964c 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_azure_blob_storage.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_azure_blob_storage.py
@@ -15,6 +15,8 @@
# pylint: disable=unused-import,ungrouped-imports
from typing import Any
+ from azure.core.pipeline.transport import HttpRequest, HttpResponse
+
from ._configuration import AzureBlobStorageConfiguration
from .operations import ServiceOperations
from .operations import ContainerOperations
@@ -77,6 +79,24 @@ def __init__(
self.block_blob = BlockBlobOperations(
self._client, self._config, self._serialize, self._deserialize)
+ def _send_request(self, http_request, **kwargs):
+ # type: (HttpRequest, Any) -> HttpResponse
+ """Runs the network request through the client's chained policies.
+
+ :param http_request: The network request you want to make. Required.
+ :type http_request: ~azure.core.pipeline.transport.HttpRequest
+ :keyword bool stream: Whether the response payload will be streamed. Defaults to True.
+ :return: The response of your network call. Does not do error handling on your response.
+ :rtype: ~azure.core.pipeline.transport.HttpResponse
+ """
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ http_request.url = self._client.format_url(http_request.url, **path_format_arguments)
+ stream = kwargs.pop("stream", True)
+ pipeline_response = self._client._pipeline.run(http_request, stream=stream, **kwargs)
+ return pipeline_response.http_response
+
def close(self):
# type: () -> None
self._client.close()
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_configuration.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_configuration.py
index fb74f9ee4f8b..0e0d578e8aa6 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_configuration.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/_configuration.py
@@ -38,7 +38,7 @@ def __init__(
super(AzureBlobStorageConfiguration, self).__init__(**kwargs)
self.url = url
- self.version = "2020-06-12"
+ self.version = "2020-08-04"
kwargs.setdefault('sdk_moniker', 'azureblobstorage/{}'.format(VERSION))
self._configure(**kwargs)
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_azure_blob_storage.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_azure_blob_storage.py
index b53703478e99..77935aaf1e03 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_azure_blob_storage.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_azure_blob_storage.py
@@ -9,6 +9,7 @@
from typing import Any
from azure.core import AsyncPipelineClient
+from azure.core.pipeline.transport import AsyncHttpResponse, HttpRequest
from msrest import Deserializer, Serializer
from ._configuration import AzureBlobStorageConfiguration
@@ -72,6 +73,23 @@ def __init__(
self.block_blob = BlockBlobOperations(
self._client, self._config, self._serialize, self._deserialize)
+ async def _send_request(self, http_request: HttpRequest, **kwargs: Any) -> AsyncHttpResponse:
+ """Runs the network request through the client's chained policies.
+
+ :param http_request: The network request you want to make. Required.
+ :type http_request: ~azure.core.pipeline.transport.HttpRequest
+ :keyword bool stream: Whether the response payload will be streamed. Defaults to True.
+ :return: The response of your network call. Does not do error handling on your response.
+ :rtype: ~azure.core.pipeline.transport.AsyncHttpResponse
+ """
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ http_request.url = self._client.format_url(http_request.url, **path_format_arguments)
+ stream = kwargs.pop("stream", True)
+ pipeline_response = await self._client._pipeline.run(http_request, stream=stream, **kwargs)
+ return pipeline_response.http_response
+
async def close(self) -> None:
await self._client.close()
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_configuration.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_configuration.py
index 1924efa17196..c230fe87c2d9 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_configuration.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/_configuration.py
@@ -33,7 +33,7 @@ def __init__(
super(AzureBlobStorageConfiguration, self).__init__(**kwargs)
self.url = url
- self.version = "2020-06-12"
+ self.version = "2020-08-04"
kwargs.setdefault('sdk_moniker', 'azureblobstorage/{}'.format(VERSION))
self._configure(**kwargs)
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_append_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_append_blob_operations.py
index 934b7207a81f..2c0c852b66f1 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_append_blob_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_append_blob_operations.py
@@ -6,7 +6,7 @@
# Changes may cause incorrect behavior and will be lost if the code is regenerated.
# --------------------------------------------------------------------------
import datetime
-from typing import Any, Callable, Dict, Generic, IO, Optional, TypeVar
+from typing import Any, Callable, Dict, Generic, IO, Optional, TypeVar, Union
import warnings
from azure.core.exceptions import ClientAuthenticationError, HttpResponseError, ResourceExistsError, ResourceNotFoundError, map_error
@@ -47,6 +47,9 @@ async def create(
metadata: Optional[str] = None,
request_id_parameter: Optional[str] = None,
blob_tags_string: Optional[str] = None,
+ immutability_policy_expiry: Optional[datetime.datetime] = None,
+ immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None,
+ legal_hold: Optional[bool] = None,
blob_http_headers: Optional["_models.BlobHTTPHeaders"] = None,
lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None,
cpk_info: Optional["_models.CpkInfo"] = None,
@@ -75,6 +78,13 @@ async def create(
:type request_id_parameter: str
:param blob_tags_string: Optional. Used to set blob tags in various blob operations.
:type blob_tags_string: str
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
:param blob_http_headers: Parameter group.
:type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders
:param lease_access_conditions: Parameter group.
@@ -191,6 +201,12 @@ async def create(
header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
if blob_tags_string is not None:
header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ if legal_hold is not None:
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
request = self._client.put(url, query_parameters, header_parameters)
@@ -199,7 +215,7 @@ async def create(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -368,7 +384,7 @@ async def append_block(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -568,7 +584,7 @@ async def append_block_from_url(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -682,7 +698,7 @@ async def seal(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_blob_operations.py
index 0f296df8c98c..56e32017b0e6 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_blob_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_blob_operations.py
@@ -176,7 +176,7 @@ async def download(
if response.status_code not in [200, 206]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -220,6 +220,9 @@ async def download(
response_headers['x-ms-tag-count']=self._deserialize('long', response.headers.get('x-ms-tag-count'))
response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed'))
response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time'))
+ response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date'))
+ response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode'))
+ response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold'))
deserialized = response.stream_download(self._client._pipeline)
if response.status_code == 206:
@@ -263,6 +266,9 @@ async def download(
response_headers['x-ms-tag-count']=self._deserialize('long', response.headers.get('x-ms-tag-count'))
response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed'))
response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time'))
+ response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date'))
+ response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode'))
+ response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold'))
deserialized = response.stream_download(self._client._pipeline)
if cls:
@@ -388,7 +394,7 @@ async def get_properties(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -438,6 +444,9 @@ async def get_properties(
response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed'))
response_headers['x-ms-rehydrate-priority']=self._deserialize('str', response.headers.get('x-ms-rehydrate-priority'))
response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time'))
+ response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date'))
+ response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode'))
+ response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold'))
if cls:
return cls(pipeline_response, None, response_headers)
@@ -568,7 +577,7 @@ async def delete(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -691,7 +700,7 @@ async def set_access_control(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -798,7 +807,7 @@ async def get_access_control(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -989,7 +998,7 @@ async def rename(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1060,7 +1069,7 @@ async def undelete(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1137,7 +1146,7 @@ async def set_expiry(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1268,7 +1277,7 @@ async def set_http_headers(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1285,6 +1294,237 @@ async def set_http_headers(
set_http_headers.metadata = {'url': '/{containerName}/{blob}'} # type: ignore
+ async def set_immutability_policy(
+ self,
+ timeout: Optional[int] = None,
+ request_id_parameter: Optional[str] = None,
+ immutability_policy_expiry: Optional[datetime.datetime] = None,
+ immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None,
+ modified_access_conditions: Optional["_models.ModifiedAccessConditions"] = None,
+ **kwargs
+ ) -> None:
+ """The Set Immutability Policy operation sets the immutability policy on the blob.
+
+ :param timeout: The timeout parameter is expressed in seconds. For more information, see
+ :code:`Setting Timeouts for Blob Service Operations.`.
+ :type timeout: int
+ :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
+ limit that is recorded in the analytics logs when storage analytics logging is enabled.
+ :type request_id_parameter: str
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param modified_access_conditions: Parameter group.
+ :type modified_access_conditions: ~azure.storage.blob.models.ModifiedAccessConditions
+ :keyword callable cls: A custom type or function that will be passed the direct response
+ :return: None, or the result of cls(response)
+ :rtype: None
+ :raises: ~azure.core.exceptions.HttpResponseError
+ """
+ cls = kwargs.pop('cls', None) # type: ClsType[None]
+ error_map = {
+ 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
+ }
+ error_map.update(kwargs.pop('error_map', {}))
+
+ _if_unmodified_since = None
+ if modified_access_conditions is not None:
+ _if_unmodified_since = modified_access_conditions.if_unmodified_since
+ comp = "immutabilityPolicies"
+ accept = "application/xml"
+
+ # Construct URL
+ url = self.set_immutability_policy.metadata['url'] # type: ignore
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ url = self._client.format_url(url, **path_format_arguments)
+
+ # Construct parameters
+ query_parameters = {} # type: Dict[str, Any]
+ query_parameters['comp'] = self._serialize.query("comp", comp, 'str')
+ if timeout is not None:
+ query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0)
+
+ # Construct headers
+ header_parameters = {} # type: Dict[str, Any]
+ header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str')
+ if request_id_parameter is not None:
+ header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
+ if _if_unmodified_since is not None:
+ header_parameters['If-Unmodified-Since'] = self._serialize.header("if_unmodified_since", _if_unmodified_since, 'rfc-1123')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
+
+ request = self._client.put(url, query_parameters, header_parameters)
+ pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
+ response = pipeline_response.http_response
+
+ if response.status_code not in [200]:
+ map_error(status_code=response.status_code, response=response, error_map=error_map)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
+ raise HttpResponseError(response=response, model=error)
+
+ response_headers = {}
+ response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id'))
+ response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id'))
+ response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version'))
+ response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date'))
+ response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date'))
+ response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode'))
+
+ if cls:
+ return cls(pipeline_response, None, response_headers)
+
+ set_immutability_policy.metadata = {'url': '/{containerName}/{blob}'} # type: ignore
+
+ async def delete_immutability_policy(
+ self,
+ timeout: Optional[int] = None,
+ request_id_parameter: Optional[str] = None,
+ **kwargs
+ ) -> None:
+ """The Delete Immutability Policy operation deletes the immutability policy on the blob.
+
+ :param timeout: The timeout parameter is expressed in seconds. For more information, see
+ :code:`Setting Timeouts for Blob Service Operations.`.
+ :type timeout: int
+ :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
+ limit that is recorded in the analytics logs when storage analytics logging is enabled.
+ :type request_id_parameter: str
+ :keyword callable cls: A custom type or function that will be passed the direct response
+ :return: None, or the result of cls(response)
+ :rtype: None
+ :raises: ~azure.core.exceptions.HttpResponseError
+ """
+ cls = kwargs.pop('cls', None) # type: ClsType[None]
+ error_map = {
+ 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
+ }
+ error_map.update(kwargs.pop('error_map', {}))
+ comp = "immutabilityPolicies"
+ accept = "application/xml"
+
+ # Construct URL
+ url = self.delete_immutability_policy.metadata['url'] # type: ignore
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ url = self._client.format_url(url, **path_format_arguments)
+
+ # Construct parameters
+ query_parameters = {} # type: Dict[str, Any]
+ query_parameters['comp'] = self._serialize.query("comp", comp, 'str')
+ if timeout is not None:
+ query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0)
+
+ # Construct headers
+ header_parameters = {} # type: Dict[str, Any]
+ header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str')
+ if request_id_parameter is not None:
+ header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
+ header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
+
+ request = self._client.delete(url, query_parameters, header_parameters)
+ pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
+ response = pipeline_response.http_response
+
+ if response.status_code not in [200]:
+ map_error(status_code=response.status_code, response=response, error_map=error_map)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
+ raise HttpResponseError(response=response, model=error)
+
+ response_headers = {}
+ response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id'))
+ response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id'))
+ response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version'))
+ response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date'))
+
+ if cls:
+ return cls(pipeline_response, None, response_headers)
+
+ delete_immutability_policy.metadata = {'url': '/{containerName}/{blob}'} # type: ignore
+
+ async def set_legal_hold(
+ self,
+ legal_hold: bool,
+ timeout: Optional[int] = None,
+ request_id_parameter: Optional[str] = None,
+ **kwargs
+ ) -> None:
+ """The Set Legal Hold operation sets a legal hold on the blob.
+
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
+ :param timeout: The timeout parameter is expressed in seconds. For more information, see
+ :code:`Setting Timeouts for Blob Service Operations.`.
+ :type timeout: int
+ :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
+ limit that is recorded in the analytics logs when storage analytics logging is enabled.
+ :type request_id_parameter: str
+ :keyword callable cls: A custom type or function that will be passed the direct response
+ :return: None, or the result of cls(response)
+ :rtype: None
+ :raises: ~azure.core.exceptions.HttpResponseError
+ """
+ cls = kwargs.pop('cls', None) # type: ClsType[None]
+ error_map = {
+ 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
+ }
+ error_map.update(kwargs.pop('error_map', {}))
+ comp = "legalhold"
+ accept = "application/xml"
+
+ # Construct URL
+ url = self.set_legal_hold.metadata['url'] # type: ignore
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ url = self._client.format_url(url, **path_format_arguments)
+
+ # Construct parameters
+ query_parameters = {} # type: Dict[str, Any]
+ query_parameters['comp'] = self._serialize.query("comp", comp, 'str')
+ if timeout is not None:
+ query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0)
+
+ # Construct headers
+ header_parameters = {} # type: Dict[str, Any]
+ header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str')
+ if request_id_parameter is not None:
+ header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
+ header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
+
+ request = self._client.put(url, query_parameters, header_parameters)
+ pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
+ response = pipeline_response.http_response
+
+ if response.status_code not in [200]:
+ map_error(status_code=response.status_code, response=response, error_map=error_map)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
+ raise HttpResponseError(response=response, model=error)
+
+ response_headers = {}
+ response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id'))
+ response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id'))
+ response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version'))
+ response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date'))
+ response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold'))
+
+ if cls:
+ return cls(pipeline_response, None, response_headers)
+
+ set_legal_hold.metadata = {'url': '/{containerName}/{blob}'} # type: ignore
+
async def set_metadata(
self,
timeout: Optional[int] = None,
@@ -1408,7 +1648,7 @@ async def set_metadata(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1524,7 +1764,7 @@ async def acquire_lease(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1627,7 +1867,7 @@ async def release_lease(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1729,7 +1969,7 @@ async def renew_lease(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1838,7 +2078,7 @@ async def change_lease(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1948,7 +2188,7 @@ async def break_lease(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2087,7 +2327,7 @@ async def create_snapshot(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2116,6 +2356,9 @@ async def start_copy_from_url(
request_id_parameter: Optional[str] = None,
blob_tags_string: Optional[str] = None,
seal_blob: Optional[bool] = None,
+ immutability_policy_expiry: Optional[datetime.datetime] = None,
+ immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None,
+ legal_hold: Optional[bool] = None,
source_modified_access_conditions: Optional["_models.SourceModifiedAccessConditions"] = None,
modified_access_conditions: Optional["_models.ModifiedAccessConditions"] = None,
lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None,
@@ -2153,6 +2396,13 @@ async def start_copy_from_url(
:param seal_blob: Overrides the sealed state of the destination blob. Service version
2019-12-12 and newer.
:type seal_blob: bool
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
:param source_modified_access_conditions: Parameter group.
:type source_modified_access_conditions: ~azure.storage.blob.models.SourceModifiedAccessConditions
:param modified_access_conditions: Parameter group.
@@ -2247,6 +2497,12 @@ async def start_copy_from_url(
header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str')
if seal_blob is not None:
header_parameters['x-ms-seal-blob'] = self._serialize.header("seal_blob", seal_blob, 'bool')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ if legal_hold is not None:
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
request = self._client.put(url, query_parameters, header_parameters)
@@ -2255,7 +2511,7 @@ async def start_copy_from_url(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2283,6 +2539,9 @@ async def copy_from_url(
request_id_parameter: Optional[str] = None,
source_content_md5: Optional[bytearray] = None,
blob_tags_string: Optional[str] = None,
+ immutability_policy_expiry: Optional[datetime.datetime] = None,
+ immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None,
+ legal_hold: Optional[bool] = None,
source_modified_access_conditions: Optional["_models.SourceModifiedAccessConditions"] = None,
modified_access_conditions: Optional["_models.ModifiedAccessConditions"] = None,
lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None,
@@ -2318,6 +2577,13 @@ async def copy_from_url(
:type source_content_md5: bytearray
:param blob_tags_string: Optional. Used to set blob tags in various blob operations.
:type blob_tags_string: str
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
:param source_modified_access_conditions: Parameter group.
:type source_modified_access_conditions: ~azure.storage.blob.models.SourceModifiedAccessConditions
:param modified_access_conditions: Parameter group.
@@ -2408,6 +2674,12 @@ async def copy_from_url(
header_parameters['x-ms-source-content-md5'] = self._serialize.header("source_content_md5", source_content_md5, 'bytearray')
if blob_tags_string is not None:
header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ if legal_hold is not None:
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
request = self._client.put(url, query_parameters, header_parameters)
@@ -2416,7 +2688,7 @@ async def copy_from_url(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2508,7 +2780,7 @@ async def abort_copy_from_url(
if response.status_code not in [204]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2622,7 +2894,7 @@ async def set_tier(
if response.status_code not in [200, 202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2684,7 +2956,7 @@ async def get_account_info(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2824,7 +3096,7 @@ async def query(
if response.status_code not in [200, 206]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2991,7 +3263,7 @@ async def get_tags(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -3107,7 +3379,7 @@ async def set_tags(
if response.status_code not in [204]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_block_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_block_blob_operations.py
index e90eacd48c9e..a08b8e8124d9 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_block_blob_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_block_blob_operations.py
@@ -50,6 +50,9 @@ async def upload(
tier: Optional[Union[str, "_models.AccessTierOptional"]] = None,
request_id_parameter: Optional[str] = None,
blob_tags_string: Optional[str] = None,
+ immutability_policy_expiry: Optional[datetime.datetime] = None,
+ immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None,
+ legal_hold: Optional[bool] = None,
blob_http_headers: Optional["_models.BlobHTTPHeaders"] = None,
lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None,
cpk_info: Optional["_models.CpkInfo"] = None,
@@ -89,6 +92,13 @@ async def upload(
:type request_id_parameter: str
:param blob_tags_string: Optional. Used to set blob tags in various blob operations.
:type blob_tags_string: str
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
:param blob_http_headers: Parameter group.
:type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders
:param lease_access_conditions: Parameter group.
@@ -210,6 +220,12 @@ async def upload(
header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
if blob_tags_string is not None:
header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ if legal_hold is not None:
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
@@ -221,7 +237,7 @@ async def upload(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -459,7 +475,7 @@ async def put_blob_from_url(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -596,7 +612,7 @@ async def stage_block(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -754,7 +770,7 @@ async def stage_block_from_url(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -783,6 +799,9 @@ async def commit_block_list(
tier: Optional[Union[str, "_models.AccessTierOptional"]] = None,
request_id_parameter: Optional[str] = None,
blob_tags_string: Optional[str] = None,
+ immutability_policy_expiry: Optional[datetime.datetime] = None,
+ immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None,
+ legal_hold: Optional[bool] = None,
blob_http_headers: Optional["_models.BlobHTTPHeaders"] = None,
lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None,
cpk_info: Optional["_models.CpkInfo"] = None,
@@ -825,6 +844,13 @@ async def commit_block_list(
:type request_id_parameter: str
:param blob_tags_string: Optional. Used to set blob tags in various blob operations.
:type blob_tags_string: str
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
:param blob_http_headers: Parameter group.
:type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders
:param lease_access_conditions: Parameter group.
@@ -947,6 +973,12 @@ async def commit_block_list(
header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
if blob_tags_string is not None:
header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ if legal_hold is not None:
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
@@ -959,7 +991,7 @@ async def commit_block_list(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1067,7 +1099,7 @@ async def get_block_list(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_container_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_container_operations.py
index 904fea36f6a3..bec837429209 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_container_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_container_operations.py
@@ -125,7 +125,7 @@ async def create(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -205,7 +205,7 @@ async def get_properties(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -224,6 +224,7 @@ async def get_properties(
response_headers['x-ms-has-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-has-legal-hold'))
response_headers['x-ms-default-encryption-scope']=self._deserialize('str', response.headers.get('x-ms-default-encryption-scope'))
response_headers['x-ms-deny-encryption-scope-override']=self._deserialize('bool', response.headers.get('x-ms-deny-encryption-scope-override'))
+ response_headers['x-ms-version-level-worm-enabled']=self._deserialize('bool', response.headers.get('x-ms-version-level-worm-enabled'))
if cls:
return cls(pipeline_response, None, response_headers)
@@ -306,7 +307,7 @@ async def delete(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -404,7 +405,7 @@ async def set_metadata(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -486,7 +487,7 @@ async def get_access_policy(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -601,7 +602,7 @@ async def set_access_policy(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -685,7 +686,7 @@ async def restore(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -765,7 +766,7 @@ async def rename(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -852,7 +853,7 @@ async def submit_batch(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -953,7 +954,7 @@ async def acquire_lease(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1046,7 +1047,7 @@ async def release_lease(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1138,7 +1139,7 @@ async def renew_lease(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1238,7 +1239,7 @@ async def break_lease(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1337,7 +1338,7 @@ async def change_lease(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1442,7 +1443,7 @@ async def list_blob_flat_segment(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1554,7 +1555,7 @@ async def list_blob_hierarchy_segment(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1614,7 +1615,7 @@ async def get_account_info(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_directory_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_directory_operations.py
index 338ff69e3adc..bd18d797d8bd 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_directory_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_directory_operations.py
@@ -177,7 +177,7 @@ async def create(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -375,7 +375,7 @@ async def rename(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -488,7 +488,7 @@ async def delete(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -612,7 +612,7 @@ async def set_access_control(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -719,7 +719,7 @@ async def get_access_control(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_page_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_page_blob_operations.py
index da920b5fdc67..691c608c0915 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_page_blob_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_page_blob_operations.py
@@ -50,6 +50,9 @@ async def create(
blob_sequence_number: Optional[int] = 0,
request_id_parameter: Optional[str] = None,
blob_tags_string: Optional[str] = None,
+ immutability_policy_expiry: Optional[datetime.datetime] = None,
+ immutability_policy_mode: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]] = None,
+ legal_hold: Optional[bool] = None,
blob_http_headers: Optional["_models.BlobHTTPHeaders"] = None,
lease_access_conditions: Optional["_models.LeaseAccessConditions"] = None,
cpk_info: Optional["_models.CpkInfo"] = None,
@@ -87,6 +90,13 @@ async def create(
:type request_id_parameter: str
:param blob_tags_string: Optional. Used to set blob tags in various blob operations.
:type blob_tags_string: str
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
:param blob_http_headers: Parameter group.
:type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders
:param lease_access_conditions: Parameter group.
@@ -208,6 +218,12 @@ async def create(
header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
if blob_tags_string is not None:
header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ if legal_hold is not None:
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
request = self._client.put(url, query_parameters, header_parameters)
@@ -216,7 +232,7 @@ async def create(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -394,7 +410,7 @@ async def upload_pages(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -554,7 +570,7 @@ async def clear_pages(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -753,7 +769,7 @@ async def upload_pages_from_url(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -876,7 +892,7 @@ async def get_page_ranges(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1015,7 +1031,7 @@ async def get_page_ranges_diff(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1150,7 +1166,7 @@ async def resize(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1267,7 +1283,7 @@ async def update_sequence_number(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1374,7 +1390,7 @@ async def copy_incremental(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_service_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_service_operations.py
index 91a064680562..f293d00b5b8b 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_service_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/aio/operations/_service_operations.py
@@ -104,7 +104,7 @@ async def set_properties(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -174,7 +174,7 @@ async def get_properties(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -247,7 +247,7 @@ async def get_statistics(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -350,7 +350,7 @@ async def list_containers_segment(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -430,7 +430,7 @@ async def get_user_delegation_key(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -489,7 +489,7 @@ async def get_account_info(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -577,7 +577,7 @@ async def submit_batch(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -674,7 +674,7 @@ async def filter_blobs(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/__init__.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/__init__.py
index 3d33d25bb90f..3efc69e63929 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/__init__.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/__init__.py
@@ -31,7 +31,7 @@
from ._models_py3 import CpkInfo
from ._models_py3 import CpkScopeInfo
from ._models_py3 import DataLakeStorageError
- from ._models_py3 import DataLakeStorageErrorAutoGenerated
+ from ._models_py3 import DataLakeStorageErrorError
from ._models_py3 import DelimitedTextConfiguration
from ._models_py3 import DirectoryHttpHeaders
from ._models_py3 import FilterBlobItem
@@ -85,7 +85,7 @@
from ._models import CpkInfo # type: ignore
from ._models import CpkScopeInfo # type: ignore
from ._models import DataLakeStorageError # type: ignore
- from ._models import DataLakeStorageErrorAutoGenerated # type: ignore
+ from ._models import DataLakeStorageErrorError # type: ignore
from ._models import DelimitedTextConfiguration # type: ignore
from ._models import DirectoryHttpHeaders # type: ignore
from ._models import FilterBlobItem # type: ignore
@@ -122,6 +122,7 @@
AccountKind,
ArchiveStatus,
BlobExpiryOptions,
+ BlobImmutabilityPolicyMode,
BlobType,
BlockListType,
CopyStatusType,
@@ -168,7 +169,7 @@
'CpkInfo',
'CpkScopeInfo',
'DataLakeStorageError',
- 'DataLakeStorageErrorAutoGenerated',
+ 'DataLakeStorageErrorError',
'DelimitedTextConfiguration',
'DirectoryHttpHeaders',
'FilterBlobItem',
@@ -203,6 +204,7 @@
'AccountKind',
'ArchiveStatus',
'BlobExpiryOptions',
+ 'BlobImmutabilityPolicyMode',
'BlobType',
'BlockListType',
'CopyStatusType',
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_azure_blob_storage_enums.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_azure_blob_storage_enums.py
index 5d03a102b866..456b148b93f8 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_azure_blob_storage_enums.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_azure_blob_storage_enums.py
@@ -97,6 +97,12 @@ class BlobExpiryOptions(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)):
RELATIVE_TO_NOW = "RelativeToNow"
ABSOLUTE = "Absolute"
+class BlobImmutabilityPolicyMode(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)):
+
+ UNLOCKED = "Unlocked"
+ LOCKED = "Locked"
+ MUTABLE = "Mutable"
+
class BlobType(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)):
BLOCK_BLOB = "BlockBlob"
@@ -161,6 +167,8 @@ class ListBlobsIncludeItem(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)):
UNCOMMITTEDBLOBS = "uncommittedblobs"
VERSIONS = "versions"
TAGS = "tags"
+ IMMUTABILITYPOLICY = "immutabilitypolicy"
+ LEGALHOLD = "legalhold"
class ListContainersIncludeType(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)):
@@ -198,6 +206,7 @@ class QueryFormatType(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)):
DELIMITED = "delimited"
JSON = "json"
ARROW = "arrow"
+ PARQUET = "parquet"
class RehydratePriority(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)):
"""If an object is in rehydrate pending state then this header is returned with priority of
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models.py
index fadcdd561759..b23282f35437 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models.py
@@ -437,6 +437,12 @@ class BlobPropertiesInternal(msrest.serialization.Model):
:type rehydrate_priority: str or ~azure.storage.blob.models.RehydratePriority
:param last_accessed_on:
:type last_accessed_on: ~datetime.datetime
+ :param immutability_policy_expires_on:
+ :type immutability_policy_expires_on: ~datetime.datetime
+ :param immutability_policy_mode: Possible values include: "Unlocked", "Locked", "Mutable".
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold:
+ :type legal_hold: bool
"""
_validation = {
@@ -482,6 +488,9 @@ class BlobPropertiesInternal(msrest.serialization.Model):
'is_sealed': {'key': 'Sealed', 'type': 'bool'},
'rehydrate_priority': {'key': 'RehydratePriority', 'type': 'str'},
'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'},
+ 'immutability_policy_expires_on': {'key': 'ImmutabilityPolicyUntilDate', 'type': 'rfc-1123'},
+ 'immutability_policy_mode': {'key': 'ImmutabilityPolicyMode', 'type': 'str'},
+ 'legal_hold': {'key': 'LegalHold', 'type': 'bool'},
}
_xml_map = {
'name': 'Properties'
@@ -529,6 +538,9 @@ def __init__(
self.is_sealed = kwargs.get('is_sealed', None)
self.rehydrate_priority = kwargs.get('rehydrate_priority', None)
self.last_accessed_on = kwargs.get('last_accessed_on', None)
+ self.immutability_policy_expires_on = kwargs.get('immutability_policy_expires_on', None)
+ self.immutability_policy_mode = kwargs.get('immutability_policy_mode', None)
+ self.legal_hold = kwargs.get('legal_hold', None)
class BlobTag(msrest.serialization.Model):
@@ -600,7 +612,7 @@ class Block(msrest.serialization.Model):
:param name: Required. The base64 encoded block ID.
:type name: str
:param size: Required. The block size in bytes.
- :type size: int
+ :type size: long
"""
_validation = {
@@ -610,7 +622,7 @@ class Block(msrest.serialization.Model):
_attribute_map = {
'name': {'key': 'Name', 'type': 'str'},
- 'size': {'key': 'Size', 'type': 'int'},
+ 'size': {'key': 'Size', 'type': 'long'},
}
def __init__(
@@ -809,6 +821,9 @@ class ContainerProperties(msrest.serialization.Model):
:type deleted_time: ~datetime.datetime
:param remaining_retention_days:
:type remaining_retention_days: int
+ :param is_version_level_worm_enabled: Indicates if version level worm is enabled on this
+ container.
+ :type is_version_level_worm_enabled: bool
"""
_validation = {
@@ -829,6 +844,7 @@ class ContainerProperties(msrest.serialization.Model):
'prevent_encryption_scope_override': {'key': 'DenyEncryptionScopeOverride', 'type': 'bool'},
'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'},
'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'},
+ 'is_version_level_worm_enabled': {'key': 'VersionLevelWormEnabled', 'type': 'bool'},
}
def __init__(
@@ -848,6 +864,7 @@ def __init__(
self.prevent_encryption_scope_override = kwargs.get('prevent_encryption_scope_override', None)
self.deleted_time = kwargs.get('deleted_time', None)
self.remaining_retention_days = kwargs.get('remaining_retention_days', None)
+ self.is_version_level_worm_enabled = kwargs.get('is_version_level_worm_enabled', None)
class CorsRule(msrest.serialization.Model):
@@ -961,12 +978,11 @@ class DataLakeStorageError(msrest.serialization.Model):
"""DataLakeStorageError.
:param data_lake_storage_error_details: The service error response object.
- :type data_lake_storage_error_details:
- ~azure.storage.blob.models.DataLakeStorageErrorAutoGenerated
+ :type data_lake_storage_error_details: ~azure.storage.blob.models.DataLakeStorageErrorError
"""
_attribute_map = {
- 'data_lake_storage_error_details': {'key': 'error', 'type': 'DataLakeStorageErrorAutoGenerated'},
+ 'data_lake_storage_error_details': {'key': 'error', 'type': 'DataLakeStorageErrorError'},
}
def __init__(
@@ -977,7 +993,7 @@ def __init__(
self.data_lake_storage_error_details = kwargs.get('data_lake_storage_error_details', None)
-class DataLakeStorageErrorAutoGenerated(msrest.serialization.Model):
+class DataLakeStorageErrorError(msrest.serialization.Model):
"""The service error response object.
:param code: The service error code.
@@ -995,7 +1011,7 @@ def __init__(
self,
**kwargs
):
- super(DataLakeStorageErrorAutoGenerated, self).__init__(**kwargs)
+ super(DataLakeStorageErrorError, self).__init__(**kwargs)
self.code = kwargs.get('code', None)
self.message = kwargs.get('message', None)
@@ -1617,7 +1633,7 @@ class QueryFormat(msrest.serialization.Model):
"""QueryFormat.
:param type: The quick query format type. Possible values include: "delimited", "json",
- "arrow".
+ "arrow", "parquet".
:type type: str or ~azure.storage.blob.models.QueryFormatType
:param delimited_text_configuration: delimited text configuration.
:type delimited_text_configuration: ~azure.storage.blob.models.DelimitedTextConfiguration
@@ -1625,6 +1641,8 @@ class QueryFormat(msrest.serialization.Model):
:type json_text_configuration: ~azure.storage.blob.models.JsonTextConfiguration
:param arrow_configuration: arrow configuration.
:type arrow_configuration: ~azure.storage.blob.models.ArrowConfiguration
+ :param parquet_text_configuration: Any object.
+ :type parquet_text_configuration: object
"""
_attribute_map = {
@@ -1632,6 +1650,7 @@ class QueryFormat(msrest.serialization.Model):
'delimited_text_configuration': {'key': 'DelimitedTextConfiguration', 'type': 'DelimitedTextConfiguration'},
'json_text_configuration': {'key': 'JsonTextConfiguration', 'type': 'JsonTextConfiguration'},
'arrow_configuration': {'key': 'ArrowConfiguration', 'type': 'ArrowConfiguration'},
+ 'parquet_text_configuration': {'key': 'ParquetTextConfiguration', 'type': 'object'},
}
def __init__(
@@ -1643,6 +1662,7 @@ def __init__(
self.delimited_text_configuration = kwargs.get('delimited_text_configuration', None)
self.json_text_configuration = kwargs.get('json_text_configuration', None)
self.arrow_configuration = kwargs.get('arrow_configuration', None)
+ self.parquet_text_configuration = kwargs.get('parquet_text_configuration', None)
class QueryRequest(msrest.serialization.Model):
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models_py3.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models_py3.py
index 2ed0d23fd172..27eb38626f74 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models_py3.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/models/_models_py3.py
@@ -483,6 +483,12 @@ class BlobPropertiesInternal(msrest.serialization.Model):
:type rehydrate_priority: str or ~azure.storage.blob.models.RehydratePriority
:param last_accessed_on:
:type last_accessed_on: ~datetime.datetime
+ :param immutability_policy_expires_on:
+ :type immutability_policy_expires_on: ~datetime.datetime
+ :param immutability_policy_mode: Possible values include: "Unlocked", "Locked", "Mutable".
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold:
+ :type legal_hold: bool
"""
_validation = {
@@ -528,6 +534,9 @@ class BlobPropertiesInternal(msrest.serialization.Model):
'is_sealed': {'key': 'Sealed', 'type': 'bool'},
'rehydrate_priority': {'key': 'RehydratePriority', 'type': 'str'},
'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'},
+ 'immutability_policy_expires_on': {'key': 'ImmutabilityPolicyUntilDate', 'type': 'rfc-1123'},
+ 'immutability_policy_mode': {'key': 'ImmutabilityPolicyMode', 'type': 'str'},
+ 'legal_hold': {'key': 'LegalHold', 'type': 'bool'},
}
_xml_map = {
'name': 'Properties'
@@ -573,6 +582,9 @@ def __init__(
is_sealed: Optional[bool] = None,
rehydrate_priority: Optional[Union[str, "RehydratePriority"]] = None,
last_accessed_on: Optional[datetime.datetime] = None,
+ immutability_policy_expires_on: Optional[datetime.datetime] = None,
+ immutability_policy_mode: Optional[Union[str, "BlobImmutabilityPolicyMode"]] = None,
+ legal_hold: Optional[bool] = None,
**kwargs
):
super(BlobPropertiesInternal, self).__init__(**kwargs)
@@ -613,6 +625,9 @@ def __init__(
self.is_sealed = is_sealed
self.rehydrate_priority = rehydrate_priority
self.last_accessed_on = last_accessed_on
+ self.immutability_policy_expires_on = immutability_policy_expires_on
+ self.immutability_policy_mode = immutability_policy_mode
+ self.legal_hold = legal_hold
class BlobTag(msrest.serialization.Model):
@@ -689,7 +704,7 @@ class Block(msrest.serialization.Model):
:param name: Required. The base64 encoded block ID.
:type name: str
:param size: Required. The block size in bytes.
- :type size: int
+ :type size: long
"""
_validation = {
@@ -699,7 +714,7 @@ class Block(msrest.serialization.Model):
_attribute_map = {
'name': {'key': 'Name', 'type': 'str'},
- 'size': {'key': 'Size', 'type': 'int'},
+ 'size': {'key': 'Size', 'type': 'long'},
}
def __init__(
@@ -920,6 +935,9 @@ class ContainerProperties(msrest.serialization.Model):
:type deleted_time: ~datetime.datetime
:param remaining_retention_days:
:type remaining_retention_days: int
+ :param is_version_level_worm_enabled: Indicates if version level worm is enabled on this
+ container.
+ :type is_version_level_worm_enabled: bool
"""
_validation = {
@@ -940,6 +958,7 @@ class ContainerProperties(msrest.serialization.Model):
'prevent_encryption_scope_override': {'key': 'DenyEncryptionScopeOverride', 'type': 'bool'},
'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'},
'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'},
+ 'is_version_level_worm_enabled': {'key': 'VersionLevelWormEnabled', 'type': 'bool'},
}
def __init__(
@@ -957,6 +976,7 @@ def __init__(
prevent_encryption_scope_override: Optional[bool] = None,
deleted_time: Optional[datetime.datetime] = None,
remaining_retention_days: Optional[int] = None,
+ is_version_level_worm_enabled: Optional[bool] = None,
**kwargs
):
super(ContainerProperties, self).__init__(**kwargs)
@@ -972,6 +992,7 @@ def __init__(
self.prevent_encryption_scope_override = prevent_encryption_scope_override
self.deleted_time = deleted_time
self.remaining_retention_days = remaining_retention_days
+ self.is_version_level_worm_enabled = is_version_level_worm_enabled
class CorsRule(msrest.serialization.Model):
@@ -1097,25 +1118,24 @@ class DataLakeStorageError(msrest.serialization.Model):
"""DataLakeStorageError.
:param data_lake_storage_error_details: The service error response object.
- :type data_lake_storage_error_details:
- ~azure.storage.blob.models.DataLakeStorageErrorAutoGenerated
+ :type data_lake_storage_error_details: ~azure.storage.blob.models.DataLakeStorageErrorError
"""
_attribute_map = {
- 'data_lake_storage_error_details': {'key': 'error', 'type': 'DataLakeStorageErrorAutoGenerated'},
+ 'data_lake_storage_error_details': {'key': 'error', 'type': 'DataLakeStorageErrorError'},
}
def __init__(
self,
*,
- data_lake_storage_error_details: Optional["DataLakeStorageErrorAutoGenerated"] = None,
+ data_lake_storage_error_details: Optional["DataLakeStorageErrorError"] = None,
**kwargs
):
super(DataLakeStorageError, self).__init__(**kwargs)
self.data_lake_storage_error_details = data_lake_storage_error_details
-class DataLakeStorageErrorAutoGenerated(msrest.serialization.Model):
+class DataLakeStorageErrorError(msrest.serialization.Model):
"""The service error response object.
:param code: The service error code.
@@ -1136,7 +1156,7 @@ def __init__(
message: Optional[str] = None,
**kwargs
):
- super(DataLakeStorageErrorAutoGenerated, self).__init__(**kwargs)
+ super(DataLakeStorageErrorError, self).__init__(**kwargs)
self.code = code
self.message = message
@@ -1836,7 +1856,7 @@ class QueryFormat(msrest.serialization.Model):
"""QueryFormat.
:param type: The quick query format type. Possible values include: "delimited", "json",
- "arrow".
+ "arrow", "parquet".
:type type: str or ~azure.storage.blob.models.QueryFormatType
:param delimited_text_configuration: delimited text configuration.
:type delimited_text_configuration: ~azure.storage.blob.models.DelimitedTextConfiguration
@@ -1844,6 +1864,8 @@ class QueryFormat(msrest.serialization.Model):
:type json_text_configuration: ~azure.storage.blob.models.JsonTextConfiguration
:param arrow_configuration: arrow configuration.
:type arrow_configuration: ~azure.storage.blob.models.ArrowConfiguration
+ :param parquet_text_configuration: Any object.
+ :type parquet_text_configuration: object
"""
_attribute_map = {
@@ -1851,6 +1873,7 @@ class QueryFormat(msrest.serialization.Model):
'delimited_text_configuration': {'key': 'DelimitedTextConfiguration', 'type': 'DelimitedTextConfiguration'},
'json_text_configuration': {'key': 'JsonTextConfiguration', 'type': 'JsonTextConfiguration'},
'arrow_configuration': {'key': 'ArrowConfiguration', 'type': 'ArrowConfiguration'},
+ 'parquet_text_configuration': {'key': 'ParquetTextConfiguration', 'type': 'object'},
}
def __init__(
@@ -1860,6 +1883,7 @@ def __init__(
delimited_text_configuration: Optional["DelimitedTextConfiguration"] = None,
json_text_configuration: Optional["JsonTextConfiguration"] = None,
arrow_configuration: Optional["ArrowConfiguration"] = None,
+ parquet_text_configuration: Optional[object] = None,
**kwargs
):
super(QueryFormat, self).__init__(**kwargs)
@@ -1867,6 +1891,7 @@ def __init__(
self.delimited_text_configuration = delimited_text_configuration
self.json_text_configuration = json_text_configuration
self.arrow_configuration = arrow_configuration
+ self.parquet_text_configuration = parquet_text_configuration
class QueryRequest(msrest.serialization.Model):
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_append_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_append_blob_operations.py
index 0825fcf791bb..e44a8900f5b3 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_append_blob_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_append_blob_operations.py
@@ -17,7 +17,7 @@
if TYPE_CHECKING:
# pylint: disable=unused-import,ungrouped-imports
- from typing import Any, Callable, Dict, Generic, IO, Optional, TypeVar
+ from typing import Any, Callable, Dict, Generic, IO, Optional, TypeVar, Union
T = TypeVar('T')
ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]]
@@ -51,6 +51,9 @@ def create(
metadata=None, # type: Optional[str]
request_id_parameter=None, # type: Optional[str]
blob_tags_string=None, # type: Optional[str]
+ immutability_policy_expiry=None, # type: Optional[datetime.datetime]
+ immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]]
+ legal_hold=None, # type: Optional[bool]
blob_http_headers=None, # type: Optional["_models.BlobHTTPHeaders"]
lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"]
cpk_info=None, # type: Optional["_models.CpkInfo"]
@@ -80,6 +83,13 @@ def create(
:type request_id_parameter: str
:param blob_tags_string: Optional. Used to set blob tags in various blob operations.
:type blob_tags_string: str
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
:param blob_http_headers: Parameter group.
:type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders
:param lease_access_conditions: Parameter group.
@@ -196,6 +206,12 @@ def create(
header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
if blob_tags_string is not None:
header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ if legal_hold is not None:
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
request = self._client.put(url, query_parameters, header_parameters)
@@ -204,7 +220,7 @@ def create(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -374,7 +390,7 @@ def append_block(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -575,7 +591,7 @@ def append_block_from_url(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -690,7 +706,7 @@ def seal(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_blob_operations.py
index a72d4dcd94c8..22fa229cb28f 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_blob_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_blob_operations.py
@@ -181,7 +181,7 @@ def download(
if response.status_code not in [200, 206]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -225,6 +225,9 @@ def download(
response_headers['x-ms-tag-count']=self._deserialize('long', response.headers.get('x-ms-tag-count'))
response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed'))
response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time'))
+ response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date'))
+ response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode'))
+ response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold'))
deserialized = response.stream_download(self._client._pipeline)
if response.status_code == 206:
@@ -268,6 +271,9 @@ def download(
response_headers['x-ms-tag-count']=self._deserialize('long', response.headers.get('x-ms-tag-count'))
response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed'))
response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time'))
+ response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date'))
+ response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode'))
+ response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold'))
deserialized = response.stream_download(self._client._pipeline)
if cls:
@@ -394,7 +400,7 @@ def get_properties(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -444,6 +450,9 @@ def get_properties(
response_headers['x-ms-blob-sealed']=self._deserialize('bool', response.headers.get('x-ms-blob-sealed'))
response_headers['x-ms-rehydrate-priority']=self._deserialize('str', response.headers.get('x-ms-rehydrate-priority'))
response_headers['x-ms-last-access-time']=self._deserialize('rfc-1123', response.headers.get('x-ms-last-access-time'))
+ response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date'))
+ response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode'))
+ response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold'))
if cls:
return cls(pipeline_response, None, response_headers)
@@ -575,7 +584,7 @@ def delete(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -699,7 +708,7 @@ def set_access_control(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -807,7 +816,7 @@ def get_access_control(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -999,7 +1008,7 @@ def rename(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1071,7 +1080,7 @@ def undelete(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1149,7 +1158,7 @@ def set_expiry(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1281,7 +1290,7 @@ def set_http_headers(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1298,6 +1307,240 @@ def set_http_headers(
set_http_headers.metadata = {'url': '/{containerName}/{blob}'} # type: ignore
+ def set_immutability_policy(
+ self,
+ timeout=None, # type: Optional[int]
+ request_id_parameter=None, # type: Optional[str]
+ immutability_policy_expiry=None, # type: Optional[datetime.datetime]
+ immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]]
+ modified_access_conditions=None, # type: Optional["_models.ModifiedAccessConditions"]
+ **kwargs # type: Any
+ ):
+ # type: (...) -> None
+ """The Set Immutability Policy operation sets the immutability policy on the blob.
+
+ :param timeout: The timeout parameter is expressed in seconds. For more information, see
+ :code:`Setting Timeouts for Blob Service Operations.`.
+ :type timeout: int
+ :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
+ limit that is recorded in the analytics logs when storage analytics logging is enabled.
+ :type request_id_parameter: str
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param modified_access_conditions: Parameter group.
+ :type modified_access_conditions: ~azure.storage.blob.models.ModifiedAccessConditions
+ :keyword callable cls: A custom type or function that will be passed the direct response
+ :return: None, or the result of cls(response)
+ :rtype: None
+ :raises: ~azure.core.exceptions.HttpResponseError
+ """
+ cls = kwargs.pop('cls', None) # type: ClsType[None]
+ error_map = {
+ 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
+ }
+ error_map.update(kwargs.pop('error_map', {}))
+
+ _if_unmodified_since = None
+ if modified_access_conditions is not None:
+ _if_unmodified_since = modified_access_conditions.if_unmodified_since
+ comp = "immutabilityPolicies"
+ accept = "application/xml"
+
+ # Construct URL
+ url = self.set_immutability_policy.metadata['url'] # type: ignore
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ url = self._client.format_url(url, **path_format_arguments)
+
+ # Construct parameters
+ query_parameters = {} # type: Dict[str, Any]
+ query_parameters['comp'] = self._serialize.query("comp", comp, 'str')
+ if timeout is not None:
+ query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0)
+
+ # Construct headers
+ header_parameters = {} # type: Dict[str, Any]
+ header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str')
+ if request_id_parameter is not None:
+ header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
+ if _if_unmodified_since is not None:
+ header_parameters['If-Unmodified-Since'] = self._serialize.header("if_unmodified_since", _if_unmodified_since, 'rfc-1123')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
+
+ request = self._client.put(url, query_parameters, header_parameters)
+ pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
+ response = pipeline_response.http_response
+
+ if response.status_code not in [200]:
+ map_error(status_code=response.status_code, response=response, error_map=error_map)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
+ raise HttpResponseError(response=response, model=error)
+
+ response_headers = {}
+ response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id'))
+ response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id'))
+ response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version'))
+ response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date'))
+ response_headers['x-ms-immutability-policy-until-date']=self._deserialize('rfc-1123', response.headers.get('x-ms-immutability-policy-until-date'))
+ response_headers['x-ms-immutability-policy-mode']=self._deserialize('str', response.headers.get('x-ms-immutability-policy-mode'))
+
+ if cls:
+ return cls(pipeline_response, None, response_headers)
+
+ set_immutability_policy.metadata = {'url': '/{containerName}/{blob}'} # type: ignore
+
+ def delete_immutability_policy(
+ self,
+ timeout=None, # type: Optional[int]
+ request_id_parameter=None, # type: Optional[str]
+ **kwargs # type: Any
+ ):
+ # type: (...) -> None
+ """The Delete Immutability Policy operation deletes the immutability policy on the blob.
+
+ :param timeout: The timeout parameter is expressed in seconds. For more information, see
+ :code:`Setting Timeouts for Blob Service Operations.`.
+ :type timeout: int
+ :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
+ limit that is recorded in the analytics logs when storage analytics logging is enabled.
+ :type request_id_parameter: str
+ :keyword callable cls: A custom type or function that will be passed the direct response
+ :return: None, or the result of cls(response)
+ :rtype: None
+ :raises: ~azure.core.exceptions.HttpResponseError
+ """
+ cls = kwargs.pop('cls', None) # type: ClsType[None]
+ error_map = {
+ 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
+ }
+ error_map.update(kwargs.pop('error_map', {}))
+ comp = "immutabilityPolicies"
+ accept = "application/xml"
+
+ # Construct URL
+ url = self.delete_immutability_policy.metadata['url'] # type: ignore
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ url = self._client.format_url(url, **path_format_arguments)
+
+ # Construct parameters
+ query_parameters = {} # type: Dict[str, Any]
+ query_parameters['comp'] = self._serialize.query("comp", comp, 'str')
+ if timeout is not None:
+ query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0)
+
+ # Construct headers
+ header_parameters = {} # type: Dict[str, Any]
+ header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str')
+ if request_id_parameter is not None:
+ header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
+ header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
+
+ request = self._client.delete(url, query_parameters, header_parameters)
+ pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
+ response = pipeline_response.http_response
+
+ if response.status_code not in [200]:
+ map_error(status_code=response.status_code, response=response, error_map=error_map)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
+ raise HttpResponseError(response=response, model=error)
+
+ response_headers = {}
+ response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id'))
+ response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id'))
+ response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version'))
+ response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date'))
+
+ if cls:
+ return cls(pipeline_response, None, response_headers)
+
+ delete_immutability_policy.metadata = {'url': '/{containerName}/{blob}'} # type: ignore
+
+ def set_legal_hold(
+ self,
+ legal_hold, # type: bool
+ timeout=None, # type: Optional[int]
+ request_id_parameter=None, # type: Optional[str]
+ **kwargs # type: Any
+ ):
+ # type: (...) -> None
+ """The Set Legal Hold operation sets a legal hold on the blob.
+
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
+ :param timeout: The timeout parameter is expressed in seconds. For more information, see
+ :code:`Setting Timeouts for Blob Service Operations.`.
+ :type timeout: int
+ :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
+ limit that is recorded in the analytics logs when storage analytics logging is enabled.
+ :type request_id_parameter: str
+ :keyword callable cls: A custom type or function that will be passed the direct response
+ :return: None, or the result of cls(response)
+ :rtype: None
+ :raises: ~azure.core.exceptions.HttpResponseError
+ """
+ cls = kwargs.pop('cls', None) # type: ClsType[None]
+ error_map = {
+ 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
+ }
+ error_map.update(kwargs.pop('error_map', {}))
+ comp = "legalhold"
+ accept = "application/xml"
+
+ # Construct URL
+ url = self.set_legal_hold.metadata['url'] # type: ignore
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ url = self._client.format_url(url, **path_format_arguments)
+
+ # Construct parameters
+ query_parameters = {} # type: Dict[str, Any]
+ query_parameters['comp'] = self._serialize.query("comp", comp, 'str')
+ if timeout is not None:
+ query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0)
+
+ # Construct headers
+ header_parameters = {} # type: Dict[str, Any]
+ header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str')
+ if request_id_parameter is not None:
+ header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
+ header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
+
+ request = self._client.put(url, query_parameters, header_parameters)
+ pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
+ response = pipeline_response.http_response
+
+ if response.status_code not in [200]:
+ map_error(status_code=response.status_code, response=response, error_map=error_map)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
+ raise HttpResponseError(response=response, model=error)
+
+ response_headers = {}
+ response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id'))
+ response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id'))
+ response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version'))
+ response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date'))
+ response_headers['x-ms-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-legal-hold'))
+
+ if cls:
+ return cls(pipeline_response, None, response_headers)
+
+ set_legal_hold.metadata = {'url': '/{containerName}/{blob}'} # type: ignore
+
def set_metadata(
self,
timeout=None, # type: Optional[int]
@@ -1422,7 +1665,7 @@ def set_metadata(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1539,7 +1782,7 @@ def acquire_lease(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1643,7 +1886,7 @@ def release_lease(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1746,7 +1989,7 @@ def renew_lease(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1856,7 +2099,7 @@ def change_lease(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1967,7 +2210,7 @@ def break_lease(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2107,7 +2350,7 @@ def create_snapshot(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2136,6 +2379,9 @@ def start_copy_from_url(
request_id_parameter=None, # type: Optional[str]
blob_tags_string=None, # type: Optional[str]
seal_blob=None, # type: Optional[bool]
+ immutability_policy_expiry=None, # type: Optional[datetime.datetime]
+ immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]]
+ legal_hold=None, # type: Optional[bool]
source_modified_access_conditions=None, # type: Optional["_models.SourceModifiedAccessConditions"]
modified_access_conditions=None, # type: Optional["_models.ModifiedAccessConditions"]
lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"]
@@ -2174,6 +2420,13 @@ def start_copy_from_url(
:param seal_blob: Overrides the sealed state of the destination blob. Service version
2019-12-12 and newer.
:type seal_blob: bool
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
:param source_modified_access_conditions: Parameter group.
:type source_modified_access_conditions: ~azure.storage.blob.models.SourceModifiedAccessConditions
:param modified_access_conditions: Parameter group.
@@ -2268,6 +2521,12 @@ def start_copy_from_url(
header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str')
if seal_blob is not None:
header_parameters['x-ms-seal-blob'] = self._serialize.header("seal_blob", seal_blob, 'bool')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ if legal_hold is not None:
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
request = self._client.put(url, query_parameters, header_parameters)
@@ -2276,7 +2535,7 @@ def start_copy_from_url(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2304,6 +2563,9 @@ def copy_from_url(
request_id_parameter=None, # type: Optional[str]
source_content_md5=None, # type: Optional[bytearray]
blob_tags_string=None, # type: Optional[str]
+ immutability_policy_expiry=None, # type: Optional[datetime.datetime]
+ immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]]
+ legal_hold=None, # type: Optional[bool]
source_modified_access_conditions=None, # type: Optional["_models.SourceModifiedAccessConditions"]
modified_access_conditions=None, # type: Optional["_models.ModifiedAccessConditions"]
lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"]
@@ -2340,6 +2602,13 @@ def copy_from_url(
:type source_content_md5: bytearray
:param blob_tags_string: Optional. Used to set blob tags in various blob operations.
:type blob_tags_string: str
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
:param source_modified_access_conditions: Parameter group.
:type source_modified_access_conditions: ~azure.storage.blob.models.SourceModifiedAccessConditions
:param modified_access_conditions: Parameter group.
@@ -2430,6 +2699,12 @@ def copy_from_url(
header_parameters['x-ms-source-content-md5'] = self._serialize.header("source_content_md5", source_content_md5, 'bytearray')
if blob_tags_string is not None:
header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ if legal_hold is not None:
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
request = self._client.put(url, query_parameters, header_parameters)
@@ -2438,7 +2713,7 @@ def copy_from_url(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2531,7 +2806,7 @@ def abort_copy_from_url(
if response.status_code not in [204]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2646,7 +2921,7 @@ def set_tier(
if response.status_code not in [200, 202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2709,7 +2984,7 @@ def get_account_info(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -2850,7 +3125,7 @@ def query(
if response.status_code not in [200, 206]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -3018,7 +3293,7 @@ def get_tags(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -3135,7 +3410,7 @@ def set_tags(
if response.status_code not in [204]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_block_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_block_blob_operations.py
index f9804ce9b7d1..79a11324a198 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_block_blob_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_block_blob_operations.py
@@ -54,6 +54,9 @@ def upload(
tier=None, # type: Optional[Union[str, "_models.AccessTierOptional"]]
request_id_parameter=None, # type: Optional[str]
blob_tags_string=None, # type: Optional[str]
+ immutability_policy_expiry=None, # type: Optional[datetime.datetime]
+ immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]]
+ legal_hold=None, # type: Optional[bool]
blob_http_headers=None, # type: Optional["_models.BlobHTTPHeaders"]
lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"]
cpk_info=None, # type: Optional["_models.CpkInfo"]
@@ -94,6 +97,13 @@ def upload(
:type request_id_parameter: str
:param blob_tags_string: Optional. Used to set blob tags in various blob operations.
:type blob_tags_string: str
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
:param blob_http_headers: Parameter group.
:type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders
:param lease_access_conditions: Parameter group.
@@ -215,6 +225,12 @@ def upload(
header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
if blob_tags_string is not None:
header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ if legal_hold is not None:
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
@@ -226,7 +242,7 @@ def upload(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -465,7 +481,7 @@ def put_blob_from_url(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -603,7 +619,7 @@ def stage_block(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -762,7 +778,7 @@ def stage_block_from_url(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -791,6 +807,9 @@ def commit_block_list(
tier=None, # type: Optional[Union[str, "_models.AccessTierOptional"]]
request_id_parameter=None, # type: Optional[str]
blob_tags_string=None, # type: Optional[str]
+ immutability_policy_expiry=None, # type: Optional[datetime.datetime]
+ immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]]
+ legal_hold=None, # type: Optional[bool]
blob_http_headers=None, # type: Optional["_models.BlobHTTPHeaders"]
lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"]
cpk_info=None, # type: Optional["_models.CpkInfo"]
@@ -834,6 +853,13 @@ def commit_block_list(
:type request_id_parameter: str
:param blob_tags_string: Optional. Used to set blob tags in various blob operations.
:type blob_tags_string: str
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
:param blob_http_headers: Parameter group.
:type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders
:param lease_access_conditions: Parameter group.
@@ -956,6 +982,12 @@ def commit_block_list(
header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
if blob_tags_string is not None:
header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ if legal_hold is not None:
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
header_parameters['Content-Type'] = self._serialize.header("content_type", content_type, 'str')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
@@ -968,7 +1000,7 @@ def commit_block_list(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1077,7 +1109,7 @@ def get_block_list(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_container_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_container_operations.py
index 32197532ef36..f01bbc4393fe 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_container_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_container_operations.py
@@ -130,7 +130,7 @@ def create(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -211,7 +211,7 @@ def get_properties(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -230,6 +230,7 @@ def get_properties(
response_headers['x-ms-has-legal-hold']=self._deserialize('bool', response.headers.get('x-ms-has-legal-hold'))
response_headers['x-ms-default-encryption-scope']=self._deserialize('str', response.headers.get('x-ms-default-encryption-scope'))
response_headers['x-ms-deny-encryption-scope-override']=self._deserialize('bool', response.headers.get('x-ms-deny-encryption-scope-override'))
+ response_headers['x-ms-version-level-worm-enabled']=self._deserialize('bool', response.headers.get('x-ms-version-level-worm-enabled'))
if cls:
return cls(pipeline_response, None, response_headers)
@@ -313,7 +314,7 @@ def delete(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -412,7 +413,7 @@ def set_metadata(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -495,7 +496,7 @@ def get_access_policy(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -611,7 +612,7 @@ def set_access_policy(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -696,7 +697,7 @@ def restore(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -777,7 +778,7 @@ def rename(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -865,7 +866,7 @@ def submit_batch(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -967,7 +968,7 @@ def acquire_lease(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1061,7 +1062,7 @@ def release_lease(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1154,7 +1155,7 @@ def renew_lease(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1255,7 +1256,7 @@ def break_lease(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1355,7 +1356,7 @@ def change_lease(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1461,7 +1462,7 @@ def list_blob_flat_segment(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1574,7 +1575,7 @@ def list_blob_hierarchy_segment(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1635,7 +1636,7 @@ def get_account_info(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_directory_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_directory_operations.py
index f025757048df..5ecabc18b75b 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_directory_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_directory_operations.py
@@ -182,7 +182,7 @@ def create(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -381,7 +381,7 @@ def rename(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -495,7 +495,7 @@ def delete(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -620,7 +620,7 @@ def set_access_control(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -728,7 +728,7 @@ def get_access_control(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.DataLakeStorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.DataLakeStorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_page_blob_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_page_blob_operations.py
index ea4b17c056b7..d05a3307c69d 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_page_blob_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_page_blob_operations.py
@@ -54,6 +54,9 @@ def create(
blob_sequence_number=0, # type: Optional[int]
request_id_parameter=None, # type: Optional[str]
blob_tags_string=None, # type: Optional[str]
+ immutability_policy_expiry=None, # type: Optional[datetime.datetime]
+ immutability_policy_mode=None, # type: Optional[Union[str, "_models.BlobImmutabilityPolicyMode"]]
+ legal_hold=None, # type: Optional[bool]
blob_http_headers=None, # type: Optional["_models.BlobHTTPHeaders"]
lease_access_conditions=None, # type: Optional["_models.LeaseAccessConditions"]
cpk_info=None, # type: Optional["_models.CpkInfo"]
@@ -92,6 +95,13 @@ def create(
:type request_id_parameter: str
:param blob_tags_string: Optional. Used to set blob tags in various blob operations.
:type blob_tags_string: str
+ :param immutability_policy_expiry: Specifies the date time when the blobs immutability policy
+ is set to expire.
+ :type immutability_policy_expiry: ~datetime.datetime
+ :param immutability_policy_mode: Specifies the immutability policy mode to set on the blob.
+ :type immutability_policy_mode: str or ~azure.storage.blob.models.BlobImmutabilityPolicyMode
+ :param legal_hold: Specified if a legal hold should be set on the blob.
+ :type legal_hold: bool
:param blob_http_headers: Parameter group.
:type blob_http_headers: ~azure.storage.blob.models.BlobHTTPHeaders
:param lease_access_conditions: Parameter group.
@@ -213,6 +223,12 @@ def create(
header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
if blob_tags_string is not None:
header_parameters['x-ms-tags'] = self._serialize.header("blob_tags_string", blob_tags_string, 'str')
+ if immutability_policy_expiry is not None:
+ header_parameters['x-ms-immutability-policy-until-date'] = self._serialize.header("immutability_policy_expiry", immutability_policy_expiry, 'rfc-1123')
+ if immutability_policy_mode is not None:
+ header_parameters['x-ms-immutability-policy-mode'] = self._serialize.header("immutability_policy_mode", immutability_policy_mode, 'str')
+ if legal_hold is not None:
+ header_parameters['x-ms-legal-hold'] = self._serialize.header("legal_hold", legal_hold, 'bool')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
request = self._client.put(url, query_parameters, header_parameters)
@@ -221,7 +237,7 @@ def create(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -400,7 +416,7 @@ def upload_pages(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -561,7 +577,7 @@ def clear_pages(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -761,7 +777,7 @@ def upload_pages_from_url(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -885,7 +901,7 @@ def get_page_ranges(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1025,7 +1041,7 @@ def get_page_ranges_diff(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1161,7 +1177,7 @@ def resize(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1279,7 +1295,7 @@ def update_sequence_number(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1387,7 +1403,7 @@ def copy_incremental(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_service_operations.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_service_operations.py
index 72f7a73fdf50..4a0d8b3bb38a 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_service_operations.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_generated/operations/_service_operations.py
@@ -109,7 +109,7 @@ def set_properties(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -180,7 +180,7 @@ def get_properties(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -254,7 +254,7 @@ def get_statistics(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -358,7 +358,7 @@ def list_containers_segment(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -439,7 +439,7 @@ def get_user_delegation_key(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -499,7 +499,7 @@ def get_account_info(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -588,7 +588,7 @@ def submit_batch(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -686,7 +686,7 @@ def filter_blobs(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py
index 00a53dc68bfb..1ddde2e46c5c 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_models.py
@@ -1003,7 +1003,7 @@ def _from_generated(cls, generated):
return None
-class DelimitedJsonDialect(object):
+class DelimitedJsonDialect(DictMixin):
"""Defines the input or output JSON serialization for a blob data query.
:keyword str delimiter: The line separator character, default value is '\n'
@@ -1013,7 +1013,7 @@ def __init__(self, **kwargs):
self.delimiter = kwargs.pop('delimiter', '\n')
-class DelimitedTextDialect(object):
+class DelimitedTextDialect(DictMixin):
"""Defines the input or output delimited (CSV) serialization for a blob query request.
:keyword str delimiter:
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_quick_query_helper.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_quick_query_helper.py
index eb51d987b9ac..3164337308c3 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_quick_query_helper.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_quick_query_helper.py
@@ -123,7 +123,6 @@ def records(self):
yield record
-
class QuickQueryStreamer(object):
"""
File-like streaming iterator.
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py
index 57f748af1e20..8f6f265dce52 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py
@@ -37,7 +37,8 @@
'2019-12-12',
'2020-02-10',
'2020-04-08',
- '2020-06-12'
+ '2020-06-12',
+ '2020-08-04'
]
diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py
index a30b2bac14a0..b21fcd5488bb 100644
--- a/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py
+++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py
@@ -4,4 +4,4 @@
# license information.
# --------------------------------------------------------------------------
-VERSION = "12.8.1"
+VERSION = "12.9.0b1"
diff --git a/sdk/storage/azure-storage-blob/setup.py b/sdk/storage/azure-storage-blob/setup.py
index 33d725aaccd0..490bc490cca0 100644
--- a/sdk/storage/azure-storage-blob/setup.py
+++ b/sdk/storage/azure-storage-blob/setup.py
@@ -95,7 +95,7 @@
]),
install_requires=[
"azure-core<2.0.0,>=1.10.0",
- "msrest>=0.6.18",
+ "msrest>=0.6.21",
"cryptography>=2.1.4"
],
extras_require={
diff --git a/sdk/storage/azure-storage-blob/swagger/README.md b/sdk/storage/azure-storage-blob/swagger/README.md
index 1c90942a9bcb..67a3daeb9167 100644
--- a/sdk/storage/azure-storage-blob/swagger/README.md
+++ b/sdk/storage/azure-storage-blob/swagger/README.md
@@ -16,7 +16,7 @@ autorest --v3 --python
### Settings
``` yaml
-input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.BlobStorage/preview/2020-06-12/blob.json
+input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.BlobStorage/preview/2020-08-04/blob.json
output-folder: ../azure/storage/blob/_generated
namespace: azure.storage.blob
no-namespace-folders: true
diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml
index bb28feabbf00..7d7ac1159c42 100644
--- a/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml
+++ b/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml
@@ -16,25 +16,23 @@ interactions:
Content-Type:
- application/xml; charset=utf-8
User-Agent:
- - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0)
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
x-ms-date:
- - Fri, 25 Oct 2019 17:53:54 GMT
+ - Thu, 10 Dec 2020 17:24:15 GMT
x-ms-version:
- - '2019-02-02'
+ - '2020-04-08'
method: PUT
uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
response:
body:
string: ''
headers:
- content-length:
- - '0'
date:
- - Fri, 25 Oct 2019 17:53:53 GMT
- server:
- - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ - Thu, 10 Dec 2020 17:24:19 GMT
+ transfer-encoding:
+ - chunked
x-ms-version:
- - '2019-02-02'
+ - '2020-04-08'
status:
code: 202
message: Accepted
@@ -48,30 +46,28 @@ interactions:
Connection:
- keep-alive
User-Agent:
- - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0)
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
x-ms-date:
- - Fri, 25 Oct 2019 17:53:54 GMT
+ - Thu, 10 Dec 2020 17:24:25 GMT
x-ms-version:
- - '2019-02-02'
+ - '2020-04-08'
method: GET
uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
response:
body:
- string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsetrueindex.html2014-02-14"
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsefalsefalse"
headers:
content-type:
- application/xml
date:
- - Fri, 25 Oct 2019 17:53:53 GMT
- server:
- - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ - Thu, 10 Dec 2020 17:24:27 GMT
transfer-encoding:
- chunked
vary:
- Origin
x-ms-version:
- - '2019-02-02'
+ - '2020-04-08'
status:
code: 200
message: OK
@@ -91,25 +87,23 @@ interactions:
Content-Type:
- application/xml; charset=utf-8
User-Agent:
- - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0)
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
x-ms-date:
- - Fri, 25 Oct 2019 17:53:54 GMT
+ - Thu, 10 Dec 2020 17:46:46 GMT
x-ms-version:
- - '2019-02-02'
+ - '2020-04-08'
method: PUT
uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
response:
body:
string: ''
headers:
- content-length:
- - '0'
date:
- - Fri, 25 Oct 2019 17:53:54 GMT
- server:
- - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ - Thu, 10 Dec 2020 17:46:49 GMT
+ transfer-encoding:
+ - chunked
x-ms-version:
- - '2019-02-02'
+ - '2020-04-08'
status:
code: 202
message: Accepted
@@ -123,30 +117,28 @@ interactions:
Connection:
- keep-alive
User-Agent:
- - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0)
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
x-ms-date:
- - Fri, 25 Oct 2019 17:53:54 GMT
+ - Thu, 10 Dec 2020 17:46:49 GMT
x-ms-version:
- - '2019-02-02'
+ - '2020-04-08'
method: GET
uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
response:
body:
- string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsefalsetrueindex.htmlerrors/error/404error.html"
headers:
content-type:
- application/xml
date:
- - Fri, 25 Oct 2019 17:53:54 GMT
- server:
- - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ - Thu, 10 Dec 2020 17:46:50 GMT
transfer-encoding:
- chunked
vary:
- Origin
x-ms-version:
- - '2019-02-02'
+ - '2020-04-08'
status:
code: 200
message: OK
diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml
new file mode 100644
index 000000000000..c2a2eab4511c
--- /dev/null
+++ b/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml
@@ -0,0 +1,1594 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:03:14 GMT
+ x-ms-version:
+ - '2020-08-04'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/utqqcontainerb38317df?restype=container
+ response:
+ body:
+ string: "\uFEFFContainerAlreadyExistsThe
+ specified container already exists.\nRequestId:95663fec-c01e-0005-03f5-2c3b70000000\nTime:2021-04-09T04:03:15.4909578Z"
+ headers:
+ content-length:
+ - '230'
+ content-type:
+ - application/xml
+ date:
+ - Fri, 09 Apr 2021 04:03:14 GMT
+ server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-error-code:
+ - ContainerAlreadyExists
+ x-ms-version:
+ - '2020-08-04'
+ status:
+ code: 409
+ message: The specified container already exists.
+- request:
+ body: !!binary |
+ UEFSMRUAFeJrFeJrLBXQDxUAFQYVBhwYAzk5ORgBMBYAFtAPGAM5OTkYATAAAAADAAAA0A8BAQAA
+ ADABAAAAMQEAAAAyAQAAADMBAAAANAEAAAA1AQAAADYBAAAANwEAAAA4AQAAADkCAAAAMTACAAAA
+ MTECAAAAMTICAAAAMTMCAAAAMTQCAAAAMTUCAAAAMTYCAAAAMTcCAAAAMTgCAAAAMTkCAAAAMjAC
+ AAAAMjECAAAAMjICAAAAMjMCAAAAMjQCAAAAMjUCAAAAMjYCAAAAMjcCAAAAMjgCAAAAMjkCAAAA
+ MzACAAAAMzECAAAAMzICAAAAMzMCAAAAMzQCAAAAMzUCAAAAMzYCAAAAMzcCAAAAMzgCAAAAMzkC
+ AAAANDACAAAANDECAAAANDICAAAANDMCAAAANDQCAAAANDUCAAAANDYCAAAANDcCAAAANDgCAAAA
+ NDkCAAAANTACAAAANTECAAAANTICAAAANTMCAAAANTQCAAAANTUCAAAANTYCAAAANTcCAAAANTgC
+ AAAANTkCAAAANjACAAAANjECAAAANjICAAAANjMCAAAANjQCAAAANjUCAAAANjYCAAAANjcCAAAA
+ NjgCAAAANjkCAAAANzACAAAANzECAAAANzICAAAANzMCAAAANzQCAAAANzUCAAAANzYCAAAANzcC
+ AAAANzgCAAAANzkCAAAAODACAAAAODECAAAAODICAAAAODMCAAAAODQCAAAAODUCAAAAODYCAAAA
+ ODcCAAAAODgCAAAAODkCAAAAOTACAAAAOTECAAAAOTICAAAAOTMCAAAAOTQCAAAAOTUCAAAAOTYC
+ AAAAOTcCAAAAOTgCAAAAOTkDAAAAMTAwAwAAADEwMQMAAAAxMDIDAAAAMTAzAwAAADEwNAMAAAAx
+ MDUDAAAAMTA2AwAAADEwNwMAAAAxMDgDAAAAMTA5AwAAADExMAMAAAAxMTEDAAAAMTEyAwAAADEx
+ MwMAAAAxMTQDAAAAMTE1AwAAADExNgMAAAAxMTcDAAAAMTE4AwAAADExOQMAAAAxMjADAAAAMTIx
+ AwAAADEyMgMAAAAxMjMDAAAAMTI0AwAAADEyNQMAAAAxMjYDAAAAMTI3AwAAADEyOAMAAAAxMjkD
+ AAAAMTMwAwAAADEzMQMAAAAxMzIDAAAAMTMzAwAAADEzNAMAAAAxMzUDAAAAMTM2AwAAADEzNwMA
+ AAAxMzgDAAAAMTM5AwAAADE0MAMAAAAxNDEDAAAAMTQyAwAAADE0MwMAAAAxNDQDAAAAMTQ1AwAA
+ ADE0NgMAAAAxNDcDAAAAMTQ4AwAAADE0OQMAAAAxNTADAAAAMTUxAwAAADE1MgMAAAAxNTMDAAAA
+ MTU0AwAAADE1NQMAAAAxNTYDAAAAMTU3AwAAADE1OAMAAAAxNTkDAAAAMTYwAwAAADE2MQMAAAAx
+ NjIDAAAAMTYzAwAAADE2NAMAAAAxNjUDAAAAMTY2AwAAADE2NwMAAAAxNjgDAAAAMTY5AwAAADE3
+ MAMAAAAxNzEDAAAAMTcyAwAAADE3MwMAAAAxNzQDAAAAMTc1AwAAADE3NgMAAAAxNzcDAAAAMTc4
+ AwAAADE3OQMAAAAxODADAAAAMTgxAwAAADE4MgMAAAAxODMDAAAAMTg0AwAAADE4NQMAAAAxODYD
+ AAAAMTg3AwAAADE4OAMAAAAxODkDAAAAMTkwAwAAADE5MQMAAAAxOTIDAAAAMTkzAwAAADE5NAMA
+ AAAxOTUDAAAAMTk2AwAAADE5NwMAAAAxOTgDAAAAMTk5AwAAADIwMAMAAAAyMDEDAAAAMjAyAwAA
+ ADIwMwMAAAAyMDQDAAAAMjA1AwAAADIwNgMAAAAyMDcDAAAAMjA4AwAAADIwOQMAAAAyMTADAAAA
+ MjExAwAAADIxMgMAAAAyMTMDAAAAMjE0AwAAADIxNQMAAAAyMTYDAAAAMjE3AwAAADIxOAMAAAAy
+ MTkDAAAAMjIwAwAAADIyMQMAAAAyMjIDAAAAMjIzAwAAADIyNAMAAAAyMjUDAAAAMjI2AwAAADIy
+ NwMAAAAyMjgDAAAAMjI5AwAAADIzMAMAAAAyMzEDAAAAMjMyAwAAADIzMwMAAAAyMzQDAAAAMjM1
+ AwAAADIzNgMAAAAyMzcDAAAAMjM4AwAAADIzOQMAAAAyNDADAAAAMjQxAwAAADI0MgMAAAAyNDMD
+ AAAAMjQ0AwAAADI0NQMAAAAyNDYDAAAAMjQ3AwAAADI0OAMAAAAyNDkDAAAAMjUwAwAAADI1MQMA
+ AAAyNTIDAAAAMjUzAwAAADI1NAMAAAAyNTUDAAAAMjU2AwAAADI1NwMAAAAyNTgDAAAAMjU5AwAA
+ ADI2MAMAAAAyNjEDAAAAMjYyAwAAADI2MwMAAAAyNjQDAAAAMjY1AwAAADI2NgMAAAAyNjcDAAAA
+ MjY4AwAAADI2OQMAAAAyNzADAAAAMjcxAwAAADI3MgMAAAAyNzMDAAAAMjc0AwAAADI3NQMAAAAy
+ NzYDAAAAMjc3AwAAADI3OAMAAAAyNzkDAAAAMjgwAwAAADI4MQMAAAAyODIDAAAAMjgzAwAAADI4
+ NAMAAAAyODUDAAAAMjg2AwAAADI4NwMAAAAyODgDAAAAMjg5AwAAADI5MAMAAAAyOTEDAAAAMjky
+ AwAAADI5MwMAAAAyOTQDAAAAMjk1AwAAADI5NgMAAAAyOTcDAAAAMjk4AwAAADI5OQMAAAAzMDAD
+ AAAAMzAxAwAAADMwMgMAAAAzMDMDAAAAMzA0AwAAADMwNQMAAAAzMDYDAAAAMzA3AwAAADMwOAMA
+ AAAzMDkDAAAAMzEwAwAAADMxMQMAAAAzMTIDAAAAMzEzAwAAADMxNAMAAAAzMTUDAAAAMzE2AwAA
+ ADMxNwMAAAAzMTgDAAAAMzE5AwAAADMyMAMAAAAzMjEDAAAAMzIyAwAAADMyMwMAAAAzMjQDAAAA
+ MzI1AwAAADMyNgMAAAAzMjcDAAAAMzI4AwAAADMyOQMAAAAzMzADAAAAMzMxAwAAADMzMgMAAAAz
+ MzMDAAAAMzM0AwAAADMzNQMAAAAzMzYDAAAAMzM3AwAAADMzOAMAAAAzMzkDAAAAMzQwAwAAADM0
+ MQMAAAAzNDIDAAAAMzQzAwAAADM0NAMAAAAzNDUDAAAAMzQ2AwAAADM0NwMAAAAzNDgDAAAAMzQ5
+ AwAAADM1MAMAAAAzNTEDAAAAMzUyAwAAADM1MwMAAAAzNTQDAAAAMzU1AwAAADM1NgMAAAAzNTcD
+ AAAAMzU4AwAAADM1OQMAAAAzNjADAAAAMzYxAwAAADM2MgMAAAAzNjMDAAAAMzY0AwAAADM2NQMA
+ AAAzNjYDAAAAMzY3AwAAADM2OAMAAAAzNjkDAAAAMzcwAwAAADM3MQMAAAAzNzIDAAAAMzczAwAA
+ ADM3NAMAAAAzNzUDAAAAMzc2AwAAADM3NwMAAAAzNzgDAAAAMzc5AwAAADM4MAMAAAAzODEDAAAA
+ MzgyAwAAADM4MwMAAAAzODQDAAAAMzg1AwAAADM4NgMAAAAzODcDAAAAMzg4AwAAADM4OQMAAAAz
+ OTADAAAAMzkxAwAAADM5MgMAAAAzOTMDAAAAMzk0AwAAADM5NQMAAAAzOTYDAAAAMzk3AwAAADM5
+ OAMAAAAzOTkDAAAANDAwAwAAADQwMQMAAAA0MDIDAAAANDAzAwAAADQwNAMAAAA0MDUDAAAANDA2
+ AwAAADQwNwMAAAA0MDgDAAAANDA5AwAAADQxMAMAAAA0MTEDAAAANDEyAwAAADQxMwMAAAA0MTQD
+ AAAANDE1AwAAADQxNgMAAAA0MTcDAAAANDE4AwAAADQxOQMAAAA0MjADAAAANDIxAwAAADQyMgMA
+ AAA0MjMDAAAANDI0AwAAADQyNQMAAAA0MjYDAAAANDI3AwAAADQyOAMAAAA0MjkDAAAANDMwAwAA
+ ADQzMQMAAAA0MzIDAAAANDMzAwAAADQzNAMAAAA0MzUDAAAANDM2AwAAADQzNwMAAAA0MzgDAAAA
+ NDM5AwAAADQ0MAMAAAA0NDEDAAAANDQyAwAAADQ0MwMAAAA0NDQDAAAANDQ1AwAAADQ0NgMAAAA0
+ NDcDAAAANDQ4AwAAADQ0OQMAAAA0NTADAAAANDUxAwAAADQ1MgMAAAA0NTMDAAAANDU0AwAAADQ1
+ NQMAAAA0NTYDAAAANDU3AwAAADQ1OAMAAAA0NTkDAAAANDYwAwAAADQ2MQMAAAA0NjIDAAAANDYz
+ AwAAADQ2NAMAAAA0NjUDAAAANDY2AwAAADQ2NwMAAAA0NjgDAAAANDY5AwAAADQ3MAMAAAA0NzED
+ AAAANDcyAwAAADQ3MwMAAAA0NzQDAAAANDc1AwAAADQ3NgMAAAA0NzcDAAAANDc4AwAAADQ3OQMA
+ AAA0ODADAAAANDgxAwAAADQ4MgMAAAA0ODMDAAAANDg0AwAAADQ4NQMAAAA0ODYDAAAANDg3AwAA
+ ADQ4OAMAAAA0ODkDAAAANDkwAwAAADQ5MQMAAAA0OTIDAAAANDkzAwAAADQ5NAMAAAA0OTUDAAAA
+ NDk2AwAAADQ5NwMAAAA0OTgDAAAANDk5AwAAADUwMAMAAAA1MDEDAAAANTAyAwAAADUwMwMAAAA1
+ MDQDAAAANTA1AwAAADUwNgMAAAA1MDcDAAAANTA4AwAAADUwOQMAAAA1MTADAAAANTExAwAAADUx
+ MgMAAAA1MTMDAAAANTE0AwAAADUxNQMAAAA1MTYDAAAANTE3AwAAADUxOAMAAAA1MTkDAAAANTIw
+ AwAAADUyMQMAAAA1MjIDAAAANTIzAwAAADUyNAMAAAA1MjUDAAAANTI2AwAAADUyNwMAAAA1MjgD
+ AAAANTI5AwAAADUzMAMAAAA1MzEDAAAANTMyAwAAADUzMwMAAAA1MzQDAAAANTM1AwAAADUzNgMA
+ AAA1MzcDAAAANTM4AwAAADUzOQMAAAA1NDADAAAANTQxAwAAADU0MgMAAAA1NDMDAAAANTQ0AwAA
+ ADU0NQMAAAA1NDYDAAAANTQ3AwAAADU0OAMAAAA1NDkDAAAANTUwAwAAADU1MQMAAAA1NTIDAAAA
+ NTUzAwAAADU1NAMAAAA1NTUDAAAANTU2AwAAADU1NwMAAAA1NTgDAAAANTU5AwAAADU2MAMAAAA1
+ NjEDAAAANTYyAwAAADU2MwMAAAA1NjQDAAAANTY1AwAAADU2NgMAAAA1NjcDAAAANTY4AwAAADU2
+ OQMAAAA1NzADAAAANTcxAwAAADU3MgMAAAA1NzMDAAAANTc0AwAAADU3NQMAAAA1NzYDAAAANTc3
+ AwAAADU3OAMAAAA1NzkDAAAANTgwAwAAADU4MQMAAAA1ODIDAAAANTgzAwAAADU4NAMAAAA1ODUD
+ AAAANTg2AwAAADU4NwMAAAA1ODgDAAAANTg5AwAAADU5MAMAAAA1OTEDAAAANTkyAwAAADU5MwMA
+ AAA1OTQDAAAANTk1AwAAADU5NgMAAAA1OTcDAAAANTk4AwAAADU5OQMAAAA2MDADAAAANjAxAwAA
+ ADYwMgMAAAA2MDMDAAAANjA0AwAAADYwNQMAAAA2MDYDAAAANjA3AwAAADYwOAMAAAA2MDkDAAAA
+ NjEwAwAAADYxMQMAAAA2MTIDAAAANjEzAwAAADYxNAMAAAA2MTUDAAAANjE2AwAAADYxNwMAAAA2
+ MTgDAAAANjE5AwAAADYyMAMAAAA2MjEDAAAANjIyAwAAADYyMwMAAAA2MjQDAAAANjI1AwAAADYy
+ NgMAAAA2MjcDAAAANjI4AwAAADYyOQMAAAA2MzADAAAANjMxAwAAADYzMgMAAAA2MzMDAAAANjM0
+ AwAAADYzNQMAAAA2MzYDAAAANjM3AwAAADYzOAMAAAA2MzkDAAAANjQwAwAAADY0MQMAAAA2NDID
+ AAAANjQzAwAAADY0NAMAAAA2NDUDAAAANjQ2AwAAADY0NwMAAAA2NDgDAAAANjQ5AwAAADY1MAMA
+ AAA2NTEDAAAANjUyAwAAADY1MwMAAAA2NTQDAAAANjU1AwAAADY1NgMAAAA2NTcDAAAANjU4AwAA
+ ADY1OQMAAAA2NjADAAAANjYxAwAAADY2MgMAAAA2NjMDAAAANjY0AwAAADY2NQMAAAA2NjYDAAAA
+ NjY3AwAAADY2OAMAAAA2NjkDAAAANjcwAwAAADY3MQMAAAA2NzIDAAAANjczAwAAADY3NAMAAAA2
+ NzUDAAAANjc2AwAAADY3NwMAAAA2NzgDAAAANjc5AwAAADY4MAMAAAA2ODEDAAAANjgyAwAAADY4
+ MwMAAAA2ODQDAAAANjg1AwAAADY4NgMAAAA2ODcDAAAANjg4AwAAADY4OQMAAAA2OTADAAAANjkx
+ AwAAADY5MgMAAAA2OTMDAAAANjk0AwAAADY5NQMAAAA2OTYDAAAANjk3AwAAADY5OAMAAAA2OTkD
+ AAAANzAwAwAAADcwMQMAAAA3MDIDAAAANzAzAwAAADcwNAMAAAA3MDUDAAAANzA2AwAAADcwNwMA
+ AAA3MDgDAAAANzA5AwAAADcxMAMAAAA3MTEDAAAANzEyAwAAADcxMwMAAAA3MTQDAAAANzE1AwAA
+ ADcxNgMAAAA3MTcDAAAANzE4AwAAADcxOQMAAAA3MjADAAAANzIxAwAAADcyMgMAAAA3MjMDAAAA
+ NzI0AwAAADcyNQMAAAA3MjYDAAAANzI3AwAAADcyOAMAAAA3MjkDAAAANzMwAwAAADczMQMAAAA3
+ MzIDAAAANzMzAwAAADczNAMAAAA3MzUDAAAANzM2AwAAADczNwMAAAA3MzgDAAAANzM5AwAAADc0
+ MAMAAAA3NDEDAAAANzQyAwAAADc0MwMAAAA3NDQDAAAANzQ1AwAAADc0NgMAAAA3NDcDAAAANzQ4
+ AwAAADc0OQMAAAA3NTADAAAANzUxAwAAADc1MgMAAAA3NTMDAAAANzU0AwAAADc1NQMAAAA3NTYD
+ AAAANzU3AwAAADc1OAMAAAA3NTkDAAAANzYwAwAAADc2MQMAAAA3NjIDAAAANzYzAwAAADc2NAMA
+ AAA3NjUDAAAANzY2AwAAADc2NwMAAAA3NjgDAAAANzY5AwAAADc3MAMAAAA3NzEDAAAANzcyAwAA
+ ADc3MwMAAAA3NzQDAAAANzc1AwAAADc3NgMAAAA3NzcDAAAANzc4AwAAADc3OQMAAAA3ODADAAAA
+ NzgxAwAAADc4MgMAAAA3ODMDAAAANzg0AwAAADc4NQMAAAA3ODYDAAAANzg3AwAAADc4OAMAAAA3
+ ODkDAAAANzkwAwAAADc5MQMAAAA3OTIDAAAANzkzAwAAADc5NAMAAAA3OTUDAAAANzk2AwAAADc5
+ NwMAAAA3OTgDAAAANzk5AwAAADgwMAMAAAA4MDEDAAAAODAyAwAAADgwMwMAAAA4MDQDAAAAODA1
+ AwAAADgwNgMAAAA4MDcDAAAAODA4AwAAADgwOQMAAAA4MTADAAAAODExAwAAADgxMgMAAAA4MTMD
+ AAAAODE0AwAAADgxNQMAAAA4MTYDAAAAODE3AwAAADgxOAMAAAA4MTkDAAAAODIwAwAAADgyMQMA
+ AAA4MjIDAAAAODIzAwAAADgyNAMAAAA4MjUDAAAAODI2AwAAADgyNwMAAAA4MjgDAAAAODI5AwAA
+ ADgzMAMAAAA4MzEDAAAAODMyAwAAADgzMwMAAAA4MzQDAAAAODM1AwAAADgzNgMAAAA4MzcDAAAA
+ ODM4AwAAADgzOQMAAAA4NDADAAAAODQxAwAAADg0MgMAAAA4NDMDAAAAODQ0AwAAADg0NQMAAAA4
+ NDYDAAAAODQ3AwAAADg0OAMAAAA4NDkDAAAAODUwAwAAADg1MQMAAAA4NTIDAAAAODUzAwAAADg1
+ NAMAAAA4NTUDAAAAODU2AwAAADg1NwMAAAA4NTgDAAAAODU5AwAAADg2MAMAAAA4NjEDAAAAODYy
+ AwAAADg2MwMAAAA4NjQDAAAAODY1AwAAADg2NgMAAAA4NjcDAAAAODY4AwAAADg2OQMAAAA4NzAD
+ AAAAODcxAwAAADg3MgMAAAA4NzMDAAAAODc0AwAAADg3NQMAAAA4NzYDAAAAODc3AwAAADg3OAMA
+ AAA4NzkDAAAAODgwAwAAADg4MQMAAAA4ODIDAAAAODgzAwAAADg4NAMAAAA4ODUDAAAAODg2AwAA
+ ADg4NwMAAAA4ODgDAAAAODg5AwAAADg5MAMAAAA4OTEDAAAAODkyAwAAADg5MwMAAAA4OTQDAAAA
+ ODk1AwAAADg5NgMAAAA4OTcDAAAAODk4AwAAADg5OQMAAAA5MDADAAAAOTAxAwAAADkwMgMAAAA5
+ MDMDAAAAOTA0AwAAADkwNQMAAAA5MDYDAAAAOTA3AwAAADkwOAMAAAA5MDkDAAAAOTEwAwAAADkx
+ MQMAAAA5MTIDAAAAOTEzAwAAADkxNAMAAAA5MTUDAAAAOTE2AwAAADkxNwMAAAA5MTgDAAAAOTE5
+ AwAAADkyMAMAAAA5MjEDAAAAOTIyAwAAADkyMwMAAAA5MjQDAAAAOTI1AwAAADkyNgMAAAA5MjcD
+ AAAAOTI4AwAAADkyOQMAAAA5MzADAAAAOTMxAwAAADkzMgMAAAA5MzMDAAAAOTM0AwAAADkzNQMA
+ AAA5MzYDAAAAOTM3AwAAADkzOAMAAAA5MzkDAAAAOTQwAwAAADk0MQMAAAA5NDIDAAAAOTQzAwAA
+ ADk0NAMAAAA5NDUDAAAAOTQ2AwAAADk0NwMAAAA5NDgDAAAAOTQ5AwAAADk1MAMAAAA5NTEDAAAA
+ OTUyAwAAADk1MwMAAAA5NTQDAAAAOTU1AwAAADk1NgMAAAA5NTcDAAAAOTU4AwAAADk1OQMAAAA5
+ NjADAAAAOTYxAwAAADk2MgMAAAA5NjMDAAAAOTY0AwAAADk2NQMAAAA5NjYDAAAAOTY3AwAAADk2
+ OAMAAAA5NjkDAAAAOTcwAwAAADk3MQMAAAA5NzIDAAAAOTczAwAAADk3NAMAAAA5NzUDAAAAOTc2
+ AwAAADk3NwMAAAA5NzgDAAAAOTc5AwAAADk4MAMAAAA5ODEDAAAAOTgyAwAAADk4MwMAAAA5ODQD
+ AAAAOTg1AwAAADk4NgMAAAA5ODcDAAAAOTg4AwAAADk4OQMAAAA5OTADAAAAOTkxAwAAADk5MgMA
+ AAA5OTMDAAAAOTk0AwAAADk5NQMAAAA5OTYDAAAAOTk3AwAAADk5OAMAAAA5OTkVABWO+gEVjvoB
+ LBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW0A8YDHp6cTBrZnk0LnZi
+ bhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5lYTMMAAAANWRtdnFldmcuamsw
+ DAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8zamF0bmMuMXZoDAAAAHUzYmZ1
+ dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYnczDAAAAGkwc3EzMDVvLmg1dQwA
+ AAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nra3QyLnJpMAwAAABxMG40NTJl
+ NC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwAAABjd3RhZWQyci5xZHcMAAAA
+ M215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZxci5ubXEMAAAAbHd1aG5kbTAu
+ d2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAAbHBlYnRqNXcuZmMwDAAAAHp0
+ aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2EuY2RmDAAAAHBjanpvdzF1Lm0w
+ MAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1MnJtY2htLnNoZQwAAABwczBz
+ ZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4YgwAAABqMmxtZnpzMi5xZmIM
+ AAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2owZGsybi5hczIMAAAAem5iemhn
+ aXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQMAAAAcm95ZG9udWsuYjJqDAAA
+ AGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5ZGMubHZsDAAAAGRiZGZtc3Iy
+ LmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAAAHIwbm50eTRwLnFlMAwAAAA0
+ eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5Lms1agwAAABhcHljZ2h1aC5h
+ bHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABveGxhdGdudy5hdG8MAAAAdGpn
+ b2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5odnUMAAAAc2x3dXZjaXkucXlm
+ DAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3aTVla3UuZnl6DAAAAHdua2Vz
+ Y25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgwDAAAADVobHZvZ2l3LndtMQwA
+ AABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZkNTMwLnp2NQwAAABqc2N2b3lj
+ Yy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwAAAB1cmkwMmFjMy5zYnkMAAAA
+ bWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1vby5xYWsMAAAAdmN5Z3FzcWUu
+ dXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAAcW1mdXJrMWcucmNnDAAAAHMy
+ ZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwucG1zDAAAAHR0eW9kc251LjQ1
+ ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6dmF6cHZqLmFoeAwAAAA1bXVy
+ NGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxnZwwAAAA1bTU0Zmdnby5rdjUM
+ AAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlzemdhMS53ZnIMAAAAamExY2xh
+ dHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIMAAAAeW5sNXR0eWgubTVsDAAA
+ AG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNwMmQuenRxDAAAAGtnbGl5ZXN0
+ LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAAAGVrZGp0Y3U1LjNicAwAAAA0
+ dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1LjN5dAwAAABqaDV2ZGx6eC54
+ aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABtbmNkZjRudS5idnQMAAAAY3l1
+ ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5tNWkMAAAAcTJvbGRtbDQuZHly
+ DAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRtNGFiMXMuM3FtDAAAAGtxZ2I1
+ ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5DAAAAGZwNGRqamxsLm1meQwA
+ AABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUwaWlrLnQ1ZQwAAABybXZreHN6
+ ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwAAABtbXYwb3lieC5rM2cMAAAA
+ ZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQxZC55dG4MAAAAZGhoZ2d0dGku
+ MWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAAbnhsbGRhYW8ua2RwDAAAADBu
+ cTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsueXJzDAAAAGYxcmMwNGp0LjFr
+ bAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxrdmY1b3gyLmpqMAwAAABhejIy
+ NG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRpZgwAAABtazB4dXZ5MS5pMjEM
+ AAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3dTF2Zy5vYXMMAAAAcmNtaHhv
+ czMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQMAAAANXIzZHV6b2cuamlnDAAA
+ AHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtmeTQudmJuDAAAAHJ0cTBkZG9n
+ LjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAAAHNxaGdhaW1wLnQ0YgwAAAB6
+ cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4LmZqMgwAAAAxbDFtNDFiai5n
+ ZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABmMXhtMTN6eS5langMAAAAMXNl
+ cTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51bWgMAAAAMHNrdmJvanEueTBo
+ DAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xmZ2RhYnoud3djDAAAAGFnem1o
+ eHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5xDAAAAHJ4dWJ2dmdwLnhnZgwA
+ AAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0cWNvLjRtZAwAAABkdnJmZW0y
+ cC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwAAABmYWlsMzVieS5ycTMMAAAA
+ bTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlvdS4wMWcMAAAAbXYzcm5lZW8u
+ cmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAAYXcycHJqYmEubTNhDAAAAGJo
+ Z3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAuYWV4DAAAAGQxcXZ1ZmltLnBi
+ dwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtkeWRhcWlyLndjcgwAAAB3YTM0
+ Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2cgwAAABoeHJqNHJzZS54Y20M
+ AAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFieDNtZS5tbHgMAAAAZ2I1MG11
+ bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYMAAAAdWdlc3R5dzEudXBsDAAA
+ AHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFncXMucTRqDAAAAG0zbnduMGUy
+ LmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAAAG16YTR0NXNnLnV1dgwAAAAw
+ aGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEyLnhtcwwAAAAzbWltdnF1bi5o
+ dTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABubWg0bmg1MS4xbjAMAAAAZ2Zy
+ b3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4zb3IMAAAAcHhuMXQzemkuYWNn
+ DAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1eWx6dHQua3BiDAAAADBiaWNz
+ eXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYyDAAAAG9mZGptbnN2LnVodAwA
+ AAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3Ymt2Lml3MwwAAAB5ampoa3Fs
+ bi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwAAAB0djEzd3F2eS55dWIMAAAA
+ b2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAzZy5ueXUMAAAAMGM1dXR1bWYu
+ M3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAAeXlpajEwMW8ucGlqDAAAAHA1
+ anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMudW0wDAAAAHdjdHBua2ZoLjJ1
+ bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZyMHNza29yLm4ydwwAAAB4dDUw
+ MHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFqZwwAAABqc2V0emMwZS5qaGUM
+ AAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRpMnNmdi53MnUMAAAAbXpwdnNu
+ dWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEMAAAANXhob2txNTQuY29qDAAA
+ AHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1eTQuejMyDAAAAG12dnJ2czFu
+ LmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAAAHZnNGNybm0yLjNjYgwAAABr
+ NTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0LmtkYgwAAABqd3FnYnVtYi5p
+ cnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAAByZ2MzdjN5cC4xY3AMAAAAZ3Bo
+ MzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41ZjAMAAAAaGhrYjBrdzAueWky
+ DAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJmZ3FxeDUudHoyDAAAAG80dWk0
+ a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFoDAAAADB3eHBpZWlpLmVndAwA
+ AABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3b3hpLm50ZgwAAABuemZyYmJ2
+ eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwAAABuNXFnYWgxbS5vM28MAAAA
+ cDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251ay4yMXAMAAAAYWVrYTE1Z3Eu
+ cXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAAanJvM2hzcDMuMmYzDAAAAGJz
+ Z2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMuYjJyDAAAAG5paTFtc3YzLnBz
+ dQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1bmd3dWlqLnViMwwAAAB2Ymx3
+ MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxwNQwAAABqcW1xeWVkdy5naWEM
+ AAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQwaHpwcy5kdjUMAAAAd2ZnY2Rx
+ NGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQMAAAAZGwxMnl6bXIuZWJmDAAA
+ AHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZsMmIuZmJ3DAAAADJ4a3c0eHhy
+ LnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAAAGRkem5lMGpnLmV2NAwAAAB6
+ d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVlLnpjeAwAAAByZmRncm4xZS5y
+ ZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5Y3lreGVnYy4zYmwMAAAAajNq
+ MnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5pcTUMAAAAMGp1cmoyMWkuNDAz
+ DAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlvMnM1MHAueGprDAAAAHBpYWpi
+ bXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmswDAAAAGpvZHIxbHVjLmk0cAwA
+ AAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGszMWJwLm4xdAwAAAB1MW1sazF3
+ NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwAAAB4d20wdGt2bS5xbHkMAAAA
+ dWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhydi5yc3YMAAAAdmdyYnlxdXYu
+ cXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAAZDFocWk1dmMuY20yDAAAADFx
+ MGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQuZGlzDAAAAGNsaWY1b3h2LnQw
+ bgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNqcnNjaWp3LmJzcAwAAAAxcGxt
+ bjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVudAwAAABhcGxhZTVocS5ibG0M
+ AAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5sYjRlNS5ibnkMAAAAYWl3amdz
+ cWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAMAAAAYXBpbWdvdGYueXE0DAAA
+ AGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRmcDAuZDV0DAAAAGhocDI1d2Fp
+ LnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAAAHhyMTFmNHVuLjJidQwAAAB3
+ ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cxLmdqMgwAAABrMHRzbjRmaC5v
+ a2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABxZHpwNWRyby4xcXcMAAAAa2Zh
+ YmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53MGgMAAAAZGZkNDN6dHcubWly
+ DAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3lsZjF4aHguZ2RqDAAAADR5bnAw
+ dmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpkDAAAADRuMm5kMGlvLm53ZAwA
+ AAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1ZnJ1LmRjcwwAAAB4NGpoNXBk
+ ci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwAAABhMmJ0bWJ5YS5xZ2UMAAAA
+ bGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXkybi52bjQMAAAAZXpvemI0M2su
+ YTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAAMnBsbXVrdHIuYnB4DAAAAGhm
+ eGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMuZ21sDAAAAHJpY2o0eGs1LnBq
+ bQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAxbGdncnVzLnB5bAwAAABqb3R3
+ cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96bgwAAABhdGhucnJ6di5pdG8M
+ AAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1iaDNraS5rYm8MAAAAZzRoZnNo
+ YWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoMAAAAbGY1cG14YXguYWJ6DAAA
+ AGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6dzUuaXU1DAAAAHlzMjMzZm52
+ LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAAAG8ydHFzM2NuLjBxcgwAAABy
+ cnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29qLmExcAwAAABtNXNxd2Nkai5v
+ bHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABoc3ozcWdoNC53MTMMAAAAZWN0
+ Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5kMzMMAAAANXA1YW1ja2wuam1s
+ DAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1MzJrenQudGllDAAAAGEzdG9n
+ ZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVjDAAAAGVia3h2bXExLjJ0aQwA
+ AABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNjbTQxLnQxbAwAAAB3aW55a2Ft
+ Zy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwAAAAzaWtwa2tteC5xZjIMAAAA
+ YnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBuMC41cWYMAAAAM25uZGNobWcu
+ eXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAAd2lveTF5bmIuZ3gxDAAAAGdj
+ dDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEueTUxDAAAADIzcmVlbjI0Lngz
+ MgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpzdWl2em1jLnRmMwwAAABvMmt4
+ bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndzcQwAAAA0dDIxaDB0Yi56dDIM
+ AAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3ZWxteC5kaHoMAAAAc2JvNHRj
+ eXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncMAAAAajJvNXdkcncuZ3VrDAAA
+ AGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtvNTUueGZwDAAAADVvdnlydHpt
+ LmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAAAHZ2MWVkcnI0Lm1rcAwAAAB1
+ aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVmLmJjcAwAAAB5ZGVzcGpjZy5p
+ ajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0cDRtNXR0dC53bXgMAAAAcGpk
+ Y3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41ZW8MAAAAc2I1MTJ5YmouM3Jj
+ DAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5bmJjc2gueHR1DAAAAG8yYTFi
+ ZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5DAAAAHNwZmZ3bHhwLjRtcQwA
+ AABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdrNWpmLnhjYgwAAABncTR4c3dx
+ dC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwAAABsdnpvdzRpMy5jNHYMAAAA
+ ankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2JsaS5tcGQMAAAAbzBydHh1Ymcu
+ MWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAAMGJlaDRta2QueWVrDAAAAHVj
+ c2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUuMXVhDAAAAGMyMjN6Y3JsLmlj
+ cgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJrNGVwa2hrLnVhdQwAAABzbG40
+ cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMzdAwAAAB3ZWowcGhmbi4xa2sM
+ AAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4ycmR0NC5qZmMMAAAAYmdpMnN0
+ YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAMAAAAbmdkdDBybnIueGtzDAAA
+ AGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0NGkub3JrDAAAAHdveTFvZ3N0
+ LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAAAHYxcXRtZzFlLnV0cwwAAABy
+ ajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25yLjB0MAwAAAA1am9zZG5oZi5n
+ dmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAxbXZ1eDFzcS55cHEMAAAAZnpi
+ Z2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54NGMMAAAAMXJ4MHFuaXQueW96
+ DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRlaTVxa3oudXZiDAAAAHIxMWlk
+ ZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2DAAAAGIwd2tncGFuLm5xawwA
+ AAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhrbzRxLmRhdgwAAABhdzB5cWZw
+ by4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwAAAB4bGdvNHgxdy5odXUMAAAA
+ bzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwzZy50bXIMAAAAa2p4MGVyb2Eu
+ cGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAAaGR0dzNsZWouaHdyDAAAAG5z
+ Y3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3MmwuNWZsDAAAAHhoZWd5d3Z6Lncx
+ YwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVxZGRrYmJiLnFnbgwAAAAzZnM0
+ ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4dAwAAABweXZudXJ0ZC4zZGMM
+ AAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRzeTR1cy4yMmQMAAAAamxiMGJ0
+ enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQMAAAAa2c1anNqNXIubG96DAAA
+ AGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21yd3AuNHUzDAAAAHd3MGFzc3l4
+ Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAAAGZ1b2pmcTQwLmZ5dAwAAABt
+ YXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRqLnF4cgwAAABxbnd1dGx6YS5n
+ eXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4a2xpamN2ai4zcjEMAAAAc3cx
+ YnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5xbGMMAAAAczFwZ3psaHgueXRw
+ DAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3NocmV0dGYubzAyDAAAAHNyZXZ3
+ eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2JrDAAAADBpdDFtZnhzLmpxMAwA
+ AABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2NmZzNtLnhycwwAAABkd295eWll
+ aC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwAAABqaWRjNW5paC41enEMAAAA
+ MDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2JjMy5wYWsMAAAAd3Nnd3B0d2Iu
+ bG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAAdHpoNHN2dTIuaHp6DAAAAHBj
+ bXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUudXZnDAAAAGJuNHN5cWdrLjBj
+ MgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQxZmNqYmsxLnFseAwAAAAzcmhv
+ M3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0eQwAAABra2lldXZ0NC5zY3gM
+ AAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYzYmpvdi5waTIMAAAAb3NoaWh4
+ ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUMAAAAeGVnNDBib2QudWp3DAAA
+ AHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtzbHIuMjJwDAAAAGZ2dmh3aWs0
+ LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAAAGF3cHczZGpiLjBnZAwAAABw
+ b21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0LjJubQwAAABweWR1bGNpYi56
+ YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5anphNGJrbC5ocWcMAAAAbG5q
+ MmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40d28MAAAAem5iejRoYmQubHoz
+ DAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQzemVkaW4uMXYyDAAAAGV5YTUw
+ cnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMxDAAAAHlmendwNHlxLnp5bAwA
+ AAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1c2ljLm1mawwAAABrZWVmcG1n
+ Yy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwAAABkNWZ4cXpldS5ua2kMAAAA
+ bTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlvdS56bWUMAAAAaGVxa2R1bHUu
+ dHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAAbGN6aTQ1MnAuaWEyDAAAAGEw
+ cmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWkubWd0DAAAADV3b25lcTUyLnJn
+ dwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1eXpvNXVlLjNuYwwAAABqNG9n
+ MnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhyeQwAAAA0bzNhY3B0ZC41c3EM
+ AAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRnenA1bi52enUMAAAAZHZycHZ5
+ M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwMAAAAYW1veWtvZGkuNW9nDAAA
+ AG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgwcGouMzF2DAAAADMwcndocHBs
+ Lmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAAADNleGlsbXB2Lmp6aQwAAABs
+ YWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5LmljcgwAAAA1NHBhMnBtdy5y
+ amkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABpZmxlaTFuMS5idGsMAAAAYmxk
+ d2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5tcjIMAAAAYTRxZG94ZWsuajMx
+ DAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lrampkMWMuNGd5DAAAADVqM2wx
+ MHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3FvDAAAAGI1ZjNmcWRpLjB5NQwA
+ AABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxjdmdtLmpnagwAAAAzZmMwZXdi
+ bS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwAAABxMnRmYjB2ay5uMmQMAAAA
+ a2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1dy5rcXYMAAAAbWRjcGVld2Iu
+ NXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAAeXlhbGJ1Y3MuYW5nDAAAAHAz
+ eHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cuNTU0DAAAAGVydTJsbmowLnN1
+ dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZmeGJidWFkLm5tNQwAAABidmo1
+ eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNyZwwAAABvZWVrcjJ0eC51aXkM
+ AAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdlbGRrdi56YXEMAAAAamJ4YzB3
+ dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIMAAAAaGhwejQyeHQuZ3F4DAAA
+ ADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2JxdWwudWQyDAAAAG94MDQ1azFv
+ LmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAAAGozcGM1c20wLm1sYwwAAABp
+ c2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2RvLm1nYQwAAAB5ZWpnb2d4by55
+ bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2enEzMW94Yi50djMMAAAAeHFz
+ MGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5ycnkMAAAAMDV0Y3h0MmwucXo1
+ DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWExcnIxZGwudWVlDAAAAHFzdWdu
+ eXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6DAAAADUxeW01YmhxLmVybAwA
+ AABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdrZ3lsLm1wdAwAAABkZDV3dGh5
+ aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwAAABocGdudG5qaC56dHIMAAAA
+ eDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJybC4ybXUMAAAAd2lrdXB4b2ou
+ c2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAAMHB4MWRpY2wucWd3DAAAAHVx
+ YTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8uanZpDAAAAGQ0bDQwbGJxLjUw
+ ZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHowYmNsa2R1LmNwawwAAAB3MGpv
+ Z3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3aQwAAABidXp6MmpuMi52MzUM
+ AAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVqMXRydC5rdXgMAAAAYzExcG9l
+ MDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8MAAAANWw1MWswdGsueGRsDAAA
+ AGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZsdjQub2lpDAAAAHVzMzMyMDJy
+ Lm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAAAGx5ZmNscmh3LnJ0NAwAAABk
+ a3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFyLnBzNQwAAABxd2YwM2lxZC5o
+ ZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABjdjFlMnhvdS4xbngMAAAAbGFs
+ bzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5oa2kMAAAAeTB2MjM1eG4uMG5m
+ DAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMwYmRudjEuNDVjDAAAAGhpM3p5
+ cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNlDAAAAGZhZXEwdTNrLmZndQwA
+ AABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xnb2hkLjVibgwAAAB2YWR0YXNs
+ aC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwAAABmcTJ5bmZiMS5tb3IMAAAA
+ Zm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2ZxMy5nZWYMAAAAcWNtYmpha2cu
+ cGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAAeW1vNXlsengudmt3DAAAAHZ1
+ bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcudW8zDAAAAG4zMm00aGVkLnRt
+ cgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBjeXBuZGVwLjNrdwwAAABrdWg0
+ NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmlicAwAAABhc2szdXNzcy56YjUM
+ AAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVlaWVmZi5sc3gMAAAAa2pmMG9u
+ bmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEMAAAAajJuamJtZHEuMTRhDAAA
+ AG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUwanAudmVnDAAAADFsM3phZ3F4
+ Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAAADR3MTJncHAzLmRycwwAAABx
+ MnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtvLjFucAwAAAA0aW54a3YzZC54
+ eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAzbGN1aGZpcS4yYWYMAAAAeGtp
+ NXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5sZ2sMAAAAeHlxZXE1ejMubTRh
+ DAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNjc21uNWkudzFuDAAAAHptNWtp
+ Y3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNwDAAAAHlranlrY3F4LnJqMAwA
+ AABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2VrdTNhLnl3ZAwAAAA0bnAwdGdo
+ NS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwAAAA0azEwdnV6by56d3cMAAAA
+ b3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0di4zY3YMAAAAaGNhMGx3cjMu
+ eGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAAYTJqaHRxeWIuczVjDAAAAGtm
+ ZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIudm53DAAAAHZycDBncG1mLnky
+ YQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4xdnYxdHN1LjFpbAwAAABnZjFi
+ aDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3agwAAABqbmE1em0wYy5hb3gM
+ AAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41cW1ueS5kbDAMAAAAbTNkd3Jx
+ MmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMMAAAAMXU1cjFuYXoueWhjDAAA
+ AG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81MmIuZnlwDAAAAGJuNHJ6aXNy
+ LjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAAAGZ6aWpmcGpsLmMwagwAAABn
+ M3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3NuLmRoagwAAAAyZnZ3eGlsdi5p
+ d2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABucWZtMWJvZS51ZG4MAAAAdGxh
+ czJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5uM20MAAAAYnNqbDBudmkuaW5o
+ DAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpoM2NmYXguNWZmDAAAAGlnM2x0
+ ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0DAAAAG1mbzF0amV4LjR5bAwA
+ AABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHhtMjN4Lmx4cQwAAAB6amlqZGV2
+ cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwAAAB4bGE0NGYxaS5jbmIMAAAA
+ NTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNhZS5vdWYMAAAAZG5qd25lcnYu
+ ZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAAMTEyYnFwcWYuaWMzDAAAAGtw
+ NHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2kuajJ4DAAAAHNudnF3aGkxLml3
+ aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRsc2Fpb2FzLmhzMwwAAAAweGZh
+ dDNxei5vYWkVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZz
+ FgAW0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5l
+ YTMMAAAANWRtdnFldmcuamswDAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8z
+ amF0bmMuMXZoDAAAAHUzYmZ1dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYncz
+ DAAAAGkwc3EzMDVvLmg1dQwAAAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nr
+ a3QyLnJpMAwAAABxMG40NTJlNC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwA
+ AABjd3RhZWQyci5xZHcMAAAAM215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZx
+ ci5ubXEMAAAAbHd1aG5kbTAud2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAA
+ bHBlYnRqNXcuZmMwDAAAAHp0aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2Eu
+ Y2RmDAAAAHBjanpvdzF1Lm0wMAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1
+ MnJtY2htLnNoZQwAAABwczBzZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4
+ YgwAAABqMmxtZnpzMi5xZmIMAAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2ow
+ ZGsybi5hczIMAAAAem5iemhnaXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQM
+ AAAAcm95ZG9udWsuYjJqDAAAAGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5
+ ZGMubHZsDAAAAGRiZGZtc3IyLmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAA
+ AHIwbm50eTRwLnFlMAwAAAA0eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5
+ Lms1agwAAABhcHljZ2h1aC5hbHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABv
+ eGxhdGdudy5hdG8MAAAAdGpnb2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5o
+ dnUMAAAAc2x3dXZjaXkucXlmDAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3
+ aTVla3UuZnl6DAAAAHdua2VzY25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgw
+ DAAAADVobHZvZ2l3LndtMQwAAABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZk
+ NTMwLnp2NQwAAABqc2N2b3ljYy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwA
+ AAB1cmkwMmFjMy5zYnkMAAAAbWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1v
+ by5xYWsMAAAAdmN5Z3FzcWUudXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAA
+ cW1mdXJrMWcucmNnDAAAAHMyZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwu
+ cG1zDAAAAHR0eW9kc251LjQ1ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6
+ dmF6cHZqLmFoeAwAAAA1bXVyNGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxn
+ ZwwAAAA1bTU0Zmdnby5rdjUMAAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlz
+ emdhMS53ZnIMAAAAamExY2xhdHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIM
+ AAAAeW5sNXR0eWgubTVsDAAAAG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNw
+ MmQuenRxDAAAAGtnbGl5ZXN0LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAA
+ AGVrZGp0Y3U1LjNicAwAAAA0dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1
+ LjN5dAwAAABqaDV2ZGx6eC54aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABt
+ bmNkZjRudS5idnQMAAAAY3l1ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5t
+ NWkMAAAAcTJvbGRtbDQuZHlyDAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRt
+ NGFiMXMuM3FtDAAAAGtxZ2I1ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5
+ DAAAAGZwNGRqamxsLm1meQwAAABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUw
+ aWlrLnQ1ZQwAAABybXZreHN6ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwA
+ AABtbXYwb3lieC5rM2cMAAAAZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQx
+ ZC55dG4MAAAAZGhoZ2d0dGkuMWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAA
+ bnhsbGRhYW8ua2RwDAAAADBucTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsu
+ eXJzDAAAAGYxcmMwNGp0LjFrbAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxr
+ dmY1b3gyLmpqMAwAAABhejIyNG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRp
+ ZgwAAABtazB4dXZ5MS5pMjEMAAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3
+ dTF2Zy5vYXMMAAAAcmNtaHhvczMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQM
+ AAAANXIzZHV6b2cuamlnDAAAAHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtm
+ eTQudmJuDAAAAHJ0cTBkZG9nLjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAA
+ AHNxaGdhaW1wLnQ0YgwAAAB6cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4
+ LmZqMgwAAAAxbDFtNDFiai5nZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABm
+ MXhtMTN6eS5langMAAAAMXNlcTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51
+ bWgMAAAAMHNrdmJvanEueTBoDAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xm
+ Z2RhYnoud3djDAAAAGFnem1oeHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5x
+ DAAAAHJ4dWJ2dmdwLnhnZgwAAAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0
+ cWNvLjRtZAwAAABkdnJmZW0ycC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwA
+ AABmYWlsMzVieS5ycTMMAAAAbTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlv
+ dS4wMWcMAAAAbXYzcm5lZW8ucmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAA
+ YXcycHJqYmEubTNhDAAAAGJoZ3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAu
+ YWV4DAAAAGQxcXZ1ZmltLnBidwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtk
+ eWRhcWlyLndjcgwAAAB3YTM0Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2
+ cgwAAABoeHJqNHJzZS54Y20MAAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFi
+ eDNtZS5tbHgMAAAAZ2I1MG11bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYM
+ AAAAdWdlc3R5dzEudXBsDAAAAHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFn
+ cXMucTRqDAAAAG0zbnduMGUyLmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAA
+ AG16YTR0NXNnLnV1dgwAAAAwaGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEy
+ LnhtcwwAAAAzbWltdnF1bi5odTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABu
+ bWg0bmg1MS4xbjAMAAAAZ2Zyb3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4z
+ b3IMAAAAcHhuMXQzemkuYWNnDAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1
+ eWx6dHQua3BiDAAAADBiaWNzeXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYy
+ DAAAAG9mZGptbnN2LnVodAwAAAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3
+ Ymt2Lml3MwwAAAB5ampoa3Fsbi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwA
+ AAB0djEzd3F2eS55dWIMAAAAb2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAz
+ Zy5ueXUMAAAAMGM1dXR1bWYuM3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAA
+ eXlpajEwMW8ucGlqDAAAAHA1anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMu
+ dW0wDAAAAHdjdHBua2ZoLjJ1bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZy
+ MHNza29yLm4ydwwAAAB4dDUwMHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFq
+ ZwwAAABqc2V0emMwZS5qaGUMAAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRp
+ MnNmdi53MnUMAAAAbXpwdnNudWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEM
+ AAAANXhob2txNTQuY29qDAAAAHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1
+ eTQuejMyDAAAAG12dnJ2czFuLmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAA
+ AHZnNGNybm0yLjNjYgwAAABrNTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0
+ LmtkYgwAAABqd3FnYnVtYi5pcnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAABy
+ Z2MzdjN5cC4xY3AMAAAAZ3BoMzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41
+ ZjAMAAAAaGhrYjBrdzAueWkyDAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJm
+ Z3FxeDUudHoyDAAAAG80dWk0a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFo
+ DAAAADB3eHBpZWlpLmVndAwAAABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3
+ b3hpLm50ZgwAAABuemZyYmJ2eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwA
+ AABuNXFnYWgxbS5vM28MAAAAcDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251
+ ay4yMXAMAAAAYWVrYTE1Z3EucXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAA
+ anJvM2hzcDMuMmYzDAAAAGJzZ2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMu
+ YjJyDAAAAG5paTFtc3YzLnBzdQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1
+ bmd3dWlqLnViMwwAAAB2Ymx3MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxw
+ NQwAAABqcW1xeWVkdy5naWEMAAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQw
+ aHpwcy5kdjUMAAAAd2ZnY2RxNGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQM
+ AAAAZGwxMnl6bXIuZWJmDAAAAHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZs
+ MmIuZmJ3DAAAADJ4a3c0eHhyLnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAA
+ AGRkem5lMGpnLmV2NAwAAAB6d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVl
+ LnpjeAwAAAByZmRncm4xZS5yZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5
+ Y3lreGVnYy4zYmwMAAAAajNqMnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5p
+ cTUMAAAAMGp1cmoyMWkuNDAzDAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlv
+ MnM1MHAueGprDAAAAHBpYWpibXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmsw
+ DAAAAGpvZHIxbHVjLmk0cAwAAAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGsz
+ MWJwLm4xdAwAAAB1MW1sazF3NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwA
+ AAB4d20wdGt2bS5xbHkMAAAAdWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhy
+ di5yc3YMAAAAdmdyYnlxdXYucXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAA
+ ZDFocWk1dmMuY20yDAAAADFxMGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQu
+ ZGlzDAAAAGNsaWY1b3h2LnQwbgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNq
+ cnNjaWp3LmJzcAwAAAAxcGxtbjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVu
+ dAwAAABhcGxhZTVocS5ibG0MAAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5s
+ YjRlNS5ibnkMAAAAYWl3amdzcWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAM
+ AAAAYXBpbWdvdGYueXE0DAAAAGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRm
+ cDAuZDV0DAAAAGhocDI1d2FpLnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAA
+ AHhyMTFmNHVuLjJidQwAAAB3ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cx
+ LmdqMgwAAABrMHRzbjRmaC5va2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABx
+ ZHpwNWRyby4xcXcMAAAAa2ZhYmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53
+ MGgMAAAAZGZkNDN6dHcubWlyDAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3ls
+ ZjF4aHguZ2RqDAAAADR5bnAwdmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpk
+ DAAAADRuMm5kMGlvLm53ZAwAAAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1
+ ZnJ1LmRjcwwAAAB4NGpoNXBkci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwA
+ AABhMmJ0bWJ5YS5xZ2UMAAAAbGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXky
+ bi52bjQMAAAAZXpvemI0M2suYTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAA
+ MnBsbXVrdHIuYnB4DAAAAGhmeGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMu
+ Z21sDAAAAHJpY2o0eGs1LnBqbQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAx
+ bGdncnVzLnB5bAwAAABqb3R3cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96
+ bgwAAABhdGhucnJ6di5pdG8MAAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1i
+ aDNraS5rYm8MAAAAZzRoZnNoYWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoM
+ AAAAbGY1cG14YXguYWJ6DAAAAGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6
+ dzUuaXU1DAAAAHlzMjMzZm52LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAA
+ AG8ydHFzM2NuLjBxcgwAAABycnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29q
+ LmExcAwAAABtNXNxd2Nkai5vbHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABo
+ c3ozcWdoNC53MTMMAAAAZWN0Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5k
+ MzMMAAAANXA1YW1ja2wuam1sDAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1
+ MzJrenQudGllDAAAAGEzdG9nZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVj
+ DAAAAGVia3h2bXExLjJ0aQwAAABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNj
+ bTQxLnQxbAwAAAB3aW55a2FtZy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwA
+ AAAzaWtwa2tteC5xZjIMAAAAYnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBu
+ MC41cWYMAAAAM25uZGNobWcueXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAA
+ d2lveTF5bmIuZ3gxDAAAAGdjdDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEu
+ eTUxDAAAADIzcmVlbjI0LngzMgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpz
+ dWl2em1jLnRmMwwAAABvMmt4bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndz
+ cQwAAAA0dDIxaDB0Yi56dDIMAAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3
+ ZWxteC5kaHoMAAAAc2JvNHRjeXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncM
+ AAAAajJvNXdkcncuZ3VrDAAAAGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtv
+ NTUueGZwDAAAADVvdnlydHptLmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAA
+ AHZ2MWVkcnI0Lm1rcAwAAAB1aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVm
+ LmJjcAwAAAB5ZGVzcGpjZy5pajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0
+ cDRtNXR0dC53bXgMAAAAcGpkY3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41
+ ZW8MAAAAc2I1MTJ5YmouM3JjDAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5
+ bmJjc2gueHR1DAAAAG8yYTFiZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5
+ DAAAAHNwZmZ3bHhwLjRtcQwAAABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdr
+ NWpmLnhjYgwAAABncTR4c3dxdC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwA
+ AABsdnpvdzRpMy5jNHYMAAAAankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2Js
+ aS5tcGQMAAAAbzBydHh1YmcuMWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAA
+ MGJlaDRta2QueWVrDAAAAHVjc2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUu
+ MXVhDAAAAGMyMjN6Y3JsLmljcgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJr
+ NGVwa2hrLnVhdQwAAABzbG40cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMz
+ dAwAAAB3ZWowcGhmbi4xa2sMAAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4y
+ cmR0NC5qZmMMAAAAYmdpMnN0YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAM
+ AAAAbmdkdDBybnIueGtzDAAAAGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0
+ NGkub3JrDAAAAHdveTFvZ3N0LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAA
+ AHYxcXRtZzFlLnV0cwwAAAByajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25y
+ LjB0MAwAAAA1am9zZG5oZi5ndmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAx
+ bXZ1eDFzcS55cHEMAAAAZnpiZ2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54
+ NGMMAAAAMXJ4MHFuaXQueW96DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRl
+ aTVxa3oudXZiDAAAAHIxMWlkZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2
+ DAAAAGIwd2tncGFuLm5xawwAAAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhr
+ bzRxLmRhdgwAAABhdzB5cWZwby4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwA
+ AAB4bGdvNHgxdy5odXUMAAAAbzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwz
+ Zy50bXIMAAAAa2p4MGVyb2EucGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAA
+ aGR0dzNsZWouaHdyDAAAAG5zY3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3Mmwu
+ NWZsDAAAAHhoZWd5d3Z6LncxYwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVx
+ ZGRrYmJiLnFnbgwAAAAzZnM0ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4
+ dAwAAABweXZudXJ0ZC4zZGMMAAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRz
+ eTR1cy4yMmQMAAAAamxiMGJ0enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQM
+ AAAAa2c1anNqNXIubG96DAAAAGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21y
+ d3AuNHUzDAAAAHd3MGFzc3l4Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAA
+ AGZ1b2pmcTQwLmZ5dAwAAABtYXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRq
+ LnF4cgwAAABxbnd1dGx6YS5neXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4
+ a2xpamN2ai4zcjEMAAAAc3cxYnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5x
+ bGMMAAAAczFwZ3psaHgueXRwDAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3No
+ cmV0dGYubzAyDAAAAHNyZXZ3eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2Jr
+ DAAAADBpdDFtZnhzLmpxMAwAAABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2Nm
+ ZzNtLnhycwwAAABkd295eWllaC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwA
+ AABqaWRjNW5paC41enEMAAAAMDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2Jj
+ My5wYWsMAAAAd3Nnd3B0d2IubG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAA
+ dHpoNHN2dTIuaHp6DAAAAHBjbXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUu
+ dXZnDAAAAGJuNHN5cWdrLjBjMgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQx
+ ZmNqYmsxLnFseAwAAAAzcmhvM3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0
+ eQwAAABra2lldXZ0NC5zY3gMAAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYz
+ Ympvdi5waTIMAAAAb3NoaWh4ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUM
+ AAAAeGVnNDBib2QudWp3DAAAAHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtz
+ bHIuMjJwDAAAAGZ2dmh3aWs0LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAA
+ AGF3cHczZGpiLjBnZAwAAABwb21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0
+ LjJubQwAAABweWR1bGNpYi56YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5
+ anphNGJrbC5ocWcMAAAAbG5qMmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40
+ d28MAAAAem5iejRoYmQubHozDAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQz
+ emVkaW4uMXYyDAAAAGV5YTUwcnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMx
+ DAAAAHlmendwNHlxLnp5bAwAAAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1
+ c2ljLm1mawwAAABrZWVmcG1nYy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwA
+ AABkNWZ4cXpldS5ua2kMAAAAbTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlv
+ dS56bWUMAAAAaGVxa2R1bHUudHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAA
+ bGN6aTQ1MnAuaWEyDAAAAGEwcmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWku
+ bWd0DAAAADV3b25lcTUyLnJndwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1
+ eXpvNXVlLjNuYwwAAABqNG9nMnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhy
+ eQwAAAA0bzNhY3B0ZC41c3EMAAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRn
+ enA1bi52enUMAAAAZHZycHZ5M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwM
+ AAAAYW1veWtvZGkuNW9nDAAAAG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgw
+ cGouMzF2DAAAADMwcndocHBsLmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAA
+ ADNleGlsbXB2Lmp6aQwAAABsYWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5
+ LmljcgwAAAA1NHBhMnBtdy5yamkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABp
+ ZmxlaTFuMS5idGsMAAAAYmxkd2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5t
+ cjIMAAAAYTRxZG94ZWsuajMxDAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lr
+ ampkMWMuNGd5DAAAADVqM2wxMHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3Fv
+ DAAAAGI1ZjNmcWRpLjB5NQwAAABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxj
+ dmdtLmpnagwAAAAzZmMwZXdibS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwA
+ AABxMnRmYjB2ay5uMmQMAAAAa2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1
+ dy5rcXYMAAAAbWRjcGVld2IuNXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAA
+ eXlhbGJ1Y3MuYW5nDAAAAHAzeHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cu
+ NTU0DAAAAGVydTJsbmowLnN1dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZm
+ eGJidWFkLm5tNQwAAABidmo1eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNy
+ ZwwAAABvZWVrcjJ0eC51aXkMAAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdl
+ bGRrdi56YXEMAAAAamJ4YzB3dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIM
+ AAAAaGhwejQyeHQuZ3F4DAAAADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2Jx
+ dWwudWQyDAAAAG94MDQ1azFvLmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAA
+ AGozcGM1c20wLm1sYwwAAABpc2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2Rv
+ Lm1nYQwAAAB5ZWpnb2d4by55bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2
+ enEzMW94Yi50djMMAAAAeHFzMGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5y
+ cnkMAAAAMDV0Y3h0MmwucXo1DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWEx
+ cnIxZGwudWVlDAAAAHFzdWdueXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6
+ DAAAADUxeW01YmhxLmVybAwAAABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdr
+ Z3lsLm1wdAwAAABkZDV3dGh5aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwA
+ AABocGdudG5qaC56dHIMAAAAeDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJy
+ bC4ybXUMAAAAd2lrdXB4b2ouc2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAA
+ MHB4MWRpY2wucWd3DAAAAHVxYTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8u
+ anZpDAAAAGQ0bDQwbGJxLjUwZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHow
+ YmNsa2R1LmNwawwAAAB3MGpvZ3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3
+ aQwAAABidXp6MmpuMi52MzUMAAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVq
+ MXRydC5rdXgMAAAAYzExcG9lMDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8M
+ AAAANWw1MWswdGsueGRsDAAAAGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZs
+ djQub2lpDAAAAHVzMzMyMDJyLm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAA
+ AGx5ZmNscmh3LnJ0NAwAAABka3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFy
+ LnBzNQwAAABxd2YwM2lxZC5oZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABj
+ djFlMnhvdS4xbngMAAAAbGFsbzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5o
+ a2kMAAAAeTB2MjM1eG4uMG5mDAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMw
+ YmRudjEuNDVjDAAAAGhpM3p5cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNl
+ DAAAAGZhZXEwdTNrLmZndQwAAABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xn
+ b2hkLjVibgwAAAB2YWR0YXNsaC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwA
+ AABmcTJ5bmZiMS5tb3IMAAAAZm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2Zx
+ My5nZWYMAAAAcWNtYmpha2cucGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAA
+ eW1vNXlsengudmt3DAAAAHZ1bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcu
+ dW8zDAAAAG4zMm00aGVkLnRtcgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBj
+ eXBuZGVwLjNrdwwAAABrdWg0NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmli
+ cAwAAABhc2szdXNzcy56YjUMAAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVl
+ aWVmZi5sc3gMAAAAa2pmMG9ubmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEM
+ AAAAajJuamJtZHEuMTRhDAAAAG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUw
+ anAudmVnDAAAADFsM3phZ3F4Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAA
+ ADR3MTJncHAzLmRycwwAAABxMnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtv
+ LjFucAwAAAA0aW54a3YzZC54eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAz
+ bGN1aGZpcS4yYWYMAAAAeGtpNXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5s
+ Z2sMAAAAeHlxZXE1ejMubTRhDAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNj
+ c21uNWkudzFuDAAAAHptNWtpY3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNw
+ DAAAAHlranlrY3F4LnJqMAwAAABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2Vr
+ dTNhLnl3ZAwAAAA0bnAwdGdoNS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwA
+ AAA0azEwdnV6by56d3cMAAAAb3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0
+ di4zY3YMAAAAaGNhMGx3cjMueGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAA
+ YTJqaHRxeWIuczVjDAAAAGtmZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIu
+ dm53DAAAAHZycDBncG1mLnkyYQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4x
+ dnYxdHN1LjFpbAwAAABnZjFiaDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3
+ agwAAABqbmE1em0wYy5hb3gMAAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41
+ cW1ueS5kbDAMAAAAbTNkd3JxMmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMM
+ AAAAMXU1cjFuYXoueWhjDAAAAG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81
+ MmIuZnlwDAAAAGJuNHJ6aXNyLjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAA
+ AGZ6aWpmcGpsLmMwagwAAABnM3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3Nu
+ LmRoagwAAAAyZnZ3eGlsdi5pd2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABu
+ cWZtMWJvZS51ZG4MAAAAdGxhczJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5u
+ M20MAAAAYnNqbDBudmkuaW5oDAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpo
+ M2NmYXguNWZmDAAAAGlnM2x0ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0
+ DAAAAG1mbzF0amV4LjR5bAwAAABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHht
+ MjN4Lmx4cQwAAAB6amlqZGV2cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwA
+ AAB4bGE0NGYxaS5jbmIMAAAANTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNh
+ ZS5vdWYMAAAAZG5qd25lcnYuZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAA
+ MTEyYnFwcWYuaWMzDAAAAGtwNHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2ku
+ ajJ4DAAAAHNudnF3aGkxLml3aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRs
+ c2Fpb2FzLmhzMwwAAAAweGZhdDNxei5vYWkVABWOfRWOfSwV0A8VABUGFQYcGAQxOTk5GAQxMDAw
+ FgAW0A8YBDE5OTkYBDEwMDAAAAADAAAA0A8BBAAAADEwMDAEAAAAMTAwMQQAAAAxMDAyBAAAADEw
+ MDMEAAAAMTAwNAQAAAAxMDA1BAAAADEwMDYEAAAAMTAwNwQAAAAxMDA4BAAAADEwMDkEAAAAMTAx
+ MAQAAAAxMDExBAAAADEwMTIEAAAAMTAxMwQAAAAxMDE0BAAAADEwMTUEAAAAMTAxNgQAAAAxMDE3
+ BAAAADEwMTgEAAAAMTAxOQQAAAAxMDIwBAAAADEwMjEEAAAAMTAyMgQAAAAxMDIzBAAAADEwMjQE
+ AAAAMTAyNQQAAAAxMDI2BAAAADEwMjcEAAAAMTAyOAQAAAAxMDI5BAAAADEwMzAEAAAAMTAzMQQA
+ AAAxMDMyBAAAADEwMzMEAAAAMTAzNAQAAAAxMDM1BAAAADEwMzYEAAAAMTAzNwQAAAAxMDM4BAAA
+ ADEwMzkEAAAAMTA0MAQAAAAxMDQxBAAAADEwNDIEAAAAMTA0MwQAAAAxMDQ0BAAAADEwNDUEAAAA
+ MTA0NgQAAAAxMDQ3BAAAADEwNDgEAAAAMTA0OQQAAAAxMDUwBAAAADEwNTEEAAAAMTA1MgQAAAAx
+ MDUzBAAAADEwNTQEAAAAMTA1NQQAAAAxMDU2BAAAADEwNTcEAAAAMTA1OAQAAAAxMDU5BAAAADEw
+ NjAEAAAAMTA2MQQAAAAxMDYyBAAAADEwNjMEAAAAMTA2NAQAAAAxMDY1BAAAADEwNjYEAAAAMTA2
+ NwQAAAAxMDY4BAAAADEwNjkEAAAAMTA3MAQAAAAxMDcxBAAAADEwNzIEAAAAMTA3MwQAAAAxMDc0
+ BAAAADEwNzUEAAAAMTA3NgQAAAAxMDc3BAAAADEwNzgEAAAAMTA3OQQAAAAxMDgwBAAAADEwODEE
+ AAAAMTA4MgQAAAAxMDgzBAAAADEwODQEAAAAMTA4NQQAAAAxMDg2BAAAADEwODcEAAAAMTA4OAQA
+ AAAxMDg5BAAAADEwOTAEAAAAMTA5MQQAAAAxMDkyBAAAADEwOTMEAAAAMTA5NAQAAAAxMDk1BAAA
+ ADEwOTYEAAAAMTA5NwQAAAAxMDk4BAAAADEwOTkEAAAAMTEwMAQAAAAxMTAxBAAAADExMDIEAAAA
+ MTEwMwQAAAAxMTA0BAAAADExMDUEAAAAMTEwNgQAAAAxMTA3BAAAADExMDgEAAAAMTEwOQQAAAAx
+ MTEwBAAAADExMTEEAAAAMTExMgQAAAAxMTEzBAAAADExMTQEAAAAMTExNQQAAAAxMTE2BAAAADEx
+ MTcEAAAAMTExOAQAAAAxMTE5BAAAADExMjAEAAAAMTEyMQQAAAAxMTIyBAAAADExMjMEAAAAMTEy
+ NAQAAAAxMTI1BAAAADExMjYEAAAAMTEyNwQAAAAxMTI4BAAAADExMjkEAAAAMTEzMAQAAAAxMTMx
+ BAAAADExMzIEAAAAMTEzMwQAAAAxMTM0BAAAADExMzUEAAAAMTEzNgQAAAAxMTM3BAAAADExMzgE
+ AAAAMTEzOQQAAAAxMTQwBAAAADExNDEEAAAAMTE0MgQAAAAxMTQzBAAAADExNDQEAAAAMTE0NQQA
+ AAAxMTQ2BAAAADExNDcEAAAAMTE0OAQAAAAxMTQ5BAAAADExNTAEAAAAMTE1MQQAAAAxMTUyBAAA
+ ADExNTMEAAAAMTE1NAQAAAAxMTU1BAAAADExNTYEAAAAMTE1NwQAAAAxMTU4BAAAADExNTkEAAAA
+ MTE2MAQAAAAxMTYxBAAAADExNjIEAAAAMTE2MwQAAAAxMTY0BAAAADExNjUEAAAAMTE2NgQAAAAx
+ MTY3BAAAADExNjgEAAAAMTE2OQQAAAAxMTcwBAAAADExNzEEAAAAMTE3MgQAAAAxMTczBAAAADEx
+ NzQEAAAAMTE3NQQAAAAxMTc2BAAAADExNzcEAAAAMTE3OAQAAAAxMTc5BAAAADExODAEAAAAMTE4
+ MQQAAAAxMTgyBAAAADExODMEAAAAMTE4NAQAAAAxMTg1BAAAADExODYEAAAAMTE4NwQAAAAxMTg4
+ BAAAADExODkEAAAAMTE5MAQAAAAxMTkxBAAAADExOTIEAAAAMTE5MwQAAAAxMTk0BAAAADExOTUE
+ AAAAMTE5NgQAAAAxMTk3BAAAADExOTgEAAAAMTE5OQQAAAAxMjAwBAAAADEyMDEEAAAAMTIwMgQA
+ AAAxMjAzBAAAADEyMDQEAAAAMTIwNQQAAAAxMjA2BAAAADEyMDcEAAAAMTIwOAQAAAAxMjA5BAAA
+ ADEyMTAEAAAAMTIxMQQAAAAxMjEyBAAAADEyMTMEAAAAMTIxNAQAAAAxMjE1BAAAADEyMTYEAAAA
+ MTIxNwQAAAAxMjE4BAAAADEyMTkEAAAAMTIyMAQAAAAxMjIxBAAAADEyMjIEAAAAMTIyMwQAAAAx
+ MjI0BAAAADEyMjUEAAAAMTIyNgQAAAAxMjI3BAAAADEyMjgEAAAAMTIyOQQAAAAxMjMwBAAAADEy
+ MzEEAAAAMTIzMgQAAAAxMjMzBAAAADEyMzQEAAAAMTIzNQQAAAAxMjM2BAAAADEyMzcEAAAAMTIz
+ OAQAAAAxMjM5BAAAADEyNDAEAAAAMTI0MQQAAAAxMjQyBAAAADEyNDMEAAAAMTI0NAQAAAAxMjQ1
+ BAAAADEyNDYEAAAAMTI0NwQAAAAxMjQ4BAAAADEyNDkEAAAAMTI1MAQAAAAxMjUxBAAAADEyNTIE
+ AAAAMTI1MwQAAAAxMjU0BAAAADEyNTUEAAAAMTI1NgQAAAAxMjU3BAAAADEyNTgEAAAAMTI1OQQA
+ AAAxMjYwBAAAADEyNjEEAAAAMTI2MgQAAAAxMjYzBAAAADEyNjQEAAAAMTI2NQQAAAAxMjY2BAAA
+ ADEyNjcEAAAAMTI2OAQAAAAxMjY5BAAAADEyNzAEAAAAMTI3MQQAAAAxMjcyBAAAADEyNzMEAAAA
+ MTI3NAQAAAAxMjc1BAAAADEyNzYEAAAAMTI3NwQAAAAxMjc4BAAAADEyNzkEAAAAMTI4MAQAAAAx
+ MjgxBAAAADEyODIEAAAAMTI4MwQAAAAxMjg0BAAAADEyODUEAAAAMTI4NgQAAAAxMjg3BAAAADEy
+ ODgEAAAAMTI4OQQAAAAxMjkwBAAAADEyOTEEAAAAMTI5MgQAAAAxMjkzBAAAADEyOTQEAAAAMTI5
+ NQQAAAAxMjk2BAAAADEyOTcEAAAAMTI5OAQAAAAxMjk5BAAAADEzMDAEAAAAMTMwMQQAAAAxMzAy
+ BAAAADEzMDMEAAAAMTMwNAQAAAAxMzA1BAAAADEzMDYEAAAAMTMwNwQAAAAxMzA4BAAAADEzMDkE
+ AAAAMTMxMAQAAAAxMzExBAAAADEzMTIEAAAAMTMxMwQAAAAxMzE0BAAAADEzMTUEAAAAMTMxNgQA
+ AAAxMzE3BAAAADEzMTgEAAAAMTMxOQQAAAAxMzIwBAAAADEzMjEEAAAAMTMyMgQAAAAxMzIzBAAA
+ ADEzMjQEAAAAMTMyNQQAAAAxMzI2BAAAADEzMjcEAAAAMTMyOAQAAAAxMzI5BAAAADEzMzAEAAAA
+ MTMzMQQAAAAxMzMyBAAAADEzMzMEAAAAMTMzNAQAAAAxMzM1BAAAADEzMzYEAAAAMTMzNwQAAAAx
+ MzM4BAAAADEzMzkEAAAAMTM0MAQAAAAxMzQxBAAAADEzNDIEAAAAMTM0MwQAAAAxMzQ0BAAAADEz
+ NDUEAAAAMTM0NgQAAAAxMzQ3BAAAADEzNDgEAAAAMTM0OQQAAAAxMzUwBAAAADEzNTEEAAAAMTM1
+ MgQAAAAxMzUzBAAAADEzNTQEAAAAMTM1NQQAAAAxMzU2BAAAADEzNTcEAAAAMTM1OAQAAAAxMzU5
+ BAAAADEzNjAEAAAAMTM2MQQAAAAxMzYyBAAAADEzNjMEAAAAMTM2NAQAAAAxMzY1BAAAADEzNjYE
+ AAAAMTM2NwQAAAAxMzY4BAAAADEzNjkEAAAAMTM3MAQAAAAxMzcxBAAAADEzNzIEAAAAMTM3MwQA
+ AAAxMzc0BAAAADEzNzUEAAAAMTM3NgQAAAAxMzc3BAAAADEzNzgEAAAAMTM3OQQAAAAxMzgwBAAA
+ ADEzODEEAAAAMTM4MgQAAAAxMzgzBAAAADEzODQEAAAAMTM4NQQAAAAxMzg2BAAAADEzODcEAAAA
+ MTM4OAQAAAAxMzg5BAAAADEzOTAEAAAAMTM5MQQAAAAxMzkyBAAAADEzOTMEAAAAMTM5NAQAAAAx
+ Mzk1BAAAADEzOTYEAAAAMTM5NwQAAAAxMzk4BAAAADEzOTkEAAAAMTQwMAQAAAAxNDAxBAAAADE0
+ MDIEAAAAMTQwMwQAAAAxNDA0BAAAADE0MDUEAAAAMTQwNgQAAAAxNDA3BAAAADE0MDgEAAAAMTQw
+ OQQAAAAxNDEwBAAAADE0MTEEAAAAMTQxMgQAAAAxNDEzBAAAADE0MTQEAAAAMTQxNQQAAAAxNDE2
+ BAAAADE0MTcEAAAAMTQxOAQAAAAxNDE5BAAAADE0MjAEAAAAMTQyMQQAAAAxNDIyBAAAADE0MjME
+ AAAAMTQyNAQAAAAxNDI1BAAAADE0MjYEAAAAMTQyNwQAAAAxNDI4BAAAADE0MjkEAAAAMTQzMAQA
+ AAAxNDMxBAAAADE0MzIEAAAAMTQzMwQAAAAxNDM0BAAAADE0MzUEAAAAMTQzNgQAAAAxNDM3BAAA
+ ADE0MzgEAAAAMTQzOQQAAAAxNDQwBAAAADE0NDEEAAAAMTQ0MgQAAAAxNDQzBAAAADE0NDQEAAAA
+ MTQ0NQQAAAAxNDQ2BAAAADE0NDcEAAAAMTQ0OAQAAAAxNDQ5BAAAADE0NTAEAAAAMTQ1MQQAAAAx
+ NDUyBAAAADE0NTMEAAAAMTQ1NAQAAAAxNDU1BAAAADE0NTYEAAAAMTQ1NwQAAAAxNDU4BAAAADE0
+ NTkEAAAAMTQ2MAQAAAAxNDYxBAAAADE0NjIEAAAAMTQ2MwQAAAAxNDY0BAAAADE0NjUEAAAAMTQ2
+ NgQAAAAxNDY3BAAAADE0NjgEAAAAMTQ2OQQAAAAxNDcwBAAAADE0NzEEAAAAMTQ3MgQAAAAxNDcz
+ BAAAADE0NzQEAAAAMTQ3NQQAAAAxNDc2BAAAADE0NzcEAAAAMTQ3OAQAAAAxNDc5BAAAADE0ODAE
+ AAAAMTQ4MQQAAAAxNDgyBAAAADE0ODMEAAAAMTQ4NAQAAAAxNDg1BAAAADE0ODYEAAAAMTQ4NwQA
+ AAAxNDg4BAAAADE0ODkEAAAAMTQ5MAQAAAAxNDkxBAAAADE0OTIEAAAAMTQ5MwQAAAAxNDk0BAAA
+ ADE0OTUEAAAAMTQ5NgQAAAAxNDk3BAAAADE0OTgEAAAAMTQ5OQQAAAAxNTAwBAAAADE1MDEEAAAA
+ MTUwMgQAAAAxNTAzBAAAADE1MDQEAAAAMTUwNQQAAAAxNTA2BAAAADE1MDcEAAAAMTUwOAQAAAAx
+ NTA5BAAAADE1MTAEAAAAMTUxMQQAAAAxNTEyBAAAADE1MTMEAAAAMTUxNAQAAAAxNTE1BAAAADE1
+ MTYEAAAAMTUxNwQAAAAxNTE4BAAAADE1MTkEAAAAMTUyMAQAAAAxNTIxBAAAADE1MjIEAAAAMTUy
+ MwQAAAAxNTI0BAAAADE1MjUEAAAAMTUyNgQAAAAxNTI3BAAAADE1MjgEAAAAMTUyOQQAAAAxNTMw
+ BAAAADE1MzEEAAAAMTUzMgQAAAAxNTMzBAAAADE1MzQEAAAAMTUzNQQAAAAxNTM2BAAAADE1MzcE
+ AAAAMTUzOAQAAAAxNTM5BAAAADE1NDAEAAAAMTU0MQQAAAAxNTQyBAAAADE1NDMEAAAAMTU0NAQA
+ AAAxNTQ1BAAAADE1NDYEAAAAMTU0NwQAAAAxNTQ4BAAAADE1NDkEAAAAMTU1MAQAAAAxNTUxBAAA
+ ADE1NTIEAAAAMTU1MwQAAAAxNTU0BAAAADE1NTUEAAAAMTU1NgQAAAAxNTU3BAAAADE1NTgEAAAA
+ MTU1OQQAAAAxNTYwBAAAADE1NjEEAAAAMTU2MgQAAAAxNTYzBAAAADE1NjQEAAAAMTU2NQQAAAAx
+ NTY2BAAAADE1NjcEAAAAMTU2OAQAAAAxNTY5BAAAADE1NzAEAAAAMTU3MQQAAAAxNTcyBAAAADE1
+ NzMEAAAAMTU3NAQAAAAxNTc1BAAAADE1NzYEAAAAMTU3NwQAAAAxNTc4BAAAADE1NzkEAAAAMTU4
+ MAQAAAAxNTgxBAAAADE1ODIEAAAAMTU4MwQAAAAxNTg0BAAAADE1ODUEAAAAMTU4NgQAAAAxNTg3
+ BAAAADE1ODgEAAAAMTU4OQQAAAAxNTkwBAAAADE1OTEEAAAAMTU5MgQAAAAxNTkzBAAAADE1OTQE
+ AAAAMTU5NQQAAAAxNTk2BAAAADE1OTcEAAAAMTU5OAQAAAAxNTk5BAAAADE2MDAEAAAAMTYwMQQA
+ AAAxNjAyBAAAADE2MDMEAAAAMTYwNAQAAAAxNjA1BAAAADE2MDYEAAAAMTYwNwQAAAAxNjA4BAAA
+ ADE2MDkEAAAAMTYxMAQAAAAxNjExBAAAADE2MTIEAAAAMTYxMwQAAAAxNjE0BAAAADE2MTUEAAAA
+ MTYxNgQAAAAxNjE3BAAAADE2MTgEAAAAMTYxOQQAAAAxNjIwBAAAADE2MjEEAAAAMTYyMgQAAAAx
+ NjIzBAAAADE2MjQEAAAAMTYyNQQAAAAxNjI2BAAAADE2MjcEAAAAMTYyOAQAAAAxNjI5BAAAADE2
+ MzAEAAAAMTYzMQQAAAAxNjMyBAAAADE2MzMEAAAAMTYzNAQAAAAxNjM1BAAAADE2MzYEAAAAMTYz
+ NwQAAAAxNjM4BAAAADE2MzkEAAAAMTY0MAQAAAAxNjQxBAAAADE2NDIEAAAAMTY0MwQAAAAxNjQ0
+ BAAAADE2NDUEAAAAMTY0NgQAAAAxNjQ3BAAAADE2NDgEAAAAMTY0OQQAAAAxNjUwBAAAADE2NTEE
+ AAAAMTY1MgQAAAAxNjUzBAAAADE2NTQEAAAAMTY1NQQAAAAxNjU2BAAAADE2NTcEAAAAMTY1OAQA
+ AAAxNjU5BAAAADE2NjAEAAAAMTY2MQQAAAAxNjYyBAAAADE2NjMEAAAAMTY2NAQAAAAxNjY1BAAA
+ ADE2NjYEAAAAMTY2NwQAAAAxNjY4BAAAADE2NjkEAAAAMTY3MAQAAAAxNjcxBAAAADE2NzIEAAAA
+ MTY3MwQAAAAxNjc0BAAAADE2NzUEAAAAMTY3NgQAAAAxNjc3BAAAADE2NzgEAAAAMTY3OQQAAAAx
+ NjgwBAAAADE2ODEEAAAAMTY4MgQAAAAxNjgzBAAAADE2ODQEAAAAMTY4NQQAAAAxNjg2BAAAADE2
+ ODcEAAAAMTY4OAQAAAAxNjg5BAAAADE2OTAEAAAAMTY5MQQAAAAxNjkyBAAAADE2OTMEAAAAMTY5
+ NAQAAAAxNjk1BAAAADE2OTYEAAAAMTY5NwQAAAAxNjk4BAAAADE2OTkEAAAAMTcwMAQAAAAxNzAx
+ BAAAADE3MDIEAAAAMTcwMwQAAAAxNzA0BAAAADE3MDUEAAAAMTcwNgQAAAAxNzA3BAAAADE3MDgE
+ AAAAMTcwOQQAAAAxNzEwBAAAADE3MTEEAAAAMTcxMgQAAAAxNzEzBAAAADE3MTQEAAAAMTcxNQQA
+ AAAxNzE2BAAAADE3MTcEAAAAMTcxOAQAAAAxNzE5BAAAADE3MjAEAAAAMTcyMQQAAAAxNzIyBAAA
+ ADE3MjMEAAAAMTcyNAQAAAAxNzI1BAAAADE3MjYEAAAAMTcyNwQAAAAxNzI4BAAAADE3MjkEAAAA
+ MTczMAQAAAAxNzMxBAAAADE3MzIEAAAAMTczMwQAAAAxNzM0BAAAADE3MzUEAAAAMTczNgQAAAAx
+ NzM3BAAAADE3MzgEAAAAMTczOQQAAAAxNzQwBAAAADE3NDEEAAAAMTc0MgQAAAAxNzQzBAAAADE3
+ NDQEAAAAMTc0NQQAAAAxNzQ2BAAAADE3NDcEAAAAMTc0OAQAAAAxNzQ5BAAAADE3NTAEAAAAMTc1
+ MQQAAAAxNzUyBAAAADE3NTMEAAAAMTc1NAQAAAAxNzU1BAAAADE3NTYEAAAAMTc1NwQAAAAxNzU4
+ BAAAADE3NTkEAAAAMTc2MAQAAAAxNzYxBAAAADE3NjIEAAAAMTc2MwQAAAAxNzY0BAAAADE3NjUE
+ AAAAMTc2NgQAAAAxNzY3BAAAADE3NjgEAAAAMTc2OQQAAAAxNzcwBAAAADE3NzEEAAAAMTc3MgQA
+ AAAxNzczBAAAADE3NzQEAAAAMTc3NQQAAAAxNzc2BAAAADE3NzcEAAAAMTc3OAQAAAAxNzc5BAAA
+ ADE3ODAEAAAAMTc4MQQAAAAxNzgyBAAAADE3ODMEAAAAMTc4NAQAAAAxNzg1BAAAADE3ODYEAAAA
+ MTc4NwQAAAAxNzg4BAAAADE3ODkEAAAAMTc5MAQAAAAxNzkxBAAAADE3OTIEAAAAMTc5MwQAAAAx
+ Nzk0BAAAADE3OTUEAAAAMTc5NgQAAAAxNzk3BAAAADE3OTgEAAAAMTc5OQQAAAAxODAwBAAAADE4
+ MDEEAAAAMTgwMgQAAAAxODAzBAAAADE4MDQEAAAAMTgwNQQAAAAxODA2BAAAADE4MDcEAAAAMTgw
+ OAQAAAAxODA5BAAAADE4MTAEAAAAMTgxMQQAAAAxODEyBAAAADE4MTMEAAAAMTgxNAQAAAAxODE1
+ BAAAADE4MTYEAAAAMTgxNwQAAAAxODE4BAAAADE4MTkEAAAAMTgyMAQAAAAxODIxBAAAADE4MjIE
+ AAAAMTgyMwQAAAAxODI0BAAAADE4MjUEAAAAMTgyNgQAAAAxODI3BAAAADE4MjgEAAAAMTgyOQQA
+ AAAxODMwBAAAADE4MzEEAAAAMTgzMgQAAAAxODMzBAAAADE4MzQEAAAAMTgzNQQAAAAxODM2BAAA
+ ADE4MzcEAAAAMTgzOAQAAAAxODM5BAAAADE4NDAEAAAAMTg0MQQAAAAxODQyBAAAADE4NDMEAAAA
+ MTg0NAQAAAAxODQ1BAAAADE4NDYEAAAAMTg0NwQAAAAxODQ4BAAAADE4NDkEAAAAMTg1MAQAAAAx
+ ODUxBAAAADE4NTIEAAAAMTg1MwQAAAAxODU0BAAAADE4NTUEAAAAMTg1NgQAAAAxODU3BAAAADE4
+ NTgEAAAAMTg1OQQAAAAxODYwBAAAADE4NjEEAAAAMTg2MgQAAAAxODYzBAAAADE4NjQEAAAAMTg2
+ NQQAAAAxODY2BAAAADE4NjcEAAAAMTg2OAQAAAAxODY5BAAAADE4NzAEAAAAMTg3MQQAAAAxODcy
+ BAAAADE4NzMEAAAAMTg3NAQAAAAxODc1BAAAADE4NzYEAAAAMTg3NwQAAAAxODc4BAAAADE4NzkE
+ AAAAMTg4MAQAAAAxODgxBAAAADE4ODIEAAAAMTg4MwQAAAAxODg0BAAAADE4ODUEAAAAMTg4NgQA
+ AAAxODg3BAAAADE4ODgEAAAAMTg4OQQAAAAxODkwBAAAADE4OTEEAAAAMTg5MgQAAAAxODkzBAAA
+ ADE4OTQEAAAAMTg5NQQAAAAxODk2BAAAADE4OTcEAAAAMTg5OAQAAAAxODk5BAAAADE5MDAEAAAA
+ MTkwMQQAAAAxOTAyBAAAADE5MDMEAAAAMTkwNAQAAAAxOTA1BAAAADE5MDYEAAAAMTkwNwQAAAAx
+ OTA4BAAAADE5MDkEAAAAMTkxMAQAAAAxOTExBAAAADE5MTIEAAAAMTkxMwQAAAAxOTE0BAAAADE5
+ MTUEAAAAMTkxNgQAAAAxOTE3BAAAADE5MTgEAAAAMTkxOQQAAAAxOTIwBAAAADE5MjEEAAAAMTky
+ MgQAAAAxOTIzBAAAADE5MjQEAAAAMTkyNQQAAAAxOTI2BAAAADE5MjcEAAAAMTkyOAQAAAAxOTI5
+ BAAAADE5MzAEAAAAMTkzMQQAAAAxOTMyBAAAADE5MzMEAAAAMTkzNAQAAAAxOTM1BAAAADE5MzYE
+ AAAAMTkzNwQAAAAxOTM4BAAAADE5MzkEAAAAMTk0MAQAAAAxOTQxBAAAADE5NDIEAAAAMTk0MwQA
+ AAAxOTQ0BAAAADE5NDUEAAAAMTk0NgQAAAAxOTQ3BAAAADE5NDgEAAAAMTk0OQQAAAAxOTUwBAAA
+ ADE5NTEEAAAAMTk1MgQAAAAxOTUzBAAAADE5NTQEAAAAMTk1NQQAAAAxOTU2BAAAADE5NTcEAAAA
+ MTk1OAQAAAAxOTU5BAAAADE5NjAEAAAAMTk2MQQAAAAxOTYyBAAAADE5NjMEAAAAMTk2NAQAAAAx
+ OTY1BAAAADE5NjYEAAAAMTk2NwQAAAAxOTY4BAAAADE5NjkEAAAAMTk3MAQAAAAxOTcxBAAAADE5
+ NzIEAAAAMTk3MwQAAAAxOTc0BAAAADE5NzUEAAAAMTk3NgQAAAAxOTc3BAAAADE5NzgEAAAAMTk3
+ OQQAAAAxOTgwBAAAADE5ODEEAAAAMTk4MgQAAAAxOTgzBAAAADE5ODQEAAAAMTk4NQQAAAAxOTg2
+ BAAAADE5ODcEAAAAMTk4OAQAAAAxOTg5BAAAADE5OTAEAAAAMTk5MQQAAAAxOTkyBAAAADE5OTME
+ AAAAMTk5NAQAAAAxOTk1BAAAADE5OTYEAAAAMTk5NwQAAAAxOTk4BAAAADE5OTkVABWO+gEVjvoB
+ LBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1LjR5
+ YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5maGoMAAAAZG5zdGNwbHYuZWRr
+ DAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJlZXpmdGwubXEzDAAAAGdmdXg0
+ MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2tyDAAAAGV1emQxYjQxLmJxMgwA
+ AAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tmaXNkLnFqNQwAAAB2ZmtpbGsy
+ dS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwAAABhc2hvYXZvMS5vamYMAAAA
+ dWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1cy5wcDIMAAAAa3d3MTFwMmEu
+ ZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAAaTFiYnUyd2IuZGpqDAAAADJ5
+ dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20ubDQzDAAAAGFtcnRlMGxhLjJ0
+ cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5aGRjdnZsLnhieAwAAAB4ZDR3
+ MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtvcgwAAABzNHBtdTI0dC5ia3AM
+ AAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4d3dmNC5jMmsMAAAAMWpwMmls
+ d3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0MAAAAcnhlbnNva3UuamlmDAAA
+ AGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNiYXAubjJ4DAAAADVqd3Yyc2M1
+ LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAAADQzb3N5cjVuLmpzaQwAAAB1
+ NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZyLmlhZwwAAABleHJ0Z2xhMS4x
+ dTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAAByZ3BkYWx2dy5kaXgMAAAANW1p
+ b2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5zdW4MAAAAaHVobGZpdTMubG5q
+ DAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNtejVvNW0ueXVtDAAAAHN5ZGJq
+ cG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRmDAAAAG8zdHB2cmJkLmtncAwA
+ AABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2NpYWd6LmF1ZAwAAABwdWN5bWFl
+ di5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwAAAB3ZHRkcXRnYy5oNXAMAAAA
+ Y2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJpYS40amwMAAAAMmUzeWliNXku
+ b294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAAaXdramt2djQudWcyDAAAAGh4
+ aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEudjUzDAAAAHBzNHZqdHhwLnNj
+ NAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRoNG93YWFiLmh5cAwAAABiejR0
+ M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9jcAwAAAB6c2hjMXAxeC5yY2wM
+ AAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5mZGJveS5mdmEMAAAAdnp6MDJw
+ YWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUMAAAAYW1taWp6bjAuYXMxDAAA
+ AGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBxYWYuNDNzDAAAAHdybXpvaTFu
+ Lm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAAAGRkbjNmaXF0LmR6YwwAAABv
+ dXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBzLmJzYgwAAABmbWZ4cnRsZS5j
+ MXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2Z3l3bmt2Zi5hNHMMAAAAY2lu
+ eG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4xYmsMAAAAYTRzZDU0aW0ueWIz
+ DAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFjNXUzeHouNW5pDAAAAGlxYWYw
+ eHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90DAAAADFvY2FnM2Y1LnBxbQwA
+ AAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3RmamdsLmg0cAwAAAB1M2hyMGFn
+ NC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwAAAB1cjR4YjFtcC56dmUMAAAA
+ MjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZkNC53NGwMAAAAa25sYXRpYWcu
+ eTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAAbGVyeWt1dWUuYnl4DAAAAG9u
+ eDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQucG95DAAAAHkyc2FtZTR4LmZx
+ cwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1zcmt0ejNoLnJuaAwAAAB1YjR1
+ dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZleAwAAAB4aHExcTVrbC5ydDEM
+ AAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJjcHI1ZC5hc24MAAAAMXp5MzB6
+ M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYMAAAAdmhreTVrMGkuYm9pDAAA
+ AG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtlMTUuMzJlDAAAAHdtbXBobjNw
+ LjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAAAGwzbmdsYXQyLjIzeAwAAABy
+ NGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRnLmVvYwwAAAB6MDFjMm55ei55
+ ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABxcjNjbXluNS5vcGUMAAAAbTVj
+ dmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5zZjIMAAAAbWJ3Z2xiNTQuZWRi
+ DAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2VjYm5yankuMXdpDAAAADUydWFs
+ aGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2JwDAAAAGNjNTJhdmh1LnAxZQwA
+ AABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tvaWN0LnZ3YgwAAAB5dHRhaHdi
+ eS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwAAABleGZoeWIzby4ya3oMAAAA
+ NTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRtei4wcDAMAAAAZm9iZXcwbHgu
+ bnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAAaXVsM2d6eGouem9tDAAAAHY0
+ MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAuMjB2DAAAAGhkb3UwbTBpLnlv
+ dwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwycHp1MXBrLnBnbAwAAABjMWhv
+ cXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRsegwAAABkZ2l1ZXlmbS5taXMM
+ AAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXoxdm5kci5uNHAMAAAAdGFwdnB0
+ aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkMAAAAMDIwbG0xMGgud3dlDAAA
+ AGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4dHUubnAxDAAAADNjbGtrdmQy
+ LnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAAAGpvZXJnd3cyLm5mMgwAAAB2
+ MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1LmdmcwwAAAB3M2FrbGVxdS52
+ Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABjcmFmMGYwbC5icWQMAAAAcHBl
+ ZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5pYW8MAAAAbWQ1cXRwbXcub3pt
+ DAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4ZXZsdXIuZjBlDAAAADVoZ3p1
+ c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMxDAAAAHZveHV1b2ZxLm1jcQwA
+ AAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNvaW1uLnZsdgwAAABlMGQ0NGo0
+ ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwAAABheWFtY2RicS5zMHkMAAAA
+ Ynh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdjcS5sMzEMAAAAaG5mbzRwd2Iu
+ cjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAAb3pmNXIza2Eudnh2DAAAAGR6
+ dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXguNGNlDAAAAHVtdDAwcXZyLjJm
+ bwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRkeXp2bnFkLmNtcgwAAABhbXIy
+ ZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFiZQwAAAAwMWVid2p0bi53eXkM
+ AAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6MXN1Yi4wb2YMAAAAa3RsbXh4
+ ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gMAAAAMjFuNWl1bm4ubzFiDAAA
+ AHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2NkcGkucHphDAAAAG53dnRjcWIw
+ LmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAAAHJwbnZuenpyLm40cgwAAABu
+ a3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1LmpkMgwAAAB1a2RsMzAwZC5z
+ b3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABic2tqemJnYy41ajQMAAAANDNk
+ eml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54YmsMAAAAaWloZWVmbWYudnFt
+ DAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0NGVoNDMuZzV4DAAAAGp6cGZt
+ M21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBpDAAAAGxyYzJnNHNrLnJudwwA
+ AAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJuand6LmJ4eQwAAABwdGZieWxj
+ Yy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwAAAByajJyZGhhei5za3QMAAAA
+ Y3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBuby55eTIMAAAAYWh1cHFwMHou
+ d2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAAMGZncXVya3MuY2RhDAAAAHh3
+ MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wuZ2wzDAAAAHlmcnRtamViLnhz
+ cwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZqb3NnMDI0LmswdwwAAABxcGx0
+ cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6LmxkbQwAAABlMHF1dm5qYi5rbGYM
+ AAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2FrZnk0dy4xeWMMAAAAZ3N2bDA1
+ bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEMAAAANG5xMnBvY2YuM2RwDAAA
+ AHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFjNGoud3l0DAAAAG9waWt3aWpo
+ LnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAAAGF5NW5rMTN4LnJmdwwAAABl
+ bDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVlLmU1awwAAABoZGt3NWdnai5h
+ Zm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAyMnlodDV0cy40eHEMAAAAbXpt
+ MGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5mejIMAAAAdGkxM2M1MW8uNXps
+ DAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenpsZ3l4YTUuNHlhDAAAADVjNTI1
+ MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNhDAAAAG55dmVvc3gwLndvcAwA
+ AABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1azEzLmxwZQwAAABzZnFjNXJ3
+ eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwAAAB4MWZodmlrby5wcnoMAAAA
+ czM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1bS5iZXEMAAAAdHZyaDRuM2wu
+ a3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAAbWpscWlrc2wuYml1DAAAAHgz
+ cWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWoudGc1DAAAADUxcTRxa2duLmw1
+ dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1rbTJ0a2h0LnhheQwAAAA0bWJx
+ bjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndqcAwAAABmenlyNXlmbS5wZG8M
+ AAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0em90NC5yaG0MAAAAbjNqcDV2
+ Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwMAAAAcmRvMmxxYnEueXFsDAAA
+ AGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYxbWsucXdkDAAAAGp2bnRvZWY1
+ LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAAAGZ5NGFnMGgzLmR6ZAwAAABx
+ ZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4LmgwawwAAAA0Mm52c2k1dS4y
+ ZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3M3ZweGxyYy4yM3kMAAAAaGFp
+ Y2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5ocmwMAAAAc3k0YnhsdnIuYm14
+ DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3BvY3V3ZHUubjVwDAAAAGt2MHB2
+ dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3DAAAAHdiZ29md3phLmZxZAwA
+ AABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBkc3BhLjUzYgwAAABiaXBiaTVj
+ di5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwAAAB5eWFseW50Mi50bWEMAAAA
+ ZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3diYy5udGcMAAAAMnMya3Bjc2Mu
+ cW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAAd3hmMjVlZHAuaDBzDAAAAGUy
+ d3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcuYTRsDAAAADJncGFua2d4Lnlx
+ egwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRpd3Brb3MzLnp4ZgwAAAAwbmI1
+ Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnltegwAAABzem9yc2tlcS54cjQM
+ AAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRhZG51ci5uc2cMAAAAZDJnNWdk
+ MjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsMAAAAbDBtbXp2bTMuZGd5DAAA
+ AGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20za3MueG5oDAAAAHV6bHdlbGo0
+ LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAAADBha2Roam5rLmF3bAwAAABs
+ bHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJoLnRxcQwAAAAyc2l2YW5iaS5k
+ aHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2b3pnZXJmai5yd3YMAAAAY2py
+ MXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5qNGIMAAAAYWF1dHN2YnYucWRu
+ DAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJpYzF1YWQuMHJsDAAAAGp0YjVz
+ ZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1lDAAAAGR4cG4xa210LmtkbgwA
+ AABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJhejFvLnlqaQwAAAB1a2Z3aTNl
+ Yy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwAAAB5am1xaXlycC5ld2sMAAAA
+ Z3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJwaS5qZHAMAAAANXVsdGpweWQu
+ c3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAAMXdhZ2pyencueXRxDAAAAHlt
+ Y3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEuaGxlDAAAAHN1eG9vanFmLmxu
+ dQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEydTN1cmh5Lm5zeQwAAAAxeTJm
+ bHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJnegwAAABzeXRkd2J2aS5jd3oM
+ AAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1MTF6eC5jY2UMAAAAYnc1aW1p
+ YjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUMAAAAengzbWt0bzQuNXV5DAAA
+ AGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVkaDQudGJqDAAAADUwcmdoYmhi
+ LnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAAADQxYWQxdWFlLmRhdQwAAABk
+ ZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6LnZ6YgwAAABzZDF5cTU1Yy41
+ M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABkam4yZXczMC5lbmIMAAAAc3Uw
+ emdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40cHQMAAAAY2NjeGlicG0ud2Ji
+ DAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0bTJnYXoueXlmDAAAADN4aWJp
+ Y3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUyDAAAAGFmYm1peXU0Lnl6bwwA
+ AAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNtMTJrLmJkdAwAAABzMWVpa3hv
+ dy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwAAAB0ZnMxZmxrMy51ZGwMAAAA
+ ZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVxMi5yNWoMAAAAajBibmhleG8u
+ YWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAAMHRweTNjdnQuaDNiDAAAAHlr
+ MHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQuNGZtDAAAAGxyNDB0amIwLm8y
+ cwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHhtenhibnJnLmY1egwAAAB6bnFx
+ bWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxhagwAAABzNGJ4ejBndy51bTMM
+ AAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHExanlseC55cXkMAAAAMGV5Y3hm
+ d2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMMAAAAaWRmazE0aTUueG5tDAAA
+ AGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJjejIucXhtDAAAAGRoeXRzdXhl
+ LjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAAAHptcGVvbHkzLjR0MwwAAAB6
+ aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1LnpvcwwAAAB4cW5icmkwdC5t
+ bnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABjM3Qzd3IzMy5qY3gMAAAANXhq
+ a2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5lbnoMAAAAMnZseXYyYzUucWp1
+ DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2thY25xdHkuMnptDAAAAHcxdGs0
+ cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRwDAAAAHd1cmcyb2IzLjVjMwwA
+ AAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20zY24xLmNqegwAAABtYWZhdnRk
+ Yi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwAAAAxc3Jha291MS5rMG8MAAAA
+ YWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3by5hdnEMAAAAYTRkMWZleTIu
+ NXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAAaWcxNTFwZngua29tDAAAAHZ6
+ cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIudmZvDAAAAHpxbXB1aTRtLjNq
+ MwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8wazQxcTFtLmwydgwAAAA1Ymp5
+ dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZpNAwAAAA0ZGMzcnNteC4zMHEM
+ AAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhhZXFsMy5zMG4MAAAAZHlweWJ0
+ cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIMAAAAd2Qyc29zcHcuMWVpDAAA
+ ADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRxMWguZHpuDAAAAGpjMmJ4aHRu
+ Lmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAAADMyMjV2cXpoLms0YwwAAABr
+ b2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFyLjEyZgwAAAB5cnBucDJnZy5p
+ NGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABvdmdvaWs1cS54c3MMAAAAaW5x
+ cHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5xb3UMAAAAeXBicndkd3YubWFi
+ DAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1cTNzb3IubGRiDAAAAHFyeXJh
+ MWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhmDAAAAGZ4cTVmZHplLnJ1bwwA
+ AAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlwcmVoLnVueAwAAAB5c2ZocWpq
+ dS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwAAABsNXV2YTNoaC5oNHAMAAAA
+ cDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFhaC5hdW4MAAAAaHdwMDRjZnUu
+ bWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAAcnR3c2prd3MubzF3DAAAADNj
+ eXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUueGF0DAAAADM1ZmNndWpwLjNs
+ dAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBna29pNHZwLmI1dwwAAAAyZHli
+ ZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9yZgwAAAAxeGJxMjBudi5oM2YM
+ AAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0eDFiay53MDAMAAAAbDVmZnhk
+ YnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsMAAAAMWZ0bXhrYzMubGF0DAAA
+ AHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkxc2suMHAzDAAAAGJhbnJ4MWwx
+ LmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAAAHQzM2VjeHI0LmJpaQwAAABp
+ bHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZiLnluZgwAAABvMjJjYmV2bS5j
+ bGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABnM3dnMmJ0aS4yd2MMAAAAMWNv
+ NWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55bW4MAAAAMm95ZWVpajEuMXVs
+ DAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1eGJhZncubHp6DAAAADFwdDEy
+ ZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkzDAAAAGlua2kxbXB3LmhkMgwA
+ AABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1czR0Lnd2bwwAAAB5enVoaGdw
+ NS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwAAABta2JobmJyZS51djUMAAAA
+ eWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVnZC50MXkMAAAAZnZhbXQycWou
+ MWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAAYnpkbGhhMTEuczJyDAAAADVj
+ MWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEuemZtDAAAAG9kdzEwZ3RsLmFx
+ NAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBhY21pcjJnLnBkNAwAAABvbGdo
+ M2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVocAwAAAB0emt1bG5jaS5ndGcM
+ AAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVoYmNlci40d2QMAAAAMnFwcDNu
+ b2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkMAAAAemNlc2JuZW4uM3ZyDAAA
+ ADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9rZGEuM21zDAAAAHc1aGxwYXg1
+ Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAAAHNycjV2a2liLjN0NQwAAAB2
+ cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4LjAybQwAAABnMGgxZ3d5aC4y
+ NDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0c3Ayd3J2My40bzIMAAAAcXE1
+ Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5zMDQMAAAAZmRxdmdmNG8udGxs
+ DAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVpNXl0NGEuNHVhDAAAAHJmNGti
+ ZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6DAAAADFnYWI1dW1kLnN5ZAwA
+ AABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3aDU0LjVnZAwAAAAxYTIyZXBj
+ cS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwAAABqdmZ1MGRwMC4weXUMAAAA
+ Zmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201ei56dmIMAAAAMHd1d2VobW4u
+ bW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAAaG52cHdyMWUuaTRrDAAAAHNt
+ dG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubnguYmIzDAAAAGRvdmh5MXd4Lmhl
+ YgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVpZTF1dmJtLmxkZgwAAABqenBl
+ dXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlxNAwAAABtZXNsNXRldy40dmYM
+ AAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGhoZWEycy5rbG0MAAAAbnJ3cTVt
+ NWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUMAAAAeHkxZG4xMWkucDBsDAAA
+ AGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3bXcuemsxDAAAAGUxMHhwb2Jx
+ LmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAAAHAya3ZhZGNpLmpkYgwAAAB4
+ cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZqLmFlMwwAAAAxbmNmMmEwbC5s
+ MXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABhczNwcHNmdS5xd2IMAAAAdjBp
+ MXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56bGYMAAAAM3RnbzFnZnAuYnIx
+ DAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGphMnowMjEuNTJpDAAAAHBxdHpo
+ cmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBkDAAAAHgxYWxnZGVuLnd0dgwA
+ AABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpyb3p1LmZqaQwAAABtM20xZGIz
+ di5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwAAABjMnJxemk0bC5kdXIMAAAA
+ MjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2NyYy41d2kMAAAAMmhycWdzM28u
+ amkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAAamcxa2J2Y2cuYXR2DAAAADFq
+ cWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8uMGhtDAAAAHR1cnppcTRvLmpi
+ bgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZqemVlanEzLmsydwwAAABmcG01
+ bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5cAwAAABtMXhnb3oyay50Z3IM
+ AAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVsYWtzdC5wdXEMAAAAeWdvNGJ1
+ MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncMAAAAZGI1dm92cGoudXFzDAAA
+ ADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2YxanljZzMuajB2DAAAAGtiZHIwdzR1
+ LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAAADJjMGZ2c2UzLmt2eQwAAABw
+ ZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0LnU1egwAAAAwbDRkbWhxdC40
+ eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABlaTVjZ3BiMi5qdWEMAAAAZTVv
+ dWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54d28MAAAAdGRybWdoenoudGNi
+ DAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVrbG41MHcuNXM0DAAAAHh4NWx6
+ djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6DAAAADUzbXo1d2dvLnVsbQwA
+ AAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3MnlhLmJzawwAAAB6bzAxNW01
+ aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwAAAA1YjAzNXN5ZC4ybGcMAAAA
+ bHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFhdi52ZWwMAAAAcWRvb2t5eHYu
+ cnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAAc3ZqdW1uNXguNW9rDAAAADJ4
+ amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMueDRjDAAAAHl4amRnYnYwLm9s
+ aAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUydG92MmJ6LjVkaAwAAABrYzNx
+ MWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJnYwwAAABlamFydmxmaS41cDUM
+ AAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVraDB6Yy53MGQMAAAAejNwZm5h
+ eHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEMAAAANXB0dDV5MzQuNWhiDAAA
+ AGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBzamwuamQzDAAAADAzbGVnZHRv
+ Lmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAAAGJnaGJoa2VlLnRpcwwAAABy
+ azBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJuLnVwZwwAAABiZzJremkwZS53
+ cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABvYjFwMzUxbi54bWwMAAAAMGh1
+ a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5razAMAAAAd2pwYTFjMnIudmpx
+ DAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdhZGJpd2EuZnN0DAAAAGJ2cmdk
+ M2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wxDAAAAGFyZHBqbDNoLmJvYwwA
+ AAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41cXlzLnpwcwwAAABhNGVjZ3Zi
+ Yi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwAAAA0dHp0ZWRtbC54ZXcMAAAA
+ bXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5xYi5qcGUMAAAAc2g1dmdrM3Au
+ aHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAANWhmZ2NyanYuanJjDAAAAGlm
+ bGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUubHlpDAAAAHJ6aXc1MnViLmM0
+ ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVwdTF3aXN4LnhvaQwAAABoaGd4
+ ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRjMQwAAAB0cHNrdnJyMS5iczAM
+ AAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0ZmZwby50ZjQMAAAAdHM1c2N5
+ c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEMAAAAenZjMTMwZ3UuYjBpDAAA
+ AHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294NGgubWxqDAAAAHMyZ2JjNXBq
+ LnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAAAG1paHd2NWxhLmFmZwwAAABk
+ dGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBsLjFhaAwAAABzYmhia3Zhcy5q
+ Mm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABrZ2dwZzVzZS5nYWgMAAAAbTRj
+ aTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41YTAMAAAAc2Zka2VsbW0ub3Ry
+ DAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hhb2FhbzUuZjJ4DAAAAG40c3Jk
+ Zmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBzDAAAAGFkMGQ1dHJoLm0xdgwA
+ AAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2YnduMjAxLnIzNQwAAABveW5xaHd2
+ YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwAAABnY2FvZG1iYS56M3MMAAAA
+ andxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEwdS5peW0MAAAAM212NGw0NTEu
+ aGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAAdTNmZjVkdmIuZHozDAAAADVw
+ NWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24udjBhDAAAAGx3eW40d29jLmQy
+ ZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBheHpqbTRwLjJycQwAAABibXR1
+ eTBsaS4yZ2UVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpz
+ FgAW0A8YDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5m
+ aGoMAAAAZG5zdGNwbHYuZWRrDAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJl
+ ZXpmdGwubXEzDAAAAGdmdXg0MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2ty
+ DAAAAGV1emQxYjQxLmJxMgwAAAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tm
+ aXNkLnFqNQwAAAB2ZmtpbGsydS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwA
+ AABhc2hvYXZvMS5vamYMAAAAdWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1
+ cy5wcDIMAAAAa3d3MTFwMmEuZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAA
+ aTFiYnUyd2IuZGpqDAAAADJ5dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20u
+ bDQzDAAAAGFtcnRlMGxhLjJ0cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5
+ aGRjdnZsLnhieAwAAAB4ZDR3MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtv
+ cgwAAABzNHBtdTI0dC5ia3AMAAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4
+ d3dmNC5jMmsMAAAAMWpwMmlsd3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0M
+ AAAAcnhlbnNva3UuamlmDAAAAGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNi
+ YXAubjJ4DAAAADVqd3Yyc2M1LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAA
+ ADQzb3N5cjVuLmpzaQwAAAB1NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZy
+ LmlhZwwAAABleHJ0Z2xhMS4xdTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAABy
+ Z3BkYWx2dy5kaXgMAAAANW1pb2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5z
+ dW4MAAAAaHVobGZpdTMubG5qDAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNt
+ ejVvNW0ueXVtDAAAAHN5ZGJqcG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRm
+ DAAAAG8zdHB2cmJkLmtncAwAAABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2Np
+ YWd6LmF1ZAwAAABwdWN5bWFldi5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwA
+ AAB3ZHRkcXRnYy5oNXAMAAAAY2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJp
+ YS40amwMAAAAMmUzeWliNXkub294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAA
+ aXdramt2djQudWcyDAAAAGh4aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEu
+ djUzDAAAAHBzNHZqdHhwLnNjNAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRo
+ NG93YWFiLmh5cAwAAABiejR0M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9j
+ cAwAAAB6c2hjMXAxeC5yY2wMAAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5m
+ ZGJveS5mdmEMAAAAdnp6MDJwYWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUM
+ AAAAYW1taWp6bjAuYXMxDAAAAGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBx
+ YWYuNDNzDAAAAHdybXpvaTFuLm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAA
+ AGRkbjNmaXF0LmR6YwwAAABvdXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBz
+ LmJzYgwAAABmbWZ4cnRsZS5jMXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2
+ Z3l3bmt2Zi5hNHMMAAAAY2lueG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4x
+ YmsMAAAAYTRzZDU0aW0ueWIzDAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFj
+ NXUzeHouNW5pDAAAAGlxYWYweHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90
+ DAAAADFvY2FnM2Y1LnBxbQwAAAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3Rm
+ amdsLmg0cAwAAAB1M2hyMGFnNC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwA
+ AAB1cjR4YjFtcC56dmUMAAAAMjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZk
+ NC53NGwMAAAAa25sYXRpYWcueTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAA
+ bGVyeWt1dWUuYnl4DAAAAG9ueDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQu
+ cG95DAAAAHkyc2FtZTR4LmZxcwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1z
+ cmt0ejNoLnJuaAwAAAB1YjR1dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZl
+ eAwAAAB4aHExcTVrbC5ydDEMAAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJj
+ cHI1ZC5hc24MAAAAMXp5MzB6M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYM
+ AAAAdmhreTVrMGkuYm9pDAAAAG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtl
+ MTUuMzJlDAAAAHdtbXBobjNwLjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAA
+ AGwzbmdsYXQyLjIzeAwAAAByNGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRn
+ LmVvYwwAAAB6MDFjMm55ei55ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABx
+ cjNjbXluNS5vcGUMAAAAbTVjdmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5z
+ ZjIMAAAAbWJ3Z2xiNTQuZWRiDAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2Vj
+ Ym5yankuMXdpDAAAADUydWFsaGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2Jw
+ DAAAAGNjNTJhdmh1LnAxZQwAAABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tv
+ aWN0LnZ3YgwAAAB5dHRhaHdieS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwA
+ AABleGZoeWIzby4ya3oMAAAANTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRt
+ ei4wcDAMAAAAZm9iZXcwbHgubnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAA
+ aXVsM2d6eGouem9tDAAAAHY0MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAu
+ MjB2DAAAAGhkb3UwbTBpLnlvdwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwy
+ cHp1MXBrLnBnbAwAAABjMWhvcXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRs
+ egwAAABkZ2l1ZXlmbS5taXMMAAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXox
+ dm5kci5uNHAMAAAAdGFwdnB0aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkM
+ AAAAMDIwbG0xMGgud3dlDAAAAGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4
+ dHUubnAxDAAAADNjbGtrdmQyLnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAA
+ AGpvZXJnd3cyLm5mMgwAAAB2MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1
+ LmdmcwwAAAB3M2FrbGVxdS52Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABj
+ cmFmMGYwbC5icWQMAAAAcHBlZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5p
+ YW8MAAAAbWQ1cXRwbXcub3ptDAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4
+ ZXZsdXIuZjBlDAAAADVoZ3p1c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMx
+ DAAAAHZveHV1b2ZxLm1jcQwAAAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNv
+ aW1uLnZsdgwAAABlMGQ0NGo0ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwA
+ AABheWFtY2RicS5zMHkMAAAAYnh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdj
+ cS5sMzEMAAAAaG5mbzRwd2IucjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAA
+ b3pmNXIza2Eudnh2DAAAAGR6dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXgu
+ NGNlDAAAAHVtdDAwcXZyLjJmbwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRk
+ eXp2bnFkLmNtcgwAAABhbXIyZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFi
+ ZQwAAAAwMWVid2p0bi53eXkMAAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6
+ MXN1Yi4wb2YMAAAAa3RsbXh4ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gM
+ AAAAMjFuNWl1bm4ubzFiDAAAAHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2Nk
+ cGkucHphDAAAAG53dnRjcWIwLmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAA
+ AHJwbnZuenpyLm40cgwAAABua3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1
+ LmpkMgwAAAB1a2RsMzAwZC5zb3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABi
+ c2tqemJnYy41ajQMAAAANDNkeml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54
+ YmsMAAAAaWloZWVmbWYudnFtDAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0
+ NGVoNDMuZzV4DAAAAGp6cGZtM21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBp
+ DAAAAGxyYzJnNHNrLnJudwwAAAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJu
+ and6LmJ4eQwAAABwdGZieWxjYy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwA
+ AAByajJyZGhhei5za3QMAAAAY3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBu
+ by55eTIMAAAAYWh1cHFwMHoud2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAA
+ MGZncXVya3MuY2RhDAAAAHh3MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wu
+ Z2wzDAAAAHlmcnRtamViLnhzcwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZq
+ b3NnMDI0LmswdwwAAABxcGx0cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6Lmxk
+ bQwAAABlMHF1dm5qYi5rbGYMAAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2Fr
+ Znk0dy4xeWMMAAAAZ3N2bDA1bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEM
+ AAAANG5xMnBvY2YuM2RwDAAAAHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFj
+ NGoud3l0DAAAAG9waWt3aWpoLnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAA
+ AGF5NW5rMTN4LnJmdwwAAABlbDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVl
+ LmU1awwAAABoZGt3NWdnai5hZm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAy
+ MnlodDV0cy40eHEMAAAAbXptMGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5m
+ ejIMAAAAdGkxM2M1MW8uNXpsDAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenps
+ Z3l4YTUuNHlhDAAAADVjNTI1MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNh
+ DAAAAG55dmVvc3gwLndvcAwAAABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1
+ azEzLmxwZQwAAABzZnFjNXJ3eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwA
+ AAB4MWZodmlrby5wcnoMAAAAczM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1
+ bS5iZXEMAAAAdHZyaDRuM2wua3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAA
+ bWpscWlrc2wuYml1DAAAAHgzcWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWou
+ dGc1DAAAADUxcTRxa2duLmw1dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1r
+ bTJ0a2h0LnhheQwAAAA0bWJxbjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndq
+ cAwAAABmenlyNXlmbS5wZG8MAAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0
+ em90NC5yaG0MAAAAbjNqcDV2Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwM
+ AAAAcmRvMmxxYnEueXFsDAAAAGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYx
+ bWsucXdkDAAAAGp2bnRvZWY1LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAA
+ AGZ5NGFnMGgzLmR6ZAwAAABxZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4
+ LmgwawwAAAA0Mm52c2k1dS4yZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3
+ M3ZweGxyYy4yM3kMAAAAaGFpY2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5o
+ cmwMAAAAc3k0YnhsdnIuYm14DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3Bv
+ Y3V3ZHUubjVwDAAAAGt2MHB2dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3
+ DAAAAHdiZ29md3phLmZxZAwAAABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBk
+ c3BhLjUzYgwAAABiaXBiaTVjdi5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwA
+ AAB5eWFseW50Mi50bWEMAAAAZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3di
+ Yy5udGcMAAAAMnMya3Bjc2MucW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAA
+ d3hmMjVlZHAuaDBzDAAAAGUyd3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcu
+ YTRsDAAAADJncGFua2d4LnlxegwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRp
+ d3Brb3MzLnp4ZgwAAAAwbmI1Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnlt
+ egwAAABzem9yc2tlcS54cjQMAAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRh
+ ZG51ci5uc2cMAAAAZDJnNWdkMjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsM
+ AAAAbDBtbXp2bTMuZGd5DAAAAGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20z
+ a3MueG5oDAAAAHV6bHdlbGo0LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAA
+ ADBha2Roam5rLmF3bAwAAABsbHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJo
+ LnRxcQwAAAAyc2l2YW5iaS5kaHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2
+ b3pnZXJmai5yd3YMAAAAY2pyMXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5q
+ NGIMAAAAYWF1dHN2YnYucWRuDAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJp
+ YzF1YWQuMHJsDAAAAGp0YjVzZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1l
+ DAAAAGR4cG4xa210LmtkbgwAAABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJh
+ ejFvLnlqaQwAAAB1a2Z3aTNlYy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwA
+ AAB5am1xaXlycC5ld2sMAAAAZ3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJw
+ aS5qZHAMAAAANXVsdGpweWQuc3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAA
+ MXdhZ2pyencueXRxDAAAAHltY3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEu
+ aGxlDAAAAHN1eG9vanFmLmxudQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEy
+ dTN1cmh5Lm5zeQwAAAAxeTJmbHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJn
+ egwAAABzeXRkd2J2aS5jd3oMAAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1
+ MTF6eC5jY2UMAAAAYnc1aW1pYjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUM
+ AAAAengzbWt0bzQuNXV5DAAAAGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVk
+ aDQudGJqDAAAADUwcmdoYmhiLnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAA
+ ADQxYWQxdWFlLmRhdQwAAABkZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6
+ LnZ6YgwAAABzZDF5cTU1Yy41M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABk
+ am4yZXczMC5lbmIMAAAAc3UwemdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40
+ cHQMAAAAY2NjeGlicG0ud2JiDAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0
+ bTJnYXoueXlmDAAAADN4aWJpY3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUy
+ DAAAAGFmYm1peXU0Lnl6bwwAAAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNt
+ MTJrLmJkdAwAAABzMWVpa3hvdy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwA
+ AAB0ZnMxZmxrMy51ZGwMAAAAZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVx
+ Mi5yNWoMAAAAajBibmhleG8uYWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAA
+ MHRweTNjdnQuaDNiDAAAAHlrMHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQu
+ NGZtDAAAAGxyNDB0amIwLm8ycwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHht
+ enhibnJnLmY1egwAAAB6bnFxbWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxh
+ agwAAABzNGJ4ejBndy51bTMMAAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHEx
+ anlseC55cXkMAAAAMGV5Y3hmd2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMM
+ AAAAaWRmazE0aTUueG5tDAAAAGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJj
+ ejIucXhtDAAAAGRoeXRzdXhlLjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAA
+ AHptcGVvbHkzLjR0MwwAAAB6aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1
+ LnpvcwwAAAB4cW5icmkwdC5tbnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABj
+ M3Qzd3IzMy5qY3gMAAAANXhqa2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5l
+ bnoMAAAAMnZseXYyYzUucWp1DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2th
+ Y25xdHkuMnptDAAAAHcxdGs0cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRw
+ DAAAAHd1cmcyb2IzLjVjMwwAAAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20z
+ Y24xLmNqegwAAABtYWZhdnRkYi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwA
+ AAAxc3Jha291MS5rMG8MAAAAYWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3
+ by5hdnEMAAAAYTRkMWZleTIuNXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAA
+ aWcxNTFwZngua29tDAAAAHZ6cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIu
+ dmZvDAAAAHpxbXB1aTRtLjNqMwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8w
+ azQxcTFtLmwydgwAAAA1Ymp5dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZp
+ NAwAAAA0ZGMzcnNteC4zMHEMAAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhh
+ ZXFsMy5zMG4MAAAAZHlweWJ0cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIM
+ AAAAd2Qyc29zcHcuMWVpDAAAADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRx
+ MWguZHpuDAAAAGpjMmJ4aHRuLmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAA
+ ADMyMjV2cXpoLms0YwwAAABrb2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFy
+ LjEyZgwAAAB5cnBucDJnZy5pNGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABv
+ dmdvaWs1cS54c3MMAAAAaW5xcHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5x
+ b3UMAAAAeXBicndkd3YubWFiDAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1
+ cTNzb3IubGRiDAAAAHFyeXJhMWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhm
+ DAAAAGZ4cTVmZHplLnJ1bwwAAAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlw
+ cmVoLnVueAwAAAB5c2ZocWpqdS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwA
+ AABsNXV2YTNoaC5oNHAMAAAAcDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFh
+ aC5hdW4MAAAAaHdwMDRjZnUubWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAA
+ cnR3c2prd3MubzF3DAAAADNjeXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUu
+ eGF0DAAAADM1ZmNndWpwLjNsdAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBn
+ a29pNHZwLmI1dwwAAAAyZHliZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9y
+ ZgwAAAAxeGJxMjBudi5oM2YMAAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0
+ eDFiay53MDAMAAAAbDVmZnhkYnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsM
+ AAAAMWZ0bXhrYzMubGF0DAAAAHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkx
+ c2suMHAzDAAAAGJhbnJ4MWwxLmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAA
+ AHQzM2VjeHI0LmJpaQwAAABpbHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZi
+ LnluZgwAAABvMjJjYmV2bS5jbGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABn
+ M3dnMmJ0aS4yd2MMAAAAMWNvNWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55
+ bW4MAAAAMm95ZWVpajEuMXVsDAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1
+ eGJhZncubHp6DAAAADFwdDEyZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkz
+ DAAAAGlua2kxbXB3LmhkMgwAAABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1
+ czR0Lnd2bwwAAAB5enVoaGdwNS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwA
+ AABta2JobmJyZS51djUMAAAAeWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVn
+ ZC50MXkMAAAAZnZhbXQycWouMWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAA
+ YnpkbGhhMTEuczJyDAAAADVjMWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEu
+ emZtDAAAAG9kdzEwZ3RsLmFxNAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBh
+ Y21pcjJnLnBkNAwAAABvbGdoM2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVo
+ cAwAAAB0emt1bG5jaS5ndGcMAAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVo
+ YmNlci40d2QMAAAAMnFwcDNub2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkM
+ AAAAemNlc2JuZW4uM3ZyDAAAADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9r
+ ZGEuM21zDAAAAHc1aGxwYXg1Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAA
+ AHNycjV2a2liLjN0NQwAAAB2cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4
+ LjAybQwAAABnMGgxZ3d5aC4yNDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0
+ c3Ayd3J2My40bzIMAAAAcXE1Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5z
+ MDQMAAAAZmRxdmdmNG8udGxsDAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVp
+ NXl0NGEuNHVhDAAAAHJmNGtiZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6
+ DAAAADFnYWI1dW1kLnN5ZAwAAABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3
+ aDU0LjVnZAwAAAAxYTIyZXBjcS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwA
+ AABqdmZ1MGRwMC4weXUMAAAAZmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201
+ ei56dmIMAAAAMHd1d2VobW4ubW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAA
+ aG52cHdyMWUuaTRrDAAAAHNtdG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubngu
+ YmIzDAAAAGRvdmh5MXd4LmhlYgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVp
+ ZTF1dmJtLmxkZgwAAABqenBldXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlx
+ NAwAAABtZXNsNXRldy40dmYMAAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGho
+ ZWEycy5rbG0MAAAAbnJ3cTVtNWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUM
+ AAAAeHkxZG4xMWkucDBsDAAAAGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3
+ bXcuemsxDAAAAGUxMHhwb2JxLmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAA
+ AHAya3ZhZGNpLmpkYgwAAAB4cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZq
+ LmFlMwwAAAAxbmNmMmEwbC5sMXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABh
+ czNwcHNmdS5xd2IMAAAAdjBpMXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56
+ bGYMAAAAM3RnbzFnZnAuYnIxDAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGph
+ MnowMjEuNTJpDAAAAHBxdHpocmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBk
+ DAAAAHgxYWxnZGVuLnd0dgwAAABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpy
+ b3p1LmZqaQwAAABtM20xZGIzdi5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwA
+ AABjMnJxemk0bC5kdXIMAAAAMjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2Ny
+ Yy41d2kMAAAAMmhycWdzM28uamkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAA
+ amcxa2J2Y2cuYXR2DAAAADFqcWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8u
+ MGhtDAAAAHR1cnppcTRvLmpibgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZq
+ emVlanEzLmsydwwAAABmcG01bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5
+ cAwAAABtMXhnb3oyay50Z3IMAAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVs
+ YWtzdC5wdXEMAAAAeWdvNGJ1MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncM
+ AAAAZGI1dm92cGoudXFzDAAAADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2Yxanlj
+ ZzMuajB2DAAAAGtiZHIwdzR1LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAA
+ ADJjMGZ2c2UzLmt2eQwAAABwZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0
+ LnU1egwAAAAwbDRkbWhxdC40eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABl
+ aTVjZ3BiMi5qdWEMAAAAZTVvdWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54
+ d28MAAAAdGRybWdoenoudGNiDAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVr
+ bG41MHcuNXM0DAAAAHh4NWx6djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6
+ DAAAADUzbXo1d2dvLnVsbQwAAAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3
+ MnlhLmJzawwAAAB6bzAxNW01aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwA
+ AAA1YjAzNXN5ZC4ybGcMAAAAbHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFh
+ di52ZWwMAAAAcWRvb2t5eHYucnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAA
+ c3ZqdW1uNXguNW9rDAAAADJ4amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMu
+ eDRjDAAAAHl4amRnYnYwLm9saAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUy
+ dG92MmJ6LjVkaAwAAABrYzNxMWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJn
+ YwwAAABlamFydmxmaS41cDUMAAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVr
+ aDB6Yy53MGQMAAAAejNwZm5heHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEM
+ AAAANXB0dDV5MzQuNWhiDAAAAGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBz
+ amwuamQzDAAAADAzbGVnZHRvLmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAA
+ AGJnaGJoa2VlLnRpcwwAAAByazBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJu
+ LnVwZwwAAABiZzJremkwZS53cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABv
+ YjFwMzUxbi54bWwMAAAAMGh1a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5r
+ azAMAAAAd2pwYTFjMnIudmpxDAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdh
+ ZGJpd2EuZnN0DAAAAGJ2cmdkM2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wx
+ DAAAAGFyZHBqbDNoLmJvYwwAAAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41
+ cXlzLnpwcwwAAABhNGVjZ3ZiYi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwA
+ AAA0dHp0ZWRtbC54ZXcMAAAAbXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5x
+ Yi5qcGUMAAAAc2g1dmdrM3AuaHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAA
+ NWhmZ2NyanYuanJjDAAAAGlmbGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUu
+ bHlpDAAAAHJ6aXc1MnViLmM0ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVw
+ dTF3aXN4LnhvaQwAAABoaGd4ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRj
+ MQwAAAB0cHNrdnJyMS5iczAMAAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0
+ ZmZwby50ZjQMAAAAdHM1c2N5c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEM
+ AAAAenZjMTMwZ3UuYjBpDAAAAHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294
+ NGgubWxqDAAAAHMyZ2JjNXBqLnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAA
+ AG1paHd2NWxhLmFmZwwAAABkdGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBs
+ LjFhaAwAAABzYmhia3Zhcy5qMm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABr
+ Z2dwZzVzZS5nYWgMAAAAbTRjaTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41
+ YTAMAAAAc2Zka2VsbW0ub3RyDAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hh
+ b2FhbzUuZjJ4DAAAAG40c3JkZmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBz
+ DAAAAGFkMGQ1dHJoLm0xdgwAAAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2Yndu
+ MjAxLnIzNQwAAABveW5xaHd2YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwA
+ AABnY2FvZG1iYS56M3MMAAAAandxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEw
+ dS5peW0MAAAAM212NGw0NTEuaGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAA
+ dTNmZjVkdmIuZHozDAAAADVwNWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24u
+ djBhDAAAAGx3eW40d29jLmQyZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBh
+ eHpqbTRwLjJycQwAAABibXR1eTBsaS4yZ2UVAhlMSBVwYXJxdWV0LWRvdG5ldC1zY2hlbWEVBgAV
+ DCUCGAJpZCUAABUMJQIYB3N0cmluZzElAAAVDCUCGAdzdHJpbmcyJQAAFqAfGSwZPCYIHBUMGTUG
+ CAAZGAJpZBUAFtAPFrhsFrhsJgg8GAM5OTkYATAWABbQDxgDOTk5GAEwAAAAJsBsHBUMGTUGCAAZ
+ GAdzdHJpbmcxFQAW0A8WuPsBFrj7ASbAbDwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW
+ 0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAJvjnAhwVDBk1BggAGRgHc3RyaW5nMhUA
+ FtAPFrj7ARa4+wEm+OcCPBgMenpxMGtmeTQudmJuGAwwMXd3eWU0Zy5wZnMWABbQDxgMenpxMGtm
+ eTQudmJuGAwwMXd3eWU0Zy5wZnMAAAAWqOMEFtAPABk8JrDjBBwVDBk1BggAGRgCaWQVABbQDxb0
+ fRb0fSaw4wQ8GAQxOTk5GAQxMDAwFgAW0A8YBDE5OTkYBDEwMDAAAAAmpOEFHBUMGTUGCAAZGAdz
+ dHJpbmcxFQAW0A8WuPsBFrj7ASak4QU8GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cxYAFtAP
+ GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cwAAACbc3AccFQwZNQYIABkYB3N0cmluZzIVABbQ
+ Dxa4+wEWuPsBJtzcBzwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1
+ LjR5YRgMMDExY3FhbjQueXpzAAAAFuT0BBbQDwAoTFBhcnF1ZXQuTmV0IHZlcnNpb24gMy41LjMg
+ KGJ1aWxkICcwNTc0NTFiMzc2ZmE3ZDM1ODFmMmQxODAxZmIwOTY1YWZiZWFhMGMyJykAxQIAAFBB
+ UjE=
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '80087'
+ Content-Type:
+ - application/octet-stream
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-blob-type:
+ - BlockBlob
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:03:15 GMT
+ x-ms-encryption-algorithm:
+ - AES256
+ x-ms-version:
+ - '2020-08-04'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/utqqcontainerb38317df/csvfileb38317df
+ response:
+ body:
+ string: ''
+ headers:
+ content-md5:
+ - z1EKaBGYeFFPXcMBK90K+w==
+ date:
+ - Fri, 09 Apr 2021 04:03:14 GMT
+ etag:
+ - '"0x8D8FB0C66E66383"'
+ last-modified:
+ - Fri, 09 Apr 2021 04:03:15 GMT
+ server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding:
+ - chunked
+ x-ms-content-crc64:
+ - f7IDcRFZujI=
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-08-04'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: '
+
+ SQLselect * from blobstorage
+ where id < 1;parquet
+ '
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '293'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:03:15 GMT
+ x-ms-encryption-algorithm:
+ - AES256
+ x-ms-version:
+ - '2020-08-04'
+ method: POST
+ uri: https://storagename.blob.core.windows.net/utqqcontainerb38317df/csvfileb38317df?comp=query
+ response:
+ body:
+ string: !!binary |
+ T2JqAQIWYXZyby5zY2hlbWHOHlsKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAgIm5hbWUi
+ OiAiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLnJlc3VsdERh
+ dGEiLAogICAgImRvYyI6ICJIb2xkcyByZXN1bHQgZGF0YSBpbiB0aGUgZm9ybWF0IHNwZWNpZmll
+ ZCBmb3IgdGhpcyBxdWVyeSAoQ1NWLCBKU09OLCBldGMuKS4iLAogICAgImZpZWxkcyI6IFsKICAg
+ ICAgewogICAgICAgICJuYW1lIjogImRhdGEiLAogICAgICAgICJ0eXBlIjogImJ5dGVzIgogICAg
+ ICB9CiAgICBdCiAgfSwKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAgIm5hbWUiOiAiY29t
+ Lm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVycm9yIiwKICAgICJk
+ b2MiOiAiQW4gZXJyb3IgdGhhdCBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBxdWVyeS4i
+ LAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImZhdGFsIiwKICAgICAg
+ ICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAiZG9jIjogIklmIHRydWUsIHRoaXMgZXJyb3Ig
+ cHJldmVudHMgZnVydGhlciBxdWVyeSBwcm9jZXNzaW5nLiAgTW9yZSByZXN1bHQgZGF0YSBtYXkg
+ YmUgcmV0dXJuZWQsIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgb2YgdGhlIG9y
+ aWdpbmFsIGRhdGEgd2lsbCBiZSBwcm9jZXNzZWQuICBJZiBmYWxzZSwgdGhpcyBlcnJvciBkb2Vz
+ IG5vdCBwcmV2ZW50IGZ1cnRoZXIgcXVlcnkgcHJvY2Vzc2luZy4iCiAgICAgIH0sCiAgICAgIHsK
+ ICAgICAgICAibmFtZSI6ICJuYW1lIiwKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAg
+ ICJkb2MiOiAiVGhlIG5hbWUgb2YgdGhlIGVycm9yIgogICAgICB9LAogICAgICB7CiAgICAgICAg
+ Im5hbWUiOiAiZGVzY3JpcHRpb24iLAogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAg
+ ImRvYyI6ICJBIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvciIKICAgICAgfSwKICAgICAgewogICAg
+ ICAgICJuYW1lIjogInBvc2l0aW9uIiwKICAgICAgICAidHlwZSI6ICJsb25nIiwKICAgICAgICAi
+ ZG9jIjogIlRoZSByZWNvcmQgb2Zmc2V0IGluIHRoZSBibG9iIGF0IHdoaWNoIHRoZSBlcnJvciBv
+ Y2N1cnJlZCIKICAgICAgfQogICAgXQogIH0sCiAgewogICAgInR5cGUiOiAicmVjb3JkIiwKICAg
+ ICJuYW1lIjogImNvbS5taWNyb3NvZnQuYXp1cmUuc3RvcmFnZS5xdWVyeUJsb2JDb250ZW50cy5w
+ cm9ncmVzcyIsCiAgICAiZG9jIjogIkluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiB0
+ aGUgcXVlcnkiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImJ5dGVz
+ U2Nhbm5lZCIsCiAgICAgICAgInR5cGUiOiAibG9uZyIsCiAgICAgICAgImRvYyI6ICJUaGUgbnVt
+ YmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHNjYW5uZWQiCiAgICAgIH0sCiAgICAgIHsKICAg
+ ICAgICAibmFtZSI6ICJ0b3RhbEJ5dGVzIiwKICAgICAgICAidHlwZSI6ICJsb25nIiwKICAgICAg
+ ICAiZG9jIjogIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgc2Nhbm5lZCBpbiB0aGlz
+ IHF1ZXJ5IgogICAgICB9CiAgICBdCiAgfSwKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAg
+ Im5hbWUiOiAiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVu
+ ZCIsCiAgICAiZG9jIjogIlNlbnQgYXMgdGhlIGZpbmFsIG1lc3NhZ2Ugb2YgdGhlIHJlc3BvbnNl
+ LCBpbmRpY2F0aW5nIHRoYXQgYWxsIHJlc3VsdHMgaGF2ZSBiZWVuIHNlbnQuIiwKICAgICJmaWVs
+ ZHMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJ0b3RhbEJ5dGVzIiwKICAgICAgICAidHlw
+ ZSI6ICJsb25nIiwKICAgICAgICAiZG9jIjogIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgc2Nh
+ bm5lZCBpbiB0aGlzIHF1ZXJ5IgogICAgICB9CiAgICBdCiAgfQpdCgBeCQoEJjNiRJDCzm420C7q
+ AjwAODAsbWRpZmp0NTUuZWEzLG1kaWZqdDU1LmVhMwpeCQoEJjNiRJDCzm420C7qAg4Ewu4EruMJ
+ XgkKBCYzYkSQws5uNtAu6gIIBq7jCV4JCgQmM2JEkMLObjbQLuo=
+ headers:
+ accept-ranges:
+ - bytes
+ content-type:
+ - avro/binary
+ date:
+ - Fri, 09 Apr 2021 04:03:15 GMT
+ etag:
+ - '"0x8D8FB0C66E66383"'
+ last-modified:
+ - Fri, 09 Apr 2021 04:03:15 GMT
+ server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding:
+ - chunked
+ x-ms-blob-type:
+ - BlockBlob
+ x-ms-creation-time:
+ - Fri, 09 Apr 2021 04:03:15 GMT
+ x-ms-lease-state:
+ - available
+ x-ms-lease-status:
+ - unlocked
+ x-ms-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-08-04'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml
new file mode 100644
index 000000000000..2899b4154d62
--- /dev/null
+++ b/sdk/storage/azure-storage-blob/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml
@@ -0,0 +1,1496 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:19:09 GMT
+ x-ms-version:
+ - '2020-08-04'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/utqqcontainercdb31860?restype=container
+ response:
+ body:
+ string: ''
+ headers:
+ date:
+ - Fri, 09 Apr 2021 04:19:09 GMT
+ etag:
+ - '"0x8D8FB0E9FF3E60A"'
+ last-modified:
+ - Fri, 09 Apr 2021 04:19:10 GMT
+ server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding:
+ - chunked
+ x-ms-version:
+ - '2020-08-04'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: !!binary |
+ UEFSMRUAFeJrFeJrLBXQDxUAFQYVBhwYAzk5ORgBMBYAFtAPGAM5OTkYATAAAAADAAAA0A8BAQAA
+ ADABAAAAMQEAAAAyAQAAADMBAAAANAEAAAA1AQAAADYBAAAANwEAAAA4AQAAADkCAAAAMTACAAAA
+ MTECAAAAMTICAAAAMTMCAAAAMTQCAAAAMTUCAAAAMTYCAAAAMTcCAAAAMTgCAAAAMTkCAAAAMjAC
+ AAAAMjECAAAAMjICAAAAMjMCAAAAMjQCAAAAMjUCAAAAMjYCAAAAMjcCAAAAMjgCAAAAMjkCAAAA
+ MzACAAAAMzECAAAAMzICAAAAMzMCAAAAMzQCAAAAMzUCAAAAMzYCAAAAMzcCAAAAMzgCAAAAMzkC
+ AAAANDACAAAANDECAAAANDICAAAANDMCAAAANDQCAAAANDUCAAAANDYCAAAANDcCAAAANDgCAAAA
+ NDkCAAAANTACAAAANTECAAAANTICAAAANTMCAAAANTQCAAAANTUCAAAANTYCAAAANTcCAAAANTgC
+ AAAANTkCAAAANjACAAAANjECAAAANjICAAAANjMCAAAANjQCAAAANjUCAAAANjYCAAAANjcCAAAA
+ NjgCAAAANjkCAAAANzACAAAANzECAAAANzICAAAANzMCAAAANzQCAAAANzUCAAAANzYCAAAANzcC
+ AAAANzgCAAAANzkCAAAAODACAAAAODECAAAAODICAAAAODMCAAAAODQCAAAAODUCAAAAODYCAAAA
+ ODcCAAAAODgCAAAAODkCAAAAOTACAAAAOTECAAAAOTICAAAAOTMCAAAAOTQCAAAAOTUCAAAAOTYC
+ AAAAOTcCAAAAOTgCAAAAOTkDAAAAMTAwAwAAADEwMQMAAAAxMDIDAAAAMTAzAwAAADEwNAMAAAAx
+ MDUDAAAAMTA2AwAAADEwNwMAAAAxMDgDAAAAMTA5AwAAADExMAMAAAAxMTEDAAAAMTEyAwAAADEx
+ MwMAAAAxMTQDAAAAMTE1AwAAADExNgMAAAAxMTcDAAAAMTE4AwAAADExOQMAAAAxMjADAAAAMTIx
+ AwAAADEyMgMAAAAxMjMDAAAAMTI0AwAAADEyNQMAAAAxMjYDAAAAMTI3AwAAADEyOAMAAAAxMjkD
+ AAAAMTMwAwAAADEzMQMAAAAxMzIDAAAAMTMzAwAAADEzNAMAAAAxMzUDAAAAMTM2AwAAADEzNwMA
+ AAAxMzgDAAAAMTM5AwAAADE0MAMAAAAxNDEDAAAAMTQyAwAAADE0MwMAAAAxNDQDAAAAMTQ1AwAA
+ ADE0NgMAAAAxNDcDAAAAMTQ4AwAAADE0OQMAAAAxNTADAAAAMTUxAwAAADE1MgMAAAAxNTMDAAAA
+ MTU0AwAAADE1NQMAAAAxNTYDAAAAMTU3AwAAADE1OAMAAAAxNTkDAAAAMTYwAwAAADE2MQMAAAAx
+ NjIDAAAAMTYzAwAAADE2NAMAAAAxNjUDAAAAMTY2AwAAADE2NwMAAAAxNjgDAAAAMTY5AwAAADE3
+ MAMAAAAxNzEDAAAAMTcyAwAAADE3MwMAAAAxNzQDAAAAMTc1AwAAADE3NgMAAAAxNzcDAAAAMTc4
+ AwAAADE3OQMAAAAxODADAAAAMTgxAwAAADE4MgMAAAAxODMDAAAAMTg0AwAAADE4NQMAAAAxODYD
+ AAAAMTg3AwAAADE4OAMAAAAxODkDAAAAMTkwAwAAADE5MQMAAAAxOTIDAAAAMTkzAwAAADE5NAMA
+ AAAxOTUDAAAAMTk2AwAAADE5NwMAAAAxOTgDAAAAMTk5AwAAADIwMAMAAAAyMDEDAAAAMjAyAwAA
+ ADIwMwMAAAAyMDQDAAAAMjA1AwAAADIwNgMAAAAyMDcDAAAAMjA4AwAAADIwOQMAAAAyMTADAAAA
+ MjExAwAAADIxMgMAAAAyMTMDAAAAMjE0AwAAADIxNQMAAAAyMTYDAAAAMjE3AwAAADIxOAMAAAAy
+ MTkDAAAAMjIwAwAAADIyMQMAAAAyMjIDAAAAMjIzAwAAADIyNAMAAAAyMjUDAAAAMjI2AwAAADIy
+ NwMAAAAyMjgDAAAAMjI5AwAAADIzMAMAAAAyMzEDAAAAMjMyAwAAADIzMwMAAAAyMzQDAAAAMjM1
+ AwAAADIzNgMAAAAyMzcDAAAAMjM4AwAAADIzOQMAAAAyNDADAAAAMjQxAwAAADI0MgMAAAAyNDMD
+ AAAAMjQ0AwAAADI0NQMAAAAyNDYDAAAAMjQ3AwAAADI0OAMAAAAyNDkDAAAAMjUwAwAAADI1MQMA
+ AAAyNTIDAAAAMjUzAwAAADI1NAMAAAAyNTUDAAAAMjU2AwAAADI1NwMAAAAyNTgDAAAAMjU5AwAA
+ ADI2MAMAAAAyNjEDAAAAMjYyAwAAADI2MwMAAAAyNjQDAAAAMjY1AwAAADI2NgMAAAAyNjcDAAAA
+ MjY4AwAAADI2OQMAAAAyNzADAAAAMjcxAwAAADI3MgMAAAAyNzMDAAAAMjc0AwAAADI3NQMAAAAy
+ NzYDAAAAMjc3AwAAADI3OAMAAAAyNzkDAAAAMjgwAwAAADI4MQMAAAAyODIDAAAAMjgzAwAAADI4
+ NAMAAAAyODUDAAAAMjg2AwAAADI4NwMAAAAyODgDAAAAMjg5AwAAADI5MAMAAAAyOTEDAAAAMjky
+ AwAAADI5MwMAAAAyOTQDAAAAMjk1AwAAADI5NgMAAAAyOTcDAAAAMjk4AwAAADI5OQMAAAAzMDAD
+ AAAAMzAxAwAAADMwMgMAAAAzMDMDAAAAMzA0AwAAADMwNQMAAAAzMDYDAAAAMzA3AwAAADMwOAMA
+ AAAzMDkDAAAAMzEwAwAAADMxMQMAAAAzMTIDAAAAMzEzAwAAADMxNAMAAAAzMTUDAAAAMzE2AwAA
+ ADMxNwMAAAAzMTgDAAAAMzE5AwAAADMyMAMAAAAzMjEDAAAAMzIyAwAAADMyMwMAAAAzMjQDAAAA
+ MzI1AwAAADMyNgMAAAAzMjcDAAAAMzI4AwAAADMyOQMAAAAzMzADAAAAMzMxAwAAADMzMgMAAAAz
+ MzMDAAAAMzM0AwAAADMzNQMAAAAzMzYDAAAAMzM3AwAAADMzOAMAAAAzMzkDAAAAMzQwAwAAADM0
+ MQMAAAAzNDIDAAAAMzQzAwAAADM0NAMAAAAzNDUDAAAAMzQ2AwAAADM0NwMAAAAzNDgDAAAAMzQ5
+ AwAAADM1MAMAAAAzNTEDAAAAMzUyAwAAADM1MwMAAAAzNTQDAAAAMzU1AwAAADM1NgMAAAAzNTcD
+ AAAAMzU4AwAAADM1OQMAAAAzNjADAAAAMzYxAwAAADM2MgMAAAAzNjMDAAAAMzY0AwAAADM2NQMA
+ AAAzNjYDAAAAMzY3AwAAADM2OAMAAAAzNjkDAAAAMzcwAwAAADM3MQMAAAAzNzIDAAAAMzczAwAA
+ ADM3NAMAAAAzNzUDAAAAMzc2AwAAADM3NwMAAAAzNzgDAAAAMzc5AwAAADM4MAMAAAAzODEDAAAA
+ MzgyAwAAADM4MwMAAAAzODQDAAAAMzg1AwAAADM4NgMAAAAzODcDAAAAMzg4AwAAADM4OQMAAAAz
+ OTADAAAAMzkxAwAAADM5MgMAAAAzOTMDAAAAMzk0AwAAADM5NQMAAAAzOTYDAAAAMzk3AwAAADM5
+ OAMAAAAzOTkDAAAANDAwAwAAADQwMQMAAAA0MDIDAAAANDAzAwAAADQwNAMAAAA0MDUDAAAANDA2
+ AwAAADQwNwMAAAA0MDgDAAAANDA5AwAAADQxMAMAAAA0MTEDAAAANDEyAwAAADQxMwMAAAA0MTQD
+ AAAANDE1AwAAADQxNgMAAAA0MTcDAAAANDE4AwAAADQxOQMAAAA0MjADAAAANDIxAwAAADQyMgMA
+ AAA0MjMDAAAANDI0AwAAADQyNQMAAAA0MjYDAAAANDI3AwAAADQyOAMAAAA0MjkDAAAANDMwAwAA
+ ADQzMQMAAAA0MzIDAAAANDMzAwAAADQzNAMAAAA0MzUDAAAANDM2AwAAADQzNwMAAAA0MzgDAAAA
+ NDM5AwAAADQ0MAMAAAA0NDEDAAAANDQyAwAAADQ0MwMAAAA0NDQDAAAANDQ1AwAAADQ0NgMAAAA0
+ NDcDAAAANDQ4AwAAADQ0OQMAAAA0NTADAAAANDUxAwAAADQ1MgMAAAA0NTMDAAAANDU0AwAAADQ1
+ NQMAAAA0NTYDAAAANDU3AwAAADQ1OAMAAAA0NTkDAAAANDYwAwAAADQ2MQMAAAA0NjIDAAAANDYz
+ AwAAADQ2NAMAAAA0NjUDAAAANDY2AwAAADQ2NwMAAAA0NjgDAAAANDY5AwAAADQ3MAMAAAA0NzED
+ AAAANDcyAwAAADQ3MwMAAAA0NzQDAAAANDc1AwAAADQ3NgMAAAA0NzcDAAAANDc4AwAAADQ3OQMA
+ AAA0ODADAAAANDgxAwAAADQ4MgMAAAA0ODMDAAAANDg0AwAAADQ4NQMAAAA0ODYDAAAANDg3AwAA
+ ADQ4OAMAAAA0ODkDAAAANDkwAwAAADQ5MQMAAAA0OTIDAAAANDkzAwAAADQ5NAMAAAA0OTUDAAAA
+ NDk2AwAAADQ5NwMAAAA0OTgDAAAANDk5AwAAADUwMAMAAAA1MDEDAAAANTAyAwAAADUwMwMAAAA1
+ MDQDAAAANTA1AwAAADUwNgMAAAA1MDcDAAAANTA4AwAAADUwOQMAAAA1MTADAAAANTExAwAAADUx
+ MgMAAAA1MTMDAAAANTE0AwAAADUxNQMAAAA1MTYDAAAANTE3AwAAADUxOAMAAAA1MTkDAAAANTIw
+ AwAAADUyMQMAAAA1MjIDAAAANTIzAwAAADUyNAMAAAA1MjUDAAAANTI2AwAAADUyNwMAAAA1MjgD
+ AAAANTI5AwAAADUzMAMAAAA1MzEDAAAANTMyAwAAADUzMwMAAAA1MzQDAAAANTM1AwAAADUzNgMA
+ AAA1MzcDAAAANTM4AwAAADUzOQMAAAA1NDADAAAANTQxAwAAADU0MgMAAAA1NDMDAAAANTQ0AwAA
+ ADU0NQMAAAA1NDYDAAAANTQ3AwAAADU0OAMAAAA1NDkDAAAANTUwAwAAADU1MQMAAAA1NTIDAAAA
+ NTUzAwAAADU1NAMAAAA1NTUDAAAANTU2AwAAADU1NwMAAAA1NTgDAAAANTU5AwAAADU2MAMAAAA1
+ NjEDAAAANTYyAwAAADU2MwMAAAA1NjQDAAAANTY1AwAAADU2NgMAAAA1NjcDAAAANTY4AwAAADU2
+ OQMAAAA1NzADAAAANTcxAwAAADU3MgMAAAA1NzMDAAAANTc0AwAAADU3NQMAAAA1NzYDAAAANTc3
+ AwAAADU3OAMAAAA1NzkDAAAANTgwAwAAADU4MQMAAAA1ODIDAAAANTgzAwAAADU4NAMAAAA1ODUD
+ AAAANTg2AwAAADU4NwMAAAA1ODgDAAAANTg5AwAAADU5MAMAAAA1OTEDAAAANTkyAwAAADU5MwMA
+ AAA1OTQDAAAANTk1AwAAADU5NgMAAAA1OTcDAAAANTk4AwAAADU5OQMAAAA2MDADAAAANjAxAwAA
+ ADYwMgMAAAA2MDMDAAAANjA0AwAAADYwNQMAAAA2MDYDAAAANjA3AwAAADYwOAMAAAA2MDkDAAAA
+ NjEwAwAAADYxMQMAAAA2MTIDAAAANjEzAwAAADYxNAMAAAA2MTUDAAAANjE2AwAAADYxNwMAAAA2
+ MTgDAAAANjE5AwAAADYyMAMAAAA2MjEDAAAANjIyAwAAADYyMwMAAAA2MjQDAAAANjI1AwAAADYy
+ NgMAAAA2MjcDAAAANjI4AwAAADYyOQMAAAA2MzADAAAANjMxAwAAADYzMgMAAAA2MzMDAAAANjM0
+ AwAAADYzNQMAAAA2MzYDAAAANjM3AwAAADYzOAMAAAA2MzkDAAAANjQwAwAAADY0MQMAAAA2NDID
+ AAAANjQzAwAAADY0NAMAAAA2NDUDAAAANjQ2AwAAADY0NwMAAAA2NDgDAAAANjQ5AwAAADY1MAMA
+ AAA2NTEDAAAANjUyAwAAADY1MwMAAAA2NTQDAAAANjU1AwAAADY1NgMAAAA2NTcDAAAANjU4AwAA
+ ADY1OQMAAAA2NjADAAAANjYxAwAAADY2MgMAAAA2NjMDAAAANjY0AwAAADY2NQMAAAA2NjYDAAAA
+ NjY3AwAAADY2OAMAAAA2NjkDAAAANjcwAwAAADY3MQMAAAA2NzIDAAAANjczAwAAADY3NAMAAAA2
+ NzUDAAAANjc2AwAAADY3NwMAAAA2NzgDAAAANjc5AwAAADY4MAMAAAA2ODEDAAAANjgyAwAAADY4
+ MwMAAAA2ODQDAAAANjg1AwAAADY4NgMAAAA2ODcDAAAANjg4AwAAADY4OQMAAAA2OTADAAAANjkx
+ AwAAADY5MgMAAAA2OTMDAAAANjk0AwAAADY5NQMAAAA2OTYDAAAANjk3AwAAADY5OAMAAAA2OTkD
+ AAAANzAwAwAAADcwMQMAAAA3MDIDAAAANzAzAwAAADcwNAMAAAA3MDUDAAAANzA2AwAAADcwNwMA
+ AAA3MDgDAAAANzA5AwAAADcxMAMAAAA3MTEDAAAANzEyAwAAADcxMwMAAAA3MTQDAAAANzE1AwAA
+ ADcxNgMAAAA3MTcDAAAANzE4AwAAADcxOQMAAAA3MjADAAAANzIxAwAAADcyMgMAAAA3MjMDAAAA
+ NzI0AwAAADcyNQMAAAA3MjYDAAAANzI3AwAAADcyOAMAAAA3MjkDAAAANzMwAwAAADczMQMAAAA3
+ MzIDAAAANzMzAwAAADczNAMAAAA3MzUDAAAANzM2AwAAADczNwMAAAA3MzgDAAAANzM5AwAAADc0
+ MAMAAAA3NDEDAAAANzQyAwAAADc0MwMAAAA3NDQDAAAANzQ1AwAAADc0NgMAAAA3NDcDAAAANzQ4
+ AwAAADc0OQMAAAA3NTADAAAANzUxAwAAADc1MgMAAAA3NTMDAAAANzU0AwAAADc1NQMAAAA3NTYD
+ AAAANzU3AwAAADc1OAMAAAA3NTkDAAAANzYwAwAAADc2MQMAAAA3NjIDAAAANzYzAwAAADc2NAMA
+ AAA3NjUDAAAANzY2AwAAADc2NwMAAAA3NjgDAAAANzY5AwAAADc3MAMAAAA3NzEDAAAANzcyAwAA
+ ADc3MwMAAAA3NzQDAAAANzc1AwAAADc3NgMAAAA3NzcDAAAANzc4AwAAADc3OQMAAAA3ODADAAAA
+ NzgxAwAAADc4MgMAAAA3ODMDAAAANzg0AwAAADc4NQMAAAA3ODYDAAAANzg3AwAAADc4OAMAAAA3
+ ODkDAAAANzkwAwAAADc5MQMAAAA3OTIDAAAANzkzAwAAADc5NAMAAAA3OTUDAAAANzk2AwAAADc5
+ NwMAAAA3OTgDAAAANzk5AwAAADgwMAMAAAA4MDEDAAAAODAyAwAAADgwMwMAAAA4MDQDAAAAODA1
+ AwAAADgwNgMAAAA4MDcDAAAAODA4AwAAADgwOQMAAAA4MTADAAAAODExAwAAADgxMgMAAAA4MTMD
+ AAAAODE0AwAAADgxNQMAAAA4MTYDAAAAODE3AwAAADgxOAMAAAA4MTkDAAAAODIwAwAAADgyMQMA
+ AAA4MjIDAAAAODIzAwAAADgyNAMAAAA4MjUDAAAAODI2AwAAADgyNwMAAAA4MjgDAAAAODI5AwAA
+ ADgzMAMAAAA4MzEDAAAAODMyAwAAADgzMwMAAAA4MzQDAAAAODM1AwAAADgzNgMAAAA4MzcDAAAA
+ ODM4AwAAADgzOQMAAAA4NDADAAAAODQxAwAAADg0MgMAAAA4NDMDAAAAODQ0AwAAADg0NQMAAAA4
+ NDYDAAAAODQ3AwAAADg0OAMAAAA4NDkDAAAAODUwAwAAADg1MQMAAAA4NTIDAAAAODUzAwAAADg1
+ NAMAAAA4NTUDAAAAODU2AwAAADg1NwMAAAA4NTgDAAAAODU5AwAAADg2MAMAAAA4NjEDAAAAODYy
+ AwAAADg2MwMAAAA4NjQDAAAAODY1AwAAADg2NgMAAAA4NjcDAAAAODY4AwAAADg2OQMAAAA4NzAD
+ AAAAODcxAwAAADg3MgMAAAA4NzMDAAAAODc0AwAAADg3NQMAAAA4NzYDAAAAODc3AwAAADg3OAMA
+ AAA4NzkDAAAAODgwAwAAADg4MQMAAAA4ODIDAAAAODgzAwAAADg4NAMAAAA4ODUDAAAAODg2AwAA
+ ADg4NwMAAAA4ODgDAAAAODg5AwAAADg5MAMAAAA4OTEDAAAAODkyAwAAADg5MwMAAAA4OTQDAAAA
+ ODk1AwAAADg5NgMAAAA4OTcDAAAAODk4AwAAADg5OQMAAAA5MDADAAAAOTAxAwAAADkwMgMAAAA5
+ MDMDAAAAOTA0AwAAADkwNQMAAAA5MDYDAAAAOTA3AwAAADkwOAMAAAA5MDkDAAAAOTEwAwAAADkx
+ MQMAAAA5MTIDAAAAOTEzAwAAADkxNAMAAAA5MTUDAAAAOTE2AwAAADkxNwMAAAA5MTgDAAAAOTE5
+ AwAAADkyMAMAAAA5MjEDAAAAOTIyAwAAADkyMwMAAAA5MjQDAAAAOTI1AwAAADkyNgMAAAA5MjcD
+ AAAAOTI4AwAAADkyOQMAAAA5MzADAAAAOTMxAwAAADkzMgMAAAA5MzMDAAAAOTM0AwAAADkzNQMA
+ AAA5MzYDAAAAOTM3AwAAADkzOAMAAAA5MzkDAAAAOTQwAwAAADk0MQMAAAA5NDIDAAAAOTQzAwAA
+ ADk0NAMAAAA5NDUDAAAAOTQ2AwAAADk0NwMAAAA5NDgDAAAAOTQ5AwAAADk1MAMAAAA5NTEDAAAA
+ OTUyAwAAADk1MwMAAAA5NTQDAAAAOTU1AwAAADk1NgMAAAA5NTcDAAAAOTU4AwAAADk1OQMAAAA5
+ NjADAAAAOTYxAwAAADk2MgMAAAA5NjMDAAAAOTY0AwAAADk2NQMAAAA5NjYDAAAAOTY3AwAAADk2
+ OAMAAAA5NjkDAAAAOTcwAwAAADk3MQMAAAA5NzIDAAAAOTczAwAAADk3NAMAAAA5NzUDAAAAOTc2
+ AwAAADk3NwMAAAA5NzgDAAAAOTc5AwAAADk4MAMAAAA5ODEDAAAAOTgyAwAAADk4MwMAAAA5ODQD
+ AAAAOTg1AwAAADk4NgMAAAA5ODcDAAAAOTg4AwAAADk4OQMAAAA5OTADAAAAOTkxAwAAADk5MgMA
+ AAA5OTMDAAAAOTk0AwAAADk5NQMAAAA5OTYDAAAAOTk3AwAAADk5OAMAAAA5OTkVABWO+gEVjvoB
+ LBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW0A8YDHp6cTBrZnk0LnZi
+ bhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5lYTMMAAAANWRtdnFldmcuamsw
+ DAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8zamF0bmMuMXZoDAAAAHUzYmZ1
+ dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYnczDAAAAGkwc3EzMDVvLmg1dQwA
+ AAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nra3QyLnJpMAwAAABxMG40NTJl
+ NC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwAAABjd3RhZWQyci5xZHcMAAAA
+ M215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZxci5ubXEMAAAAbHd1aG5kbTAu
+ d2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAAbHBlYnRqNXcuZmMwDAAAAHp0
+ aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2EuY2RmDAAAAHBjanpvdzF1Lm0w
+ MAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1MnJtY2htLnNoZQwAAABwczBz
+ ZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4YgwAAABqMmxtZnpzMi5xZmIM
+ AAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2owZGsybi5hczIMAAAAem5iemhn
+ aXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQMAAAAcm95ZG9udWsuYjJqDAAA
+ AGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5ZGMubHZsDAAAAGRiZGZtc3Iy
+ LmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAAAHIwbm50eTRwLnFlMAwAAAA0
+ eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5Lms1agwAAABhcHljZ2h1aC5h
+ bHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABveGxhdGdudy5hdG8MAAAAdGpn
+ b2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5odnUMAAAAc2x3dXZjaXkucXlm
+ DAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3aTVla3UuZnl6DAAAAHdua2Vz
+ Y25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgwDAAAADVobHZvZ2l3LndtMQwA
+ AABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZkNTMwLnp2NQwAAABqc2N2b3lj
+ Yy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwAAAB1cmkwMmFjMy5zYnkMAAAA
+ bWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1vby5xYWsMAAAAdmN5Z3FzcWUu
+ dXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAAcW1mdXJrMWcucmNnDAAAAHMy
+ ZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwucG1zDAAAAHR0eW9kc251LjQ1
+ ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6dmF6cHZqLmFoeAwAAAA1bXVy
+ NGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxnZwwAAAA1bTU0Zmdnby5rdjUM
+ AAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlzemdhMS53ZnIMAAAAamExY2xh
+ dHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIMAAAAeW5sNXR0eWgubTVsDAAA
+ AG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNwMmQuenRxDAAAAGtnbGl5ZXN0
+ LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAAAGVrZGp0Y3U1LjNicAwAAAA0
+ dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1LjN5dAwAAABqaDV2ZGx6eC54
+ aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABtbmNkZjRudS5idnQMAAAAY3l1
+ ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5tNWkMAAAAcTJvbGRtbDQuZHly
+ DAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRtNGFiMXMuM3FtDAAAAGtxZ2I1
+ ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5DAAAAGZwNGRqamxsLm1meQwA
+ AABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUwaWlrLnQ1ZQwAAABybXZreHN6
+ ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwAAABtbXYwb3lieC5rM2cMAAAA
+ ZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQxZC55dG4MAAAAZGhoZ2d0dGku
+ MWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAAbnhsbGRhYW8ua2RwDAAAADBu
+ cTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsueXJzDAAAAGYxcmMwNGp0LjFr
+ bAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxrdmY1b3gyLmpqMAwAAABhejIy
+ NG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRpZgwAAABtazB4dXZ5MS5pMjEM
+ AAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3dTF2Zy5vYXMMAAAAcmNtaHhv
+ czMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQMAAAANXIzZHV6b2cuamlnDAAA
+ AHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtmeTQudmJuDAAAAHJ0cTBkZG9n
+ LjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAAAHNxaGdhaW1wLnQ0YgwAAAB6
+ cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4LmZqMgwAAAAxbDFtNDFiai5n
+ ZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABmMXhtMTN6eS5langMAAAAMXNl
+ cTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51bWgMAAAAMHNrdmJvanEueTBo
+ DAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xmZ2RhYnoud3djDAAAAGFnem1o
+ eHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5xDAAAAHJ4dWJ2dmdwLnhnZgwA
+ AAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0cWNvLjRtZAwAAABkdnJmZW0y
+ cC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwAAABmYWlsMzVieS5ycTMMAAAA
+ bTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlvdS4wMWcMAAAAbXYzcm5lZW8u
+ cmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAAYXcycHJqYmEubTNhDAAAAGJo
+ Z3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAuYWV4DAAAAGQxcXZ1ZmltLnBi
+ dwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtkeWRhcWlyLndjcgwAAAB3YTM0
+ Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2cgwAAABoeHJqNHJzZS54Y20M
+ AAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFieDNtZS5tbHgMAAAAZ2I1MG11
+ bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYMAAAAdWdlc3R5dzEudXBsDAAA
+ AHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFncXMucTRqDAAAAG0zbnduMGUy
+ LmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAAAG16YTR0NXNnLnV1dgwAAAAw
+ aGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEyLnhtcwwAAAAzbWltdnF1bi5o
+ dTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABubWg0bmg1MS4xbjAMAAAAZ2Zy
+ b3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4zb3IMAAAAcHhuMXQzemkuYWNn
+ DAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1eWx6dHQua3BiDAAAADBiaWNz
+ eXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYyDAAAAG9mZGptbnN2LnVodAwA
+ AAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3Ymt2Lml3MwwAAAB5ampoa3Fs
+ bi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwAAAB0djEzd3F2eS55dWIMAAAA
+ b2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAzZy5ueXUMAAAAMGM1dXR1bWYu
+ M3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAAeXlpajEwMW8ucGlqDAAAAHA1
+ anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMudW0wDAAAAHdjdHBua2ZoLjJ1
+ bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZyMHNza29yLm4ydwwAAAB4dDUw
+ MHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFqZwwAAABqc2V0emMwZS5qaGUM
+ AAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRpMnNmdi53MnUMAAAAbXpwdnNu
+ dWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEMAAAANXhob2txNTQuY29qDAAA
+ AHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1eTQuejMyDAAAAG12dnJ2czFu
+ LmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAAAHZnNGNybm0yLjNjYgwAAABr
+ NTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0LmtkYgwAAABqd3FnYnVtYi5p
+ cnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAAByZ2MzdjN5cC4xY3AMAAAAZ3Bo
+ MzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41ZjAMAAAAaGhrYjBrdzAueWky
+ DAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJmZ3FxeDUudHoyDAAAAG80dWk0
+ a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFoDAAAADB3eHBpZWlpLmVndAwA
+ AABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3b3hpLm50ZgwAAABuemZyYmJ2
+ eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwAAABuNXFnYWgxbS5vM28MAAAA
+ cDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251ay4yMXAMAAAAYWVrYTE1Z3Eu
+ cXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAAanJvM2hzcDMuMmYzDAAAAGJz
+ Z2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMuYjJyDAAAAG5paTFtc3YzLnBz
+ dQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1bmd3dWlqLnViMwwAAAB2Ymx3
+ MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxwNQwAAABqcW1xeWVkdy5naWEM
+ AAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQwaHpwcy5kdjUMAAAAd2ZnY2Rx
+ NGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQMAAAAZGwxMnl6bXIuZWJmDAAA
+ AHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZsMmIuZmJ3DAAAADJ4a3c0eHhy
+ LnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAAAGRkem5lMGpnLmV2NAwAAAB6
+ d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVlLnpjeAwAAAByZmRncm4xZS5y
+ ZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5Y3lreGVnYy4zYmwMAAAAajNq
+ MnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5pcTUMAAAAMGp1cmoyMWkuNDAz
+ DAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlvMnM1MHAueGprDAAAAHBpYWpi
+ bXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmswDAAAAGpvZHIxbHVjLmk0cAwA
+ AAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGszMWJwLm4xdAwAAAB1MW1sazF3
+ NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwAAAB4d20wdGt2bS5xbHkMAAAA
+ dWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhydi5yc3YMAAAAdmdyYnlxdXYu
+ cXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAAZDFocWk1dmMuY20yDAAAADFx
+ MGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQuZGlzDAAAAGNsaWY1b3h2LnQw
+ bgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNqcnNjaWp3LmJzcAwAAAAxcGxt
+ bjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVudAwAAABhcGxhZTVocS5ibG0M
+ AAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5sYjRlNS5ibnkMAAAAYWl3amdz
+ cWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAMAAAAYXBpbWdvdGYueXE0DAAA
+ AGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRmcDAuZDV0DAAAAGhocDI1d2Fp
+ LnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAAAHhyMTFmNHVuLjJidQwAAAB3
+ ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cxLmdqMgwAAABrMHRzbjRmaC5v
+ a2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABxZHpwNWRyby4xcXcMAAAAa2Zh
+ YmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53MGgMAAAAZGZkNDN6dHcubWly
+ DAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3lsZjF4aHguZ2RqDAAAADR5bnAw
+ dmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpkDAAAADRuMm5kMGlvLm53ZAwA
+ AAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1ZnJ1LmRjcwwAAAB4NGpoNXBk
+ ci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwAAABhMmJ0bWJ5YS5xZ2UMAAAA
+ bGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXkybi52bjQMAAAAZXpvemI0M2su
+ YTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAAMnBsbXVrdHIuYnB4DAAAAGhm
+ eGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMuZ21sDAAAAHJpY2o0eGs1LnBq
+ bQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAxbGdncnVzLnB5bAwAAABqb3R3
+ cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96bgwAAABhdGhucnJ6di5pdG8M
+ AAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1iaDNraS5rYm8MAAAAZzRoZnNo
+ YWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoMAAAAbGY1cG14YXguYWJ6DAAA
+ AGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6dzUuaXU1DAAAAHlzMjMzZm52
+ LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAAAG8ydHFzM2NuLjBxcgwAAABy
+ cnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29qLmExcAwAAABtNXNxd2Nkai5v
+ bHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABoc3ozcWdoNC53MTMMAAAAZWN0
+ Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5kMzMMAAAANXA1YW1ja2wuam1s
+ DAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1MzJrenQudGllDAAAAGEzdG9n
+ ZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVjDAAAAGVia3h2bXExLjJ0aQwA
+ AABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNjbTQxLnQxbAwAAAB3aW55a2Ft
+ Zy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwAAAAzaWtwa2tteC5xZjIMAAAA
+ YnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBuMC41cWYMAAAAM25uZGNobWcu
+ eXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAAd2lveTF5bmIuZ3gxDAAAAGdj
+ dDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEueTUxDAAAADIzcmVlbjI0Lngz
+ MgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpzdWl2em1jLnRmMwwAAABvMmt4
+ bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndzcQwAAAA0dDIxaDB0Yi56dDIM
+ AAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3ZWxteC5kaHoMAAAAc2JvNHRj
+ eXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncMAAAAajJvNXdkcncuZ3VrDAAA
+ AGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtvNTUueGZwDAAAADVvdnlydHpt
+ LmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAAAHZ2MWVkcnI0Lm1rcAwAAAB1
+ aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVmLmJjcAwAAAB5ZGVzcGpjZy5p
+ ajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0cDRtNXR0dC53bXgMAAAAcGpk
+ Y3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41ZW8MAAAAc2I1MTJ5YmouM3Jj
+ DAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5bmJjc2gueHR1DAAAAG8yYTFi
+ ZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5DAAAAHNwZmZ3bHhwLjRtcQwA
+ AABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdrNWpmLnhjYgwAAABncTR4c3dx
+ dC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwAAABsdnpvdzRpMy5jNHYMAAAA
+ ankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2JsaS5tcGQMAAAAbzBydHh1Ymcu
+ MWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAAMGJlaDRta2QueWVrDAAAAHVj
+ c2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUuMXVhDAAAAGMyMjN6Y3JsLmlj
+ cgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJrNGVwa2hrLnVhdQwAAABzbG40
+ cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMzdAwAAAB3ZWowcGhmbi4xa2sM
+ AAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4ycmR0NC5qZmMMAAAAYmdpMnN0
+ YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAMAAAAbmdkdDBybnIueGtzDAAA
+ AGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0NGkub3JrDAAAAHdveTFvZ3N0
+ LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAAAHYxcXRtZzFlLnV0cwwAAABy
+ ajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25yLjB0MAwAAAA1am9zZG5oZi5n
+ dmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAxbXZ1eDFzcS55cHEMAAAAZnpi
+ Z2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54NGMMAAAAMXJ4MHFuaXQueW96
+ DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRlaTVxa3oudXZiDAAAAHIxMWlk
+ ZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2DAAAAGIwd2tncGFuLm5xawwA
+ AAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhrbzRxLmRhdgwAAABhdzB5cWZw
+ by4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwAAAB4bGdvNHgxdy5odXUMAAAA
+ bzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwzZy50bXIMAAAAa2p4MGVyb2Eu
+ cGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAAaGR0dzNsZWouaHdyDAAAAG5z
+ Y3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3MmwuNWZsDAAAAHhoZWd5d3Z6Lncx
+ YwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVxZGRrYmJiLnFnbgwAAAAzZnM0
+ ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4dAwAAABweXZudXJ0ZC4zZGMM
+ AAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRzeTR1cy4yMmQMAAAAamxiMGJ0
+ enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQMAAAAa2c1anNqNXIubG96DAAA
+ AGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21yd3AuNHUzDAAAAHd3MGFzc3l4
+ Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAAAGZ1b2pmcTQwLmZ5dAwAAABt
+ YXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRqLnF4cgwAAABxbnd1dGx6YS5n
+ eXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4a2xpamN2ai4zcjEMAAAAc3cx
+ YnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5xbGMMAAAAczFwZ3psaHgueXRw
+ DAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3NocmV0dGYubzAyDAAAAHNyZXZ3
+ eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2JrDAAAADBpdDFtZnhzLmpxMAwA
+ AABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2NmZzNtLnhycwwAAABkd295eWll
+ aC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwAAABqaWRjNW5paC41enEMAAAA
+ MDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2JjMy5wYWsMAAAAd3Nnd3B0d2Iu
+ bG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAAdHpoNHN2dTIuaHp6DAAAAHBj
+ bXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUudXZnDAAAAGJuNHN5cWdrLjBj
+ MgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQxZmNqYmsxLnFseAwAAAAzcmhv
+ M3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0eQwAAABra2lldXZ0NC5zY3gM
+ AAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYzYmpvdi5waTIMAAAAb3NoaWh4
+ ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUMAAAAeGVnNDBib2QudWp3DAAA
+ AHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtzbHIuMjJwDAAAAGZ2dmh3aWs0
+ LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAAAGF3cHczZGpiLjBnZAwAAABw
+ b21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0LjJubQwAAABweWR1bGNpYi56
+ YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5anphNGJrbC5ocWcMAAAAbG5q
+ MmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40d28MAAAAem5iejRoYmQubHoz
+ DAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQzemVkaW4uMXYyDAAAAGV5YTUw
+ cnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMxDAAAAHlmendwNHlxLnp5bAwA
+ AAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1c2ljLm1mawwAAABrZWVmcG1n
+ Yy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwAAABkNWZ4cXpldS5ua2kMAAAA
+ bTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlvdS56bWUMAAAAaGVxa2R1bHUu
+ dHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAAbGN6aTQ1MnAuaWEyDAAAAGEw
+ cmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWkubWd0DAAAADV3b25lcTUyLnJn
+ dwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1eXpvNXVlLjNuYwwAAABqNG9n
+ MnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhyeQwAAAA0bzNhY3B0ZC41c3EM
+ AAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRnenA1bi52enUMAAAAZHZycHZ5
+ M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwMAAAAYW1veWtvZGkuNW9nDAAA
+ AG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgwcGouMzF2DAAAADMwcndocHBs
+ Lmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAAADNleGlsbXB2Lmp6aQwAAABs
+ YWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5LmljcgwAAAA1NHBhMnBtdy5y
+ amkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABpZmxlaTFuMS5idGsMAAAAYmxk
+ d2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5tcjIMAAAAYTRxZG94ZWsuajMx
+ DAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lrampkMWMuNGd5DAAAADVqM2wx
+ MHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3FvDAAAAGI1ZjNmcWRpLjB5NQwA
+ AABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxjdmdtLmpnagwAAAAzZmMwZXdi
+ bS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwAAABxMnRmYjB2ay5uMmQMAAAA
+ a2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1dy5rcXYMAAAAbWRjcGVld2Iu
+ NXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAAeXlhbGJ1Y3MuYW5nDAAAAHAz
+ eHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cuNTU0DAAAAGVydTJsbmowLnN1
+ dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZmeGJidWFkLm5tNQwAAABidmo1
+ eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNyZwwAAABvZWVrcjJ0eC51aXkM
+ AAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdlbGRrdi56YXEMAAAAamJ4YzB3
+ dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIMAAAAaGhwejQyeHQuZ3F4DAAA
+ ADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2JxdWwudWQyDAAAAG94MDQ1azFv
+ LmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAAAGozcGM1c20wLm1sYwwAAABp
+ c2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2RvLm1nYQwAAAB5ZWpnb2d4by55
+ bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2enEzMW94Yi50djMMAAAAeHFz
+ MGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5ycnkMAAAAMDV0Y3h0MmwucXo1
+ DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWExcnIxZGwudWVlDAAAAHFzdWdu
+ eXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6DAAAADUxeW01YmhxLmVybAwA
+ AABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdrZ3lsLm1wdAwAAABkZDV3dGh5
+ aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwAAABocGdudG5qaC56dHIMAAAA
+ eDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJybC4ybXUMAAAAd2lrdXB4b2ou
+ c2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAAMHB4MWRpY2wucWd3DAAAAHVx
+ YTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8uanZpDAAAAGQ0bDQwbGJxLjUw
+ ZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHowYmNsa2R1LmNwawwAAAB3MGpv
+ Z3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3aQwAAABidXp6MmpuMi52MzUM
+ AAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVqMXRydC5rdXgMAAAAYzExcG9l
+ MDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8MAAAANWw1MWswdGsueGRsDAAA
+ AGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZsdjQub2lpDAAAAHVzMzMyMDJy
+ Lm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAAAGx5ZmNscmh3LnJ0NAwAAABk
+ a3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFyLnBzNQwAAABxd2YwM2lxZC5o
+ ZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABjdjFlMnhvdS4xbngMAAAAbGFs
+ bzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5oa2kMAAAAeTB2MjM1eG4uMG5m
+ DAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMwYmRudjEuNDVjDAAAAGhpM3p5
+ cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNlDAAAAGZhZXEwdTNrLmZndQwA
+ AABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xnb2hkLjVibgwAAAB2YWR0YXNs
+ aC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwAAABmcTJ5bmZiMS5tb3IMAAAA
+ Zm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2ZxMy5nZWYMAAAAcWNtYmpha2cu
+ cGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAAeW1vNXlsengudmt3DAAAAHZ1
+ bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcudW8zDAAAAG4zMm00aGVkLnRt
+ cgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBjeXBuZGVwLjNrdwwAAABrdWg0
+ NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmlicAwAAABhc2szdXNzcy56YjUM
+ AAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVlaWVmZi5sc3gMAAAAa2pmMG9u
+ bmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEMAAAAajJuamJtZHEuMTRhDAAA
+ AG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUwanAudmVnDAAAADFsM3phZ3F4
+ Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAAADR3MTJncHAzLmRycwwAAABx
+ MnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtvLjFucAwAAAA0aW54a3YzZC54
+ eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAzbGN1aGZpcS4yYWYMAAAAeGtp
+ NXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5sZ2sMAAAAeHlxZXE1ejMubTRh
+ DAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNjc21uNWkudzFuDAAAAHptNWtp
+ Y3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNwDAAAAHlranlrY3F4LnJqMAwA
+ AABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2VrdTNhLnl3ZAwAAAA0bnAwdGdo
+ NS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwAAAA0azEwdnV6by56d3cMAAAA
+ b3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0di4zY3YMAAAAaGNhMGx3cjMu
+ eGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAAYTJqaHRxeWIuczVjDAAAAGtm
+ ZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIudm53DAAAAHZycDBncG1mLnky
+ YQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4xdnYxdHN1LjFpbAwAAABnZjFi
+ aDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3agwAAABqbmE1em0wYy5hb3gM
+ AAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41cW1ueS5kbDAMAAAAbTNkd3Jx
+ MmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMMAAAAMXU1cjFuYXoueWhjDAAA
+ AG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81MmIuZnlwDAAAAGJuNHJ6aXNy
+ LjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAAAGZ6aWpmcGpsLmMwagwAAABn
+ M3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3NuLmRoagwAAAAyZnZ3eGlsdi5p
+ d2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABucWZtMWJvZS51ZG4MAAAAdGxh
+ czJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5uM20MAAAAYnNqbDBudmkuaW5o
+ DAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpoM2NmYXguNWZmDAAAAGlnM2x0
+ ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0DAAAAG1mbzF0amV4LjR5bAwA
+ AABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHhtMjN4Lmx4cQwAAAB6amlqZGV2
+ cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwAAAB4bGE0NGYxaS5jbmIMAAAA
+ NTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNhZS5vdWYMAAAAZG5qd25lcnYu
+ ZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAAMTEyYnFwcWYuaWMzDAAAAGtw
+ NHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2kuajJ4DAAAAHNudnF3aGkxLml3
+ aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRsc2Fpb2FzLmhzMwwAAAAweGZh
+ dDNxei5vYWkVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZz
+ FgAW0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5l
+ YTMMAAAANWRtdnFldmcuamswDAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8z
+ amF0bmMuMXZoDAAAAHUzYmZ1dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYncz
+ DAAAAGkwc3EzMDVvLmg1dQwAAAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nr
+ a3QyLnJpMAwAAABxMG40NTJlNC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwA
+ AABjd3RhZWQyci5xZHcMAAAAM215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZx
+ ci5ubXEMAAAAbHd1aG5kbTAud2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAA
+ bHBlYnRqNXcuZmMwDAAAAHp0aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2Eu
+ Y2RmDAAAAHBjanpvdzF1Lm0wMAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1
+ MnJtY2htLnNoZQwAAABwczBzZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4
+ YgwAAABqMmxtZnpzMi5xZmIMAAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2ow
+ ZGsybi5hczIMAAAAem5iemhnaXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQM
+ AAAAcm95ZG9udWsuYjJqDAAAAGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5
+ ZGMubHZsDAAAAGRiZGZtc3IyLmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAA
+ AHIwbm50eTRwLnFlMAwAAAA0eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5
+ Lms1agwAAABhcHljZ2h1aC5hbHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABv
+ eGxhdGdudy5hdG8MAAAAdGpnb2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5o
+ dnUMAAAAc2x3dXZjaXkucXlmDAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3
+ aTVla3UuZnl6DAAAAHdua2VzY25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgw
+ DAAAADVobHZvZ2l3LndtMQwAAABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZk
+ NTMwLnp2NQwAAABqc2N2b3ljYy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwA
+ AAB1cmkwMmFjMy5zYnkMAAAAbWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1v
+ by5xYWsMAAAAdmN5Z3FzcWUudXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAA
+ cW1mdXJrMWcucmNnDAAAAHMyZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwu
+ cG1zDAAAAHR0eW9kc251LjQ1ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6
+ dmF6cHZqLmFoeAwAAAA1bXVyNGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxn
+ ZwwAAAA1bTU0Zmdnby5rdjUMAAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlz
+ emdhMS53ZnIMAAAAamExY2xhdHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIM
+ AAAAeW5sNXR0eWgubTVsDAAAAG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNw
+ MmQuenRxDAAAAGtnbGl5ZXN0LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAA
+ AGVrZGp0Y3U1LjNicAwAAAA0dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1
+ LjN5dAwAAABqaDV2ZGx6eC54aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABt
+ bmNkZjRudS5idnQMAAAAY3l1ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5t
+ NWkMAAAAcTJvbGRtbDQuZHlyDAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRt
+ NGFiMXMuM3FtDAAAAGtxZ2I1ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5
+ DAAAAGZwNGRqamxsLm1meQwAAABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUw
+ aWlrLnQ1ZQwAAABybXZreHN6ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwA
+ AABtbXYwb3lieC5rM2cMAAAAZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQx
+ ZC55dG4MAAAAZGhoZ2d0dGkuMWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAA
+ bnhsbGRhYW8ua2RwDAAAADBucTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsu
+ eXJzDAAAAGYxcmMwNGp0LjFrbAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxr
+ dmY1b3gyLmpqMAwAAABhejIyNG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRp
+ ZgwAAABtazB4dXZ5MS5pMjEMAAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3
+ dTF2Zy5vYXMMAAAAcmNtaHhvczMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQM
+ AAAANXIzZHV6b2cuamlnDAAAAHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtm
+ eTQudmJuDAAAAHJ0cTBkZG9nLjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAA
+ AHNxaGdhaW1wLnQ0YgwAAAB6cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4
+ LmZqMgwAAAAxbDFtNDFiai5nZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABm
+ MXhtMTN6eS5langMAAAAMXNlcTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51
+ bWgMAAAAMHNrdmJvanEueTBoDAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xm
+ Z2RhYnoud3djDAAAAGFnem1oeHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5x
+ DAAAAHJ4dWJ2dmdwLnhnZgwAAAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0
+ cWNvLjRtZAwAAABkdnJmZW0ycC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwA
+ AABmYWlsMzVieS5ycTMMAAAAbTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlv
+ dS4wMWcMAAAAbXYzcm5lZW8ucmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAA
+ YXcycHJqYmEubTNhDAAAAGJoZ3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAu
+ YWV4DAAAAGQxcXZ1ZmltLnBidwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtk
+ eWRhcWlyLndjcgwAAAB3YTM0Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2
+ cgwAAABoeHJqNHJzZS54Y20MAAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFi
+ eDNtZS5tbHgMAAAAZ2I1MG11bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYM
+ AAAAdWdlc3R5dzEudXBsDAAAAHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFn
+ cXMucTRqDAAAAG0zbnduMGUyLmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAA
+ AG16YTR0NXNnLnV1dgwAAAAwaGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEy
+ LnhtcwwAAAAzbWltdnF1bi5odTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABu
+ bWg0bmg1MS4xbjAMAAAAZ2Zyb3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4z
+ b3IMAAAAcHhuMXQzemkuYWNnDAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1
+ eWx6dHQua3BiDAAAADBiaWNzeXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYy
+ DAAAAG9mZGptbnN2LnVodAwAAAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3
+ Ymt2Lml3MwwAAAB5ampoa3Fsbi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwA
+ AAB0djEzd3F2eS55dWIMAAAAb2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAz
+ Zy5ueXUMAAAAMGM1dXR1bWYuM3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAA
+ eXlpajEwMW8ucGlqDAAAAHA1anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMu
+ dW0wDAAAAHdjdHBua2ZoLjJ1bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZy
+ MHNza29yLm4ydwwAAAB4dDUwMHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFq
+ ZwwAAABqc2V0emMwZS5qaGUMAAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRp
+ MnNmdi53MnUMAAAAbXpwdnNudWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEM
+ AAAANXhob2txNTQuY29qDAAAAHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1
+ eTQuejMyDAAAAG12dnJ2czFuLmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAA
+ AHZnNGNybm0yLjNjYgwAAABrNTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0
+ LmtkYgwAAABqd3FnYnVtYi5pcnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAABy
+ Z2MzdjN5cC4xY3AMAAAAZ3BoMzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41
+ ZjAMAAAAaGhrYjBrdzAueWkyDAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJm
+ Z3FxeDUudHoyDAAAAG80dWk0a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFo
+ DAAAADB3eHBpZWlpLmVndAwAAABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3
+ b3hpLm50ZgwAAABuemZyYmJ2eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwA
+ AABuNXFnYWgxbS5vM28MAAAAcDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251
+ ay4yMXAMAAAAYWVrYTE1Z3EucXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAA
+ anJvM2hzcDMuMmYzDAAAAGJzZ2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMu
+ YjJyDAAAAG5paTFtc3YzLnBzdQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1
+ bmd3dWlqLnViMwwAAAB2Ymx3MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxw
+ NQwAAABqcW1xeWVkdy5naWEMAAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQw
+ aHpwcy5kdjUMAAAAd2ZnY2RxNGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQM
+ AAAAZGwxMnl6bXIuZWJmDAAAAHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZs
+ MmIuZmJ3DAAAADJ4a3c0eHhyLnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAA
+ AGRkem5lMGpnLmV2NAwAAAB6d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVl
+ LnpjeAwAAAByZmRncm4xZS5yZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5
+ Y3lreGVnYy4zYmwMAAAAajNqMnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5p
+ cTUMAAAAMGp1cmoyMWkuNDAzDAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlv
+ MnM1MHAueGprDAAAAHBpYWpibXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmsw
+ DAAAAGpvZHIxbHVjLmk0cAwAAAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGsz
+ MWJwLm4xdAwAAAB1MW1sazF3NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwA
+ AAB4d20wdGt2bS5xbHkMAAAAdWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhy
+ di5yc3YMAAAAdmdyYnlxdXYucXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAA
+ ZDFocWk1dmMuY20yDAAAADFxMGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQu
+ ZGlzDAAAAGNsaWY1b3h2LnQwbgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNq
+ cnNjaWp3LmJzcAwAAAAxcGxtbjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVu
+ dAwAAABhcGxhZTVocS5ibG0MAAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5s
+ YjRlNS5ibnkMAAAAYWl3amdzcWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAM
+ AAAAYXBpbWdvdGYueXE0DAAAAGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRm
+ cDAuZDV0DAAAAGhocDI1d2FpLnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAA
+ AHhyMTFmNHVuLjJidQwAAAB3ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cx
+ LmdqMgwAAABrMHRzbjRmaC5va2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABx
+ ZHpwNWRyby4xcXcMAAAAa2ZhYmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53
+ MGgMAAAAZGZkNDN6dHcubWlyDAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3ls
+ ZjF4aHguZ2RqDAAAADR5bnAwdmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpk
+ DAAAADRuMm5kMGlvLm53ZAwAAAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1
+ ZnJ1LmRjcwwAAAB4NGpoNXBkci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwA
+ AABhMmJ0bWJ5YS5xZ2UMAAAAbGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXky
+ bi52bjQMAAAAZXpvemI0M2suYTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAA
+ MnBsbXVrdHIuYnB4DAAAAGhmeGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMu
+ Z21sDAAAAHJpY2o0eGs1LnBqbQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAx
+ bGdncnVzLnB5bAwAAABqb3R3cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96
+ bgwAAABhdGhucnJ6di5pdG8MAAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1i
+ aDNraS5rYm8MAAAAZzRoZnNoYWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoM
+ AAAAbGY1cG14YXguYWJ6DAAAAGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6
+ dzUuaXU1DAAAAHlzMjMzZm52LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAA
+ AG8ydHFzM2NuLjBxcgwAAABycnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29q
+ LmExcAwAAABtNXNxd2Nkai5vbHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABo
+ c3ozcWdoNC53MTMMAAAAZWN0Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5k
+ MzMMAAAANXA1YW1ja2wuam1sDAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1
+ MzJrenQudGllDAAAAGEzdG9nZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVj
+ DAAAAGVia3h2bXExLjJ0aQwAAABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNj
+ bTQxLnQxbAwAAAB3aW55a2FtZy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwA
+ AAAzaWtwa2tteC5xZjIMAAAAYnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBu
+ MC41cWYMAAAAM25uZGNobWcueXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAA
+ d2lveTF5bmIuZ3gxDAAAAGdjdDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEu
+ eTUxDAAAADIzcmVlbjI0LngzMgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpz
+ dWl2em1jLnRmMwwAAABvMmt4bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndz
+ cQwAAAA0dDIxaDB0Yi56dDIMAAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3
+ ZWxteC5kaHoMAAAAc2JvNHRjeXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncM
+ AAAAajJvNXdkcncuZ3VrDAAAAGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtv
+ NTUueGZwDAAAADVvdnlydHptLmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAA
+ AHZ2MWVkcnI0Lm1rcAwAAAB1aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVm
+ LmJjcAwAAAB5ZGVzcGpjZy5pajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0
+ cDRtNXR0dC53bXgMAAAAcGpkY3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41
+ ZW8MAAAAc2I1MTJ5YmouM3JjDAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5
+ bmJjc2gueHR1DAAAAG8yYTFiZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5
+ DAAAAHNwZmZ3bHhwLjRtcQwAAABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdr
+ NWpmLnhjYgwAAABncTR4c3dxdC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwA
+ AABsdnpvdzRpMy5jNHYMAAAAankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2Js
+ aS5tcGQMAAAAbzBydHh1YmcuMWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAA
+ MGJlaDRta2QueWVrDAAAAHVjc2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUu
+ MXVhDAAAAGMyMjN6Y3JsLmljcgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJr
+ NGVwa2hrLnVhdQwAAABzbG40cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMz
+ dAwAAAB3ZWowcGhmbi4xa2sMAAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4y
+ cmR0NC5qZmMMAAAAYmdpMnN0YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAM
+ AAAAbmdkdDBybnIueGtzDAAAAGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0
+ NGkub3JrDAAAAHdveTFvZ3N0LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAA
+ AHYxcXRtZzFlLnV0cwwAAAByajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25y
+ LjB0MAwAAAA1am9zZG5oZi5ndmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAx
+ bXZ1eDFzcS55cHEMAAAAZnpiZ2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54
+ NGMMAAAAMXJ4MHFuaXQueW96DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRl
+ aTVxa3oudXZiDAAAAHIxMWlkZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2
+ DAAAAGIwd2tncGFuLm5xawwAAAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhr
+ bzRxLmRhdgwAAABhdzB5cWZwby4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwA
+ AAB4bGdvNHgxdy5odXUMAAAAbzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwz
+ Zy50bXIMAAAAa2p4MGVyb2EucGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAA
+ aGR0dzNsZWouaHdyDAAAAG5zY3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3Mmwu
+ NWZsDAAAAHhoZWd5d3Z6LncxYwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVx
+ ZGRrYmJiLnFnbgwAAAAzZnM0ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4
+ dAwAAABweXZudXJ0ZC4zZGMMAAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRz
+ eTR1cy4yMmQMAAAAamxiMGJ0enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQM
+ AAAAa2c1anNqNXIubG96DAAAAGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21y
+ d3AuNHUzDAAAAHd3MGFzc3l4Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAA
+ AGZ1b2pmcTQwLmZ5dAwAAABtYXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRq
+ LnF4cgwAAABxbnd1dGx6YS5neXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4
+ a2xpamN2ai4zcjEMAAAAc3cxYnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5x
+ bGMMAAAAczFwZ3psaHgueXRwDAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3No
+ cmV0dGYubzAyDAAAAHNyZXZ3eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2Jr
+ DAAAADBpdDFtZnhzLmpxMAwAAABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2Nm
+ ZzNtLnhycwwAAABkd295eWllaC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwA
+ AABqaWRjNW5paC41enEMAAAAMDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2Jj
+ My5wYWsMAAAAd3Nnd3B0d2IubG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAA
+ dHpoNHN2dTIuaHp6DAAAAHBjbXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUu
+ dXZnDAAAAGJuNHN5cWdrLjBjMgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQx
+ ZmNqYmsxLnFseAwAAAAzcmhvM3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0
+ eQwAAABra2lldXZ0NC5zY3gMAAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYz
+ Ympvdi5waTIMAAAAb3NoaWh4ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUM
+ AAAAeGVnNDBib2QudWp3DAAAAHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtz
+ bHIuMjJwDAAAAGZ2dmh3aWs0LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAA
+ AGF3cHczZGpiLjBnZAwAAABwb21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0
+ LjJubQwAAABweWR1bGNpYi56YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5
+ anphNGJrbC5ocWcMAAAAbG5qMmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40
+ d28MAAAAem5iejRoYmQubHozDAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQz
+ emVkaW4uMXYyDAAAAGV5YTUwcnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMx
+ DAAAAHlmendwNHlxLnp5bAwAAAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1
+ c2ljLm1mawwAAABrZWVmcG1nYy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwA
+ AABkNWZ4cXpldS5ua2kMAAAAbTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlv
+ dS56bWUMAAAAaGVxa2R1bHUudHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAA
+ bGN6aTQ1MnAuaWEyDAAAAGEwcmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWku
+ bWd0DAAAADV3b25lcTUyLnJndwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1
+ eXpvNXVlLjNuYwwAAABqNG9nMnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhy
+ eQwAAAA0bzNhY3B0ZC41c3EMAAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRn
+ enA1bi52enUMAAAAZHZycHZ5M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwM
+ AAAAYW1veWtvZGkuNW9nDAAAAG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgw
+ cGouMzF2DAAAADMwcndocHBsLmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAA
+ ADNleGlsbXB2Lmp6aQwAAABsYWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5
+ LmljcgwAAAA1NHBhMnBtdy5yamkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABp
+ ZmxlaTFuMS5idGsMAAAAYmxkd2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5t
+ cjIMAAAAYTRxZG94ZWsuajMxDAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lr
+ ampkMWMuNGd5DAAAADVqM2wxMHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3Fv
+ DAAAAGI1ZjNmcWRpLjB5NQwAAABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxj
+ dmdtLmpnagwAAAAzZmMwZXdibS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwA
+ AABxMnRmYjB2ay5uMmQMAAAAa2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1
+ dy5rcXYMAAAAbWRjcGVld2IuNXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAA
+ eXlhbGJ1Y3MuYW5nDAAAAHAzeHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cu
+ NTU0DAAAAGVydTJsbmowLnN1dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZm
+ eGJidWFkLm5tNQwAAABidmo1eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNy
+ ZwwAAABvZWVrcjJ0eC51aXkMAAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdl
+ bGRrdi56YXEMAAAAamJ4YzB3dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIM
+ AAAAaGhwejQyeHQuZ3F4DAAAADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2Jx
+ dWwudWQyDAAAAG94MDQ1azFvLmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAA
+ AGozcGM1c20wLm1sYwwAAABpc2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2Rv
+ Lm1nYQwAAAB5ZWpnb2d4by55bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2
+ enEzMW94Yi50djMMAAAAeHFzMGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5y
+ cnkMAAAAMDV0Y3h0MmwucXo1DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWEx
+ cnIxZGwudWVlDAAAAHFzdWdueXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6
+ DAAAADUxeW01YmhxLmVybAwAAABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdr
+ Z3lsLm1wdAwAAABkZDV3dGh5aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwA
+ AABocGdudG5qaC56dHIMAAAAeDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJy
+ bC4ybXUMAAAAd2lrdXB4b2ouc2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAA
+ MHB4MWRpY2wucWd3DAAAAHVxYTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8u
+ anZpDAAAAGQ0bDQwbGJxLjUwZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHow
+ YmNsa2R1LmNwawwAAAB3MGpvZ3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3
+ aQwAAABidXp6MmpuMi52MzUMAAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVq
+ MXRydC5rdXgMAAAAYzExcG9lMDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8M
+ AAAANWw1MWswdGsueGRsDAAAAGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZs
+ djQub2lpDAAAAHVzMzMyMDJyLm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAA
+ AGx5ZmNscmh3LnJ0NAwAAABka3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFy
+ LnBzNQwAAABxd2YwM2lxZC5oZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABj
+ djFlMnhvdS4xbngMAAAAbGFsbzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5o
+ a2kMAAAAeTB2MjM1eG4uMG5mDAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMw
+ YmRudjEuNDVjDAAAAGhpM3p5cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNl
+ DAAAAGZhZXEwdTNrLmZndQwAAABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xn
+ b2hkLjVibgwAAAB2YWR0YXNsaC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwA
+ AABmcTJ5bmZiMS5tb3IMAAAAZm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2Zx
+ My5nZWYMAAAAcWNtYmpha2cucGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAA
+ eW1vNXlsengudmt3DAAAAHZ1bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcu
+ dW8zDAAAAG4zMm00aGVkLnRtcgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBj
+ eXBuZGVwLjNrdwwAAABrdWg0NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmli
+ cAwAAABhc2szdXNzcy56YjUMAAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVl
+ aWVmZi5sc3gMAAAAa2pmMG9ubmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEM
+ AAAAajJuamJtZHEuMTRhDAAAAG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUw
+ anAudmVnDAAAADFsM3phZ3F4Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAA
+ ADR3MTJncHAzLmRycwwAAABxMnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtv
+ LjFucAwAAAA0aW54a3YzZC54eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAz
+ bGN1aGZpcS4yYWYMAAAAeGtpNXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5s
+ Z2sMAAAAeHlxZXE1ejMubTRhDAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNj
+ c21uNWkudzFuDAAAAHptNWtpY3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNw
+ DAAAAHlranlrY3F4LnJqMAwAAABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2Vr
+ dTNhLnl3ZAwAAAA0bnAwdGdoNS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwA
+ AAA0azEwdnV6by56d3cMAAAAb3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0
+ di4zY3YMAAAAaGNhMGx3cjMueGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAA
+ YTJqaHRxeWIuczVjDAAAAGtmZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIu
+ dm53DAAAAHZycDBncG1mLnkyYQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4x
+ dnYxdHN1LjFpbAwAAABnZjFiaDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3
+ agwAAABqbmE1em0wYy5hb3gMAAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41
+ cW1ueS5kbDAMAAAAbTNkd3JxMmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMM
+ AAAAMXU1cjFuYXoueWhjDAAAAG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81
+ MmIuZnlwDAAAAGJuNHJ6aXNyLjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAA
+ AGZ6aWpmcGpsLmMwagwAAABnM3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3Nu
+ LmRoagwAAAAyZnZ3eGlsdi5pd2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABu
+ cWZtMWJvZS51ZG4MAAAAdGxhczJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5u
+ M20MAAAAYnNqbDBudmkuaW5oDAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpo
+ M2NmYXguNWZmDAAAAGlnM2x0ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0
+ DAAAAG1mbzF0amV4LjR5bAwAAABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHht
+ MjN4Lmx4cQwAAAB6amlqZGV2cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwA
+ AAB4bGE0NGYxaS5jbmIMAAAANTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNh
+ ZS5vdWYMAAAAZG5qd25lcnYuZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAA
+ MTEyYnFwcWYuaWMzDAAAAGtwNHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2ku
+ ajJ4DAAAAHNudnF3aGkxLml3aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRs
+ c2Fpb2FzLmhzMwwAAAAweGZhdDNxei5vYWkVABWOfRWOfSwV0A8VABUGFQYcGAQxOTk5GAQxMDAw
+ FgAW0A8YBDE5OTkYBDEwMDAAAAADAAAA0A8BBAAAADEwMDAEAAAAMTAwMQQAAAAxMDAyBAAAADEw
+ MDMEAAAAMTAwNAQAAAAxMDA1BAAAADEwMDYEAAAAMTAwNwQAAAAxMDA4BAAAADEwMDkEAAAAMTAx
+ MAQAAAAxMDExBAAAADEwMTIEAAAAMTAxMwQAAAAxMDE0BAAAADEwMTUEAAAAMTAxNgQAAAAxMDE3
+ BAAAADEwMTgEAAAAMTAxOQQAAAAxMDIwBAAAADEwMjEEAAAAMTAyMgQAAAAxMDIzBAAAADEwMjQE
+ AAAAMTAyNQQAAAAxMDI2BAAAADEwMjcEAAAAMTAyOAQAAAAxMDI5BAAAADEwMzAEAAAAMTAzMQQA
+ AAAxMDMyBAAAADEwMzMEAAAAMTAzNAQAAAAxMDM1BAAAADEwMzYEAAAAMTAzNwQAAAAxMDM4BAAA
+ ADEwMzkEAAAAMTA0MAQAAAAxMDQxBAAAADEwNDIEAAAAMTA0MwQAAAAxMDQ0BAAAADEwNDUEAAAA
+ MTA0NgQAAAAxMDQ3BAAAADEwNDgEAAAAMTA0OQQAAAAxMDUwBAAAADEwNTEEAAAAMTA1MgQAAAAx
+ MDUzBAAAADEwNTQEAAAAMTA1NQQAAAAxMDU2BAAAADEwNTcEAAAAMTA1OAQAAAAxMDU5BAAAADEw
+ NjAEAAAAMTA2MQQAAAAxMDYyBAAAADEwNjMEAAAAMTA2NAQAAAAxMDY1BAAAADEwNjYEAAAAMTA2
+ NwQAAAAxMDY4BAAAADEwNjkEAAAAMTA3MAQAAAAxMDcxBAAAADEwNzIEAAAAMTA3MwQAAAAxMDc0
+ BAAAADEwNzUEAAAAMTA3NgQAAAAxMDc3BAAAADEwNzgEAAAAMTA3OQQAAAAxMDgwBAAAADEwODEE
+ AAAAMTA4MgQAAAAxMDgzBAAAADEwODQEAAAAMTA4NQQAAAAxMDg2BAAAADEwODcEAAAAMTA4OAQA
+ AAAxMDg5BAAAADEwOTAEAAAAMTA5MQQAAAAxMDkyBAAAADEwOTMEAAAAMTA5NAQAAAAxMDk1BAAA
+ ADEwOTYEAAAAMTA5NwQAAAAxMDk4BAAAADEwOTkEAAAAMTEwMAQAAAAxMTAxBAAAADExMDIEAAAA
+ MTEwMwQAAAAxMTA0BAAAADExMDUEAAAAMTEwNgQAAAAxMTA3BAAAADExMDgEAAAAMTEwOQQAAAAx
+ MTEwBAAAADExMTEEAAAAMTExMgQAAAAxMTEzBAAAADExMTQEAAAAMTExNQQAAAAxMTE2BAAAADEx
+ MTcEAAAAMTExOAQAAAAxMTE5BAAAADExMjAEAAAAMTEyMQQAAAAxMTIyBAAAADExMjMEAAAAMTEy
+ NAQAAAAxMTI1BAAAADExMjYEAAAAMTEyNwQAAAAxMTI4BAAAADExMjkEAAAAMTEzMAQAAAAxMTMx
+ BAAAADExMzIEAAAAMTEzMwQAAAAxMTM0BAAAADExMzUEAAAAMTEzNgQAAAAxMTM3BAAAADExMzgE
+ AAAAMTEzOQQAAAAxMTQwBAAAADExNDEEAAAAMTE0MgQAAAAxMTQzBAAAADExNDQEAAAAMTE0NQQA
+ AAAxMTQ2BAAAADExNDcEAAAAMTE0OAQAAAAxMTQ5BAAAADExNTAEAAAAMTE1MQQAAAAxMTUyBAAA
+ ADExNTMEAAAAMTE1NAQAAAAxMTU1BAAAADExNTYEAAAAMTE1NwQAAAAxMTU4BAAAADExNTkEAAAA
+ MTE2MAQAAAAxMTYxBAAAADExNjIEAAAAMTE2MwQAAAAxMTY0BAAAADExNjUEAAAAMTE2NgQAAAAx
+ MTY3BAAAADExNjgEAAAAMTE2OQQAAAAxMTcwBAAAADExNzEEAAAAMTE3MgQAAAAxMTczBAAAADEx
+ NzQEAAAAMTE3NQQAAAAxMTc2BAAAADExNzcEAAAAMTE3OAQAAAAxMTc5BAAAADExODAEAAAAMTE4
+ MQQAAAAxMTgyBAAAADExODMEAAAAMTE4NAQAAAAxMTg1BAAAADExODYEAAAAMTE4NwQAAAAxMTg4
+ BAAAADExODkEAAAAMTE5MAQAAAAxMTkxBAAAADExOTIEAAAAMTE5MwQAAAAxMTk0BAAAADExOTUE
+ AAAAMTE5NgQAAAAxMTk3BAAAADExOTgEAAAAMTE5OQQAAAAxMjAwBAAAADEyMDEEAAAAMTIwMgQA
+ AAAxMjAzBAAAADEyMDQEAAAAMTIwNQQAAAAxMjA2BAAAADEyMDcEAAAAMTIwOAQAAAAxMjA5BAAA
+ ADEyMTAEAAAAMTIxMQQAAAAxMjEyBAAAADEyMTMEAAAAMTIxNAQAAAAxMjE1BAAAADEyMTYEAAAA
+ MTIxNwQAAAAxMjE4BAAAADEyMTkEAAAAMTIyMAQAAAAxMjIxBAAAADEyMjIEAAAAMTIyMwQAAAAx
+ MjI0BAAAADEyMjUEAAAAMTIyNgQAAAAxMjI3BAAAADEyMjgEAAAAMTIyOQQAAAAxMjMwBAAAADEy
+ MzEEAAAAMTIzMgQAAAAxMjMzBAAAADEyMzQEAAAAMTIzNQQAAAAxMjM2BAAAADEyMzcEAAAAMTIz
+ OAQAAAAxMjM5BAAAADEyNDAEAAAAMTI0MQQAAAAxMjQyBAAAADEyNDMEAAAAMTI0NAQAAAAxMjQ1
+ BAAAADEyNDYEAAAAMTI0NwQAAAAxMjQ4BAAAADEyNDkEAAAAMTI1MAQAAAAxMjUxBAAAADEyNTIE
+ AAAAMTI1MwQAAAAxMjU0BAAAADEyNTUEAAAAMTI1NgQAAAAxMjU3BAAAADEyNTgEAAAAMTI1OQQA
+ AAAxMjYwBAAAADEyNjEEAAAAMTI2MgQAAAAxMjYzBAAAADEyNjQEAAAAMTI2NQQAAAAxMjY2BAAA
+ ADEyNjcEAAAAMTI2OAQAAAAxMjY5BAAAADEyNzAEAAAAMTI3MQQAAAAxMjcyBAAAADEyNzMEAAAA
+ MTI3NAQAAAAxMjc1BAAAADEyNzYEAAAAMTI3NwQAAAAxMjc4BAAAADEyNzkEAAAAMTI4MAQAAAAx
+ MjgxBAAAADEyODIEAAAAMTI4MwQAAAAxMjg0BAAAADEyODUEAAAAMTI4NgQAAAAxMjg3BAAAADEy
+ ODgEAAAAMTI4OQQAAAAxMjkwBAAAADEyOTEEAAAAMTI5MgQAAAAxMjkzBAAAADEyOTQEAAAAMTI5
+ NQQAAAAxMjk2BAAAADEyOTcEAAAAMTI5OAQAAAAxMjk5BAAAADEzMDAEAAAAMTMwMQQAAAAxMzAy
+ BAAAADEzMDMEAAAAMTMwNAQAAAAxMzA1BAAAADEzMDYEAAAAMTMwNwQAAAAxMzA4BAAAADEzMDkE
+ AAAAMTMxMAQAAAAxMzExBAAAADEzMTIEAAAAMTMxMwQAAAAxMzE0BAAAADEzMTUEAAAAMTMxNgQA
+ AAAxMzE3BAAAADEzMTgEAAAAMTMxOQQAAAAxMzIwBAAAADEzMjEEAAAAMTMyMgQAAAAxMzIzBAAA
+ ADEzMjQEAAAAMTMyNQQAAAAxMzI2BAAAADEzMjcEAAAAMTMyOAQAAAAxMzI5BAAAADEzMzAEAAAA
+ MTMzMQQAAAAxMzMyBAAAADEzMzMEAAAAMTMzNAQAAAAxMzM1BAAAADEzMzYEAAAAMTMzNwQAAAAx
+ MzM4BAAAADEzMzkEAAAAMTM0MAQAAAAxMzQxBAAAADEzNDIEAAAAMTM0MwQAAAAxMzQ0BAAAADEz
+ NDUEAAAAMTM0NgQAAAAxMzQ3BAAAADEzNDgEAAAAMTM0OQQAAAAxMzUwBAAAADEzNTEEAAAAMTM1
+ MgQAAAAxMzUzBAAAADEzNTQEAAAAMTM1NQQAAAAxMzU2BAAAADEzNTcEAAAAMTM1OAQAAAAxMzU5
+ BAAAADEzNjAEAAAAMTM2MQQAAAAxMzYyBAAAADEzNjMEAAAAMTM2NAQAAAAxMzY1BAAAADEzNjYE
+ AAAAMTM2NwQAAAAxMzY4BAAAADEzNjkEAAAAMTM3MAQAAAAxMzcxBAAAADEzNzIEAAAAMTM3MwQA
+ AAAxMzc0BAAAADEzNzUEAAAAMTM3NgQAAAAxMzc3BAAAADEzNzgEAAAAMTM3OQQAAAAxMzgwBAAA
+ ADEzODEEAAAAMTM4MgQAAAAxMzgzBAAAADEzODQEAAAAMTM4NQQAAAAxMzg2BAAAADEzODcEAAAA
+ MTM4OAQAAAAxMzg5BAAAADEzOTAEAAAAMTM5MQQAAAAxMzkyBAAAADEzOTMEAAAAMTM5NAQAAAAx
+ Mzk1BAAAADEzOTYEAAAAMTM5NwQAAAAxMzk4BAAAADEzOTkEAAAAMTQwMAQAAAAxNDAxBAAAADE0
+ MDIEAAAAMTQwMwQAAAAxNDA0BAAAADE0MDUEAAAAMTQwNgQAAAAxNDA3BAAAADE0MDgEAAAAMTQw
+ OQQAAAAxNDEwBAAAADE0MTEEAAAAMTQxMgQAAAAxNDEzBAAAADE0MTQEAAAAMTQxNQQAAAAxNDE2
+ BAAAADE0MTcEAAAAMTQxOAQAAAAxNDE5BAAAADE0MjAEAAAAMTQyMQQAAAAxNDIyBAAAADE0MjME
+ AAAAMTQyNAQAAAAxNDI1BAAAADE0MjYEAAAAMTQyNwQAAAAxNDI4BAAAADE0MjkEAAAAMTQzMAQA
+ AAAxNDMxBAAAADE0MzIEAAAAMTQzMwQAAAAxNDM0BAAAADE0MzUEAAAAMTQzNgQAAAAxNDM3BAAA
+ ADE0MzgEAAAAMTQzOQQAAAAxNDQwBAAAADE0NDEEAAAAMTQ0MgQAAAAxNDQzBAAAADE0NDQEAAAA
+ MTQ0NQQAAAAxNDQ2BAAAADE0NDcEAAAAMTQ0OAQAAAAxNDQ5BAAAADE0NTAEAAAAMTQ1MQQAAAAx
+ NDUyBAAAADE0NTMEAAAAMTQ1NAQAAAAxNDU1BAAAADE0NTYEAAAAMTQ1NwQAAAAxNDU4BAAAADE0
+ NTkEAAAAMTQ2MAQAAAAxNDYxBAAAADE0NjIEAAAAMTQ2MwQAAAAxNDY0BAAAADE0NjUEAAAAMTQ2
+ NgQAAAAxNDY3BAAAADE0NjgEAAAAMTQ2OQQAAAAxNDcwBAAAADE0NzEEAAAAMTQ3MgQAAAAxNDcz
+ BAAAADE0NzQEAAAAMTQ3NQQAAAAxNDc2BAAAADE0NzcEAAAAMTQ3OAQAAAAxNDc5BAAAADE0ODAE
+ AAAAMTQ4MQQAAAAxNDgyBAAAADE0ODMEAAAAMTQ4NAQAAAAxNDg1BAAAADE0ODYEAAAAMTQ4NwQA
+ AAAxNDg4BAAAADE0ODkEAAAAMTQ5MAQAAAAxNDkxBAAAADE0OTIEAAAAMTQ5MwQAAAAxNDk0BAAA
+ ADE0OTUEAAAAMTQ5NgQAAAAxNDk3BAAAADE0OTgEAAAAMTQ5OQQAAAAxNTAwBAAAADE1MDEEAAAA
+ MTUwMgQAAAAxNTAzBAAAADE1MDQEAAAAMTUwNQQAAAAxNTA2BAAAADE1MDcEAAAAMTUwOAQAAAAx
+ NTA5BAAAADE1MTAEAAAAMTUxMQQAAAAxNTEyBAAAADE1MTMEAAAAMTUxNAQAAAAxNTE1BAAAADE1
+ MTYEAAAAMTUxNwQAAAAxNTE4BAAAADE1MTkEAAAAMTUyMAQAAAAxNTIxBAAAADE1MjIEAAAAMTUy
+ MwQAAAAxNTI0BAAAADE1MjUEAAAAMTUyNgQAAAAxNTI3BAAAADE1MjgEAAAAMTUyOQQAAAAxNTMw
+ BAAAADE1MzEEAAAAMTUzMgQAAAAxNTMzBAAAADE1MzQEAAAAMTUzNQQAAAAxNTM2BAAAADE1MzcE
+ AAAAMTUzOAQAAAAxNTM5BAAAADE1NDAEAAAAMTU0MQQAAAAxNTQyBAAAADE1NDMEAAAAMTU0NAQA
+ AAAxNTQ1BAAAADE1NDYEAAAAMTU0NwQAAAAxNTQ4BAAAADE1NDkEAAAAMTU1MAQAAAAxNTUxBAAA
+ ADE1NTIEAAAAMTU1MwQAAAAxNTU0BAAAADE1NTUEAAAAMTU1NgQAAAAxNTU3BAAAADE1NTgEAAAA
+ MTU1OQQAAAAxNTYwBAAAADE1NjEEAAAAMTU2MgQAAAAxNTYzBAAAADE1NjQEAAAAMTU2NQQAAAAx
+ NTY2BAAAADE1NjcEAAAAMTU2OAQAAAAxNTY5BAAAADE1NzAEAAAAMTU3MQQAAAAxNTcyBAAAADE1
+ NzMEAAAAMTU3NAQAAAAxNTc1BAAAADE1NzYEAAAAMTU3NwQAAAAxNTc4BAAAADE1NzkEAAAAMTU4
+ MAQAAAAxNTgxBAAAADE1ODIEAAAAMTU4MwQAAAAxNTg0BAAAADE1ODUEAAAAMTU4NgQAAAAxNTg3
+ BAAAADE1ODgEAAAAMTU4OQQAAAAxNTkwBAAAADE1OTEEAAAAMTU5MgQAAAAxNTkzBAAAADE1OTQE
+ AAAAMTU5NQQAAAAxNTk2BAAAADE1OTcEAAAAMTU5OAQAAAAxNTk5BAAAADE2MDAEAAAAMTYwMQQA
+ AAAxNjAyBAAAADE2MDMEAAAAMTYwNAQAAAAxNjA1BAAAADE2MDYEAAAAMTYwNwQAAAAxNjA4BAAA
+ ADE2MDkEAAAAMTYxMAQAAAAxNjExBAAAADE2MTIEAAAAMTYxMwQAAAAxNjE0BAAAADE2MTUEAAAA
+ MTYxNgQAAAAxNjE3BAAAADE2MTgEAAAAMTYxOQQAAAAxNjIwBAAAADE2MjEEAAAAMTYyMgQAAAAx
+ NjIzBAAAADE2MjQEAAAAMTYyNQQAAAAxNjI2BAAAADE2MjcEAAAAMTYyOAQAAAAxNjI5BAAAADE2
+ MzAEAAAAMTYzMQQAAAAxNjMyBAAAADE2MzMEAAAAMTYzNAQAAAAxNjM1BAAAADE2MzYEAAAAMTYz
+ NwQAAAAxNjM4BAAAADE2MzkEAAAAMTY0MAQAAAAxNjQxBAAAADE2NDIEAAAAMTY0MwQAAAAxNjQ0
+ BAAAADE2NDUEAAAAMTY0NgQAAAAxNjQ3BAAAADE2NDgEAAAAMTY0OQQAAAAxNjUwBAAAADE2NTEE
+ AAAAMTY1MgQAAAAxNjUzBAAAADE2NTQEAAAAMTY1NQQAAAAxNjU2BAAAADE2NTcEAAAAMTY1OAQA
+ AAAxNjU5BAAAADE2NjAEAAAAMTY2MQQAAAAxNjYyBAAAADE2NjMEAAAAMTY2NAQAAAAxNjY1BAAA
+ ADE2NjYEAAAAMTY2NwQAAAAxNjY4BAAAADE2NjkEAAAAMTY3MAQAAAAxNjcxBAAAADE2NzIEAAAA
+ MTY3MwQAAAAxNjc0BAAAADE2NzUEAAAAMTY3NgQAAAAxNjc3BAAAADE2NzgEAAAAMTY3OQQAAAAx
+ NjgwBAAAADE2ODEEAAAAMTY4MgQAAAAxNjgzBAAAADE2ODQEAAAAMTY4NQQAAAAxNjg2BAAAADE2
+ ODcEAAAAMTY4OAQAAAAxNjg5BAAAADE2OTAEAAAAMTY5MQQAAAAxNjkyBAAAADE2OTMEAAAAMTY5
+ NAQAAAAxNjk1BAAAADE2OTYEAAAAMTY5NwQAAAAxNjk4BAAAADE2OTkEAAAAMTcwMAQAAAAxNzAx
+ BAAAADE3MDIEAAAAMTcwMwQAAAAxNzA0BAAAADE3MDUEAAAAMTcwNgQAAAAxNzA3BAAAADE3MDgE
+ AAAAMTcwOQQAAAAxNzEwBAAAADE3MTEEAAAAMTcxMgQAAAAxNzEzBAAAADE3MTQEAAAAMTcxNQQA
+ AAAxNzE2BAAAADE3MTcEAAAAMTcxOAQAAAAxNzE5BAAAADE3MjAEAAAAMTcyMQQAAAAxNzIyBAAA
+ ADE3MjMEAAAAMTcyNAQAAAAxNzI1BAAAADE3MjYEAAAAMTcyNwQAAAAxNzI4BAAAADE3MjkEAAAA
+ MTczMAQAAAAxNzMxBAAAADE3MzIEAAAAMTczMwQAAAAxNzM0BAAAADE3MzUEAAAAMTczNgQAAAAx
+ NzM3BAAAADE3MzgEAAAAMTczOQQAAAAxNzQwBAAAADE3NDEEAAAAMTc0MgQAAAAxNzQzBAAAADE3
+ NDQEAAAAMTc0NQQAAAAxNzQ2BAAAADE3NDcEAAAAMTc0OAQAAAAxNzQ5BAAAADE3NTAEAAAAMTc1
+ MQQAAAAxNzUyBAAAADE3NTMEAAAAMTc1NAQAAAAxNzU1BAAAADE3NTYEAAAAMTc1NwQAAAAxNzU4
+ BAAAADE3NTkEAAAAMTc2MAQAAAAxNzYxBAAAADE3NjIEAAAAMTc2MwQAAAAxNzY0BAAAADE3NjUE
+ AAAAMTc2NgQAAAAxNzY3BAAAADE3NjgEAAAAMTc2OQQAAAAxNzcwBAAAADE3NzEEAAAAMTc3MgQA
+ AAAxNzczBAAAADE3NzQEAAAAMTc3NQQAAAAxNzc2BAAAADE3NzcEAAAAMTc3OAQAAAAxNzc5BAAA
+ ADE3ODAEAAAAMTc4MQQAAAAxNzgyBAAAADE3ODMEAAAAMTc4NAQAAAAxNzg1BAAAADE3ODYEAAAA
+ MTc4NwQAAAAxNzg4BAAAADE3ODkEAAAAMTc5MAQAAAAxNzkxBAAAADE3OTIEAAAAMTc5MwQAAAAx
+ Nzk0BAAAADE3OTUEAAAAMTc5NgQAAAAxNzk3BAAAADE3OTgEAAAAMTc5OQQAAAAxODAwBAAAADE4
+ MDEEAAAAMTgwMgQAAAAxODAzBAAAADE4MDQEAAAAMTgwNQQAAAAxODA2BAAAADE4MDcEAAAAMTgw
+ OAQAAAAxODA5BAAAADE4MTAEAAAAMTgxMQQAAAAxODEyBAAAADE4MTMEAAAAMTgxNAQAAAAxODE1
+ BAAAADE4MTYEAAAAMTgxNwQAAAAxODE4BAAAADE4MTkEAAAAMTgyMAQAAAAxODIxBAAAADE4MjIE
+ AAAAMTgyMwQAAAAxODI0BAAAADE4MjUEAAAAMTgyNgQAAAAxODI3BAAAADE4MjgEAAAAMTgyOQQA
+ AAAxODMwBAAAADE4MzEEAAAAMTgzMgQAAAAxODMzBAAAADE4MzQEAAAAMTgzNQQAAAAxODM2BAAA
+ ADE4MzcEAAAAMTgzOAQAAAAxODM5BAAAADE4NDAEAAAAMTg0MQQAAAAxODQyBAAAADE4NDMEAAAA
+ MTg0NAQAAAAxODQ1BAAAADE4NDYEAAAAMTg0NwQAAAAxODQ4BAAAADE4NDkEAAAAMTg1MAQAAAAx
+ ODUxBAAAADE4NTIEAAAAMTg1MwQAAAAxODU0BAAAADE4NTUEAAAAMTg1NgQAAAAxODU3BAAAADE4
+ NTgEAAAAMTg1OQQAAAAxODYwBAAAADE4NjEEAAAAMTg2MgQAAAAxODYzBAAAADE4NjQEAAAAMTg2
+ NQQAAAAxODY2BAAAADE4NjcEAAAAMTg2OAQAAAAxODY5BAAAADE4NzAEAAAAMTg3MQQAAAAxODcy
+ BAAAADE4NzMEAAAAMTg3NAQAAAAxODc1BAAAADE4NzYEAAAAMTg3NwQAAAAxODc4BAAAADE4NzkE
+ AAAAMTg4MAQAAAAxODgxBAAAADE4ODIEAAAAMTg4MwQAAAAxODg0BAAAADE4ODUEAAAAMTg4NgQA
+ AAAxODg3BAAAADE4ODgEAAAAMTg4OQQAAAAxODkwBAAAADE4OTEEAAAAMTg5MgQAAAAxODkzBAAA
+ ADE4OTQEAAAAMTg5NQQAAAAxODk2BAAAADE4OTcEAAAAMTg5OAQAAAAxODk5BAAAADE5MDAEAAAA
+ MTkwMQQAAAAxOTAyBAAAADE5MDMEAAAAMTkwNAQAAAAxOTA1BAAAADE5MDYEAAAAMTkwNwQAAAAx
+ OTA4BAAAADE5MDkEAAAAMTkxMAQAAAAxOTExBAAAADE5MTIEAAAAMTkxMwQAAAAxOTE0BAAAADE5
+ MTUEAAAAMTkxNgQAAAAxOTE3BAAAADE5MTgEAAAAMTkxOQQAAAAxOTIwBAAAADE5MjEEAAAAMTky
+ MgQAAAAxOTIzBAAAADE5MjQEAAAAMTkyNQQAAAAxOTI2BAAAADE5MjcEAAAAMTkyOAQAAAAxOTI5
+ BAAAADE5MzAEAAAAMTkzMQQAAAAxOTMyBAAAADE5MzMEAAAAMTkzNAQAAAAxOTM1BAAAADE5MzYE
+ AAAAMTkzNwQAAAAxOTM4BAAAADE5MzkEAAAAMTk0MAQAAAAxOTQxBAAAADE5NDIEAAAAMTk0MwQA
+ AAAxOTQ0BAAAADE5NDUEAAAAMTk0NgQAAAAxOTQ3BAAAADE5NDgEAAAAMTk0OQQAAAAxOTUwBAAA
+ ADE5NTEEAAAAMTk1MgQAAAAxOTUzBAAAADE5NTQEAAAAMTk1NQQAAAAxOTU2BAAAADE5NTcEAAAA
+ MTk1OAQAAAAxOTU5BAAAADE5NjAEAAAAMTk2MQQAAAAxOTYyBAAAADE5NjMEAAAAMTk2NAQAAAAx
+ OTY1BAAAADE5NjYEAAAAMTk2NwQAAAAxOTY4BAAAADE5NjkEAAAAMTk3MAQAAAAxOTcxBAAAADE5
+ NzIEAAAAMTk3MwQAAAAxOTc0BAAAADE5NzUEAAAAMTk3NgQAAAAxOTc3BAAAADE5NzgEAAAAMTk3
+ OQQAAAAxOTgwBAAAADE5ODEEAAAAMTk4MgQAAAAxOTgzBAAAADE5ODQEAAAAMTk4NQQAAAAxOTg2
+ BAAAADE5ODcEAAAAMTk4OAQAAAAxOTg5BAAAADE5OTAEAAAAMTk5MQQAAAAxOTkyBAAAADE5OTME
+ AAAAMTk5NAQAAAAxOTk1BAAAADE5OTYEAAAAMTk5NwQAAAAxOTk4BAAAADE5OTkVABWO+gEVjvoB
+ LBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1LjR5
+ YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5maGoMAAAAZG5zdGNwbHYuZWRr
+ DAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJlZXpmdGwubXEzDAAAAGdmdXg0
+ MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2tyDAAAAGV1emQxYjQxLmJxMgwA
+ AAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tmaXNkLnFqNQwAAAB2ZmtpbGsy
+ dS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwAAABhc2hvYXZvMS5vamYMAAAA
+ dWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1cy5wcDIMAAAAa3d3MTFwMmEu
+ ZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAAaTFiYnUyd2IuZGpqDAAAADJ5
+ dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20ubDQzDAAAAGFtcnRlMGxhLjJ0
+ cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5aGRjdnZsLnhieAwAAAB4ZDR3
+ MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtvcgwAAABzNHBtdTI0dC5ia3AM
+ AAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4d3dmNC5jMmsMAAAAMWpwMmls
+ d3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0MAAAAcnhlbnNva3UuamlmDAAA
+ AGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNiYXAubjJ4DAAAADVqd3Yyc2M1
+ LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAAADQzb3N5cjVuLmpzaQwAAAB1
+ NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZyLmlhZwwAAABleHJ0Z2xhMS4x
+ dTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAAByZ3BkYWx2dy5kaXgMAAAANW1p
+ b2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5zdW4MAAAAaHVobGZpdTMubG5q
+ DAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNtejVvNW0ueXVtDAAAAHN5ZGJq
+ cG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRmDAAAAG8zdHB2cmJkLmtncAwA
+ AABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2NpYWd6LmF1ZAwAAABwdWN5bWFl
+ di5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwAAAB3ZHRkcXRnYy5oNXAMAAAA
+ Y2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJpYS40amwMAAAAMmUzeWliNXku
+ b294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAAaXdramt2djQudWcyDAAAAGh4
+ aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEudjUzDAAAAHBzNHZqdHhwLnNj
+ NAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRoNG93YWFiLmh5cAwAAABiejR0
+ M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9jcAwAAAB6c2hjMXAxeC5yY2wM
+ AAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5mZGJveS5mdmEMAAAAdnp6MDJw
+ YWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUMAAAAYW1taWp6bjAuYXMxDAAA
+ AGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBxYWYuNDNzDAAAAHdybXpvaTFu
+ Lm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAAAGRkbjNmaXF0LmR6YwwAAABv
+ dXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBzLmJzYgwAAABmbWZ4cnRsZS5j
+ MXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2Z3l3bmt2Zi5hNHMMAAAAY2lu
+ eG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4xYmsMAAAAYTRzZDU0aW0ueWIz
+ DAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFjNXUzeHouNW5pDAAAAGlxYWYw
+ eHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90DAAAADFvY2FnM2Y1LnBxbQwA
+ AAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3RmamdsLmg0cAwAAAB1M2hyMGFn
+ NC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwAAAB1cjR4YjFtcC56dmUMAAAA
+ MjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZkNC53NGwMAAAAa25sYXRpYWcu
+ eTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAAbGVyeWt1dWUuYnl4DAAAAG9u
+ eDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQucG95DAAAAHkyc2FtZTR4LmZx
+ cwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1zcmt0ejNoLnJuaAwAAAB1YjR1
+ dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZleAwAAAB4aHExcTVrbC5ydDEM
+ AAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJjcHI1ZC5hc24MAAAAMXp5MzB6
+ M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYMAAAAdmhreTVrMGkuYm9pDAAA
+ AG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtlMTUuMzJlDAAAAHdtbXBobjNw
+ LjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAAAGwzbmdsYXQyLjIzeAwAAABy
+ NGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRnLmVvYwwAAAB6MDFjMm55ei55
+ ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABxcjNjbXluNS5vcGUMAAAAbTVj
+ dmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5zZjIMAAAAbWJ3Z2xiNTQuZWRi
+ DAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2VjYm5yankuMXdpDAAAADUydWFs
+ aGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2JwDAAAAGNjNTJhdmh1LnAxZQwA
+ AABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tvaWN0LnZ3YgwAAAB5dHRhaHdi
+ eS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwAAABleGZoeWIzby4ya3oMAAAA
+ NTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRtei4wcDAMAAAAZm9iZXcwbHgu
+ bnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAAaXVsM2d6eGouem9tDAAAAHY0
+ MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAuMjB2DAAAAGhkb3UwbTBpLnlv
+ dwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwycHp1MXBrLnBnbAwAAABjMWhv
+ cXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRsegwAAABkZ2l1ZXlmbS5taXMM
+ AAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXoxdm5kci5uNHAMAAAAdGFwdnB0
+ aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkMAAAAMDIwbG0xMGgud3dlDAAA
+ AGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4dHUubnAxDAAAADNjbGtrdmQy
+ LnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAAAGpvZXJnd3cyLm5mMgwAAAB2
+ MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1LmdmcwwAAAB3M2FrbGVxdS52
+ Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABjcmFmMGYwbC5icWQMAAAAcHBl
+ ZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5pYW8MAAAAbWQ1cXRwbXcub3pt
+ DAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4ZXZsdXIuZjBlDAAAADVoZ3p1
+ c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMxDAAAAHZveHV1b2ZxLm1jcQwA
+ AAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNvaW1uLnZsdgwAAABlMGQ0NGo0
+ ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwAAABheWFtY2RicS5zMHkMAAAA
+ Ynh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdjcS5sMzEMAAAAaG5mbzRwd2Iu
+ cjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAAb3pmNXIza2Eudnh2DAAAAGR6
+ dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXguNGNlDAAAAHVtdDAwcXZyLjJm
+ bwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRkeXp2bnFkLmNtcgwAAABhbXIy
+ ZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFiZQwAAAAwMWVid2p0bi53eXkM
+ AAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6MXN1Yi4wb2YMAAAAa3RsbXh4
+ ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gMAAAAMjFuNWl1bm4ubzFiDAAA
+ AHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2NkcGkucHphDAAAAG53dnRjcWIw
+ LmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAAAHJwbnZuenpyLm40cgwAAABu
+ a3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1LmpkMgwAAAB1a2RsMzAwZC5z
+ b3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABic2tqemJnYy41ajQMAAAANDNk
+ eml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54YmsMAAAAaWloZWVmbWYudnFt
+ DAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0NGVoNDMuZzV4DAAAAGp6cGZt
+ M21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBpDAAAAGxyYzJnNHNrLnJudwwA
+ AAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJuand6LmJ4eQwAAABwdGZieWxj
+ Yy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwAAAByajJyZGhhei5za3QMAAAA
+ Y3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBuby55eTIMAAAAYWh1cHFwMHou
+ d2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAAMGZncXVya3MuY2RhDAAAAHh3
+ MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wuZ2wzDAAAAHlmcnRtamViLnhz
+ cwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZqb3NnMDI0LmswdwwAAABxcGx0
+ cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6LmxkbQwAAABlMHF1dm5qYi5rbGYM
+ AAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2FrZnk0dy4xeWMMAAAAZ3N2bDA1
+ bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEMAAAANG5xMnBvY2YuM2RwDAAA
+ AHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFjNGoud3l0DAAAAG9waWt3aWpo
+ LnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAAAGF5NW5rMTN4LnJmdwwAAABl
+ bDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVlLmU1awwAAABoZGt3NWdnai5h
+ Zm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAyMnlodDV0cy40eHEMAAAAbXpt
+ MGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5mejIMAAAAdGkxM2M1MW8uNXps
+ DAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenpsZ3l4YTUuNHlhDAAAADVjNTI1
+ MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNhDAAAAG55dmVvc3gwLndvcAwA
+ AABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1azEzLmxwZQwAAABzZnFjNXJ3
+ eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwAAAB4MWZodmlrby5wcnoMAAAA
+ czM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1bS5iZXEMAAAAdHZyaDRuM2wu
+ a3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAAbWpscWlrc2wuYml1DAAAAHgz
+ cWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWoudGc1DAAAADUxcTRxa2duLmw1
+ dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1rbTJ0a2h0LnhheQwAAAA0bWJx
+ bjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndqcAwAAABmenlyNXlmbS5wZG8M
+ AAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0em90NC5yaG0MAAAAbjNqcDV2
+ Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwMAAAAcmRvMmxxYnEueXFsDAAA
+ AGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYxbWsucXdkDAAAAGp2bnRvZWY1
+ LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAAAGZ5NGFnMGgzLmR6ZAwAAABx
+ ZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4LmgwawwAAAA0Mm52c2k1dS4y
+ ZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3M3ZweGxyYy4yM3kMAAAAaGFp
+ Y2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5ocmwMAAAAc3k0YnhsdnIuYm14
+ DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3BvY3V3ZHUubjVwDAAAAGt2MHB2
+ dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3DAAAAHdiZ29md3phLmZxZAwA
+ AABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBkc3BhLjUzYgwAAABiaXBiaTVj
+ di5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwAAAB5eWFseW50Mi50bWEMAAAA
+ ZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3diYy5udGcMAAAAMnMya3Bjc2Mu
+ cW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAAd3hmMjVlZHAuaDBzDAAAAGUy
+ d3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcuYTRsDAAAADJncGFua2d4Lnlx
+ egwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRpd3Brb3MzLnp4ZgwAAAAwbmI1
+ Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnltegwAAABzem9yc2tlcS54cjQM
+ AAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRhZG51ci5uc2cMAAAAZDJnNWdk
+ MjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsMAAAAbDBtbXp2bTMuZGd5DAAA
+ AGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20za3MueG5oDAAAAHV6bHdlbGo0
+ LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAAADBha2Roam5rLmF3bAwAAABs
+ bHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJoLnRxcQwAAAAyc2l2YW5iaS5k
+ aHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2b3pnZXJmai5yd3YMAAAAY2py
+ MXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5qNGIMAAAAYWF1dHN2YnYucWRu
+ DAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJpYzF1YWQuMHJsDAAAAGp0YjVz
+ ZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1lDAAAAGR4cG4xa210LmtkbgwA
+ AABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJhejFvLnlqaQwAAAB1a2Z3aTNl
+ Yy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwAAAB5am1xaXlycC5ld2sMAAAA
+ Z3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJwaS5qZHAMAAAANXVsdGpweWQu
+ c3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAAMXdhZ2pyencueXRxDAAAAHlt
+ Y3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEuaGxlDAAAAHN1eG9vanFmLmxu
+ dQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEydTN1cmh5Lm5zeQwAAAAxeTJm
+ bHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJnegwAAABzeXRkd2J2aS5jd3oM
+ AAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1MTF6eC5jY2UMAAAAYnc1aW1p
+ YjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUMAAAAengzbWt0bzQuNXV5DAAA
+ AGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVkaDQudGJqDAAAADUwcmdoYmhi
+ LnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAAADQxYWQxdWFlLmRhdQwAAABk
+ ZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6LnZ6YgwAAABzZDF5cTU1Yy41
+ M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABkam4yZXczMC5lbmIMAAAAc3Uw
+ emdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40cHQMAAAAY2NjeGlicG0ud2Ji
+ DAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0bTJnYXoueXlmDAAAADN4aWJp
+ Y3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUyDAAAAGFmYm1peXU0Lnl6bwwA
+ AAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNtMTJrLmJkdAwAAABzMWVpa3hv
+ dy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwAAAB0ZnMxZmxrMy51ZGwMAAAA
+ ZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVxMi5yNWoMAAAAajBibmhleG8u
+ YWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAAMHRweTNjdnQuaDNiDAAAAHlr
+ MHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQuNGZtDAAAAGxyNDB0amIwLm8y
+ cwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHhtenhibnJnLmY1egwAAAB6bnFx
+ bWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxhagwAAABzNGJ4ejBndy51bTMM
+ AAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHExanlseC55cXkMAAAAMGV5Y3hm
+ d2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMMAAAAaWRmazE0aTUueG5tDAAA
+ AGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJjejIucXhtDAAAAGRoeXRzdXhl
+ LjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAAAHptcGVvbHkzLjR0MwwAAAB6
+ aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1LnpvcwwAAAB4cW5icmkwdC5t
+ bnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABjM3Qzd3IzMy5qY3gMAAAANXhq
+ a2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5lbnoMAAAAMnZseXYyYzUucWp1
+ DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2thY25xdHkuMnptDAAAAHcxdGs0
+ cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRwDAAAAHd1cmcyb2IzLjVjMwwA
+ AAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20zY24xLmNqegwAAABtYWZhdnRk
+ Yi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwAAAAxc3Jha291MS5rMG8MAAAA
+ YWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3by5hdnEMAAAAYTRkMWZleTIu
+ NXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAAaWcxNTFwZngua29tDAAAAHZ6
+ cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIudmZvDAAAAHpxbXB1aTRtLjNq
+ MwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8wazQxcTFtLmwydgwAAAA1Ymp5
+ dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZpNAwAAAA0ZGMzcnNteC4zMHEM
+ AAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhhZXFsMy5zMG4MAAAAZHlweWJ0
+ cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIMAAAAd2Qyc29zcHcuMWVpDAAA
+ ADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRxMWguZHpuDAAAAGpjMmJ4aHRu
+ Lmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAAADMyMjV2cXpoLms0YwwAAABr
+ b2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFyLjEyZgwAAAB5cnBucDJnZy5p
+ NGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABvdmdvaWs1cS54c3MMAAAAaW5x
+ cHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5xb3UMAAAAeXBicndkd3YubWFi
+ DAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1cTNzb3IubGRiDAAAAHFyeXJh
+ MWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhmDAAAAGZ4cTVmZHplLnJ1bwwA
+ AAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlwcmVoLnVueAwAAAB5c2ZocWpq
+ dS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwAAABsNXV2YTNoaC5oNHAMAAAA
+ cDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFhaC5hdW4MAAAAaHdwMDRjZnUu
+ bWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAAcnR3c2prd3MubzF3DAAAADNj
+ eXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUueGF0DAAAADM1ZmNndWpwLjNs
+ dAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBna29pNHZwLmI1dwwAAAAyZHli
+ ZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9yZgwAAAAxeGJxMjBudi5oM2YM
+ AAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0eDFiay53MDAMAAAAbDVmZnhk
+ YnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsMAAAAMWZ0bXhrYzMubGF0DAAA
+ AHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkxc2suMHAzDAAAAGJhbnJ4MWwx
+ LmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAAAHQzM2VjeHI0LmJpaQwAAABp
+ bHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZiLnluZgwAAABvMjJjYmV2bS5j
+ bGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABnM3dnMmJ0aS4yd2MMAAAAMWNv
+ NWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55bW4MAAAAMm95ZWVpajEuMXVs
+ DAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1eGJhZncubHp6DAAAADFwdDEy
+ ZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkzDAAAAGlua2kxbXB3LmhkMgwA
+ AABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1czR0Lnd2bwwAAAB5enVoaGdw
+ NS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwAAABta2JobmJyZS51djUMAAAA
+ eWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVnZC50MXkMAAAAZnZhbXQycWou
+ MWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAAYnpkbGhhMTEuczJyDAAAADVj
+ MWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEuemZtDAAAAG9kdzEwZ3RsLmFx
+ NAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBhY21pcjJnLnBkNAwAAABvbGdo
+ M2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVocAwAAAB0emt1bG5jaS5ndGcM
+ AAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVoYmNlci40d2QMAAAAMnFwcDNu
+ b2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkMAAAAemNlc2JuZW4uM3ZyDAAA
+ ADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9rZGEuM21zDAAAAHc1aGxwYXg1
+ Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAAAHNycjV2a2liLjN0NQwAAAB2
+ cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4LjAybQwAAABnMGgxZ3d5aC4y
+ NDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0c3Ayd3J2My40bzIMAAAAcXE1
+ Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5zMDQMAAAAZmRxdmdmNG8udGxs
+ DAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVpNXl0NGEuNHVhDAAAAHJmNGti
+ ZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6DAAAADFnYWI1dW1kLnN5ZAwA
+ AABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3aDU0LjVnZAwAAAAxYTIyZXBj
+ cS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwAAABqdmZ1MGRwMC4weXUMAAAA
+ Zmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201ei56dmIMAAAAMHd1d2VobW4u
+ bW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAAaG52cHdyMWUuaTRrDAAAAHNt
+ dG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubnguYmIzDAAAAGRvdmh5MXd4Lmhl
+ YgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVpZTF1dmJtLmxkZgwAAABqenBl
+ dXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlxNAwAAABtZXNsNXRldy40dmYM
+ AAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGhoZWEycy5rbG0MAAAAbnJ3cTVt
+ NWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUMAAAAeHkxZG4xMWkucDBsDAAA
+ AGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3bXcuemsxDAAAAGUxMHhwb2Jx
+ LmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAAAHAya3ZhZGNpLmpkYgwAAAB4
+ cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZqLmFlMwwAAAAxbmNmMmEwbC5s
+ MXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABhczNwcHNmdS5xd2IMAAAAdjBp
+ MXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56bGYMAAAAM3RnbzFnZnAuYnIx
+ DAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGphMnowMjEuNTJpDAAAAHBxdHpo
+ cmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBkDAAAAHgxYWxnZGVuLnd0dgwA
+ AABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpyb3p1LmZqaQwAAABtM20xZGIz
+ di5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwAAABjMnJxemk0bC5kdXIMAAAA
+ MjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2NyYy41d2kMAAAAMmhycWdzM28u
+ amkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAAamcxa2J2Y2cuYXR2DAAAADFq
+ cWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8uMGhtDAAAAHR1cnppcTRvLmpi
+ bgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZqemVlanEzLmsydwwAAABmcG01
+ bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5cAwAAABtMXhnb3oyay50Z3IM
+ AAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVsYWtzdC5wdXEMAAAAeWdvNGJ1
+ MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncMAAAAZGI1dm92cGoudXFzDAAA
+ ADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2YxanljZzMuajB2DAAAAGtiZHIwdzR1
+ LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAAADJjMGZ2c2UzLmt2eQwAAABw
+ ZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0LnU1egwAAAAwbDRkbWhxdC40
+ eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABlaTVjZ3BiMi5qdWEMAAAAZTVv
+ dWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54d28MAAAAdGRybWdoenoudGNi
+ DAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVrbG41MHcuNXM0DAAAAHh4NWx6
+ djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6DAAAADUzbXo1d2dvLnVsbQwA
+ AAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3MnlhLmJzawwAAAB6bzAxNW01
+ aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwAAAA1YjAzNXN5ZC4ybGcMAAAA
+ bHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFhdi52ZWwMAAAAcWRvb2t5eHYu
+ cnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAAc3ZqdW1uNXguNW9rDAAAADJ4
+ amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMueDRjDAAAAHl4amRnYnYwLm9s
+ aAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUydG92MmJ6LjVkaAwAAABrYzNx
+ MWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJnYwwAAABlamFydmxmaS41cDUM
+ AAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVraDB6Yy53MGQMAAAAejNwZm5h
+ eHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEMAAAANXB0dDV5MzQuNWhiDAAA
+ AGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBzamwuamQzDAAAADAzbGVnZHRv
+ Lmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAAAGJnaGJoa2VlLnRpcwwAAABy
+ azBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJuLnVwZwwAAABiZzJremkwZS53
+ cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABvYjFwMzUxbi54bWwMAAAAMGh1
+ a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5razAMAAAAd2pwYTFjMnIudmpx
+ DAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdhZGJpd2EuZnN0DAAAAGJ2cmdk
+ M2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wxDAAAAGFyZHBqbDNoLmJvYwwA
+ AAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41cXlzLnpwcwwAAABhNGVjZ3Zi
+ Yi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwAAAA0dHp0ZWRtbC54ZXcMAAAA
+ bXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5xYi5qcGUMAAAAc2g1dmdrM3Au
+ aHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAANWhmZ2NyanYuanJjDAAAAGlm
+ bGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUubHlpDAAAAHJ6aXc1MnViLmM0
+ ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVwdTF3aXN4LnhvaQwAAABoaGd4
+ ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRjMQwAAAB0cHNrdnJyMS5iczAM
+ AAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0ZmZwby50ZjQMAAAAdHM1c2N5
+ c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEMAAAAenZjMTMwZ3UuYjBpDAAA
+ AHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294NGgubWxqDAAAAHMyZ2JjNXBq
+ LnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAAAG1paHd2NWxhLmFmZwwAAABk
+ dGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBsLjFhaAwAAABzYmhia3Zhcy5q
+ Mm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABrZ2dwZzVzZS5nYWgMAAAAbTRj
+ aTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41YTAMAAAAc2Zka2VsbW0ub3Ry
+ DAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hhb2FhbzUuZjJ4DAAAAG40c3Jk
+ Zmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBzDAAAAGFkMGQ1dHJoLm0xdgwA
+ AAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2YnduMjAxLnIzNQwAAABveW5xaHd2
+ YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwAAABnY2FvZG1iYS56M3MMAAAA
+ andxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEwdS5peW0MAAAAM212NGw0NTEu
+ aGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAAdTNmZjVkdmIuZHozDAAAADVw
+ NWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24udjBhDAAAAGx3eW40d29jLmQy
+ ZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBheHpqbTRwLjJycQwAAABibXR1
+ eTBsaS4yZ2UVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpz
+ FgAW0A8YDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5m
+ aGoMAAAAZG5zdGNwbHYuZWRrDAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJl
+ ZXpmdGwubXEzDAAAAGdmdXg0MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2ty
+ DAAAAGV1emQxYjQxLmJxMgwAAAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tm
+ aXNkLnFqNQwAAAB2ZmtpbGsydS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwA
+ AABhc2hvYXZvMS5vamYMAAAAdWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1
+ cy5wcDIMAAAAa3d3MTFwMmEuZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAA
+ aTFiYnUyd2IuZGpqDAAAADJ5dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20u
+ bDQzDAAAAGFtcnRlMGxhLjJ0cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5
+ aGRjdnZsLnhieAwAAAB4ZDR3MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtv
+ cgwAAABzNHBtdTI0dC5ia3AMAAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4
+ d3dmNC5jMmsMAAAAMWpwMmlsd3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0M
+ AAAAcnhlbnNva3UuamlmDAAAAGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNi
+ YXAubjJ4DAAAADVqd3Yyc2M1LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAA
+ ADQzb3N5cjVuLmpzaQwAAAB1NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZy
+ LmlhZwwAAABleHJ0Z2xhMS4xdTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAABy
+ Z3BkYWx2dy5kaXgMAAAANW1pb2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5z
+ dW4MAAAAaHVobGZpdTMubG5qDAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNt
+ ejVvNW0ueXVtDAAAAHN5ZGJqcG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRm
+ DAAAAG8zdHB2cmJkLmtncAwAAABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2Np
+ YWd6LmF1ZAwAAABwdWN5bWFldi5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwA
+ AAB3ZHRkcXRnYy5oNXAMAAAAY2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJp
+ YS40amwMAAAAMmUzeWliNXkub294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAA
+ aXdramt2djQudWcyDAAAAGh4aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEu
+ djUzDAAAAHBzNHZqdHhwLnNjNAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRo
+ NG93YWFiLmh5cAwAAABiejR0M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9j
+ cAwAAAB6c2hjMXAxeC5yY2wMAAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5m
+ ZGJveS5mdmEMAAAAdnp6MDJwYWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUM
+ AAAAYW1taWp6bjAuYXMxDAAAAGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBx
+ YWYuNDNzDAAAAHdybXpvaTFuLm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAA
+ AGRkbjNmaXF0LmR6YwwAAABvdXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBz
+ LmJzYgwAAABmbWZ4cnRsZS5jMXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2
+ Z3l3bmt2Zi5hNHMMAAAAY2lueG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4x
+ YmsMAAAAYTRzZDU0aW0ueWIzDAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFj
+ NXUzeHouNW5pDAAAAGlxYWYweHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90
+ DAAAADFvY2FnM2Y1LnBxbQwAAAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3Rm
+ amdsLmg0cAwAAAB1M2hyMGFnNC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwA
+ AAB1cjR4YjFtcC56dmUMAAAAMjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZk
+ NC53NGwMAAAAa25sYXRpYWcueTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAA
+ bGVyeWt1dWUuYnl4DAAAAG9ueDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQu
+ cG95DAAAAHkyc2FtZTR4LmZxcwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1z
+ cmt0ejNoLnJuaAwAAAB1YjR1dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZl
+ eAwAAAB4aHExcTVrbC5ydDEMAAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJj
+ cHI1ZC5hc24MAAAAMXp5MzB6M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYM
+ AAAAdmhreTVrMGkuYm9pDAAAAG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtl
+ MTUuMzJlDAAAAHdtbXBobjNwLjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAA
+ AGwzbmdsYXQyLjIzeAwAAAByNGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRn
+ LmVvYwwAAAB6MDFjMm55ei55ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABx
+ cjNjbXluNS5vcGUMAAAAbTVjdmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5z
+ ZjIMAAAAbWJ3Z2xiNTQuZWRiDAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2Vj
+ Ym5yankuMXdpDAAAADUydWFsaGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2Jw
+ DAAAAGNjNTJhdmh1LnAxZQwAAABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tv
+ aWN0LnZ3YgwAAAB5dHRhaHdieS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwA
+ AABleGZoeWIzby4ya3oMAAAANTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRt
+ ei4wcDAMAAAAZm9iZXcwbHgubnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAA
+ aXVsM2d6eGouem9tDAAAAHY0MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAu
+ MjB2DAAAAGhkb3UwbTBpLnlvdwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwy
+ cHp1MXBrLnBnbAwAAABjMWhvcXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRs
+ egwAAABkZ2l1ZXlmbS5taXMMAAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXox
+ dm5kci5uNHAMAAAAdGFwdnB0aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkM
+ AAAAMDIwbG0xMGgud3dlDAAAAGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4
+ dHUubnAxDAAAADNjbGtrdmQyLnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAA
+ AGpvZXJnd3cyLm5mMgwAAAB2MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1
+ LmdmcwwAAAB3M2FrbGVxdS52Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABj
+ cmFmMGYwbC5icWQMAAAAcHBlZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5p
+ YW8MAAAAbWQ1cXRwbXcub3ptDAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4
+ ZXZsdXIuZjBlDAAAADVoZ3p1c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMx
+ DAAAAHZveHV1b2ZxLm1jcQwAAAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNv
+ aW1uLnZsdgwAAABlMGQ0NGo0ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwA
+ AABheWFtY2RicS5zMHkMAAAAYnh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdj
+ cS5sMzEMAAAAaG5mbzRwd2IucjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAA
+ b3pmNXIza2Eudnh2DAAAAGR6dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXgu
+ NGNlDAAAAHVtdDAwcXZyLjJmbwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRk
+ eXp2bnFkLmNtcgwAAABhbXIyZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFi
+ ZQwAAAAwMWVid2p0bi53eXkMAAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6
+ MXN1Yi4wb2YMAAAAa3RsbXh4ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gM
+ AAAAMjFuNWl1bm4ubzFiDAAAAHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2Nk
+ cGkucHphDAAAAG53dnRjcWIwLmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAA
+ AHJwbnZuenpyLm40cgwAAABua3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1
+ LmpkMgwAAAB1a2RsMzAwZC5zb3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABi
+ c2tqemJnYy41ajQMAAAANDNkeml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54
+ YmsMAAAAaWloZWVmbWYudnFtDAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0
+ NGVoNDMuZzV4DAAAAGp6cGZtM21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBp
+ DAAAAGxyYzJnNHNrLnJudwwAAAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJu
+ and6LmJ4eQwAAABwdGZieWxjYy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwA
+ AAByajJyZGhhei5za3QMAAAAY3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBu
+ by55eTIMAAAAYWh1cHFwMHoud2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAA
+ MGZncXVya3MuY2RhDAAAAHh3MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wu
+ Z2wzDAAAAHlmcnRtamViLnhzcwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZq
+ b3NnMDI0LmswdwwAAABxcGx0cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6Lmxk
+ bQwAAABlMHF1dm5qYi5rbGYMAAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2Fr
+ Znk0dy4xeWMMAAAAZ3N2bDA1bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEM
+ AAAANG5xMnBvY2YuM2RwDAAAAHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFj
+ NGoud3l0DAAAAG9waWt3aWpoLnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAA
+ AGF5NW5rMTN4LnJmdwwAAABlbDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVl
+ LmU1awwAAABoZGt3NWdnai5hZm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAy
+ MnlodDV0cy40eHEMAAAAbXptMGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5m
+ ejIMAAAAdGkxM2M1MW8uNXpsDAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenps
+ Z3l4YTUuNHlhDAAAADVjNTI1MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNh
+ DAAAAG55dmVvc3gwLndvcAwAAABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1
+ azEzLmxwZQwAAABzZnFjNXJ3eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwA
+ AAB4MWZodmlrby5wcnoMAAAAczM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1
+ bS5iZXEMAAAAdHZyaDRuM2wua3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAA
+ bWpscWlrc2wuYml1DAAAAHgzcWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWou
+ dGc1DAAAADUxcTRxa2duLmw1dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1r
+ bTJ0a2h0LnhheQwAAAA0bWJxbjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndq
+ cAwAAABmenlyNXlmbS5wZG8MAAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0
+ em90NC5yaG0MAAAAbjNqcDV2Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwM
+ AAAAcmRvMmxxYnEueXFsDAAAAGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYx
+ bWsucXdkDAAAAGp2bnRvZWY1LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAA
+ AGZ5NGFnMGgzLmR6ZAwAAABxZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4
+ LmgwawwAAAA0Mm52c2k1dS4yZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3
+ M3ZweGxyYy4yM3kMAAAAaGFpY2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5o
+ cmwMAAAAc3k0YnhsdnIuYm14DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3Bv
+ Y3V3ZHUubjVwDAAAAGt2MHB2dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3
+ DAAAAHdiZ29md3phLmZxZAwAAABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBk
+ c3BhLjUzYgwAAABiaXBiaTVjdi5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwA
+ AAB5eWFseW50Mi50bWEMAAAAZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3di
+ Yy5udGcMAAAAMnMya3Bjc2MucW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAA
+ d3hmMjVlZHAuaDBzDAAAAGUyd3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcu
+ YTRsDAAAADJncGFua2d4LnlxegwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRp
+ d3Brb3MzLnp4ZgwAAAAwbmI1Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnlt
+ egwAAABzem9yc2tlcS54cjQMAAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRh
+ ZG51ci5uc2cMAAAAZDJnNWdkMjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsM
+ AAAAbDBtbXp2bTMuZGd5DAAAAGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20z
+ a3MueG5oDAAAAHV6bHdlbGo0LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAA
+ ADBha2Roam5rLmF3bAwAAABsbHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJo
+ LnRxcQwAAAAyc2l2YW5iaS5kaHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2
+ b3pnZXJmai5yd3YMAAAAY2pyMXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5q
+ NGIMAAAAYWF1dHN2YnYucWRuDAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJp
+ YzF1YWQuMHJsDAAAAGp0YjVzZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1l
+ DAAAAGR4cG4xa210LmtkbgwAAABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJh
+ ejFvLnlqaQwAAAB1a2Z3aTNlYy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwA
+ AAB5am1xaXlycC5ld2sMAAAAZ3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJw
+ aS5qZHAMAAAANXVsdGpweWQuc3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAA
+ MXdhZ2pyencueXRxDAAAAHltY3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEu
+ aGxlDAAAAHN1eG9vanFmLmxudQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEy
+ dTN1cmh5Lm5zeQwAAAAxeTJmbHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJn
+ egwAAABzeXRkd2J2aS5jd3oMAAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1
+ MTF6eC5jY2UMAAAAYnc1aW1pYjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUM
+ AAAAengzbWt0bzQuNXV5DAAAAGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVk
+ aDQudGJqDAAAADUwcmdoYmhiLnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAA
+ ADQxYWQxdWFlLmRhdQwAAABkZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6
+ LnZ6YgwAAABzZDF5cTU1Yy41M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABk
+ am4yZXczMC5lbmIMAAAAc3UwemdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40
+ cHQMAAAAY2NjeGlicG0ud2JiDAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0
+ bTJnYXoueXlmDAAAADN4aWJpY3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUy
+ DAAAAGFmYm1peXU0Lnl6bwwAAAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNt
+ MTJrLmJkdAwAAABzMWVpa3hvdy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwA
+ AAB0ZnMxZmxrMy51ZGwMAAAAZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVx
+ Mi5yNWoMAAAAajBibmhleG8uYWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAA
+ MHRweTNjdnQuaDNiDAAAAHlrMHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQu
+ NGZtDAAAAGxyNDB0amIwLm8ycwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHht
+ enhibnJnLmY1egwAAAB6bnFxbWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxh
+ agwAAABzNGJ4ejBndy51bTMMAAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHEx
+ anlseC55cXkMAAAAMGV5Y3hmd2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMM
+ AAAAaWRmazE0aTUueG5tDAAAAGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJj
+ ejIucXhtDAAAAGRoeXRzdXhlLjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAA
+ AHptcGVvbHkzLjR0MwwAAAB6aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1
+ LnpvcwwAAAB4cW5icmkwdC5tbnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABj
+ M3Qzd3IzMy5qY3gMAAAANXhqa2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5l
+ bnoMAAAAMnZseXYyYzUucWp1DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2th
+ Y25xdHkuMnptDAAAAHcxdGs0cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRw
+ DAAAAHd1cmcyb2IzLjVjMwwAAAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20z
+ Y24xLmNqegwAAABtYWZhdnRkYi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwA
+ AAAxc3Jha291MS5rMG8MAAAAYWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3
+ by5hdnEMAAAAYTRkMWZleTIuNXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAA
+ aWcxNTFwZngua29tDAAAAHZ6cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIu
+ dmZvDAAAAHpxbXB1aTRtLjNqMwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8w
+ azQxcTFtLmwydgwAAAA1Ymp5dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZp
+ NAwAAAA0ZGMzcnNteC4zMHEMAAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhh
+ ZXFsMy5zMG4MAAAAZHlweWJ0cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIM
+ AAAAd2Qyc29zcHcuMWVpDAAAADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRx
+ MWguZHpuDAAAAGpjMmJ4aHRuLmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAA
+ ADMyMjV2cXpoLms0YwwAAABrb2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFy
+ LjEyZgwAAAB5cnBucDJnZy5pNGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABv
+ dmdvaWs1cS54c3MMAAAAaW5xcHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5x
+ b3UMAAAAeXBicndkd3YubWFiDAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1
+ cTNzb3IubGRiDAAAAHFyeXJhMWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhm
+ DAAAAGZ4cTVmZHplLnJ1bwwAAAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlw
+ cmVoLnVueAwAAAB5c2ZocWpqdS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwA
+ AABsNXV2YTNoaC5oNHAMAAAAcDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFh
+ aC5hdW4MAAAAaHdwMDRjZnUubWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAA
+ cnR3c2prd3MubzF3DAAAADNjeXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUu
+ eGF0DAAAADM1ZmNndWpwLjNsdAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBn
+ a29pNHZwLmI1dwwAAAAyZHliZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9y
+ ZgwAAAAxeGJxMjBudi5oM2YMAAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0
+ eDFiay53MDAMAAAAbDVmZnhkYnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsM
+ AAAAMWZ0bXhrYzMubGF0DAAAAHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkx
+ c2suMHAzDAAAAGJhbnJ4MWwxLmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAA
+ AHQzM2VjeHI0LmJpaQwAAABpbHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZi
+ LnluZgwAAABvMjJjYmV2bS5jbGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABn
+ M3dnMmJ0aS4yd2MMAAAAMWNvNWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55
+ bW4MAAAAMm95ZWVpajEuMXVsDAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1
+ eGJhZncubHp6DAAAADFwdDEyZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkz
+ DAAAAGlua2kxbXB3LmhkMgwAAABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1
+ czR0Lnd2bwwAAAB5enVoaGdwNS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwA
+ AABta2JobmJyZS51djUMAAAAeWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVn
+ ZC50MXkMAAAAZnZhbXQycWouMWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAA
+ YnpkbGhhMTEuczJyDAAAADVjMWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEu
+ emZtDAAAAG9kdzEwZ3RsLmFxNAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBh
+ Y21pcjJnLnBkNAwAAABvbGdoM2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVo
+ cAwAAAB0emt1bG5jaS5ndGcMAAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVo
+ YmNlci40d2QMAAAAMnFwcDNub2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkM
+ AAAAemNlc2JuZW4uM3ZyDAAAADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9r
+ ZGEuM21zDAAAAHc1aGxwYXg1Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAA
+ AHNycjV2a2liLjN0NQwAAAB2cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4
+ LjAybQwAAABnMGgxZ3d5aC4yNDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0
+ c3Ayd3J2My40bzIMAAAAcXE1Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5z
+ MDQMAAAAZmRxdmdmNG8udGxsDAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVp
+ NXl0NGEuNHVhDAAAAHJmNGtiZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6
+ DAAAADFnYWI1dW1kLnN5ZAwAAABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3
+ aDU0LjVnZAwAAAAxYTIyZXBjcS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwA
+ AABqdmZ1MGRwMC4weXUMAAAAZmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201
+ ei56dmIMAAAAMHd1d2VobW4ubW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAA
+ aG52cHdyMWUuaTRrDAAAAHNtdG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubngu
+ YmIzDAAAAGRvdmh5MXd4LmhlYgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVp
+ ZTF1dmJtLmxkZgwAAABqenBldXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlx
+ NAwAAABtZXNsNXRldy40dmYMAAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGho
+ ZWEycy5rbG0MAAAAbnJ3cTVtNWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUM
+ AAAAeHkxZG4xMWkucDBsDAAAAGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3
+ bXcuemsxDAAAAGUxMHhwb2JxLmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAA
+ AHAya3ZhZGNpLmpkYgwAAAB4cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZq
+ LmFlMwwAAAAxbmNmMmEwbC5sMXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABh
+ czNwcHNmdS5xd2IMAAAAdjBpMXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56
+ bGYMAAAAM3RnbzFnZnAuYnIxDAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGph
+ MnowMjEuNTJpDAAAAHBxdHpocmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBk
+ DAAAAHgxYWxnZGVuLnd0dgwAAABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpy
+ b3p1LmZqaQwAAABtM20xZGIzdi5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwA
+ AABjMnJxemk0bC5kdXIMAAAAMjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2Ny
+ Yy41d2kMAAAAMmhycWdzM28uamkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAA
+ amcxa2J2Y2cuYXR2DAAAADFqcWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8u
+ MGhtDAAAAHR1cnppcTRvLmpibgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZq
+ emVlanEzLmsydwwAAABmcG01bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5
+ cAwAAABtMXhnb3oyay50Z3IMAAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVs
+ YWtzdC5wdXEMAAAAeWdvNGJ1MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncM
+ AAAAZGI1dm92cGoudXFzDAAAADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2Yxanlj
+ ZzMuajB2DAAAAGtiZHIwdzR1LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAA
+ ADJjMGZ2c2UzLmt2eQwAAABwZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0
+ LnU1egwAAAAwbDRkbWhxdC40eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABl
+ aTVjZ3BiMi5qdWEMAAAAZTVvdWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54
+ d28MAAAAdGRybWdoenoudGNiDAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVr
+ bG41MHcuNXM0DAAAAHh4NWx6djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6
+ DAAAADUzbXo1d2dvLnVsbQwAAAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3
+ MnlhLmJzawwAAAB6bzAxNW01aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwA
+ AAA1YjAzNXN5ZC4ybGcMAAAAbHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFh
+ di52ZWwMAAAAcWRvb2t5eHYucnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAA
+ c3ZqdW1uNXguNW9rDAAAADJ4amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMu
+ eDRjDAAAAHl4amRnYnYwLm9saAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUy
+ dG92MmJ6LjVkaAwAAABrYzNxMWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJn
+ YwwAAABlamFydmxmaS41cDUMAAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVr
+ aDB6Yy53MGQMAAAAejNwZm5heHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEM
+ AAAANXB0dDV5MzQuNWhiDAAAAGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBz
+ amwuamQzDAAAADAzbGVnZHRvLmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAA
+ AGJnaGJoa2VlLnRpcwwAAAByazBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJu
+ LnVwZwwAAABiZzJremkwZS53cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABv
+ YjFwMzUxbi54bWwMAAAAMGh1a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5r
+ azAMAAAAd2pwYTFjMnIudmpxDAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdh
+ ZGJpd2EuZnN0DAAAAGJ2cmdkM2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wx
+ DAAAAGFyZHBqbDNoLmJvYwwAAAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41
+ cXlzLnpwcwwAAABhNGVjZ3ZiYi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwA
+ AAA0dHp0ZWRtbC54ZXcMAAAAbXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5x
+ Yi5qcGUMAAAAc2g1dmdrM3AuaHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAA
+ NWhmZ2NyanYuanJjDAAAAGlmbGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUu
+ bHlpDAAAAHJ6aXc1MnViLmM0ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVw
+ dTF3aXN4LnhvaQwAAABoaGd4ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRj
+ MQwAAAB0cHNrdnJyMS5iczAMAAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0
+ ZmZwby50ZjQMAAAAdHM1c2N5c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEM
+ AAAAenZjMTMwZ3UuYjBpDAAAAHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294
+ NGgubWxqDAAAAHMyZ2JjNXBqLnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAA
+ AG1paHd2NWxhLmFmZwwAAABkdGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBs
+ LjFhaAwAAABzYmhia3Zhcy5qMm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABr
+ Z2dwZzVzZS5nYWgMAAAAbTRjaTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41
+ YTAMAAAAc2Zka2VsbW0ub3RyDAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hh
+ b2FhbzUuZjJ4DAAAAG40c3JkZmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBz
+ DAAAAGFkMGQ1dHJoLm0xdgwAAAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2Yndu
+ MjAxLnIzNQwAAABveW5xaHd2YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwA
+ AABnY2FvZG1iYS56M3MMAAAAandxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEw
+ dS5peW0MAAAAM212NGw0NTEuaGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAA
+ dTNmZjVkdmIuZHozDAAAADVwNWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24u
+ djBhDAAAAGx3eW40d29jLmQyZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBh
+ eHpqbTRwLjJycQwAAABibXR1eTBsaS4yZ2UVAhlMSBVwYXJxdWV0LWRvdG5ldC1zY2hlbWEVBgAV
+ DCUCGAJpZCUAABUMJQIYB3N0cmluZzElAAAVDCUCGAdzdHJpbmcyJQAAFqAfGSwZPCYIHBUMGTUG
+ CAAZGAJpZBUAFtAPFrhsFrhsJgg8GAM5OTkYATAWABbQDxgDOTk5GAEwAAAAJsBsHBUMGTUGCAAZ
+ GAdzdHJpbmcxFQAW0A8WuPsBFrj7ASbAbDwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW
+ 0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAJvjnAhwVDBk1BggAGRgHc3RyaW5nMhUA
+ FtAPFrj7ARa4+wEm+OcCPBgMenpxMGtmeTQudmJuGAwwMXd3eWU0Zy5wZnMWABbQDxgMenpxMGtm
+ eTQudmJuGAwwMXd3eWU0Zy5wZnMAAAAWqOMEFtAPABk8JrDjBBwVDBk1BggAGRgCaWQVABbQDxb0
+ fRb0fSaw4wQ8GAQxOTk5GAQxMDAwFgAW0A8YBDE5OTkYBDEwMDAAAAAmpOEFHBUMGTUGCAAZGAdz
+ dHJpbmcxFQAW0A8WuPsBFrj7ASak4QU8GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cxYAFtAP
+ GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cwAAACbc3AccFQwZNQYIABkYB3N0cmluZzIVABbQ
+ Dxa4+wEWuPsBJtzcBzwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1
+ LjR5YRgMMDExY3FhbjQueXpzAAAAFuT0BBbQDwAoTFBhcnF1ZXQuTmV0IHZlcnNpb24gMy41LjMg
+ KGJ1aWxkICcwNTc0NTFiMzc2ZmE3ZDM1ODFmMmQxODAxZmIwOTY1YWZiZWFhMGMyJykAxQIAAFBB
+ UjE=
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '80087'
+ Content-Type:
+ - application/octet-stream
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-blob-type:
+ - BlockBlob
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:19:10 GMT
+ x-ms-encryption-algorithm:
+ - AES256
+ x-ms-version:
+ - '2020-08-04'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/utqqcontainercdb31860/csvfilecdb31860
+ response:
+ body:
+ string: ''
+ headers:
+ content-md5:
+ - z1EKaBGYeFFPXcMBK90K+w==
+ date:
+ - Fri, 09 Apr 2021 04:19:10 GMT
+ etag:
+ - '"0x8D8FB0EA01A1F5E"'
+ last-modified:
+ - Fri, 09 Apr 2021 04:19:10 GMT
+ server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ transfer-encoding:
+ - chunked
+ x-ms-content-crc64:
+ - f7IDcRFZujI=
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-08-04'
+ status:
+ code: 201
+ message: Created
+version: 1
diff --git a/sdk/storage/azure-storage-blob/tests/resources/parquet.parquet b/sdk/storage/azure-storage-blob/tests/resources/parquet.parquet
new file mode 100644
index 000000000000..8eff6678085d
Binary files /dev/null and b/sdk/storage/azure-storage-blob/tests/resources/parquet.parquet differ
diff --git a/sdk/storage/azure-storage-file-datalake/CHANGELOG.md b/sdk/storage/azure-storage-file-datalake/CHANGELOG.md
index 27ca17e21916..76a25521d857 100644
--- a/sdk/storage/azure-storage-file-datalake/CHANGELOG.md
+++ b/sdk/storage/azure-storage-file-datalake/CHANGELOG.md
@@ -1,5 +1,7 @@
# Release History
+## 12.4.0b1 (unreleased)
+
## 12.3.1 (2021-04-20)
**Fixes**
- Fixed `recursive=True` on file deletion
@@ -11,7 +13,6 @@
**New Features**
- Added `get_account_information()` API
-
## 12.3.0 (2021-03-01)
**Stable release of preview features**
- Added support for `DatalakeServiceClient.undelete_filesystem()`
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py
index 02a7559f5b27..459c4c07b44a 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py
@@ -36,6 +36,12 @@
AccessControlChangeCounters,
AccessControlChangeFailure,
AccessControlChanges,
+ AnalyticsLogging,
+ Metrics,
+ RetentionPolicy,
+ StaticWebsite,
+ CorsRule,
+ DeletedPathProperties
)
from ._shared_access_signature import generate_account_sas, generate_file_system_sas, generate_directory_sas, \
@@ -87,5 +93,11 @@
'DataLakeFileQueryError',
'ArrowDialect',
'ArrowType',
- 'DataLakeFileQueryError'
+ 'DataLakeFileQueryError',
+ 'AnalyticsLogging',
+ 'Metrics',
+ 'RetentionPolicy',
+ 'StaticWebsite',
+ 'CorsRule',
+ 'DeletedPathProperties'
]
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py
index f9e625c75119..5aa17894baf0 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py
@@ -3,7 +3,7 @@
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# --------------------------------------------------------------------------
-from typing import Any
+from typing import Optional, Dict, Any
try:
from urllib.parse import urlparse
@@ -15,6 +15,7 @@
from azure.storage.blob import BlobServiceClient
from ._shared.base_client import TransportWrapper, StorageAccountHostsMixin, parse_query, parse_connection_str
+from ._deserialize import get_datalake_service_properties
from ._file_system_client import FileSystemClient
from ._data_lake_directory_client import DataLakeDirectoryClient
from ._data_lake_file_client import DataLakeFileClient
@@ -462,7 +463,7 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str]
or an instance of FileProperties. eg. directory/subdirectory/file
:type file_path: str or ~azure.storage.filedatalake.FileProperties
:returns: A DataLakeFileClient.
- :rtype: ~azure.storage.filedatalake..DataLakeFileClient
+ :rtype: ~azure.storage.filedatalake.DataLakeFileClient
.. admonition:: Example:
@@ -492,3 +493,64 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str]
require_encryption=self.require_encryption,
key_encryption_key=self.key_encryption_key,
key_resolver_function=self.key_resolver_function)
+
+ def set_service_properties(self, **kwargs):
+ # type: (**Any) -> None
+ """Sets the properties of a storage account's Datalake service, including
+ Azure Storage Analytics.
+
+ .. versionadded:: 12.4.0
+ This operation was introduced in API version '2020-06-12'.
+
+ If an element (e.g. analytics_logging) is left as None, the
+ existing settings on the service for that functionality are preserved.
+
+ :keyword analytics_logging:
+ Groups the Azure Analytics Logging settings.
+ :type analytics_logging: ~azure.storage.filedatalake.AnalyticsLogging
+ :keyword hour_metrics:
+ The hour metrics settings provide a summary of request
+ statistics grouped by API in hourly aggregates.
+ :type hour_metrics: ~azure.storage.filedatalake.Metrics
+ :keyword minute_metrics:
+ The minute metrics settings provide request statistics
+ for each minute.
+ :type minute_metrics: ~azure.storage.filedatalake.Metrics
+ :keyword cors:
+ You can include up to five CorsRule elements in the
+ list. If an empty list is specified, all CORS rules will be deleted,
+ and CORS will be disabled for the service.
+ :type cors: list[~azure.storage.filedatalake.CorsRule]
+ :keyword str target_version:
+ Indicates the default version to use for requests if an incoming
+ request's version is not specified.
+ :keyword delete_retention_policy:
+ The delete retention policy specifies whether to retain deleted files/directories.
+ It also specifies the number of days and versions of file/directory to keep.
+ :type delete_retention_policy: ~azure.storage.filedatalake.RetentionPolicy
+ :keyword static_website:
+ Specifies whether the static website feature is enabled,
+ and if yes, indicates the index document and 404 error document to use.
+ :type static_website: ~azure.storage.filedatalake.StaticWebsite
+ :keyword int timeout:
+ The timeout parameter is expressed in seconds.
+ :rtype: None
+ """
+ return self._blob_service_client.set_service_properties(**kwargs) # pylint: disable=protected-access
+
+ def get_service_properties(self, **kwargs):
+ # type: (**Any) -> Dict[str, Any]
+ """Gets the properties of a storage account's datalake service, including
+ Azure Storage Analytics.
+
+ .. versionadded:: 12.4.0
+ This operation was introduced in API version '2020-06-12'.
+
+ :keyword int timeout:
+ The timeout parameter is expressed in seconds.
+ :returns: An object containing datalake service properties such as
+ analytics logging, hour/minute metrics, cors rules, etc.
+ :rtype: Dict[str, Any]
+ """
+ props = self._blob_service_client.get_service_properties(**kwargs) # pylint: disable=protected-access
+ return get_datalake_service_properties(props)
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py
index dfcaf8ef5dde..18ec80fd44f7 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py
@@ -12,7 +12,8 @@
from azure.core.pipeline.policies import ContentDecodePolicy
from azure.core.exceptions import HttpResponseError, DecodeError, ResourceModifiedError, ClientAuthenticationError, \
ResourceNotFoundError, ResourceExistsError
-from ._models import FileProperties, DirectoryProperties, LeaseProperties, PathProperties
+from ._models import FileProperties, DirectoryProperties, LeaseProperties, DeletedPathProperties, StaticWebsite, \
+ RetentionPolicy, Metrics, AnalyticsLogging, PathProperties # pylint: disable=protected-access
from ._shared.models import StorageErrorCode
if TYPE_CHECKING:
@@ -48,6 +49,34 @@ def deserialize_path_properties(path_list):
return [PathProperties._from_generated(path) for path in path_list] # pylint: disable=protected-access
+def get_deleted_path_properties_from_generated_code(generated):
+ deleted_path = DeletedPathProperties()
+ deleted_path.name = generated.name
+ deleted_path.deleted_time = generated.properties.deleted_time
+ deleted_path.remaining_retention_days = generated.properties.remaining_retention_days
+ deleted_path.deletion_id = generated.deletion_id
+ return deleted_path
+
+
+def is_file_path(_, __, headers):
+ if headers['x-ms-resource-type'] == "file":
+ return True
+ return False
+
+
+def get_datalake_service_properties(datalake_properties):
+ datalake_properties["analytics_logging"] = AnalyticsLogging._from_generated( # pylint: disable=protected-access
+ datalake_properties["analytics_logging"])
+ datalake_properties["hour_metrics"] = Metrics._from_generated(datalake_properties["hour_metrics"]) # pylint: disable=protected-access
+ datalake_properties["minute_metrics"] = Metrics._from_generated( # pylint: disable=protected-access
+ datalake_properties["minute_metrics"])
+ datalake_properties["delete_retention_policy"] = RetentionPolicy._from_generated( # pylint: disable=protected-access
+ datalake_properties["delete_retention_policy"])
+ datalake_properties["static_website"] = StaticWebsite._from_generated( # pylint: disable=protected-access
+ datalake_properties["static_website"])
+ return datalake_properties
+
+
def from_blob_properties(blob_properties):
file_props = FileProperties()
file_props.name = blob_properties.name
@@ -64,6 +93,7 @@ def from_blob_properties(blob_properties):
file_props.content_settings = blob_properties.content_settings
return file_props
+
def normalize_headers(headers):
normalized = {}
for key, value in headers.items():
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py
index 7c2b4aac5ae4..03aa9c71e8aa 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py
@@ -3,26 +3,32 @@
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# --------------------------------------------------------------------------
-from typing import Optional, Any
+import functools
+from typing import Optional, Any, Union
+
try:
- from urllib.parse import urlparse, quote
+ from urllib.parse import urlparse, quote, unquote
except ImportError:
from urlparse import urlparse # type: ignore
- from urllib2 import quote # type: ignore
-
+ from urllib2 import quote, unquote # type: ignore
import six
+
from azure.core.pipeline import Pipeline
+from azure.core.exceptions import HttpResponseError
from azure.core.paging import ItemPaged
from azure.storage.blob import ContainerClient
from ._shared.base_client import TransportWrapper, StorageAccountHostsMixin, parse_query, parse_connection_str
from ._serialize import convert_dfs_url_to_blob_url
-from ._models import LocationMode, FileSystemProperties, PublicAccess, FileProperties, DirectoryProperties
+from ._list_paths_helper import DeletedPathPropertiesPaged
+from ._models import LocationMode, FileSystemProperties, PublicAccess, DeletedPathProperties, FileProperties, \
+ DirectoryProperties
from ._data_lake_file_client import DataLakeFileClient
from ._data_lake_directory_client import DataLakeDirectoryClient
from ._data_lake_lease import DataLakeLeaseClient
from ._generated import AzureDataLakeStorageRESTAPI
-from ._deserialize import deserialize_path_properties
+from ._generated.models import ListBlobsIncludeItem
+from ._deserialize import deserialize_path_properties, process_storage_error, is_file_path
class FileSystemClient(StorageAccountHostsMixin):
@@ -99,6 +105,9 @@ def __init__(
# ADLS doesn't support secondary endpoint, make sure it's empty
self._hosts[LocationMode.SECONDARY] = ""
self._client = AzureDataLakeStorageRESTAPI(self.url, file_system=file_system_name, pipeline=self._pipeline)
+ self._datalake_client_for_blob_operation = AzureDataLakeStorageRESTAPI(self._container_client.url,
+ file_system=file_system_name,
+ pipeline=self._pipeline)
def _format_url(self, hostname):
file_system_name = self.file_system_name
@@ -741,6 +750,53 @@ def delete_file(self, file, # type: Union[FileProperties, str]
file_client.delete_file(**kwargs)
return file_client
+ def _undelete_path_options(self, deleted_path_name, deletion_id):
+ quoted_path = quote(unquote(deleted_path_name.strip('/')))
+
+ url_and_token = self.url.replace('.dfs.', '.blob.').split('?')
+ try:
+ url = url_and_token[0] + '/' + quoted_path + url_and_token[1]
+ except IndexError:
+ url = url_and_token[0] + '/' + quoted_path
+
+ undelete_source = quoted_path + '?deletionid={}'.format(deletion_id) if deletion_id else None
+
+ return quoted_path, url, undelete_source
+
+ def _undelete_path(self, deleted_path_name, deletion_id, **kwargs):
+ # type: (str, str, **Any) -> Union[DataLakeDirectoryClient, DataLakeFileClient]
+ """Restores soft-deleted path.
+
+ Operation will only be successful if used within the specified number of days
+ set in the delete retention policy.
+
+ .. versionadded:: 12.4.0
+ This operation was introduced in API version '2020-06-12'.
+
+ :param str deleted_path_name:
+ Specifies the path (file or directory) to restore.
+ :param str deletion_id:
+ Specifies the version of the deleted path to restore.
+ :keyword int timeout:
+ The timeout parameter is expressed in seconds.
+ :rtype: ~azure.storage.file.datalake.DataLakeDirectoryClient or azure.storage.file.datalake.DataLakeFileClient
+ """
+ _, url, undelete_source = self._undelete_path_options(deleted_path_name, deletion_id)
+
+ pipeline = Pipeline(
+ transport=TransportWrapper(self._pipeline._transport), # pylint: disable = protected-access
+ policies=self._pipeline._impl_policies # pylint: disable = protected-access
+ )
+ path_client = AzureDataLakeStorageRESTAPI(
+ url, filesystem=self.file_system_name, path=deleted_path_name, pipeline=pipeline)
+ try:
+ is_file = path_client.path.undelete(undelete_source=undelete_source, cls=is_file_path, **kwargs)
+ if is_file:
+ return self.get_file_client(deleted_path_name)
+ return self.get_directory_client(deleted_path_name)
+ except HttpResponseError as error:
+ process_storage_error(error)
+
def _get_root_directory_client(self):
# type: () -> DataLakeDirectoryClient
"""Get a client to interact with the root directory.
@@ -802,7 +858,7 @@ def get_file_client(self, file_path # type: Union[FileProperties, str]
or an instance of FileProperties. eg. directory/subdirectory/file
:type file_path: str or ~azure.storage.filedatalake.FileProperties
:returns: A DataLakeFileClient.
- :rtype: ~azure.storage.filedatalake..DataLakeFileClient
+ :rtype: ~azure.storage.filedatalake.DataLakeFileClient
.. admonition:: Example:
@@ -827,3 +883,35 @@ def get_file_client(self, file_path # type: Union[FileProperties, str]
require_encryption=self.require_encryption,
key_encryption_key=self.key_encryption_key,
key_resolver_function=self.key_resolver_function)
+
+ def list_deleted_paths(self, **kwargs):
+ # type: (Any) -> ItemPaged[DeletedPathProperties]
+ """Returns a generator to list the deleted (file or directory) paths under the specified file system.
+ The generator will lazily follow the continuation tokens returned by
+ the service.
+
+ .. versionadded:: 12.4.0
+ This operation was introduced in API version '2020-06-12'.
+
+ :keyword str path_prefix:
+ Filters the results to return only paths under the specified path.
+ :keyword int max_results:
+ An optional value that specifies the maximum number of items to return per page.
+ If omitted or greater than 5,000, the response will include up to 5,000 items per page.
+ :keyword int timeout:
+ The timeout parameter is expressed in seconds.
+ :returns: An iterable (auto-paging) response of DeletedPathProperties.
+ :rtype:
+ ~azure.core.paging.ItemPaged[~azure.storage.filedatalake.DeletedPathProperties]
+ """
+ path_prefix = kwargs.pop('path_prefix', None)
+ results_per_page = kwargs.pop('max_results', None)
+ timeout = kwargs.pop('timeout', None)
+ command = functools.partial(
+ self._datalake_client_for_blob_operation.file_system.list_blob_hierarchy_segment,
+ showonly=ListBlobsIncludeItem.deleted,
+ timeout=timeout,
+ **kwargs)
+ return ItemPaged(
+ command, prefix=path_prefix, page_iterator_class=DeletedPathPropertiesPaged,
+ results_per_page=results_per_page, **kwargs)
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py
index efb21f39026f..fbd0a7916e69 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py
@@ -15,6 +15,8 @@
# pylint: disable=unused-import,ungrouped-imports
from typing import Any
+ from azure.core.pipeline.transport import HttpRequest, HttpResponse
+
from ._configuration import AzureDataLakeStorageRESTAPIConfiguration
from .operations import ServiceOperations
from .operations import FileSystemOperations
@@ -57,6 +59,24 @@ def __init__(
self.path = PathOperations(
self._client, self._config, self._serialize, self._deserialize)
+ def _send_request(self, http_request, **kwargs):
+ # type: (HttpRequest, Any) -> HttpResponse
+ """Runs the network request through the client's chained policies.
+
+ :param http_request: The network request you want to make. Required.
+ :type http_request: ~azure.core.pipeline.transport.HttpRequest
+ :keyword bool stream: Whether the response payload will be streamed. Defaults to True.
+ :return: The response of your network call. Does not do error handling on your response.
+ :rtype: ~azure.core.pipeline.transport.HttpResponse
+ """
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ http_request.url = self._client.format_url(http_request.url, **path_format_arguments)
+ stream = kwargs.pop("stream", True)
+ pipeline_response = self._client._pipeline.run(http_request, stream=stream, **kwargs)
+ return pipeline_response.http_response
+
def close(self):
# type: () -> None
self._client.close()
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py
index e3dd7f17f1fd..3bfff366da7c 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py
@@ -39,7 +39,7 @@ def __init__(
self.url = url
self.resource = "filesystem"
- self.version = "2020-02-10"
+ self.version = "2020-06-12"
kwargs.setdefault('sdk_moniker', 'azuredatalakestoragerestapi/{}'.format(VERSION))
self._configure(**kwargs)
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py
index 662a749523a6..efeeeb3b5361 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py
@@ -9,6 +9,7 @@
from typing import Any
from azure.core import AsyncPipelineClient
+from azure.core.pipeline.transport import AsyncHttpResponse, HttpRequest
from msrest import Deserializer, Serializer
from ._configuration import AzureDataLakeStorageRESTAPIConfiguration
@@ -52,6 +53,23 @@ def __init__(
self.path = PathOperations(
self._client, self._config, self._serialize, self._deserialize)
+ async def _send_request(self, http_request: HttpRequest, **kwargs: Any) -> AsyncHttpResponse:
+ """Runs the network request through the client's chained policies.
+
+ :param http_request: The network request you want to make. Required.
+ :type http_request: ~azure.core.pipeline.transport.HttpRequest
+ :keyword bool stream: Whether the response payload will be streamed. Defaults to True.
+ :return: The response of your network call. Does not do error handling on your response.
+ :rtype: ~azure.core.pipeline.transport.AsyncHttpResponse
+ """
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ http_request.url = self._client.format_url(http_request.url, **path_format_arguments)
+ stream = kwargs.pop("stream", True)
+ pipeline_response = await self._client._pipeline.run(http_request, stream=stream, **kwargs)
+ return pipeline_response.http_response
+
async def close(self) -> None:
await self._client.close()
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py
index e23526fd6f27..82234727a630 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py
@@ -34,7 +34,7 @@ def __init__(
self.url = url
self.resource = "filesystem"
- self.version = "2020-02-10"
+ self.version = "2020-06-12"
kwargs.setdefault('sdk_moniker', 'azuredatalakestoragerestapi/{}'.format(VERSION))
self._configure(**kwargs)
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py
index b6732e350f3b..d4e206a6d054 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py
@@ -6,7 +6,7 @@
# Changes may cause incorrect behavior and will be lost if the code is regenerated.
# --------------------------------------------------------------------------
import datetime
-from typing import Any, AsyncIterable, Callable, Dict, Generic, Optional, TypeVar
+from typing import Any, AsyncIterable, Callable, Dict, Generic, List, Optional, TypeVar, Union
import warnings
from azure.core.async_paging import AsyncItemPaged, AsyncList
@@ -108,7 +108,7 @@ async def create(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -206,7 +206,7 @@ async def set_properties(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -276,7 +276,7 @@ async def get_properties(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -370,7 +370,7 @@ async def delete(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -443,8 +443,10 @@ def prepare_request(next_link=None, cont_token=None):
# Construct headers
header_parameters = {} # type: Dict[str, Any]
if request_id_parameter is not None:
- header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
- header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str')
+ header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter",
+ request_id_parameter, 'str')
+ header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version,
+ 'str')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
if not next_link:
@@ -456,7 +458,8 @@ def prepare_request(next_link=None, cont_token=None):
url = self._client.format_url(url, **path_format_arguments)
# Construct parameters
query_parameters = {} # type: Dict[str, Any]
- query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, 'str')
+ query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource,
+ 'str')
if timeout is not None:
query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0)
# TODO: change this once continuation/next_link autorest PR is merged
@@ -502,7 +505,7 @@ async def get_next(cont_token=None):
response = pipeline_response.http_response
if response.status_code not in [200]:
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
map_error(status_code=response.status_code, response=response, error_map=error_map)
raise HttpResponseError(response=response, model=error)
@@ -512,3 +515,117 @@ async def get_next(cont_token=None):
get_next, extract_data
)
list_paths.metadata = {'url': '/{filesystem}'} # type: ignore
+
+ async def list_blob_hierarchy_segment(
+ self,
+ prefix: Optional[str] = None,
+ delimiter: Optional[str] = None,
+ marker: Optional[str] = None,
+ max_results: Optional[int] = None,
+ include: Optional[List[Union[str, "_models.ListBlobsIncludeItem"]]] = None,
+ showonly: Optional[str] = "deleted",
+ timeout: Optional[int] = None,
+ request_id_parameter: Optional[str] = None,
+ **kwargs
+ ) -> "_models.ListBlobsHierarchySegmentResponse":
+ """The List Blobs operation returns a list of the blobs under the specified container.
+
+ :param prefix: Filters results to filesystems within the specified prefix.
+ :type prefix: str
+ :param delimiter: When the request includes this parameter, the operation returns a BlobPrefix
+ element in the response body that acts as a placeholder for all blobs whose names begin with
+ the same substring up to the appearance of the delimiter character. The delimiter may be a
+ single character or a string.
+ :type delimiter: str
+ :param marker: A string value that identifies the portion of the list of containers to be
+ returned with the next listing operation. The operation returns the NextMarker value within the
+ response body if the listing operation did not return all containers remaining to be listed
+ with the current page. The NextMarker value can be used as the value for the marker parameter
+ in a subsequent call to request the next page of list items. The marker value is opaque to the
+ client.
+ :type marker: str
+ :param max_results: An optional value that specifies the maximum number of items to return. If
+ omitted or greater than 5,000, the response will include up to 5,000 items.
+ :type max_results: int
+ :param include: Include this parameter to specify one or more datasets to include in the
+ response.
+ :type include: list[str or ~azure.storage.filedatalake.models.ListBlobsIncludeItem]
+ :param showonly: Include this parameter to specify one or more datasets to include in the
+ response.
+ :type showonly: str
+ :param timeout: The timeout parameter is expressed in seconds. For more information, see
+ :code:`Setting Timeouts for Blob Service Operations.`.
+ :type timeout: int
+ :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
+ limit that is recorded in the analytics logs when storage analytics logging is enabled.
+ :type request_id_parameter: str
+ :keyword callable cls: A custom type or function that will be passed the direct response
+ :return: ListBlobsHierarchySegmentResponse, or the result of cls(response)
+ :rtype: ~azure.storage.filedatalake.models.ListBlobsHierarchySegmentResponse
+ :raises: ~azure.core.exceptions.HttpResponseError
+ """
+ cls = kwargs.pop('cls', None) # type: ClsType["_models.ListBlobsHierarchySegmentResponse"]
+ error_map = {
+ 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
+ }
+ error_map.update(kwargs.pop('error_map', {}))
+ restype = "container"
+ comp = "list"
+ accept = "application/xml"
+
+ # Construct URL
+ url = self.list_blob_hierarchy_segment.metadata['url'] # type: ignore
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ url = self._client.format_url(url, **path_format_arguments)
+
+ # Construct parameters
+ query_parameters = {} # type: Dict[str, Any]
+ query_parameters['restype'] = self._serialize.query("restype", restype, 'str')
+ query_parameters['comp'] = self._serialize.query("comp", comp, 'str')
+ if prefix is not None:
+ query_parameters['prefix'] = self._serialize.query("prefix", prefix, 'str')
+ if delimiter is not None:
+ query_parameters['delimiter'] = self._serialize.query("delimiter", delimiter, 'str')
+ if marker is not None:
+ query_parameters['marker'] = self._serialize.query("marker", marker, 'str')
+ if max_results is not None:
+ query_parameters['maxResults'] = self._serialize.query("max_results", max_results, 'int', minimum=1)
+ if include is not None:
+ query_parameters['include'] = self._serialize.query("include", include, '[str]', div=',')
+ if showonly is not None:
+ query_parameters['showonly'] = self._serialize.query("showonly", showonly, 'str')
+ if timeout is not None:
+ query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0)
+
+ # Construct headers
+ header_parameters = {} # type: Dict[str, Any]
+ header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str')
+ if request_id_parameter is not None:
+ header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
+ header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
+
+ request = self._client.get(url, query_parameters, header_parameters)
+ pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
+ response = pipeline_response.http_response
+
+ if response.status_code not in [200]:
+ map_error(status_code=response.status_code, response=response, error_map=error_map)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
+ raise HttpResponseError(response=response, model=error)
+
+ response_headers = {}
+ response_headers['Content-Type']=self._deserialize('str', response.headers.get('Content-Type'))
+ response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id'))
+ response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id'))
+ response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version'))
+ response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date'))
+ deserialized = self._deserialize('ListBlobsHierarchySegmentResponse', pipeline_response)
+
+ if cls:
+ return cls(pipeline_response, deserialized, response_headers)
+
+ return deserialized
+ list_blob_hierarchy_segment.metadata = {'url': '/{filesystem}'} # type: ignore
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py
index b090bc10952e..7cec5890e122 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py
@@ -239,7 +239,7 @@ async def create(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -284,10 +284,10 @@ async def update(
Uploads data to be appended to a file, flushes (writes) previously uploaded data to a file,
sets properties for a file or directory, or sets access control for a file or directory. Data
- can only be appended to a file. This operation supports conditional HTTP requests. For more
- information, see `Specifying Conditional Headers for Blob Service Operations
- `_.
+ can only be appended to a file. Concurrent writes to the same file using multiple clients are
+ not supported. This operation supports conditional HTTP requests. For more information, see
+ `Specifying Conditional Headers for Blob Service Operations `_.
:param action: The action must be "append" to upload data to be appended to a file, "flush" to
flush previously uploaded data to a file, "setProperties" to set the properties of a file or
@@ -499,7 +499,7 @@ async def update(
if response.status_code not in [200, 202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -654,7 +654,7 @@ async def lease(
if response.status_code not in [200, 201, 202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -787,7 +787,7 @@ async def read(
if response.status_code not in [200, 206]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -947,7 +947,7 @@ async def get_properties(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1080,7 +1080,7 @@ async def delete(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1088,6 +1088,7 @@ async def delete(
response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id'))
response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version'))
response_headers['x-ms-continuation']=self._deserialize('str', response.headers.get('x-ms-continuation'))
+ response_headers['x-ms-deletion-id']=self._deserialize('str', response.headers.get('x-ms-deletion-id'))
if cls:
return cls(pipeline_response, None, response_headers)
@@ -1203,7 +1204,7 @@ async def set_access_control(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1313,7 +1314,7 @@ async def set_access_control_recursive(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1481,7 +1482,7 @@ async def flush_data(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1599,7 +1600,7 @@ async def append_data(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1680,7 +1681,7 @@ async def set_expiry(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1695,3 +1696,78 @@ async def set_expiry(
return cls(pipeline_response, None, response_headers)
set_expiry.metadata = {'url': '/{filesystem}/{path}'} # type: ignore
+
+ async def undelete(
+ self,
+ timeout: Optional[int] = None,
+ undelete_source: Optional[str] = None,
+ request_id_parameter: Optional[str] = None,
+ **kwargs
+ ) -> None:
+ """Undelete a path that was previously soft deleted.
+
+ :param timeout: The timeout parameter is expressed in seconds. For more information, see
+ :code:`Setting Timeouts for Blob Service Operations.`.
+ :type timeout: int
+ :param undelete_source: Only for hierarchical namespace enabled accounts. Optional. The path of
+ the soft deleted blob to undelete.
+ :type undelete_source: str
+ :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
+ limit that is recorded in the analytics logs when storage analytics logging is enabled.
+ :type request_id_parameter: str
+ :keyword callable cls: A custom type or function that will be passed the direct response
+ :return: None, or the result of cls(response)
+ :rtype: None
+ :raises: ~azure.core.exceptions.HttpResponseError
+ """
+ cls = kwargs.pop('cls', None) # type: ClsType[None]
+ error_map = {
+ 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
+ }
+ error_map.update(kwargs.pop('error_map', {}))
+ comp = "undelete"
+ accept = "application/json"
+
+ # Construct URL
+ url = self.undelete.metadata['url'] # type: ignore
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ url = self._client.format_url(url, **path_format_arguments)
+
+ # Construct parameters
+ query_parameters = {} # type: Dict[str, Any]
+ query_parameters['comp'] = self._serialize.query("comp", comp, 'str')
+ if timeout is not None:
+ query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0)
+
+ # Construct headers
+ header_parameters = {} # type: Dict[str, Any]
+ if undelete_source is not None:
+ header_parameters['x-ms-undelete-source'] = self._serialize.header("undelete_source", undelete_source, 'str')
+ header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str')
+ if request_id_parameter is not None:
+ header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
+ header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
+
+ request = self._client.put(url, query_parameters, header_parameters)
+ pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs)
+ response = pipeline_response.http_response
+
+ if response.status_code not in [200]:
+ map_error(status_code=response.status_code, response=response, error_map=error_map)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
+ raise HttpResponseError(response=response, model=error)
+
+ response_headers = {}
+ response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id'))
+ response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id'))
+ response_headers['x-ms-resource-type']=self._deserialize('str', response.headers.get('x-ms-resource-type'))
+ response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version'))
+ response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date'))
+
+ if cls:
+ return cls(pipeline_response, None, response_headers)
+
+ undelete.metadata = {'url': '/{filesystem}/{path}'} # type: ignore
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py
index b229c1208668..f8ae878a37c3 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py
@@ -136,7 +136,7 @@ async def get_next(next_link=None):
response = pipeline_response.http_response
if response.status_code not in [200]:
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
map_error(status_code=response.status_code, response=response, error_map=error_map)
raise HttpResponseError(response=response, model=error)
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py
index 769623c0eee9..fc4548f39b19 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py
@@ -8,9 +8,14 @@
try:
from ._models_py3 import AclFailedEntry
+ from ._models_py3 import BlobHierarchyListSegment
+ from ._models_py3 import BlobItemInternal
+ from ._models_py3 import BlobPrefix
+ from ._models_py3 import BlobPropertiesInternal
from ._models_py3 import FileSystem
from ._models_py3 import FileSystemList
from ._models_py3 import LeaseAccessConditions
+ from ._models_py3 import ListBlobsHierarchySegmentResponse
from ._models_py3 import ModifiedAccessConditions
from ._models_py3 import Path
from ._models_py3 import PathHTTPHeaders
@@ -18,12 +23,17 @@
from ._models_py3 import SetAccessControlRecursiveResponse
from ._models_py3 import SourceModifiedAccessConditions
from ._models_py3 import StorageError
- from ._models_py3 import StorageErrorAutoGenerated
+ from ._models_py3 import StorageErrorError
except (SyntaxError, ImportError):
from ._models import AclFailedEntry # type: ignore
+ from ._models import BlobHierarchyListSegment # type: ignore
+ from ._models import BlobItemInternal # type: ignore
+ from ._models import BlobPrefix # type: ignore
+ from ._models import BlobPropertiesInternal # type: ignore
from ._models import FileSystem # type: ignore
from ._models import FileSystemList # type: ignore
from ._models import LeaseAccessConditions # type: ignore
+ from ._models import ListBlobsHierarchySegmentResponse # type: ignore
from ._models import ModifiedAccessConditions # type: ignore
from ._models import Path # type: ignore
from ._models import PathHTTPHeaders # type: ignore
@@ -31,9 +41,10 @@
from ._models import SetAccessControlRecursiveResponse # type: ignore
from ._models import SourceModifiedAccessConditions # type: ignore
from ._models import StorageError # type: ignore
- from ._models import StorageErrorAutoGenerated # type: ignore
+ from ._models import StorageErrorError # type: ignore
from ._azure_data_lake_storage_restapi_enums import (
+ ListBlobsIncludeItem,
PathExpiryOptions,
PathGetPropertiesAction,
PathLeaseAction,
@@ -45,9 +56,14 @@
__all__ = [
'AclFailedEntry',
+ 'BlobHierarchyListSegment',
+ 'BlobItemInternal',
+ 'BlobPrefix',
+ 'BlobPropertiesInternal',
'FileSystem',
'FileSystemList',
'LeaseAccessConditions',
+ 'ListBlobsHierarchySegmentResponse',
'ModifiedAccessConditions',
'Path',
'PathHTTPHeaders',
@@ -55,7 +71,8 @@
'SetAccessControlRecursiveResponse',
'SourceModifiedAccessConditions',
'StorageError',
- 'StorageErrorAutoGenerated',
+ 'StorageErrorError',
+ 'ListBlobsIncludeItem',
'PathExpiryOptions',
'PathGetPropertiesAction',
'PathLeaseAction',
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py
index e9fe9d71a62c..804050e9e0d0 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py
@@ -26,6 +26,16 @@ def __getattr__(cls, name):
raise AttributeError(name)
+class ListBlobsIncludeItem(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)):
+
+ COPY = "copy"
+ DELETED = "deleted"
+ METADATA = "metadata"
+ SNAPSHOTS = "snapshots"
+ UNCOMMITTEDBLOBS = "uncommittedblobs"
+ VERSIONS = "versions"
+ TAGS = "tags"
+
class PathExpiryOptions(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)):
NEVER_EXPIRE = "NeverExpire"
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py
index 099e37c53bb2..237617a48a13 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py
@@ -37,6 +37,263 @@ def __init__(
self.error_message = kwargs.get('error_message', None)
+class BlobHierarchyListSegment(msrest.serialization.Model):
+ """BlobHierarchyListSegment.
+
+ All required parameters must be populated in order to send to Azure.
+
+ :param blob_prefixes:
+ :type blob_prefixes: list[~azure.storage.filedatalake.models.BlobPrefix]
+ :param blob_items: Required.
+ :type blob_items: list[~azure.storage.filedatalake.models.BlobItemInternal]
+ """
+
+ _validation = {
+ 'blob_items': {'required': True},
+ }
+
+ _attribute_map = {
+ 'blob_prefixes': {'key': 'BlobPrefixes', 'type': '[BlobPrefix]'},
+ 'blob_items': {'key': 'BlobItems', 'type': '[BlobItemInternal]'},
+ }
+ _xml_map = {
+ 'name': 'Blobs'
+ }
+
+ def __init__(
+ self,
+ **kwargs
+ ):
+ super(BlobHierarchyListSegment, self).__init__(**kwargs)
+ self.blob_prefixes = kwargs.get('blob_prefixes', None)
+ self.blob_items = kwargs['blob_items']
+
+
+class BlobItemInternal(msrest.serialization.Model):
+ """An Azure Storage blob.
+
+ All required parameters must be populated in order to send to Azure.
+
+ :param name: Required.
+ :type name: str
+ :param deleted: Required.
+ :type deleted: bool
+ :param snapshot: Required.
+ :type snapshot: str
+ :param version_id:
+ :type version_id: str
+ :param is_current_version:
+ :type is_current_version: bool
+ :param properties: Required. Properties of a blob.
+ :type properties: ~azure.storage.filedatalake.models.BlobPropertiesInternal
+ :param deletion_id:
+ :type deletion_id: str
+ """
+
+ _validation = {
+ 'name': {'required': True},
+ 'deleted': {'required': True},
+ 'snapshot': {'required': True},
+ 'properties': {'required': True},
+ }
+
+ _attribute_map = {
+ 'name': {'key': 'Name', 'type': 'str'},
+ 'deleted': {'key': 'Deleted', 'type': 'bool'},
+ 'snapshot': {'key': 'Snapshot', 'type': 'str'},
+ 'version_id': {'key': 'VersionId', 'type': 'str'},
+ 'is_current_version': {'key': 'IsCurrentVersion', 'type': 'bool'},
+ 'properties': {'key': 'Properties', 'type': 'BlobPropertiesInternal'},
+ 'deletion_id': {'key': 'DeletionId', 'type': 'str'},
+ }
+ _xml_map = {
+ 'name': 'Blob'
+ }
+
+ def __init__(
+ self,
+ **kwargs
+ ):
+ super(BlobItemInternal, self).__init__(**kwargs)
+ self.name = kwargs['name']
+ self.deleted = kwargs['deleted']
+ self.snapshot = kwargs['snapshot']
+ self.version_id = kwargs.get('version_id', None)
+ self.is_current_version = kwargs.get('is_current_version', None)
+ self.properties = kwargs['properties']
+ self.deletion_id = kwargs.get('deletion_id', None)
+
+
+class BlobPrefix(msrest.serialization.Model):
+ """BlobPrefix.
+
+ All required parameters must be populated in order to send to Azure.
+
+ :param name: Required.
+ :type name: str
+ """
+
+ _validation = {
+ 'name': {'required': True},
+ }
+
+ _attribute_map = {
+ 'name': {'key': 'Name', 'type': 'str'},
+ }
+
+ def __init__(
+ self,
+ **kwargs
+ ):
+ super(BlobPrefix, self).__init__(**kwargs)
+ self.name = kwargs['name']
+
+
+class BlobPropertiesInternal(msrest.serialization.Model):
+ """Properties of a blob.
+
+ All required parameters must be populated in order to send to Azure.
+
+ :param creation_time:
+ :type creation_time: ~datetime.datetime
+ :param last_modified: Required.
+ :type last_modified: ~datetime.datetime
+ :param etag: Required.
+ :type etag: str
+ :param content_length: Size in bytes.
+ :type content_length: long
+ :param content_type:
+ :type content_type: str
+ :param content_encoding:
+ :type content_encoding: str
+ :param content_language:
+ :type content_language: str
+ :param content_md5:
+ :type content_md5: bytearray
+ :param content_disposition:
+ :type content_disposition: str
+ :param cache_control:
+ :type cache_control: str
+ :param blob_sequence_number:
+ :type blob_sequence_number: long
+ :param copy_id:
+ :type copy_id: str
+ :param copy_source:
+ :type copy_source: str
+ :param copy_progress:
+ :type copy_progress: str
+ :param copy_completion_time:
+ :type copy_completion_time: ~datetime.datetime
+ :param copy_status_description:
+ :type copy_status_description: str
+ :param server_encrypted:
+ :type server_encrypted: bool
+ :param incremental_copy:
+ :type incremental_copy: bool
+ :param destination_snapshot:
+ :type destination_snapshot: str
+ :param deleted_time:
+ :type deleted_time: ~datetime.datetime
+ :param remaining_retention_days:
+ :type remaining_retention_days: int
+ :param access_tier_inferred:
+ :type access_tier_inferred: bool
+ :param customer_provided_key_sha256:
+ :type customer_provided_key_sha256: str
+ :param encryption_scope: The name of the encryption scope under which the blob is encrypted.
+ :type encryption_scope: str
+ :param access_tier_change_time:
+ :type access_tier_change_time: ~datetime.datetime
+ :param tag_count:
+ :type tag_count: int
+ :param expires_on:
+ :type expires_on: ~datetime.datetime
+ :param is_sealed:
+ :type is_sealed: bool
+ :param last_accessed_on:
+ :type last_accessed_on: ~datetime.datetime
+ :param delete_time:
+ :type delete_time: ~datetime.datetime
+ """
+
+ _validation = {
+ 'last_modified': {'required': True},
+ 'etag': {'required': True},
+ }
+
+ _attribute_map = {
+ 'creation_time': {'key': 'Creation-Time', 'type': 'rfc-1123'},
+ 'last_modified': {'key': 'Last-Modified', 'type': 'rfc-1123'},
+ 'etag': {'key': 'Etag', 'type': 'str'},
+ 'content_length': {'key': 'Content-Length', 'type': 'long'},
+ 'content_type': {'key': 'Content-Type', 'type': 'str'},
+ 'content_encoding': {'key': 'Content-Encoding', 'type': 'str'},
+ 'content_language': {'key': 'Content-Language', 'type': 'str'},
+ 'content_md5': {'key': 'Content-MD5', 'type': 'bytearray'},
+ 'content_disposition': {'key': 'Content-Disposition', 'type': 'str'},
+ 'cache_control': {'key': 'Cache-Control', 'type': 'str'},
+ 'blob_sequence_number': {'key': 'x-ms-blob-sequence-number', 'type': 'long'},
+ 'copy_id': {'key': 'CopyId', 'type': 'str'},
+ 'copy_source': {'key': 'CopySource', 'type': 'str'},
+ 'copy_progress': {'key': 'CopyProgress', 'type': 'str'},
+ 'copy_completion_time': {'key': 'CopyCompletionTime', 'type': 'rfc-1123'},
+ 'copy_status_description': {'key': 'CopyStatusDescription', 'type': 'str'},
+ 'server_encrypted': {'key': 'ServerEncrypted', 'type': 'bool'},
+ 'incremental_copy': {'key': 'IncrementalCopy', 'type': 'bool'},
+ 'destination_snapshot': {'key': 'DestinationSnapshot', 'type': 'str'},
+ 'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'},
+ 'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'},
+ 'access_tier_inferred': {'key': 'AccessTierInferred', 'type': 'bool'},
+ 'customer_provided_key_sha256': {'key': 'CustomerProvidedKeySha256', 'type': 'str'},
+ 'encryption_scope': {'key': 'EncryptionScope', 'type': 'str'},
+ 'access_tier_change_time': {'key': 'AccessTierChangeTime', 'type': 'rfc-1123'},
+ 'tag_count': {'key': 'TagCount', 'type': 'int'},
+ 'expires_on': {'key': 'Expiry-Time', 'type': 'rfc-1123'},
+ 'is_sealed': {'key': 'Sealed', 'type': 'bool'},
+ 'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'},
+ 'delete_time': {'key': 'DeleteTime', 'type': 'rfc-1123'},
+ }
+ _xml_map = {
+ 'name': 'Properties'
+ }
+
+ def __init__(
+ self,
+ **kwargs
+ ):
+ super(BlobPropertiesInternal, self).__init__(**kwargs)
+ self.creation_time = kwargs.get('creation_time', None)
+ self.last_modified = kwargs['last_modified']
+ self.etag = kwargs['etag']
+ self.content_length = kwargs.get('content_length', None)
+ self.content_type = kwargs.get('content_type', None)
+ self.content_encoding = kwargs.get('content_encoding', None)
+ self.content_language = kwargs.get('content_language', None)
+ self.content_md5 = kwargs.get('content_md5', None)
+ self.content_disposition = kwargs.get('content_disposition', None)
+ self.cache_control = kwargs.get('cache_control', None)
+ self.blob_sequence_number = kwargs.get('blob_sequence_number', None)
+ self.copy_id = kwargs.get('copy_id', None)
+ self.copy_source = kwargs.get('copy_source', None)
+ self.copy_progress = kwargs.get('copy_progress', None)
+ self.copy_completion_time = kwargs.get('copy_completion_time', None)
+ self.copy_status_description = kwargs.get('copy_status_description', None)
+ self.server_encrypted = kwargs.get('server_encrypted', None)
+ self.incremental_copy = kwargs.get('incremental_copy', None)
+ self.destination_snapshot = kwargs.get('destination_snapshot', None)
+ self.deleted_time = kwargs.get('deleted_time', None)
+ self.remaining_retention_days = kwargs.get('remaining_retention_days', None)
+ self.access_tier_inferred = kwargs.get('access_tier_inferred', None)
+ self.customer_provided_key_sha256 = kwargs.get('customer_provided_key_sha256', None)
+ self.encryption_scope = kwargs.get('encryption_scope', None)
+ self.access_tier_change_time = kwargs.get('access_tier_change_time', None)
+ self.tag_count = kwargs.get('tag_count', None)
+ self.expires_on = kwargs.get('expires_on', None)
+ self.is_sealed = kwargs.get('is_sealed', None)
+ self.last_accessed_on = kwargs.get('last_accessed_on', None)
+ self.delete_time = kwargs.get('delete_time', None)
+
+
class FileSystem(msrest.serialization.Model):
"""FileSystem.
@@ -103,6 +360,64 @@ def __init__(
self.lease_id = kwargs.get('lease_id', None)
+class ListBlobsHierarchySegmentResponse(msrest.serialization.Model):
+ """An enumeration of blobs.
+
+ All required parameters must be populated in order to send to Azure.
+
+ :param service_endpoint: Required.
+ :type service_endpoint: str
+ :param container_name: Required.
+ :type container_name: str
+ :param prefix:
+ :type prefix: str
+ :param marker:
+ :type marker: str
+ :param max_results:
+ :type max_results: int
+ :param delimiter:
+ :type delimiter: str
+ :param segment: Required.
+ :type segment: ~azure.storage.filedatalake.models.BlobHierarchyListSegment
+ :param next_marker:
+ :type next_marker: str
+ """
+
+ _validation = {
+ 'service_endpoint': {'required': True},
+ 'container_name': {'required': True},
+ 'segment': {'required': True},
+ }
+
+ _attribute_map = {
+ 'service_endpoint': {'key': 'ServiceEndpoint', 'type': 'str', 'xml': {'attr': True}},
+ 'container_name': {'key': 'ContainerName', 'type': 'str', 'xml': {'attr': True}},
+ 'prefix': {'key': 'Prefix', 'type': 'str'},
+ 'marker': {'key': 'Marker', 'type': 'str'},
+ 'max_results': {'key': 'MaxResults', 'type': 'int'},
+ 'delimiter': {'key': 'Delimiter', 'type': 'str'},
+ 'segment': {'key': 'Segment', 'type': 'BlobHierarchyListSegment'},
+ 'next_marker': {'key': 'NextMarker', 'type': 'str'},
+ }
+ _xml_map = {
+ 'name': 'EnumerationResults'
+ }
+
+ def __init__(
+ self,
+ **kwargs
+ ):
+ super(ListBlobsHierarchySegmentResponse, self).__init__(**kwargs)
+ self.service_endpoint = kwargs['service_endpoint']
+ self.container_name = kwargs['container_name']
+ self.prefix = kwargs.get('prefix', None)
+ self.marker = kwargs.get('marker', None)
+ self.max_results = kwargs.get('max_results', None)
+ self.delimiter = kwargs.get('delimiter', None)
+ self.segment = kwargs['segment']
+ self.next_marker = kwargs.get('next_marker', None)
+
+
class ModifiedAccessConditions(msrest.serialization.Model):
"""Parameter group.
@@ -319,11 +634,11 @@ class StorageError(msrest.serialization.Model):
"""StorageError.
:param error: The service error response object.
- :type error: ~azure.storage.filedatalake.models.StorageErrorAutoGenerated
+ :type error: ~azure.storage.filedatalake.models.StorageErrorError
"""
_attribute_map = {
- 'error': {'key': 'error', 'type': 'StorageErrorAutoGenerated'},
+ 'error': {'key': 'error', 'type': 'StorageErrorError'},
}
def __init__(
@@ -334,7 +649,7 @@ def __init__(
self.error = kwargs.get('error', None)
-class StorageErrorAutoGenerated(msrest.serialization.Model):
+class StorageErrorError(msrest.serialization.Model):
"""The service error response object.
:param code: The service error code.
@@ -352,6 +667,6 @@ def __init__(
self,
**kwargs
):
- super(StorageErrorAutoGenerated, self).__init__(**kwargs)
+ super(StorageErrorError, self).__init__(**kwargs)
self.code = kwargs.get('code', None)
self.message = kwargs.get('message', None)
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py
index 337388d8d2f6..bbe361c5b9bb 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py
@@ -44,6 +44,307 @@ def __init__(
self.error_message = error_message
+class BlobHierarchyListSegment(msrest.serialization.Model):
+ """BlobHierarchyListSegment.
+
+ All required parameters must be populated in order to send to Azure.
+
+ :param blob_prefixes:
+ :type blob_prefixes: list[~azure.storage.filedatalake.models.BlobPrefix]
+ :param blob_items: Required.
+ :type blob_items: list[~azure.storage.filedatalake.models.BlobItemInternal]
+ """
+
+ _validation = {
+ 'blob_items': {'required': True},
+ }
+
+ _attribute_map = {
+ 'blob_prefixes': {'key': 'BlobPrefixes', 'type': '[BlobPrefix]'},
+ 'blob_items': {'key': 'BlobItems', 'type': '[BlobItemInternal]'},
+ }
+ _xml_map = {
+ 'name': 'Blobs'
+ }
+
+ def __init__(
+ self,
+ *,
+ blob_items: List["BlobItemInternal"],
+ blob_prefixes: Optional[List["BlobPrefix"]] = None,
+ **kwargs
+ ):
+ super(BlobHierarchyListSegment, self).__init__(**kwargs)
+ self.blob_prefixes = blob_prefixes
+ self.blob_items = blob_items
+
+
+class BlobItemInternal(msrest.serialization.Model):
+ """An Azure Storage blob.
+
+ All required parameters must be populated in order to send to Azure.
+
+ :param name: Required.
+ :type name: str
+ :param deleted: Required.
+ :type deleted: bool
+ :param snapshot: Required.
+ :type snapshot: str
+ :param version_id:
+ :type version_id: str
+ :param is_current_version:
+ :type is_current_version: bool
+ :param properties: Required. Properties of a blob.
+ :type properties: ~azure.storage.filedatalake.models.BlobPropertiesInternal
+ :param deletion_id:
+ :type deletion_id: str
+ """
+
+ _validation = {
+ 'name': {'required': True},
+ 'deleted': {'required': True},
+ 'snapshot': {'required': True},
+ 'properties': {'required': True},
+ }
+
+ _attribute_map = {
+ 'name': {'key': 'Name', 'type': 'str'},
+ 'deleted': {'key': 'Deleted', 'type': 'bool'},
+ 'snapshot': {'key': 'Snapshot', 'type': 'str'},
+ 'version_id': {'key': 'VersionId', 'type': 'str'},
+ 'is_current_version': {'key': 'IsCurrentVersion', 'type': 'bool'},
+ 'properties': {'key': 'Properties', 'type': 'BlobPropertiesInternal'},
+ 'deletion_id': {'key': 'DeletionId', 'type': 'str'},
+ }
+ _xml_map = {
+ 'name': 'Blob'
+ }
+
+ def __init__(
+ self,
+ *,
+ name: str,
+ deleted: bool,
+ snapshot: str,
+ properties: "BlobPropertiesInternal",
+ version_id: Optional[str] = None,
+ is_current_version: Optional[bool] = None,
+ deletion_id: Optional[str] = None,
+ **kwargs
+ ):
+ super(BlobItemInternal, self).__init__(**kwargs)
+ self.name = name
+ self.deleted = deleted
+ self.snapshot = snapshot
+ self.version_id = version_id
+ self.is_current_version = is_current_version
+ self.properties = properties
+ self.deletion_id = deletion_id
+
+
+class BlobPrefix(msrest.serialization.Model):
+ """BlobPrefix.
+
+ All required parameters must be populated in order to send to Azure.
+
+ :param name: Required.
+ :type name: str
+ """
+
+ _validation = {
+ 'name': {'required': True},
+ }
+
+ _attribute_map = {
+ 'name': {'key': 'Name', 'type': 'str'},
+ }
+
+ def __init__(
+ self,
+ *,
+ name: str,
+ **kwargs
+ ):
+ super(BlobPrefix, self).__init__(**kwargs)
+ self.name = name
+
+
+class BlobPropertiesInternal(msrest.serialization.Model):
+ """Properties of a blob.
+
+ All required parameters must be populated in order to send to Azure.
+
+ :param creation_time:
+ :type creation_time: ~datetime.datetime
+ :param last_modified: Required.
+ :type last_modified: ~datetime.datetime
+ :param etag: Required.
+ :type etag: str
+ :param content_length: Size in bytes.
+ :type content_length: long
+ :param content_type:
+ :type content_type: str
+ :param content_encoding:
+ :type content_encoding: str
+ :param content_language:
+ :type content_language: str
+ :param content_md5:
+ :type content_md5: bytearray
+ :param content_disposition:
+ :type content_disposition: str
+ :param cache_control:
+ :type cache_control: str
+ :param blob_sequence_number:
+ :type blob_sequence_number: long
+ :param copy_id:
+ :type copy_id: str
+ :param copy_source:
+ :type copy_source: str
+ :param copy_progress:
+ :type copy_progress: str
+ :param copy_completion_time:
+ :type copy_completion_time: ~datetime.datetime
+ :param copy_status_description:
+ :type copy_status_description: str
+ :param server_encrypted:
+ :type server_encrypted: bool
+ :param incremental_copy:
+ :type incremental_copy: bool
+ :param destination_snapshot:
+ :type destination_snapshot: str
+ :param deleted_time:
+ :type deleted_time: ~datetime.datetime
+ :param remaining_retention_days:
+ :type remaining_retention_days: int
+ :param access_tier_inferred:
+ :type access_tier_inferred: bool
+ :param customer_provided_key_sha256:
+ :type customer_provided_key_sha256: str
+ :param encryption_scope: The name of the encryption scope under which the blob is encrypted.
+ :type encryption_scope: str
+ :param access_tier_change_time:
+ :type access_tier_change_time: ~datetime.datetime
+ :param tag_count:
+ :type tag_count: int
+ :param expires_on:
+ :type expires_on: ~datetime.datetime
+ :param is_sealed:
+ :type is_sealed: bool
+ :param last_accessed_on:
+ :type last_accessed_on: ~datetime.datetime
+ :param delete_time:
+ :type delete_time: ~datetime.datetime
+ """
+
+ _validation = {
+ 'last_modified': {'required': True},
+ 'etag': {'required': True},
+ }
+
+ _attribute_map = {
+ 'creation_time': {'key': 'Creation-Time', 'type': 'rfc-1123'},
+ 'last_modified': {'key': 'Last-Modified', 'type': 'rfc-1123'},
+ 'etag': {'key': 'Etag', 'type': 'str'},
+ 'content_length': {'key': 'Content-Length', 'type': 'long'},
+ 'content_type': {'key': 'Content-Type', 'type': 'str'},
+ 'content_encoding': {'key': 'Content-Encoding', 'type': 'str'},
+ 'content_language': {'key': 'Content-Language', 'type': 'str'},
+ 'content_md5': {'key': 'Content-MD5', 'type': 'bytearray'},
+ 'content_disposition': {'key': 'Content-Disposition', 'type': 'str'},
+ 'cache_control': {'key': 'Cache-Control', 'type': 'str'},
+ 'blob_sequence_number': {'key': 'x-ms-blob-sequence-number', 'type': 'long'},
+ 'copy_id': {'key': 'CopyId', 'type': 'str'},
+ 'copy_source': {'key': 'CopySource', 'type': 'str'},
+ 'copy_progress': {'key': 'CopyProgress', 'type': 'str'},
+ 'copy_completion_time': {'key': 'CopyCompletionTime', 'type': 'rfc-1123'},
+ 'copy_status_description': {'key': 'CopyStatusDescription', 'type': 'str'},
+ 'server_encrypted': {'key': 'ServerEncrypted', 'type': 'bool'},
+ 'incremental_copy': {'key': 'IncrementalCopy', 'type': 'bool'},
+ 'destination_snapshot': {'key': 'DestinationSnapshot', 'type': 'str'},
+ 'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'},
+ 'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'},
+ 'access_tier_inferred': {'key': 'AccessTierInferred', 'type': 'bool'},
+ 'customer_provided_key_sha256': {'key': 'CustomerProvidedKeySha256', 'type': 'str'},
+ 'encryption_scope': {'key': 'EncryptionScope', 'type': 'str'},
+ 'access_tier_change_time': {'key': 'AccessTierChangeTime', 'type': 'rfc-1123'},
+ 'tag_count': {'key': 'TagCount', 'type': 'int'},
+ 'expires_on': {'key': 'Expiry-Time', 'type': 'rfc-1123'},
+ 'is_sealed': {'key': 'Sealed', 'type': 'bool'},
+ 'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'},
+ 'delete_time': {'key': 'DeleteTime', 'type': 'rfc-1123'},
+ }
+ _xml_map = {
+ 'name': 'Properties'
+ }
+
+ def __init__(
+ self,
+ *,
+ last_modified: datetime.datetime,
+ etag: str,
+ creation_time: Optional[datetime.datetime] = None,
+ content_length: Optional[int] = None,
+ content_type: Optional[str] = None,
+ content_encoding: Optional[str] = None,
+ content_language: Optional[str] = None,
+ content_md5: Optional[bytearray] = None,
+ content_disposition: Optional[str] = None,
+ cache_control: Optional[str] = None,
+ blob_sequence_number: Optional[int] = None,
+ copy_id: Optional[str] = None,
+ copy_source: Optional[str] = None,
+ copy_progress: Optional[str] = None,
+ copy_completion_time: Optional[datetime.datetime] = None,
+ copy_status_description: Optional[str] = None,
+ server_encrypted: Optional[bool] = None,
+ incremental_copy: Optional[bool] = None,
+ destination_snapshot: Optional[str] = None,
+ deleted_time: Optional[datetime.datetime] = None,
+ remaining_retention_days: Optional[int] = None,
+ access_tier_inferred: Optional[bool] = None,
+ customer_provided_key_sha256: Optional[str] = None,
+ encryption_scope: Optional[str] = None,
+ access_tier_change_time: Optional[datetime.datetime] = None,
+ tag_count: Optional[int] = None,
+ expires_on: Optional[datetime.datetime] = None,
+ is_sealed: Optional[bool] = None,
+ last_accessed_on: Optional[datetime.datetime] = None,
+ delete_time: Optional[datetime.datetime] = None,
+ **kwargs
+ ):
+ super(BlobPropertiesInternal, self).__init__(**kwargs)
+ self.creation_time = creation_time
+ self.last_modified = last_modified
+ self.etag = etag
+ self.content_length = content_length
+ self.content_type = content_type
+ self.content_encoding = content_encoding
+ self.content_language = content_language
+ self.content_md5 = content_md5
+ self.content_disposition = content_disposition
+ self.cache_control = cache_control
+ self.blob_sequence_number = blob_sequence_number
+ self.copy_id = copy_id
+ self.copy_source = copy_source
+ self.copy_progress = copy_progress
+ self.copy_completion_time = copy_completion_time
+ self.copy_status_description = copy_status_description
+ self.server_encrypted = server_encrypted
+ self.incremental_copy = incremental_copy
+ self.destination_snapshot = destination_snapshot
+ self.deleted_time = deleted_time
+ self.remaining_retention_days = remaining_retention_days
+ self.access_tier_inferred = access_tier_inferred
+ self.customer_provided_key_sha256 = customer_provided_key_sha256
+ self.encryption_scope = encryption_scope
+ self.access_tier_change_time = access_tier_change_time
+ self.tag_count = tag_count
+ self.expires_on = expires_on
+ self.is_sealed = is_sealed
+ self.last_accessed_on = last_accessed_on
+ self.delete_time = delete_time
+
+
class FileSystem(msrest.serialization.Model):
"""FileSystem.
@@ -118,6 +419,73 @@ def __init__(
self.lease_id = lease_id
+class ListBlobsHierarchySegmentResponse(msrest.serialization.Model):
+ """An enumeration of blobs.
+
+ All required parameters must be populated in order to send to Azure.
+
+ :param service_endpoint: Required.
+ :type service_endpoint: str
+ :param container_name: Required.
+ :type container_name: str
+ :param prefix:
+ :type prefix: str
+ :param marker:
+ :type marker: str
+ :param max_results:
+ :type max_results: int
+ :param delimiter:
+ :type delimiter: str
+ :param segment: Required.
+ :type segment: ~azure.storage.filedatalake.models.BlobHierarchyListSegment
+ :param next_marker:
+ :type next_marker: str
+ """
+
+ _validation = {
+ 'service_endpoint': {'required': True},
+ 'container_name': {'required': True},
+ 'segment': {'required': True},
+ }
+
+ _attribute_map = {
+ 'service_endpoint': {'key': 'ServiceEndpoint', 'type': 'str', 'xml': {'attr': True}},
+ 'container_name': {'key': 'ContainerName', 'type': 'str', 'xml': {'attr': True}},
+ 'prefix': {'key': 'Prefix', 'type': 'str'},
+ 'marker': {'key': 'Marker', 'type': 'str'},
+ 'max_results': {'key': 'MaxResults', 'type': 'int'},
+ 'delimiter': {'key': 'Delimiter', 'type': 'str'},
+ 'segment': {'key': 'Segment', 'type': 'BlobHierarchyListSegment'},
+ 'next_marker': {'key': 'NextMarker', 'type': 'str'},
+ }
+ _xml_map = {
+ 'name': 'EnumerationResults'
+ }
+
+ def __init__(
+ self,
+ *,
+ service_endpoint: str,
+ container_name: str,
+ segment: "BlobHierarchyListSegment",
+ prefix: Optional[str] = None,
+ marker: Optional[str] = None,
+ max_results: Optional[int] = None,
+ delimiter: Optional[str] = None,
+ next_marker: Optional[str] = None,
+ **kwargs
+ ):
+ super(ListBlobsHierarchySegmentResponse, self).__init__(**kwargs)
+ self.service_endpoint = service_endpoint
+ self.container_name = container_name
+ self.prefix = prefix
+ self.marker = marker
+ self.max_results = max_results
+ self.delimiter = delimiter
+ self.segment = segment
+ self.next_marker = next_marker
+
+
class ModifiedAccessConditions(msrest.serialization.Model):
"""Parameter group.
@@ -368,24 +736,24 @@ class StorageError(msrest.serialization.Model):
"""StorageError.
:param error: The service error response object.
- :type error: ~azure.storage.filedatalake.models.StorageErrorAutoGenerated
+ :type error: ~azure.storage.filedatalake.models.StorageErrorError
"""
_attribute_map = {
- 'error': {'key': 'error', 'type': 'StorageErrorAutoGenerated'},
+ 'error': {'key': 'error', 'type': 'StorageErrorError'},
}
def __init__(
self,
*,
- error: Optional["StorageErrorAutoGenerated"] = None,
+ error: Optional["StorageErrorError"] = None,
**kwargs
):
super(StorageError, self).__init__(**kwargs)
self.error = error
-class StorageErrorAutoGenerated(msrest.serialization.Model):
+class StorageErrorError(msrest.serialization.Model):
"""The service error response object.
:param code: The service error code.
@@ -406,6 +774,6 @@ def __init__(
message: Optional[str] = None,
**kwargs
):
- super(StorageErrorAutoGenerated, self).__init__(**kwargs)
+ super(StorageErrorError, self).__init__(**kwargs)
self.code = code
self.message = message
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py
index 3726a2dd3cf1..991890ac4e2b 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py
@@ -18,7 +18,7 @@
if TYPE_CHECKING:
# pylint: disable=unused-import,ungrouped-imports
- from typing import Any, Callable, Dict, Generic, Iterable, Optional, TypeVar
+ from typing import Any, Callable, Dict, Generic, Iterable, List, Optional, TypeVar, Union
T = TypeVar('T')
ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]]
@@ -113,7 +113,7 @@ def create(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -172,7 +172,7 @@ def set_properties(
401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
}
error_map.update(kwargs.pop('error_map', {}))
-
+
_if_modified_since = None
_if_unmodified_since = None
if modified_access_conditions is not None:
@@ -212,7 +212,7 @@ def set_properties(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -283,7 +283,7 @@ def get_properties(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -340,7 +340,7 @@ def delete(
401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
}
error_map.update(kwargs.pop('error_map', {}))
-
+
_if_modified_since = None
_if_unmodified_since = None
if modified_access_conditions is not None:
@@ -378,7 +378,7 @@ def delete(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -452,8 +452,10 @@ def prepare_request(next_link=None, cont_token=None):
# Construct headers
header_parameters = {} # type: Dict[str, Any]
if request_id_parameter is not None:
- header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
- header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str')
+ header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter",
+ request_id_parameter, 'str')
+ header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version,
+ 'str')
header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
if not next_link:
@@ -465,7 +467,8 @@ def prepare_request(next_link=None, cont_token=None):
url = self._client.format_url(url, **path_format_arguments)
# Construct parameters
query_parameters = {} # type: Dict[str, Any]
- query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, 'str')
+ query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource,
+ 'str')
if timeout is not None:
query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0)
# TODO: change this once continuation/next_link autorest PR is merged
@@ -512,7 +515,7 @@ def get_next(cont_token=None):
response = pipeline_response.http_response
if response.status_code not in [200]:
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
map_error(status_code=response.status_code, response=response, error_map=error_map)
raise HttpResponseError(response=response, model=error)
@@ -521,4 +524,120 @@ def get_next(cont_token=None):
return ItemPaged(
get_next, extract_data
)
+
list_paths.metadata = {'url': '/{filesystem}'} # type: ignore
+
+ def list_blob_hierarchy_segment(
+ self,
+ prefix=None, # type: Optional[str]
+ delimiter=None, # type: Optional[str]
+ marker=None, # type: Optional[str]
+ max_results=None, # type: Optional[int]
+ include=None, # type: Optional[List[Union[str, "_models.ListBlobsIncludeItem"]]]
+ showonly="deleted", # type: Optional[str]
+ timeout=None, # type: Optional[int]
+ request_id_parameter=None, # type: Optional[str]
+ **kwargs # type: Any
+ ):
+ # type: (...) -> "_models.ListBlobsHierarchySegmentResponse"
+ """The List Blobs operation returns a list of the blobs under the specified container.
+
+ :param prefix: Filters results to filesystems within the specified prefix.
+ :type prefix: str
+ :param delimiter: When the request includes this parameter, the operation returns a BlobPrefix
+ element in the response body that acts as a placeholder for all blobs whose names begin with
+ the same substring up to the appearance of the delimiter character. The delimiter may be a
+ single character or a string.
+ :type delimiter: str
+ :param marker: A string value that identifies the portion of the list of containers to be
+ returned with the next listing operation. The operation returns the NextMarker value within the
+ response body if the listing operation did not return all containers remaining to be listed
+ with the current page. The NextMarker value can be used as the value for the marker parameter
+ in a subsequent call to request the next page of list items. The marker value is opaque to the
+ client.
+ :type marker: str
+ :param max_results: An optional value that specifies the maximum number of items to return. If
+ omitted or greater than 5,000, the response will include up to 5,000 items.
+ :type max_results: int
+ :param include: Include this parameter to specify one or more datasets to include in the
+ response.
+ :type include: list[str or ~azure.storage.filedatalake.models.ListBlobsIncludeItem]
+ :param showonly: Include this parameter to specify one or more datasets to include in the
+ response.
+ :type showonly: str
+ :param timeout: The timeout parameter is expressed in seconds. For more information, see
+ :code:`Setting Timeouts for Blob Service Operations.`.
+ :type timeout: int
+ :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
+ limit that is recorded in the analytics logs when storage analytics logging is enabled.
+ :type request_id_parameter: str
+ :keyword callable cls: A custom type or function that will be passed the direct response
+ :return: ListBlobsHierarchySegmentResponse, or the result of cls(response)
+ :rtype: ~azure.storage.filedatalake.models.ListBlobsHierarchySegmentResponse
+ :raises: ~azure.core.exceptions.HttpResponseError
+ """
+ cls = kwargs.pop('cls', None) # type: ClsType["_models.ListBlobsHierarchySegmentResponse"]
+ error_map = {
+ 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
+ }
+ error_map.update(kwargs.pop('error_map', {}))
+ restype = "container"
+ comp = "list"
+ accept = "application/xml"
+
+ # Construct URL
+ url = self.list_blob_hierarchy_segment.metadata['url'] # type: ignore
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ url = self._client.format_url(url, **path_format_arguments)
+
+ # Construct parameters
+ query_parameters = {} # type: Dict[str, Any]
+ query_parameters['restype'] = self._serialize.query("restype", restype, 'str')
+ query_parameters['comp'] = self._serialize.query("comp", comp, 'str')
+ if prefix is not None:
+ query_parameters['prefix'] = self._serialize.query("prefix", prefix, 'str')
+ if delimiter is not None:
+ query_parameters['delimiter'] = self._serialize.query("delimiter", delimiter, 'str')
+ if marker is not None:
+ query_parameters['marker'] = self._serialize.query("marker", marker, 'str')
+ if max_results is not None:
+ query_parameters['maxResults'] = self._serialize.query("max_results", max_results, 'int', minimum=1)
+ if include is not None:
+ query_parameters['include'] = self._serialize.query("include", include, '[str]', div=',')
+ if showonly is not None:
+ query_parameters['showonly'] = self._serialize.query("showonly", showonly, 'str')
+ if timeout is not None:
+ query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0)
+
+ # Construct headers
+ header_parameters = {} # type: Dict[str, Any]
+ header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str')
+ if request_id_parameter is not None:
+ header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
+ header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
+
+ request = self._client.get(url, query_parameters, header_parameters)
+ pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
+ response = pipeline_response.http_response
+
+ if response.status_code not in [200]:
+ map_error(status_code=response.status_code, response=response, error_map=error_map)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
+ raise HttpResponseError(response=response, model=error)
+
+ response_headers = {}
+ response_headers['Content-Type']=self._deserialize('str', response.headers.get('Content-Type'))
+ response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id'))
+ response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id'))
+ response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version'))
+ response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date'))
+ deserialized = self._deserialize('ListBlobsHierarchySegmentResponse', pipeline_response)
+
+ if cls:
+ return cls(pipeline_response, deserialized, response_headers)
+
+ return deserialized
+ list_blob_hierarchy_segment.metadata = {'url': '/{filesystem}'} # type: ignore
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py
index bd527947cf31..5517c96888bd 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py
@@ -244,7 +244,7 @@ def create(
if response.status_code not in [201]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -290,10 +290,10 @@ def update(
Uploads data to be appended to a file, flushes (writes) previously uploaded data to a file,
sets properties for a file or directory, or sets access control for a file or directory. Data
- can only be appended to a file. This operation supports conditional HTTP requests. For more
- information, see `Specifying Conditional Headers for Blob Service Operations
- `_.
+ can only be appended to a file. Concurrent writes to the same file using multiple clients are
+ not supported. This operation supports conditional HTTP requests. For more information, see
+ `Specifying Conditional Headers for Blob Service Operations `_.
:param action: The action must be "append" to upload data to be appended to a file, "flush" to
flush previously uploaded data to a file, "setProperties" to set the properties of a file or
@@ -505,7 +505,7 @@ def update(
if response.status_code not in [200, 202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -661,7 +661,7 @@ def lease(
if response.status_code not in [200, 201, 202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -795,7 +795,7 @@ def read(
if response.status_code not in [200, 206]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -956,7 +956,7 @@ def get_properties(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1090,7 +1090,7 @@ def delete(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1098,6 +1098,7 @@ def delete(
response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id'))
response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version'))
response_headers['x-ms-continuation']=self._deserialize('str', response.headers.get('x-ms-continuation'))
+ response_headers['x-ms-deletion-id']=self._deserialize('str', response.headers.get('x-ms-deletion-id'))
if cls:
return cls(pipeline_response, None, response_headers)
@@ -1214,7 +1215,7 @@ def set_access_control(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1325,7 +1326,7 @@ def set_access_control_recursive(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1494,7 +1495,7 @@ def flush_data(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1613,7 +1614,7 @@ def append_data(
if response.status_code not in [202]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1695,7 +1696,7 @@ def set_expiry(
if response.status_code not in [200]:
map_error(status_code=response.status_code, response=response, error_map=error_map)
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
raise HttpResponseError(response=response, model=error)
response_headers = {}
@@ -1710,3 +1711,79 @@ def set_expiry(
return cls(pipeline_response, None, response_headers)
set_expiry.metadata = {'url': '/{filesystem}/{path}'} # type: ignore
+
+ def undelete(
+ self,
+ timeout=None, # type: Optional[int]
+ undelete_source=None, # type: Optional[str]
+ request_id_parameter=None, # type: Optional[str]
+ **kwargs # type: Any
+ ):
+ # type: (...) -> None
+ """Undelete a path that was previously soft deleted.
+
+ :param timeout: The timeout parameter is expressed in seconds. For more information, see
+ :code:`Setting Timeouts for Blob Service Operations.`.
+ :type timeout: int
+ :param undelete_source: Only for hierarchical namespace enabled accounts. Optional. The path of
+ the soft deleted blob to undelete.
+ :type undelete_source: str
+ :param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
+ limit that is recorded in the analytics logs when storage analytics logging is enabled.
+ :type request_id_parameter: str
+ :keyword callable cls: A custom type or function that will be passed the direct response
+ :return: None, or the result of cls(response)
+ :rtype: None
+ :raises: ~azure.core.exceptions.HttpResponseError
+ """
+ cls = kwargs.pop('cls', None) # type: ClsType[None]
+ error_map = {
+ 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError
+ }
+ error_map.update(kwargs.pop('error_map', {}))
+ comp = "undelete"
+ accept = "application/json"
+
+ # Construct URL
+ url = self.undelete.metadata['url'] # type: ignore
+ path_format_arguments = {
+ 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True),
+ }
+ url = self._client.format_url(url, **path_format_arguments)
+
+ # Construct parameters
+ query_parameters = {} # type: Dict[str, Any]
+ query_parameters['comp'] = self._serialize.query("comp", comp, 'str')
+ if timeout is not None:
+ query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0)
+
+ # Construct headers
+ header_parameters = {} # type: Dict[str, Any]
+ if undelete_source is not None:
+ header_parameters['x-ms-undelete-source'] = self._serialize.header("undelete_source", undelete_source, 'str')
+ header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str')
+ if request_id_parameter is not None:
+ header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str')
+ header_parameters['Accept'] = self._serialize.header("accept", accept, 'str')
+
+ request = self._client.put(url, query_parameters, header_parameters)
+ pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs)
+ response = pipeline_response.http_response
+
+ if response.status_code not in [200]:
+ map_error(status_code=response.status_code, response=response, error_map=error_map)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
+ raise HttpResponseError(response=response, model=error)
+
+ response_headers = {}
+ response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id'))
+ response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id'))
+ response_headers['x-ms-resource-type']=self._deserialize('str', response.headers.get('x-ms-resource-type'))
+ response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version'))
+ response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date'))
+
+ if cls:
+ return cls(pipeline_response, None, response_headers)
+
+ undelete.metadata = {'url': '/{filesystem}/{path}'} # type: ignore
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py
index c5a9555cf0d1..2db3801abff8 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py
@@ -141,7 +141,7 @@ def get_next(next_link=None):
response = pipeline_response.http_response
if response.status_code not in [200]:
- error = self._deserialize(_models.StorageError, response)
+ error = self._deserialize.failsafe_deserialize(_models.StorageError, response)
map_error(status_code=response.status_code, response=response, error_map=error_map)
raise HttpResponseError(response=response, model=error)
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_list_paths_helper.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_list_paths_helper.py
new file mode 100644
index 000000000000..543e1e115780
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_list_paths_helper.py
@@ -0,0 +1,108 @@
+# -------------------------------------------------------------------------
+# Copyright (c) Microsoft Corporation. All rights reserved.
+# Licensed under the MIT License. See License.txt in the project root for
+# license information.
+# --------------------------------------------------------------------------
+
+from azure.core.paging import PageIterator
+from azure.core.exceptions import HttpResponseError
+from ._deserialize import process_storage_error, get_deleted_path_properties_from_generated_code
+from ._generated.models import BlobItemInternal, BlobPrefix as GenBlobPrefix
+from ._shared.models import DictMixin
+from ._shared.response_handlers import return_context_and_deserialized
+
+
+class DeletedPathPropertiesPaged(PageIterator):
+ """An Iterable of deleted path properties.
+
+ :ivar str service_endpoint: The service URL.
+ :ivar str prefix: A path name prefix being used to filter the list.
+ :ivar str marker: The continuation token of the current page of results.
+ :ivar int results_per_page: The maximum number of results retrieved per API call.
+ :ivar str continuation_token: The continuation token to retrieve the next page of results.
+ :ivar str location_mode: The location mode being used to list results. The available
+ options include "primary" and "secondary".
+ :ivar current_page: The current page of listed results.
+ :vartype current_page: list(~azure.storage.filedatalake.DeletedPathProperties)
+ :ivar str container: The container that the paths are listed from.
+ :ivar str delimiter: A delimiting character used for hierarchy listing.
+
+ :param callable command: Function to retrieve the next page of items.
+ """
+ def __init__(
+ self, command,
+ container=None,
+ prefix=None,
+ results_per_page=None,
+ continuation_token=None,
+ delimiter=None,
+ location_mode=None):
+ super(DeletedPathPropertiesPaged, self).__init__(
+ get_next=self._get_next_cb,
+ extract_data=self._extract_data_cb,
+ continuation_token=continuation_token or ""
+ )
+ self._command = command
+ self.service_endpoint = None
+ self.prefix = prefix
+ self.marker = None
+ self.results_per_page = results_per_page
+ self.container = container
+ self.delimiter = delimiter
+ self.current_page = None
+ self.location_mode = location_mode
+
+ def _get_next_cb(self, continuation_token):
+ try:
+ return self._command(
+ prefix=self.prefix,
+ marker=continuation_token or None,
+ max_results=self.results_per_page,
+ cls=return_context_and_deserialized,
+ use_location=self.location_mode)
+ except HttpResponseError as error:
+ process_storage_error(error)
+
+ def _extract_data_cb(self, get_next_return):
+ self.location_mode, self._response = get_next_return
+ self.service_endpoint = self._response.service_endpoint
+ self.prefix = self._response.prefix
+ self.marker = self._response.marker
+ self.results_per_page = self._response.max_results
+ self.container = self._response.container_name
+ self.current_page = self._response.segment.blob_prefixes + self._response.segment.blob_items
+ self.current_page = [self._build_item(item) for item in self.current_page]
+ self.delimiter = self._response.delimiter
+
+ return self._response.next_marker or None, self.current_page
+
+ def _build_item(self, item):
+ if isinstance(item, BlobItemInternal):
+ file_props = get_deleted_path_properties_from_generated_code(item)
+ file_props.file_system = self.container
+ return file_props
+ if isinstance(item, GenBlobPrefix):
+ return DirectoryPrefix(
+ container=self.container,
+ prefix=item.name,
+ results_per_page=self.results_per_page,
+ location_mode=self.location_mode)
+ return item
+
+
+class DirectoryPrefix(DictMixin):
+ """Directory prefix.
+
+ :ivar str name: Name of the deleted directory.
+ :ivar int results_per_page: The maximum number of results retrieved per API call.
+ :ivar str location_mode: The location mode being used to list results. The available
+ options include "primary" and "secondary".
+ :ivar str file_system: The file system that the deleted paths are listed from.
+ :ivar str delimiter: A delimiting character used for hierarchy listing.
+ """
+ def __init__(self, **kwargs):
+ self.name = kwargs.get('prefix')
+ self.results_per_page = kwargs.get('results_per_page')
+ self.file_system = kwargs.get('container')
+ self.delimiter = kwargs.get('delimiter')
+ self.location_mode = kwargs.get('location_mode')
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py
index b99f9aa09d78..f0204b02fc8d 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py
@@ -18,6 +18,8 @@
from azure.storage.blob import DelimitedJsonDialect as BlobDelimitedJSON
from azure.storage.blob import ArrowDialect as BlobArrowDialect
from azure.storage.blob._models import ContainerPropertiesPaged
+from azure.storage.blob._generated.models import Logging as GenLogging, Metrics as GenMetrics, \
+ RetentionPolicy as GenRetentionPolicy, StaticWebsite as GenStaticWebsite, CorsRule as GenCorsRule
from ._shared.models import DictMixin
@@ -827,3 +829,203 @@ def __init__(self, batch_counters, aggregate_counters, batch_failures, continuat
self.aggregate_counters = aggregate_counters
self.batch_failures = batch_failures
self.continuation = continuation
+
+
+class DeletedPathProperties(DictMixin):
+ """
+ Properties populated for a deleted path.
+
+ :ivar str name:
+ The name of the file in the path.
+ :ivar ~datetime.datetime deleted_time:
+ A datetime object representing the time at which the path was deleted.
+ :ivar int remaining_retention_days:
+ The number of days that the path will be retained before being permanently deleted by the service.
+ :ivar str deletion_id:
+ The id associated with the deleted path.
+ """
+ def __init__(self, **kwargs):
+ self.name = kwargs.get('name')
+ self.deleted_time = None
+ self.remaining_retention_days = None
+ self.deletion_id = None
+
+
+class AnalyticsLogging(GenLogging):
+ """Azure Analytics Logging settings.
+
+ :keyword str version:
+ The version of Storage Analytics to configure. The default value is 1.0.
+ :keyword bool delete:
+ Indicates whether all delete requests should be logged. The default value is `False`.
+ :keyword bool read:
+ Indicates whether all read requests should be logged. The default value is `False`.
+ :keyword bool write:
+ Indicates whether all write requests should be logged. The default value is `False`.
+ :keyword ~azure.storage.filedatalake.RetentionPolicy retention_policy:
+ Determines how long the associated data should persist. If not specified the retention
+ policy will be disabled by default.
+ """
+
+ def __init__(self, **kwargs):
+ self.version = kwargs.get('version', u'1.0')
+ self.delete = kwargs.get('delete', False)
+ self.read = kwargs.get('read', False)
+ self.write = kwargs.get('write', False)
+ self.retention_policy = kwargs.get('retention_policy') or RetentionPolicy()
+
+ @classmethod
+ def _from_generated(cls, generated):
+ if not generated:
+ return cls()
+ return cls(
+ version=generated.version,
+ delete=generated.delete,
+ read=generated.read,
+ write=generated.write,
+ retention_policy=RetentionPolicy._from_generated(generated.retention_policy) # pylint: disable=protected-access
+ )
+
+
+class Metrics(GenMetrics):
+ """A summary of request statistics grouped by API in hour or minute aggregates.
+
+ :keyword str version:
+ The version of Storage Analytics to configure. The default value is 1.0.
+ :keyword bool enabled:
+ Indicates whether metrics are enabled for the Datalake service.
+ The default value is `False`.
+ :keyword bool include_apis:
+ Indicates whether metrics should generate summary statistics for called API operations.
+ :keyword ~azure.storage.filedatalake.RetentionPolicy retention_policy:
+ Determines how long the associated data should persist. If not specified the retention
+ policy will be disabled by default.
+ """
+
+ def __init__(self, **kwargs):
+ self.version = kwargs.get('version', u'1.0')
+ self.enabled = kwargs.get('enabled', False)
+ self.include_apis = kwargs.get('include_apis')
+ self.retention_policy = kwargs.get('retention_policy') or RetentionPolicy()
+
+ @classmethod
+ def _from_generated(cls, generated):
+ if not generated:
+ return cls()
+ return cls(
+ version=generated.version,
+ enabled=generated.enabled,
+ include_apis=generated.include_apis,
+ retention_policy=RetentionPolicy._from_generated(generated.retention_policy) # pylint: disable=protected-access
+ )
+
+
+class RetentionPolicy(GenRetentionPolicy):
+ """The retention policy which determines how long the associated data should
+ persist.
+
+ :param bool enabled:
+ Indicates whether a retention policy is enabled for the storage service.
+ The default value is False.
+ :param int days:
+ Indicates the number of days that metrics or logging or
+ soft-deleted data should be retained. All data older than this value will
+ be deleted. If enabled=True, the number of days must be specified.
+ """
+
+ def __init__(self, enabled=False, days=None):
+ super(RetentionPolicy, self).__init__(enabled=enabled, days=days, allow_permanent_delete=None)
+ if self.enabled and (self.days is None):
+ raise ValueError("If policy is enabled, 'days' must be specified.")
+
+ @classmethod
+ def _from_generated(cls, generated):
+ if not generated:
+ return cls()
+ return cls(
+ enabled=generated.enabled,
+ days=generated.days,
+ )
+
+
+class StaticWebsite(GenStaticWebsite):
+ """The properties that enable an account to host a static website.
+
+ :keyword bool enabled:
+ Indicates whether this account is hosting a static website.
+ The default value is `False`.
+ :keyword str index_document:
+ The default name of the index page under each directory.
+ :keyword str error_document404_path:
+ The absolute path of the custom 404 page.
+ :keyword str default_index_document_path:
+ Absolute path of the default index page.
+ """
+
+ def __init__(self, **kwargs):
+ self.enabled = kwargs.get('enabled', False)
+ if self.enabled:
+ self.index_document = kwargs.get('index_document')
+ self.error_document404_path = kwargs.get('error_document404_path')
+ self.default_index_document_path = kwargs.get('default_index_document_path')
+ else:
+ self.index_document = None
+ self.error_document404_path = None
+ self.default_index_document_path = None
+
+ @classmethod
+ def _from_generated(cls, generated):
+ if not generated:
+ return cls()
+ return cls(
+ enabled=generated.enabled,
+ index_document=generated.index_document,
+ error_document404_path=generated.error_document404_path,
+ default_index_document_path=generated.default_index_document_path
+ )
+
+
+class CorsRule(GenCorsRule):
+ """CORS is an HTTP feature that enables a web application running under one
+ domain to access resources in another domain. Web browsers implement a
+ security restriction known as same-origin policy that prevents a web page
+ from calling APIs in a different domain; CORS provides a secure way to
+ allow one domain (the origin domain) to call APIs in another domain.
+
+ :param list(str) allowed_origins:
+ A list of origin domains that will be allowed via CORS, or "*" to allow
+ all domains. The list of must contain at least one entry. Limited to 64
+ origin domains. Each allowed origin can have up to 256 characters.
+ :param list(str) allowed_methods:
+ A list of HTTP methods that are allowed to be executed by the origin.
+ The list of must contain at least one entry. For Azure Storage,
+ permitted methods are DELETE, GET, HEAD, MERGE, POST, OPTIONS or PUT.
+ :keyword list(str) allowed_headers:
+ Defaults to an empty list. A list of headers allowed to be part of
+ the cross-origin request. Limited to 64 defined headers and 2 prefixed
+ headers. Each header can be up to 256 characters.
+ :keyword list(str) exposed_headers:
+ Defaults to an empty list. A list of response headers to expose to CORS
+ clients. Limited to 64 defined headers and two prefixed headers. Each
+ header can be up to 256 characters.
+ :keyword int max_age_in_seconds:
+ The number of seconds that the client/browser should cache a
+ preflight response.
+ """
+
+ def __init__(self, allowed_origins, allowed_methods, **kwargs):
+ self.allowed_origins = ','.join(allowed_origins)
+ self.allowed_methods = ','.join(allowed_methods)
+ self.allowed_headers = ','.join(kwargs.get('allowed_headers', []))
+ self.exposed_headers = ','.join(kwargs.get('exposed_headers', []))
+ self.max_age_in_seconds = kwargs.get('max_age_in_seconds', 0)
+
+ @classmethod
+ def _from_generated(cls, generated):
+ return cls(
+ [generated.allowed_origins],
+ [generated.allowed_methods],
+ allowed_headers=[generated.allowed_headers],
+ exposed_headers=[generated.exposed_headers],
+ max_age_in_seconds=generated.max_age_in_seconds,
+ )
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py
index 7b022845a780..8f0f58869fe3 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py
@@ -3,7 +3,8 @@
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# --------------------------------------------------------------------------
-from typing import Any, Dict
+from datetime import datetime
+from typing import Any, Dict, Union
try:
from urllib.parse import urlparse, quote
@@ -212,12 +213,13 @@ def _delete_path_options(**kwargs):
options = {
'lease_access_conditions': access_conditions,
'modified_access_conditions': mod_conditions,
+ 'cls': return_response_headers,
'timeout': kwargs.pop('timeout', None)}
options.update(kwargs)
return options
def _delete(self, **kwargs):
- # type: (bool, **Any) -> None
+ # type: (**Any) -> Dict[Union[datetime, str]]
"""
Marks the specified path for deletion.
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py
index 5df2f5c9a625..be60b3878f66 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py
@@ -80,7 +80,7 @@ def return_headers_and_deserialized(response, deserialized, response_headers):
def return_context_and_deserialized(response, deserialized, response_headers): # pylint: disable=unused-argument
- return response.location_mode, deserialized
+ return response.http_response.location_mode, deserialized
def process_storage_error(storage_error):
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py
index bf23efa97489..85a0126d5fa7 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py
@@ -4,4 +4,4 @@
# license information.
# --------------------------------------------------------------------------
-VERSION = "12.3.1"
+VERSION = "12.4.0b1"
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py
index c545b0a464e6..da01081e2342 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py
@@ -4,13 +4,14 @@
# license information.
# --------------------------------------------------------------------------
# pylint: disable=invalid-overridden-method
-from typing import Any
+from typing import Optional, Any, Dict
from azure.core.paging import ItemPaged
from azure.core.pipeline import AsyncPipeline
from azure.storage.blob.aio import BlobServiceClient
from .._generated.aio import AzureDataLakeStorageRESTAPI
+from .._deserialize import get_datalake_service_properties
from .._shared.base_client_async import AsyncTransportWrapper, AsyncStorageAccountHostsMixin
from ._file_system_client_async import FileSystemClient
from .._data_lake_service_client import DataLakeServiceClient as DataLakeServiceClientBase
@@ -441,3 +442,64 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str]
require_encryption=self.require_encryption,
key_encryption_key=self.key_encryption_key,
key_resolver_function=self.key_resolver_function)
+
+ async def set_service_properties(self, **kwargs):
+ # type: (**Any) -> None
+ """Sets the properties of a storage account's Datalake service, including
+ Azure Storage Analytics.
+
+ If an element (e.g. analytics_logging) is left as None, the
+ existing settings on the service for that functionality are preserved.
+
+ .. versionadded:: 12.4.0
+ This operation was introduced in API version '2020-06-12'.
+
+ :keyword analytics_logging:
+ Groups the Azure Analytics Logging settings.
+ :type analytics_logging: ~azure.storage.filedatalake.AnalyticsLogging
+ :keyword hour_metrics:
+ The hour metrics settings provide a summary of request
+ statistics grouped by API in hourly aggregates.
+ :type hour_metrics: ~azure.storage.filedatalake.Metrics
+ :keyword minute_metrics:
+ The minute metrics settings provide request statistics
+ for each minute.
+ :type minute_metrics: ~azure.storage.filedatalake.Metrics
+ :keyword cors:
+ You can include up to five CorsRule elements in the
+ list. If an empty list is specified, all CORS rules will be deleted,
+ and CORS will be disabled for the service.
+ :type cors: list[~azure.storage.filedatalake.CorsRule]
+ :keyword str target_version:
+ Indicates the default version to use for requests if an incoming
+ request's version is not specified.
+ :keyword delete_retention_policy:
+ The delete retention policy specifies whether to retain deleted files/directories.
+ It also specifies the number of days and versions of file/directory to keep.
+ :type delete_retention_policy: ~azure.storage.filedatalake.RetentionPolicy
+ :keyword static_website:
+ Specifies whether the static website feature is enabled,
+ and if yes, indicates the index document and 404 error document to use.
+ :type static_website: ~azure.storage.filedatalake.StaticWebsite
+ :keyword int timeout:
+ The timeout parameter is expressed in seconds.
+ :rtype: None
+ """
+ return await self._blob_service_client.set_service_properties(**kwargs) # pylint: disable=protected-access
+
+ async def get_service_properties(self, **kwargs):
+ # type: (**Any) -> Dict[str, Any]
+ """Gets the properties of a storage account's datalake service, including
+ Azure Storage Analytics.
+
+ .. versionadded:: 12.4.0
+ This operation was introduced in API version '2020-06-12'.
+
+ :keyword int timeout:
+ The timeout parameter is expressed in seconds.
+ :returns: An object containing datalake service properties such as
+ analytics logging, hour/minute metrics, cors rules, etc.
+ :rtype: Dict[str, Any]
+ """
+ props = await self._blob_service_client.get_service_properties(**kwargs) # pylint: disable=protected-access
+ return get_datalake_service_properties(props)
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py
index 108fc1817046..98fc89eadb2d 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py
@@ -5,11 +5,12 @@
# license information.
# --------------------------------------------------------------------------
# pylint: disable=invalid-overridden-method
-
+import functools
from typing import ( # pylint: disable=unused-import
Union, Optional, Any, Dict, TYPE_CHECKING
)
+from azure.core.exceptions import HttpResponseError
from azure.core.tracing.decorator import distributed_trace
from azure.core.pipeline import AsyncPipeline
@@ -17,6 +18,8 @@
from azure.core.tracing.decorator_async import distributed_trace_async
from azure.storage.blob.aio import ContainerClient
+from .._deserialize import process_storage_error, is_file_path
+from .._generated.models import ListBlobsIncludeItem
from ._data_lake_file_client_async import DataLakeFileClient
from ._data_lake_directory_client_async import DataLakeDirectoryClient
@@ -26,7 +29,9 @@
from .._generated.aio import AzureDataLakeStorageRESTAPI
from .._shared.base_client_async import AsyncTransportWrapper, AsyncStorageAccountHostsMixin
from .._shared.policies_async import ExponentialRetry
-from .._models import FileSystemProperties, PublicAccess, DirectoryProperties, FileProperties
+from .._models import FileSystemProperties, PublicAccess, DirectoryProperties, FileProperties, DeletedPathProperties
+from ._list_paths_helper import DeletedPathPropertiesPaged
+
if TYPE_CHECKING:
from datetime import datetime
@@ -90,6 +95,9 @@ def __init__(
_hosts=self._container_client._hosts,# pylint: disable=protected-access
**kwargs) # type: ignore # pylint: disable=protected-access
self._client = AzureDataLakeStorageRESTAPI(self.url, file_system=file_system_name, pipeline=self._pipeline)
+ self._datalake_client_for_blob_operation = AzureDataLakeStorageRESTAPI(self._container_client.url,
+ file_system=file_system_name,
+ pipeline=self._pipeline)
self._loop = kwargs.get('loop', None)
async def __aexit__(self, *args):
@@ -701,6 +709,42 @@ async def delete_file(self, file, # type: Union[FileProperties, str]
await file_client.delete_file(**kwargs)
return file_client
+ @distributed_trace_async
+ async def _undelete_path(self, deleted_path_name, deletion_id, **kwargs):
+ # type: (str, str, **Any) -> Union[DataLakeDirectoryClient, DataLakeFileClient]
+ """Restores soft-deleted path.
+
+ Operation will only be successful if used within the specified number of days
+ set in the delete retention policy.
+
+ .. versionadded:: 12.4.0
+ This operation was introduced in API version '2020-06-12'.
+
+ :param str deleted_path_name:
+ Specifies the name of the deleted container to restore.
+ :param str deletion_id:
+ Specifies the version of the deleted container to restore.
+ :keyword int timeout:
+ The timeout parameter is expressed in seconds.
+ :rtype: ~azure.storage.file.datalake.aio.DataLakeDirectoryClient
+ or azure.storage.file.datalake.aio.DataLakeFileClient
+ """
+ _, url, undelete_source = self._undelete_path_options(deleted_path_name, deletion_id)
+
+ pipeline = AsyncPipeline(
+ transport=AsyncTransportWrapper(self._pipeline._transport), # pylint: disable = protected-access
+ policies=self._pipeline._impl_policies # pylint: disable = protected-access
+ )
+ path_client = AzureDataLakeStorageRESTAPI(
+ url, filesystem=self.file_system_name, path=deleted_path_name, pipeline=pipeline)
+ try:
+ is_file = await path_client.path.undelete(undelete_source=undelete_source, cls=is_file_path, **kwargs)
+ if is_file:
+ return self.get_file_client(deleted_path_name)
+ return self.get_directory_client(deleted_path_name)
+ except HttpResponseError as error:
+ process_storage_error(error)
+
def _get_root_directory_client(self):
# type: () -> DataLakeDirectoryClient
"""Get a client to interact with the root directory.
@@ -788,3 +832,36 @@ def get_file_client(self, file_path # type: Union[FileProperties, str]
require_encryption=self.require_encryption,
key_encryption_key=self.key_encryption_key,
key_resolver_function=self.key_resolver_function, loop=self._loop)
+
+ @distributed_trace
+ def list_deleted_paths(self, **kwargs):
+ # type: (Any) -> AsyncItemPaged[DeletedPathProperties]
+ """Returns a generator to list the deleted (file or directory) paths under the specified file system.
+ The generator will lazily follow the continuation tokens returned by
+ the service.
+
+ .. versionadded:: 12.4.0
+ This operation was introduced in API version '2020-06-12'.
+
+ :keyword str path_prefix:
+ Filters the results to return only paths under the specified path.
+ :keyword int max_results:
+ An optional value that specifies the maximum number of items to return per page.
+ If omitted or greater than 5,000, the response will include up to 5,000 items per page.
+ :keyword int timeout:
+ The timeout parameter is expressed in seconds.
+ :returns: An iterable (auto-paging) response of DeletedPathProperties.
+ :rtype:
+ ~azure.core.paging.AsyncItemPaged[~azure.storage.filedatalake.DeletedPathProperties]
+ """
+ path_prefix = kwargs.pop('path_prefix', None)
+ results_per_page = kwargs.pop('max_results', None)
+ timeout = kwargs.pop('timeout', None)
+ command = functools.partial(
+ self._datalake_client_for_blob_operation.file_system.list_blob_hierarchy_segment,
+ showonly=ListBlobsIncludeItem.deleted,
+ timeout=timeout,
+ **kwargs)
+ return AsyncItemPaged(
+ command, prefix=path_prefix, page_iterator_class=DeletedPathPropertiesPaged,
+ results_per_page=results_per_page, **kwargs)
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py
new file mode 100644
index 000000000000..03831a5ecc5c
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py
@@ -0,0 +1,111 @@
+# -------------------------------------------------------------------------
+# Copyright (c) Microsoft Corporation. All rights reserved.
+# Licensed under the MIT License. See License.txt in the project root for
+# license information.
+# --------------------------------------------------------------------------
+# pylint: disable=too-few-public-methods, too-many-instance-attributes
+# pylint: disable=super-init-not-called, too-many-lines
+from azure.core.exceptions import HttpResponseError
+from azure.core.async_paging import AsyncPageIterator
+
+from .._deserialize import process_storage_error, get_deleted_path_properties_from_generated_code
+from .._generated.models import BlobItemInternal, BlobPrefix as GenBlobPrefix
+
+from .._shared.models import DictMixin
+from .._shared.response_handlers import return_context_and_deserialized
+
+
+class DeletedPathPropertiesPaged(AsyncPageIterator):
+ """An Iterable of deleted path properties.
+
+ :ivar str service_endpoint: The service URL.
+ :ivar str prefix: A path name prefix being used to filter the list.
+ :ivar str marker: The continuation token of the current page of results.
+ :ivar int results_per_page: The maximum number of results retrieved per API call.
+ :ivar str continuation_token: The continuation token to retrieve the next page of results.
+ :ivar str location_mode: The location mode being used to list results. The available
+ options include "primary" and "secondary".
+ :ivar current_page: The current page of listed results.
+ :vartype current_page: list(~azure.storage.filedatalake.DeletedPathProperties)
+ :ivar str container: The container that the paths are listed from.
+ :ivar str delimiter: A delimiting character used for hierarchy listing.
+
+ :param callable command: Function to retrieve the next page of items.
+ """
+ def __init__(
+ self, command,
+ container=None,
+ prefix=None,
+ results_per_page=None,
+ continuation_token=None,
+ delimiter=None,
+ location_mode=None):
+ super(DeletedPathPropertiesPaged, self).__init__(
+ get_next=self._get_next_cb,
+ extract_data=self._extract_data_cb,
+ continuation_token=continuation_token or ""
+ )
+ self._command = command
+ self.service_endpoint = None
+ self.prefix = prefix
+ self.marker = None
+ self.results_per_page = results_per_page
+ self.container = container
+ self.delimiter = delimiter
+ self.current_page = None
+ self.location_mode = location_mode
+
+ async def _get_next_cb(self, continuation_token):
+ try:
+ return await self._command(
+ prefix=self.prefix,
+ marker=continuation_token or None,
+ max_results=self.results_per_page,
+ cls=return_context_and_deserialized,
+ use_location=self.location_mode)
+ except HttpResponseError as error:
+ process_storage_error(error)
+
+ async def _extract_data_cb(self, get_next_return):
+ self.location_mode, self._response = get_next_return
+ self.service_endpoint = self._response.service_endpoint
+ self.prefix = self._response.prefix
+ self.marker = self._response.marker
+ self.results_per_page = self._response.max_results
+ self.container = self._response.container_name
+ self.current_page = self._response.segment.blob_prefixes + self._response.segment.blob_items
+ self.current_page = [self._build_item(item) for item in self.current_page]
+ self.delimiter = self._response.delimiter
+
+ return self._response.next_marker or None, self.current_page
+
+ def _build_item(self, item):
+ if isinstance(item, BlobItemInternal):
+ file_props = get_deleted_path_properties_from_generated_code(item)
+ file_props.file_system = self.container
+ return file_props
+ if isinstance(item, GenBlobPrefix):
+ return DirectoryPrefix(
+ container=self.container,
+ prefix=item.name,
+ results_per_page=self.results_per_page,
+ location_mode=self.location_mode)
+ return item
+
+
+class DirectoryPrefix(DictMixin):
+ """Directory prefix.
+
+ :ivar str name: Name of the deleted directory.
+ :ivar int results_per_page: The maximum number of results retrieved per API call.
+ :ivar str location_mode: The location mode being used to list results. The available
+ options include "primary" and "secondary".
+ :ivar str file_system: The file system that the deleted paths are listed from.
+ :ivar str delimiter: A delimiting character used for hierarchy listing.
+ """
+ def __init__(self, **kwargs):
+ self.name = kwargs.get('prefix')
+ self.results_per_page = kwargs.get('results_per_page')
+ self.file_system = kwargs.get('container')
+ self.delimiter = kwargs.get('delimiter')
+ self.location_mode = kwargs.get('location_mode')
diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py
index 43537ec532cc..80c43d77704d 100644
--- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py
+++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py
@@ -4,7 +4,8 @@
# license information.
# --------------------------------------------------------------------------
# pylint: disable=invalid-overridden-method
-from typing import Any, Dict
+from datetime import datetime
+from typing import Any, Dict, Union
from azure.core.exceptions import AzureError, HttpResponseError
from azure.storage.blob.aio import BlobClient
@@ -133,7 +134,7 @@ async def _create(self, resource_type, content_settings=None, metadata=None, **k
process_storage_error(error)
async def _delete(self, **kwargs):
- # type: (bool, **Any) -> None
+ # type: (**Any) -> Dict[Union[datetime, str]]
"""
Marks the specified path for deletion.
diff --git a/sdk/storage/azure-storage-file-datalake/setup.py b/sdk/storage/azure-storage-file-datalake/setup.py
index 5eac7ecac02e..c56745603eb0 100644
--- a/sdk/storage/azure-storage-file-datalake/setup.py
+++ b/sdk/storage/azure-storage-file-datalake/setup.py
@@ -73,7 +73,7 @@
author_email='ascl@microsoft.com',
url='https://github.com/Azure/azure-sdk-for-python',
classifiers=[
- "Development Status :: 5 - Production/Stable",
+ "Development Status :: 4 - Beta",
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
@@ -94,7 +94,7 @@
]),
install_requires=[
"azure-core<2.0.0,>=1.10.0",
- "msrest>=0.6.18",
+ "msrest>=0.6.21",
"azure-storage-blob<13.0.0,>=12.8.0b1"
],
extras_require={
diff --git a/sdk/storage/azure-storage-file-datalake/swagger/README.md b/sdk/storage/azure-storage-file-datalake/swagger/README.md
index 21473ab91013..47cf1a3b4c8c 100644
--- a/sdk/storage/azure-storage-file-datalake/swagger/README.md
+++ b/sdk/storage/azure-storage-file-datalake/swagger/README.md
@@ -16,7 +16,7 @@ autorest --v3 --python
### Settings
``` yaml
-input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.StorageDataLake/stable/2020-02-10/DataLakeStorage.json
+input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.StorageDataLake/stable/2020-06-12/DataLakeStorage.json
output-folder: ../azure/storage/filedatalake/_generated
namespace: azure.storage.filedatalake
no-namespace-folders: true
@@ -25,4 +25,14 @@ enable-xml: true
vanilla: true
clear-output-folder: true
python: true
+```
+
+### Remove x-ms-pageable
+Currently breaking the latest version of autorest.python
+``` yaml
+directive:
+- from: swagger-document
+ where: $["x-ms-paths"]["/{filesystem}?restype=container&comp=list&hierarchy"].get
+ transform: >
+ delete $["x-ms-pageable"];
```
\ No newline at end of file
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_datalake_service_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_datalake_service_properties.yaml
new file mode 100644
index 000000000000..1fb5e9cd683e
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_datalake_service_properties.yaml
@@ -0,0 +1,86 @@
+interactions:
+- request:
+ body: '
+
+ 1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse2014-02-14'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '585'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 729c5ec3-3b15-11eb-9ec2-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:28:06 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date:
+ - Thu, 10 Dec 2020 18:28:10 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 3dc9118b-001e-0002-7e22-cfc239000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 7427eda6-3b15-11eb-a943-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:28:09 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Thu, 10 Dec 2020 18:28:10 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Origin
+ x-ms-request-id:
+ - 3dc9119b-001e-0002-0422-cfc239000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_disabled_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_disabled_static_website_properties.yaml
new file mode 100644
index 000000000000..35d7dfd52efe
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_disabled_static_website_properties.yaml
@@ -0,0 +1,83 @@
+interactions:
+- request:
+ body: '
+
+ false'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '147'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - effd0504-3b15-11eb-8192-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:31:37 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date:
+ - Thu, 10 Dec 2020 18:31:39 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 5edaeaa9-301e-0019-5322-cffc3a000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - f0fef9fb-3b15-11eb-ad49-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:31:38 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsefalse2014-02-14"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Thu, 10 Dec 2020 18:31:39 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 5edaeab3-301e-0019-5422-cffc3a000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_cors.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_cors.yaml
new file mode 100644
index 000000000000..d08cfd54f5aa
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_cors.yaml
@@ -0,0 +1,86 @@
+interactions:
+- request:
+ body: '
+
+ www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '631'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 0efbba3d-3b16-11eb-91ab-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:32:29 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date:
+ - Thu, 10 Dec 2020 18:32:30 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 3dc91467-001e-0002-6622-cfc239000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 0fbe3818-3b16-11eb-98bd-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:32:30 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Thu, 10 Dec 2020 18:32:30 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Origin
+ x-ms-request-id:
+ - 3dc91470-001e-0002-6722-cfc239000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_default_service_version.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_default_service_version.yaml
new file mode 100644
index 000000000000..e1a232c8d7c0
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_default_service_version.yaml
@@ -0,0 +1,83 @@
+interactions:
+- request:
+ body: '
+
+ 2014-02-14'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '149'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - b4c21f7e-3b15-11eb-b652-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:29:57 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date:
+ - Thu, 10 Dec 2020 18:30:02 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - cb629d48-f01e-0006-0522-cf4f3e000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - b759c331-3b15-11eb-83de-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:30:02 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Thu, 10 Dec 2020 18:30:02 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - cb629d5c-f01e-0006-0622-cf4f3e000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy.yaml
new file mode 100644
index 000000000000..03b761e3a8ac
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy.yaml
@@ -0,0 +1,83 @@
+interactions:
+- request:
+ body: '
+
+ true2'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '176'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - bb297712-3b15-11eb-904d-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:30:08 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date:
+ - Thu, 10 Dec 2020 18:30:12 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 92f6dffa-501e-0020-1722-cf0726000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - bd3db8fc-3b15-11eb-9090-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:30:12 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue2falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Thu, 10 Dec 2020 18:30:12 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 92f6e009-501e-0020-1922-cf0726000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy_edge_cases.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy_edge_cases.yaml
new file mode 100644
index 000000000000..9ef4605e7ce2
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy_edge_cases.yaml
@@ -0,0 +1,338 @@
+interactions:
+- request:
+ body: '
+
+ true1'
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '176'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 7bc7f418-90e4-11eb-92b2-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:14:16 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Mon, 29 Mar 2021 23:14:20 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - 5e3c3b37-b01e-004e-6ff1-246328000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 7ecf48c9-90e4-11eb-aab6-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:14:21 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue1falsefalse"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Mon, 29 Mar 2021 23:14:21 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 5e3c835b-b01e-004e-80f1-246328000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: '
+
+ true365'
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '178'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 7eecfdbb-90e4-11eb-8a9c-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:14:22 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Mon, 29 Mar 2021 23:14:21 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - 5e3c85fd-b01e-004e-68f1-246328000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 7f078f9f-90e4-11eb-8aa7-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:14:22 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Mon, 29 Mar 2021 23:14:21 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 5e3c88d8-b01e-004e-63f1-246328000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: '
+
+ true0'
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '176'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 7f20830d-90e4-11eb-9a0e-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:14:22 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFFInvalidXmlDocumentXML
+ specified is not syntactically valid.\nRequestId:5e3c8b63-b01e-004e-38f1-246328000000\nTime:2021-03-29T23:14:22.4739476Z289Retention
+ days must be greater than 0 and less than or equal to 365 days."
+ headers:
+ Content-Length:
+ - '375'
+ Content-Type:
+ - application/xml
+ Date:
+ - Mon, 29 Mar 2021 23:14:21 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-error-code:
+ - InvalidXmlDocument
+ x-ms-request-id:
+ - 5e3c8b63-b01e-004e-38f1-246328000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 400
+ message: XML specified is not syntactically valid.
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 7f39264f-90e4-11eb-945f-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:14:22 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Mon, 29 Mar 2021 23:14:21 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 5e3c8c4b-b01e-004e-37f1-246328000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: '
+
+ true366'
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '178'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 7f52df63-90e4-11eb-ba7e-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:14:22 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFFInvalidXmlDocumentXML
+ specified is not syntactically valid.\nRequestId:5e3c8e3f-b01e-004e-3df1-246328000000\nTime:2021-03-29T23:14:22.7931726Z291Retention
+ days must be greater than 0 and less than or equal to 365 days."
+ headers:
+ Content-Length:
+ - '375'
+ Content-Type:
+ - application/xml
+ Date:
+ - Mon, 29 Mar 2021 23:14:21 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-error-code:
+ - InvalidXmlDocument
+ x-ms-request-id:
+ - 5e3c8e3f-b01e-004e-3df1-246328000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 400
+ message: XML specified is not syntactically valid.
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 7f698642-90e4-11eb-8c0a-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:14:22 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Mon, 29 Mar 2021 23:14:22 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 5e3c9076-b01e-004e-61f1-246328000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml
new file mode 100644
index 000000000000..75808cd7d66e
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml
@@ -0,0 +1,83 @@
+interactions:
+- request:
+ body: '
+
+ 1.0truefalsetrue5'
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '268'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.9.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 3249dac5-a7c6-11eb-b681-c8348e5fffbf
+ x-ms-date:
+ - Wed, 28 Apr 2021 02:05:25 GMT
+ x-ms-version:
+ - '2020-08-04'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Wed, 28 Apr 2021 02:05:24 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - 80857b38-d01e-0044-6ed2-3bf560000000
+ x-ms-version:
+ - '2020-08-04'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.9.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 32788c99-a7c6-11eb-8724-c8348e5fffbf
+ x-ms-date:
+ - Wed, 28 Apr 2021 02:05:25 GMT
+ x-ms-version:
+ - '2020-08-04'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truefalsetrue51.0falsefalsefalsefalsetrueindex.htmlerrors/error/404error.html"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Wed, 28 Apr 2021 02:05:24 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 80857bb9-d01e-0044-5bd2-3bf560000000
+ x-ms-version:
+ - '2020-08-04'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_logging.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_logging.yaml
new file mode 100644
index 000000000000..4f69cca733c9
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_logging.yaml
@@ -0,0 +1,83 @@
+interactions:
+- request:
+ body: '
+
+ 1.0truetruetruetrue5'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '262'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - fd342ca3-3b15-11eb-be73-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:31:59 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date:
+ - Thu, 10 Dec 2020 18:32:03 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - a0d09fae-301e-0009-6622-cf3952000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - ff7f0ed3-3b15-11eb-ac57-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:32:03 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0truetruetruetrue51.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Thu, 10 Dec 2020 18:32:03 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - a0d09fc6-301e-0009-6b22-cf3952000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml
new file mode 100644
index 000000000000..7d4ec434b6d4
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml
@@ -0,0 +1,83 @@
+interactions:
+- request:
+ body: '
+
+ 1.0truetruetrue5'
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '271'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 9317b341-9bea-11eb-a813-c8348e5fffbf
+ x-ms-date:
+ - Mon, 12 Apr 2021 23:55:35 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Mon, 12 Apr 2021 23:55:35 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - 626fe6f9-301e-007f-0ef7-2f823b000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 937a9045-9bea-11eb-8deb-c8348e5fffbf
+ x-ms-date:
+ - Mon, 12 Apr 2021 23:55:36 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0truetruetrue5true5falsefalse2014-02-14"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Mon, 12 Apr 2021 23:55:35 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 626fe723-301e-007f-2ef7-2f823b000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_properties.yaml
new file mode 100644
index 000000000000..f8112bd067cc
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_properties.yaml
@@ -0,0 +1,83 @@
+interactions:
+- request:
+ body: '
+
+ trueindex.htmlerrors/error/404error.html'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '258'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - eb84d3a1-3b15-11eb-91d5-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:31:29 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date:
+ - Thu, 10 Dec 2020 18:31:31 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 19b2c5ec-601e-002b-2a22-cffc4d000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - ec154eb8-3b15-11eb-83fe-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:31:30 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Thu, 10 Dec 2020 18:31:31 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 19b2c5f6-601e-002b-2b22-cffc4d000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_props_dont_impact_other_props.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_props_dont_impact_other_props.yaml
new file mode 100644
index 000000000000..f02927dae495
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_props_dont_impact_other_props.yaml
@@ -0,0 +1,165 @@
+interactions:
+- request:
+ body: '
+
+ www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '631'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - f83e45bf-3b15-11eb-a7b4-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:31:51 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date:
+ - Thu, 10 Dec 2020 18:31:52 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 618f9f42-301e-0044-6722-cff6be000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - f8ce4139-3b15-11eb-8843-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:31:51 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsefalse2014-02-14"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Thu, 10 Dec 2020 18:31:52 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 618f9f4b-301e-0044-6822-cff6be000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: '
+
+ trueindex.htmlerrors/error/404error.html'
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '258'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - f8f1cedf-3b15-11eb-800b-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:31:52 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date:
+ - Thu, 10 Dec 2020 18:31:52 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 618f9f4c-301e-0044-6922-cff6be000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - f919f048-3b15-11eb-a5be-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 18:31:52 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Thu, 10 Dec 2020 18:31:53 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-request-id:
+ - 618f9f4e-301e-0044-6a22-cff6be000000
+ x-ms-version:
+ - '2020-04-08'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_datalake_service_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_datalake_service_properties.yaml
new file mode 100644
index 000000000000..17b6be66734e
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_datalake_service_properties.yaml
@@ -0,0 +1,65 @@
+interactions:
+- request:
+ body: '
+
+ 1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse2014-02-14'
+ headers:
+ Content-Length:
+ - '585'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 2b702a60-3b29-11eb-8248-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:49:17 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date: Thu, 10 Dec 2020 20:49:20 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 4d051f55-601e-0014-6a35-cf34ee000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 2e19cdd4-3b29-11eb-9267-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:49:21 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type: application/xml
+ Date: Thu, 10 Dec 2020 20:49:20 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 4d051f62-601e-0014-6c35-cf34ee000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_disabled_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_disabled_static_website_properties.yaml
new file mode 100644
index 000000000000..cdfc6d52c1b2
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_disabled_static_website_properties.yaml
@@ -0,0 +1,64 @@
+interactions:
+- request:
+ body: '
+
+ false'
+ headers:
+ Content-Length:
+ - '147'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 4c58a66e-3b29-11eb-87d4-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:50:12 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date: Thu, 10 Dec 2020 20:50:13 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 035b56a1-801e-0033-0c36-cf232a000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 4d32116c-3b29-11eb-9b17-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:50:13 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsefalse2014-02-14"
+ headers:
+ Content-Type: application/xml
+ Date: Thu, 10 Dec 2020 20:50:13 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 035b56ac-801e-0033-0d36-cf232a000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_cors.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_cors.yaml
new file mode 100644
index 000000000000..5a9e9e5d720e
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_cors.yaml
@@ -0,0 +1,66 @@
+interactions:
+- request:
+ body: '
+
+ www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500'
+ headers:
+ Content-Length:
+ - '631'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 65643618-3b29-11eb-93a7-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:50:54 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date: Thu, 10 Dec 2020 20:50:54 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 0cbd8b49-e01e-0047-6236-cf17da000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 65d59905-3b29-11eb-a3ec-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:50:55 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type: application/xml
+ Date: Thu, 10 Dec 2020 20:50:54 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ Vary: Origin
+ x-ms-request-id: 0cbd8b52-e01e-0047-6336-cf17da000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_default_service_version.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_default_service_version.yaml
new file mode 100644
index 000000000000..34270046cbac
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_default_service_version.yaml
@@ -0,0 +1,64 @@
+interactions:
+- request:
+ body: '
+
+ 2014-02-14'
+ headers:
+ Content-Length:
+ - '149'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 39a10d94-3b29-11eb-a3e0-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:49:41 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date: Thu, 10 Dec 2020 20:49:41 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 435b56a2-901e-0000-2c35-cf7c81000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 3a0a8d22-3b29-11eb-8570-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:49:41 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type: application/xml
+ Date: Thu, 10 Dec 2020 20:49:41 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 435b56ab-901e-0000-2d35-cf7c81000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy.yaml
new file mode 100644
index 000000000000..bcc584167493
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy.yaml
@@ -0,0 +1,64 @@
+interactions:
+- request:
+ body: '
+
+ true2'
+ headers:
+ Content-Length:
+ - '176'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 3de166a3-3b29-11eb-8840-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:49:48 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date: Thu, 10 Dec 2020 20:49:48 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 2b055e5f-101e-0031-0d35-cf9d92000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 3e4f40cc-3b29-11eb-8857-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:49:49 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue2falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type: application/xml
+ Date: Thu, 10 Dec 2020 20:49:48 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 2b055e6f-101e-0031-0e36-cf9d92000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy_edge_cases.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy_edge_cases.yaml
new file mode 100644
index 000000000000..67249600dbac
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy_edge_cases.yaml
@@ -0,0 +1,266 @@
+interactions:
+- request:
+ body: '
+
+ true1'
+ headers:
+ Accept:
+ - application/xml
+ Content-Length:
+ - '176'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - cb39e77a-90e4-11eb-be24-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:16:30 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Mon, 29 Mar 2021 23:16:34 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: 74caa7ec-c01e-008f-1bf1-24c4ca000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 202
+ message: Accepted
+ url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - ce837ad8-90e4-11eb-81b2-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:16:35 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue1falsefalse"
+ headers:
+ Content-Type: application/xml
+ Date: Mon, 29 Mar 2021 23:16:34 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 74cb0890-c01e-008f-0bf1-24c4ca000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: '
+
+ true365'
+ headers:
+ Accept:
+ - application/xml
+ Content-Length:
+ - '178'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - ce930b3b-90e4-11eb-9c87-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:16:35 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Mon, 29 Mar 2021 23:16:34 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: 74cb0b17-c01e-008f-61f1-24c4ca000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 202
+ message: Accepted
+ url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - cea473bc-90e4-11eb-aeda-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:16:35 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse"
+ headers:
+ Content-Type: application/xml
+ Date: Mon, 29 Mar 2021 23:16:35 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 74cb0dd8-c01e-008f-4af1-24c4ca000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: '
+
+ true0'
+ headers:
+ Accept:
+ - application/xml
+ Content-Length:
+ - '176'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - ceb5f122-90e4-11eb-947a-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:16:35 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFFInvalidXmlDocumentXML
+ specified is not syntactically valid.\nRequestId:74cb106a-c01e-008f-20f1-24c4ca000000\nTime:2021-03-29T23:16:36.0596298Z289Retention
+ days must be greater than 0 and less than or equal to 365 days."
+ headers:
+ Content-Length: '375'
+ Content-Type: application/xml
+ Date: Mon, 29 Mar 2021 23:16:35 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-error-code: InvalidXmlDocument
+ x-ms-request-id: 74cb106a-c01e-008f-20f1-24c4ca000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 400
+ message: XML specified is not syntactically valid.
+ url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - ced91740-90e4-11eb-a356-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:16:36 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse"
+ headers:
+ Content-Type: application/xml
+ Date: Mon, 29 Mar 2021 23:16:35 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 74cb15dd-c01e-008f-6ff1-24c4ca000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: '
+
+ true366'
+ headers:
+ Accept:
+ - application/xml
+ Content-Length:
+ - '178'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - cee74e3a-90e4-11eb-b89c-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:16:36 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFFInvalidXmlDocumentXML
+ specified is not syntactically valid.\nRequestId:74cb1805-c01e-008f-0af1-24c4ca000000\nTime:2021-03-29T23:16:36.2485211Z291Retention
+ days must be greater than 0 and less than or equal to 365 days."
+ headers:
+ Content-Length: '375'
+ Content-Type: application/xml
+ Date: Mon, 29 Mar 2021 23:16:35 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-error-code: InvalidXmlDocument
+ x-ms-request-id: 74cb1805-c01e-008f-0af1-24c4ca000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 400
+ message: XML specified is not syntactically valid.
+ url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - cef4e47f-90e4-11eb-8aa2-c8348e5fffbf
+ x-ms-date:
+ - Mon, 29 Mar 2021 23:16:36 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse"
+ headers:
+ Content-Type: application/xml
+ Date: Mon, 29 Mar 2021 23:16:35 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 74cb1a42-c01e-008f-33f1-24c4ca000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml
new file mode 100644
index 000000000000..f1e279a11dc7
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml
@@ -0,0 +1,66 @@
+interactions:
+- request:
+ body: '
+
+ 1.0truefalsetrue5'
+ headers:
+ Accept:
+ - application/xml
+ Content-Length:
+ - '268'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.9.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 2b37dee6-a7c6-11eb-9248-c8348e5fffbf
+ x-ms-date:
+ - Wed, 28 Apr 2021 02:05:13 GMT
+ x-ms-version:
+ - '2020-08-04'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Wed, 28 Apr 2021 02:05:12 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: 59421d43-b01e-006d-32d2-3bcb14000000
+ x-ms-version: '2020-08-04'
+ status:
+ code: 202
+ message: Accepted
+ url: https://seannse.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.9.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 2b50bdfa-a7c6-11eb-a412-c8348e5fffbf
+ x-ms-date:
+ - Wed, 28 Apr 2021 02:05:13 GMT
+ x-ms-version:
+ - '2020-08-04'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truefalsetrue51.0falsefalsefalsefalsetrueindex.htmlerrors/error/404error.html"
+ headers:
+ Content-Type: application/xml
+ Date: Wed, 28 Apr 2021 02:05:12 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 59421dd9-b01e-006d-03d2-3bcb14000000
+ x-ms-version: '2020-08-04'
+ status:
+ code: 200
+ message: OK
+ url: https://seannse.blob.core.windows.net/?restype=service&comp=properties
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_logging.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_logging.yaml
new file mode 100644
index 000000000000..a314afd7f16a
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_logging.yaml
@@ -0,0 +1,64 @@
+interactions:
+- request:
+ body: '
+
+ 1.0truetruetruetrue5'
+ headers:
+ Content-Length:
+ - '262'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 56586676-3b29-11eb-aad2-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:50:29 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date: Thu, 10 Dec 2020 20:50:31 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 2f4860f9-b01e-0028-2436-cf1d29000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 5859625e-3b29-11eb-bd70-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:50:32 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0truetruetruetrue51.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type: application/xml
+ Date: Thu, 10 Dec 2020 20:50:32 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 2f486112-b01e-0028-2a36-cf1d29000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml
new file mode 100644
index 000000000000..2a6875525392
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml
@@ -0,0 +1,66 @@
+interactions:
+- request:
+ body: '
+
+ 1.0truetruetrue5'
+ headers:
+ Accept:
+ - application/xml
+ Content-Length:
+ - '271'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - d49b9a00-9bea-11eb-a75f-c8348e5fffbf
+ x-ms-date:
+ - Mon, 12 Apr 2021 23:57:25 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Mon, 12 Apr 2021 23:57:24 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: e94c6acf-d01e-0083-73f7-2f53c2000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 202
+ message: Accepted
+ url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.8.1b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - d4d6805a-9bea-11eb-a347-c8348e5fffbf
+ x-ms-date:
+ - Mon, 12 Apr 2021 23:57:26 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue51.0truetruetrue5true5falsefalse2014-02-14"
+ headers:
+ Content-Type: application/xml
+ Date: Mon, 12 Apr 2021 23:57:24 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: e94c6af5-d01e-0083-10f7-2f53c2000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_properties.yaml
new file mode 100644
index 000000000000..f7b9352d25c8
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_properties.yaml
@@ -0,0 +1,64 @@
+interactions:
+- request:
+ body: '
+
+ trueindex.htmlerrors/error/404error.html'
+ headers:
+ Content-Length:
+ - '258'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 46cd3bc1-3b29-11eb-9562-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:50:03 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date: Thu, 10 Dec 2020 20:50:06 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 09facd4f-201e-0048-4136-cf61b6000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 48cf4185-3b29-11eb-a7fe-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:50:06 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type: application/xml
+ Date: Thu, 10 Dec 2020 20:50:06 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 09facd68-201e-0048-4736-cf61b6000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_props_dont_impact_other_props.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_props_dont_impact_other_props.yaml
new file mode 100644
index 000000000000..a13ee293de3f
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_props_dont_impact_other_props.yaml
@@ -0,0 +1,127 @@
+interactions:
+- request:
+ body: '
+
+ www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500'
+ headers:
+ Content-Length:
+ - '631'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 507611e3-3b29-11eb-babe-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:50:19 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date: Thu, 10 Dec 2020 20:50:22 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 20bfe7b1-501e-000f-0836-cf0aed000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 5294966f-3b29-11eb-83d6-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:50:23 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsefalse2014-02-14"
+ headers:
+ Content-Type: application/xml
+ Date: Thu, 10 Dec 2020 20:50:22 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 20bfe7ba-501e-000f-0936-cf0aed000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: '
+
+ trueindex.htmlerrors/error/404error.html'
+ headers:
+ Content-Length:
+ - '258'
+ Content-Type:
+ - application/xml; charset=utf-8
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 52b6143b-3b29-11eb-9fa2-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:50:23 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: ''
+ headers:
+ Date: Thu, 10 Dec 2020 20:50:22 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 20bfe7bd-501e-000f-0a36-cf0aed000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 202
+ message: Accepted
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 52d33ecf-3b29-11eb-90d7-c8348e5fffbf
+ x-ms-date:
+ - Thu, 10 Dec 2020 20:50:23 GMT
+ x-ms-version:
+ - '2020-04-08'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+ response:
+ body:
+ string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14"
+ headers:
+ Content-Type: application/xml
+ Date: Thu, 10 Dec 2020 20:50:22 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ x-ms-request-id: 20bfe7bf-501e-000f-0b36-cf0aed000000
+ x-ms-version: '2020-04-08'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/?restype=service&comp=properties
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml
new file mode 100644
index 000000000000..abbdbad93587
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml
@@ -0,0 +1,866 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 457ffd25-98f0-11eb-9fc4-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:49 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:49 GMT
+ ETag:
+ - '"0x8D8FB142A02C1AD"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 04:58:49 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - b52dee7e-101e-009c-0afd-2ce0c6000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 45d4da20-98f0-11eb-afc7-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:49 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0?resource=file
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:49 GMT
+ ETag:
+ - '"0x8D8FB142A5A5964"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - fe4b746f-101f-0078-37fd-2cee58000000
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 462a2bb0-98f0-11eb-9d86-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1?resource=file
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:49 GMT
+ ETag:
+ - '"0x8D8FB142A72A2E9"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - fe4b7472-101f-0078-39fd-2cee58000000
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 464282da-98f0-11eb-9c07-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir1?resource=directory
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ ETag:
+ - '"0x8D8FB142A8C7CE5"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - fe4b7473-101f-0078-3afd-2cee58000000
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 465c2557-98f0-11eb-92ef-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir2?resource=directory
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ ETag:
+ - '"0x8D8FB142AA2FDB0"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - fe4b7474-101f-0078-3bfd-2cee58000000
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 4672e1bc-98f0-11eb-b0af-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3?resource=directory
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ ETag:
+ - '"0x8D8FB142ABAEC16"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - fe4b7475-101f-0078-3cfd-2cee58000000
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 468a6276-98f0-11eb-9b56-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3?resource=file
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ ETag:
+ - '"0x8D8FB142AD2BBC1"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - fe4b7476-101f-0078-3dfd-2cee58000000
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 46a2a43b-98f0-11eb-a4be-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir?resource=file
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:50 GMT
+ ETag:
+ - '"0x8D8FB142AED8B91"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 04:58:51 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - fe4b7477-101f-0078-3efd-2cee58000000
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 46bce3aa-98f0-11eb-bf33-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:51 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:51 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent:
+ - 'false'
+ x-ms-deletion-id:
+ - '132624179314769963'
+ x-ms-request-id:
+ - fe4b7478-101f-0078-3ffd-2cee58000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 46fafd7d-98f0-11eb-bf7b-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:51 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:51 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent:
+ - 'false'
+ x-ms-deletion-id:
+ - '132624179316566740'
+ x-ms-request-id:
+ - fe4b7479-101f-0078-40fd-2cee58000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 47228501-98f0-11eb-b30e-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:51 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir1?recursive=true
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:51 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent:
+ - 'false'
+ x-ms-deletion-id:
+ - '132624179319150091'
+ x-ms-request-id:
+ - fe4b747a-101f-0078-41fd-2cee58000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 474350f0-98f0-11eb-a754-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:52 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir2?recursive=true
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:51 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent:
+ - 'false'
+ x-ms-deletion-id:
+ - '132624179321356419'
+ x-ms-request-id:
+ - fe4b747b-101f-0078-42fd-2cee58000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 4766de88-98f0-11eb-8ce6-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:52 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:52 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent:
+ - 'false'
+ x-ms-deletion-id:
+ - '132624179324953375'
+ x-ms-request-id:
+ - fe4b747d-101f-0078-43fd-2cee58000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 4797b48c-98f0-11eb-b1e5-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:52 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:58:52 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent:
+ - 'false'
+ x-ms-deletion-id:
+ - '132624179328345615'
+ x-ms-request-id:
+ - fe4b747e-101f-0078-44fd-2cee58000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 47ca0d47-98f0-11eb-9707-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:52 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&showonly=deleted
+ response:
+ body:
+ string: "\uFEFFdir1132624179319150091trueFri,
+ 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50
+ GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A8C7CE50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:51 GMT4dir2132624179321356419trueFri,
+ 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50
+ GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AA2FDB00application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:52 GMT4dir3/file_in_dir3132624179324953375trueFri,
+ 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50
+ GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AD2BBC10application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:52 GMT4dir3/subdir/file_in_subdir132624179328345615trueFri,
+ 09 Apr 2021 04:58:51 GMTFri, 09 Apr 2021 04:58:51
+ GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AED8B910application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:52 GMT4file0132624179314769963trueFri,
+ 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50
+ GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A5A59640application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:51 GMT4file1132624179316566740trueFri,
+ 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50
+ GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A72A2E90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:51 GMT4"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Fri, 09 Apr 2021 04:58:52 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Origin
+ x-ms-request-id:
+ - b52df022-101e-009c-72fd-2ce0c6000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 47f11ece-98f0-11eb-8583-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:53 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&prefix=dir3%2F&showonly=deleted
+ response:
+ body:
+ string: "\uFEFFdir3/dir3/file_in_dir3132624179324953375trueFri,
+ 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50
+ GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AD2BBC10application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:52 GMT4dir3/subdir/file_in_subdir132624179328345615trueFri,
+ 09 Apr 2021 04:58:51 GMTFri, 09 Apr 2021 04:58:51
+ GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AED8B910application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:52 GMT4"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Fri, 09 Apr 2021 04:58:52 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Origin
+ x-ms-request-id:
+ - b52df043-101e-009c-0ffd-2ce0c6000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 480765c7-98f0-11eb-8bf6-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:53 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&maxResults=2&showonly=deleted
+ response:
+ body:
+ string: "\uFEFF2dir1132624179319150091trueFri,
+ 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50
+ GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A8C7CE50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:51 GMT4dir2132624179321356419trueFri,
+ 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50
+ GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AA2FDB00application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:52 GMT42!248!MDAwMTQwIU1URTRPVEV6TVRZM01EWTNPVE0xTWpZMU16Z2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdE5ERmlPREV3TURZQk1ERkVOekpEUmtRd056aENSRGxGUXdJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU4OjUzLjQyMjQyNzdaIQ--"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Fri, 09 Apr 2021 04:58:53 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Origin
+ x-ms-request-id:
+ - b52df058-101e-009c-22fd-2ce0c6000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 482a7ccc-98f0-11eb-ba28-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:58:53 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container&comp=list&marker=2%21248%21MDAwMTQwIU1URTRPVEV6TVRZM01EWTNPVE0xTWpZMU16Z2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdE5ERmlPREV3TURZQk1ERkVOekpEUmtRd056aENSRGxGUXdJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU4OjUzLjQyMjQyNzdaIQ--&maxResults=4&showonly=deleted
+ response:
+ body:
+ string: "\uFEFF2!248!MDAwMTQwIU1URTRPVEV6TVRZM01EWTNPVE0xTWpZMU16Z2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdE5ERmlPREV3TURZQk1ERkVOekpEUmtRd056aENSRGxGUXdJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU4OjUzLjQyMjQyNzdaIQ--4dir3/file_in_dir3132624179324953375trueFri,
+ 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50
+ GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AD2BBC10application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:52 GMT4dir3/subdir/file_in_subdir132624179328345615trueFri,
+ 09 Apr 2021 04:58:51 GMTFri, 09 Apr 2021 04:58:51
+ GMTWed, 14 Apr 2021 04:58:52 GMT0x8D8FB142AED8B910application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:52 GMT4file0132624179314769963trueFri,
+ 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50
+ GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A5A59640application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:51 GMT4file1132624179316566740trueFri,
+ 09 Apr 2021 04:58:50 GMTFri, 09 Apr 2021 04:58:50
+ GMTWed, 14 Apr 2021 04:58:51 GMT0x8D8FB142A72A2E90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:58:51 GMT4"
+ headers:
+ Content-Type:
+ - application/xml
+ Date:
+ - Fri, 09 Apr 2021 04:58:53 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Origin
+ x-ms-request-id:
+ - b52df06e-101e-009c-36fd-2ce0c6000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_dir_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_dir_with_version_id.yaml
new file mode 100644
index 000000000000..cde1fb719f4b
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_dir_with_version_id.yaml
@@ -0,0 +1,288 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 0b4cc4a6-96fb-11eb-96f3-c8348e5fffbf
+ x-ms-date:
+ - Tue, 06 Apr 2021 17:10:53 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/fs102714b1?restype=container
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Tue, 06 Apr 2021 17:10:53 GMT
+ ETag:
+ - '"0x8D8F91EEFE08F2A"'
+ Last-Modified:
+ - Tue, 06 Apr 2021 17:10:54 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - 0e483e20-e01e-0098-1107-2b6dc1000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 0bbbbba2-96fb-11eb-a4b1-c8348e5fffbf
+ x-ms-date:
+ - Tue, 06 Apr 2021 17:10:54 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/fs102714b1/dir10?resource=directory
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Tue, 06 Apr 2021 17:10:54 GMT
+ ETag:
+ - '"0x8D8F91EF05A3265"'
+ Last-Modified:
+ - Tue, 06 Apr 2021 17:10:54 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - 352a134d-a01f-006d-2407-2bf9eb000000
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 0c2cb5b8-96fb-11eb-8594-c8348e5fffbf
+ x-ms-date:
+ - Tue, 06 Apr 2021 17:10:55 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/fs102714b1/dir10?recursive=true
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Tue, 06 Apr 2021 17:10:55 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent:
+ - 'false'
+ x-ms-deletion-id:
+ - '132622026556759923'
+ x-ms-request-id:
+ - 352a134e-a01f-006d-2507-2bf9eb000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 0ca24d8b-96fb-11eb-a718-c8348e5fffbf
+ x-ms-date:
+ - Tue, 06 Apr 2021 17:10:55 GMT
+ x-ms-encryption-algorithm:
+ - AES256
+ x-ms-version:
+ - '2020-06-12'
+ method: HEAD
+ uri: https://storagename.blob.core.windows.net/fs102714b1/dir10
+ response:
+ body:
+ string: ''
+ headers:
+ Date:
+ - Tue, 06 Apr 2021 17:10:55 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Origin
+ x-ms-error-code:
+ - BlobNotFound
+ x-ms-request-id:
+ - 0e48407d-e01e-0098-0307-2b6dc1000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 404
+ message: The specified blob does not exist.
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 0cba7db5-96fb-11eb-a7cf-c8348e5fffbf
+ x-ms-date:
+ - Tue, 06 Apr 2021 17:10:55 GMT
+ x-ms-undelete-source:
+ - dir10?deletionid=132622026556759923
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/fs102714b1/dir10?comp=undelete
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Tue, 06 Apr 2021 17:10:55 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-creation-time:
+ - Tue, 06 Apr 2021 17:10:54 GMT
+ x-ms-request-id:
+ - 0e4840aa-e01e-0098-2607-2b6dc1000000
+ x-ms-resource-type:
+ - directory
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 0d03eeec-96fb-11eb-aed8-c8348e5fffbf
+ x-ms-date:
+ - Tue, 06 Apr 2021 17:10:56 GMT
+ x-ms-encryption-algorithm:
+ - AES256
+ x-ms-version:
+ - '2020-06-12'
+ method: HEAD
+ uri: https://storagename.blob.core.windows.net/fs102714b1/dir10
+ response:
+ body:
+ string: ''
+ headers:
+ Accept-Ranges:
+ - bytes
+ Content-Length:
+ - '0'
+ Content-Type:
+ - application/octet-stream
+ Date:
+ - Tue, 06 Apr 2021 17:10:55 GMT
+ ETag:
+ - '"0x8D8F91EF05A3265"'
+ Last-Modified:
+ - Tue, 06 Apr 2021 17:10:54 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Vary:
+ - Origin
+ x-ms-access-tier:
+ - Hot
+ x-ms-access-tier-inferred:
+ - 'true'
+ x-ms-blob-type:
+ - BlockBlob
+ x-ms-creation-time:
+ - Tue, 06 Apr 2021 17:10:54 GMT
+ x-ms-group:
+ - $superuser
+ x-ms-lease-state:
+ - available
+ x-ms-lease-status:
+ - unlocked
+ x-ms-meta-hdi_isfolder:
+ - 'true'
+ x-ms-owner:
+ - $superuser
+ x-ms-permissions:
+ - rwxr-x---
+ x-ms-request-id:
+ - 0e48411c-e01e-0098-0707-2b6dc1000000
+ x-ms-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml
new file mode 100644
index 000000000000..41ff2d4cd98d
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml
@@ -0,0 +1,286 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 22edf54b-98f0-11eb-b813-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:57:51 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/fs1249d1512?restype=container
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:57:51 GMT
+ ETag:
+ - '"0x8D8FB140784D2B9"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 04:57:51 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - 5a438fc7-b01e-003c-6efc-2c6467000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 235ac06a-98f0-11eb-a682-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:57:51 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87?resource=file
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:57:52 GMT
+ ETag:
+ - '"0x8D8FB1407FD32D0"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 04:57:52 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - d806c18e-101f-009c-29fc-2ce0c6000000
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 23cc6ec8-98f0-11eb-acac-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:57:52 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:57:52 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent:
+ - 'false'
+ x-ms-deletion-id:
+ - '132624178727549652'
+ x-ms-request-id:
+ - d806c18f-101f-009c-2afc-2ce0c6000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 23fa5cb0-98f0-11eb-b2c8-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:57:52 GMT
+ x-ms-encryption-algorithm:
+ - AES256
+ x-ms-version:
+ - '2020-06-12'
+ method: HEAD
+ uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87
+ response:
+ body:
+ string: ''
+ headers:
+ Date:
+ - Fri, 09 Apr 2021 04:57:52 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ Vary:
+ - Origin
+ x-ms-error-code:
+ - BlobNotFound
+ x-ms-request-id:
+ - 5a43929f-b01e-003c-16fc-2c6467000000
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 404
+ message: The specified blob does not exist.
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 241229e1-98f0-11eb-9ef6-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:57:52 GMT
+ x-ms-undelete-source:
+ - dir10/file%C5%87?deletionid=132624178727549652
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87?comp=undelete
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 04:57:52 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-creation-time:
+ - Fri, 09 Apr 2021 04:57:52 GMT
+ x-ms-request-id:
+ - 5a439303-b01e-003c-51fc-2c6467000000
+ x-ms-resource-type:
+ - file
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 2438c4bb-98f0-11eb-80b5-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:57:53 GMT
+ x-ms-encryption-algorithm:
+ - AES256
+ x-ms-version:
+ - '2020-06-12'
+ method: HEAD
+ uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87
+ response:
+ body:
+ string: ''
+ headers:
+ Accept-Ranges:
+ - bytes
+ Content-Length:
+ - '0'
+ Content-Type:
+ - application/octet-stream
+ Date:
+ - Fri, 09 Apr 2021 04:57:52 GMT
+ ETag:
+ - '"0x8D8FB1407FD32D0"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 04:57:52 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Vary:
+ - Origin
+ x-ms-access-tier:
+ - Hot
+ x-ms-access-tier-inferred:
+ - 'true'
+ x-ms-blob-type:
+ - BlockBlob
+ x-ms-creation-time:
+ - Fri, 09 Apr 2021 04:57:52 GMT
+ x-ms-group:
+ - $superuser
+ x-ms-lease-state:
+ - available
+ x-ms-lease-status:
+ - unlocked
+ x-ms-owner:
+ - $superuser
+ x-ms-permissions:
+ - rw-r-----
+ x-ms-request-id:
+ - 5a439389-b01e-003c-20fc-2c6467000000
+ x-ms-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml
new file mode 100644
index 000000000000..5be0f0b32c74
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml
@@ -0,0 +1,651 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 65f0c226-98f0-11eb-aa01-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:43 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:43 GMT
+ ETag: '"0x8D8FB144A5B1290"'
+ Last-Modified: Fri, 09 Apr 2021 04:59:43 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: 0e6d5285-301e-0040-04fd-2c4a98000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 201
+ message: Created
+ url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 662ce0fb-98f0-11eb-8215-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:43 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0?resource=file
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:43 GMT
+ ETag: '"0x8D8FB144AAA44AB"'
+ Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: f659c881-a01f-000f-53fd-2c3bcc000000
+ x-ms-request-server-encrypted: 'true'
+ x-ms-version: '2020-06-12'
+ status:
+ code: 201
+ message: Created
+ url: https://storagename.dfs.core.windows.net/filesystemac201283/file0?resource=file
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 667a2c76-98f0-11eb-9627-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:44 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1?resource=file
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:43 GMT
+ ETag: '"0x8D8FB144AB9BF70"'
+ Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: f659c884-a01f-000f-56fd-2c3bcc000000
+ x-ms-request-server-encrypted: 'true'
+ x-ms-version: '2020-06-12'
+ status:
+ code: 201
+ message: Created
+ url: https://storagename.dfs.core.windows.net/filesystemac201283/file1?resource=file
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 66898e41-98f0-11eb-a713-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:44 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?resource=directory
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:43 GMT
+ ETag: '"0x8D8FB144AC81FE4"'
+ Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: f659c885-a01f-000f-57fd-2c3bcc000000
+ x-ms-request-server-encrypted: 'true'
+ x-ms-version: '2020-06-12'
+ status:
+ code: 201
+ message: Created
+ url: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?resource=directory
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 6697d38e-98f0-11eb-b5cc-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:44 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?resource=directory
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:44 GMT
+ ETag: '"0x8D8FB144AD659D9"'
+ Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: f659c886-a01f-000f-58fd-2c3bcc000000
+ x-ms-request-server-encrypted: 'true'
+ x-ms-version: '2020-06-12'
+ status:
+ code: 201
+ message: Created
+ url: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?resource=directory
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 66a618df-98f0-11eb-a9fc-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:44 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3?resource=directory
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:44 GMT
+ ETag: '"0x8D8FB144AE4E3A9"'
+ Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: f659c887-a01f-000f-59fd-2c3bcc000000
+ x-ms-request-server-encrypted: 'true'
+ x-ms-version: '2020-06-12'
+ status:
+ code: 201
+ message: Created
+ url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3?resource=directory
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 66b4b5fb-98f0-11eb-995e-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:44 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?resource=file
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:44 GMT
+ ETag: '"0x8D8FB144AF4B2F5"'
+ Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: f659c888-a01f-000f-5afd-2c3bcc000000
+ x-ms-request-server-encrypted: 'true'
+ x-ms-version: '2020-06-12'
+ status:
+ code: 201
+ message: Created
+ url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?resource=file
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 66c49340-98f0-11eb-b1d8-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:44 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?resource=file
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:44 GMT
+ ETag: '"0x8D8FB144B0738B7"'
+ Last-Modified: Fri, 09 Apr 2021 04:59:44 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: f659c889-a01f-000f-5bfd-2c3bcc000000
+ x-ms-request-server-encrypted: 'true'
+ x-ms-version: '2020-06-12'
+ status:
+ code: 201
+ message: Created
+ url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?resource=file
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 66d77f1e-98f0-11eb-b8bb-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:44 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:44 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent: 'false'
+ x-ms-deletion-id: '132624179854239734'
+ x-ms-request-id: f659c88a-a01f-000f-5cfd-2c3bcc000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.dfs.core.windows.net/filesystemac201283/file0
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 67229b2e-98f0-11eb-90b2-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:45 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:44 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent: 'false'
+ x-ms-deletion-id: '132624179855451954'
+ x-ms-request-id: f659c88c-a01f-000f-5dfd-2c3bcc000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.dfs.core.windows.net/filesystemac201283/file1
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 67349e3d-98f0-11eb-b7db-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:45 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?recursive=true
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:45 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent: 'false'
+ x-ms-deletion-id: '132624179856631159'
+ x-ms-request-id: f659c88d-a01f-000f-5efd-2c3bcc000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?recursive=true
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 6746f037-98f0-11eb-8a74-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:45 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?recursive=true
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:45 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent: 'false'
+ x-ms-deletion-id: '132624179857809934'
+ x-ms-request-id: f659c88e-a01f-000f-5ffd-2c3bcc000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?recursive=true
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 6762b5d6-98f0-11eb-914b-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:45 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:45 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent: 'false'
+ x-ms-deletion-id: '132624179859739548'
+ x-ms-request-id: f659c890-a01f-000f-60fd-2c3bcc000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 67768b7e-98f0-11eb-8eb6-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:46 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 04:59:45 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent: 'false'
+ x-ms-deletion-id: '132624179861674259'
+ x-ms-request-id: f659c891-a01f-000f-61fd-2c3bcc000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 67958534-98f0-11eb-8045-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:46 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&showonly=deleted
+ response:
+ body:
+ string: "\uFEFFdir1132624179856631159trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AC81FE40application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:45 GMT4dir2132624179857809934trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AD659D90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:45 GMT4dir3/file_in_dir3132624179859739548trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AF4B2F50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:45 GMT4dir3/subdir/file_in_subdir132624179861674259trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:46 GMT0x8D8FB144B0738B70application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:46 GMT4file0132624179854239734trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AAA44AB0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:45 GMT4file1132624179855451954trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AB9BF700application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:45 GMT4"
+ headers:
+ Content-Type: application/xml
+ Date: Fri, 09 Apr 2021 04:59:45 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ Vary: Origin
+ x-ms-request-id: 0e6d5e14-301e-0040-4cfd-2c4a98000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&showonly=deleted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 67b4cd06-98f0-11eb-883c-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:46 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&prefix=dir3/&showonly=deleted
+ response:
+ body:
+ string: "\uFEFFdir3/dir3/file_in_dir3132624179859739548trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AF4B2F50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:45 GMT4dir3/subdir/file_in_subdir132624179861674259trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:46 GMT0x8D8FB144B0738B70application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:46 GMT4"
+ headers:
+ Content-Type: application/xml
+ Date: Fri, 09 Apr 2021 04:59:45 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ Vary: Origin
+ x-ms-request-id: 0e6d5f1f-301e-0040-5cfd-2c4a98000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&prefix=dir3/&showonly=deleted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 67c3ca83-98f0-11eb-a7d8-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:46 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&maxResults=2&showonly=deleted
+ response:
+ body:
+ string: "\uFEFF2dir1132624179856631159trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AC81FE40application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:45 GMT4dir2132624179857809934trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AD659D90application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:45 GMT42!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--"
+ headers:
+ Content-Type: application/xml
+ Date: Fri, 09 Apr 2021 04:59:45 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ Vary: Origin
+ x-ms-request-id: 0e6d5f7c-301e-0040-0cfd-2c4a98000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&maxResults=2&showonly=deleted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 67df68ca-98f0-11eb-abf0-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 04:59:46 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: GET
+ uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&marker=2!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--&maxResults=4&showonly=deleted
+ response:
+ body:
+ string: "\uFEFF2!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--4dir3/file_in_dir3132624179859739548trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AF4B2F50application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:45 GMT4dir3/subdir/file_in_subdir132624179861674259trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:46 GMT0x8D8FB144B0738B70application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:46 GMT4file0132624179854239734trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AAA44AB0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:45 GMT4file1132624179855451954trueFri,
+ 09 Apr 2021 04:59:44 GMTFri, 09 Apr 2021 04:59:44
+ GMTWed, 14 Apr 2021 04:59:45 GMT0x8D8FB144AB9BF700application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueFri,
+ 09 Apr 2021 04:59:45 GMT4"
+ headers:
+ Content-Type: application/xml
+ Date: Fri, 09 Apr 2021 04:59:46 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ Vary: Origin
+ x-ms-request-id: 0e6d6057-301e-0040-02fd-2c4a98000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container&comp=list&marker=2!248!MDAwMTQwIU1USTROREkwTkRRNE9UUTVNRFk1TWpZeU5qa2dNQ0F2YzJWaGJtNXpaV05oYm1GeWVRRXdNVVEyTURrME1EazNOMEV5UVVRekx5UjBjbUZ6YUM5bWFXeGxjM2x6ZEdWdFlXTXlNREV5T0RNQk1ERkVOekpEUmtReU4wVTBNekZCUlFJdlpHbHlNd0k9ITAwMDAyOCEyMDIxLTA0LTA5VDA0OjU5OjQ2LjYxMTk1MTFaIQ--&maxResults=4&showonly=deleted
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_dir_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_dir_with_version_id.yaml
new file mode 100644
index 000000000000..63537346b811
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_dir_with_version_id.yaml
@@ -0,0 +1,205 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 778aae3a-96fc-11eb-b381-c8348e5fffbf
+ x-ms-date:
+ - Tue, 06 Apr 2021 17:21:04 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/fs95ee172e?restype=container
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Tue, 06 Apr 2021 17:21:04 GMT
+ ETag: '"0x8D8F9205BF6672C"'
+ Last-Modified: Tue, 06 Apr 2021 17:21:05 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: 2409aea0-f01e-0002-7309-2bf318000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 201
+ message: Created
+ url: https://seannsecanary.blob.core.windows.net/fs95ee172e?restype=container
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 77d37713-96fc-11eb-bb22-c8348e5fffbf
+ x-ms-date:
+ - Tue, 06 Apr 2021 17:21:05 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/fs95ee172e/dir10?resource=directory
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Tue, 06 Apr 2021 17:21:04 GMT
+ ETag: '"0x8D8F9205C4BA7A1"'
+ Last-Modified: Tue, 06 Apr 2021 17:21:05 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: bb03cba3-b01f-0071-0109-2bab8b000000
+ x-ms-request-server-encrypted: 'true'
+ x-ms-version: '2020-06-12'
+ status:
+ code: 201
+ message: Created
+ url: https://seannsecanary.dfs.core.windows.net/fs95ee172e/dir10?resource=directory
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 781d9f73-96fc-11eb-ad5d-c8348e5fffbf
+ x-ms-date:
+ - Tue, 06 Apr 2021 17:21:05 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/fs95ee172e/dir10?recursive=true
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Tue, 06 Apr 2021 17:21:05 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent: 'false'
+ x-ms-deletion-id: '132622032658022074'
+ x-ms-request-id: bb03cba4-b01f-0071-0209-2bab8b000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://seannsecanary.dfs.core.windows.net/fs95ee172e/dir10?recursive=true
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 784f84d5-96fc-11eb-95d9-c8348e5fffbf
+ x-ms-date:
+ - Tue, 06 Apr 2021 17:21:05 GMT
+ x-ms-encryption-algorithm:
+ - AES256
+ x-ms-version:
+ - '2020-06-12'
+ method: HEAD
+ uri: https://storagename.blob.core.windows.net/fs95ee172e/dir10
+ response:
+ body:
+ string: ''
+ headers:
+ Date: Tue, 06 Apr 2021 17:21:05 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ Vary: Origin
+ x-ms-error-code: BlobNotFound
+ x-ms-request-id: 2409b039-f01e-0002-5309-2bf318000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 404
+ message: The specified blob does not exist.
+ url: https://seannsecanary.blob.core.windows.net/fs95ee172e/dir10
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 785cf27c-96fc-11eb-a11b-c8348e5fffbf
+ x-ms-date:
+ - Tue, 06 Apr 2021 17:21:06 GMT
+ x-ms-undelete-source:
+ - dir10?deletionid=132622032658022074
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/fs95ee172e/dir10?comp=undelete
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Tue, 06 Apr 2021 17:21:06 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-creation-time: Tue, 06 Apr 2021 17:21:05 GMT
+ x-ms-request-id: b6ad0801-d01e-0015-3709-2b5a13000000
+ x-ms-resource-type: directory
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://seannsecanary.blob.core.windows.net/fs95ee172e/dir10?comp=undelete
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 78b191b7-96fc-11eb-9a2b-c8348e5fffbf
+ x-ms-date:
+ - Tue, 06 Apr 2021 17:21:06 GMT
+ x-ms-encryption-algorithm:
+ - AES256
+ x-ms-version:
+ - '2020-06-12'
+ method: HEAD
+ uri: https://storagename.blob.core.windows.net/fs95ee172e/dir10
+ response:
+ body:
+ string: ''
+ headers:
+ Accept-Ranges: bytes
+ Content-Length: '0'
+ Content-Type: application/octet-stream
+ Date: Tue, 06 Apr 2021 17:21:06 GMT
+ ETag: '"0x8D8F9205C4BA7A1"'
+ Last-Modified: Tue, 06 Apr 2021 17:21:05 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Vary: Origin
+ x-ms-access-tier: Hot
+ x-ms-access-tier-inferred: 'true'
+ x-ms-blob-type: BlockBlob
+ x-ms-creation-time: Tue, 06 Apr 2021 17:21:05 GMT
+ x-ms-group: $superuser
+ x-ms-lease-state: available
+ x-ms-lease-status: unlocked
+ x-ms-meta-hdi_isfolder: 'true'
+ x-ms-owner: $superuser
+ x-ms-permissions: rwxr-x---
+ x-ms-request-id: b6ad0824-d01e-0015-4f09-2b5a13000000
+ x-ms-server-encrypted: 'true'
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://seannsecanary.blob.core.windows.net/fs95ee172e/dir10
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml
new file mode 100644
index 000000000000..be3e34c508b0
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml
@@ -0,0 +1,204 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - bf00e1e8-98f0-11eb-825f-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 05:02:12 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/fsace1178f?restype=container
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 05:02:13 GMT
+ ETag: '"0x8D8FB14A3743269"'
+ Last-Modified: Fri, 09 Apr 2021 05:02:13 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: 5445d712-a01e-0089-70fd-2cf775000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 201
+ message: Created
+ url: https://storagename.blob.core.windows.net/fsace1178f?restype=container
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - bf46a2a3-98f0-11eb-b2be-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 05:02:13 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 05:02:13 GMT
+ ETag: '"0x8D8FB14A3C3E5C6"'
+ Last-Modified: Fri, 09 Apr 2021 05:02:13 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id: 5b30cf1e-501f-0056-59fd-2cbc4f000000
+ x-ms-request-server-encrypted: 'true'
+ x-ms-version: '2020-06-12'
+ status:
+ code: 201
+ message: Created
+ url: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - bf932777-98f0-11eb-8522-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 05:02:13 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: DELETE
+ uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 05:02:13 GMT
+ Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-delete-type-permanent: 'false'
+ x-ms-deletion-id: '132624181341072359'
+ x-ms-request-id: 5b30cf1f-501f-0056-5afd-2cbc4f000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - bfc19095-98f0-11eb-930b-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 05:02:14 GMT
+ x-ms-encryption-algorithm:
+ - AES256
+ x-ms-version:
+ - '2020-06-12'
+ method: HEAD
+ uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87
+ response:
+ body:
+ string: ''
+ headers:
+ Date: Fri, 09 Apr 2021 05:02:14 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding: chunked
+ Vary: Origin
+ x-ms-error-code: BlobNotFound
+ x-ms-request-id: 5445d81a-a01e-0089-6ffd-2cf775000000
+ x-ms-version: '2020-06-12'
+ status:
+ code: 404
+ message: The specified blob does not exist.
+ url: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - bfcf9a42-98f0-11eb-87b3-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 05:02:14 GMT
+ x-ms-undelete-source:
+ - dir10/file%C5%87?deletionid=132624181341072359
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length: '0'
+ Date: Fri, 09 Apr 2021 05:02:13 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-creation-time: Fri, 09 Apr 2021 05:02:13 GMT
+ x-ms-request-id: 3d9dd391-401e-0065-3ffd-2ce3e4000000
+ x-ms-resource-type: file
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - c01723e1-98f0-11eb-a5e9-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 05:02:14 GMT
+ x-ms-encryption-algorithm:
+ - AES256
+ x-ms-version:
+ - '2020-06-12'
+ method: HEAD
+ uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87
+ response:
+ body:
+ string: ''
+ headers:
+ Accept-Ranges: bytes
+ Content-Length: '0'
+ Content-Type: application/octet-stream
+ Date: Fri, 09 Apr 2021 05:02:14 GMT
+ ETag: '"0x8D8FB14A3C3E5C6"'
+ Last-Modified: Fri, 09 Apr 2021 05:02:13 GMT
+ Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Vary: Origin
+ x-ms-access-tier: Hot
+ x-ms-access-tier-inferred: 'true'
+ x-ms-blob-type: BlockBlob
+ x-ms-creation-time: Fri, 09 Apr 2021 05:02:13 GMT
+ x-ms-group: $superuser
+ x-ms-lease-state: available
+ x-ms-lease-status: unlocked
+ x-ms-owner: $superuser
+ x-ms-permissions: rw-r-----
+ x-ms-request-id: 3d9dd3a3-401e-0065-4bfd-2ce3e4000000
+ x-ms-server-encrypted: 'true'
+ x-ms-version: '2020-06-12'
+ status:
+ code: 200
+ message: OK
+ url: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml
new file mode 100644
index 000000000000..227c3694ab89
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_input_in_parquet_format.yaml
@@ -0,0 +1,1643 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 60cf3f29-996d-11eb-a886-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 19:54:21 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/utqqcontainerb38317df/csvfileb38317df?resource=file
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 19:54:21 GMT
+ ETag:
+ - '"0x8D8FB9145645382"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 19:54:22 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - 1577b503-101f-0007-357a-2d398a000000
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: !!binary |
+ UEFSMRUAFeJrFeJrLBXQDxUAFQYVBhwYAzk5ORgBMBYAFtAPGAM5OTkYATAAAAADAAAA0A8BAQAA
+ ADABAAAAMQEAAAAyAQAAADMBAAAANAEAAAA1AQAAADYBAAAANwEAAAA4AQAAADkCAAAAMTACAAAA
+ MTECAAAAMTICAAAAMTMCAAAAMTQCAAAAMTUCAAAAMTYCAAAAMTcCAAAAMTgCAAAAMTkCAAAAMjAC
+ AAAAMjECAAAAMjICAAAAMjMCAAAAMjQCAAAAMjUCAAAAMjYCAAAAMjcCAAAAMjgCAAAAMjkCAAAA
+ MzACAAAAMzECAAAAMzICAAAAMzMCAAAAMzQCAAAAMzUCAAAAMzYCAAAAMzcCAAAAMzgCAAAAMzkC
+ AAAANDACAAAANDECAAAANDICAAAANDMCAAAANDQCAAAANDUCAAAANDYCAAAANDcCAAAANDgCAAAA
+ NDkCAAAANTACAAAANTECAAAANTICAAAANTMCAAAANTQCAAAANTUCAAAANTYCAAAANTcCAAAANTgC
+ AAAANTkCAAAANjACAAAANjECAAAANjICAAAANjMCAAAANjQCAAAANjUCAAAANjYCAAAANjcCAAAA
+ NjgCAAAANjkCAAAANzACAAAANzECAAAANzICAAAANzMCAAAANzQCAAAANzUCAAAANzYCAAAANzcC
+ AAAANzgCAAAANzkCAAAAODACAAAAODECAAAAODICAAAAODMCAAAAODQCAAAAODUCAAAAODYCAAAA
+ ODcCAAAAODgCAAAAODkCAAAAOTACAAAAOTECAAAAOTICAAAAOTMCAAAAOTQCAAAAOTUCAAAAOTYC
+ AAAAOTcCAAAAOTgCAAAAOTkDAAAAMTAwAwAAADEwMQMAAAAxMDIDAAAAMTAzAwAAADEwNAMAAAAx
+ MDUDAAAAMTA2AwAAADEwNwMAAAAxMDgDAAAAMTA5AwAAADExMAMAAAAxMTEDAAAAMTEyAwAAADEx
+ MwMAAAAxMTQDAAAAMTE1AwAAADExNgMAAAAxMTcDAAAAMTE4AwAAADExOQMAAAAxMjADAAAAMTIx
+ AwAAADEyMgMAAAAxMjMDAAAAMTI0AwAAADEyNQMAAAAxMjYDAAAAMTI3AwAAADEyOAMAAAAxMjkD
+ AAAAMTMwAwAAADEzMQMAAAAxMzIDAAAAMTMzAwAAADEzNAMAAAAxMzUDAAAAMTM2AwAAADEzNwMA
+ AAAxMzgDAAAAMTM5AwAAADE0MAMAAAAxNDEDAAAAMTQyAwAAADE0MwMAAAAxNDQDAAAAMTQ1AwAA
+ ADE0NgMAAAAxNDcDAAAAMTQ4AwAAADE0OQMAAAAxNTADAAAAMTUxAwAAADE1MgMAAAAxNTMDAAAA
+ MTU0AwAAADE1NQMAAAAxNTYDAAAAMTU3AwAAADE1OAMAAAAxNTkDAAAAMTYwAwAAADE2MQMAAAAx
+ NjIDAAAAMTYzAwAAADE2NAMAAAAxNjUDAAAAMTY2AwAAADE2NwMAAAAxNjgDAAAAMTY5AwAAADE3
+ MAMAAAAxNzEDAAAAMTcyAwAAADE3MwMAAAAxNzQDAAAAMTc1AwAAADE3NgMAAAAxNzcDAAAAMTc4
+ AwAAADE3OQMAAAAxODADAAAAMTgxAwAAADE4MgMAAAAxODMDAAAAMTg0AwAAADE4NQMAAAAxODYD
+ AAAAMTg3AwAAADE4OAMAAAAxODkDAAAAMTkwAwAAADE5MQMAAAAxOTIDAAAAMTkzAwAAADE5NAMA
+ AAAxOTUDAAAAMTk2AwAAADE5NwMAAAAxOTgDAAAAMTk5AwAAADIwMAMAAAAyMDEDAAAAMjAyAwAA
+ ADIwMwMAAAAyMDQDAAAAMjA1AwAAADIwNgMAAAAyMDcDAAAAMjA4AwAAADIwOQMAAAAyMTADAAAA
+ MjExAwAAADIxMgMAAAAyMTMDAAAAMjE0AwAAADIxNQMAAAAyMTYDAAAAMjE3AwAAADIxOAMAAAAy
+ MTkDAAAAMjIwAwAAADIyMQMAAAAyMjIDAAAAMjIzAwAAADIyNAMAAAAyMjUDAAAAMjI2AwAAADIy
+ NwMAAAAyMjgDAAAAMjI5AwAAADIzMAMAAAAyMzEDAAAAMjMyAwAAADIzMwMAAAAyMzQDAAAAMjM1
+ AwAAADIzNgMAAAAyMzcDAAAAMjM4AwAAADIzOQMAAAAyNDADAAAAMjQxAwAAADI0MgMAAAAyNDMD
+ AAAAMjQ0AwAAADI0NQMAAAAyNDYDAAAAMjQ3AwAAADI0OAMAAAAyNDkDAAAAMjUwAwAAADI1MQMA
+ AAAyNTIDAAAAMjUzAwAAADI1NAMAAAAyNTUDAAAAMjU2AwAAADI1NwMAAAAyNTgDAAAAMjU5AwAA
+ ADI2MAMAAAAyNjEDAAAAMjYyAwAAADI2MwMAAAAyNjQDAAAAMjY1AwAAADI2NgMAAAAyNjcDAAAA
+ MjY4AwAAADI2OQMAAAAyNzADAAAAMjcxAwAAADI3MgMAAAAyNzMDAAAAMjc0AwAAADI3NQMAAAAy
+ NzYDAAAAMjc3AwAAADI3OAMAAAAyNzkDAAAAMjgwAwAAADI4MQMAAAAyODIDAAAAMjgzAwAAADI4
+ NAMAAAAyODUDAAAAMjg2AwAAADI4NwMAAAAyODgDAAAAMjg5AwAAADI5MAMAAAAyOTEDAAAAMjky
+ AwAAADI5MwMAAAAyOTQDAAAAMjk1AwAAADI5NgMAAAAyOTcDAAAAMjk4AwAAADI5OQMAAAAzMDAD
+ AAAAMzAxAwAAADMwMgMAAAAzMDMDAAAAMzA0AwAAADMwNQMAAAAzMDYDAAAAMzA3AwAAADMwOAMA
+ AAAzMDkDAAAAMzEwAwAAADMxMQMAAAAzMTIDAAAAMzEzAwAAADMxNAMAAAAzMTUDAAAAMzE2AwAA
+ ADMxNwMAAAAzMTgDAAAAMzE5AwAAADMyMAMAAAAzMjEDAAAAMzIyAwAAADMyMwMAAAAzMjQDAAAA
+ MzI1AwAAADMyNgMAAAAzMjcDAAAAMzI4AwAAADMyOQMAAAAzMzADAAAAMzMxAwAAADMzMgMAAAAz
+ MzMDAAAAMzM0AwAAADMzNQMAAAAzMzYDAAAAMzM3AwAAADMzOAMAAAAzMzkDAAAAMzQwAwAAADM0
+ MQMAAAAzNDIDAAAAMzQzAwAAADM0NAMAAAAzNDUDAAAAMzQ2AwAAADM0NwMAAAAzNDgDAAAAMzQ5
+ AwAAADM1MAMAAAAzNTEDAAAAMzUyAwAAADM1MwMAAAAzNTQDAAAAMzU1AwAAADM1NgMAAAAzNTcD
+ AAAAMzU4AwAAADM1OQMAAAAzNjADAAAAMzYxAwAAADM2MgMAAAAzNjMDAAAAMzY0AwAAADM2NQMA
+ AAAzNjYDAAAAMzY3AwAAADM2OAMAAAAzNjkDAAAAMzcwAwAAADM3MQMAAAAzNzIDAAAAMzczAwAA
+ ADM3NAMAAAAzNzUDAAAAMzc2AwAAADM3NwMAAAAzNzgDAAAAMzc5AwAAADM4MAMAAAAzODEDAAAA
+ MzgyAwAAADM4MwMAAAAzODQDAAAAMzg1AwAAADM4NgMAAAAzODcDAAAAMzg4AwAAADM4OQMAAAAz
+ OTADAAAAMzkxAwAAADM5MgMAAAAzOTMDAAAAMzk0AwAAADM5NQMAAAAzOTYDAAAAMzk3AwAAADM5
+ OAMAAAAzOTkDAAAANDAwAwAAADQwMQMAAAA0MDIDAAAANDAzAwAAADQwNAMAAAA0MDUDAAAANDA2
+ AwAAADQwNwMAAAA0MDgDAAAANDA5AwAAADQxMAMAAAA0MTEDAAAANDEyAwAAADQxMwMAAAA0MTQD
+ AAAANDE1AwAAADQxNgMAAAA0MTcDAAAANDE4AwAAADQxOQMAAAA0MjADAAAANDIxAwAAADQyMgMA
+ AAA0MjMDAAAANDI0AwAAADQyNQMAAAA0MjYDAAAANDI3AwAAADQyOAMAAAA0MjkDAAAANDMwAwAA
+ ADQzMQMAAAA0MzIDAAAANDMzAwAAADQzNAMAAAA0MzUDAAAANDM2AwAAADQzNwMAAAA0MzgDAAAA
+ NDM5AwAAADQ0MAMAAAA0NDEDAAAANDQyAwAAADQ0MwMAAAA0NDQDAAAANDQ1AwAAADQ0NgMAAAA0
+ NDcDAAAANDQ4AwAAADQ0OQMAAAA0NTADAAAANDUxAwAAADQ1MgMAAAA0NTMDAAAANDU0AwAAADQ1
+ NQMAAAA0NTYDAAAANDU3AwAAADQ1OAMAAAA0NTkDAAAANDYwAwAAADQ2MQMAAAA0NjIDAAAANDYz
+ AwAAADQ2NAMAAAA0NjUDAAAANDY2AwAAADQ2NwMAAAA0NjgDAAAANDY5AwAAADQ3MAMAAAA0NzED
+ AAAANDcyAwAAADQ3MwMAAAA0NzQDAAAANDc1AwAAADQ3NgMAAAA0NzcDAAAANDc4AwAAADQ3OQMA
+ AAA0ODADAAAANDgxAwAAADQ4MgMAAAA0ODMDAAAANDg0AwAAADQ4NQMAAAA0ODYDAAAANDg3AwAA
+ ADQ4OAMAAAA0ODkDAAAANDkwAwAAADQ5MQMAAAA0OTIDAAAANDkzAwAAADQ5NAMAAAA0OTUDAAAA
+ NDk2AwAAADQ5NwMAAAA0OTgDAAAANDk5AwAAADUwMAMAAAA1MDEDAAAANTAyAwAAADUwMwMAAAA1
+ MDQDAAAANTA1AwAAADUwNgMAAAA1MDcDAAAANTA4AwAAADUwOQMAAAA1MTADAAAANTExAwAAADUx
+ MgMAAAA1MTMDAAAANTE0AwAAADUxNQMAAAA1MTYDAAAANTE3AwAAADUxOAMAAAA1MTkDAAAANTIw
+ AwAAADUyMQMAAAA1MjIDAAAANTIzAwAAADUyNAMAAAA1MjUDAAAANTI2AwAAADUyNwMAAAA1MjgD
+ AAAANTI5AwAAADUzMAMAAAA1MzEDAAAANTMyAwAAADUzMwMAAAA1MzQDAAAANTM1AwAAADUzNgMA
+ AAA1MzcDAAAANTM4AwAAADUzOQMAAAA1NDADAAAANTQxAwAAADU0MgMAAAA1NDMDAAAANTQ0AwAA
+ ADU0NQMAAAA1NDYDAAAANTQ3AwAAADU0OAMAAAA1NDkDAAAANTUwAwAAADU1MQMAAAA1NTIDAAAA
+ NTUzAwAAADU1NAMAAAA1NTUDAAAANTU2AwAAADU1NwMAAAA1NTgDAAAANTU5AwAAADU2MAMAAAA1
+ NjEDAAAANTYyAwAAADU2MwMAAAA1NjQDAAAANTY1AwAAADU2NgMAAAA1NjcDAAAANTY4AwAAADU2
+ OQMAAAA1NzADAAAANTcxAwAAADU3MgMAAAA1NzMDAAAANTc0AwAAADU3NQMAAAA1NzYDAAAANTc3
+ AwAAADU3OAMAAAA1NzkDAAAANTgwAwAAADU4MQMAAAA1ODIDAAAANTgzAwAAADU4NAMAAAA1ODUD
+ AAAANTg2AwAAADU4NwMAAAA1ODgDAAAANTg5AwAAADU5MAMAAAA1OTEDAAAANTkyAwAAADU5MwMA
+ AAA1OTQDAAAANTk1AwAAADU5NgMAAAA1OTcDAAAANTk4AwAAADU5OQMAAAA2MDADAAAANjAxAwAA
+ ADYwMgMAAAA2MDMDAAAANjA0AwAAADYwNQMAAAA2MDYDAAAANjA3AwAAADYwOAMAAAA2MDkDAAAA
+ NjEwAwAAADYxMQMAAAA2MTIDAAAANjEzAwAAADYxNAMAAAA2MTUDAAAANjE2AwAAADYxNwMAAAA2
+ MTgDAAAANjE5AwAAADYyMAMAAAA2MjEDAAAANjIyAwAAADYyMwMAAAA2MjQDAAAANjI1AwAAADYy
+ NgMAAAA2MjcDAAAANjI4AwAAADYyOQMAAAA2MzADAAAANjMxAwAAADYzMgMAAAA2MzMDAAAANjM0
+ AwAAADYzNQMAAAA2MzYDAAAANjM3AwAAADYzOAMAAAA2MzkDAAAANjQwAwAAADY0MQMAAAA2NDID
+ AAAANjQzAwAAADY0NAMAAAA2NDUDAAAANjQ2AwAAADY0NwMAAAA2NDgDAAAANjQ5AwAAADY1MAMA
+ AAA2NTEDAAAANjUyAwAAADY1MwMAAAA2NTQDAAAANjU1AwAAADY1NgMAAAA2NTcDAAAANjU4AwAA
+ ADY1OQMAAAA2NjADAAAANjYxAwAAADY2MgMAAAA2NjMDAAAANjY0AwAAADY2NQMAAAA2NjYDAAAA
+ NjY3AwAAADY2OAMAAAA2NjkDAAAANjcwAwAAADY3MQMAAAA2NzIDAAAANjczAwAAADY3NAMAAAA2
+ NzUDAAAANjc2AwAAADY3NwMAAAA2NzgDAAAANjc5AwAAADY4MAMAAAA2ODEDAAAANjgyAwAAADY4
+ MwMAAAA2ODQDAAAANjg1AwAAADY4NgMAAAA2ODcDAAAANjg4AwAAADY4OQMAAAA2OTADAAAANjkx
+ AwAAADY5MgMAAAA2OTMDAAAANjk0AwAAADY5NQMAAAA2OTYDAAAANjk3AwAAADY5OAMAAAA2OTkD
+ AAAANzAwAwAAADcwMQMAAAA3MDIDAAAANzAzAwAAADcwNAMAAAA3MDUDAAAANzA2AwAAADcwNwMA
+ AAA3MDgDAAAANzA5AwAAADcxMAMAAAA3MTEDAAAANzEyAwAAADcxMwMAAAA3MTQDAAAANzE1AwAA
+ ADcxNgMAAAA3MTcDAAAANzE4AwAAADcxOQMAAAA3MjADAAAANzIxAwAAADcyMgMAAAA3MjMDAAAA
+ NzI0AwAAADcyNQMAAAA3MjYDAAAANzI3AwAAADcyOAMAAAA3MjkDAAAANzMwAwAAADczMQMAAAA3
+ MzIDAAAANzMzAwAAADczNAMAAAA3MzUDAAAANzM2AwAAADczNwMAAAA3MzgDAAAANzM5AwAAADc0
+ MAMAAAA3NDEDAAAANzQyAwAAADc0MwMAAAA3NDQDAAAANzQ1AwAAADc0NgMAAAA3NDcDAAAANzQ4
+ AwAAADc0OQMAAAA3NTADAAAANzUxAwAAADc1MgMAAAA3NTMDAAAANzU0AwAAADc1NQMAAAA3NTYD
+ AAAANzU3AwAAADc1OAMAAAA3NTkDAAAANzYwAwAAADc2MQMAAAA3NjIDAAAANzYzAwAAADc2NAMA
+ AAA3NjUDAAAANzY2AwAAADc2NwMAAAA3NjgDAAAANzY5AwAAADc3MAMAAAA3NzEDAAAANzcyAwAA
+ ADc3MwMAAAA3NzQDAAAANzc1AwAAADc3NgMAAAA3NzcDAAAANzc4AwAAADc3OQMAAAA3ODADAAAA
+ NzgxAwAAADc4MgMAAAA3ODMDAAAANzg0AwAAADc4NQMAAAA3ODYDAAAANzg3AwAAADc4OAMAAAA3
+ ODkDAAAANzkwAwAAADc5MQMAAAA3OTIDAAAANzkzAwAAADc5NAMAAAA3OTUDAAAANzk2AwAAADc5
+ NwMAAAA3OTgDAAAANzk5AwAAADgwMAMAAAA4MDEDAAAAODAyAwAAADgwMwMAAAA4MDQDAAAAODA1
+ AwAAADgwNgMAAAA4MDcDAAAAODA4AwAAADgwOQMAAAA4MTADAAAAODExAwAAADgxMgMAAAA4MTMD
+ AAAAODE0AwAAADgxNQMAAAA4MTYDAAAAODE3AwAAADgxOAMAAAA4MTkDAAAAODIwAwAAADgyMQMA
+ AAA4MjIDAAAAODIzAwAAADgyNAMAAAA4MjUDAAAAODI2AwAAADgyNwMAAAA4MjgDAAAAODI5AwAA
+ ADgzMAMAAAA4MzEDAAAAODMyAwAAADgzMwMAAAA4MzQDAAAAODM1AwAAADgzNgMAAAA4MzcDAAAA
+ ODM4AwAAADgzOQMAAAA4NDADAAAAODQxAwAAADg0MgMAAAA4NDMDAAAAODQ0AwAAADg0NQMAAAA4
+ NDYDAAAAODQ3AwAAADg0OAMAAAA4NDkDAAAAODUwAwAAADg1MQMAAAA4NTIDAAAAODUzAwAAADg1
+ NAMAAAA4NTUDAAAAODU2AwAAADg1NwMAAAA4NTgDAAAAODU5AwAAADg2MAMAAAA4NjEDAAAAODYy
+ AwAAADg2MwMAAAA4NjQDAAAAODY1AwAAADg2NgMAAAA4NjcDAAAAODY4AwAAADg2OQMAAAA4NzAD
+ AAAAODcxAwAAADg3MgMAAAA4NzMDAAAAODc0AwAAADg3NQMAAAA4NzYDAAAAODc3AwAAADg3OAMA
+ AAA4NzkDAAAAODgwAwAAADg4MQMAAAA4ODIDAAAAODgzAwAAADg4NAMAAAA4ODUDAAAAODg2AwAA
+ ADg4NwMAAAA4ODgDAAAAODg5AwAAADg5MAMAAAA4OTEDAAAAODkyAwAAADg5MwMAAAA4OTQDAAAA
+ ODk1AwAAADg5NgMAAAA4OTcDAAAAODk4AwAAADg5OQMAAAA5MDADAAAAOTAxAwAAADkwMgMAAAA5
+ MDMDAAAAOTA0AwAAADkwNQMAAAA5MDYDAAAAOTA3AwAAADkwOAMAAAA5MDkDAAAAOTEwAwAAADkx
+ MQMAAAA5MTIDAAAAOTEzAwAAADkxNAMAAAA5MTUDAAAAOTE2AwAAADkxNwMAAAA5MTgDAAAAOTE5
+ AwAAADkyMAMAAAA5MjEDAAAAOTIyAwAAADkyMwMAAAA5MjQDAAAAOTI1AwAAADkyNgMAAAA5MjcD
+ AAAAOTI4AwAAADkyOQMAAAA5MzADAAAAOTMxAwAAADkzMgMAAAA5MzMDAAAAOTM0AwAAADkzNQMA
+ AAA5MzYDAAAAOTM3AwAAADkzOAMAAAA5MzkDAAAAOTQwAwAAADk0MQMAAAA5NDIDAAAAOTQzAwAA
+ ADk0NAMAAAA5NDUDAAAAOTQ2AwAAADk0NwMAAAA5NDgDAAAAOTQ5AwAAADk1MAMAAAA5NTEDAAAA
+ OTUyAwAAADk1MwMAAAA5NTQDAAAAOTU1AwAAADk1NgMAAAA5NTcDAAAAOTU4AwAAADk1OQMAAAA5
+ NjADAAAAOTYxAwAAADk2MgMAAAA5NjMDAAAAOTY0AwAAADk2NQMAAAA5NjYDAAAAOTY3AwAAADk2
+ OAMAAAA5NjkDAAAAOTcwAwAAADk3MQMAAAA5NzIDAAAAOTczAwAAADk3NAMAAAA5NzUDAAAAOTc2
+ AwAAADk3NwMAAAA5NzgDAAAAOTc5AwAAADk4MAMAAAA5ODEDAAAAOTgyAwAAADk4MwMAAAA5ODQD
+ AAAAOTg1AwAAADk4NgMAAAA5ODcDAAAAOTg4AwAAADk4OQMAAAA5OTADAAAAOTkxAwAAADk5MgMA
+ AAA5OTMDAAAAOTk0AwAAADk5NQMAAAA5OTYDAAAAOTk3AwAAADk5OAMAAAA5OTkVABWO+gEVjvoB
+ LBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW0A8YDHp6cTBrZnk0LnZi
+ bhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5lYTMMAAAANWRtdnFldmcuamsw
+ DAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8zamF0bmMuMXZoDAAAAHUzYmZ1
+ dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYnczDAAAAGkwc3EzMDVvLmg1dQwA
+ AAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nra3QyLnJpMAwAAABxMG40NTJl
+ NC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwAAABjd3RhZWQyci5xZHcMAAAA
+ M215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZxci5ubXEMAAAAbHd1aG5kbTAu
+ d2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAAbHBlYnRqNXcuZmMwDAAAAHp0
+ aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2EuY2RmDAAAAHBjanpvdzF1Lm0w
+ MAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1MnJtY2htLnNoZQwAAABwczBz
+ ZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4YgwAAABqMmxtZnpzMi5xZmIM
+ AAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2owZGsybi5hczIMAAAAem5iemhn
+ aXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQMAAAAcm95ZG9udWsuYjJqDAAA
+ AGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5ZGMubHZsDAAAAGRiZGZtc3Iy
+ LmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAAAHIwbm50eTRwLnFlMAwAAAA0
+ eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5Lms1agwAAABhcHljZ2h1aC5h
+ bHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABveGxhdGdudy5hdG8MAAAAdGpn
+ b2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5odnUMAAAAc2x3dXZjaXkucXlm
+ DAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3aTVla3UuZnl6DAAAAHdua2Vz
+ Y25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgwDAAAADVobHZvZ2l3LndtMQwA
+ AABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZkNTMwLnp2NQwAAABqc2N2b3lj
+ Yy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwAAAB1cmkwMmFjMy5zYnkMAAAA
+ bWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1vby5xYWsMAAAAdmN5Z3FzcWUu
+ dXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAAcW1mdXJrMWcucmNnDAAAAHMy
+ ZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwucG1zDAAAAHR0eW9kc251LjQ1
+ ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6dmF6cHZqLmFoeAwAAAA1bXVy
+ NGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxnZwwAAAA1bTU0Zmdnby5rdjUM
+ AAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlzemdhMS53ZnIMAAAAamExY2xh
+ dHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIMAAAAeW5sNXR0eWgubTVsDAAA
+ AG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNwMmQuenRxDAAAAGtnbGl5ZXN0
+ LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAAAGVrZGp0Y3U1LjNicAwAAAA0
+ dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1LjN5dAwAAABqaDV2ZGx6eC54
+ aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABtbmNkZjRudS5idnQMAAAAY3l1
+ ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5tNWkMAAAAcTJvbGRtbDQuZHly
+ DAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRtNGFiMXMuM3FtDAAAAGtxZ2I1
+ ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5DAAAAGZwNGRqamxsLm1meQwA
+ AABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUwaWlrLnQ1ZQwAAABybXZreHN6
+ ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwAAABtbXYwb3lieC5rM2cMAAAA
+ ZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQxZC55dG4MAAAAZGhoZ2d0dGku
+ MWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAAbnhsbGRhYW8ua2RwDAAAADBu
+ cTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsueXJzDAAAAGYxcmMwNGp0LjFr
+ bAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxrdmY1b3gyLmpqMAwAAABhejIy
+ NG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRpZgwAAABtazB4dXZ5MS5pMjEM
+ AAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3dTF2Zy5vYXMMAAAAcmNtaHhv
+ czMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQMAAAANXIzZHV6b2cuamlnDAAA
+ AHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtmeTQudmJuDAAAAHJ0cTBkZG9n
+ LjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAAAHNxaGdhaW1wLnQ0YgwAAAB6
+ cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4LmZqMgwAAAAxbDFtNDFiai5n
+ ZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABmMXhtMTN6eS5langMAAAAMXNl
+ cTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51bWgMAAAAMHNrdmJvanEueTBo
+ DAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xmZ2RhYnoud3djDAAAAGFnem1o
+ eHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5xDAAAAHJ4dWJ2dmdwLnhnZgwA
+ AAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0cWNvLjRtZAwAAABkdnJmZW0y
+ cC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwAAABmYWlsMzVieS5ycTMMAAAA
+ bTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlvdS4wMWcMAAAAbXYzcm5lZW8u
+ cmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAAYXcycHJqYmEubTNhDAAAAGJo
+ Z3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAuYWV4DAAAAGQxcXZ1ZmltLnBi
+ dwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtkeWRhcWlyLndjcgwAAAB3YTM0
+ Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2cgwAAABoeHJqNHJzZS54Y20M
+ AAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFieDNtZS5tbHgMAAAAZ2I1MG11
+ bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYMAAAAdWdlc3R5dzEudXBsDAAA
+ AHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFncXMucTRqDAAAAG0zbnduMGUy
+ LmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAAAG16YTR0NXNnLnV1dgwAAAAw
+ aGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEyLnhtcwwAAAAzbWltdnF1bi5o
+ dTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABubWg0bmg1MS4xbjAMAAAAZ2Zy
+ b3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4zb3IMAAAAcHhuMXQzemkuYWNn
+ DAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1eWx6dHQua3BiDAAAADBiaWNz
+ eXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYyDAAAAG9mZGptbnN2LnVodAwA
+ AAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3Ymt2Lml3MwwAAAB5ampoa3Fs
+ bi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwAAAB0djEzd3F2eS55dWIMAAAA
+ b2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAzZy5ueXUMAAAAMGM1dXR1bWYu
+ M3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAAeXlpajEwMW8ucGlqDAAAAHA1
+ anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMudW0wDAAAAHdjdHBua2ZoLjJ1
+ bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZyMHNza29yLm4ydwwAAAB4dDUw
+ MHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFqZwwAAABqc2V0emMwZS5qaGUM
+ AAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRpMnNmdi53MnUMAAAAbXpwdnNu
+ dWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEMAAAANXhob2txNTQuY29qDAAA
+ AHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1eTQuejMyDAAAAG12dnJ2czFu
+ LmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAAAHZnNGNybm0yLjNjYgwAAABr
+ NTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0LmtkYgwAAABqd3FnYnVtYi5p
+ cnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAAByZ2MzdjN5cC4xY3AMAAAAZ3Bo
+ MzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41ZjAMAAAAaGhrYjBrdzAueWky
+ DAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJmZ3FxeDUudHoyDAAAAG80dWk0
+ a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFoDAAAADB3eHBpZWlpLmVndAwA
+ AABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3b3hpLm50ZgwAAABuemZyYmJ2
+ eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwAAABuNXFnYWgxbS5vM28MAAAA
+ cDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251ay4yMXAMAAAAYWVrYTE1Z3Eu
+ cXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAAanJvM2hzcDMuMmYzDAAAAGJz
+ Z2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMuYjJyDAAAAG5paTFtc3YzLnBz
+ dQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1bmd3dWlqLnViMwwAAAB2Ymx3
+ MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxwNQwAAABqcW1xeWVkdy5naWEM
+ AAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQwaHpwcy5kdjUMAAAAd2ZnY2Rx
+ NGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQMAAAAZGwxMnl6bXIuZWJmDAAA
+ AHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZsMmIuZmJ3DAAAADJ4a3c0eHhy
+ LnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAAAGRkem5lMGpnLmV2NAwAAAB6
+ d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVlLnpjeAwAAAByZmRncm4xZS5y
+ ZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5Y3lreGVnYy4zYmwMAAAAajNq
+ MnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5pcTUMAAAAMGp1cmoyMWkuNDAz
+ DAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlvMnM1MHAueGprDAAAAHBpYWpi
+ bXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmswDAAAAGpvZHIxbHVjLmk0cAwA
+ AAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGszMWJwLm4xdAwAAAB1MW1sazF3
+ NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwAAAB4d20wdGt2bS5xbHkMAAAA
+ dWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhydi5yc3YMAAAAdmdyYnlxdXYu
+ cXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAAZDFocWk1dmMuY20yDAAAADFx
+ MGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQuZGlzDAAAAGNsaWY1b3h2LnQw
+ bgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNqcnNjaWp3LmJzcAwAAAAxcGxt
+ bjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVudAwAAABhcGxhZTVocS5ibG0M
+ AAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5sYjRlNS5ibnkMAAAAYWl3amdz
+ cWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAMAAAAYXBpbWdvdGYueXE0DAAA
+ AGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRmcDAuZDV0DAAAAGhocDI1d2Fp
+ LnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAAAHhyMTFmNHVuLjJidQwAAAB3
+ ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cxLmdqMgwAAABrMHRzbjRmaC5v
+ a2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABxZHpwNWRyby4xcXcMAAAAa2Zh
+ YmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53MGgMAAAAZGZkNDN6dHcubWly
+ DAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3lsZjF4aHguZ2RqDAAAADR5bnAw
+ dmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpkDAAAADRuMm5kMGlvLm53ZAwA
+ AAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1ZnJ1LmRjcwwAAAB4NGpoNXBk
+ ci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwAAABhMmJ0bWJ5YS5xZ2UMAAAA
+ bGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXkybi52bjQMAAAAZXpvemI0M2su
+ YTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAAMnBsbXVrdHIuYnB4DAAAAGhm
+ eGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMuZ21sDAAAAHJpY2o0eGs1LnBq
+ bQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAxbGdncnVzLnB5bAwAAABqb3R3
+ cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96bgwAAABhdGhucnJ6di5pdG8M
+ AAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1iaDNraS5rYm8MAAAAZzRoZnNo
+ YWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoMAAAAbGY1cG14YXguYWJ6DAAA
+ AGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6dzUuaXU1DAAAAHlzMjMzZm52
+ LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAAAG8ydHFzM2NuLjBxcgwAAABy
+ cnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29qLmExcAwAAABtNXNxd2Nkai5v
+ bHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABoc3ozcWdoNC53MTMMAAAAZWN0
+ Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5kMzMMAAAANXA1YW1ja2wuam1s
+ DAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1MzJrenQudGllDAAAAGEzdG9n
+ ZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVjDAAAAGVia3h2bXExLjJ0aQwA
+ AABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNjbTQxLnQxbAwAAAB3aW55a2Ft
+ Zy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwAAAAzaWtwa2tteC5xZjIMAAAA
+ YnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBuMC41cWYMAAAAM25uZGNobWcu
+ eXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAAd2lveTF5bmIuZ3gxDAAAAGdj
+ dDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEueTUxDAAAADIzcmVlbjI0Lngz
+ MgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpzdWl2em1jLnRmMwwAAABvMmt4
+ bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndzcQwAAAA0dDIxaDB0Yi56dDIM
+ AAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3ZWxteC5kaHoMAAAAc2JvNHRj
+ eXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncMAAAAajJvNXdkcncuZ3VrDAAA
+ AGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtvNTUueGZwDAAAADVvdnlydHpt
+ LmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAAAHZ2MWVkcnI0Lm1rcAwAAAB1
+ aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVmLmJjcAwAAAB5ZGVzcGpjZy5p
+ ajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0cDRtNXR0dC53bXgMAAAAcGpk
+ Y3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41ZW8MAAAAc2I1MTJ5YmouM3Jj
+ DAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5bmJjc2gueHR1DAAAAG8yYTFi
+ ZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5DAAAAHNwZmZ3bHhwLjRtcQwA
+ AABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdrNWpmLnhjYgwAAABncTR4c3dx
+ dC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwAAABsdnpvdzRpMy5jNHYMAAAA
+ ankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2JsaS5tcGQMAAAAbzBydHh1Ymcu
+ MWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAAMGJlaDRta2QueWVrDAAAAHVj
+ c2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUuMXVhDAAAAGMyMjN6Y3JsLmlj
+ cgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJrNGVwa2hrLnVhdQwAAABzbG40
+ cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMzdAwAAAB3ZWowcGhmbi4xa2sM
+ AAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4ycmR0NC5qZmMMAAAAYmdpMnN0
+ YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAMAAAAbmdkdDBybnIueGtzDAAA
+ AGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0NGkub3JrDAAAAHdveTFvZ3N0
+ LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAAAHYxcXRtZzFlLnV0cwwAAABy
+ ajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25yLjB0MAwAAAA1am9zZG5oZi5n
+ dmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAxbXZ1eDFzcS55cHEMAAAAZnpi
+ Z2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54NGMMAAAAMXJ4MHFuaXQueW96
+ DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRlaTVxa3oudXZiDAAAAHIxMWlk
+ ZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2DAAAAGIwd2tncGFuLm5xawwA
+ AAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhrbzRxLmRhdgwAAABhdzB5cWZw
+ by4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwAAAB4bGdvNHgxdy5odXUMAAAA
+ bzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwzZy50bXIMAAAAa2p4MGVyb2Eu
+ cGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAAaGR0dzNsZWouaHdyDAAAAG5z
+ Y3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3MmwuNWZsDAAAAHhoZWd5d3Z6Lncx
+ YwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVxZGRrYmJiLnFnbgwAAAAzZnM0
+ ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4dAwAAABweXZudXJ0ZC4zZGMM
+ AAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRzeTR1cy4yMmQMAAAAamxiMGJ0
+ enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQMAAAAa2c1anNqNXIubG96DAAA
+ AGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21yd3AuNHUzDAAAAHd3MGFzc3l4
+ Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAAAGZ1b2pmcTQwLmZ5dAwAAABt
+ YXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRqLnF4cgwAAABxbnd1dGx6YS5n
+ eXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4a2xpamN2ai4zcjEMAAAAc3cx
+ YnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5xbGMMAAAAczFwZ3psaHgueXRw
+ DAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3NocmV0dGYubzAyDAAAAHNyZXZ3
+ eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2JrDAAAADBpdDFtZnhzLmpxMAwA
+ AABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2NmZzNtLnhycwwAAABkd295eWll
+ aC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwAAABqaWRjNW5paC41enEMAAAA
+ MDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2JjMy5wYWsMAAAAd3Nnd3B0d2Iu
+ bG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAAdHpoNHN2dTIuaHp6DAAAAHBj
+ bXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUudXZnDAAAAGJuNHN5cWdrLjBj
+ MgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQxZmNqYmsxLnFseAwAAAAzcmhv
+ M3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0eQwAAABra2lldXZ0NC5zY3gM
+ AAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYzYmpvdi5waTIMAAAAb3NoaWh4
+ ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUMAAAAeGVnNDBib2QudWp3DAAA
+ AHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtzbHIuMjJwDAAAAGZ2dmh3aWs0
+ LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAAAGF3cHczZGpiLjBnZAwAAABw
+ b21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0LjJubQwAAABweWR1bGNpYi56
+ YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5anphNGJrbC5ocWcMAAAAbG5q
+ MmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40d28MAAAAem5iejRoYmQubHoz
+ DAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQzemVkaW4uMXYyDAAAAGV5YTUw
+ cnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMxDAAAAHlmendwNHlxLnp5bAwA
+ AAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1c2ljLm1mawwAAABrZWVmcG1n
+ Yy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwAAABkNWZ4cXpldS5ua2kMAAAA
+ bTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlvdS56bWUMAAAAaGVxa2R1bHUu
+ dHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAAbGN6aTQ1MnAuaWEyDAAAAGEw
+ cmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWkubWd0DAAAADV3b25lcTUyLnJn
+ dwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1eXpvNXVlLjNuYwwAAABqNG9n
+ MnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhyeQwAAAA0bzNhY3B0ZC41c3EM
+ AAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRnenA1bi52enUMAAAAZHZycHZ5
+ M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwMAAAAYW1veWtvZGkuNW9nDAAA
+ AG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgwcGouMzF2DAAAADMwcndocHBs
+ Lmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAAADNleGlsbXB2Lmp6aQwAAABs
+ YWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5LmljcgwAAAA1NHBhMnBtdy5y
+ amkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABpZmxlaTFuMS5idGsMAAAAYmxk
+ d2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5tcjIMAAAAYTRxZG94ZWsuajMx
+ DAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lrampkMWMuNGd5DAAAADVqM2wx
+ MHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3FvDAAAAGI1ZjNmcWRpLjB5NQwA
+ AABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxjdmdtLmpnagwAAAAzZmMwZXdi
+ bS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwAAABxMnRmYjB2ay5uMmQMAAAA
+ a2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1dy5rcXYMAAAAbWRjcGVld2Iu
+ NXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAAeXlhbGJ1Y3MuYW5nDAAAAHAz
+ eHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cuNTU0DAAAAGVydTJsbmowLnN1
+ dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZmeGJidWFkLm5tNQwAAABidmo1
+ eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNyZwwAAABvZWVrcjJ0eC51aXkM
+ AAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdlbGRrdi56YXEMAAAAamJ4YzB3
+ dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIMAAAAaGhwejQyeHQuZ3F4DAAA
+ ADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2JxdWwudWQyDAAAAG94MDQ1azFv
+ LmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAAAGozcGM1c20wLm1sYwwAAABp
+ c2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2RvLm1nYQwAAAB5ZWpnb2d4by55
+ bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2enEzMW94Yi50djMMAAAAeHFz
+ MGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5ycnkMAAAAMDV0Y3h0MmwucXo1
+ DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWExcnIxZGwudWVlDAAAAHFzdWdu
+ eXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6DAAAADUxeW01YmhxLmVybAwA
+ AABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdrZ3lsLm1wdAwAAABkZDV3dGh5
+ aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwAAABocGdudG5qaC56dHIMAAAA
+ eDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJybC4ybXUMAAAAd2lrdXB4b2ou
+ c2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAAMHB4MWRpY2wucWd3DAAAAHVx
+ YTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8uanZpDAAAAGQ0bDQwbGJxLjUw
+ ZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHowYmNsa2R1LmNwawwAAAB3MGpv
+ Z3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3aQwAAABidXp6MmpuMi52MzUM
+ AAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVqMXRydC5rdXgMAAAAYzExcG9l
+ MDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8MAAAANWw1MWswdGsueGRsDAAA
+ AGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZsdjQub2lpDAAAAHVzMzMyMDJy
+ Lm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAAAGx5ZmNscmh3LnJ0NAwAAABk
+ a3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFyLnBzNQwAAABxd2YwM2lxZC5o
+ ZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABjdjFlMnhvdS4xbngMAAAAbGFs
+ bzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5oa2kMAAAAeTB2MjM1eG4uMG5m
+ DAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMwYmRudjEuNDVjDAAAAGhpM3p5
+ cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNlDAAAAGZhZXEwdTNrLmZndQwA
+ AABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xnb2hkLjVibgwAAAB2YWR0YXNs
+ aC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwAAABmcTJ5bmZiMS5tb3IMAAAA
+ Zm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2ZxMy5nZWYMAAAAcWNtYmpha2cu
+ cGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAAeW1vNXlsengudmt3DAAAAHZ1
+ bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcudW8zDAAAAG4zMm00aGVkLnRt
+ cgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBjeXBuZGVwLjNrdwwAAABrdWg0
+ NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmlicAwAAABhc2szdXNzcy56YjUM
+ AAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVlaWVmZi5sc3gMAAAAa2pmMG9u
+ bmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEMAAAAajJuamJtZHEuMTRhDAAA
+ AG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUwanAudmVnDAAAADFsM3phZ3F4
+ Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAAADR3MTJncHAzLmRycwwAAABx
+ MnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtvLjFucAwAAAA0aW54a3YzZC54
+ eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAzbGN1aGZpcS4yYWYMAAAAeGtp
+ NXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5sZ2sMAAAAeHlxZXE1ejMubTRh
+ DAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNjc21uNWkudzFuDAAAAHptNWtp
+ Y3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNwDAAAAHlranlrY3F4LnJqMAwA
+ AABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2VrdTNhLnl3ZAwAAAA0bnAwdGdo
+ NS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwAAAA0azEwdnV6by56d3cMAAAA
+ b3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0di4zY3YMAAAAaGNhMGx3cjMu
+ eGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAAYTJqaHRxeWIuczVjDAAAAGtm
+ ZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIudm53DAAAAHZycDBncG1mLnky
+ YQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4xdnYxdHN1LjFpbAwAAABnZjFi
+ aDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3agwAAABqbmE1em0wYy5hb3gM
+ AAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41cW1ueS5kbDAMAAAAbTNkd3Jx
+ MmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMMAAAAMXU1cjFuYXoueWhjDAAA
+ AG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81MmIuZnlwDAAAAGJuNHJ6aXNy
+ LjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAAAGZ6aWpmcGpsLmMwagwAAABn
+ M3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3NuLmRoagwAAAAyZnZ3eGlsdi5p
+ d2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABucWZtMWJvZS51ZG4MAAAAdGxh
+ czJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5uM20MAAAAYnNqbDBudmkuaW5o
+ DAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpoM2NmYXguNWZmDAAAAGlnM2x0
+ ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0DAAAAG1mbzF0amV4LjR5bAwA
+ AABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHhtMjN4Lmx4cQwAAAB6amlqZGV2
+ cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwAAAB4bGE0NGYxaS5jbmIMAAAA
+ NTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNhZS5vdWYMAAAAZG5qd25lcnYu
+ ZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAAMTEyYnFwcWYuaWMzDAAAAGtw
+ NHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2kuajJ4DAAAAHNudnF3aGkxLml3
+ aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRsc2Fpb2FzLmhzMwwAAAAweGZh
+ dDNxei5vYWkVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZz
+ FgAW0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5l
+ YTMMAAAANWRtdnFldmcuamswDAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8z
+ amF0bmMuMXZoDAAAAHUzYmZ1dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYncz
+ DAAAAGkwc3EzMDVvLmg1dQwAAAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nr
+ a3QyLnJpMAwAAABxMG40NTJlNC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwA
+ AABjd3RhZWQyci5xZHcMAAAAM215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZx
+ ci5ubXEMAAAAbHd1aG5kbTAud2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAA
+ bHBlYnRqNXcuZmMwDAAAAHp0aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2Eu
+ Y2RmDAAAAHBjanpvdzF1Lm0wMAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1
+ MnJtY2htLnNoZQwAAABwczBzZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4
+ YgwAAABqMmxtZnpzMi5xZmIMAAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2ow
+ ZGsybi5hczIMAAAAem5iemhnaXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQM
+ AAAAcm95ZG9udWsuYjJqDAAAAGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5
+ ZGMubHZsDAAAAGRiZGZtc3IyLmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAA
+ AHIwbm50eTRwLnFlMAwAAAA0eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5
+ Lms1agwAAABhcHljZ2h1aC5hbHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABv
+ eGxhdGdudy5hdG8MAAAAdGpnb2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5o
+ dnUMAAAAc2x3dXZjaXkucXlmDAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3
+ aTVla3UuZnl6DAAAAHdua2VzY25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgw
+ DAAAADVobHZvZ2l3LndtMQwAAABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZk
+ NTMwLnp2NQwAAABqc2N2b3ljYy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwA
+ AAB1cmkwMmFjMy5zYnkMAAAAbWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1v
+ by5xYWsMAAAAdmN5Z3FzcWUudXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAA
+ cW1mdXJrMWcucmNnDAAAAHMyZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwu
+ cG1zDAAAAHR0eW9kc251LjQ1ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6
+ dmF6cHZqLmFoeAwAAAA1bXVyNGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxn
+ ZwwAAAA1bTU0Zmdnby5rdjUMAAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlz
+ emdhMS53ZnIMAAAAamExY2xhdHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIM
+ AAAAeW5sNXR0eWgubTVsDAAAAG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNw
+ MmQuenRxDAAAAGtnbGl5ZXN0LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAA
+ AGVrZGp0Y3U1LjNicAwAAAA0dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1
+ LjN5dAwAAABqaDV2ZGx6eC54aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABt
+ bmNkZjRudS5idnQMAAAAY3l1ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5t
+ NWkMAAAAcTJvbGRtbDQuZHlyDAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRt
+ NGFiMXMuM3FtDAAAAGtxZ2I1ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5
+ DAAAAGZwNGRqamxsLm1meQwAAABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUw
+ aWlrLnQ1ZQwAAABybXZreHN6ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwA
+ AABtbXYwb3lieC5rM2cMAAAAZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQx
+ ZC55dG4MAAAAZGhoZ2d0dGkuMWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAA
+ bnhsbGRhYW8ua2RwDAAAADBucTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsu
+ eXJzDAAAAGYxcmMwNGp0LjFrbAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxr
+ dmY1b3gyLmpqMAwAAABhejIyNG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRp
+ ZgwAAABtazB4dXZ5MS5pMjEMAAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3
+ dTF2Zy5vYXMMAAAAcmNtaHhvczMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQM
+ AAAANXIzZHV6b2cuamlnDAAAAHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtm
+ eTQudmJuDAAAAHJ0cTBkZG9nLjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAA
+ AHNxaGdhaW1wLnQ0YgwAAAB6cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4
+ LmZqMgwAAAAxbDFtNDFiai5nZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABm
+ MXhtMTN6eS5langMAAAAMXNlcTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51
+ bWgMAAAAMHNrdmJvanEueTBoDAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xm
+ Z2RhYnoud3djDAAAAGFnem1oeHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5x
+ DAAAAHJ4dWJ2dmdwLnhnZgwAAAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0
+ cWNvLjRtZAwAAABkdnJmZW0ycC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwA
+ AABmYWlsMzVieS5ycTMMAAAAbTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlv
+ dS4wMWcMAAAAbXYzcm5lZW8ucmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAA
+ YXcycHJqYmEubTNhDAAAAGJoZ3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAu
+ YWV4DAAAAGQxcXZ1ZmltLnBidwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtk
+ eWRhcWlyLndjcgwAAAB3YTM0Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2
+ cgwAAABoeHJqNHJzZS54Y20MAAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFi
+ eDNtZS5tbHgMAAAAZ2I1MG11bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYM
+ AAAAdWdlc3R5dzEudXBsDAAAAHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFn
+ cXMucTRqDAAAAG0zbnduMGUyLmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAA
+ AG16YTR0NXNnLnV1dgwAAAAwaGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEy
+ LnhtcwwAAAAzbWltdnF1bi5odTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABu
+ bWg0bmg1MS4xbjAMAAAAZ2Zyb3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4z
+ b3IMAAAAcHhuMXQzemkuYWNnDAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1
+ eWx6dHQua3BiDAAAADBiaWNzeXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYy
+ DAAAAG9mZGptbnN2LnVodAwAAAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3
+ Ymt2Lml3MwwAAAB5ampoa3Fsbi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwA
+ AAB0djEzd3F2eS55dWIMAAAAb2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAz
+ Zy5ueXUMAAAAMGM1dXR1bWYuM3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAA
+ eXlpajEwMW8ucGlqDAAAAHA1anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMu
+ dW0wDAAAAHdjdHBua2ZoLjJ1bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZy
+ MHNza29yLm4ydwwAAAB4dDUwMHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFq
+ ZwwAAABqc2V0emMwZS5qaGUMAAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRp
+ MnNmdi53MnUMAAAAbXpwdnNudWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEM
+ AAAANXhob2txNTQuY29qDAAAAHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1
+ eTQuejMyDAAAAG12dnJ2czFuLmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAA
+ AHZnNGNybm0yLjNjYgwAAABrNTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0
+ LmtkYgwAAABqd3FnYnVtYi5pcnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAABy
+ Z2MzdjN5cC4xY3AMAAAAZ3BoMzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41
+ ZjAMAAAAaGhrYjBrdzAueWkyDAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJm
+ Z3FxeDUudHoyDAAAAG80dWk0a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFo
+ DAAAADB3eHBpZWlpLmVndAwAAABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3
+ b3hpLm50ZgwAAABuemZyYmJ2eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwA
+ AABuNXFnYWgxbS5vM28MAAAAcDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251
+ ay4yMXAMAAAAYWVrYTE1Z3EucXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAA
+ anJvM2hzcDMuMmYzDAAAAGJzZ2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMu
+ YjJyDAAAAG5paTFtc3YzLnBzdQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1
+ bmd3dWlqLnViMwwAAAB2Ymx3MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxw
+ NQwAAABqcW1xeWVkdy5naWEMAAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQw
+ aHpwcy5kdjUMAAAAd2ZnY2RxNGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQM
+ AAAAZGwxMnl6bXIuZWJmDAAAAHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZs
+ MmIuZmJ3DAAAADJ4a3c0eHhyLnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAA
+ AGRkem5lMGpnLmV2NAwAAAB6d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVl
+ LnpjeAwAAAByZmRncm4xZS5yZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5
+ Y3lreGVnYy4zYmwMAAAAajNqMnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5p
+ cTUMAAAAMGp1cmoyMWkuNDAzDAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlv
+ MnM1MHAueGprDAAAAHBpYWpibXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmsw
+ DAAAAGpvZHIxbHVjLmk0cAwAAAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGsz
+ MWJwLm4xdAwAAAB1MW1sazF3NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwA
+ AAB4d20wdGt2bS5xbHkMAAAAdWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhy
+ di5yc3YMAAAAdmdyYnlxdXYucXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAA
+ ZDFocWk1dmMuY20yDAAAADFxMGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQu
+ ZGlzDAAAAGNsaWY1b3h2LnQwbgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNq
+ cnNjaWp3LmJzcAwAAAAxcGxtbjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVu
+ dAwAAABhcGxhZTVocS5ibG0MAAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5s
+ YjRlNS5ibnkMAAAAYWl3amdzcWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAM
+ AAAAYXBpbWdvdGYueXE0DAAAAGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRm
+ cDAuZDV0DAAAAGhocDI1d2FpLnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAA
+ AHhyMTFmNHVuLjJidQwAAAB3ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cx
+ LmdqMgwAAABrMHRzbjRmaC5va2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABx
+ ZHpwNWRyby4xcXcMAAAAa2ZhYmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53
+ MGgMAAAAZGZkNDN6dHcubWlyDAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3ls
+ ZjF4aHguZ2RqDAAAADR5bnAwdmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpk
+ DAAAADRuMm5kMGlvLm53ZAwAAAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1
+ ZnJ1LmRjcwwAAAB4NGpoNXBkci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwA
+ AABhMmJ0bWJ5YS5xZ2UMAAAAbGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXky
+ bi52bjQMAAAAZXpvemI0M2suYTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAA
+ MnBsbXVrdHIuYnB4DAAAAGhmeGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMu
+ Z21sDAAAAHJpY2o0eGs1LnBqbQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAx
+ bGdncnVzLnB5bAwAAABqb3R3cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96
+ bgwAAABhdGhucnJ6di5pdG8MAAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1i
+ aDNraS5rYm8MAAAAZzRoZnNoYWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoM
+ AAAAbGY1cG14YXguYWJ6DAAAAGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6
+ dzUuaXU1DAAAAHlzMjMzZm52LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAA
+ AG8ydHFzM2NuLjBxcgwAAABycnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29q
+ LmExcAwAAABtNXNxd2Nkai5vbHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABo
+ c3ozcWdoNC53MTMMAAAAZWN0Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5k
+ MzMMAAAANXA1YW1ja2wuam1sDAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1
+ MzJrenQudGllDAAAAGEzdG9nZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVj
+ DAAAAGVia3h2bXExLjJ0aQwAAABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNj
+ bTQxLnQxbAwAAAB3aW55a2FtZy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwA
+ AAAzaWtwa2tteC5xZjIMAAAAYnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBu
+ MC41cWYMAAAAM25uZGNobWcueXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAA
+ d2lveTF5bmIuZ3gxDAAAAGdjdDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEu
+ eTUxDAAAADIzcmVlbjI0LngzMgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpz
+ dWl2em1jLnRmMwwAAABvMmt4bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndz
+ cQwAAAA0dDIxaDB0Yi56dDIMAAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3
+ ZWxteC5kaHoMAAAAc2JvNHRjeXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncM
+ AAAAajJvNXdkcncuZ3VrDAAAAGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtv
+ NTUueGZwDAAAADVvdnlydHptLmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAA
+ AHZ2MWVkcnI0Lm1rcAwAAAB1aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVm
+ LmJjcAwAAAB5ZGVzcGpjZy5pajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0
+ cDRtNXR0dC53bXgMAAAAcGpkY3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41
+ ZW8MAAAAc2I1MTJ5YmouM3JjDAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5
+ bmJjc2gueHR1DAAAAG8yYTFiZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5
+ DAAAAHNwZmZ3bHhwLjRtcQwAAABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdr
+ NWpmLnhjYgwAAABncTR4c3dxdC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwA
+ AABsdnpvdzRpMy5jNHYMAAAAankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2Js
+ aS5tcGQMAAAAbzBydHh1YmcuMWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAA
+ MGJlaDRta2QueWVrDAAAAHVjc2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUu
+ MXVhDAAAAGMyMjN6Y3JsLmljcgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJr
+ NGVwa2hrLnVhdQwAAABzbG40cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMz
+ dAwAAAB3ZWowcGhmbi4xa2sMAAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4y
+ cmR0NC5qZmMMAAAAYmdpMnN0YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAM
+ AAAAbmdkdDBybnIueGtzDAAAAGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0
+ NGkub3JrDAAAAHdveTFvZ3N0LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAA
+ AHYxcXRtZzFlLnV0cwwAAAByajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25y
+ LjB0MAwAAAA1am9zZG5oZi5ndmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAx
+ bXZ1eDFzcS55cHEMAAAAZnpiZ2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54
+ NGMMAAAAMXJ4MHFuaXQueW96DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRl
+ aTVxa3oudXZiDAAAAHIxMWlkZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2
+ DAAAAGIwd2tncGFuLm5xawwAAAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhr
+ bzRxLmRhdgwAAABhdzB5cWZwby4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwA
+ AAB4bGdvNHgxdy5odXUMAAAAbzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwz
+ Zy50bXIMAAAAa2p4MGVyb2EucGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAA
+ aGR0dzNsZWouaHdyDAAAAG5zY3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3Mmwu
+ NWZsDAAAAHhoZWd5d3Z6LncxYwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVx
+ ZGRrYmJiLnFnbgwAAAAzZnM0ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4
+ dAwAAABweXZudXJ0ZC4zZGMMAAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRz
+ eTR1cy4yMmQMAAAAamxiMGJ0enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQM
+ AAAAa2c1anNqNXIubG96DAAAAGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21y
+ d3AuNHUzDAAAAHd3MGFzc3l4Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAA
+ AGZ1b2pmcTQwLmZ5dAwAAABtYXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRq
+ LnF4cgwAAABxbnd1dGx6YS5neXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4
+ a2xpamN2ai4zcjEMAAAAc3cxYnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5x
+ bGMMAAAAczFwZ3psaHgueXRwDAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3No
+ cmV0dGYubzAyDAAAAHNyZXZ3eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2Jr
+ DAAAADBpdDFtZnhzLmpxMAwAAABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2Nm
+ ZzNtLnhycwwAAABkd295eWllaC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwA
+ AABqaWRjNW5paC41enEMAAAAMDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2Jj
+ My5wYWsMAAAAd3Nnd3B0d2IubG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAA
+ dHpoNHN2dTIuaHp6DAAAAHBjbXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUu
+ dXZnDAAAAGJuNHN5cWdrLjBjMgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQx
+ ZmNqYmsxLnFseAwAAAAzcmhvM3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0
+ eQwAAABra2lldXZ0NC5zY3gMAAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYz
+ Ympvdi5waTIMAAAAb3NoaWh4ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUM
+ AAAAeGVnNDBib2QudWp3DAAAAHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtz
+ bHIuMjJwDAAAAGZ2dmh3aWs0LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAA
+ AGF3cHczZGpiLjBnZAwAAABwb21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0
+ LjJubQwAAABweWR1bGNpYi56YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5
+ anphNGJrbC5ocWcMAAAAbG5qMmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40
+ d28MAAAAem5iejRoYmQubHozDAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQz
+ emVkaW4uMXYyDAAAAGV5YTUwcnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMx
+ DAAAAHlmendwNHlxLnp5bAwAAAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1
+ c2ljLm1mawwAAABrZWVmcG1nYy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwA
+ AABkNWZ4cXpldS5ua2kMAAAAbTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlv
+ dS56bWUMAAAAaGVxa2R1bHUudHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAA
+ bGN6aTQ1MnAuaWEyDAAAAGEwcmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWku
+ bWd0DAAAADV3b25lcTUyLnJndwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1
+ eXpvNXVlLjNuYwwAAABqNG9nMnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhy
+ eQwAAAA0bzNhY3B0ZC41c3EMAAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRn
+ enA1bi52enUMAAAAZHZycHZ5M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwM
+ AAAAYW1veWtvZGkuNW9nDAAAAG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgw
+ cGouMzF2DAAAADMwcndocHBsLmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAA
+ ADNleGlsbXB2Lmp6aQwAAABsYWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5
+ LmljcgwAAAA1NHBhMnBtdy5yamkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABp
+ ZmxlaTFuMS5idGsMAAAAYmxkd2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5t
+ cjIMAAAAYTRxZG94ZWsuajMxDAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lr
+ ampkMWMuNGd5DAAAADVqM2wxMHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3Fv
+ DAAAAGI1ZjNmcWRpLjB5NQwAAABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxj
+ dmdtLmpnagwAAAAzZmMwZXdibS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwA
+ AABxMnRmYjB2ay5uMmQMAAAAa2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1
+ dy5rcXYMAAAAbWRjcGVld2IuNXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAA
+ eXlhbGJ1Y3MuYW5nDAAAAHAzeHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cu
+ NTU0DAAAAGVydTJsbmowLnN1dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZm
+ eGJidWFkLm5tNQwAAABidmo1eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNy
+ ZwwAAABvZWVrcjJ0eC51aXkMAAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdl
+ bGRrdi56YXEMAAAAamJ4YzB3dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIM
+ AAAAaGhwejQyeHQuZ3F4DAAAADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2Jx
+ dWwudWQyDAAAAG94MDQ1azFvLmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAA
+ AGozcGM1c20wLm1sYwwAAABpc2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2Rv
+ Lm1nYQwAAAB5ZWpnb2d4by55bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2
+ enEzMW94Yi50djMMAAAAeHFzMGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5y
+ cnkMAAAAMDV0Y3h0MmwucXo1DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWEx
+ cnIxZGwudWVlDAAAAHFzdWdueXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6
+ DAAAADUxeW01YmhxLmVybAwAAABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdr
+ Z3lsLm1wdAwAAABkZDV3dGh5aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwA
+ AABocGdudG5qaC56dHIMAAAAeDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJy
+ bC4ybXUMAAAAd2lrdXB4b2ouc2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAA
+ MHB4MWRpY2wucWd3DAAAAHVxYTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8u
+ anZpDAAAAGQ0bDQwbGJxLjUwZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHow
+ YmNsa2R1LmNwawwAAAB3MGpvZ3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3
+ aQwAAABidXp6MmpuMi52MzUMAAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVq
+ MXRydC5rdXgMAAAAYzExcG9lMDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8M
+ AAAANWw1MWswdGsueGRsDAAAAGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZs
+ djQub2lpDAAAAHVzMzMyMDJyLm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAA
+ AGx5ZmNscmh3LnJ0NAwAAABka3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFy
+ LnBzNQwAAABxd2YwM2lxZC5oZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABj
+ djFlMnhvdS4xbngMAAAAbGFsbzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5o
+ a2kMAAAAeTB2MjM1eG4uMG5mDAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMw
+ YmRudjEuNDVjDAAAAGhpM3p5cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNl
+ DAAAAGZhZXEwdTNrLmZndQwAAABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xn
+ b2hkLjVibgwAAAB2YWR0YXNsaC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwA
+ AABmcTJ5bmZiMS5tb3IMAAAAZm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2Zx
+ My5nZWYMAAAAcWNtYmpha2cucGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAA
+ eW1vNXlsengudmt3DAAAAHZ1bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcu
+ dW8zDAAAAG4zMm00aGVkLnRtcgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBj
+ eXBuZGVwLjNrdwwAAABrdWg0NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmli
+ cAwAAABhc2szdXNzcy56YjUMAAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVl
+ aWVmZi5sc3gMAAAAa2pmMG9ubmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEM
+ AAAAajJuamJtZHEuMTRhDAAAAG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUw
+ anAudmVnDAAAADFsM3phZ3F4Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAA
+ ADR3MTJncHAzLmRycwwAAABxMnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtv
+ LjFucAwAAAA0aW54a3YzZC54eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAz
+ bGN1aGZpcS4yYWYMAAAAeGtpNXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5s
+ Z2sMAAAAeHlxZXE1ejMubTRhDAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNj
+ c21uNWkudzFuDAAAAHptNWtpY3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNw
+ DAAAAHlranlrY3F4LnJqMAwAAABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2Vr
+ dTNhLnl3ZAwAAAA0bnAwdGdoNS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwA
+ AAA0azEwdnV6by56d3cMAAAAb3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0
+ di4zY3YMAAAAaGNhMGx3cjMueGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAA
+ YTJqaHRxeWIuczVjDAAAAGtmZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIu
+ dm53DAAAAHZycDBncG1mLnkyYQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4x
+ dnYxdHN1LjFpbAwAAABnZjFiaDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3
+ agwAAABqbmE1em0wYy5hb3gMAAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41
+ cW1ueS5kbDAMAAAAbTNkd3JxMmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMM
+ AAAAMXU1cjFuYXoueWhjDAAAAG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81
+ MmIuZnlwDAAAAGJuNHJ6aXNyLjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAA
+ AGZ6aWpmcGpsLmMwagwAAABnM3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3Nu
+ LmRoagwAAAAyZnZ3eGlsdi5pd2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABu
+ cWZtMWJvZS51ZG4MAAAAdGxhczJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5u
+ M20MAAAAYnNqbDBudmkuaW5oDAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpo
+ M2NmYXguNWZmDAAAAGlnM2x0ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0
+ DAAAAG1mbzF0amV4LjR5bAwAAABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHht
+ MjN4Lmx4cQwAAAB6amlqZGV2cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwA
+ AAB4bGE0NGYxaS5jbmIMAAAANTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNh
+ ZS5vdWYMAAAAZG5qd25lcnYuZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAA
+ MTEyYnFwcWYuaWMzDAAAAGtwNHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2ku
+ ajJ4DAAAAHNudnF3aGkxLml3aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRs
+ c2Fpb2FzLmhzMwwAAAAweGZhdDNxei5vYWkVABWOfRWOfSwV0A8VABUGFQYcGAQxOTk5GAQxMDAw
+ FgAW0A8YBDE5OTkYBDEwMDAAAAADAAAA0A8BBAAAADEwMDAEAAAAMTAwMQQAAAAxMDAyBAAAADEw
+ MDMEAAAAMTAwNAQAAAAxMDA1BAAAADEwMDYEAAAAMTAwNwQAAAAxMDA4BAAAADEwMDkEAAAAMTAx
+ MAQAAAAxMDExBAAAADEwMTIEAAAAMTAxMwQAAAAxMDE0BAAAADEwMTUEAAAAMTAxNgQAAAAxMDE3
+ BAAAADEwMTgEAAAAMTAxOQQAAAAxMDIwBAAAADEwMjEEAAAAMTAyMgQAAAAxMDIzBAAAADEwMjQE
+ AAAAMTAyNQQAAAAxMDI2BAAAADEwMjcEAAAAMTAyOAQAAAAxMDI5BAAAADEwMzAEAAAAMTAzMQQA
+ AAAxMDMyBAAAADEwMzMEAAAAMTAzNAQAAAAxMDM1BAAAADEwMzYEAAAAMTAzNwQAAAAxMDM4BAAA
+ ADEwMzkEAAAAMTA0MAQAAAAxMDQxBAAAADEwNDIEAAAAMTA0MwQAAAAxMDQ0BAAAADEwNDUEAAAA
+ MTA0NgQAAAAxMDQ3BAAAADEwNDgEAAAAMTA0OQQAAAAxMDUwBAAAADEwNTEEAAAAMTA1MgQAAAAx
+ MDUzBAAAADEwNTQEAAAAMTA1NQQAAAAxMDU2BAAAADEwNTcEAAAAMTA1OAQAAAAxMDU5BAAAADEw
+ NjAEAAAAMTA2MQQAAAAxMDYyBAAAADEwNjMEAAAAMTA2NAQAAAAxMDY1BAAAADEwNjYEAAAAMTA2
+ NwQAAAAxMDY4BAAAADEwNjkEAAAAMTA3MAQAAAAxMDcxBAAAADEwNzIEAAAAMTA3MwQAAAAxMDc0
+ BAAAADEwNzUEAAAAMTA3NgQAAAAxMDc3BAAAADEwNzgEAAAAMTA3OQQAAAAxMDgwBAAAADEwODEE
+ AAAAMTA4MgQAAAAxMDgzBAAAADEwODQEAAAAMTA4NQQAAAAxMDg2BAAAADEwODcEAAAAMTA4OAQA
+ AAAxMDg5BAAAADEwOTAEAAAAMTA5MQQAAAAxMDkyBAAAADEwOTMEAAAAMTA5NAQAAAAxMDk1BAAA
+ ADEwOTYEAAAAMTA5NwQAAAAxMDk4BAAAADEwOTkEAAAAMTEwMAQAAAAxMTAxBAAAADExMDIEAAAA
+ MTEwMwQAAAAxMTA0BAAAADExMDUEAAAAMTEwNgQAAAAxMTA3BAAAADExMDgEAAAAMTEwOQQAAAAx
+ MTEwBAAAADExMTEEAAAAMTExMgQAAAAxMTEzBAAAADExMTQEAAAAMTExNQQAAAAxMTE2BAAAADEx
+ MTcEAAAAMTExOAQAAAAxMTE5BAAAADExMjAEAAAAMTEyMQQAAAAxMTIyBAAAADExMjMEAAAAMTEy
+ NAQAAAAxMTI1BAAAADExMjYEAAAAMTEyNwQAAAAxMTI4BAAAADExMjkEAAAAMTEzMAQAAAAxMTMx
+ BAAAADExMzIEAAAAMTEzMwQAAAAxMTM0BAAAADExMzUEAAAAMTEzNgQAAAAxMTM3BAAAADExMzgE
+ AAAAMTEzOQQAAAAxMTQwBAAAADExNDEEAAAAMTE0MgQAAAAxMTQzBAAAADExNDQEAAAAMTE0NQQA
+ AAAxMTQ2BAAAADExNDcEAAAAMTE0OAQAAAAxMTQ5BAAAADExNTAEAAAAMTE1MQQAAAAxMTUyBAAA
+ ADExNTMEAAAAMTE1NAQAAAAxMTU1BAAAADExNTYEAAAAMTE1NwQAAAAxMTU4BAAAADExNTkEAAAA
+ MTE2MAQAAAAxMTYxBAAAADExNjIEAAAAMTE2MwQAAAAxMTY0BAAAADExNjUEAAAAMTE2NgQAAAAx
+ MTY3BAAAADExNjgEAAAAMTE2OQQAAAAxMTcwBAAAADExNzEEAAAAMTE3MgQAAAAxMTczBAAAADEx
+ NzQEAAAAMTE3NQQAAAAxMTc2BAAAADExNzcEAAAAMTE3OAQAAAAxMTc5BAAAADExODAEAAAAMTE4
+ MQQAAAAxMTgyBAAAADExODMEAAAAMTE4NAQAAAAxMTg1BAAAADExODYEAAAAMTE4NwQAAAAxMTg4
+ BAAAADExODkEAAAAMTE5MAQAAAAxMTkxBAAAADExOTIEAAAAMTE5MwQAAAAxMTk0BAAAADExOTUE
+ AAAAMTE5NgQAAAAxMTk3BAAAADExOTgEAAAAMTE5OQQAAAAxMjAwBAAAADEyMDEEAAAAMTIwMgQA
+ AAAxMjAzBAAAADEyMDQEAAAAMTIwNQQAAAAxMjA2BAAAADEyMDcEAAAAMTIwOAQAAAAxMjA5BAAA
+ ADEyMTAEAAAAMTIxMQQAAAAxMjEyBAAAADEyMTMEAAAAMTIxNAQAAAAxMjE1BAAAADEyMTYEAAAA
+ MTIxNwQAAAAxMjE4BAAAADEyMTkEAAAAMTIyMAQAAAAxMjIxBAAAADEyMjIEAAAAMTIyMwQAAAAx
+ MjI0BAAAADEyMjUEAAAAMTIyNgQAAAAxMjI3BAAAADEyMjgEAAAAMTIyOQQAAAAxMjMwBAAAADEy
+ MzEEAAAAMTIzMgQAAAAxMjMzBAAAADEyMzQEAAAAMTIzNQQAAAAxMjM2BAAAADEyMzcEAAAAMTIz
+ OAQAAAAxMjM5BAAAADEyNDAEAAAAMTI0MQQAAAAxMjQyBAAAADEyNDMEAAAAMTI0NAQAAAAxMjQ1
+ BAAAADEyNDYEAAAAMTI0NwQAAAAxMjQ4BAAAADEyNDkEAAAAMTI1MAQAAAAxMjUxBAAAADEyNTIE
+ AAAAMTI1MwQAAAAxMjU0BAAAADEyNTUEAAAAMTI1NgQAAAAxMjU3BAAAADEyNTgEAAAAMTI1OQQA
+ AAAxMjYwBAAAADEyNjEEAAAAMTI2MgQAAAAxMjYzBAAAADEyNjQEAAAAMTI2NQQAAAAxMjY2BAAA
+ ADEyNjcEAAAAMTI2OAQAAAAxMjY5BAAAADEyNzAEAAAAMTI3MQQAAAAxMjcyBAAAADEyNzMEAAAA
+ MTI3NAQAAAAxMjc1BAAAADEyNzYEAAAAMTI3NwQAAAAxMjc4BAAAADEyNzkEAAAAMTI4MAQAAAAx
+ MjgxBAAAADEyODIEAAAAMTI4MwQAAAAxMjg0BAAAADEyODUEAAAAMTI4NgQAAAAxMjg3BAAAADEy
+ ODgEAAAAMTI4OQQAAAAxMjkwBAAAADEyOTEEAAAAMTI5MgQAAAAxMjkzBAAAADEyOTQEAAAAMTI5
+ NQQAAAAxMjk2BAAAADEyOTcEAAAAMTI5OAQAAAAxMjk5BAAAADEzMDAEAAAAMTMwMQQAAAAxMzAy
+ BAAAADEzMDMEAAAAMTMwNAQAAAAxMzA1BAAAADEzMDYEAAAAMTMwNwQAAAAxMzA4BAAAADEzMDkE
+ AAAAMTMxMAQAAAAxMzExBAAAADEzMTIEAAAAMTMxMwQAAAAxMzE0BAAAADEzMTUEAAAAMTMxNgQA
+ AAAxMzE3BAAAADEzMTgEAAAAMTMxOQQAAAAxMzIwBAAAADEzMjEEAAAAMTMyMgQAAAAxMzIzBAAA
+ ADEzMjQEAAAAMTMyNQQAAAAxMzI2BAAAADEzMjcEAAAAMTMyOAQAAAAxMzI5BAAAADEzMzAEAAAA
+ MTMzMQQAAAAxMzMyBAAAADEzMzMEAAAAMTMzNAQAAAAxMzM1BAAAADEzMzYEAAAAMTMzNwQAAAAx
+ MzM4BAAAADEzMzkEAAAAMTM0MAQAAAAxMzQxBAAAADEzNDIEAAAAMTM0MwQAAAAxMzQ0BAAAADEz
+ NDUEAAAAMTM0NgQAAAAxMzQ3BAAAADEzNDgEAAAAMTM0OQQAAAAxMzUwBAAAADEzNTEEAAAAMTM1
+ MgQAAAAxMzUzBAAAADEzNTQEAAAAMTM1NQQAAAAxMzU2BAAAADEzNTcEAAAAMTM1OAQAAAAxMzU5
+ BAAAADEzNjAEAAAAMTM2MQQAAAAxMzYyBAAAADEzNjMEAAAAMTM2NAQAAAAxMzY1BAAAADEzNjYE
+ AAAAMTM2NwQAAAAxMzY4BAAAADEzNjkEAAAAMTM3MAQAAAAxMzcxBAAAADEzNzIEAAAAMTM3MwQA
+ AAAxMzc0BAAAADEzNzUEAAAAMTM3NgQAAAAxMzc3BAAAADEzNzgEAAAAMTM3OQQAAAAxMzgwBAAA
+ ADEzODEEAAAAMTM4MgQAAAAxMzgzBAAAADEzODQEAAAAMTM4NQQAAAAxMzg2BAAAADEzODcEAAAA
+ MTM4OAQAAAAxMzg5BAAAADEzOTAEAAAAMTM5MQQAAAAxMzkyBAAAADEzOTMEAAAAMTM5NAQAAAAx
+ Mzk1BAAAADEzOTYEAAAAMTM5NwQAAAAxMzk4BAAAADEzOTkEAAAAMTQwMAQAAAAxNDAxBAAAADE0
+ MDIEAAAAMTQwMwQAAAAxNDA0BAAAADE0MDUEAAAAMTQwNgQAAAAxNDA3BAAAADE0MDgEAAAAMTQw
+ OQQAAAAxNDEwBAAAADE0MTEEAAAAMTQxMgQAAAAxNDEzBAAAADE0MTQEAAAAMTQxNQQAAAAxNDE2
+ BAAAADE0MTcEAAAAMTQxOAQAAAAxNDE5BAAAADE0MjAEAAAAMTQyMQQAAAAxNDIyBAAAADE0MjME
+ AAAAMTQyNAQAAAAxNDI1BAAAADE0MjYEAAAAMTQyNwQAAAAxNDI4BAAAADE0MjkEAAAAMTQzMAQA
+ AAAxNDMxBAAAADE0MzIEAAAAMTQzMwQAAAAxNDM0BAAAADE0MzUEAAAAMTQzNgQAAAAxNDM3BAAA
+ ADE0MzgEAAAAMTQzOQQAAAAxNDQwBAAAADE0NDEEAAAAMTQ0MgQAAAAxNDQzBAAAADE0NDQEAAAA
+ MTQ0NQQAAAAxNDQ2BAAAADE0NDcEAAAAMTQ0OAQAAAAxNDQ5BAAAADE0NTAEAAAAMTQ1MQQAAAAx
+ NDUyBAAAADE0NTMEAAAAMTQ1NAQAAAAxNDU1BAAAADE0NTYEAAAAMTQ1NwQAAAAxNDU4BAAAADE0
+ NTkEAAAAMTQ2MAQAAAAxNDYxBAAAADE0NjIEAAAAMTQ2MwQAAAAxNDY0BAAAADE0NjUEAAAAMTQ2
+ NgQAAAAxNDY3BAAAADE0NjgEAAAAMTQ2OQQAAAAxNDcwBAAAADE0NzEEAAAAMTQ3MgQAAAAxNDcz
+ BAAAADE0NzQEAAAAMTQ3NQQAAAAxNDc2BAAAADE0NzcEAAAAMTQ3OAQAAAAxNDc5BAAAADE0ODAE
+ AAAAMTQ4MQQAAAAxNDgyBAAAADE0ODMEAAAAMTQ4NAQAAAAxNDg1BAAAADE0ODYEAAAAMTQ4NwQA
+ AAAxNDg4BAAAADE0ODkEAAAAMTQ5MAQAAAAxNDkxBAAAADE0OTIEAAAAMTQ5MwQAAAAxNDk0BAAA
+ ADE0OTUEAAAAMTQ5NgQAAAAxNDk3BAAAADE0OTgEAAAAMTQ5OQQAAAAxNTAwBAAAADE1MDEEAAAA
+ MTUwMgQAAAAxNTAzBAAAADE1MDQEAAAAMTUwNQQAAAAxNTA2BAAAADE1MDcEAAAAMTUwOAQAAAAx
+ NTA5BAAAADE1MTAEAAAAMTUxMQQAAAAxNTEyBAAAADE1MTMEAAAAMTUxNAQAAAAxNTE1BAAAADE1
+ MTYEAAAAMTUxNwQAAAAxNTE4BAAAADE1MTkEAAAAMTUyMAQAAAAxNTIxBAAAADE1MjIEAAAAMTUy
+ MwQAAAAxNTI0BAAAADE1MjUEAAAAMTUyNgQAAAAxNTI3BAAAADE1MjgEAAAAMTUyOQQAAAAxNTMw
+ BAAAADE1MzEEAAAAMTUzMgQAAAAxNTMzBAAAADE1MzQEAAAAMTUzNQQAAAAxNTM2BAAAADE1MzcE
+ AAAAMTUzOAQAAAAxNTM5BAAAADE1NDAEAAAAMTU0MQQAAAAxNTQyBAAAADE1NDMEAAAAMTU0NAQA
+ AAAxNTQ1BAAAADE1NDYEAAAAMTU0NwQAAAAxNTQ4BAAAADE1NDkEAAAAMTU1MAQAAAAxNTUxBAAA
+ ADE1NTIEAAAAMTU1MwQAAAAxNTU0BAAAADE1NTUEAAAAMTU1NgQAAAAxNTU3BAAAADE1NTgEAAAA
+ MTU1OQQAAAAxNTYwBAAAADE1NjEEAAAAMTU2MgQAAAAxNTYzBAAAADE1NjQEAAAAMTU2NQQAAAAx
+ NTY2BAAAADE1NjcEAAAAMTU2OAQAAAAxNTY5BAAAADE1NzAEAAAAMTU3MQQAAAAxNTcyBAAAADE1
+ NzMEAAAAMTU3NAQAAAAxNTc1BAAAADE1NzYEAAAAMTU3NwQAAAAxNTc4BAAAADE1NzkEAAAAMTU4
+ MAQAAAAxNTgxBAAAADE1ODIEAAAAMTU4MwQAAAAxNTg0BAAAADE1ODUEAAAAMTU4NgQAAAAxNTg3
+ BAAAADE1ODgEAAAAMTU4OQQAAAAxNTkwBAAAADE1OTEEAAAAMTU5MgQAAAAxNTkzBAAAADE1OTQE
+ AAAAMTU5NQQAAAAxNTk2BAAAADE1OTcEAAAAMTU5OAQAAAAxNTk5BAAAADE2MDAEAAAAMTYwMQQA
+ AAAxNjAyBAAAADE2MDMEAAAAMTYwNAQAAAAxNjA1BAAAADE2MDYEAAAAMTYwNwQAAAAxNjA4BAAA
+ ADE2MDkEAAAAMTYxMAQAAAAxNjExBAAAADE2MTIEAAAAMTYxMwQAAAAxNjE0BAAAADE2MTUEAAAA
+ MTYxNgQAAAAxNjE3BAAAADE2MTgEAAAAMTYxOQQAAAAxNjIwBAAAADE2MjEEAAAAMTYyMgQAAAAx
+ NjIzBAAAADE2MjQEAAAAMTYyNQQAAAAxNjI2BAAAADE2MjcEAAAAMTYyOAQAAAAxNjI5BAAAADE2
+ MzAEAAAAMTYzMQQAAAAxNjMyBAAAADE2MzMEAAAAMTYzNAQAAAAxNjM1BAAAADE2MzYEAAAAMTYz
+ NwQAAAAxNjM4BAAAADE2MzkEAAAAMTY0MAQAAAAxNjQxBAAAADE2NDIEAAAAMTY0MwQAAAAxNjQ0
+ BAAAADE2NDUEAAAAMTY0NgQAAAAxNjQ3BAAAADE2NDgEAAAAMTY0OQQAAAAxNjUwBAAAADE2NTEE
+ AAAAMTY1MgQAAAAxNjUzBAAAADE2NTQEAAAAMTY1NQQAAAAxNjU2BAAAADE2NTcEAAAAMTY1OAQA
+ AAAxNjU5BAAAADE2NjAEAAAAMTY2MQQAAAAxNjYyBAAAADE2NjMEAAAAMTY2NAQAAAAxNjY1BAAA
+ ADE2NjYEAAAAMTY2NwQAAAAxNjY4BAAAADE2NjkEAAAAMTY3MAQAAAAxNjcxBAAAADE2NzIEAAAA
+ MTY3MwQAAAAxNjc0BAAAADE2NzUEAAAAMTY3NgQAAAAxNjc3BAAAADE2NzgEAAAAMTY3OQQAAAAx
+ NjgwBAAAADE2ODEEAAAAMTY4MgQAAAAxNjgzBAAAADE2ODQEAAAAMTY4NQQAAAAxNjg2BAAAADE2
+ ODcEAAAAMTY4OAQAAAAxNjg5BAAAADE2OTAEAAAAMTY5MQQAAAAxNjkyBAAAADE2OTMEAAAAMTY5
+ NAQAAAAxNjk1BAAAADE2OTYEAAAAMTY5NwQAAAAxNjk4BAAAADE2OTkEAAAAMTcwMAQAAAAxNzAx
+ BAAAADE3MDIEAAAAMTcwMwQAAAAxNzA0BAAAADE3MDUEAAAAMTcwNgQAAAAxNzA3BAAAADE3MDgE
+ AAAAMTcwOQQAAAAxNzEwBAAAADE3MTEEAAAAMTcxMgQAAAAxNzEzBAAAADE3MTQEAAAAMTcxNQQA
+ AAAxNzE2BAAAADE3MTcEAAAAMTcxOAQAAAAxNzE5BAAAADE3MjAEAAAAMTcyMQQAAAAxNzIyBAAA
+ ADE3MjMEAAAAMTcyNAQAAAAxNzI1BAAAADE3MjYEAAAAMTcyNwQAAAAxNzI4BAAAADE3MjkEAAAA
+ MTczMAQAAAAxNzMxBAAAADE3MzIEAAAAMTczMwQAAAAxNzM0BAAAADE3MzUEAAAAMTczNgQAAAAx
+ NzM3BAAAADE3MzgEAAAAMTczOQQAAAAxNzQwBAAAADE3NDEEAAAAMTc0MgQAAAAxNzQzBAAAADE3
+ NDQEAAAAMTc0NQQAAAAxNzQ2BAAAADE3NDcEAAAAMTc0OAQAAAAxNzQ5BAAAADE3NTAEAAAAMTc1
+ MQQAAAAxNzUyBAAAADE3NTMEAAAAMTc1NAQAAAAxNzU1BAAAADE3NTYEAAAAMTc1NwQAAAAxNzU4
+ BAAAADE3NTkEAAAAMTc2MAQAAAAxNzYxBAAAADE3NjIEAAAAMTc2MwQAAAAxNzY0BAAAADE3NjUE
+ AAAAMTc2NgQAAAAxNzY3BAAAADE3NjgEAAAAMTc2OQQAAAAxNzcwBAAAADE3NzEEAAAAMTc3MgQA
+ AAAxNzczBAAAADE3NzQEAAAAMTc3NQQAAAAxNzc2BAAAADE3NzcEAAAAMTc3OAQAAAAxNzc5BAAA
+ ADE3ODAEAAAAMTc4MQQAAAAxNzgyBAAAADE3ODMEAAAAMTc4NAQAAAAxNzg1BAAAADE3ODYEAAAA
+ MTc4NwQAAAAxNzg4BAAAADE3ODkEAAAAMTc5MAQAAAAxNzkxBAAAADE3OTIEAAAAMTc5MwQAAAAx
+ Nzk0BAAAADE3OTUEAAAAMTc5NgQAAAAxNzk3BAAAADE3OTgEAAAAMTc5OQQAAAAxODAwBAAAADE4
+ MDEEAAAAMTgwMgQAAAAxODAzBAAAADE4MDQEAAAAMTgwNQQAAAAxODA2BAAAADE4MDcEAAAAMTgw
+ OAQAAAAxODA5BAAAADE4MTAEAAAAMTgxMQQAAAAxODEyBAAAADE4MTMEAAAAMTgxNAQAAAAxODE1
+ BAAAADE4MTYEAAAAMTgxNwQAAAAxODE4BAAAADE4MTkEAAAAMTgyMAQAAAAxODIxBAAAADE4MjIE
+ AAAAMTgyMwQAAAAxODI0BAAAADE4MjUEAAAAMTgyNgQAAAAxODI3BAAAADE4MjgEAAAAMTgyOQQA
+ AAAxODMwBAAAADE4MzEEAAAAMTgzMgQAAAAxODMzBAAAADE4MzQEAAAAMTgzNQQAAAAxODM2BAAA
+ ADE4MzcEAAAAMTgzOAQAAAAxODM5BAAAADE4NDAEAAAAMTg0MQQAAAAxODQyBAAAADE4NDMEAAAA
+ MTg0NAQAAAAxODQ1BAAAADE4NDYEAAAAMTg0NwQAAAAxODQ4BAAAADE4NDkEAAAAMTg1MAQAAAAx
+ ODUxBAAAADE4NTIEAAAAMTg1MwQAAAAxODU0BAAAADE4NTUEAAAAMTg1NgQAAAAxODU3BAAAADE4
+ NTgEAAAAMTg1OQQAAAAxODYwBAAAADE4NjEEAAAAMTg2MgQAAAAxODYzBAAAADE4NjQEAAAAMTg2
+ NQQAAAAxODY2BAAAADE4NjcEAAAAMTg2OAQAAAAxODY5BAAAADE4NzAEAAAAMTg3MQQAAAAxODcy
+ BAAAADE4NzMEAAAAMTg3NAQAAAAxODc1BAAAADE4NzYEAAAAMTg3NwQAAAAxODc4BAAAADE4NzkE
+ AAAAMTg4MAQAAAAxODgxBAAAADE4ODIEAAAAMTg4MwQAAAAxODg0BAAAADE4ODUEAAAAMTg4NgQA
+ AAAxODg3BAAAADE4ODgEAAAAMTg4OQQAAAAxODkwBAAAADE4OTEEAAAAMTg5MgQAAAAxODkzBAAA
+ ADE4OTQEAAAAMTg5NQQAAAAxODk2BAAAADE4OTcEAAAAMTg5OAQAAAAxODk5BAAAADE5MDAEAAAA
+ MTkwMQQAAAAxOTAyBAAAADE5MDMEAAAAMTkwNAQAAAAxOTA1BAAAADE5MDYEAAAAMTkwNwQAAAAx
+ OTA4BAAAADE5MDkEAAAAMTkxMAQAAAAxOTExBAAAADE5MTIEAAAAMTkxMwQAAAAxOTE0BAAAADE5
+ MTUEAAAAMTkxNgQAAAAxOTE3BAAAADE5MTgEAAAAMTkxOQQAAAAxOTIwBAAAADE5MjEEAAAAMTky
+ MgQAAAAxOTIzBAAAADE5MjQEAAAAMTkyNQQAAAAxOTI2BAAAADE5MjcEAAAAMTkyOAQAAAAxOTI5
+ BAAAADE5MzAEAAAAMTkzMQQAAAAxOTMyBAAAADE5MzMEAAAAMTkzNAQAAAAxOTM1BAAAADE5MzYE
+ AAAAMTkzNwQAAAAxOTM4BAAAADE5MzkEAAAAMTk0MAQAAAAxOTQxBAAAADE5NDIEAAAAMTk0MwQA
+ AAAxOTQ0BAAAADE5NDUEAAAAMTk0NgQAAAAxOTQ3BAAAADE5NDgEAAAAMTk0OQQAAAAxOTUwBAAA
+ ADE5NTEEAAAAMTk1MgQAAAAxOTUzBAAAADE5NTQEAAAAMTk1NQQAAAAxOTU2BAAAADE5NTcEAAAA
+ MTk1OAQAAAAxOTU5BAAAADE5NjAEAAAAMTk2MQQAAAAxOTYyBAAAADE5NjMEAAAAMTk2NAQAAAAx
+ OTY1BAAAADE5NjYEAAAAMTk2NwQAAAAxOTY4BAAAADE5NjkEAAAAMTk3MAQAAAAxOTcxBAAAADE5
+ NzIEAAAAMTk3MwQAAAAxOTc0BAAAADE5NzUEAAAAMTk3NgQAAAAxOTc3BAAAADE5NzgEAAAAMTk3
+ OQQAAAAxOTgwBAAAADE5ODEEAAAAMTk4MgQAAAAxOTgzBAAAADE5ODQEAAAAMTk4NQQAAAAxOTg2
+ BAAAADE5ODcEAAAAMTk4OAQAAAAxOTg5BAAAADE5OTAEAAAAMTk5MQQAAAAxOTkyBAAAADE5OTME
+ AAAAMTk5NAQAAAAxOTk1BAAAADE5OTYEAAAAMTk5NwQAAAAxOTk4BAAAADE5OTkVABWO+gEVjvoB
+ LBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1LjR5
+ YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5maGoMAAAAZG5zdGNwbHYuZWRr
+ DAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJlZXpmdGwubXEzDAAAAGdmdXg0
+ MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2tyDAAAAGV1emQxYjQxLmJxMgwA
+ AAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tmaXNkLnFqNQwAAAB2ZmtpbGsy
+ dS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwAAABhc2hvYXZvMS5vamYMAAAA
+ dWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1cy5wcDIMAAAAa3d3MTFwMmEu
+ ZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAAaTFiYnUyd2IuZGpqDAAAADJ5
+ dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20ubDQzDAAAAGFtcnRlMGxhLjJ0
+ cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5aGRjdnZsLnhieAwAAAB4ZDR3
+ MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtvcgwAAABzNHBtdTI0dC5ia3AM
+ AAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4d3dmNC5jMmsMAAAAMWpwMmls
+ d3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0MAAAAcnhlbnNva3UuamlmDAAA
+ AGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNiYXAubjJ4DAAAADVqd3Yyc2M1
+ LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAAADQzb3N5cjVuLmpzaQwAAAB1
+ NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZyLmlhZwwAAABleHJ0Z2xhMS4x
+ dTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAAByZ3BkYWx2dy5kaXgMAAAANW1p
+ b2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5zdW4MAAAAaHVobGZpdTMubG5q
+ DAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNtejVvNW0ueXVtDAAAAHN5ZGJq
+ cG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRmDAAAAG8zdHB2cmJkLmtncAwA
+ AABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2NpYWd6LmF1ZAwAAABwdWN5bWFl
+ di5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwAAAB3ZHRkcXRnYy5oNXAMAAAA
+ Y2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJpYS40amwMAAAAMmUzeWliNXku
+ b294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAAaXdramt2djQudWcyDAAAAGh4
+ aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEudjUzDAAAAHBzNHZqdHhwLnNj
+ NAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRoNG93YWFiLmh5cAwAAABiejR0
+ M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9jcAwAAAB6c2hjMXAxeC5yY2wM
+ AAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5mZGJveS5mdmEMAAAAdnp6MDJw
+ YWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUMAAAAYW1taWp6bjAuYXMxDAAA
+ AGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBxYWYuNDNzDAAAAHdybXpvaTFu
+ Lm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAAAGRkbjNmaXF0LmR6YwwAAABv
+ dXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBzLmJzYgwAAABmbWZ4cnRsZS5j
+ MXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2Z3l3bmt2Zi5hNHMMAAAAY2lu
+ eG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4xYmsMAAAAYTRzZDU0aW0ueWIz
+ DAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFjNXUzeHouNW5pDAAAAGlxYWYw
+ eHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90DAAAADFvY2FnM2Y1LnBxbQwA
+ AAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3RmamdsLmg0cAwAAAB1M2hyMGFn
+ NC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwAAAB1cjR4YjFtcC56dmUMAAAA
+ MjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZkNC53NGwMAAAAa25sYXRpYWcu
+ eTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAAbGVyeWt1dWUuYnl4DAAAAG9u
+ eDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQucG95DAAAAHkyc2FtZTR4LmZx
+ cwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1zcmt0ejNoLnJuaAwAAAB1YjR1
+ dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZleAwAAAB4aHExcTVrbC5ydDEM
+ AAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJjcHI1ZC5hc24MAAAAMXp5MzB6
+ M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYMAAAAdmhreTVrMGkuYm9pDAAA
+ AG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtlMTUuMzJlDAAAAHdtbXBobjNw
+ LjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAAAGwzbmdsYXQyLjIzeAwAAABy
+ NGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRnLmVvYwwAAAB6MDFjMm55ei55
+ ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABxcjNjbXluNS5vcGUMAAAAbTVj
+ dmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5zZjIMAAAAbWJ3Z2xiNTQuZWRi
+ DAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2VjYm5yankuMXdpDAAAADUydWFs
+ aGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2JwDAAAAGNjNTJhdmh1LnAxZQwA
+ AABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tvaWN0LnZ3YgwAAAB5dHRhaHdi
+ eS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwAAABleGZoeWIzby4ya3oMAAAA
+ NTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRtei4wcDAMAAAAZm9iZXcwbHgu
+ bnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAAaXVsM2d6eGouem9tDAAAAHY0
+ MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAuMjB2DAAAAGhkb3UwbTBpLnlv
+ dwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwycHp1MXBrLnBnbAwAAABjMWhv
+ cXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRsegwAAABkZ2l1ZXlmbS5taXMM
+ AAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXoxdm5kci5uNHAMAAAAdGFwdnB0
+ aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkMAAAAMDIwbG0xMGgud3dlDAAA
+ AGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4dHUubnAxDAAAADNjbGtrdmQy
+ LnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAAAGpvZXJnd3cyLm5mMgwAAAB2
+ MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1LmdmcwwAAAB3M2FrbGVxdS52
+ Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABjcmFmMGYwbC5icWQMAAAAcHBl
+ ZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5pYW8MAAAAbWQ1cXRwbXcub3pt
+ DAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4ZXZsdXIuZjBlDAAAADVoZ3p1
+ c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMxDAAAAHZveHV1b2ZxLm1jcQwA
+ AAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNvaW1uLnZsdgwAAABlMGQ0NGo0
+ ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwAAABheWFtY2RicS5zMHkMAAAA
+ Ynh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdjcS5sMzEMAAAAaG5mbzRwd2Iu
+ cjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAAb3pmNXIza2Eudnh2DAAAAGR6
+ dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXguNGNlDAAAAHVtdDAwcXZyLjJm
+ bwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRkeXp2bnFkLmNtcgwAAABhbXIy
+ ZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFiZQwAAAAwMWVid2p0bi53eXkM
+ AAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6MXN1Yi4wb2YMAAAAa3RsbXh4
+ ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gMAAAAMjFuNWl1bm4ubzFiDAAA
+ AHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2NkcGkucHphDAAAAG53dnRjcWIw
+ LmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAAAHJwbnZuenpyLm40cgwAAABu
+ a3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1LmpkMgwAAAB1a2RsMzAwZC5z
+ b3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABic2tqemJnYy41ajQMAAAANDNk
+ eml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54YmsMAAAAaWloZWVmbWYudnFt
+ DAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0NGVoNDMuZzV4DAAAAGp6cGZt
+ M21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBpDAAAAGxyYzJnNHNrLnJudwwA
+ AAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJuand6LmJ4eQwAAABwdGZieWxj
+ Yy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwAAAByajJyZGhhei5za3QMAAAA
+ Y3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBuby55eTIMAAAAYWh1cHFwMHou
+ d2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAAMGZncXVya3MuY2RhDAAAAHh3
+ MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wuZ2wzDAAAAHlmcnRtamViLnhz
+ cwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZqb3NnMDI0LmswdwwAAABxcGx0
+ cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6LmxkbQwAAABlMHF1dm5qYi5rbGYM
+ AAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2FrZnk0dy4xeWMMAAAAZ3N2bDA1
+ bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEMAAAANG5xMnBvY2YuM2RwDAAA
+ AHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFjNGoud3l0DAAAAG9waWt3aWpo
+ LnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAAAGF5NW5rMTN4LnJmdwwAAABl
+ bDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVlLmU1awwAAABoZGt3NWdnai5h
+ Zm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAyMnlodDV0cy40eHEMAAAAbXpt
+ MGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5mejIMAAAAdGkxM2M1MW8uNXps
+ DAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenpsZ3l4YTUuNHlhDAAAADVjNTI1
+ MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNhDAAAAG55dmVvc3gwLndvcAwA
+ AABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1azEzLmxwZQwAAABzZnFjNXJ3
+ eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwAAAB4MWZodmlrby5wcnoMAAAA
+ czM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1bS5iZXEMAAAAdHZyaDRuM2wu
+ a3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAAbWpscWlrc2wuYml1DAAAAHgz
+ cWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWoudGc1DAAAADUxcTRxa2duLmw1
+ dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1rbTJ0a2h0LnhheQwAAAA0bWJx
+ bjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndqcAwAAABmenlyNXlmbS5wZG8M
+ AAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0em90NC5yaG0MAAAAbjNqcDV2
+ Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwMAAAAcmRvMmxxYnEueXFsDAAA
+ AGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYxbWsucXdkDAAAAGp2bnRvZWY1
+ LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAAAGZ5NGFnMGgzLmR6ZAwAAABx
+ ZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4LmgwawwAAAA0Mm52c2k1dS4y
+ ZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3M3ZweGxyYy4yM3kMAAAAaGFp
+ Y2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5ocmwMAAAAc3k0YnhsdnIuYm14
+ DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3BvY3V3ZHUubjVwDAAAAGt2MHB2
+ dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3DAAAAHdiZ29md3phLmZxZAwA
+ AABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBkc3BhLjUzYgwAAABiaXBiaTVj
+ di5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwAAAB5eWFseW50Mi50bWEMAAAA
+ ZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3diYy5udGcMAAAAMnMya3Bjc2Mu
+ cW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAAd3hmMjVlZHAuaDBzDAAAAGUy
+ d3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcuYTRsDAAAADJncGFua2d4Lnlx
+ egwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRpd3Brb3MzLnp4ZgwAAAAwbmI1
+ Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnltegwAAABzem9yc2tlcS54cjQM
+ AAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRhZG51ci5uc2cMAAAAZDJnNWdk
+ MjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsMAAAAbDBtbXp2bTMuZGd5DAAA
+ AGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20za3MueG5oDAAAAHV6bHdlbGo0
+ LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAAADBha2Roam5rLmF3bAwAAABs
+ bHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJoLnRxcQwAAAAyc2l2YW5iaS5k
+ aHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2b3pnZXJmai5yd3YMAAAAY2py
+ MXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5qNGIMAAAAYWF1dHN2YnYucWRu
+ DAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJpYzF1YWQuMHJsDAAAAGp0YjVz
+ ZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1lDAAAAGR4cG4xa210LmtkbgwA
+ AABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJhejFvLnlqaQwAAAB1a2Z3aTNl
+ Yy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwAAAB5am1xaXlycC5ld2sMAAAA
+ Z3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJwaS5qZHAMAAAANXVsdGpweWQu
+ c3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAAMXdhZ2pyencueXRxDAAAAHlt
+ Y3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEuaGxlDAAAAHN1eG9vanFmLmxu
+ dQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEydTN1cmh5Lm5zeQwAAAAxeTJm
+ bHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJnegwAAABzeXRkd2J2aS5jd3oM
+ AAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1MTF6eC5jY2UMAAAAYnc1aW1p
+ YjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUMAAAAengzbWt0bzQuNXV5DAAA
+ AGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVkaDQudGJqDAAAADUwcmdoYmhi
+ LnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAAADQxYWQxdWFlLmRhdQwAAABk
+ ZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6LnZ6YgwAAABzZDF5cTU1Yy41
+ M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABkam4yZXczMC5lbmIMAAAAc3Uw
+ emdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40cHQMAAAAY2NjeGlicG0ud2Ji
+ DAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0bTJnYXoueXlmDAAAADN4aWJp
+ Y3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUyDAAAAGFmYm1peXU0Lnl6bwwA
+ AAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNtMTJrLmJkdAwAAABzMWVpa3hv
+ dy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwAAAB0ZnMxZmxrMy51ZGwMAAAA
+ ZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVxMi5yNWoMAAAAajBibmhleG8u
+ YWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAAMHRweTNjdnQuaDNiDAAAAHlr
+ MHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQuNGZtDAAAAGxyNDB0amIwLm8y
+ cwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHhtenhibnJnLmY1egwAAAB6bnFx
+ bWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxhagwAAABzNGJ4ejBndy51bTMM
+ AAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHExanlseC55cXkMAAAAMGV5Y3hm
+ d2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMMAAAAaWRmazE0aTUueG5tDAAA
+ AGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJjejIucXhtDAAAAGRoeXRzdXhl
+ LjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAAAHptcGVvbHkzLjR0MwwAAAB6
+ aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1LnpvcwwAAAB4cW5icmkwdC5t
+ bnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABjM3Qzd3IzMy5qY3gMAAAANXhq
+ a2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5lbnoMAAAAMnZseXYyYzUucWp1
+ DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2thY25xdHkuMnptDAAAAHcxdGs0
+ cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRwDAAAAHd1cmcyb2IzLjVjMwwA
+ AAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20zY24xLmNqegwAAABtYWZhdnRk
+ Yi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwAAAAxc3Jha291MS5rMG8MAAAA
+ YWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3by5hdnEMAAAAYTRkMWZleTIu
+ NXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAAaWcxNTFwZngua29tDAAAAHZ6
+ cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIudmZvDAAAAHpxbXB1aTRtLjNq
+ MwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8wazQxcTFtLmwydgwAAAA1Ymp5
+ dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZpNAwAAAA0ZGMzcnNteC4zMHEM
+ AAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhhZXFsMy5zMG4MAAAAZHlweWJ0
+ cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIMAAAAd2Qyc29zcHcuMWVpDAAA
+ ADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRxMWguZHpuDAAAAGpjMmJ4aHRu
+ Lmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAAADMyMjV2cXpoLms0YwwAAABr
+ b2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFyLjEyZgwAAAB5cnBucDJnZy5p
+ NGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABvdmdvaWs1cS54c3MMAAAAaW5x
+ cHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5xb3UMAAAAeXBicndkd3YubWFi
+ DAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1cTNzb3IubGRiDAAAAHFyeXJh
+ MWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhmDAAAAGZ4cTVmZHplLnJ1bwwA
+ AAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlwcmVoLnVueAwAAAB5c2ZocWpq
+ dS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwAAABsNXV2YTNoaC5oNHAMAAAA
+ cDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFhaC5hdW4MAAAAaHdwMDRjZnUu
+ bWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAAcnR3c2prd3MubzF3DAAAADNj
+ eXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUueGF0DAAAADM1ZmNndWpwLjNs
+ dAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBna29pNHZwLmI1dwwAAAAyZHli
+ ZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9yZgwAAAAxeGJxMjBudi5oM2YM
+ AAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0eDFiay53MDAMAAAAbDVmZnhk
+ YnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsMAAAAMWZ0bXhrYzMubGF0DAAA
+ AHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkxc2suMHAzDAAAAGJhbnJ4MWwx
+ LmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAAAHQzM2VjeHI0LmJpaQwAAABp
+ bHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZiLnluZgwAAABvMjJjYmV2bS5j
+ bGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABnM3dnMmJ0aS4yd2MMAAAAMWNv
+ NWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55bW4MAAAAMm95ZWVpajEuMXVs
+ DAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1eGJhZncubHp6DAAAADFwdDEy
+ ZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkzDAAAAGlua2kxbXB3LmhkMgwA
+ AABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1czR0Lnd2bwwAAAB5enVoaGdw
+ NS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwAAABta2JobmJyZS51djUMAAAA
+ eWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVnZC50MXkMAAAAZnZhbXQycWou
+ MWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAAYnpkbGhhMTEuczJyDAAAADVj
+ MWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEuemZtDAAAAG9kdzEwZ3RsLmFx
+ NAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBhY21pcjJnLnBkNAwAAABvbGdo
+ M2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVocAwAAAB0emt1bG5jaS5ndGcM
+ AAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVoYmNlci40d2QMAAAAMnFwcDNu
+ b2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkMAAAAemNlc2JuZW4uM3ZyDAAA
+ ADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9rZGEuM21zDAAAAHc1aGxwYXg1
+ Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAAAHNycjV2a2liLjN0NQwAAAB2
+ cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4LjAybQwAAABnMGgxZ3d5aC4y
+ NDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0c3Ayd3J2My40bzIMAAAAcXE1
+ Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5zMDQMAAAAZmRxdmdmNG8udGxs
+ DAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVpNXl0NGEuNHVhDAAAAHJmNGti
+ ZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6DAAAADFnYWI1dW1kLnN5ZAwA
+ AABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3aDU0LjVnZAwAAAAxYTIyZXBj
+ cS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwAAABqdmZ1MGRwMC4weXUMAAAA
+ Zmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201ei56dmIMAAAAMHd1d2VobW4u
+ bW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAAaG52cHdyMWUuaTRrDAAAAHNt
+ dG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubnguYmIzDAAAAGRvdmh5MXd4Lmhl
+ YgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVpZTF1dmJtLmxkZgwAAABqenBl
+ dXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlxNAwAAABtZXNsNXRldy40dmYM
+ AAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGhoZWEycy5rbG0MAAAAbnJ3cTVt
+ NWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUMAAAAeHkxZG4xMWkucDBsDAAA
+ AGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3bXcuemsxDAAAAGUxMHhwb2Jx
+ LmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAAAHAya3ZhZGNpLmpkYgwAAAB4
+ cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZqLmFlMwwAAAAxbmNmMmEwbC5s
+ MXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABhczNwcHNmdS5xd2IMAAAAdjBp
+ MXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56bGYMAAAAM3RnbzFnZnAuYnIx
+ DAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGphMnowMjEuNTJpDAAAAHBxdHpo
+ cmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBkDAAAAHgxYWxnZGVuLnd0dgwA
+ AABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpyb3p1LmZqaQwAAABtM20xZGIz
+ di5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwAAABjMnJxemk0bC5kdXIMAAAA
+ MjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2NyYy41d2kMAAAAMmhycWdzM28u
+ amkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAAamcxa2J2Y2cuYXR2DAAAADFq
+ cWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8uMGhtDAAAAHR1cnppcTRvLmpi
+ bgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZqemVlanEzLmsydwwAAABmcG01
+ bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5cAwAAABtMXhnb3oyay50Z3IM
+ AAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVsYWtzdC5wdXEMAAAAeWdvNGJ1
+ MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncMAAAAZGI1dm92cGoudXFzDAAA
+ ADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2YxanljZzMuajB2DAAAAGtiZHIwdzR1
+ LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAAADJjMGZ2c2UzLmt2eQwAAABw
+ ZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0LnU1egwAAAAwbDRkbWhxdC40
+ eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABlaTVjZ3BiMi5qdWEMAAAAZTVv
+ dWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54d28MAAAAdGRybWdoenoudGNi
+ DAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVrbG41MHcuNXM0DAAAAHh4NWx6
+ djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6DAAAADUzbXo1d2dvLnVsbQwA
+ AAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3MnlhLmJzawwAAAB6bzAxNW01
+ aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwAAAA1YjAzNXN5ZC4ybGcMAAAA
+ bHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFhdi52ZWwMAAAAcWRvb2t5eHYu
+ cnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAAc3ZqdW1uNXguNW9rDAAAADJ4
+ amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMueDRjDAAAAHl4amRnYnYwLm9s
+ aAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUydG92MmJ6LjVkaAwAAABrYzNx
+ MWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJnYwwAAABlamFydmxmaS41cDUM
+ AAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVraDB6Yy53MGQMAAAAejNwZm5h
+ eHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEMAAAANXB0dDV5MzQuNWhiDAAA
+ AGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBzamwuamQzDAAAADAzbGVnZHRv
+ Lmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAAAGJnaGJoa2VlLnRpcwwAAABy
+ azBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJuLnVwZwwAAABiZzJremkwZS53
+ cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABvYjFwMzUxbi54bWwMAAAAMGh1
+ a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5razAMAAAAd2pwYTFjMnIudmpx
+ DAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdhZGJpd2EuZnN0DAAAAGJ2cmdk
+ M2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wxDAAAAGFyZHBqbDNoLmJvYwwA
+ AAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41cXlzLnpwcwwAAABhNGVjZ3Zi
+ Yi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwAAAA0dHp0ZWRtbC54ZXcMAAAA
+ bXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5xYi5qcGUMAAAAc2g1dmdrM3Au
+ aHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAANWhmZ2NyanYuanJjDAAAAGlm
+ bGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUubHlpDAAAAHJ6aXc1MnViLmM0
+ ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVwdTF3aXN4LnhvaQwAAABoaGd4
+ ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRjMQwAAAB0cHNrdnJyMS5iczAM
+ AAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0ZmZwby50ZjQMAAAAdHM1c2N5
+ c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEMAAAAenZjMTMwZ3UuYjBpDAAA
+ AHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294NGgubWxqDAAAAHMyZ2JjNXBq
+ LnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAAAG1paHd2NWxhLmFmZwwAAABk
+ dGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBsLjFhaAwAAABzYmhia3Zhcy5q
+ Mm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABrZ2dwZzVzZS5nYWgMAAAAbTRj
+ aTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41YTAMAAAAc2Zka2VsbW0ub3Ry
+ DAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hhb2FhbzUuZjJ4DAAAAG40c3Jk
+ Zmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBzDAAAAGFkMGQ1dHJoLm0xdgwA
+ AAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2YnduMjAxLnIzNQwAAABveW5xaHd2
+ YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwAAABnY2FvZG1iYS56M3MMAAAA
+ andxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEwdS5peW0MAAAAM212NGw0NTEu
+ aGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAAdTNmZjVkdmIuZHozDAAAADVw
+ NWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24udjBhDAAAAGx3eW40d29jLmQy
+ ZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBheHpqbTRwLjJycQwAAABibXR1
+ eTBsaS4yZ2UVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpz
+ FgAW0A8YDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5m
+ aGoMAAAAZG5zdGNwbHYuZWRrDAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJl
+ ZXpmdGwubXEzDAAAAGdmdXg0MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2ty
+ DAAAAGV1emQxYjQxLmJxMgwAAAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tm
+ aXNkLnFqNQwAAAB2ZmtpbGsydS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwA
+ AABhc2hvYXZvMS5vamYMAAAAdWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1
+ cy5wcDIMAAAAa3d3MTFwMmEuZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAA
+ aTFiYnUyd2IuZGpqDAAAADJ5dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20u
+ bDQzDAAAAGFtcnRlMGxhLjJ0cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5
+ aGRjdnZsLnhieAwAAAB4ZDR3MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtv
+ cgwAAABzNHBtdTI0dC5ia3AMAAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4
+ d3dmNC5jMmsMAAAAMWpwMmlsd3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0M
+ AAAAcnhlbnNva3UuamlmDAAAAGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNi
+ YXAubjJ4DAAAADVqd3Yyc2M1LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAA
+ ADQzb3N5cjVuLmpzaQwAAAB1NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZy
+ LmlhZwwAAABleHJ0Z2xhMS4xdTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAABy
+ Z3BkYWx2dy5kaXgMAAAANW1pb2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5z
+ dW4MAAAAaHVobGZpdTMubG5qDAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNt
+ ejVvNW0ueXVtDAAAAHN5ZGJqcG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRm
+ DAAAAG8zdHB2cmJkLmtncAwAAABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2Np
+ YWd6LmF1ZAwAAABwdWN5bWFldi5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwA
+ AAB3ZHRkcXRnYy5oNXAMAAAAY2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJp
+ YS40amwMAAAAMmUzeWliNXkub294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAA
+ aXdramt2djQudWcyDAAAAGh4aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEu
+ djUzDAAAAHBzNHZqdHhwLnNjNAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRo
+ NG93YWFiLmh5cAwAAABiejR0M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9j
+ cAwAAAB6c2hjMXAxeC5yY2wMAAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5m
+ ZGJveS5mdmEMAAAAdnp6MDJwYWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUM
+ AAAAYW1taWp6bjAuYXMxDAAAAGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBx
+ YWYuNDNzDAAAAHdybXpvaTFuLm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAA
+ AGRkbjNmaXF0LmR6YwwAAABvdXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBz
+ LmJzYgwAAABmbWZ4cnRsZS5jMXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2
+ Z3l3bmt2Zi5hNHMMAAAAY2lueG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4x
+ YmsMAAAAYTRzZDU0aW0ueWIzDAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFj
+ NXUzeHouNW5pDAAAAGlxYWYweHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90
+ DAAAADFvY2FnM2Y1LnBxbQwAAAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3Rm
+ amdsLmg0cAwAAAB1M2hyMGFnNC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwA
+ AAB1cjR4YjFtcC56dmUMAAAAMjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZk
+ NC53NGwMAAAAa25sYXRpYWcueTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAA
+ bGVyeWt1dWUuYnl4DAAAAG9ueDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQu
+ cG95DAAAAHkyc2FtZTR4LmZxcwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1z
+ cmt0ejNoLnJuaAwAAAB1YjR1dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZl
+ eAwAAAB4aHExcTVrbC5ydDEMAAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJj
+ cHI1ZC5hc24MAAAAMXp5MzB6M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYM
+ AAAAdmhreTVrMGkuYm9pDAAAAG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtl
+ MTUuMzJlDAAAAHdtbXBobjNwLjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAA
+ AGwzbmdsYXQyLjIzeAwAAAByNGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRn
+ LmVvYwwAAAB6MDFjMm55ei55ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABx
+ cjNjbXluNS5vcGUMAAAAbTVjdmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5z
+ ZjIMAAAAbWJ3Z2xiNTQuZWRiDAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2Vj
+ Ym5yankuMXdpDAAAADUydWFsaGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2Jw
+ DAAAAGNjNTJhdmh1LnAxZQwAAABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tv
+ aWN0LnZ3YgwAAAB5dHRhaHdieS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwA
+ AABleGZoeWIzby4ya3oMAAAANTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRt
+ ei4wcDAMAAAAZm9iZXcwbHgubnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAA
+ aXVsM2d6eGouem9tDAAAAHY0MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAu
+ MjB2DAAAAGhkb3UwbTBpLnlvdwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwy
+ cHp1MXBrLnBnbAwAAABjMWhvcXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRs
+ egwAAABkZ2l1ZXlmbS5taXMMAAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXox
+ dm5kci5uNHAMAAAAdGFwdnB0aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkM
+ AAAAMDIwbG0xMGgud3dlDAAAAGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4
+ dHUubnAxDAAAADNjbGtrdmQyLnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAA
+ AGpvZXJnd3cyLm5mMgwAAAB2MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1
+ LmdmcwwAAAB3M2FrbGVxdS52Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABj
+ cmFmMGYwbC5icWQMAAAAcHBlZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5p
+ YW8MAAAAbWQ1cXRwbXcub3ptDAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4
+ ZXZsdXIuZjBlDAAAADVoZ3p1c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMx
+ DAAAAHZveHV1b2ZxLm1jcQwAAAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNv
+ aW1uLnZsdgwAAABlMGQ0NGo0ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwA
+ AABheWFtY2RicS5zMHkMAAAAYnh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdj
+ cS5sMzEMAAAAaG5mbzRwd2IucjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAA
+ b3pmNXIza2Eudnh2DAAAAGR6dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXgu
+ NGNlDAAAAHVtdDAwcXZyLjJmbwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRk
+ eXp2bnFkLmNtcgwAAABhbXIyZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFi
+ ZQwAAAAwMWVid2p0bi53eXkMAAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6
+ MXN1Yi4wb2YMAAAAa3RsbXh4ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gM
+ AAAAMjFuNWl1bm4ubzFiDAAAAHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2Nk
+ cGkucHphDAAAAG53dnRjcWIwLmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAA
+ AHJwbnZuenpyLm40cgwAAABua3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1
+ LmpkMgwAAAB1a2RsMzAwZC5zb3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABi
+ c2tqemJnYy41ajQMAAAANDNkeml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54
+ YmsMAAAAaWloZWVmbWYudnFtDAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0
+ NGVoNDMuZzV4DAAAAGp6cGZtM21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBp
+ DAAAAGxyYzJnNHNrLnJudwwAAAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJu
+ and6LmJ4eQwAAABwdGZieWxjYy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwA
+ AAByajJyZGhhei5za3QMAAAAY3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBu
+ by55eTIMAAAAYWh1cHFwMHoud2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAA
+ MGZncXVya3MuY2RhDAAAAHh3MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wu
+ Z2wzDAAAAHlmcnRtamViLnhzcwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZq
+ b3NnMDI0LmswdwwAAABxcGx0cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6Lmxk
+ bQwAAABlMHF1dm5qYi5rbGYMAAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2Fr
+ Znk0dy4xeWMMAAAAZ3N2bDA1bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEM
+ AAAANG5xMnBvY2YuM2RwDAAAAHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFj
+ NGoud3l0DAAAAG9waWt3aWpoLnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAA
+ AGF5NW5rMTN4LnJmdwwAAABlbDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVl
+ LmU1awwAAABoZGt3NWdnai5hZm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAy
+ MnlodDV0cy40eHEMAAAAbXptMGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5m
+ ejIMAAAAdGkxM2M1MW8uNXpsDAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenps
+ Z3l4YTUuNHlhDAAAADVjNTI1MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNh
+ DAAAAG55dmVvc3gwLndvcAwAAABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1
+ azEzLmxwZQwAAABzZnFjNXJ3eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwA
+ AAB4MWZodmlrby5wcnoMAAAAczM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1
+ bS5iZXEMAAAAdHZyaDRuM2wua3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAA
+ bWpscWlrc2wuYml1DAAAAHgzcWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWou
+ dGc1DAAAADUxcTRxa2duLmw1dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1r
+ bTJ0a2h0LnhheQwAAAA0bWJxbjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndq
+ cAwAAABmenlyNXlmbS5wZG8MAAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0
+ em90NC5yaG0MAAAAbjNqcDV2Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwM
+ AAAAcmRvMmxxYnEueXFsDAAAAGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYx
+ bWsucXdkDAAAAGp2bnRvZWY1LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAA
+ AGZ5NGFnMGgzLmR6ZAwAAABxZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4
+ LmgwawwAAAA0Mm52c2k1dS4yZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3
+ M3ZweGxyYy4yM3kMAAAAaGFpY2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5o
+ cmwMAAAAc3k0YnhsdnIuYm14DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3Bv
+ Y3V3ZHUubjVwDAAAAGt2MHB2dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3
+ DAAAAHdiZ29md3phLmZxZAwAAABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBk
+ c3BhLjUzYgwAAABiaXBiaTVjdi5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwA
+ AAB5eWFseW50Mi50bWEMAAAAZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3di
+ Yy5udGcMAAAAMnMya3Bjc2MucW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAA
+ d3hmMjVlZHAuaDBzDAAAAGUyd3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcu
+ YTRsDAAAADJncGFua2d4LnlxegwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRp
+ d3Brb3MzLnp4ZgwAAAAwbmI1Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnlt
+ egwAAABzem9yc2tlcS54cjQMAAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRh
+ ZG51ci5uc2cMAAAAZDJnNWdkMjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsM
+ AAAAbDBtbXp2bTMuZGd5DAAAAGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20z
+ a3MueG5oDAAAAHV6bHdlbGo0LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAA
+ ADBha2Roam5rLmF3bAwAAABsbHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJo
+ LnRxcQwAAAAyc2l2YW5iaS5kaHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2
+ b3pnZXJmai5yd3YMAAAAY2pyMXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5q
+ NGIMAAAAYWF1dHN2YnYucWRuDAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJp
+ YzF1YWQuMHJsDAAAAGp0YjVzZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1l
+ DAAAAGR4cG4xa210LmtkbgwAAABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJh
+ ejFvLnlqaQwAAAB1a2Z3aTNlYy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwA
+ AAB5am1xaXlycC5ld2sMAAAAZ3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJw
+ aS5qZHAMAAAANXVsdGpweWQuc3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAA
+ MXdhZ2pyencueXRxDAAAAHltY3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEu
+ aGxlDAAAAHN1eG9vanFmLmxudQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEy
+ dTN1cmh5Lm5zeQwAAAAxeTJmbHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJn
+ egwAAABzeXRkd2J2aS5jd3oMAAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1
+ MTF6eC5jY2UMAAAAYnc1aW1pYjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUM
+ AAAAengzbWt0bzQuNXV5DAAAAGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVk
+ aDQudGJqDAAAADUwcmdoYmhiLnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAA
+ ADQxYWQxdWFlLmRhdQwAAABkZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6
+ LnZ6YgwAAABzZDF5cTU1Yy41M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABk
+ am4yZXczMC5lbmIMAAAAc3UwemdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40
+ cHQMAAAAY2NjeGlicG0ud2JiDAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0
+ bTJnYXoueXlmDAAAADN4aWJpY3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUy
+ DAAAAGFmYm1peXU0Lnl6bwwAAAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNt
+ MTJrLmJkdAwAAABzMWVpa3hvdy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwA
+ AAB0ZnMxZmxrMy51ZGwMAAAAZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVx
+ Mi5yNWoMAAAAajBibmhleG8uYWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAA
+ MHRweTNjdnQuaDNiDAAAAHlrMHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQu
+ NGZtDAAAAGxyNDB0amIwLm8ycwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHht
+ enhibnJnLmY1egwAAAB6bnFxbWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxh
+ agwAAABzNGJ4ejBndy51bTMMAAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHEx
+ anlseC55cXkMAAAAMGV5Y3hmd2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMM
+ AAAAaWRmazE0aTUueG5tDAAAAGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJj
+ ejIucXhtDAAAAGRoeXRzdXhlLjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAA
+ AHptcGVvbHkzLjR0MwwAAAB6aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1
+ LnpvcwwAAAB4cW5icmkwdC5tbnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABj
+ M3Qzd3IzMy5qY3gMAAAANXhqa2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5l
+ bnoMAAAAMnZseXYyYzUucWp1DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2th
+ Y25xdHkuMnptDAAAAHcxdGs0cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRw
+ DAAAAHd1cmcyb2IzLjVjMwwAAAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20z
+ Y24xLmNqegwAAABtYWZhdnRkYi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwA
+ AAAxc3Jha291MS5rMG8MAAAAYWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3
+ by5hdnEMAAAAYTRkMWZleTIuNXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAA
+ aWcxNTFwZngua29tDAAAAHZ6cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIu
+ dmZvDAAAAHpxbXB1aTRtLjNqMwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8w
+ azQxcTFtLmwydgwAAAA1Ymp5dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZp
+ NAwAAAA0ZGMzcnNteC4zMHEMAAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhh
+ ZXFsMy5zMG4MAAAAZHlweWJ0cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIM
+ AAAAd2Qyc29zcHcuMWVpDAAAADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRx
+ MWguZHpuDAAAAGpjMmJ4aHRuLmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAA
+ ADMyMjV2cXpoLms0YwwAAABrb2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFy
+ LjEyZgwAAAB5cnBucDJnZy5pNGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABv
+ dmdvaWs1cS54c3MMAAAAaW5xcHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5x
+ b3UMAAAAeXBicndkd3YubWFiDAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1
+ cTNzb3IubGRiDAAAAHFyeXJhMWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhm
+ DAAAAGZ4cTVmZHplLnJ1bwwAAAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlw
+ cmVoLnVueAwAAAB5c2ZocWpqdS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwA
+ AABsNXV2YTNoaC5oNHAMAAAAcDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFh
+ aC5hdW4MAAAAaHdwMDRjZnUubWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAA
+ cnR3c2prd3MubzF3DAAAADNjeXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUu
+ eGF0DAAAADM1ZmNndWpwLjNsdAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBn
+ a29pNHZwLmI1dwwAAAAyZHliZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9y
+ ZgwAAAAxeGJxMjBudi5oM2YMAAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0
+ eDFiay53MDAMAAAAbDVmZnhkYnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsM
+ AAAAMWZ0bXhrYzMubGF0DAAAAHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkx
+ c2suMHAzDAAAAGJhbnJ4MWwxLmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAA
+ AHQzM2VjeHI0LmJpaQwAAABpbHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZi
+ LnluZgwAAABvMjJjYmV2bS5jbGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABn
+ M3dnMmJ0aS4yd2MMAAAAMWNvNWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55
+ bW4MAAAAMm95ZWVpajEuMXVsDAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1
+ eGJhZncubHp6DAAAADFwdDEyZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkz
+ DAAAAGlua2kxbXB3LmhkMgwAAABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1
+ czR0Lnd2bwwAAAB5enVoaGdwNS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwA
+ AABta2JobmJyZS51djUMAAAAeWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVn
+ ZC50MXkMAAAAZnZhbXQycWouMWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAA
+ YnpkbGhhMTEuczJyDAAAADVjMWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEu
+ emZtDAAAAG9kdzEwZ3RsLmFxNAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBh
+ Y21pcjJnLnBkNAwAAABvbGdoM2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVo
+ cAwAAAB0emt1bG5jaS5ndGcMAAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVo
+ YmNlci40d2QMAAAAMnFwcDNub2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkM
+ AAAAemNlc2JuZW4uM3ZyDAAAADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9r
+ ZGEuM21zDAAAAHc1aGxwYXg1Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAA
+ AHNycjV2a2liLjN0NQwAAAB2cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4
+ LjAybQwAAABnMGgxZ3d5aC4yNDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0
+ c3Ayd3J2My40bzIMAAAAcXE1Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5z
+ MDQMAAAAZmRxdmdmNG8udGxsDAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVp
+ NXl0NGEuNHVhDAAAAHJmNGtiZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6
+ DAAAADFnYWI1dW1kLnN5ZAwAAABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3
+ aDU0LjVnZAwAAAAxYTIyZXBjcS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwA
+ AABqdmZ1MGRwMC4weXUMAAAAZmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201
+ ei56dmIMAAAAMHd1d2VobW4ubW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAA
+ aG52cHdyMWUuaTRrDAAAAHNtdG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubngu
+ YmIzDAAAAGRvdmh5MXd4LmhlYgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVp
+ ZTF1dmJtLmxkZgwAAABqenBldXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlx
+ NAwAAABtZXNsNXRldy40dmYMAAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGho
+ ZWEycy5rbG0MAAAAbnJ3cTVtNWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUM
+ AAAAeHkxZG4xMWkucDBsDAAAAGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3
+ bXcuemsxDAAAAGUxMHhwb2JxLmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAA
+ AHAya3ZhZGNpLmpkYgwAAAB4cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZq
+ LmFlMwwAAAAxbmNmMmEwbC5sMXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABh
+ czNwcHNmdS5xd2IMAAAAdjBpMXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56
+ bGYMAAAAM3RnbzFnZnAuYnIxDAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGph
+ MnowMjEuNTJpDAAAAHBxdHpocmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBk
+ DAAAAHgxYWxnZGVuLnd0dgwAAABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpy
+ b3p1LmZqaQwAAABtM20xZGIzdi5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwA
+ AABjMnJxemk0bC5kdXIMAAAAMjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2Ny
+ Yy41d2kMAAAAMmhycWdzM28uamkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAA
+ amcxa2J2Y2cuYXR2DAAAADFqcWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8u
+ MGhtDAAAAHR1cnppcTRvLmpibgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZq
+ emVlanEzLmsydwwAAABmcG01bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5
+ cAwAAABtMXhnb3oyay50Z3IMAAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVs
+ YWtzdC5wdXEMAAAAeWdvNGJ1MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncM
+ AAAAZGI1dm92cGoudXFzDAAAADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2Yxanlj
+ ZzMuajB2DAAAAGtiZHIwdzR1LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAA
+ ADJjMGZ2c2UzLmt2eQwAAABwZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0
+ LnU1egwAAAAwbDRkbWhxdC40eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABl
+ aTVjZ3BiMi5qdWEMAAAAZTVvdWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54
+ d28MAAAAdGRybWdoenoudGNiDAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVr
+ bG41MHcuNXM0DAAAAHh4NWx6djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6
+ DAAAADUzbXo1d2dvLnVsbQwAAAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3
+ MnlhLmJzawwAAAB6bzAxNW01aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwA
+ AAA1YjAzNXN5ZC4ybGcMAAAAbHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFh
+ di52ZWwMAAAAcWRvb2t5eHYucnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAA
+ c3ZqdW1uNXguNW9rDAAAADJ4amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMu
+ eDRjDAAAAHl4amRnYnYwLm9saAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUy
+ dG92MmJ6LjVkaAwAAABrYzNxMWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJn
+ YwwAAABlamFydmxmaS41cDUMAAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVr
+ aDB6Yy53MGQMAAAAejNwZm5heHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEM
+ AAAANXB0dDV5MzQuNWhiDAAAAGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBz
+ amwuamQzDAAAADAzbGVnZHRvLmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAA
+ AGJnaGJoa2VlLnRpcwwAAAByazBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJu
+ LnVwZwwAAABiZzJremkwZS53cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABv
+ YjFwMzUxbi54bWwMAAAAMGh1a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5r
+ azAMAAAAd2pwYTFjMnIudmpxDAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdh
+ ZGJpd2EuZnN0DAAAAGJ2cmdkM2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wx
+ DAAAAGFyZHBqbDNoLmJvYwwAAAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41
+ cXlzLnpwcwwAAABhNGVjZ3ZiYi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwA
+ AAA0dHp0ZWRtbC54ZXcMAAAAbXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5x
+ Yi5qcGUMAAAAc2g1dmdrM3AuaHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAA
+ NWhmZ2NyanYuanJjDAAAAGlmbGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUu
+ bHlpDAAAAHJ6aXc1MnViLmM0ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVw
+ dTF3aXN4LnhvaQwAAABoaGd4ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRj
+ MQwAAAB0cHNrdnJyMS5iczAMAAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0
+ ZmZwby50ZjQMAAAAdHM1c2N5c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEM
+ AAAAenZjMTMwZ3UuYjBpDAAAAHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294
+ NGgubWxqDAAAAHMyZ2JjNXBqLnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAA
+ AG1paHd2NWxhLmFmZwwAAABkdGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBs
+ LjFhaAwAAABzYmhia3Zhcy5qMm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABr
+ Z2dwZzVzZS5nYWgMAAAAbTRjaTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41
+ YTAMAAAAc2Zka2VsbW0ub3RyDAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hh
+ b2FhbzUuZjJ4DAAAAG40c3JkZmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBz
+ DAAAAGFkMGQ1dHJoLm0xdgwAAAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2Yndu
+ MjAxLnIzNQwAAABveW5xaHd2YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwA
+ AABnY2FvZG1iYS56M3MMAAAAandxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEw
+ dS5peW0MAAAAM212NGw0NTEuaGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAA
+ dTNmZjVkdmIuZHozDAAAADVwNWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24u
+ djBhDAAAAGx3eW40d29jLmQyZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBh
+ eHpqbTRwLjJycQwAAABibXR1eTBsaS4yZ2UVAhlMSBVwYXJxdWV0LWRvdG5ldC1zY2hlbWEVBgAV
+ DCUCGAJpZCUAABUMJQIYB3N0cmluZzElAAAVDCUCGAdzdHJpbmcyJQAAFqAfGSwZPCYIHBUMGTUG
+ CAAZGAJpZBUAFtAPFrhsFrhsJgg8GAM5OTkYATAWABbQDxgDOTk5GAEwAAAAJsBsHBUMGTUGCAAZ
+ GAdzdHJpbmcxFQAW0A8WuPsBFrj7ASbAbDwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW
+ 0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAJvjnAhwVDBk1BggAGRgHc3RyaW5nMhUA
+ FtAPFrj7ARa4+wEm+OcCPBgMenpxMGtmeTQudmJuGAwwMXd3eWU0Zy5wZnMWABbQDxgMenpxMGtm
+ eTQudmJuGAwwMXd3eWU0Zy5wZnMAAAAWqOMEFtAPABk8JrDjBBwVDBk1BggAGRgCaWQVABbQDxb0
+ fRb0fSaw4wQ8GAQxOTk5GAQxMDAwFgAW0A8YBDE5OTkYBDEwMDAAAAAmpOEFHBUMGTUGCAAZGAdz
+ dHJpbmcxFQAW0A8WuPsBFrj7ASak4QU8GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cxYAFtAP
+ GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cwAAACbc3AccFQwZNQYIABkYB3N0cmluZzIVABbQ
+ Dxa4+wEWuPsBJtzcBzwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1
+ LjR5YRgMMDExY3FhbjQueXpzAAAAFuT0BBbQDwAoTFBhcnF1ZXQuTmV0IHZlcnNpb24gMy41LjMg
+ KGJ1aWxkICcwNTc0NTFiMzc2ZmE3ZDM1ODFmMmQxODAxZmIwOTY1YWZiZWFhMGMyJykAxQIAAFBB
+ UjE=
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '80087'
+ Content-Type:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 6137edf4-996d-11eb-b015-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 19:54:22 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PATCH
+ uri: https://storagename.dfs.core.windows.net/utqqcontainerb38317df/csvfileb38317df?action=append&position=0
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 19:54:21 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - 1577b504-101f-0007-367a-2d398a000000
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ If-Match:
+ - '"0x8D8FB9145645382"'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 615e1394-996d-11eb-915d-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 19:54:22 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PATCH
+ uri: https://storagename.dfs.core.windows.net/utqqcontainerb38317df/csvfileb38317df?action=flush&position=80087&close=true
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 19:54:22 GMT
+ ETag:
+ - '"0x8D8FB9145A3D919"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 19:54:23 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - 1577b505-101f-0007-377a-2d398a000000
+ x-ms-request-server-encrypted:
+ - 'false'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: '
+
+ SQLselect * from blobstorage
+ where id < 1;parquet
+ '
+ headers:
+ Accept:
+ - application/xml
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '293'
+ Content-Type:
+ - application/xml
+ User-Agent:
+ - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 617433b5-996d-11eb-a99a-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 19:54:23 GMT
+ x-ms-encryption-algorithm:
+ - AES256
+ x-ms-version:
+ - '2020-08-04'
+ method: POST
+ uri: https://storagename.blob.core.windows.net/utqqcontainerb38317df/csvfileb38317df?comp=query
+ response:
+ body:
+ string: !!binary |
+ T2JqAQIWYXZyby5zY2hlbWHOHlsKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAgIm5hbWUi
+ OiAiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLnJlc3VsdERh
+ dGEiLAogICAgImRvYyI6ICJIb2xkcyByZXN1bHQgZGF0YSBpbiB0aGUgZm9ybWF0IHNwZWNpZmll
+ ZCBmb3IgdGhpcyBxdWVyeSAoQ1NWLCBKU09OLCBldGMuKS4iLAogICAgImZpZWxkcyI6IFsKICAg
+ ICAgewogICAgICAgICJuYW1lIjogImRhdGEiLAogICAgICAgICJ0eXBlIjogImJ5dGVzIgogICAg
+ ICB9CiAgICBdCiAgfSwKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAgIm5hbWUiOiAiY29t
+ Lm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVycm9yIiwKICAgICJk
+ b2MiOiAiQW4gZXJyb3IgdGhhdCBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBxdWVyeS4i
+ LAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImZhdGFsIiwKICAgICAg
+ ICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAiZG9jIjogIklmIHRydWUsIHRoaXMgZXJyb3Ig
+ cHJldmVudHMgZnVydGhlciBxdWVyeSBwcm9jZXNzaW5nLiAgTW9yZSByZXN1bHQgZGF0YSBtYXkg
+ YmUgcmV0dXJuZWQsIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhbGwgb2YgdGhlIG9y
+ aWdpbmFsIGRhdGEgd2lsbCBiZSBwcm9jZXNzZWQuICBJZiBmYWxzZSwgdGhpcyBlcnJvciBkb2Vz
+ IG5vdCBwcmV2ZW50IGZ1cnRoZXIgcXVlcnkgcHJvY2Vzc2luZy4iCiAgICAgIH0sCiAgICAgIHsK
+ ICAgICAgICAibmFtZSI6ICJuYW1lIiwKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAg
+ ICJkb2MiOiAiVGhlIG5hbWUgb2YgdGhlIGVycm9yIgogICAgICB9LAogICAgICB7CiAgICAgICAg
+ Im5hbWUiOiAiZGVzY3JpcHRpb24iLAogICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAg
+ ImRvYyI6ICJBIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvciIKICAgICAgfSwKICAgICAgewogICAg
+ ICAgICJuYW1lIjogInBvc2l0aW9uIiwKICAgICAgICAidHlwZSI6ICJsb25nIiwKICAgICAgICAi
+ ZG9jIjogIlRoZSByZWNvcmQgb2Zmc2V0IGluIHRoZSBibG9iIGF0IHdoaWNoIHRoZSBlcnJvciBv
+ Y2N1cnJlZCIKICAgICAgfQogICAgXQogIH0sCiAgewogICAgInR5cGUiOiAicmVjb3JkIiwKICAg
+ ICJuYW1lIjogImNvbS5taWNyb3NvZnQuYXp1cmUuc3RvcmFnZS5xdWVyeUJsb2JDb250ZW50cy5w
+ cm9ncmVzcyIsCiAgICAiZG9jIjogIkluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiB0
+ aGUgcXVlcnkiLAogICAgImZpZWxkcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImJ5dGVz
+ U2Nhbm5lZCIsCiAgICAgICAgInR5cGUiOiAibG9uZyIsCiAgICAgICAgImRvYyI6ICJUaGUgbnVt
+ YmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHNjYW5uZWQiCiAgICAgIH0sCiAgICAgIHsKICAg
+ ICAgICAibmFtZSI6ICJ0b3RhbEJ5dGVzIiwKICAgICAgICAidHlwZSI6ICJsb25nIiwKICAgICAg
+ ICAiZG9jIjogIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgc2Nhbm5lZCBpbiB0aGlz
+ IHF1ZXJ5IgogICAgICB9CiAgICBdCiAgfSwKICB7CiAgICAidHlwZSI6ICJyZWNvcmQiLAogICAg
+ Im5hbWUiOiAiY29tLm1pY3Jvc29mdC5henVyZS5zdG9yYWdlLnF1ZXJ5QmxvYkNvbnRlbnRzLmVu
+ ZCIsCiAgICAiZG9jIjogIlNlbnQgYXMgdGhlIGZpbmFsIG1lc3NhZ2Ugb2YgdGhlIHJlc3BvbnNl
+ LCBpbmRpY2F0aW5nIHRoYXQgYWxsIHJlc3VsdHMgaGF2ZSBiZWVuIHNlbnQuIiwKICAgICJmaWVs
+ ZHMiOiBbCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJ0b3RhbEJ5dGVzIiwKICAgICAgICAidHlw
+ ZSI6ICJsb25nIiwKICAgICAgICAiZG9jIjogIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgc2Nh
+ bm5lZCBpbiB0aGlzIHF1ZXJ5IgogICAgICB9CiAgICBdCiAgfQpdCgDTcqc2iYsPRaCt87a9W16y
+ AjwAODAsbWRpZmp0NTUuZWEzLG1kaWZqdDU1LmVhMwrTcqc2iYsPRaCt87a9W16yAg4Ewu4EruMJ
+ 03KnNomLD0WgrfO2vVtesgIIBq7jCdNypzaJiw9FoK3ztr1bXrI=
+ headers:
+ Accept-Ranges:
+ - bytes
+ Content-Type:
+ - avro/binary
+ Date:
+ - Fri, 09 Apr 2021 19:54:23 GMT
+ ETag:
+ - '"0x8D8FB9145A3D919"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 19:54:23 GMT
+ Server:
+ - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
+ Transfer-Encoding:
+ - chunked
+ x-ms-blob-type:
+ - BlockBlob
+ x-ms-creation-time:
+ - Fri, 09 Apr 2021 04:03:15 GMT
+ x-ms-lease-state:
+ - available
+ x-ms-lease-status:
+ - unlocked
+ x-ms-request-id:
+ - 6f7f6af3-e01e-0012-6f7a-2dfb13000000
+ x-ms-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-08-04'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml
new file mode 100644
index 000000000000..c408d32ecffa
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_quick_query.test_quick_query_output_in_parquet_format.yaml
@@ -0,0 +1,1542 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 66737680-996d-11eb-a17f-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 19:54:31 GMT
+ x-ms-properties:
+ - ''
+ x-ms-version:
+ - '2020-06-12'
+ method: PUT
+ uri: https://storagename.dfs.core.windows.net/utqqcontainercdb31860/csvfilecdb31860?resource=file
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 19:54:31 GMT
+ ETag:
+ - '"0x8D8FB914AE5DEAD"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 19:54:31 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - 1b04ce30-501f-000b-7c7a-2dd77b000000
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 201
+ message: Created
+- request:
+ body: !!binary |
+ UEFSMRUAFeJrFeJrLBXQDxUAFQYVBhwYAzk5ORgBMBYAFtAPGAM5OTkYATAAAAADAAAA0A8BAQAA
+ ADABAAAAMQEAAAAyAQAAADMBAAAANAEAAAA1AQAAADYBAAAANwEAAAA4AQAAADkCAAAAMTACAAAA
+ MTECAAAAMTICAAAAMTMCAAAAMTQCAAAAMTUCAAAAMTYCAAAAMTcCAAAAMTgCAAAAMTkCAAAAMjAC
+ AAAAMjECAAAAMjICAAAAMjMCAAAAMjQCAAAAMjUCAAAAMjYCAAAAMjcCAAAAMjgCAAAAMjkCAAAA
+ MzACAAAAMzECAAAAMzICAAAAMzMCAAAAMzQCAAAAMzUCAAAAMzYCAAAAMzcCAAAAMzgCAAAAMzkC
+ AAAANDACAAAANDECAAAANDICAAAANDMCAAAANDQCAAAANDUCAAAANDYCAAAANDcCAAAANDgCAAAA
+ NDkCAAAANTACAAAANTECAAAANTICAAAANTMCAAAANTQCAAAANTUCAAAANTYCAAAANTcCAAAANTgC
+ AAAANTkCAAAANjACAAAANjECAAAANjICAAAANjMCAAAANjQCAAAANjUCAAAANjYCAAAANjcCAAAA
+ NjgCAAAANjkCAAAANzACAAAANzECAAAANzICAAAANzMCAAAANzQCAAAANzUCAAAANzYCAAAANzcC
+ AAAANzgCAAAANzkCAAAAODACAAAAODECAAAAODICAAAAODMCAAAAODQCAAAAODUCAAAAODYCAAAA
+ ODcCAAAAODgCAAAAODkCAAAAOTACAAAAOTECAAAAOTICAAAAOTMCAAAAOTQCAAAAOTUCAAAAOTYC
+ AAAAOTcCAAAAOTgCAAAAOTkDAAAAMTAwAwAAADEwMQMAAAAxMDIDAAAAMTAzAwAAADEwNAMAAAAx
+ MDUDAAAAMTA2AwAAADEwNwMAAAAxMDgDAAAAMTA5AwAAADExMAMAAAAxMTEDAAAAMTEyAwAAADEx
+ MwMAAAAxMTQDAAAAMTE1AwAAADExNgMAAAAxMTcDAAAAMTE4AwAAADExOQMAAAAxMjADAAAAMTIx
+ AwAAADEyMgMAAAAxMjMDAAAAMTI0AwAAADEyNQMAAAAxMjYDAAAAMTI3AwAAADEyOAMAAAAxMjkD
+ AAAAMTMwAwAAADEzMQMAAAAxMzIDAAAAMTMzAwAAADEzNAMAAAAxMzUDAAAAMTM2AwAAADEzNwMA
+ AAAxMzgDAAAAMTM5AwAAADE0MAMAAAAxNDEDAAAAMTQyAwAAADE0MwMAAAAxNDQDAAAAMTQ1AwAA
+ ADE0NgMAAAAxNDcDAAAAMTQ4AwAAADE0OQMAAAAxNTADAAAAMTUxAwAAADE1MgMAAAAxNTMDAAAA
+ MTU0AwAAADE1NQMAAAAxNTYDAAAAMTU3AwAAADE1OAMAAAAxNTkDAAAAMTYwAwAAADE2MQMAAAAx
+ NjIDAAAAMTYzAwAAADE2NAMAAAAxNjUDAAAAMTY2AwAAADE2NwMAAAAxNjgDAAAAMTY5AwAAADE3
+ MAMAAAAxNzEDAAAAMTcyAwAAADE3MwMAAAAxNzQDAAAAMTc1AwAAADE3NgMAAAAxNzcDAAAAMTc4
+ AwAAADE3OQMAAAAxODADAAAAMTgxAwAAADE4MgMAAAAxODMDAAAAMTg0AwAAADE4NQMAAAAxODYD
+ AAAAMTg3AwAAADE4OAMAAAAxODkDAAAAMTkwAwAAADE5MQMAAAAxOTIDAAAAMTkzAwAAADE5NAMA
+ AAAxOTUDAAAAMTk2AwAAADE5NwMAAAAxOTgDAAAAMTk5AwAAADIwMAMAAAAyMDEDAAAAMjAyAwAA
+ ADIwMwMAAAAyMDQDAAAAMjA1AwAAADIwNgMAAAAyMDcDAAAAMjA4AwAAADIwOQMAAAAyMTADAAAA
+ MjExAwAAADIxMgMAAAAyMTMDAAAAMjE0AwAAADIxNQMAAAAyMTYDAAAAMjE3AwAAADIxOAMAAAAy
+ MTkDAAAAMjIwAwAAADIyMQMAAAAyMjIDAAAAMjIzAwAAADIyNAMAAAAyMjUDAAAAMjI2AwAAADIy
+ NwMAAAAyMjgDAAAAMjI5AwAAADIzMAMAAAAyMzEDAAAAMjMyAwAAADIzMwMAAAAyMzQDAAAAMjM1
+ AwAAADIzNgMAAAAyMzcDAAAAMjM4AwAAADIzOQMAAAAyNDADAAAAMjQxAwAAADI0MgMAAAAyNDMD
+ AAAAMjQ0AwAAADI0NQMAAAAyNDYDAAAAMjQ3AwAAADI0OAMAAAAyNDkDAAAAMjUwAwAAADI1MQMA
+ AAAyNTIDAAAAMjUzAwAAADI1NAMAAAAyNTUDAAAAMjU2AwAAADI1NwMAAAAyNTgDAAAAMjU5AwAA
+ ADI2MAMAAAAyNjEDAAAAMjYyAwAAADI2MwMAAAAyNjQDAAAAMjY1AwAAADI2NgMAAAAyNjcDAAAA
+ MjY4AwAAADI2OQMAAAAyNzADAAAAMjcxAwAAADI3MgMAAAAyNzMDAAAAMjc0AwAAADI3NQMAAAAy
+ NzYDAAAAMjc3AwAAADI3OAMAAAAyNzkDAAAAMjgwAwAAADI4MQMAAAAyODIDAAAAMjgzAwAAADI4
+ NAMAAAAyODUDAAAAMjg2AwAAADI4NwMAAAAyODgDAAAAMjg5AwAAADI5MAMAAAAyOTEDAAAAMjky
+ AwAAADI5MwMAAAAyOTQDAAAAMjk1AwAAADI5NgMAAAAyOTcDAAAAMjk4AwAAADI5OQMAAAAzMDAD
+ AAAAMzAxAwAAADMwMgMAAAAzMDMDAAAAMzA0AwAAADMwNQMAAAAzMDYDAAAAMzA3AwAAADMwOAMA
+ AAAzMDkDAAAAMzEwAwAAADMxMQMAAAAzMTIDAAAAMzEzAwAAADMxNAMAAAAzMTUDAAAAMzE2AwAA
+ ADMxNwMAAAAzMTgDAAAAMzE5AwAAADMyMAMAAAAzMjEDAAAAMzIyAwAAADMyMwMAAAAzMjQDAAAA
+ MzI1AwAAADMyNgMAAAAzMjcDAAAAMzI4AwAAADMyOQMAAAAzMzADAAAAMzMxAwAAADMzMgMAAAAz
+ MzMDAAAAMzM0AwAAADMzNQMAAAAzMzYDAAAAMzM3AwAAADMzOAMAAAAzMzkDAAAAMzQwAwAAADM0
+ MQMAAAAzNDIDAAAAMzQzAwAAADM0NAMAAAAzNDUDAAAAMzQ2AwAAADM0NwMAAAAzNDgDAAAAMzQ5
+ AwAAADM1MAMAAAAzNTEDAAAAMzUyAwAAADM1MwMAAAAzNTQDAAAAMzU1AwAAADM1NgMAAAAzNTcD
+ AAAAMzU4AwAAADM1OQMAAAAzNjADAAAAMzYxAwAAADM2MgMAAAAzNjMDAAAAMzY0AwAAADM2NQMA
+ AAAzNjYDAAAAMzY3AwAAADM2OAMAAAAzNjkDAAAAMzcwAwAAADM3MQMAAAAzNzIDAAAAMzczAwAA
+ ADM3NAMAAAAzNzUDAAAAMzc2AwAAADM3NwMAAAAzNzgDAAAAMzc5AwAAADM4MAMAAAAzODEDAAAA
+ MzgyAwAAADM4MwMAAAAzODQDAAAAMzg1AwAAADM4NgMAAAAzODcDAAAAMzg4AwAAADM4OQMAAAAz
+ OTADAAAAMzkxAwAAADM5MgMAAAAzOTMDAAAAMzk0AwAAADM5NQMAAAAzOTYDAAAAMzk3AwAAADM5
+ OAMAAAAzOTkDAAAANDAwAwAAADQwMQMAAAA0MDIDAAAANDAzAwAAADQwNAMAAAA0MDUDAAAANDA2
+ AwAAADQwNwMAAAA0MDgDAAAANDA5AwAAADQxMAMAAAA0MTEDAAAANDEyAwAAADQxMwMAAAA0MTQD
+ AAAANDE1AwAAADQxNgMAAAA0MTcDAAAANDE4AwAAADQxOQMAAAA0MjADAAAANDIxAwAAADQyMgMA
+ AAA0MjMDAAAANDI0AwAAADQyNQMAAAA0MjYDAAAANDI3AwAAADQyOAMAAAA0MjkDAAAANDMwAwAA
+ ADQzMQMAAAA0MzIDAAAANDMzAwAAADQzNAMAAAA0MzUDAAAANDM2AwAAADQzNwMAAAA0MzgDAAAA
+ NDM5AwAAADQ0MAMAAAA0NDEDAAAANDQyAwAAADQ0MwMAAAA0NDQDAAAANDQ1AwAAADQ0NgMAAAA0
+ NDcDAAAANDQ4AwAAADQ0OQMAAAA0NTADAAAANDUxAwAAADQ1MgMAAAA0NTMDAAAANDU0AwAAADQ1
+ NQMAAAA0NTYDAAAANDU3AwAAADQ1OAMAAAA0NTkDAAAANDYwAwAAADQ2MQMAAAA0NjIDAAAANDYz
+ AwAAADQ2NAMAAAA0NjUDAAAANDY2AwAAADQ2NwMAAAA0NjgDAAAANDY5AwAAADQ3MAMAAAA0NzED
+ AAAANDcyAwAAADQ3MwMAAAA0NzQDAAAANDc1AwAAADQ3NgMAAAA0NzcDAAAANDc4AwAAADQ3OQMA
+ AAA0ODADAAAANDgxAwAAADQ4MgMAAAA0ODMDAAAANDg0AwAAADQ4NQMAAAA0ODYDAAAANDg3AwAA
+ ADQ4OAMAAAA0ODkDAAAANDkwAwAAADQ5MQMAAAA0OTIDAAAANDkzAwAAADQ5NAMAAAA0OTUDAAAA
+ NDk2AwAAADQ5NwMAAAA0OTgDAAAANDk5AwAAADUwMAMAAAA1MDEDAAAANTAyAwAAADUwMwMAAAA1
+ MDQDAAAANTA1AwAAADUwNgMAAAA1MDcDAAAANTA4AwAAADUwOQMAAAA1MTADAAAANTExAwAAADUx
+ MgMAAAA1MTMDAAAANTE0AwAAADUxNQMAAAA1MTYDAAAANTE3AwAAADUxOAMAAAA1MTkDAAAANTIw
+ AwAAADUyMQMAAAA1MjIDAAAANTIzAwAAADUyNAMAAAA1MjUDAAAANTI2AwAAADUyNwMAAAA1MjgD
+ AAAANTI5AwAAADUzMAMAAAA1MzEDAAAANTMyAwAAADUzMwMAAAA1MzQDAAAANTM1AwAAADUzNgMA
+ AAA1MzcDAAAANTM4AwAAADUzOQMAAAA1NDADAAAANTQxAwAAADU0MgMAAAA1NDMDAAAANTQ0AwAA
+ ADU0NQMAAAA1NDYDAAAANTQ3AwAAADU0OAMAAAA1NDkDAAAANTUwAwAAADU1MQMAAAA1NTIDAAAA
+ NTUzAwAAADU1NAMAAAA1NTUDAAAANTU2AwAAADU1NwMAAAA1NTgDAAAANTU5AwAAADU2MAMAAAA1
+ NjEDAAAANTYyAwAAADU2MwMAAAA1NjQDAAAANTY1AwAAADU2NgMAAAA1NjcDAAAANTY4AwAAADU2
+ OQMAAAA1NzADAAAANTcxAwAAADU3MgMAAAA1NzMDAAAANTc0AwAAADU3NQMAAAA1NzYDAAAANTc3
+ AwAAADU3OAMAAAA1NzkDAAAANTgwAwAAADU4MQMAAAA1ODIDAAAANTgzAwAAADU4NAMAAAA1ODUD
+ AAAANTg2AwAAADU4NwMAAAA1ODgDAAAANTg5AwAAADU5MAMAAAA1OTEDAAAANTkyAwAAADU5MwMA
+ AAA1OTQDAAAANTk1AwAAADU5NgMAAAA1OTcDAAAANTk4AwAAADU5OQMAAAA2MDADAAAANjAxAwAA
+ ADYwMgMAAAA2MDMDAAAANjA0AwAAADYwNQMAAAA2MDYDAAAANjA3AwAAADYwOAMAAAA2MDkDAAAA
+ NjEwAwAAADYxMQMAAAA2MTIDAAAANjEzAwAAADYxNAMAAAA2MTUDAAAANjE2AwAAADYxNwMAAAA2
+ MTgDAAAANjE5AwAAADYyMAMAAAA2MjEDAAAANjIyAwAAADYyMwMAAAA2MjQDAAAANjI1AwAAADYy
+ NgMAAAA2MjcDAAAANjI4AwAAADYyOQMAAAA2MzADAAAANjMxAwAAADYzMgMAAAA2MzMDAAAANjM0
+ AwAAADYzNQMAAAA2MzYDAAAANjM3AwAAADYzOAMAAAA2MzkDAAAANjQwAwAAADY0MQMAAAA2NDID
+ AAAANjQzAwAAADY0NAMAAAA2NDUDAAAANjQ2AwAAADY0NwMAAAA2NDgDAAAANjQ5AwAAADY1MAMA
+ AAA2NTEDAAAANjUyAwAAADY1MwMAAAA2NTQDAAAANjU1AwAAADY1NgMAAAA2NTcDAAAANjU4AwAA
+ ADY1OQMAAAA2NjADAAAANjYxAwAAADY2MgMAAAA2NjMDAAAANjY0AwAAADY2NQMAAAA2NjYDAAAA
+ NjY3AwAAADY2OAMAAAA2NjkDAAAANjcwAwAAADY3MQMAAAA2NzIDAAAANjczAwAAADY3NAMAAAA2
+ NzUDAAAANjc2AwAAADY3NwMAAAA2NzgDAAAANjc5AwAAADY4MAMAAAA2ODEDAAAANjgyAwAAADY4
+ MwMAAAA2ODQDAAAANjg1AwAAADY4NgMAAAA2ODcDAAAANjg4AwAAADY4OQMAAAA2OTADAAAANjkx
+ AwAAADY5MgMAAAA2OTMDAAAANjk0AwAAADY5NQMAAAA2OTYDAAAANjk3AwAAADY5OAMAAAA2OTkD
+ AAAANzAwAwAAADcwMQMAAAA3MDIDAAAANzAzAwAAADcwNAMAAAA3MDUDAAAANzA2AwAAADcwNwMA
+ AAA3MDgDAAAANzA5AwAAADcxMAMAAAA3MTEDAAAANzEyAwAAADcxMwMAAAA3MTQDAAAANzE1AwAA
+ ADcxNgMAAAA3MTcDAAAANzE4AwAAADcxOQMAAAA3MjADAAAANzIxAwAAADcyMgMAAAA3MjMDAAAA
+ NzI0AwAAADcyNQMAAAA3MjYDAAAANzI3AwAAADcyOAMAAAA3MjkDAAAANzMwAwAAADczMQMAAAA3
+ MzIDAAAANzMzAwAAADczNAMAAAA3MzUDAAAANzM2AwAAADczNwMAAAA3MzgDAAAANzM5AwAAADc0
+ MAMAAAA3NDEDAAAANzQyAwAAADc0MwMAAAA3NDQDAAAANzQ1AwAAADc0NgMAAAA3NDcDAAAANzQ4
+ AwAAADc0OQMAAAA3NTADAAAANzUxAwAAADc1MgMAAAA3NTMDAAAANzU0AwAAADc1NQMAAAA3NTYD
+ AAAANzU3AwAAADc1OAMAAAA3NTkDAAAANzYwAwAAADc2MQMAAAA3NjIDAAAANzYzAwAAADc2NAMA
+ AAA3NjUDAAAANzY2AwAAADc2NwMAAAA3NjgDAAAANzY5AwAAADc3MAMAAAA3NzEDAAAANzcyAwAA
+ ADc3MwMAAAA3NzQDAAAANzc1AwAAADc3NgMAAAA3NzcDAAAANzc4AwAAADc3OQMAAAA3ODADAAAA
+ NzgxAwAAADc4MgMAAAA3ODMDAAAANzg0AwAAADc4NQMAAAA3ODYDAAAANzg3AwAAADc4OAMAAAA3
+ ODkDAAAANzkwAwAAADc5MQMAAAA3OTIDAAAANzkzAwAAADc5NAMAAAA3OTUDAAAANzk2AwAAADc5
+ NwMAAAA3OTgDAAAANzk5AwAAADgwMAMAAAA4MDEDAAAAODAyAwAAADgwMwMAAAA4MDQDAAAAODA1
+ AwAAADgwNgMAAAA4MDcDAAAAODA4AwAAADgwOQMAAAA4MTADAAAAODExAwAAADgxMgMAAAA4MTMD
+ AAAAODE0AwAAADgxNQMAAAA4MTYDAAAAODE3AwAAADgxOAMAAAA4MTkDAAAAODIwAwAAADgyMQMA
+ AAA4MjIDAAAAODIzAwAAADgyNAMAAAA4MjUDAAAAODI2AwAAADgyNwMAAAA4MjgDAAAAODI5AwAA
+ ADgzMAMAAAA4MzEDAAAAODMyAwAAADgzMwMAAAA4MzQDAAAAODM1AwAAADgzNgMAAAA4MzcDAAAA
+ ODM4AwAAADgzOQMAAAA4NDADAAAAODQxAwAAADg0MgMAAAA4NDMDAAAAODQ0AwAAADg0NQMAAAA4
+ NDYDAAAAODQ3AwAAADg0OAMAAAA4NDkDAAAAODUwAwAAADg1MQMAAAA4NTIDAAAAODUzAwAAADg1
+ NAMAAAA4NTUDAAAAODU2AwAAADg1NwMAAAA4NTgDAAAAODU5AwAAADg2MAMAAAA4NjEDAAAAODYy
+ AwAAADg2MwMAAAA4NjQDAAAAODY1AwAAADg2NgMAAAA4NjcDAAAAODY4AwAAADg2OQMAAAA4NzAD
+ AAAAODcxAwAAADg3MgMAAAA4NzMDAAAAODc0AwAAADg3NQMAAAA4NzYDAAAAODc3AwAAADg3OAMA
+ AAA4NzkDAAAAODgwAwAAADg4MQMAAAA4ODIDAAAAODgzAwAAADg4NAMAAAA4ODUDAAAAODg2AwAA
+ ADg4NwMAAAA4ODgDAAAAODg5AwAAADg5MAMAAAA4OTEDAAAAODkyAwAAADg5MwMAAAA4OTQDAAAA
+ ODk1AwAAADg5NgMAAAA4OTcDAAAAODk4AwAAADg5OQMAAAA5MDADAAAAOTAxAwAAADkwMgMAAAA5
+ MDMDAAAAOTA0AwAAADkwNQMAAAA5MDYDAAAAOTA3AwAAADkwOAMAAAA5MDkDAAAAOTEwAwAAADkx
+ MQMAAAA5MTIDAAAAOTEzAwAAADkxNAMAAAA5MTUDAAAAOTE2AwAAADkxNwMAAAA5MTgDAAAAOTE5
+ AwAAADkyMAMAAAA5MjEDAAAAOTIyAwAAADkyMwMAAAA5MjQDAAAAOTI1AwAAADkyNgMAAAA5MjcD
+ AAAAOTI4AwAAADkyOQMAAAA5MzADAAAAOTMxAwAAADkzMgMAAAA5MzMDAAAAOTM0AwAAADkzNQMA
+ AAA5MzYDAAAAOTM3AwAAADkzOAMAAAA5MzkDAAAAOTQwAwAAADk0MQMAAAA5NDIDAAAAOTQzAwAA
+ ADk0NAMAAAA5NDUDAAAAOTQ2AwAAADk0NwMAAAA5NDgDAAAAOTQ5AwAAADk1MAMAAAA5NTEDAAAA
+ OTUyAwAAADk1MwMAAAA5NTQDAAAAOTU1AwAAADk1NgMAAAA5NTcDAAAAOTU4AwAAADk1OQMAAAA5
+ NjADAAAAOTYxAwAAADk2MgMAAAA5NjMDAAAAOTY0AwAAADk2NQMAAAA5NjYDAAAAOTY3AwAAADk2
+ OAMAAAA5NjkDAAAAOTcwAwAAADk3MQMAAAA5NzIDAAAAOTczAwAAADk3NAMAAAA5NzUDAAAAOTc2
+ AwAAADk3NwMAAAA5NzgDAAAAOTc5AwAAADk4MAMAAAA5ODEDAAAAOTgyAwAAADk4MwMAAAA5ODQD
+ AAAAOTg1AwAAADk4NgMAAAA5ODcDAAAAOTg4AwAAADk4OQMAAAA5OTADAAAAOTkxAwAAADk5MgMA
+ AAA5OTMDAAAAOTk0AwAAADk5NQMAAAA5OTYDAAAAOTk3AwAAADk5OAMAAAA5OTkVABWO+gEVjvoB
+ LBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW0A8YDHp6cTBrZnk0LnZi
+ bhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5lYTMMAAAANWRtdnFldmcuamsw
+ DAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8zamF0bmMuMXZoDAAAAHUzYmZ1
+ dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYnczDAAAAGkwc3EzMDVvLmg1dQwA
+ AAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nra3QyLnJpMAwAAABxMG40NTJl
+ NC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwAAABjd3RhZWQyci5xZHcMAAAA
+ M215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZxci5ubXEMAAAAbHd1aG5kbTAu
+ d2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAAbHBlYnRqNXcuZmMwDAAAAHp0
+ aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2EuY2RmDAAAAHBjanpvdzF1Lm0w
+ MAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1MnJtY2htLnNoZQwAAABwczBz
+ ZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4YgwAAABqMmxtZnpzMi5xZmIM
+ AAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2owZGsybi5hczIMAAAAem5iemhn
+ aXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQMAAAAcm95ZG9udWsuYjJqDAAA
+ AGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5ZGMubHZsDAAAAGRiZGZtc3Iy
+ LmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAAAHIwbm50eTRwLnFlMAwAAAA0
+ eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5Lms1agwAAABhcHljZ2h1aC5h
+ bHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABveGxhdGdudy5hdG8MAAAAdGpn
+ b2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5odnUMAAAAc2x3dXZjaXkucXlm
+ DAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3aTVla3UuZnl6DAAAAHdua2Vz
+ Y25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgwDAAAADVobHZvZ2l3LndtMQwA
+ AABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZkNTMwLnp2NQwAAABqc2N2b3lj
+ Yy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwAAAB1cmkwMmFjMy5zYnkMAAAA
+ bWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1vby5xYWsMAAAAdmN5Z3FzcWUu
+ dXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAAcW1mdXJrMWcucmNnDAAAAHMy
+ ZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwucG1zDAAAAHR0eW9kc251LjQ1
+ ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6dmF6cHZqLmFoeAwAAAA1bXVy
+ NGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxnZwwAAAA1bTU0Zmdnby5rdjUM
+ AAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlzemdhMS53ZnIMAAAAamExY2xh
+ dHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIMAAAAeW5sNXR0eWgubTVsDAAA
+ AG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNwMmQuenRxDAAAAGtnbGl5ZXN0
+ LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAAAGVrZGp0Y3U1LjNicAwAAAA0
+ dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1LjN5dAwAAABqaDV2ZGx6eC54
+ aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABtbmNkZjRudS5idnQMAAAAY3l1
+ ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5tNWkMAAAAcTJvbGRtbDQuZHly
+ DAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRtNGFiMXMuM3FtDAAAAGtxZ2I1
+ ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5DAAAAGZwNGRqamxsLm1meQwA
+ AABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUwaWlrLnQ1ZQwAAABybXZreHN6
+ ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwAAABtbXYwb3lieC5rM2cMAAAA
+ ZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQxZC55dG4MAAAAZGhoZ2d0dGku
+ MWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAAbnhsbGRhYW8ua2RwDAAAADBu
+ cTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsueXJzDAAAAGYxcmMwNGp0LjFr
+ bAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxrdmY1b3gyLmpqMAwAAABhejIy
+ NG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRpZgwAAABtazB4dXZ5MS5pMjEM
+ AAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3dTF2Zy5vYXMMAAAAcmNtaHhv
+ czMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQMAAAANXIzZHV6b2cuamlnDAAA
+ AHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtmeTQudmJuDAAAAHJ0cTBkZG9n
+ LjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAAAHNxaGdhaW1wLnQ0YgwAAAB6
+ cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4LmZqMgwAAAAxbDFtNDFiai5n
+ ZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABmMXhtMTN6eS5langMAAAAMXNl
+ cTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51bWgMAAAAMHNrdmJvanEueTBo
+ DAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xmZ2RhYnoud3djDAAAAGFnem1o
+ eHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5xDAAAAHJ4dWJ2dmdwLnhnZgwA
+ AAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0cWNvLjRtZAwAAABkdnJmZW0y
+ cC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwAAABmYWlsMzVieS5ycTMMAAAA
+ bTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlvdS4wMWcMAAAAbXYzcm5lZW8u
+ cmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAAYXcycHJqYmEubTNhDAAAAGJo
+ Z3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAuYWV4DAAAAGQxcXZ1ZmltLnBi
+ dwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtkeWRhcWlyLndjcgwAAAB3YTM0
+ Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2cgwAAABoeHJqNHJzZS54Y20M
+ AAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFieDNtZS5tbHgMAAAAZ2I1MG11
+ bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYMAAAAdWdlc3R5dzEudXBsDAAA
+ AHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFncXMucTRqDAAAAG0zbnduMGUy
+ LmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAAAG16YTR0NXNnLnV1dgwAAAAw
+ aGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEyLnhtcwwAAAAzbWltdnF1bi5o
+ dTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABubWg0bmg1MS4xbjAMAAAAZ2Zy
+ b3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4zb3IMAAAAcHhuMXQzemkuYWNn
+ DAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1eWx6dHQua3BiDAAAADBiaWNz
+ eXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYyDAAAAG9mZGptbnN2LnVodAwA
+ AAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3Ymt2Lml3MwwAAAB5ampoa3Fs
+ bi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwAAAB0djEzd3F2eS55dWIMAAAA
+ b2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAzZy5ueXUMAAAAMGM1dXR1bWYu
+ M3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAAeXlpajEwMW8ucGlqDAAAAHA1
+ anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMudW0wDAAAAHdjdHBua2ZoLjJ1
+ bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZyMHNza29yLm4ydwwAAAB4dDUw
+ MHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFqZwwAAABqc2V0emMwZS5qaGUM
+ AAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRpMnNmdi53MnUMAAAAbXpwdnNu
+ dWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEMAAAANXhob2txNTQuY29qDAAA
+ AHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1eTQuejMyDAAAAG12dnJ2czFu
+ LmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAAAHZnNGNybm0yLjNjYgwAAABr
+ NTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0LmtkYgwAAABqd3FnYnVtYi5p
+ cnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAAByZ2MzdjN5cC4xY3AMAAAAZ3Bo
+ MzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41ZjAMAAAAaGhrYjBrdzAueWky
+ DAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJmZ3FxeDUudHoyDAAAAG80dWk0
+ a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFoDAAAADB3eHBpZWlpLmVndAwA
+ AABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3b3hpLm50ZgwAAABuemZyYmJ2
+ eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwAAABuNXFnYWgxbS5vM28MAAAA
+ cDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251ay4yMXAMAAAAYWVrYTE1Z3Eu
+ cXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAAanJvM2hzcDMuMmYzDAAAAGJz
+ Z2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMuYjJyDAAAAG5paTFtc3YzLnBz
+ dQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1bmd3dWlqLnViMwwAAAB2Ymx3
+ MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxwNQwAAABqcW1xeWVkdy5naWEM
+ AAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQwaHpwcy5kdjUMAAAAd2ZnY2Rx
+ NGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQMAAAAZGwxMnl6bXIuZWJmDAAA
+ AHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZsMmIuZmJ3DAAAADJ4a3c0eHhy
+ LnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAAAGRkem5lMGpnLmV2NAwAAAB6
+ d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVlLnpjeAwAAAByZmRncm4xZS5y
+ ZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5Y3lreGVnYy4zYmwMAAAAajNq
+ MnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5pcTUMAAAAMGp1cmoyMWkuNDAz
+ DAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlvMnM1MHAueGprDAAAAHBpYWpi
+ bXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmswDAAAAGpvZHIxbHVjLmk0cAwA
+ AAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGszMWJwLm4xdAwAAAB1MW1sazF3
+ NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwAAAB4d20wdGt2bS5xbHkMAAAA
+ dWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhydi5yc3YMAAAAdmdyYnlxdXYu
+ cXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAAZDFocWk1dmMuY20yDAAAADFx
+ MGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQuZGlzDAAAAGNsaWY1b3h2LnQw
+ bgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNqcnNjaWp3LmJzcAwAAAAxcGxt
+ bjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVudAwAAABhcGxhZTVocS5ibG0M
+ AAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5sYjRlNS5ibnkMAAAAYWl3amdz
+ cWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAMAAAAYXBpbWdvdGYueXE0DAAA
+ AGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRmcDAuZDV0DAAAAGhocDI1d2Fp
+ LnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAAAHhyMTFmNHVuLjJidQwAAAB3
+ ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cxLmdqMgwAAABrMHRzbjRmaC5v
+ a2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABxZHpwNWRyby4xcXcMAAAAa2Zh
+ YmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53MGgMAAAAZGZkNDN6dHcubWly
+ DAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3lsZjF4aHguZ2RqDAAAADR5bnAw
+ dmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpkDAAAADRuMm5kMGlvLm53ZAwA
+ AAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1ZnJ1LmRjcwwAAAB4NGpoNXBk
+ ci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwAAABhMmJ0bWJ5YS5xZ2UMAAAA
+ bGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXkybi52bjQMAAAAZXpvemI0M2su
+ YTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAAMnBsbXVrdHIuYnB4DAAAAGhm
+ eGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMuZ21sDAAAAHJpY2o0eGs1LnBq
+ bQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAxbGdncnVzLnB5bAwAAABqb3R3
+ cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96bgwAAABhdGhucnJ6di5pdG8M
+ AAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1iaDNraS5rYm8MAAAAZzRoZnNo
+ YWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoMAAAAbGY1cG14YXguYWJ6DAAA
+ AGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6dzUuaXU1DAAAAHlzMjMzZm52
+ LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAAAG8ydHFzM2NuLjBxcgwAAABy
+ cnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29qLmExcAwAAABtNXNxd2Nkai5v
+ bHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABoc3ozcWdoNC53MTMMAAAAZWN0
+ Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5kMzMMAAAANXA1YW1ja2wuam1s
+ DAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1MzJrenQudGllDAAAAGEzdG9n
+ ZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVjDAAAAGVia3h2bXExLjJ0aQwA
+ AABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNjbTQxLnQxbAwAAAB3aW55a2Ft
+ Zy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwAAAAzaWtwa2tteC5xZjIMAAAA
+ YnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBuMC41cWYMAAAAM25uZGNobWcu
+ eXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAAd2lveTF5bmIuZ3gxDAAAAGdj
+ dDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEueTUxDAAAADIzcmVlbjI0Lngz
+ MgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpzdWl2em1jLnRmMwwAAABvMmt4
+ bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndzcQwAAAA0dDIxaDB0Yi56dDIM
+ AAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3ZWxteC5kaHoMAAAAc2JvNHRj
+ eXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncMAAAAajJvNXdkcncuZ3VrDAAA
+ AGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtvNTUueGZwDAAAADVvdnlydHpt
+ LmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAAAHZ2MWVkcnI0Lm1rcAwAAAB1
+ aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVmLmJjcAwAAAB5ZGVzcGpjZy5p
+ ajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0cDRtNXR0dC53bXgMAAAAcGpk
+ Y3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41ZW8MAAAAc2I1MTJ5YmouM3Jj
+ DAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5bmJjc2gueHR1DAAAAG8yYTFi
+ ZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5DAAAAHNwZmZ3bHhwLjRtcQwA
+ AABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdrNWpmLnhjYgwAAABncTR4c3dx
+ dC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwAAABsdnpvdzRpMy5jNHYMAAAA
+ ankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2JsaS5tcGQMAAAAbzBydHh1Ymcu
+ MWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAAMGJlaDRta2QueWVrDAAAAHVj
+ c2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUuMXVhDAAAAGMyMjN6Y3JsLmlj
+ cgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJrNGVwa2hrLnVhdQwAAABzbG40
+ cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMzdAwAAAB3ZWowcGhmbi4xa2sM
+ AAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4ycmR0NC5qZmMMAAAAYmdpMnN0
+ YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAMAAAAbmdkdDBybnIueGtzDAAA
+ AGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0NGkub3JrDAAAAHdveTFvZ3N0
+ LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAAAHYxcXRtZzFlLnV0cwwAAABy
+ ajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25yLjB0MAwAAAA1am9zZG5oZi5n
+ dmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAxbXZ1eDFzcS55cHEMAAAAZnpi
+ Z2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54NGMMAAAAMXJ4MHFuaXQueW96
+ DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRlaTVxa3oudXZiDAAAAHIxMWlk
+ ZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2DAAAAGIwd2tncGFuLm5xawwA
+ AAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhrbzRxLmRhdgwAAABhdzB5cWZw
+ by4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwAAAB4bGdvNHgxdy5odXUMAAAA
+ bzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwzZy50bXIMAAAAa2p4MGVyb2Eu
+ cGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAAaGR0dzNsZWouaHdyDAAAAG5z
+ Y3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3MmwuNWZsDAAAAHhoZWd5d3Z6Lncx
+ YwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVxZGRrYmJiLnFnbgwAAAAzZnM0
+ ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4dAwAAABweXZudXJ0ZC4zZGMM
+ AAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRzeTR1cy4yMmQMAAAAamxiMGJ0
+ enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQMAAAAa2c1anNqNXIubG96DAAA
+ AGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21yd3AuNHUzDAAAAHd3MGFzc3l4
+ Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAAAGZ1b2pmcTQwLmZ5dAwAAABt
+ YXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRqLnF4cgwAAABxbnd1dGx6YS5n
+ eXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4a2xpamN2ai4zcjEMAAAAc3cx
+ YnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5xbGMMAAAAczFwZ3psaHgueXRw
+ DAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3NocmV0dGYubzAyDAAAAHNyZXZ3
+ eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2JrDAAAADBpdDFtZnhzLmpxMAwA
+ AABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2NmZzNtLnhycwwAAABkd295eWll
+ aC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwAAABqaWRjNW5paC41enEMAAAA
+ MDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2JjMy5wYWsMAAAAd3Nnd3B0d2Iu
+ bG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAAdHpoNHN2dTIuaHp6DAAAAHBj
+ bXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUudXZnDAAAAGJuNHN5cWdrLjBj
+ MgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQxZmNqYmsxLnFseAwAAAAzcmhv
+ M3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0eQwAAABra2lldXZ0NC5zY3gM
+ AAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYzYmpvdi5waTIMAAAAb3NoaWh4
+ ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUMAAAAeGVnNDBib2QudWp3DAAA
+ AHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtzbHIuMjJwDAAAAGZ2dmh3aWs0
+ LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAAAGF3cHczZGpiLjBnZAwAAABw
+ b21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0LjJubQwAAABweWR1bGNpYi56
+ YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5anphNGJrbC5ocWcMAAAAbG5q
+ MmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40d28MAAAAem5iejRoYmQubHoz
+ DAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQzemVkaW4uMXYyDAAAAGV5YTUw
+ cnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMxDAAAAHlmendwNHlxLnp5bAwA
+ AAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1c2ljLm1mawwAAABrZWVmcG1n
+ Yy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwAAABkNWZ4cXpldS5ua2kMAAAA
+ bTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlvdS56bWUMAAAAaGVxa2R1bHUu
+ dHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAAbGN6aTQ1MnAuaWEyDAAAAGEw
+ cmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWkubWd0DAAAADV3b25lcTUyLnJn
+ dwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1eXpvNXVlLjNuYwwAAABqNG9n
+ MnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhyeQwAAAA0bzNhY3B0ZC41c3EM
+ AAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRnenA1bi52enUMAAAAZHZycHZ5
+ M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwMAAAAYW1veWtvZGkuNW9nDAAA
+ AG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgwcGouMzF2DAAAADMwcndocHBs
+ Lmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAAADNleGlsbXB2Lmp6aQwAAABs
+ YWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5LmljcgwAAAA1NHBhMnBtdy5y
+ amkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABpZmxlaTFuMS5idGsMAAAAYmxk
+ d2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5tcjIMAAAAYTRxZG94ZWsuajMx
+ DAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lrampkMWMuNGd5DAAAADVqM2wx
+ MHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3FvDAAAAGI1ZjNmcWRpLjB5NQwA
+ AABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxjdmdtLmpnagwAAAAzZmMwZXdi
+ bS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwAAABxMnRmYjB2ay5uMmQMAAAA
+ a2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1dy5rcXYMAAAAbWRjcGVld2Iu
+ NXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAAeXlhbGJ1Y3MuYW5nDAAAAHAz
+ eHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cuNTU0DAAAAGVydTJsbmowLnN1
+ dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZmeGJidWFkLm5tNQwAAABidmo1
+ eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNyZwwAAABvZWVrcjJ0eC51aXkM
+ AAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdlbGRrdi56YXEMAAAAamJ4YzB3
+ dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIMAAAAaGhwejQyeHQuZ3F4DAAA
+ ADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2JxdWwudWQyDAAAAG94MDQ1azFv
+ LmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAAAGozcGM1c20wLm1sYwwAAABp
+ c2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2RvLm1nYQwAAAB5ZWpnb2d4by55
+ bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2enEzMW94Yi50djMMAAAAeHFz
+ MGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5ycnkMAAAAMDV0Y3h0MmwucXo1
+ DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWExcnIxZGwudWVlDAAAAHFzdWdu
+ eXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6DAAAADUxeW01YmhxLmVybAwA
+ AABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdrZ3lsLm1wdAwAAABkZDV3dGh5
+ aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwAAABocGdudG5qaC56dHIMAAAA
+ eDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJybC4ybXUMAAAAd2lrdXB4b2ou
+ c2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAAMHB4MWRpY2wucWd3DAAAAHVx
+ YTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8uanZpDAAAAGQ0bDQwbGJxLjUw
+ ZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHowYmNsa2R1LmNwawwAAAB3MGpv
+ Z3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3aQwAAABidXp6MmpuMi52MzUM
+ AAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVqMXRydC5rdXgMAAAAYzExcG9l
+ MDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8MAAAANWw1MWswdGsueGRsDAAA
+ AGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZsdjQub2lpDAAAAHVzMzMyMDJy
+ Lm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAAAGx5ZmNscmh3LnJ0NAwAAABk
+ a3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFyLnBzNQwAAABxd2YwM2lxZC5o
+ ZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABjdjFlMnhvdS4xbngMAAAAbGFs
+ bzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5oa2kMAAAAeTB2MjM1eG4uMG5m
+ DAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMwYmRudjEuNDVjDAAAAGhpM3p5
+ cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNlDAAAAGZhZXEwdTNrLmZndQwA
+ AABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xnb2hkLjVibgwAAAB2YWR0YXNs
+ aC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwAAABmcTJ5bmZiMS5tb3IMAAAA
+ Zm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2ZxMy5nZWYMAAAAcWNtYmpha2cu
+ cGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAAeW1vNXlsengudmt3DAAAAHZ1
+ bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcudW8zDAAAAG4zMm00aGVkLnRt
+ cgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBjeXBuZGVwLjNrdwwAAABrdWg0
+ NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmlicAwAAABhc2szdXNzcy56YjUM
+ AAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVlaWVmZi5sc3gMAAAAa2pmMG9u
+ bmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEMAAAAajJuamJtZHEuMTRhDAAA
+ AG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUwanAudmVnDAAAADFsM3phZ3F4
+ Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAAADR3MTJncHAzLmRycwwAAABx
+ MnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtvLjFucAwAAAA0aW54a3YzZC54
+ eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAzbGN1aGZpcS4yYWYMAAAAeGtp
+ NXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5sZ2sMAAAAeHlxZXE1ejMubTRh
+ DAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNjc21uNWkudzFuDAAAAHptNWtp
+ Y3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNwDAAAAHlranlrY3F4LnJqMAwA
+ AABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2VrdTNhLnl3ZAwAAAA0bnAwdGdo
+ NS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwAAAA0azEwdnV6by56d3cMAAAA
+ b3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0di4zY3YMAAAAaGNhMGx3cjMu
+ eGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAAYTJqaHRxeWIuczVjDAAAAGtm
+ ZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIudm53DAAAAHZycDBncG1mLnky
+ YQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4xdnYxdHN1LjFpbAwAAABnZjFi
+ aDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3agwAAABqbmE1em0wYy5hb3gM
+ AAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41cW1ueS5kbDAMAAAAbTNkd3Jx
+ MmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMMAAAAMXU1cjFuYXoueWhjDAAA
+ AG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81MmIuZnlwDAAAAGJuNHJ6aXNy
+ LjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAAAGZ6aWpmcGpsLmMwagwAAABn
+ M3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3NuLmRoagwAAAAyZnZ3eGlsdi5p
+ d2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABucWZtMWJvZS51ZG4MAAAAdGxh
+ czJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5uM20MAAAAYnNqbDBudmkuaW5o
+ DAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpoM2NmYXguNWZmDAAAAGlnM2x0
+ ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0DAAAAG1mbzF0amV4LjR5bAwA
+ AABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHhtMjN4Lmx4cQwAAAB6amlqZGV2
+ cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwAAAB4bGE0NGYxaS5jbmIMAAAA
+ NTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNhZS5vdWYMAAAAZG5qd25lcnYu
+ ZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAAMTEyYnFwcWYuaWMzDAAAAGtw
+ NHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2kuajJ4DAAAAHNudnF3aGkxLml3
+ aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRsc2Fpb2FzLmhzMwwAAAAweGZh
+ dDNxei5vYWkVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZz
+ FgAW0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAAwAAANAPAQwAAABtZGlmanQ1NS5l
+ YTMMAAAANWRtdnFldmcuamswDAAAAHNmdGdtZ3N4LmIxZAwAAAB6cm9xdnM1dC5samkMAAAAYW8z
+ amF0bmMuMXZoDAAAAHUzYmZ1dmRsLjF3cgwAAABqcWN3M2VyMy5sdDIMAAAAc2gxc3doZXQuYncz
+ DAAAAGkwc3EzMDVvLmg1dQwAAAB1NTNjZWxhMC5zZ2IMAAAAemZybTVobHEud3J1DAAAAGN6Y2Nr
+ a3QyLnJpMAwAAABxMG40NTJlNC51bnkMAAAAanVvenVtYWEudmZ2DAAAADFtdGZvMTNtLnhlaQwA
+ AABjd3RhZWQyci5xZHcMAAAAM215czB5a2YuYWdqDAAAAHZlYXVpbTNtLjNhMwwAAAB1NHh1cWZx
+ ci5ubXEMAAAAbHd1aG5kbTAud2pmDAAAAGtqdXkycm50LnVqdAwAAABxeGNpd3JpMS5seDEMAAAA
+ bHBlYnRqNXcuZmMwDAAAAHp0aWoxcWNiLml5MwwAAAAzbXdyZXpwMi5xaTAMAAAAYXoyamF3M2Eu
+ Y2RmDAAAAHBjanpvdzF1Lm0wMAwAAAAzZHlxdmg0MS5wYWMMAAAAMGFqY3lkcHMuYTRkDAAAAGI1
+ MnJtY2htLnNoZQwAAABwczBzZGZzei5lcmMMAAAAZjUxdDNkaGIuanZjDAAAADV6cmhzYnpqLjF4
+ YgwAAABqMmxtZnpzMi5xZmIMAAAAcjBlcngxaXQuaXRyDAAAAGpiMGRzdTAxLnBlbwwAAAAzd2ow
+ ZGsybi5hczIMAAAAem5iemhnaXAuY2xxDAAAAG5xYmJwcHJ1LmZncQwAAABncDF4emYxZy4zeGQM
+ AAAAcm95ZG9udWsuYjJqDAAAAGVlZ2czY3FzLml0eAwAAABtNHYxd29sdC40bGgMAAAAcHV4MHp5
+ ZGMubHZsDAAAAGRiZGZtc3IyLmlrNAwAAAB1cXQ1c2EzaS5hbmsMAAAANWpjaWpoMWcua2dtDAAA
+ AHIwbm50eTRwLnFlMAwAAAA0eGMxcGMzai5vemYMAAAAZDN4dzNoZ2EuYWZkDAAAAHZlMHVtZnl5
+ Lms1agwAAABhcHljZ2h1aC5hbHIMAAAAY3l6Z2twaDQuM2ljDAAAAGJjZTJ5dmNxLmhhbQwAAABv
+ eGxhdGdudy5hdG8MAAAAdGpnb2tzZTIudTRzDAAAAGt1MWw1NDVkLnB3ZgwAAAB1Y2VhYmxjcS5o
+ dnUMAAAAc2x3dXZjaXkucXlmDAAAAG9seWMwcml2LmhuYgwAAAB3cmN6bXEwbC5yZ3cMAAAAc3F3
+ aTVla3UuZnl6DAAAAHdua2VzY25rLm5kbwwAAABoajRzbDVqMS5mdXkMAAAAczR4bmJoMmMudGgw
+ DAAAADVobHZvZ2l3LndtMQwAAABjcTBuNDVwei5mc3AMAAAAemYydndqaXIuZXVxDAAAADVqeHZk
+ NTMwLnp2NQwAAABqc2N2b3ljYy5xcWcMAAAAbHNqbnp2ZmIua3J3DAAAADRwYWliaHoxLnYxcAwA
+ AAB1cmkwMmFjMy5zYnkMAAAAbWc1cXdiMXEudGVqDAAAAG5sYmd5b2k1LmZkZwwAAABrM3ZiMW1v
+ by5xYWsMAAAAdmN5Z3FzcWUudXZiDAAAAGRobWFheWc1LnNrYQwAAAB0dW9sZ3lobS5seGQMAAAA
+ cW1mdXJrMWcucmNnDAAAAHMyZmdlMDAzLmNkMQwAAABpM25sY256dy4wNGwMAAAAc2UxNHJmeWwu
+ cG1zDAAAAHR0eW9kc251LjQ1ZQwAAABtcmQxamJ0Zy5uZjEMAAAAeWNtcG5ldzQueTFnDAAAAHd6
+ dmF6cHZqLmFoeAwAAAA1bXVyNGt2ei5mZWoMAAAAM2NoYnN6dmYubXl2DAAAAHBldGsyZzVxLmxn
+ ZwwAAAA1bTU0Zmdnby5rdjUMAAAAeXptczVvMHMuNTN6DAAAADB4NTRsZHN5LmdxdgwAAABnZWlz
+ emdhMS53ZnIMAAAAamExY2xhdHcuNWNpDAAAAG9ydHVzdnlwLnp1dwwAAAAyYTJueHNxbS5hdHIM
+ AAAAeW5sNXR0eWgubTVsDAAAAG5xY2k0bjUxLjM0dAwAAABrMjRraXpsZC50aXQMAAAAcHBwZmNw
+ MmQuenRxDAAAAGtnbGl5ZXN0LmFmdgwAAAAzbGFlb25nbi5qenoMAAAAaDA1djA1YnQuc253DAAA
+ AGVrZGp0Y3U1LjNicAwAAAA0dmp3eTJhei5kc3cMAAAAYzR3MjF6ZXAuYWNzDAAAAG1hZmtrdGh1
+ LjN5dAwAAABqaDV2ZGx6eC54aGIMAAAAanYzZ2lhMDAuemFxDAAAAGxucjAxemRkLmh0eAwAAABt
+ bmNkZjRudS5idnQMAAAAY3l1ajNjcjUuYmVhDAAAAGt2cG5kem94Lm1vbQwAAAAyZjB0c2Vuby5t
+ NWkMAAAAcTJvbGRtbDQuZHlyDAAAAHFqMTBqY3BjLmhrdwwAAABjMXZ3bWtvYi56azUMAAAAdWRt
+ NGFiMXMuM3FtDAAAAGtxZ2I1ZndsLnV6MwwAAABla21uYjBoZC55c3IMAAAAYWdqYnNrbnIuMmd5
+ DAAAAGZwNGRqamxsLm1meQwAAABibzVkZW1oeC5taHcMAAAAcnppZ29ldWkuYnhkDAAAAHhhZmUw
+ aWlrLnQ1ZQwAAABybXZreHN6ZS5id2EMAAAAaHRxNWZndm8uaGdlDAAAAGczeXBicGprLnY0ZQwA
+ AABtbXYwb3lieC5rM2cMAAAAZGhqMGIxY3kudm5tDAAAAGJoYm5kZGRjLnp1cgwAAABid2NicDQx
+ ZC55dG4MAAAAZGhoZ2d0dGkuMWhrDAAAAHFwa3J2MW40LmlvcAwAAABnMGNsdDUxbS5wYnEMAAAA
+ bnhsbGRhYW8ua2RwDAAAADBucTV0Y3J3LmpldAwAAAAzNDAzbW9tai5nbGgMAAAAcG1kNHp6aGsu
+ eXJzDAAAAGYxcmMwNGp0LjFrbAwAAAA0dXhmc2loaS5tMHUMAAAAZWx6Z2t4dmoucmplDAAAAGxr
+ dmY1b3gyLmpqMAwAAABhejIyNG1qci5zZ24MAAAAemYwemFwdW0udnZjDAAAAGNjZnBqMG95LjRp
+ ZgwAAABtazB4dXZ5MS5pMjEMAAAAMjRmbjJ6eHIudGtqDAAAAG96eWZ1b3JuLjFybgwAAABhdnN3
+ dTF2Zy5vYXMMAAAAcmNtaHhvczMucnptDAAAAGhyajVmZ3NnLjM1MQwAAAB0eWlibmV5bC54aHQM
+ AAAANXIzZHV6b2cuamlnDAAAAHBuMXJ5ZWFnLmV1bAwAAAB6MmFsbXJ6ZS5tdHkMAAAAenpxMGtm
+ eTQudmJuDAAAAHJ0cTBkZG9nLjV1ZwwAAAB3ZXRlc2hteS5kYW0MAAAAZWc0M2tvMG8uamhnDAAA
+ AHNxaGdhaW1wLnQ0YgwAAAB6cDRtdmh1Yy5xbW0MAAAAM2dnd3F3aHYuZ3MzDAAAAHd1emNxb3Z4
+ LmZqMgwAAAAxbDFtNDFiai5nZHcMAAAAdnFib3FrcHQuMzJ2DAAAAGU1bTR0MmVxLnhsNAwAAABm
+ MXhtMTN6eS5langMAAAAMXNlcTVjaG0ub3BoDAAAAHgzYmt3Z3JyLjViYQwAAAA1MXNqeWNncy51
+ bWgMAAAAMHNrdmJvanEueTBoDAAAAHo0anJ5YmYwLmVvbAwAAABxaXNmbDRsci5iZXEMAAAAb2xm
+ Z2RhYnoud3djDAAAAGFnem1oeHV1LmN3aAwAAABiNXB4bTR2dy5yamIMAAAAbTBzb28xanYubG5x
+ DAAAAHJ4dWJ2dmdwLnhnZgwAAAB0MzJuM3huZS5kZWgMAAAAdWZvMG1sNWsuanphDAAAAGJqZmQ0
+ cWNvLjRtZAwAAABkdnJmZW0ycC51bGgMAAAAdGJ6Z2loM3YudHQ1DAAAAGlmeTJlcHVrLnNxNQwA
+ AABmYWlsMzVieS5ycTMMAAAAbTVlZ24yZmsuYWllDAAAADBsaGlrbHFrLm9iegwAAABsb3h0eHlv
+ dS4wMWcMAAAAbXYzcm5lZW8ucmljDAAAAHI0cnpyeWkyLnF3NQwAAABxcmJsMDVxei4wNWUMAAAA
+ YXcycHJqYmEubTNhDAAAAGJoZ3l2aXZqLmNiMwwAAABkbHhlcTVjMC5vcnYMAAAAbjN2MDRyaHAu
+ YWV4DAAAAGQxcXZ1ZmltLnBidwwAAABveWVyanp2dS5wZm8MAAAAbnVheGtib3YucXB1DAAAAGtk
+ eWRhcWlyLndjcgwAAAB3YTM0Y3VrMy5iZGcMAAAAZTVuMWl4anoud3JrDAAAADJycmk0MXBqLmV2
+ cgwAAABoeHJqNHJzZS54Y20MAAAAdzQxanFwemMueDF4DAAAAGJqbTJhdTNyLnR5eQwAAAB5eTFi
+ eDNtZS5tbHgMAAAAZ2I1MG11bzUudTNoDAAAAG1pd3Z3anQ0Lmo0aQwAAABxY3JpbWFoby5jbnYM
+ AAAAdWdlc3R5dzEudXBsDAAAAHNqczJ1NGVwLmdlMwwAAAB6NWZqc2N3Yi41NWIMAAAAaGxmeDFn
+ cXMucTRqDAAAAG0zbnduMGUyLmhscAwAAAB2cm9iendrMS50cG0MAAAAaGFyYXF2ZGYuZDBkDAAA
+ AG16YTR0NXNnLnV1dgwAAAAwaGh2cGpkNS55bXAMAAAAcHByanQxbWIuZ3RzDAAAADE0dnJkemEy
+ LnhtcwwAAAAzbWltdnF1bi5odTAMAAAAa2NsbGdqdGUuY2I0DAAAAHN6eGdsYWlqLjJvdAwAAABu
+ bWg0bmg1MS4xbjAMAAAAZ2Zyb3ZieGwucWJtDAAAAGUwbnBsbndqLnlzZQwAAABkYWhodXF2Mi4z
+ b3IMAAAAcHhuMXQzemkuYWNnDAAAAHl0MDBodGtrLnd0dwwAAABwend4NTIzMi5ocWcMAAAAbXJ1
+ eWx6dHQua3BiDAAAADBiaWNzeXFvLmJxZAwAAABndnpwbnZ4cC5xbGwMAAAAM3V6bDFmaXUucmYy
+ DAAAAG9mZGptbnN2LnVodAwAAAAyeWhndHVzei4xa2YMAAAAMXcwYnhkY24ucHgxDAAAADFwbWx3
+ Ymt2Lml3MwwAAAB5ampoa3Fsbi5pdWIMAAAAMHh3MW95bG8udHdlDAAAAGtteml4cTR3LnUzcAwA
+ AAB0djEzd3F2eS55dWIMAAAAb2EyZzNlanQucmlmDAAAAGViZXBnanc1Lm10cQwAAAAyZnkxMzAz
+ Zy5ueXUMAAAAMGM1dXR1bWYuM3RzDAAAAGZuY3RrY2JnLmMwYwwAAABibmtzZXdzZy53em0MAAAA
+ eXlpajEwMW8ucGlqDAAAAHA1anlkbHI0Lmh2MgwAAAAzaXBjZGF3dy5hcXIMAAAAMDRtdzV6MnMu
+ dW0wDAAAAHdjdHBua2ZoLjJ1bQwAAAByenBxc2JzMC41dGEMAAAAdmFoeHF6MGMuMnBtDAAAAHZy
+ MHNza29yLm4ydwwAAAB4dDUwMHUyYi5yaGsMAAAAY3ZpeTI0ZHguY2t6DAAAAHU0c3dkb2x4LnFq
+ ZwwAAABqc2V0emMwZS5qaGUMAAAAaGI1NGIxdGkuM3F2DAAAAGVyNXFzcHZyLnUxMAwAAABibzRp
+ MnNmdi53MnUMAAAAbXpwdnNudWIua2xoDAAAAGtrMG14djBmLnNsbgwAAABjemJlbGVqZy5xaXEM
+ AAAANXhob2txNTQuY29qDAAAAHVyaWhzbjR5LmVreAwAAAB2dGFtaWl2MC5sd2IMAAAAbHhhc3g1
+ eTQuejMyDAAAAG12dnJ2czFuLmRodQwAAAB5ejJxa2h3ZC50ZGUMAAAAeGwyYWd6dHYuMXNmDAAA
+ AHZnNGNybm0yLjNjYgwAAABrNTVmNWtwcS55cWIMAAAAa2RlbGI0bWkucWNtDAAAADN4NWxldGk0
+ LmtkYgwAAABqd3FnYnVtYi5pcnQMAAAAaGVkbHlpNXQud3FsDAAAAGZ0ZXRzM2tvLmhtbAwAAABy
+ Z2MzdjN5cC4xY3AMAAAAZ3BoMzNqcGwudHoxDAAAADR1eDNzd2l5LjNhMgwAAABuY211d3V1MS41
+ ZjAMAAAAaGhrYjBrdzAueWkyDAAAAHZobG1ha3VwLmhzaQwAAAAyd3dkdXFzdy50dzEMAAAAamJm
+ Z3FxeDUudHoyDAAAAG80dWk0a2RyLnAybQwAAAB4aWd3ZHBxZS4zencMAAAAamIwemtsbDEuMmFo
+ DAAAADB3eHBpZWlpLmVndAwAAABuNDNudG81NS5ueWYMAAAAeW1ocjFxeDUuMW9yDAAAAGY0bGZ3
+ b3hpLm50ZgwAAABuemZyYmJ2eC5weXkMAAAAeWhyNXZvaXouMnVvDAAAADN5NXAyZXp3Lm55YwwA
+ AABuNXFnYWgxbS5vM28MAAAAcDNzMWUwMWQua2pnDAAAAGVxZDFoa2NhLnkzbgwAAAB2YTN1Y251
+ ay4yMXAMAAAAYWVrYTE1Z3EucXFkDAAAAGNwdDNvNGZhLnhzdwwAAABsMXMyZ3Fhay52cWQMAAAA
+ anJvM2hzcDMuMmYzDAAAAGJzZ2FhdTBvLnBvawwAAABybHgxZGVoaC56eHoMAAAAdmZlNGlibmMu
+ YjJyDAAAAG5paTFtc3YzLnBzdQwAAAA1cWtkbnR5ci5xa3QMAAAAa2Yxa3Yxb3kuaGsyDAAAAHh1
+ bmd3dWlqLnViMwwAAAB2Ymx3MndldC5rcm0MAAAAanFkZ29tNWEudmMxDAAAAHk1amtjbG4zLmxw
+ NQwAAABqcW1xeWVkdy5naWEMAAAAMW9qYjIwaWEudnRqDAAAAHRmaXZkdjIxLmF4MAwAAABwaWQw
+ aHpwcy5kdjUMAAAAd2ZnY2RxNGYueG8yDAAAAGNicDA1eG0yLnM1MAwAAABhMjAxYXBodi4wZjQM
+ AAAAZGwxMnl6bXIuZWJmDAAAAHgwZXZ5dHFyLmEydwwAAABnZm91NHlrMS55NXQMAAAAdzJqZHZs
+ MmIuZmJ3DAAAADJ4a3c0eHhyLnVpawwAAABneHFsaWdsMi5scHMMAAAAanN5dXl1emguZGhyDAAA
+ AGRkem5lMGpnLmV2NAwAAAB6d3pkdXBjcy5mMWMMAAAAbHZzYWFsYzEubWxqDAAAAHhheDBhZTVl
+ LnpjeAwAAAByZmRncm4xZS5yZHYMAAAAc201MnV4bm0uYjMwDAAAADF2cWt5NWZhLm54ZwwAAAB5
+ Y3lreGVnYy4zYmwMAAAAajNqMnV5ZGIuZ3JmDAAAAGh6aHozNG1mLnB6NAwAAABhMHJzaWUxci5p
+ cTUMAAAAMGp1cmoyMWkuNDAzDAAAADAyM3c0YnJ4LjNzMAwAAAA0em95YjRzdy4zbXMMAAAAcGlv
+ MnM1MHAueGprDAAAAHBpYWpibXpyLmgzcgwAAAA1ZDMxeW5ndS54a3IMAAAAZ2dlMGMwdWEucmsw
+ DAAAAGpvZHIxbHVjLmk0cAwAAAAxcmNrZDN5NC5pbWoMAAAAeGxhbXhwZ3YuMWp0DAAAADJlMGsz
+ MWJwLm4xdAwAAAB1MW1sazF3NC52bjIMAAAAa3Y1YWhldmoudjBuDAAAAGMwdDVyMm9jLnI1cAwA
+ AAB4d20wdGt2bS5xbHkMAAAAdWpqcW9pM3IuamoyDAAAAG5sdHl0amd4LjN3YQwAAABoZmF4Mnhy
+ di5yc3YMAAAAdmdyYnlxdXYucXQ0DAAAADFqc3d4YWh3Lnk1awwAAAAza3Ftb3d3di5ia24MAAAA
+ ZDFocWk1dmMuY20yDAAAADFxMGRseGNpLmhjcgwAAABkemJsazRyai52ZHYMAAAAZ3loeDBwNXQu
+ ZGlzDAAAAGNsaWY1b3h2LnQwbgwAAABwYm52dzJ2Yy5oMDUMAAAAaWUxajNldXoudmMyDAAAAGNq
+ cnNjaWp3LmJzcAwAAAAxcGxtbjN3ai5kZzIMAAAAd3BxeW15cWMuZXBvDAAAADNteGpyYTBhLjVu
+ dAwAAABhcGxhZTVocS5ibG0MAAAAc3VjajQwcG8uMzRjDAAAAHpiY2twcDQzLjV1agwAAABhbG5s
+ YjRlNS5ibnkMAAAAYWl3amdzcWUuZW1mDAAAAGswbzFsbTUwLmNxYwwAAAA0cm1tbDVlYi5xZXAM
+ AAAAYXBpbWdvdGYueXE0DAAAAGF6b3Jwd2QwLmR3NQwAAAB5M2x0ZGkzYi5xZXMMAAAANHhvbHRm
+ cDAuZDV0DAAAAGhocDI1d2FpLnFxMAwAAAB4Y21obGJ6NS5paXIMAAAAbnpqd3p6MGYudmprDAAA
+ AHhyMTFmNHVuLjJidQwAAAB3ZGhqeHBuei5neG0MAAAAMnh5bGlsM2wuazF4DAAAAHZzMXZqd2cx
+ LmdqMgwAAABrMHRzbjRmaC5va2wMAAAAZDFqb2N6MmQuaHljDAAAAHF2MmpucTVzLmx5ZAwAAABx
+ ZHpwNWRyby4xcXcMAAAAa2ZhYmkzdHYuaXRmDAAAAHB5NG9xeWRiLjJ6MgwAAAAyNGV0dGMwdS53
+ MGgMAAAAZGZkNDN6dHcubWlyDAAAAGF6Zno1eWk0Lm8zagwAAAAzdDV1d2Ruby5tdHoMAAAAb3ls
+ ZjF4aHguZ2RqDAAAADR5bnAwdmFuLnpidQwAAAA1enF4bXZqcC4yNTUMAAAANXFnc3F0Y2QuMmpk
+ DAAAADRuMm5kMGlvLm53ZAwAAAAxMm1qNWlrdy4yY3MMAAAAY3ZvZnd1dmwucXhnDAAAADBobHU1
+ ZnJ1LmRjcwwAAAB4NGpoNXBkci51bzUMAAAAcWRxNHdib24ucWFyDAAAAGhvMHBhbHF4LnNocgwA
+ AABhMmJ0bWJ5YS5xZ2UMAAAAbGk1b3NwamouMGxsDAAAAHpldGgyMTFkLjBoYwwAAABsY2Y0NXky
+ bi52bjQMAAAAZXpvemI0M2suYTR6DAAAAHR1ZHVoanlyLmdnbwwAAABuZHBqaXJneC5rbHUMAAAA
+ MnBsbXVrdHIuYnB4DAAAAGhmeGxnb3RjLmcxYwwAAAB2cGtiMTF5Zy5pMHEMAAAAcW4ybmpvMTMu
+ Z21sDAAAAHJpY2o0eGs1LnBqbQwAAABqZ2RuMmN5Zi4zYW4MAAAAZDB3aGk0djEuY2wwDAAAAHAx
+ bGdncnVzLnB5bAwAAABqb3R3cW95ei5jZjUMAAAAM3p1cnZ3Y2oueWZnDAAAAGkxcGFkdnVuLm96
+ bgwAAABhdGhucnJ6di5pdG8MAAAAc2Nmc21zZzQuc2lsDAAAAGdxZGp0MXNtLnZ4bAwAAAAzMG1i
+ aDNraS5rYm8MAAAAZzRoZnNoYWwuY2JpDAAAAHZlbmptanFtLnRmegwAAABhNTVpdnQ0My5zcWoM
+ AAAAbGY1cG14YXguYWJ6DAAAAGdtb3cwcmI0Lm13egwAAAByM3Nlemh6ai5xZzIMAAAAMGN2NHh6
+ dzUuaXU1DAAAAHlzMjMzZm52LmNscAwAAABzaDJuZ2Fvdi5lY3QMAAAAbXFudG4ybXEuend2DAAA
+ AG8ydHFzM2NuLjBxcgwAAABycnF5ZWt6di5pcnQMAAAAcDVxMXkzdmQucDV5DAAAAGUzYzVtY29q
+ LmExcAwAAABtNXNxd2Nkai5vbHkMAAAAeW1uaG40bGguZ2lpDAAAAGZ0ZmJrbXlyLmoxMgwAAABo
+ c3ozcWdoNC53MTMMAAAAZWN0Zm9paHMuenV1DAAAADVsbHl5b2dhLmp0cgwAAAB2cmd5Mnl0eC5k
+ MzMMAAAANXA1YW1ja2wuam1sDAAAAGdrZXpkZmNzLjAwdQwAAAB0MzF2eHViaS55cmIMAAAAZzJ1
+ MzJrenQudGllDAAAAGEzdG9nZnBjLjJ4MAwAAABrYzM1cDF2bC4wMXYMAAAAaml0MW9zNXcuanVj
+ DAAAAGVia3h2bXExLjJ0aQwAAABqYnd6cXVvbC54cDAMAAAAaHJrM2JwaHYuaW5qDAAAAHkweWNj
+ bTQxLnQxbAwAAAB3aW55a2FtZy5rMjMMAAAAaGtpamsxNTMuZTRwDAAAAGd4ZHprY3phLm1zbgwA
+ AAAzaWtwa2tteC5xZjIMAAAAYnRoc2dnNXQubnl4DAAAAG50M21pdGJ0LmowNQwAAABwamdpNTBu
+ MC41cWYMAAAAM25uZGNobWcueXZrDAAAADRhaXdwMWVhLjI1dAwAAABobXhjMmxqcC5ja3cMAAAA
+ d2lveTF5bmIuZ3gxDAAAAGdjdDNqbzEzLjJwMwwAAAB0cTB1MnZwbS4wdDMMAAAAb21ncW53dzEu
+ eTUxDAAAADIzcmVlbjI0LngzMgwAAAB6amVheWVzZy56dWsMAAAAZ2trd2x4MGYubnNvDAAAAHpz
+ dWl2em1jLnRmMwwAAABvMmt4bXBicS50bXEMAAAAdHBhbzNsMmgucG9zDAAAADBmbXozdHNxLndz
+ cQwAAAA0dDIxaDB0Yi56dDIMAAAAZXp1anB2ZXkuaWs1DAAAAHNoY2RzeW9nLmRlMwwAAABpdmt3
+ ZWxteC5kaHoMAAAAc2JvNHRjeXcuNHV3DAAAAHJzbnpkbWExLmFlcwwAAABjYXd3YW5pbi5nYncM
+ AAAAajJvNXdkcncuZ3VrDAAAAGF5MHVodG9mLnN5ZQwAAAAwYnQ0d2l6bi4yaWwMAAAAeHFtamtv
+ NTUueGZwDAAAADVvdnlydHptLmQxawwAAABsY3VoaDR3cC5ldzMMAAAAYWJ6cGhhMTEuM2tkDAAA
+ AHZ2MWVkcnI0Lm1rcAwAAAB1aXEwajFrei5yNXcMAAAAeHFydWd2NG8uYWpkDAAAAHo0a3hibjVm
+ LmJjcAwAAAB5ZGVzcGpjZy5pajUMAAAAb25yMHJvZGsubGN6DAAAAGoxd2Z3eGVhLnMyNAwAAAB0
+ cDRtNXR0dC53bXgMAAAAcGpkY3Bzd3MuYWoyDAAAAGtrcXgza25qLmh2ZgwAAABwdHJubm5jeC41
+ ZW8MAAAAc2I1MTJ5YmouM3JjDAAAAHExenBoamN2LmNpaQwAAABwdGNka2ZxYy55M2MMAAAAZGl5
+ bmJjc2gueHR1DAAAAG8yYTFiZjVoLmJlMAwAAABwMDBhc2psci5rengMAAAAM3hwYnRmYXMub2R5
+ DAAAAHNwZmZ3bHhwLjRtcQwAAABjZGMxd25iay5sbWgMAAAAYjBvbm5ueTQueHkxDAAAAGJ0cXdr
+ NWpmLnhjYgwAAABncTR4c3dxdC54ZjIMAAAAeHNheHVzbmsua2pzDAAAAG9pYzE0azI1LnducwwA
+ AABsdnpvdzRpMy5jNHYMAAAAankzbWtueGUuajJ0DAAAAGxnNXI1ZnFnLmJwNAwAAAAxZWFqZ2Js
+ aS5tcGQMAAAAbzBydHh1YmcuMWdnDAAAAG1panliYXlrLjRtNAwAAAAxNW9wZjIydC56aW0MAAAA
+ MGJlaDRta2QueWVrDAAAAHVjc2pka3FxLmJpbAwAAABwbjRndzJwZC5nZXMMAAAAem92ajRqYjUu
+ MXVhDAAAAGMyMjN6Y3JsLmljcgwAAABiamp0NWRhNC5heDMMAAAAMnl6a3Fvc3kuZ3Z5DAAAAGJr
+ NGVwa2hrLnVhdQwAAABzbG40cmZxYS5jMnAMAAAAdnB4aXh1dnEuMmR0DAAAAGtpdDJndzFhLmMz
+ dAwAAAB3ZWowcGhmbi4xa2sMAAAAdHh1aGhxcGUuNDEwDAAAAHhzeHR3NGgyLmZjdwwAAAAzZm4y
+ cmR0NC5qZmMMAAAAYmdpMnN0YTEuams1DAAAAGlxbmRvamJqLnA1YgwAAAB1cG4zYnh5bS53NTAM
+ AAAAbmdkdDBybnIueGtzDAAAAGN2M25tMjJlLmN3MQwAAABqZmZqeWE0bC41aWoMAAAAcmJhbXB0
+ NGkub3JrDAAAAHdveTFvZ3N0LmIyMAwAAABicHcyNHN6dy50am0MAAAAd3pmams0bDIuc2l0DAAA
+ AHYxcXRtZzFlLnV0cwwAAAByajJjcWRycC5taDQMAAAAMGU0dWRxd3cucG9qDAAAAG5lazV6c25y
+ LjB0MAwAAAA1am9zZG5oZi5ndmYMAAAAbXd6aXA0MWkuaTQ1DAAAAGlqZmsxc2l0LjR3eQwAAAAx
+ bXZ1eDFzcS55cHEMAAAAZnpiZ2JocDUueW1xDAAAAHVpMTFkenFuLnR0bAwAAABqMTBiMDNsaS54
+ NGMMAAAAMXJ4MHFuaXQueW96DAAAADJzc2puMWF2LnptbAwAAAA0bWMxMzR4dy5yNGcMAAAAaXRl
+ aTVxa3oudXZiDAAAAHIxMWlkZW5sLjBycwwAAABzaWoxMDU1eC50eGsMAAAAamIxMTJkYnQuY3Z2
+ DAAAAGIwd2tncGFuLm5xawwAAAAzNXBlamIzZC5mZDUMAAAAMm5oeHB4MmQudDNlDAAAADFkbnhr
+ bzRxLmRhdgwAAABhdzB5cWZwby4xbTIMAAAAb2U1MnN0cXguMnJsDAAAAHBubGhjd2t6Lmt4MwwA
+ AAB4bGdvNHgxdy5odXUMAAAAbzRrNHJvNW0uMmdiDAAAAGF1azJ3dHhnLmVmMAwAAAB3ZzBkYWwz
+ Zy50bXIMAAAAa2p4MGVyb2EucGYwDAAAADJnNHlwdHVlLjMzegwAAABoMjNpeXJlZS5qaWoMAAAA
+ aGR0dzNsZWouaHdyDAAAAG5zY3JjdXkyLjFkbgwAAABrY2ZudjJzcS5qMGUMAAAAMjJxMHB3Mmwu
+ NWZsDAAAAHhoZWd5d3Z6LncxYwwAAAByMnhzaTVtaC5wbzEMAAAAcHp2dTV5bXYudXh3DAAAADVx
+ ZGRrYmJiLnFnbgwAAAAzZnM0ZDBnMS5qeHcMAAAAZW9meW9ueDUudHpoDAAAAHd2djRwcW0xLmV4
+ dAwAAABweXZudXJ0ZC4zZGMMAAAAaXhlNGF0czQudHEzDAAAADFycjMxNGcyLmQyeQwAAAA1YmRz
+ eTR1cy4yMmQMAAAAamxiMGJ0enIubGt3DAAAADR1MGhiYWQzLnhyNQwAAAB2dmdrbDJjby4yeXQM
+ AAAAa2c1anNqNXIubG96DAAAAGkyaDNoZ3NhLnhkMwwAAABudnVkMTNicC5iNTQMAAAAYnAza21y
+ d3AuNHUzDAAAAHd3MGFzc3l4Lmp6MQwAAABvaGJ1dXNwdS5ha3cMAAAAcmNpNHpxemQuNHNmDAAA
+ AGZ1b2pmcTQwLmZ5dAwAAABtYXBiazJpdS5jNHEMAAAAanUxdm8wbG8ubHF5DAAAAG1hMHNxZXRq
+ LnF4cgwAAABxbnd1dGx6YS5neXkMAAAAamtybnJkdTMucW5vDAAAAGF2NHNsZ3cyLm5qNQwAAAB4
+ a2xpamN2ai4zcjEMAAAAc3cxYnZyMHIucWN3DAAAAHZydnI0amFwLnJkMwwAAAAzM2pqYXBhcS5x
+ bGMMAAAAczFwZ3psaHgueXRwDAAAAHBseDN3aWh0Lnp5bwwAAABwY2llMGp5Zi4ydGEMAAAAd3No
+ cmV0dGYubzAyDAAAAHNyZXZ3eGN4LmY0dwwAAAAyZjNleW4yeC5nc2MMAAAAZXF3MGFsZnUud2Jr
+ DAAAADBpdDFtZnhzLmpxMAwAAABpbHl4dXR4ei5tNXoMAAAANHJobG9pcjAuaTAzDAAAADJ2b2Nm
+ ZzNtLnhycwwAAABkd295eWllaC5wZWMMAAAANWIycGk0NWEuZGk1DAAAAHlkbWRrMWJwLmtlaQwA
+ AABqaWRjNW5paC41enEMAAAAMDJnYjJ6aXQuM3VtDAAAAHE1ZmFjM2p6LnczaQwAAABnZmswc2Jj
+ My5wYWsMAAAAd3Nnd3B0d2IubG8xDAAAAGRtd3FycXpvLmthdQwAAAB5ZWVrbGp3YS5oZWwMAAAA
+ dHpoNHN2dTIuaHp6DAAAAHBjbXhrMWZuLjRseQwAAABjMWt1M3p2bS5hMXAMAAAAa2owMDExNWUu
+ dXZnDAAAAGJuNHN5cWdrLjBjMgwAAAAyb21sNWJ2NS4zdGsMAAAAdzB5eHBjd3cubWwwDAAAAGQx
+ ZmNqYmsxLnFseAwAAAAzcmhvM3Rkdy51MnoMAAAAb2FrdGoyZGMuZjVuDAAAAHoyaTF4MTIxLmY0
+ eQwAAABra2lldXZ0NC5zY3gMAAAAeHJweXVia3kub2NwDAAAADVieXR0Z29oLmRtMgwAAABkYXYz
+ Ympvdi5waTIMAAAAb3NoaWh4ZG8ueTFwDAAAAG0wYnJramU0LngwagwAAAB4ZHU1ZXg0cS5memUM
+ AAAAeGVnNDBib2QudWp3DAAAAHBnMXYzczJiLjN0egwAAABuc2FqdWY0ci52dGcMAAAAY3FrdWtz
+ bHIuMjJwDAAAAGZ2dmh3aWs0LjF0NAwAAABkanRudmJwdC5seHQMAAAAa3Nkdm1wMzEuenNzDAAA
+ AGF3cHczZGpiLjBnZAwAAABwb21kYzF0cS52amgMAAAAZHJqZm9pbnUuejQzDAAAAGYyc2NpaHI0
+ LjJubQwAAABweWR1bGNpYi56YzQMAAAAMDF3d3llNGcucGZzDAAAAGNxd2ZnaG11LnYydwwAAAB5
+ anphNGJrbC5ocWcMAAAAbG5qMmpyNW0udGJtDAAAAHl2MG9tcWl6LngxdAwAAABzYXNueWEyZC40
+ d28MAAAAem5iejRoYmQubHozDAAAAHZ6MzFuYXNzLjM1cgwAAAAxc2I0bnlsZy5yejMMAAAAYTQz
+ emVkaW4uMXYyDAAAAGV5YTUwcnZmLmg1YQwAAABkMXV4YnFkMy53bjQMAAAAMHRsNTU0bWYuZnMx
+ DAAAAHlmendwNHlxLnp5bAwAAAAwYXNiZHJuci5yYXcMAAAAbjNqeXZrdnAuZ3doDAAAAHJja3A1
+ c2ljLm1mawwAAABrZWVmcG1nYy50dGcMAAAAcXAwZXlrdDMucTRxDAAAAHowc3UwZ3c0LmxwaAwA
+ AABkNWZ4cXpldS5ua2kMAAAAbTVraGpscHcuZzMxDAAAAHRjMGtqeXF1LnV5ZQwAAABhaG5ncmlv
+ dS56bWUMAAAAaGVxa2R1bHUudHE0DAAAAHlwZHZ3MXRtLnN0dQwAAAB2ZHc0NG4yMC5lcHkMAAAA
+ bGN6aTQ1MnAuaWEyDAAAAGEwcmY1azRwLnQwcwwAAABhcWg0YWc0bC5uZ2MMAAAAZWNwdWE1cWku
+ bWd0DAAAADV3b25lcTUyLnJndwwAAAB3NW9rNWp2ZS5xbHcMAAAAMnpjcWJrZmEubGVvDAAAAGR1
+ eXpvNXVlLjNuYwwAAABqNG9nMnlzdS5sd2kMAAAAZGttcWp6ZTMuYjQyDAAAAGVmZ2FvcmRxLnhy
+ eQwAAAA0bzNhY3B0ZC41c3EMAAAAa2J5cHJpMm8ubGJnDAAAAGtxZ253ZXJ4LnB3dwwAAAB6dXRn
+ enA1bi52enUMAAAAZHZycHZ5M3EuejJzDAAAAHNidjFqcGh3LmdyYwwAAAB6ZDFoaDFsdy5wZGwM
+ AAAAYW1veWtvZGkuNW9nDAAAAG1uMWkzYjMzLmF5YQwAAAB2cHllbGFvci52M3IMAAAAeWpibmgw
+ cGouMzF2DAAAADMwcndocHBsLmt1NQwAAABrdWJwcWxvYi53MXkMAAAAazNsZm9pbWEudGtmDAAA
+ ADNleGlsbXB2Lmp6aQwAAABsYWF1bW1nby51em0MAAAAMHIwcTV0bHkud2ZwDAAAADN4YTBxZ2x5
+ LmljcgwAAAA1NHBhMnBtdy5yamkMAAAAYW9nZWs1dzEudzMzDAAAADNvZ2t3cWVvLmhpaQwAAABp
+ ZmxlaTFuMS5idGsMAAAAYmxkd2R0b3Uudmk0DAAAAGFiMXNhdGo0Lm1xdQwAAABkd2ViZGwwbC5t
+ cjIMAAAAYTRxZG94ZWsuajMxDAAAAGszMHA1c2NuLnRsMwwAAAB1MHoxMHloby5pbXcMAAAAY3lr
+ ampkMWMuNGd5DAAAADVqM2wxMHEwLnlmcgwAAABhdXF6cmp1aC5ld2QMAAAAemdubGx6bnUuc3Fv
+ DAAAAGI1ZjNmcWRpLjB5NQwAAABzeWpobG9pby41YnMMAAAAcDVucm4weHkuMmkwDAAAAHVkeGxj
+ dmdtLmpnagwAAAAzZmMwZXdibS5lYXUMAAAAejFkMHVvdDAudnNqDAAAADIzeTNzZnFjLmZnZAwA
+ AABxMnRmYjB2ay5uMmQMAAAAa2xieXcwczUuZ2ozDAAAADN0bWhjaHExLjFxdQwAAABjZXU1M2o1
+ dy5rcXYMAAAAbWRjcGVld2IuNXhxDAAAAHl6MmFpd3k1Lm9scAwAAABidHZycTFiZy5jeXIMAAAA
+ eXlhbGJ1Y3MuYW5nDAAAAHAzeHRvcDFpLnFlZwwAAAB3ZXdrM2dmZC5uaW0MAAAAZm1qb2d4b2cu
+ NTU0DAAAAGVydTJsbmowLnN1dAwAAAB6bG5xa3hnYS53MHIMAAAAZXgxeDB1MXUuYnpuDAAAAHZm
+ eGJidWFkLm5tNQwAAABidmo1eWxwZC53ZnYMAAAAZW5rY3FzNTUudGx0DAAAAHdsZzBxcWh2LnNy
+ ZwwAAABvZWVrcjJ0eC51aXkMAAAAdmh0aTB3cXAudWYxDAAAADV0cXh0enYzLnk0cgwAAAB4ZXdl
+ bGRrdi56YXEMAAAAamJ4YzB3dWkuMWlkDAAAAG9rdXB6MnN2LmhmaAwAAAB1MWJ5eDFlbi5taXIM
+ AAAAaGhwejQyeHQuZ3F4DAAAADBxbDMzZXk0LmMwagwAAAA1bTVsbjVsbi4wdTIMAAAAcnN0a2Jx
+ dWwudWQyDAAAAG94MDQ1azFvLmdtbwwAAAB0dWRrcW0wdS50dmwMAAAAY2ZjMWlvam8uNGluDAAA
+ AGozcGM1c20wLm1sYwwAAABpc2Q0MGpzdC50ZmcMAAAAazM0ZHdjd2IuejNtDAAAAHZleDV1c2Rv
+ Lm1nYQwAAAB5ZWpnb2d4by55bnAMAAAAdjRvbjB1bGwucHlmDAAAAHB3MmUwbHpzLjVnawwAAAB2
+ enEzMW94Yi50djMMAAAAeHFzMGthZ3QueTV4DAAAAGhyYmlrNGllLnNndgwAAABjZWtsNDBzaS5y
+ cnkMAAAAMDV0Y3h0MmwucXo1DAAAAHF4bHZnczFiLnVjbAwAAABnMndsNDBrMS5qeTIMAAAAdWEx
+ cnIxZGwudWVlDAAAAHFzdWdueXZmLnhycQwAAAB6bXoxd3V0dC40bzAMAAAAYTJuajNxZ3kuajR6
+ DAAAADUxeW01YmhxLmVybAwAAABpMXJsMnBlYi5odmoMAAAAcWJyanptcnUubWZqDAAAAHljNWdr
+ Z3lsLm1wdAwAAABkZDV3dGh5aS5xeGcMAAAAa3dlZHV2cG4uZnRhDAAAAGFqZDNkdjBoLmtqYwwA
+ AABocGdudG5qaC56dHIMAAAAeDRmYWF5b24uemd6DAAAAGRleDR4YjVsLnJtbQwAAAA1NWZvcXJy
+ bC4ybXUMAAAAd2lrdXB4b2ouc2V1DAAAAHVkYWxnenR0LmMzbwwAAAA0czJ6aG15cC4waTEMAAAA
+ MHB4MWRpY2wucWd3DAAAAHVxYTF4bGRxLnQydgwAAAB1MXF1aHRzdi5xdXUMAAAAMnMycmJmdm8u
+ anZpDAAAAGQ0bDQwbGJxLjUwZgwAAAB4YTNsajR3Yi5udHYMAAAAam9jZnc1dmQubG5tDAAAAHow
+ YmNsa2R1LmNwawwAAAB3MGpvZ3BzMS5hNXUMAAAAMDM0bDBvaDEuNWh2DAAAADNzY3Vzd2JzLnl3
+ aQwAAABidXp6MmpuMi52MzUMAAAAa2V0c2IyeHQuaXgzDAAAAG01a3RycmtsLmJmNQwAAABkeXVq
+ MXRydC5rdXgMAAAAYzExcG9lMDMuaHJjDAAAAGJvd2lyZDQzLmI0YgwAAAB6M2E1eDR6dS41em8M
+ AAAANWw1MWswdGsueGRsDAAAAGZzNXgyYWxuLmpkZwwAAABpcno1aHAxcC54dzEMAAAANDRobGZs
+ djQub2lpDAAAAHVzMzMyMDJyLm1tbQwAAAAwZGV2aGIwMC5lbm8MAAAAeWdva2FscHQubXpuDAAA
+ AGx5ZmNscmh3LnJ0NAwAAABka3hrY2l1ai4zZnAMAAAAemtkbHNwcjEuaHQyDAAAAGE0aDNvMmFy
+ LnBzNQwAAABxd2YwM2lxZC5oZmUMAAAAanl0cHZ2YWEudWYwDAAAAGFvdno1ZjRhLmlhMAwAAABj
+ djFlMnhvdS4xbngMAAAAbGFsbzVncmoueWV6DAAAAHgzanRjbzRjLjJsaAwAAABycDR0c3ZibS5o
+ a2kMAAAAeTB2MjM1eG4uMG5mDAAAAG56eDR2MXBpLmNlMAwAAABocWFleXd2by5zazAMAAAAcXMw
+ YmRudjEuNDVjDAAAAGhpM3p5cjFsLmlidgwAAAB6YzJoM28xdy5iMnUMAAAAZ2F5eXo1dDUuNWNl
+ DAAAAGZhZXEwdTNrLmZndQwAAABtcmZwZ3FzdS5ldm4MAAAAY2hlbTRsb3kuZnMyDAAAAGlyc2xn
+ b2hkLjVibgwAAAB2YWR0YXNsaC5oeGIMAAAAZnhpMmwyeXAuNGdhDAAAAGd1aHFibjExLnVyagwA
+ AABmcTJ5bmZiMS5tb3IMAAAAZm50aWR4dHEudDJjDAAAAHNxenZhcnQ1LnlmZgwAAABnbDEyZ2Zx
+ My5nZWYMAAAAcWNtYmpha2cucGc0DAAAAG4wanFyaDNjLnBtdQwAAABpNGdmdmN0Zy5sa3gMAAAA
+ eW1vNXlsengudmt3DAAAAHZ1bWFocGV0LmVqMAwAAABza254ZXVhby41eG0MAAAAdHF5bmFoaGcu
+ dW8zDAAAAG4zMm00aGVkLnRtcgwAAAAwcHVpbjRwdy54NHAMAAAAbGgxZTBjM3QuamNlDAAAADBj
+ eXBuZGVwLjNrdwwAAABrdWg0NGp3aC53c3IMAAAAb3UzNDFwd2sud2lxDAAAAHBobWZtZ3dkLmli
+ cAwAAABhc2szdXNzcy56YjUMAAAAaHgwYzFnZmIudXQzDAAAAGFxaWloMGxlLnYyawwAAABleHVl
+ aWVmZi5sc3gMAAAAa2pmMG9ubmIueTNiDAAAADJ5dG1vZHpwLnMyZQwAAAB3NHczZjUyai5vaGEM
+ AAAAajJuamJtZHEuMTRhDAAAAG1xenExcGptLnM1NAwAAAA1ZjBvb2h4My4xamsMAAAAaWJxcjUw
+ anAudmVnDAAAADFsM3phZ3F4Lm80cQwAAABueGN4MzBpbS4wdDAMAAAAb3ZkYmVnZGcuMWRmDAAA
+ ADR3MTJncHAzLmRycwwAAABxMnlkYjJtci4xNGQMAAAANWZyZHJqNG4udmduDAAAAGtua3B5MGtv
+ LjFucAwAAAA0aW54a3YzZC54eWgMAAAAYm1ucnBscWcuMHdxDAAAAHh5Z2U0ZDM0LjQ1eQwAAAAz
+ bGN1aGZpcS4yYWYMAAAAeGtpNXYxMGguZHkzDAAAADA0bWJzeWJzLnAzdQwAAAAzZXlpYjNqMi5s
+ Z2sMAAAAeHlxZXE1ejMubTRhDAAAAGtqcG9ud3hqLnNjYwwAAAA1a3EyYm0wby52azEMAAAAcnNj
+ c21uNWkudzFuDAAAAHptNWtpY3JyLjV4ZgwAAAB3dGVvdHcxci54dW0MAAAAcXZkMDIzemguYmNw
+ DAAAAHlranlrY3F4LnJqMAwAAABqZHQxYnV0Zy41d2UMAAAAbW53ZjJnbXUuM3hxDAAAAG1nb2Vr
+ dTNhLnl3ZAwAAAA0bnAwdGdoNS5ybWoMAAAANHF2c3JndnIudnBqDAAAAHhjZGN6cnl4LmZhcgwA
+ AAA0azEwdnV6by56d3cMAAAAb3NhZHYyeWouc2RnDAAAAGx4c2VsYXF2LjJjYwwAAAB2dGkyMDE0
+ di4zY3YMAAAAaGNhMGx3cjMueGp0DAAAAGJqbnIxMHN6LnM1eQwAAABzcjVvZ25jNS5ocHMMAAAA
+ YTJqaHRxeWIuczVjDAAAAGtmZG92aXptLmljdwwAAABvZDMzNDVvMS41MXoMAAAAY2VzM24zdjIu
+ dm53DAAAAHZycDBncG1mLnkyYQwAAAB2MDFmYWJsYi41djUMAAAAanIwZnRoYWYuNWJ1DAAAAG4x
+ dnYxdHN1LjFpbAwAAABnZjFiaDV6by5iNWkMAAAAY25sNHhpM3Uuc2NkDAAAAHMxaGpub2t0Lmx3
+ agwAAABqbmE1em0wYy5hb3gMAAAAY2phenp1bXguNXE0DAAAADVvaW81bWN4LnoxMQwAAABrbm41
+ cW1ueS5kbDAMAAAAbTNkd3JxMmEuMnJ2DAAAAGJ3YmlmM20zLm94YgwAAAB0aXdpb3VsaS4yMmMM
+ AAAAMXU1cjFuYXoueWhjDAAAAG52MGgxNHRzLnBpeQwAAAB3cnNzY2htcy5obWEMAAAANXF4MG81
+ MmIuZnlwDAAAAGJuNHJ6aXNyLjV5cwwAAAB1cmZvMmJxYi51Y3cMAAAAc3ZlZ3Rpb2UuaWNzDAAA
+ AGZ6aWpmcGpsLmMwagwAAABnM3lwdTJobS5qanQMAAAAd2llaG1mejIuMTJkDAAAAGQ1eXViM3Nu
+ LmRoagwAAAAyZnZ3eGlsdi5pd2gMAAAAdTV4NWtwMXguenJlDAAAADEyc3Q0MDVnLmJ4dQwAAABu
+ cWZtMWJvZS51ZG4MAAAAdGxhczJ6Z2QuZWswDAAAAG0xdmhyMWl6LnhucgwAAAB6cHpuNHczeC5u
+ M20MAAAAYnNqbDBudmkuaW5oDAAAADJ0amlwd2J6LjR5NQwAAABnZ3BrZGxvdy5vd2QMAAAAZHpo
+ M2NmYXguNWZmDAAAAGlnM2x0ZWdkLjVpNQwAAAA1eTBnZWszdS5pMm4MAAAAa2JiZGEza3MubWl0
+ DAAAAG1mbzF0amV4LjR5bAwAAABlNXFpNXppYS5sMXgMAAAAeTRjNHZsM3EuMnF6DAAAAGRhZHht
+ MjN4Lmx4cQwAAAB6amlqZGV2cS55bmEMAAAAM290ZXByancubW93DAAAAGQ1NXA0b3BjLng1aAwA
+ AAB4bGE0NGYxaS5jbmIMAAAANTFiNWZndXkuaDB4DAAAAGdsb2RnM2lmLmlyMwwAAAAwZGR2anNh
+ ZS5vdWYMAAAAZG5qd25lcnYuZGZ4DAAAADRoYXA1c3ZsLmowMQwAAAB2a3JsbHFndS5zemcMAAAA
+ MTEyYnFwcWYuaWMzDAAAAGtwNHhyeWdmLm9tawwAAAB1dWx6bmFwdS4yaGQMAAAAb2V6cmgwc2ku
+ ajJ4DAAAAHNudnF3aGkxLml3aAwAAAB6aWZsa24zcC5sMGoMAAAANGJ5ZnhkMDUucGJxDAAAAGRs
+ c2Fpb2FzLmhzMwwAAAAweGZhdDNxei5vYWkVABWOfRWOfSwV0A8VABUGFQYcGAQxOTk5GAQxMDAw
+ FgAW0A8YBDE5OTkYBDEwMDAAAAADAAAA0A8BBAAAADEwMDAEAAAAMTAwMQQAAAAxMDAyBAAAADEw
+ MDMEAAAAMTAwNAQAAAAxMDA1BAAAADEwMDYEAAAAMTAwNwQAAAAxMDA4BAAAADEwMDkEAAAAMTAx
+ MAQAAAAxMDExBAAAADEwMTIEAAAAMTAxMwQAAAAxMDE0BAAAADEwMTUEAAAAMTAxNgQAAAAxMDE3
+ BAAAADEwMTgEAAAAMTAxOQQAAAAxMDIwBAAAADEwMjEEAAAAMTAyMgQAAAAxMDIzBAAAADEwMjQE
+ AAAAMTAyNQQAAAAxMDI2BAAAADEwMjcEAAAAMTAyOAQAAAAxMDI5BAAAADEwMzAEAAAAMTAzMQQA
+ AAAxMDMyBAAAADEwMzMEAAAAMTAzNAQAAAAxMDM1BAAAADEwMzYEAAAAMTAzNwQAAAAxMDM4BAAA
+ ADEwMzkEAAAAMTA0MAQAAAAxMDQxBAAAADEwNDIEAAAAMTA0MwQAAAAxMDQ0BAAAADEwNDUEAAAA
+ MTA0NgQAAAAxMDQ3BAAAADEwNDgEAAAAMTA0OQQAAAAxMDUwBAAAADEwNTEEAAAAMTA1MgQAAAAx
+ MDUzBAAAADEwNTQEAAAAMTA1NQQAAAAxMDU2BAAAADEwNTcEAAAAMTA1OAQAAAAxMDU5BAAAADEw
+ NjAEAAAAMTA2MQQAAAAxMDYyBAAAADEwNjMEAAAAMTA2NAQAAAAxMDY1BAAAADEwNjYEAAAAMTA2
+ NwQAAAAxMDY4BAAAADEwNjkEAAAAMTA3MAQAAAAxMDcxBAAAADEwNzIEAAAAMTA3MwQAAAAxMDc0
+ BAAAADEwNzUEAAAAMTA3NgQAAAAxMDc3BAAAADEwNzgEAAAAMTA3OQQAAAAxMDgwBAAAADEwODEE
+ AAAAMTA4MgQAAAAxMDgzBAAAADEwODQEAAAAMTA4NQQAAAAxMDg2BAAAADEwODcEAAAAMTA4OAQA
+ AAAxMDg5BAAAADEwOTAEAAAAMTA5MQQAAAAxMDkyBAAAADEwOTMEAAAAMTA5NAQAAAAxMDk1BAAA
+ ADEwOTYEAAAAMTA5NwQAAAAxMDk4BAAAADEwOTkEAAAAMTEwMAQAAAAxMTAxBAAAADExMDIEAAAA
+ MTEwMwQAAAAxMTA0BAAAADExMDUEAAAAMTEwNgQAAAAxMTA3BAAAADExMDgEAAAAMTEwOQQAAAAx
+ MTEwBAAAADExMTEEAAAAMTExMgQAAAAxMTEzBAAAADExMTQEAAAAMTExNQQAAAAxMTE2BAAAADEx
+ MTcEAAAAMTExOAQAAAAxMTE5BAAAADExMjAEAAAAMTEyMQQAAAAxMTIyBAAAADExMjMEAAAAMTEy
+ NAQAAAAxMTI1BAAAADExMjYEAAAAMTEyNwQAAAAxMTI4BAAAADExMjkEAAAAMTEzMAQAAAAxMTMx
+ BAAAADExMzIEAAAAMTEzMwQAAAAxMTM0BAAAADExMzUEAAAAMTEzNgQAAAAxMTM3BAAAADExMzgE
+ AAAAMTEzOQQAAAAxMTQwBAAAADExNDEEAAAAMTE0MgQAAAAxMTQzBAAAADExNDQEAAAAMTE0NQQA
+ AAAxMTQ2BAAAADExNDcEAAAAMTE0OAQAAAAxMTQ5BAAAADExNTAEAAAAMTE1MQQAAAAxMTUyBAAA
+ ADExNTMEAAAAMTE1NAQAAAAxMTU1BAAAADExNTYEAAAAMTE1NwQAAAAxMTU4BAAAADExNTkEAAAA
+ MTE2MAQAAAAxMTYxBAAAADExNjIEAAAAMTE2MwQAAAAxMTY0BAAAADExNjUEAAAAMTE2NgQAAAAx
+ MTY3BAAAADExNjgEAAAAMTE2OQQAAAAxMTcwBAAAADExNzEEAAAAMTE3MgQAAAAxMTczBAAAADEx
+ NzQEAAAAMTE3NQQAAAAxMTc2BAAAADExNzcEAAAAMTE3OAQAAAAxMTc5BAAAADExODAEAAAAMTE4
+ MQQAAAAxMTgyBAAAADExODMEAAAAMTE4NAQAAAAxMTg1BAAAADExODYEAAAAMTE4NwQAAAAxMTg4
+ BAAAADExODkEAAAAMTE5MAQAAAAxMTkxBAAAADExOTIEAAAAMTE5MwQAAAAxMTk0BAAAADExOTUE
+ AAAAMTE5NgQAAAAxMTk3BAAAADExOTgEAAAAMTE5OQQAAAAxMjAwBAAAADEyMDEEAAAAMTIwMgQA
+ AAAxMjAzBAAAADEyMDQEAAAAMTIwNQQAAAAxMjA2BAAAADEyMDcEAAAAMTIwOAQAAAAxMjA5BAAA
+ ADEyMTAEAAAAMTIxMQQAAAAxMjEyBAAAADEyMTMEAAAAMTIxNAQAAAAxMjE1BAAAADEyMTYEAAAA
+ MTIxNwQAAAAxMjE4BAAAADEyMTkEAAAAMTIyMAQAAAAxMjIxBAAAADEyMjIEAAAAMTIyMwQAAAAx
+ MjI0BAAAADEyMjUEAAAAMTIyNgQAAAAxMjI3BAAAADEyMjgEAAAAMTIyOQQAAAAxMjMwBAAAADEy
+ MzEEAAAAMTIzMgQAAAAxMjMzBAAAADEyMzQEAAAAMTIzNQQAAAAxMjM2BAAAADEyMzcEAAAAMTIz
+ OAQAAAAxMjM5BAAAADEyNDAEAAAAMTI0MQQAAAAxMjQyBAAAADEyNDMEAAAAMTI0NAQAAAAxMjQ1
+ BAAAADEyNDYEAAAAMTI0NwQAAAAxMjQ4BAAAADEyNDkEAAAAMTI1MAQAAAAxMjUxBAAAADEyNTIE
+ AAAAMTI1MwQAAAAxMjU0BAAAADEyNTUEAAAAMTI1NgQAAAAxMjU3BAAAADEyNTgEAAAAMTI1OQQA
+ AAAxMjYwBAAAADEyNjEEAAAAMTI2MgQAAAAxMjYzBAAAADEyNjQEAAAAMTI2NQQAAAAxMjY2BAAA
+ ADEyNjcEAAAAMTI2OAQAAAAxMjY5BAAAADEyNzAEAAAAMTI3MQQAAAAxMjcyBAAAADEyNzMEAAAA
+ MTI3NAQAAAAxMjc1BAAAADEyNzYEAAAAMTI3NwQAAAAxMjc4BAAAADEyNzkEAAAAMTI4MAQAAAAx
+ MjgxBAAAADEyODIEAAAAMTI4MwQAAAAxMjg0BAAAADEyODUEAAAAMTI4NgQAAAAxMjg3BAAAADEy
+ ODgEAAAAMTI4OQQAAAAxMjkwBAAAADEyOTEEAAAAMTI5MgQAAAAxMjkzBAAAADEyOTQEAAAAMTI5
+ NQQAAAAxMjk2BAAAADEyOTcEAAAAMTI5OAQAAAAxMjk5BAAAADEzMDAEAAAAMTMwMQQAAAAxMzAy
+ BAAAADEzMDMEAAAAMTMwNAQAAAAxMzA1BAAAADEzMDYEAAAAMTMwNwQAAAAxMzA4BAAAADEzMDkE
+ AAAAMTMxMAQAAAAxMzExBAAAADEzMTIEAAAAMTMxMwQAAAAxMzE0BAAAADEzMTUEAAAAMTMxNgQA
+ AAAxMzE3BAAAADEzMTgEAAAAMTMxOQQAAAAxMzIwBAAAADEzMjEEAAAAMTMyMgQAAAAxMzIzBAAA
+ ADEzMjQEAAAAMTMyNQQAAAAxMzI2BAAAADEzMjcEAAAAMTMyOAQAAAAxMzI5BAAAADEzMzAEAAAA
+ MTMzMQQAAAAxMzMyBAAAADEzMzMEAAAAMTMzNAQAAAAxMzM1BAAAADEzMzYEAAAAMTMzNwQAAAAx
+ MzM4BAAAADEzMzkEAAAAMTM0MAQAAAAxMzQxBAAAADEzNDIEAAAAMTM0MwQAAAAxMzQ0BAAAADEz
+ NDUEAAAAMTM0NgQAAAAxMzQ3BAAAADEzNDgEAAAAMTM0OQQAAAAxMzUwBAAAADEzNTEEAAAAMTM1
+ MgQAAAAxMzUzBAAAADEzNTQEAAAAMTM1NQQAAAAxMzU2BAAAADEzNTcEAAAAMTM1OAQAAAAxMzU5
+ BAAAADEzNjAEAAAAMTM2MQQAAAAxMzYyBAAAADEzNjMEAAAAMTM2NAQAAAAxMzY1BAAAADEzNjYE
+ AAAAMTM2NwQAAAAxMzY4BAAAADEzNjkEAAAAMTM3MAQAAAAxMzcxBAAAADEzNzIEAAAAMTM3MwQA
+ AAAxMzc0BAAAADEzNzUEAAAAMTM3NgQAAAAxMzc3BAAAADEzNzgEAAAAMTM3OQQAAAAxMzgwBAAA
+ ADEzODEEAAAAMTM4MgQAAAAxMzgzBAAAADEzODQEAAAAMTM4NQQAAAAxMzg2BAAAADEzODcEAAAA
+ MTM4OAQAAAAxMzg5BAAAADEzOTAEAAAAMTM5MQQAAAAxMzkyBAAAADEzOTMEAAAAMTM5NAQAAAAx
+ Mzk1BAAAADEzOTYEAAAAMTM5NwQAAAAxMzk4BAAAADEzOTkEAAAAMTQwMAQAAAAxNDAxBAAAADE0
+ MDIEAAAAMTQwMwQAAAAxNDA0BAAAADE0MDUEAAAAMTQwNgQAAAAxNDA3BAAAADE0MDgEAAAAMTQw
+ OQQAAAAxNDEwBAAAADE0MTEEAAAAMTQxMgQAAAAxNDEzBAAAADE0MTQEAAAAMTQxNQQAAAAxNDE2
+ BAAAADE0MTcEAAAAMTQxOAQAAAAxNDE5BAAAADE0MjAEAAAAMTQyMQQAAAAxNDIyBAAAADE0MjME
+ AAAAMTQyNAQAAAAxNDI1BAAAADE0MjYEAAAAMTQyNwQAAAAxNDI4BAAAADE0MjkEAAAAMTQzMAQA
+ AAAxNDMxBAAAADE0MzIEAAAAMTQzMwQAAAAxNDM0BAAAADE0MzUEAAAAMTQzNgQAAAAxNDM3BAAA
+ ADE0MzgEAAAAMTQzOQQAAAAxNDQwBAAAADE0NDEEAAAAMTQ0MgQAAAAxNDQzBAAAADE0NDQEAAAA
+ MTQ0NQQAAAAxNDQ2BAAAADE0NDcEAAAAMTQ0OAQAAAAxNDQ5BAAAADE0NTAEAAAAMTQ1MQQAAAAx
+ NDUyBAAAADE0NTMEAAAAMTQ1NAQAAAAxNDU1BAAAADE0NTYEAAAAMTQ1NwQAAAAxNDU4BAAAADE0
+ NTkEAAAAMTQ2MAQAAAAxNDYxBAAAADE0NjIEAAAAMTQ2MwQAAAAxNDY0BAAAADE0NjUEAAAAMTQ2
+ NgQAAAAxNDY3BAAAADE0NjgEAAAAMTQ2OQQAAAAxNDcwBAAAADE0NzEEAAAAMTQ3MgQAAAAxNDcz
+ BAAAADE0NzQEAAAAMTQ3NQQAAAAxNDc2BAAAADE0NzcEAAAAMTQ3OAQAAAAxNDc5BAAAADE0ODAE
+ AAAAMTQ4MQQAAAAxNDgyBAAAADE0ODMEAAAAMTQ4NAQAAAAxNDg1BAAAADE0ODYEAAAAMTQ4NwQA
+ AAAxNDg4BAAAADE0ODkEAAAAMTQ5MAQAAAAxNDkxBAAAADE0OTIEAAAAMTQ5MwQAAAAxNDk0BAAA
+ ADE0OTUEAAAAMTQ5NgQAAAAxNDk3BAAAADE0OTgEAAAAMTQ5OQQAAAAxNTAwBAAAADE1MDEEAAAA
+ MTUwMgQAAAAxNTAzBAAAADE1MDQEAAAAMTUwNQQAAAAxNTA2BAAAADE1MDcEAAAAMTUwOAQAAAAx
+ NTA5BAAAADE1MTAEAAAAMTUxMQQAAAAxNTEyBAAAADE1MTMEAAAAMTUxNAQAAAAxNTE1BAAAADE1
+ MTYEAAAAMTUxNwQAAAAxNTE4BAAAADE1MTkEAAAAMTUyMAQAAAAxNTIxBAAAADE1MjIEAAAAMTUy
+ MwQAAAAxNTI0BAAAADE1MjUEAAAAMTUyNgQAAAAxNTI3BAAAADE1MjgEAAAAMTUyOQQAAAAxNTMw
+ BAAAADE1MzEEAAAAMTUzMgQAAAAxNTMzBAAAADE1MzQEAAAAMTUzNQQAAAAxNTM2BAAAADE1MzcE
+ AAAAMTUzOAQAAAAxNTM5BAAAADE1NDAEAAAAMTU0MQQAAAAxNTQyBAAAADE1NDMEAAAAMTU0NAQA
+ AAAxNTQ1BAAAADE1NDYEAAAAMTU0NwQAAAAxNTQ4BAAAADE1NDkEAAAAMTU1MAQAAAAxNTUxBAAA
+ ADE1NTIEAAAAMTU1MwQAAAAxNTU0BAAAADE1NTUEAAAAMTU1NgQAAAAxNTU3BAAAADE1NTgEAAAA
+ MTU1OQQAAAAxNTYwBAAAADE1NjEEAAAAMTU2MgQAAAAxNTYzBAAAADE1NjQEAAAAMTU2NQQAAAAx
+ NTY2BAAAADE1NjcEAAAAMTU2OAQAAAAxNTY5BAAAADE1NzAEAAAAMTU3MQQAAAAxNTcyBAAAADE1
+ NzMEAAAAMTU3NAQAAAAxNTc1BAAAADE1NzYEAAAAMTU3NwQAAAAxNTc4BAAAADE1NzkEAAAAMTU4
+ MAQAAAAxNTgxBAAAADE1ODIEAAAAMTU4MwQAAAAxNTg0BAAAADE1ODUEAAAAMTU4NgQAAAAxNTg3
+ BAAAADE1ODgEAAAAMTU4OQQAAAAxNTkwBAAAADE1OTEEAAAAMTU5MgQAAAAxNTkzBAAAADE1OTQE
+ AAAAMTU5NQQAAAAxNTk2BAAAADE1OTcEAAAAMTU5OAQAAAAxNTk5BAAAADE2MDAEAAAAMTYwMQQA
+ AAAxNjAyBAAAADE2MDMEAAAAMTYwNAQAAAAxNjA1BAAAADE2MDYEAAAAMTYwNwQAAAAxNjA4BAAA
+ ADE2MDkEAAAAMTYxMAQAAAAxNjExBAAAADE2MTIEAAAAMTYxMwQAAAAxNjE0BAAAADE2MTUEAAAA
+ MTYxNgQAAAAxNjE3BAAAADE2MTgEAAAAMTYxOQQAAAAxNjIwBAAAADE2MjEEAAAAMTYyMgQAAAAx
+ NjIzBAAAADE2MjQEAAAAMTYyNQQAAAAxNjI2BAAAADE2MjcEAAAAMTYyOAQAAAAxNjI5BAAAADE2
+ MzAEAAAAMTYzMQQAAAAxNjMyBAAAADE2MzMEAAAAMTYzNAQAAAAxNjM1BAAAADE2MzYEAAAAMTYz
+ NwQAAAAxNjM4BAAAADE2MzkEAAAAMTY0MAQAAAAxNjQxBAAAADE2NDIEAAAAMTY0MwQAAAAxNjQ0
+ BAAAADE2NDUEAAAAMTY0NgQAAAAxNjQ3BAAAADE2NDgEAAAAMTY0OQQAAAAxNjUwBAAAADE2NTEE
+ AAAAMTY1MgQAAAAxNjUzBAAAADE2NTQEAAAAMTY1NQQAAAAxNjU2BAAAADE2NTcEAAAAMTY1OAQA
+ AAAxNjU5BAAAADE2NjAEAAAAMTY2MQQAAAAxNjYyBAAAADE2NjMEAAAAMTY2NAQAAAAxNjY1BAAA
+ ADE2NjYEAAAAMTY2NwQAAAAxNjY4BAAAADE2NjkEAAAAMTY3MAQAAAAxNjcxBAAAADE2NzIEAAAA
+ MTY3MwQAAAAxNjc0BAAAADE2NzUEAAAAMTY3NgQAAAAxNjc3BAAAADE2NzgEAAAAMTY3OQQAAAAx
+ NjgwBAAAADE2ODEEAAAAMTY4MgQAAAAxNjgzBAAAADE2ODQEAAAAMTY4NQQAAAAxNjg2BAAAADE2
+ ODcEAAAAMTY4OAQAAAAxNjg5BAAAADE2OTAEAAAAMTY5MQQAAAAxNjkyBAAAADE2OTMEAAAAMTY5
+ NAQAAAAxNjk1BAAAADE2OTYEAAAAMTY5NwQAAAAxNjk4BAAAADE2OTkEAAAAMTcwMAQAAAAxNzAx
+ BAAAADE3MDIEAAAAMTcwMwQAAAAxNzA0BAAAADE3MDUEAAAAMTcwNgQAAAAxNzA3BAAAADE3MDgE
+ AAAAMTcwOQQAAAAxNzEwBAAAADE3MTEEAAAAMTcxMgQAAAAxNzEzBAAAADE3MTQEAAAAMTcxNQQA
+ AAAxNzE2BAAAADE3MTcEAAAAMTcxOAQAAAAxNzE5BAAAADE3MjAEAAAAMTcyMQQAAAAxNzIyBAAA
+ ADE3MjMEAAAAMTcyNAQAAAAxNzI1BAAAADE3MjYEAAAAMTcyNwQAAAAxNzI4BAAAADE3MjkEAAAA
+ MTczMAQAAAAxNzMxBAAAADE3MzIEAAAAMTczMwQAAAAxNzM0BAAAADE3MzUEAAAAMTczNgQAAAAx
+ NzM3BAAAADE3MzgEAAAAMTczOQQAAAAxNzQwBAAAADE3NDEEAAAAMTc0MgQAAAAxNzQzBAAAADE3
+ NDQEAAAAMTc0NQQAAAAxNzQ2BAAAADE3NDcEAAAAMTc0OAQAAAAxNzQ5BAAAADE3NTAEAAAAMTc1
+ MQQAAAAxNzUyBAAAADE3NTMEAAAAMTc1NAQAAAAxNzU1BAAAADE3NTYEAAAAMTc1NwQAAAAxNzU4
+ BAAAADE3NTkEAAAAMTc2MAQAAAAxNzYxBAAAADE3NjIEAAAAMTc2MwQAAAAxNzY0BAAAADE3NjUE
+ AAAAMTc2NgQAAAAxNzY3BAAAADE3NjgEAAAAMTc2OQQAAAAxNzcwBAAAADE3NzEEAAAAMTc3MgQA
+ AAAxNzczBAAAADE3NzQEAAAAMTc3NQQAAAAxNzc2BAAAADE3NzcEAAAAMTc3OAQAAAAxNzc5BAAA
+ ADE3ODAEAAAAMTc4MQQAAAAxNzgyBAAAADE3ODMEAAAAMTc4NAQAAAAxNzg1BAAAADE3ODYEAAAA
+ MTc4NwQAAAAxNzg4BAAAADE3ODkEAAAAMTc5MAQAAAAxNzkxBAAAADE3OTIEAAAAMTc5MwQAAAAx
+ Nzk0BAAAADE3OTUEAAAAMTc5NgQAAAAxNzk3BAAAADE3OTgEAAAAMTc5OQQAAAAxODAwBAAAADE4
+ MDEEAAAAMTgwMgQAAAAxODAzBAAAADE4MDQEAAAAMTgwNQQAAAAxODA2BAAAADE4MDcEAAAAMTgw
+ OAQAAAAxODA5BAAAADE4MTAEAAAAMTgxMQQAAAAxODEyBAAAADE4MTMEAAAAMTgxNAQAAAAxODE1
+ BAAAADE4MTYEAAAAMTgxNwQAAAAxODE4BAAAADE4MTkEAAAAMTgyMAQAAAAxODIxBAAAADE4MjIE
+ AAAAMTgyMwQAAAAxODI0BAAAADE4MjUEAAAAMTgyNgQAAAAxODI3BAAAADE4MjgEAAAAMTgyOQQA
+ AAAxODMwBAAAADE4MzEEAAAAMTgzMgQAAAAxODMzBAAAADE4MzQEAAAAMTgzNQQAAAAxODM2BAAA
+ ADE4MzcEAAAAMTgzOAQAAAAxODM5BAAAADE4NDAEAAAAMTg0MQQAAAAxODQyBAAAADE4NDMEAAAA
+ MTg0NAQAAAAxODQ1BAAAADE4NDYEAAAAMTg0NwQAAAAxODQ4BAAAADE4NDkEAAAAMTg1MAQAAAAx
+ ODUxBAAAADE4NTIEAAAAMTg1MwQAAAAxODU0BAAAADE4NTUEAAAAMTg1NgQAAAAxODU3BAAAADE4
+ NTgEAAAAMTg1OQQAAAAxODYwBAAAADE4NjEEAAAAMTg2MgQAAAAxODYzBAAAADE4NjQEAAAAMTg2
+ NQQAAAAxODY2BAAAADE4NjcEAAAAMTg2OAQAAAAxODY5BAAAADE4NzAEAAAAMTg3MQQAAAAxODcy
+ BAAAADE4NzMEAAAAMTg3NAQAAAAxODc1BAAAADE4NzYEAAAAMTg3NwQAAAAxODc4BAAAADE4NzkE
+ AAAAMTg4MAQAAAAxODgxBAAAADE4ODIEAAAAMTg4MwQAAAAxODg0BAAAADE4ODUEAAAAMTg4NgQA
+ AAAxODg3BAAAADE4ODgEAAAAMTg4OQQAAAAxODkwBAAAADE4OTEEAAAAMTg5MgQAAAAxODkzBAAA
+ ADE4OTQEAAAAMTg5NQQAAAAxODk2BAAAADE4OTcEAAAAMTg5OAQAAAAxODk5BAAAADE5MDAEAAAA
+ MTkwMQQAAAAxOTAyBAAAADE5MDMEAAAAMTkwNAQAAAAxOTA1BAAAADE5MDYEAAAAMTkwNwQAAAAx
+ OTA4BAAAADE5MDkEAAAAMTkxMAQAAAAxOTExBAAAADE5MTIEAAAAMTkxMwQAAAAxOTE0BAAAADE5
+ MTUEAAAAMTkxNgQAAAAxOTE3BAAAADE5MTgEAAAAMTkxOQQAAAAxOTIwBAAAADE5MjEEAAAAMTky
+ MgQAAAAxOTIzBAAAADE5MjQEAAAAMTkyNQQAAAAxOTI2BAAAADE5MjcEAAAAMTkyOAQAAAAxOTI5
+ BAAAADE5MzAEAAAAMTkzMQQAAAAxOTMyBAAAADE5MzMEAAAAMTkzNAQAAAAxOTM1BAAAADE5MzYE
+ AAAAMTkzNwQAAAAxOTM4BAAAADE5MzkEAAAAMTk0MAQAAAAxOTQxBAAAADE5NDIEAAAAMTk0MwQA
+ AAAxOTQ0BAAAADE5NDUEAAAAMTk0NgQAAAAxOTQ3BAAAADE5NDgEAAAAMTk0OQQAAAAxOTUwBAAA
+ ADE5NTEEAAAAMTk1MgQAAAAxOTUzBAAAADE5NTQEAAAAMTk1NQQAAAAxOTU2BAAAADE5NTcEAAAA
+ MTk1OAQAAAAxOTU5BAAAADE5NjAEAAAAMTk2MQQAAAAxOTYyBAAAADE5NjMEAAAAMTk2NAQAAAAx
+ OTY1BAAAADE5NjYEAAAAMTk2NwQAAAAxOTY4BAAAADE5NjkEAAAAMTk3MAQAAAAxOTcxBAAAADE5
+ NzIEAAAAMTk3MwQAAAAxOTc0BAAAADE5NzUEAAAAMTk3NgQAAAAxOTc3BAAAADE5NzgEAAAAMTk3
+ OQQAAAAxOTgwBAAAADE5ODEEAAAAMTk4MgQAAAAxOTgzBAAAADE5ODQEAAAAMTk4NQQAAAAxOTg2
+ BAAAADE5ODcEAAAAMTk4OAQAAAAxOTg5BAAAADE5OTAEAAAAMTk5MQQAAAAxOTkyBAAAADE5OTME
+ AAAAMTk5NAQAAAAxOTk1BAAAADE5OTYEAAAAMTk5NwQAAAAxOTk4BAAAADE5OTkVABWO+gEVjvoB
+ LBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1LjR5
+ YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5maGoMAAAAZG5zdGNwbHYuZWRr
+ DAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJlZXpmdGwubXEzDAAAAGdmdXg0
+ MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2tyDAAAAGV1emQxYjQxLmJxMgwA
+ AAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tmaXNkLnFqNQwAAAB2ZmtpbGsy
+ dS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwAAABhc2hvYXZvMS5vamYMAAAA
+ dWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1cy5wcDIMAAAAa3d3MTFwMmEu
+ ZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAAaTFiYnUyd2IuZGpqDAAAADJ5
+ dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20ubDQzDAAAAGFtcnRlMGxhLjJ0
+ cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5aGRjdnZsLnhieAwAAAB4ZDR3
+ MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtvcgwAAABzNHBtdTI0dC5ia3AM
+ AAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4d3dmNC5jMmsMAAAAMWpwMmls
+ d3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0MAAAAcnhlbnNva3UuamlmDAAA
+ AGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNiYXAubjJ4DAAAADVqd3Yyc2M1
+ LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAAADQzb3N5cjVuLmpzaQwAAAB1
+ NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZyLmlhZwwAAABleHJ0Z2xhMS4x
+ dTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAAByZ3BkYWx2dy5kaXgMAAAANW1p
+ b2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5zdW4MAAAAaHVobGZpdTMubG5q
+ DAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNtejVvNW0ueXVtDAAAAHN5ZGJq
+ cG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRmDAAAAG8zdHB2cmJkLmtncAwA
+ AABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2NpYWd6LmF1ZAwAAABwdWN5bWFl
+ di5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwAAAB3ZHRkcXRnYy5oNXAMAAAA
+ Y2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJpYS40amwMAAAAMmUzeWliNXku
+ b294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAAaXdramt2djQudWcyDAAAAGh4
+ aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEudjUzDAAAAHBzNHZqdHhwLnNj
+ NAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRoNG93YWFiLmh5cAwAAABiejR0
+ M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9jcAwAAAB6c2hjMXAxeC5yY2wM
+ AAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5mZGJveS5mdmEMAAAAdnp6MDJw
+ YWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUMAAAAYW1taWp6bjAuYXMxDAAA
+ AGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBxYWYuNDNzDAAAAHdybXpvaTFu
+ Lm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAAAGRkbjNmaXF0LmR6YwwAAABv
+ dXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBzLmJzYgwAAABmbWZ4cnRsZS5j
+ MXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2Z3l3bmt2Zi5hNHMMAAAAY2lu
+ eG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4xYmsMAAAAYTRzZDU0aW0ueWIz
+ DAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFjNXUzeHouNW5pDAAAAGlxYWYw
+ eHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90DAAAADFvY2FnM2Y1LnBxbQwA
+ AAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3RmamdsLmg0cAwAAAB1M2hyMGFn
+ NC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwAAAB1cjR4YjFtcC56dmUMAAAA
+ MjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZkNC53NGwMAAAAa25sYXRpYWcu
+ eTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAAbGVyeWt1dWUuYnl4DAAAAG9u
+ eDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQucG95DAAAAHkyc2FtZTR4LmZx
+ cwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1zcmt0ejNoLnJuaAwAAAB1YjR1
+ dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZleAwAAAB4aHExcTVrbC5ydDEM
+ AAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJjcHI1ZC5hc24MAAAAMXp5MzB6
+ M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYMAAAAdmhreTVrMGkuYm9pDAAA
+ AG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtlMTUuMzJlDAAAAHdtbXBobjNw
+ LjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAAAGwzbmdsYXQyLjIzeAwAAABy
+ NGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRnLmVvYwwAAAB6MDFjMm55ei55
+ ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABxcjNjbXluNS5vcGUMAAAAbTVj
+ dmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5zZjIMAAAAbWJ3Z2xiNTQuZWRi
+ DAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2VjYm5yankuMXdpDAAAADUydWFs
+ aGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2JwDAAAAGNjNTJhdmh1LnAxZQwA
+ AABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tvaWN0LnZ3YgwAAAB5dHRhaHdi
+ eS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwAAABleGZoeWIzby4ya3oMAAAA
+ NTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRtei4wcDAMAAAAZm9iZXcwbHgu
+ bnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAAaXVsM2d6eGouem9tDAAAAHY0
+ MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAuMjB2DAAAAGhkb3UwbTBpLnlv
+ dwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwycHp1MXBrLnBnbAwAAABjMWhv
+ cXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRsegwAAABkZ2l1ZXlmbS5taXMM
+ AAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXoxdm5kci5uNHAMAAAAdGFwdnB0
+ aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkMAAAAMDIwbG0xMGgud3dlDAAA
+ AGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4dHUubnAxDAAAADNjbGtrdmQy
+ LnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAAAGpvZXJnd3cyLm5mMgwAAAB2
+ MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1LmdmcwwAAAB3M2FrbGVxdS52
+ Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABjcmFmMGYwbC5icWQMAAAAcHBl
+ ZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5pYW8MAAAAbWQ1cXRwbXcub3pt
+ DAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4ZXZsdXIuZjBlDAAAADVoZ3p1
+ c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMxDAAAAHZveHV1b2ZxLm1jcQwA
+ AAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNvaW1uLnZsdgwAAABlMGQ0NGo0
+ ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwAAABheWFtY2RicS5zMHkMAAAA
+ Ynh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdjcS5sMzEMAAAAaG5mbzRwd2Iu
+ cjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAAb3pmNXIza2Eudnh2DAAAAGR6
+ dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXguNGNlDAAAAHVtdDAwcXZyLjJm
+ bwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRkeXp2bnFkLmNtcgwAAABhbXIy
+ ZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFiZQwAAAAwMWVid2p0bi53eXkM
+ AAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6MXN1Yi4wb2YMAAAAa3RsbXh4
+ ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gMAAAAMjFuNWl1bm4ubzFiDAAA
+ AHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2NkcGkucHphDAAAAG53dnRjcWIw
+ LmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAAAHJwbnZuenpyLm40cgwAAABu
+ a3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1LmpkMgwAAAB1a2RsMzAwZC5z
+ b3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABic2tqemJnYy41ajQMAAAANDNk
+ eml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54YmsMAAAAaWloZWVmbWYudnFt
+ DAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0NGVoNDMuZzV4DAAAAGp6cGZt
+ M21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBpDAAAAGxyYzJnNHNrLnJudwwA
+ AAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJuand6LmJ4eQwAAABwdGZieWxj
+ Yy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwAAAByajJyZGhhei5za3QMAAAA
+ Y3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBuby55eTIMAAAAYWh1cHFwMHou
+ d2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAAMGZncXVya3MuY2RhDAAAAHh3
+ MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wuZ2wzDAAAAHlmcnRtamViLnhz
+ cwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZqb3NnMDI0LmswdwwAAABxcGx0
+ cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6LmxkbQwAAABlMHF1dm5qYi5rbGYM
+ AAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2FrZnk0dy4xeWMMAAAAZ3N2bDA1
+ bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEMAAAANG5xMnBvY2YuM2RwDAAA
+ AHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFjNGoud3l0DAAAAG9waWt3aWpo
+ LnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAAAGF5NW5rMTN4LnJmdwwAAABl
+ bDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVlLmU1awwAAABoZGt3NWdnai5h
+ Zm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAyMnlodDV0cy40eHEMAAAAbXpt
+ MGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5mejIMAAAAdGkxM2M1MW8uNXps
+ DAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenpsZ3l4YTUuNHlhDAAAADVjNTI1
+ MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNhDAAAAG55dmVvc3gwLndvcAwA
+ AABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1azEzLmxwZQwAAABzZnFjNXJ3
+ eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwAAAB4MWZodmlrby5wcnoMAAAA
+ czM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1bS5iZXEMAAAAdHZyaDRuM2wu
+ a3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAAbWpscWlrc2wuYml1DAAAAHgz
+ cWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWoudGc1DAAAADUxcTRxa2duLmw1
+ dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1rbTJ0a2h0LnhheQwAAAA0bWJx
+ bjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndqcAwAAABmenlyNXlmbS5wZG8M
+ AAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0em90NC5yaG0MAAAAbjNqcDV2
+ Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwMAAAAcmRvMmxxYnEueXFsDAAA
+ AGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYxbWsucXdkDAAAAGp2bnRvZWY1
+ LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAAAGZ5NGFnMGgzLmR6ZAwAAABx
+ ZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4LmgwawwAAAA0Mm52c2k1dS4y
+ ZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3M3ZweGxyYy4yM3kMAAAAaGFp
+ Y2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5ocmwMAAAAc3k0YnhsdnIuYm14
+ DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3BvY3V3ZHUubjVwDAAAAGt2MHB2
+ dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3DAAAAHdiZ29md3phLmZxZAwA
+ AABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBkc3BhLjUzYgwAAABiaXBiaTVj
+ di5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwAAAB5eWFseW50Mi50bWEMAAAA
+ ZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3diYy5udGcMAAAAMnMya3Bjc2Mu
+ cW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAAd3hmMjVlZHAuaDBzDAAAAGUy
+ d3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcuYTRsDAAAADJncGFua2d4Lnlx
+ egwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRpd3Brb3MzLnp4ZgwAAAAwbmI1
+ Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnltegwAAABzem9yc2tlcS54cjQM
+ AAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRhZG51ci5uc2cMAAAAZDJnNWdk
+ MjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsMAAAAbDBtbXp2bTMuZGd5DAAA
+ AGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20za3MueG5oDAAAAHV6bHdlbGo0
+ LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAAADBha2Roam5rLmF3bAwAAABs
+ bHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJoLnRxcQwAAAAyc2l2YW5iaS5k
+ aHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2b3pnZXJmai5yd3YMAAAAY2py
+ MXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5qNGIMAAAAYWF1dHN2YnYucWRu
+ DAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJpYzF1YWQuMHJsDAAAAGp0YjVz
+ ZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1lDAAAAGR4cG4xa210LmtkbgwA
+ AABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJhejFvLnlqaQwAAAB1a2Z3aTNl
+ Yy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwAAAB5am1xaXlycC5ld2sMAAAA
+ Z3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJwaS5qZHAMAAAANXVsdGpweWQu
+ c3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAAMXdhZ2pyencueXRxDAAAAHlt
+ Y3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEuaGxlDAAAAHN1eG9vanFmLmxu
+ dQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEydTN1cmh5Lm5zeQwAAAAxeTJm
+ bHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJnegwAAABzeXRkd2J2aS5jd3oM
+ AAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1MTF6eC5jY2UMAAAAYnc1aW1p
+ YjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUMAAAAengzbWt0bzQuNXV5DAAA
+ AGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVkaDQudGJqDAAAADUwcmdoYmhi
+ LnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAAADQxYWQxdWFlLmRhdQwAAABk
+ ZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6LnZ6YgwAAABzZDF5cTU1Yy41
+ M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABkam4yZXczMC5lbmIMAAAAc3Uw
+ emdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40cHQMAAAAY2NjeGlicG0ud2Ji
+ DAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0bTJnYXoueXlmDAAAADN4aWJp
+ Y3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUyDAAAAGFmYm1peXU0Lnl6bwwA
+ AAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNtMTJrLmJkdAwAAABzMWVpa3hv
+ dy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwAAAB0ZnMxZmxrMy51ZGwMAAAA
+ ZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVxMi5yNWoMAAAAajBibmhleG8u
+ YWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAAMHRweTNjdnQuaDNiDAAAAHlr
+ MHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQuNGZtDAAAAGxyNDB0amIwLm8y
+ cwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHhtenhibnJnLmY1egwAAAB6bnFx
+ bWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxhagwAAABzNGJ4ejBndy51bTMM
+ AAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHExanlseC55cXkMAAAAMGV5Y3hm
+ d2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMMAAAAaWRmazE0aTUueG5tDAAA
+ AGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJjejIucXhtDAAAAGRoeXRzdXhl
+ LjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAAAHptcGVvbHkzLjR0MwwAAAB6
+ aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1LnpvcwwAAAB4cW5icmkwdC5t
+ bnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABjM3Qzd3IzMy5qY3gMAAAANXhq
+ a2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5lbnoMAAAAMnZseXYyYzUucWp1
+ DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2thY25xdHkuMnptDAAAAHcxdGs0
+ cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRwDAAAAHd1cmcyb2IzLjVjMwwA
+ AAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20zY24xLmNqegwAAABtYWZhdnRk
+ Yi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwAAAAxc3Jha291MS5rMG8MAAAA
+ YWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3by5hdnEMAAAAYTRkMWZleTIu
+ NXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAAaWcxNTFwZngua29tDAAAAHZ6
+ cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIudmZvDAAAAHpxbXB1aTRtLjNq
+ MwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8wazQxcTFtLmwydgwAAAA1Ymp5
+ dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZpNAwAAAA0ZGMzcnNteC4zMHEM
+ AAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhhZXFsMy5zMG4MAAAAZHlweWJ0
+ cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIMAAAAd2Qyc29zcHcuMWVpDAAA
+ ADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRxMWguZHpuDAAAAGpjMmJ4aHRu
+ Lmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAAADMyMjV2cXpoLms0YwwAAABr
+ b2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFyLjEyZgwAAAB5cnBucDJnZy5p
+ NGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABvdmdvaWs1cS54c3MMAAAAaW5x
+ cHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5xb3UMAAAAeXBicndkd3YubWFi
+ DAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1cTNzb3IubGRiDAAAAHFyeXJh
+ MWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhmDAAAAGZ4cTVmZHplLnJ1bwwA
+ AAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlwcmVoLnVueAwAAAB5c2ZocWpq
+ dS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwAAABsNXV2YTNoaC5oNHAMAAAA
+ cDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFhaC5hdW4MAAAAaHdwMDRjZnUu
+ bWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAAcnR3c2prd3MubzF3DAAAADNj
+ eXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUueGF0DAAAADM1ZmNndWpwLjNs
+ dAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBna29pNHZwLmI1dwwAAAAyZHli
+ ZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9yZgwAAAAxeGJxMjBudi5oM2YM
+ AAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0eDFiay53MDAMAAAAbDVmZnhk
+ YnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsMAAAAMWZ0bXhrYzMubGF0DAAA
+ AHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkxc2suMHAzDAAAAGJhbnJ4MWwx
+ LmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAAAHQzM2VjeHI0LmJpaQwAAABp
+ bHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZiLnluZgwAAABvMjJjYmV2bS5j
+ bGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABnM3dnMmJ0aS4yd2MMAAAAMWNv
+ NWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55bW4MAAAAMm95ZWVpajEuMXVs
+ DAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1eGJhZncubHp6DAAAADFwdDEy
+ ZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkzDAAAAGlua2kxbXB3LmhkMgwA
+ AABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1czR0Lnd2bwwAAAB5enVoaGdw
+ NS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwAAABta2JobmJyZS51djUMAAAA
+ eWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVnZC50MXkMAAAAZnZhbXQycWou
+ MWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAAYnpkbGhhMTEuczJyDAAAADVj
+ MWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEuemZtDAAAAG9kdzEwZ3RsLmFx
+ NAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBhY21pcjJnLnBkNAwAAABvbGdo
+ M2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVocAwAAAB0emt1bG5jaS5ndGcM
+ AAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVoYmNlci40d2QMAAAAMnFwcDNu
+ b2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkMAAAAemNlc2JuZW4uM3ZyDAAA
+ ADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9rZGEuM21zDAAAAHc1aGxwYXg1
+ Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAAAHNycjV2a2liLjN0NQwAAAB2
+ cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4LjAybQwAAABnMGgxZ3d5aC4y
+ NDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0c3Ayd3J2My40bzIMAAAAcXE1
+ Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5zMDQMAAAAZmRxdmdmNG8udGxs
+ DAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVpNXl0NGEuNHVhDAAAAHJmNGti
+ ZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6DAAAADFnYWI1dW1kLnN5ZAwA
+ AABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3aDU0LjVnZAwAAAAxYTIyZXBj
+ cS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwAAABqdmZ1MGRwMC4weXUMAAAA
+ Zmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201ei56dmIMAAAAMHd1d2VobW4u
+ bW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAAaG52cHdyMWUuaTRrDAAAAHNt
+ dG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubnguYmIzDAAAAGRvdmh5MXd4Lmhl
+ YgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVpZTF1dmJtLmxkZgwAAABqenBl
+ dXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlxNAwAAABtZXNsNXRldy40dmYM
+ AAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGhoZWEycy5rbG0MAAAAbnJ3cTVt
+ NWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUMAAAAeHkxZG4xMWkucDBsDAAA
+ AGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3bXcuemsxDAAAAGUxMHhwb2Jx
+ LmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAAAHAya3ZhZGNpLmpkYgwAAAB4
+ cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZqLmFlMwwAAAAxbmNmMmEwbC5s
+ MXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABhczNwcHNmdS5xd2IMAAAAdjBp
+ MXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56bGYMAAAAM3RnbzFnZnAuYnIx
+ DAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGphMnowMjEuNTJpDAAAAHBxdHpo
+ cmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBkDAAAAHgxYWxnZGVuLnd0dgwA
+ AABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpyb3p1LmZqaQwAAABtM20xZGIz
+ di5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwAAABjMnJxemk0bC5kdXIMAAAA
+ MjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2NyYy41d2kMAAAAMmhycWdzM28u
+ amkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAAamcxa2J2Y2cuYXR2DAAAADFq
+ cWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8uMGhtDAAAAHR1cnppcTRvLmpi
+ bgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZqemVlanEzLmsydwwAAABmcG01
+ bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5cAwAAABtMXhnb3oyay50Z3IM
+ AAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVsYWtzdC5wdXEMAAAAeWdvNGJ1
+ MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncMAAAAZGI1dm92cGoudXFzDAAA
+ ADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2YxanljZzMuajB2DAAAAGtiZHIwdzR1
+ LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAAADJjMGZ2c2UzLmt2eQwAAABw
+ ZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0LnU1egwAAAAwbDRkbWhxdC40
+ eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABlaTVjZ3BiMi5qdWEMAAAAZTVv
+ dWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54d28MAAAAdGRybWdoenoudGNi
+ DAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVrbG41MHcuNXM0DAAAAHh4NWx6
+ djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6DAAAADUzbXo1d2dvLnVsbQwA
+ AAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3MnlhLmJzawwAAAB6bzAxNW01
+ aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwAAAA1YjAzNXN5ZC4ybGcMAAAA
+ bHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFhdi52ZWwMAAAAcWRvb2t5eHYu
+ cnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAAc3ZqdW1uNXguNW9rDAAAADJ4
+ amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMueDRjDAAAAHl4amRnYnYwLm9s
+ aAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUydG92MmJ6LjVkaAwAAABrYzNx
+ MWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJnYwwAAABlamFydmxmaS41cDUM
+ AAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVraDB6Yy53MGQMAAAAejNwZm5h
+ eHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEMAAAANXB0dDV5MzQuNWhiDAAA
+ AGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBzamwuamQzDAAAADAzbGVnZHRv
+ Lmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAAAGJnaGJoa2VlLnRpcwwAAABy
+ azBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJuLnVwZwwAAABiZzJremkwZS53
+ cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABvYjFwMzUxbi54bWwMAAAAMGh1
+ a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5razAMAAAAd2pwYTFjMnIudmpx
+ DAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdhZGJpd2EuZnN0DAAAAGJ2cmdk
+ M2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wxDAAAAGFyZHBqbDNoLmJvYwwA
+ AAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41cXlzLnpwcwwAAABhNGVjZ3Zi
+ Yi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwAAAA0dHp0ZWRtbC54ZXcMAAAA
+ bXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5xYi5qcGUMAAAAc2g1dmdrM3Au
+ aHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAANWhmZ2NyanYuanJjDAAAAGlm
+ bGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUubHlpDAAAAHJ6aXc1MnViLmM0
+ ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVwdTF3aXN4LnhvaQwAAABoaGd4
+ ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRjMQwAAAB0cHNrdnJyMS5iczAM
+ AAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0ZmZwby50ZjQMAAAAdHM1c2N5
+ c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEMAAAAenZjMTMwZ3UuYjBpDAAA
+ AHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294NGgubWxqDAAAAHMyZ2JjNXBq
+ LnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAAAG1paHd2NWxhLmFmZwwAAABk
+ dGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBsLjFhaAwAAABzYmhia3Zhcy5q
+ Mm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABrZ2dwZzVzZS5nYWgMAAAAbTRj
+ aTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41YTAMAAAAc2Zka2VsbW0ub3Ry
+ DAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hhb2FhbzUuZjJ4DAAAAG40c3Jk
+ Zmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBzDAAAAGFkMGQ1dHJoLm0xdgwA
+ AAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2YnduMjAxLnIzNQwAAABveW5xaHd2
+ YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwAAABnY2FvZG1iYS56M3MMAAAA
+ andxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEwdS5peW0MAAAAM212NGw0NTEu
+ aGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAAdTNmZjVkdmIuZHozDAAAADVw
+ NWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24udjBhDAAAAGx3eW40d29jLmQy
+ ZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBheHpqbTRwLjJycQwAAABibXR1
+ eTBsaS4yZ2UVABWO+gEVjvoBLBXQDxUAFQYVBhwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpz
+ FgAW0A8YDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzAAAAAwAAANAPAQwAAAB2MWtnNWhtci5m
+ aGoMAAAAZG5zdGNwbHYuZWRrDAAAAG1ta3lucHR0Lmw0awwAAAB5c3E1d2NrZy5idG8MAAAAcHJl
+ ZXpmdGwubXEzDAAAAGdmdXg0MWF2LmNvegwAAABnaHpnMmNqZS4yaDEMAAAAM2R0dngwMWkuZ2ty
+ DAAAAGV1emQxYjQxLmJxMgwAAAA0YXRkMnpuby5nNDEMAAAAeWtkc240dWkuYjNlDAAAAHRud2tm
+ aXNkLnFqNQwAAAB2ZmtpbGsydS4xYjQMAAAAdWN0MnIzdG0ubjEwDAAAAGRjdHdocWNvLnZnegwA
+ AABhc2hvYXZvMS5vamYMAAAAdWdzcWJicHMuNXQyDAAAADBwcHlyNGVoLmhtcQwAAABsNWRheHZ1
+ cy5wcDIMAAAAa3d3MTFwMmEuZHhvDAAAAHNobWx6YzNpLnpkMAwAAABraTJva2FteC5hc2QMAAAA
+ aTFiYnUyd2IuZGpqDAAAADJ5dnZ1ZnRsLm1lcQwAAABmZzB4Y2xoay5odGgMAAAAY2l6cHh1c20u
+ bDQzDAAAAGFtcnRlMGxhLjJ0cwwAAAA1ZDUzZWY1NC5tMHkMAAAAcmxpczR4NG4ubXp6DAAAAHp5
+ aGRjdnZsLnhieAwAAAB4ZDR3MGZxZi5sMHMMAAAAdnFzeWFoNDAuYmFuDAAAAGtvYW1raWJxLmtv
+ cgwAAABzNHBtdTI0dC5ia3AMAAAAMzE1ZzI0aGsucTQ0DAAAAHN3aDVxZmVnLnduagwAAAB3Z2Z4
+ d3dmNC5jMmsMAAAAMWpwMmlsd3IubDVzDAAAAGNvcW90NHU1LmhncQwAAABsaXgzZ2dmaS5leG0M
+ AAAAcnhlbnNva3UuamlmDAAAAGUya2d5aWQ0LmYwYwwAAABkZWs1NHB4bC5pYmoMAAAAdTRpMDNi
+ YXAubjJ4DAAAADVqd3Yyc2M1LjJydAwAAAB1ZzR6NGxtcC4xMzAMAAAAMW5lMXVjbmgua2gzDAAA
+ ADQzb3N5cjVuLmpzaQwAAAB1NWpicGFmMi5mcjAMAAAAbWMxY2FvYmcuMW9xDAAAAGJlemVteHZy
+ LmlhZwwAAABleHJ0Z2xhMS4xdTEMAAAAb21waWxlYWwucjFnDAAAAGg0bXoxdmFiLmJlbgwAAABy
+ Z3BkYWx2dy5kaXgMAAAANW1pb2NiNWsuaHR0DAAAAGt0c25mdnBlLnEwZQwAAABjNDFoYWV5Yi5z
+ dW4MAAAAaHVobGZpdTMubG5qDAAAADBlb2F2Y3BvLmxwNQwAAABrajQ1ZXpyeC5tZTIMAAAAYXNt
+ ejVvNW0ueXVtDAAAAHN5ZGJqcG9uLmRmeQwAAAB5dHc1Y3FtaS5iZGMMAAAAcTN6M3JlamQuMHRm
+ DAAAAG8zdHB2cmJkLmtncAwAAABpbWp1MWcxay40bWQMAAAAaGVwdzF0ankuZGRyDAAAADJic2Np
+ YWd6LmF1ZAwAAABwdWN5bWFldi5xajAMAAAAb29ncmtlY3kuMGdiDAAAAHZnMXBjNHd6LmFoeAwA
+ AAB3ZHRkcXRnYy5oNXAMAAAAY2FieHdwbzAub3pxDAAAADIxcWFjYnRwLmlpdgwAAABqMHltdWJp
+ YS40amwMAAAAMmUzeWliNXkub294DAAAAGIxMjF0YnlvLjFtZgwAAAAyZWVpeXRteC5jMmEMAAAA
+ aXdramt2djQudWcyDAAAAGh4aGgwb3gwLmh4ZwwAAABkcWFpanYyZi5mYTQMAAAAejJ2YjNqbWEu
+ djUzDAAAAHBzNHZqdHhwLnNjNAwAAAAzMHlyMW1kZS5lZGMMAAAAeGlhZ2UzazQuZTRlDAAAADRo
+ NG93YWFiLmh5cAwAAABiejR0M2xkYy5ybnIMAAAANHFhZ2cwY3ouMG12DAAAAHB4aWxodWtxLm9j
+ cAwAAAB6c2hjMXAxeC5yY2wMAAAAMWphMXlzNW0uYXFnDAAAAHQ1ZGh0c2txLnVpdgwAAAB4cm5m
+ ZGJveS5mdmEMAAAAdnp6MDJwYWQuMHdrDAAAAHB2eHNpNXRwLnFzdAwAAAB5MnZhdG1iMS5vZTUM
+ AAAAYW1taWp6bjAuYXMxDAAAAGt3dnVlMG0yLm01cQwAAABiNDVyYzF2di5xZjQMAAAAdWJwMDBx
+ YWYuNDNzDAAAAHdybXpvaTFuLm1yZAwAAAB6NDBpY3hmMS54YTQMAAAAY241eXkxaDUuYWh0DAAA
+ AGRkbjNmaXF0LmR6YwwAAABvdXJ4ZTJrcS5mam4MAAAANXgzMXpwM2MuZ2pqDAAAAGdtMW5oZXBz
+ LmJzYgwAAABmbWZ4cnRsZS5jMXQMAAAAenZwYW1hc3kuemRwDAAAAHV0empqb2VmLnBscgwAAAB2
+ Z3l3bmt2Zi5hNHMMAAAAY2lueG0zYXouYXkyDAAAAGp6YnF5czBtLmdzZwwAAAAxeGltM2lwdS4x
+ YmsMAAAAYTRzZDU0aW0ueWIzDAAAAGV6YXQwZ2dsLnVqMgwAAAB2cWxmM25sMy5ieGUMAAAAYXFj
+ NXUzeHouNW5pDAAAAGlxYWYweHZuLmQ1bwwAAAB3YzJyM3pmdi5zY3AMAAAAbHJxbHp1bmIuMW90
+ DAAAADFvY2FnM2Y1LnBxbQwAAAB6YmIxaDJ5Yy5kZGoMAAAAbWFreDB4c2oud2NpDAAAADNyZ3Rm
+ amdsLmg0cAwAAAB1M2hyMGFnNC5ndHQMAAAAcjRqZmlxdTIuZmJpDAAAAGllaXoyNTBqLmswdgwA
+ AAB1cjR4YjFtcC56dmUMAAAAMjVuZ3FqeWgueWp2DAAAAGQwZDRyYnJmLjVnagwAAAAxb2ZjaGZk
+ NC53NGwMAAAAa25sYXRpYWcueTV2DAAAAGtyb3dza2xkLm5sYgwAAABlZWl1Mnhnbi5ldWQMAAAA
+ bGVyeWt1dWUuYnl4DAAAAG9ueDEwa2dnLnVnawwAAAB3Z2NlYjIwYS5jcm4MAAAAb3NycHMyczQu
+ cG95DAAAAHkyc2FtZTR4LmZxcwwAAABkc2kydGRsMi5rdHUMAAAAc3FyMHAyNGcuMTJrDAAAAG1z
+ cmt0ejNoLnJuaAwAAAB1YjR1dmNpbC5ocjAMAAAANTFxb2tiNGEuc29vDAAAAHVxcDR2dWhsLnZl
+ eAwAAAB4aHExcTVrbC5ydDEMAAAAZ3h3aDNzdnQubjFvDAAAAGYza20ycXNwLmdtdgwAAAAxaHJj
+ cHI1ZC5hc24MAAAAMXp5MzB6M2EubXpsDAAAAGhvc2R5b2ozLnJnNAwAAAA1anRoam14ZC5kZXYM
+ AAAAdmhreTVrMGkuYm9pDAAAAG5tcGVsdjEzLjIxNQwAAAA0ZXp5czFmZy5mcnQMAAAAYWNlYmtl
+ MTUuMzJlDAAAAHdtbXBobjNwLjNidQwAAABidHNmZXJpcS5naXIMAAAAeWQwbzJ1emsubHpwDAAA
+ AGwzbmdsYXQyLjIzeAwAAAByNGdob3hxYi5veHgMAAAAdnp2dG9vMXEucXJzDAAAADRoa3djbmRn
+ LmVvYwwAAAB6MDFjMm55ei55ZHoMAAAAem1vcjExeDQucTAyDAAAAGI1eHZ0YjMzLjFxbAwAAABx
+ cjNjbXluNS5vcGUMAAAAbTVjdmJoMnouYjF2DAAAAGJrMWZybG4zLmp4cQwAAAB5c3pleWdkbS5z
+ ZjIMAAAAbWJ3Z2xiNTQuZWRiDAAAAHFjMWJseTNuLjMxZQwAAABhamMwaWtycy56dXYMAAAAc2Vj
+ Ym5yankuMXdpDAAAADUydWFsaGFwLml5MwwAAAA0b2pzcXlyay4wcmwMAAAAeWxrNG9udncuc2Jw
+ DAAAAGNjNTJhdmh1LnAxZQwAAABvdmF1ZmVoZi50bHIMAAAAdzJmbGZtYWYuc2RsDAAAAHZhY2tv
+ aWN0LnZ3YgwAAAB5dHRhaHdieS4waGUMAAAAcHpiY3I1ZGkud3U1DAAAAGluajBueGpiLmkxdAwA
+ AABleGZoeWIzby4ya3oMAAAANTFuY295dDQubGxjDAAAAHFkamUzbmZiLjFyMAwAAABkeHl5NTRt
+ ei4wcDAMAAAAZm9iZXcwbHgubnViDAAAAHB2ZDJjamdhLmhnYQwAAAAwcHNhMWJmNC5qejAMAAAA
+ aXVsM2d6eGouem9tDAAAAHY0MG5rZXByLmlycgwAAAB0MWIxcmQwZi56YmoMAAAAemJ2NWJncTAu
+ MjB2DAAAAGhkb3UwbTBpLnlvdwwAAAAzZTFzaDQxay5pbWwMAAAAZW12b3pjeG4ubGtsDAAAAGwy
+ cHp1MXBrLnBnbAwAAABjMWhvcXJtZi5na3EMAAAAeG1ma3R4M3Iua3g0DAAAAHB5NXR2eWFtLmRs
+ egwAAABkZ2l1ZXlmbS5taXMMAAAAZG5wZzN0ZGMueGhjDAAAAHV6d256Y3FhLm94egwAAAB0YXox
+ dm5kci5uNHAMAAAAdGFwdnB0aHIueXdzDAAAAGRwMXk1anZ0Lmc1dQwAAAA0M2V1dnFkZC51emkM
+ AAAAMDIwbG0xMGgud3dlDAAAAGNkM2dtbWVpLmwxZgwAAAB4ZW1tM2VkcS54enQMAAAANHV3M3d4
+ dHUubnAxDAAAADNjbGtrdmQyLnJsbgwAAAB1NHRpajN4ZS5vY20MAAAANWdicTFxaHouM3dyDAAA
+ AGpvZXJnd3cyLm5mMgwAAAB2MnVqbXd0bi5pZngMAAAAc3lkb3hrZncuZ253DAAAAGJ1dzE0bGQ1
+ LmdmcwwAAAB3M2FrbGVxdS52Z2kMAAAAY2NwaDF3ZDIueGR5DAAAADBnMG9vcW4zLnZwaQwAAABj
+ cmFmMGYwbC5icWQMAAAAcHBlZnVobjAuM2hmDAAAAGljemt4NHozLmhjaAwAAABncTRhY25laC5p
+ YW8MAAAAbWQ1cXRwbXcub3ptDAAAAG5jY3ZtZTMwLndvagwAAABpbWVyYW5yaC54aTUMAAAAb2J4
+ ZXZsdXIuZjBlDAAAADVoZ3p1c3ZrLmVlYgwAAABzazA0Y215bC5keXoMAAAANHh1cXZ2M3ouaWMx
+ DAAAAHZveHV1b2ZxLm1jcQwAAAB0djUzc21idy5hbTAMAAAAcHU0azJ2aXYuMHJyDAAAAGtubHNv
+ aW1uLnZsdgwAAABlMGQ0NGo0ei53NG4MAAAAcDBoaWZ3dDEudjVtDAAAAHJoY2F6c3FzLmx2aAwA
+ AABheWFtY2RicS5zMHkMAAAAYnh1Z3FsbDEubTFlDAAAADB4Y3V4b2ZtLm94dgwAAAB2cXZ2bXdj
+ cS5sMzEMAAAAaG5mbzRwd2IucjBiDAAAAHV1eDNmaHBzLmw1MQwAAABpNWpoeWJncy5tdGkMAAAA
+ b3pmNXIza2Eudnh2DAAAAGR6dDR4bmNwLmJldQwAAABqNGpnNDRlYS5jM3IMAAAAYmlvajVxYXgu
+ NGNlDAAAAHVtdDAwcXZyLjJmbwwAAABhZXprenJwby5mZ3cMAAAAZG40ZmJxNHcuajF4DAAAAGRk
+ eXp2bnFkLmNtcgwAAABhbXIyZWx1Mi5yaGcMAAAAZmY0cTJiemkuc20xDAAAADU0aXZ2ancwLnFi
+ ZQwAAAAwMWVid2p0bi53eXkMAAAAaGJ1bWRqZGkuYmZ5DAAAAGxsdmNlMTBhLnF0ZQwAAAAxeXF6
+ MXN1Yi4wb2YMAAAAa3RsbXh4ZTUucHJjDAAAAGM0NGMzemd4Lmd4dAwAAABwd3h2MnJibC4zY3gM
+ AAAAMjFuNWl1bm4ubzFiDAAAAHNpM2JnYmUxLm5hdAwAAAB3cXRieWkzeS5td2IMAAAAcDBrd2Nk
+ cGkucHphDAAAAG53dnRjcWIwLmMwYwwAAAA1eTRmbnIzZi5wZHgMAAAAeWlxdHdlenkuZjExDAAA
+ AHJwbnZuenpyLm40cgwAAABua3ExdXExZi53MmsMAAAAZ3cxbHBjbmYueTN2DAAAADBwbHVhbDJ1
+ LmpkMgwAAAB1a2RsMzAwZC5zb3AMAAAAd2NubG92aHcuMWxiDAAAAGNwZXVjcjN6LnZ6egwAAABi
+ c2tqemJnYy41ajQMAAAANDNkeml5ZHYubXZpDAAAAHd5anJ5d3FrLmtycgwAAABieTF0NHVucC54
+ YmsMAAAAaWloZWVmbWYudnFtDAAAADJrdWZ6eWtxLmE1MgwAAABkaG01eDFkMi50dmQMAAAAbmc0
+ NGVoNDMuZzV4DAAAAGp6cGZtM21qLnJreAwAAABwcXR1bHdwMS5iYXUMAAAAYmlwaWlvemcucjBp
+ DAAAAGxyYzJnNHNrLnJudwwAAAA0NWhnZHhxZS5scHEMAAAAd3B4emZoZWQubDUxDAAAAHg0MTJu
+ and6LmJ4eQwAAABwdGZieWxjYy5tYnEMAAAAeXA0eHNuZ3guZXlvDAAAAG16NTJ5cXAwLnBkZQwA
+ AAByajJyZGhhei5za3QMAAAAY3pobjJzZ3Iub2J6DAAAAHFveGVweWE0LnR4MgwAAAB6bDRoZXBu
+ by55eTIMAAAAYWh1cHFwMHoud2NlDAAAAHltMzBuajF3LnAydAwAAAAzcDBubzNvYy5xNG4MAAAA
+ MGZncXVya3MuY2RhDAAAAHh3MGFxY3VyLnEycAwAAAB6a2ZzZnRveC4xYWUMAAAAbHZoZ3gyZ2wu
+ Z2wzDAAAAHlmcnRtamViLnhzcwwAAABoYTBqb25jeS5hNWoMAAAAc3VqNXl1NG0uMmV0DAAAAHZq
+ b3NnMDI0LmswdwwAAABxcGx0cXd1cS5vbWYMAAAANGZhcjBnd3ouemJsDAAAAGNibGVrY2Z6Lmxk
+ bQwAAABlMHF1dm5qYi5rbGYMAAAAZnp3NW12cjQuNHNqDAAAADJpbGN0MzVtLnpucQwAAABxb2Fr
+ Znk0dy4xeWMMAAAAZ3N2bDA1bnIuZGVvDAAAADRud2kzb3l2LnVybgwAAABheDMyZ2N1by5sanEM
+ AAAANG5xMnBvY2YuM2RwDAAAAHlncHNodmJ0LjNmcAwAAABrZjEwZTVqdy5iYjIMAAAAMHoxbTFj
+ NGoud3l0DAAAAG9waWt3aWpoLnM0egwAAABkZmhydTQway52eXEMAAAAem1zemMxcWIuZG51DAAA
+ AGF5NW5rMTN4LnJmdwwAAABlbDFjajBtaC5kZGYMAAAAbmNrdGh4bDIua2ZoDAAAAGtuZnoxMTVl
+ LmU1awwAAABoZGt3NWdnai5hZm0MAAAAczN4c2FtbHcuZG55DAAAAHUwZDFxbWRlLm9ubgwAAAAy
+ MnlodDV0cy40eHEMAAAAbXptMGl2ZXkudTEzDAAAAGExNG8yd3p2LmowbAwAAABwZzBuMzI0ZC5m
+ ejIMAAAAdGkxM2M1MW8uNXpsDAAAAHphYnYxaTVjLmJiegwAAAB0ZWh3cHJldi55bjIMAAAAenps
+ Z3l4YTUuNHlhDAAAADVjNTI1MGNmLmZzeQwAAAB6dGFzcms1dC5peWoMAAAAdDBuNW5uZXAudnNh
+ DAAAAG55dmVvc3gwLndvcAwAAABsZ3hjZHRoMC5hbWEMAAAAdGIwb3FwM2wuZXZ3DAAAAGRlY2J1
+ azEzLmxwZQwAAABzZnFjNXJ3eS5uZGYMAAAAMnQ1M2p5NWEua2lqDAAAAG12Z2hqdW8xLmdpagwA
+ AAB4MWZodmlrby5wcnoMAAAAczM1eWVmZ3AuYXVqDAAAAG1vZ2FhYm15Lm9sbQwAAABzZGo0M2g1
+ bS5iZXEMAAAAdHZyaDRuM2wua3hxDAAAAGNka3oycnd0LnUxcAwAAAB4enkwaHZvci5nMHEMAAAA
+ bWpscWlrc2wuYml1DAAAAHgzcWZxNTFxLnh3ZQwAAAAwemZwYWVlYy5rNTIMAAAAY2wzM2xwZWou
+ dGc1DAAAADUxcTRxa2duLmw1dAwAAABiNHZucjNqby41d3gMAAAAMXVmb2YxZ3UuYjJoDAAAAG1r
+ bTJ0a2h0LnhheQwAAAA0bWJxbjVyNC52MGsMAAAAcXZxb2NjeXkuZnlnDAAAADRqbHgwamkxLndq
+ cAwAAABmenlyNXlmbS5wZG8MAAAAbTVyeXI0ZG4ubGZoDAAAAGxsMXFidHF4LnRidwwAAABtbDQ0
+ em90NC5yaG0MAAAAbjNqcDV2Zm8ubjV1DAAAAHh4eW91cm8wLnA0cAwAAABkY2s1MXRwdi5jcWwM
+ AAAAcmRvMmxxYnEueXFsDAAAAGx2cnEzb2ZjLml2dwwAAABmaHY0MDJyaS55ZWIMAAAAM2h2ZXYx
+ bWsucXdkDAAAAGp2bnRvZWY1LnJueQwAAABieXVzeW1kdS5wc2gMAAAAb2lib2x2cHAucGplDAAA
+ AGZ5NGFnMGgzLmR6ZAwAAABxZmlleHpsZy5mMngMAAAAd3V3Yno1anYucHZ6DAAAAG9qNHJoNXN4
+ LmgwawwAAAA0Mm52c2k1dS4yZG8MAAAAMnZ4dTVsZGMua295DAAAAHdsbGxxdXptLmR4NQwAAAB3
+ M3ZweGxyYy4yM3kMAAAAaGFpY2gza2YucmVnDAAAAHdvZGQ0b2V2LndpYgwAAAByMGFvc3FvaS5o
+ cmwMAAAAc3k0YnhsdnIuYm14DAAAAHJuMXU1MXd1LmhsZQwAAABqazVudm90ei5iM2QMAAAAb3Bv
+ Y3V3ZHUubjVwDAAAAGt2MHB2dWl3LnZidQwAAABoMjQwNXptZC5kNG0MAAAAdXl0aXZzZW8udjR3
+ DAAAAHdiZ29md3phLmZxZAwAAABzcWRpcHl1dS5qcXYMAAAANG8wYmp2YWcuNTM1DAAAAGdhNHBk
+ c3BhLjUzYgwAAABiaXBiaTVjdi5ham4MAAAAeHhyaWEwaGMudHZmDAAAAHp2ZXVvZWN6LjRrZgwA
+ AAB5eWFseW50Mi50bWEMAAAAZDIxbG41NTEubjBxDAAAAGp3Z29mbGYzLnlwMAwAAAA0bWpwc3di
+ Yy5udGcMAAAAMnMya3Bjc2MucW16DAAAAGY0cjJmdnJ5Lnp1awwAAAA0eWhtcTVheS5uczEMAAAA
+ d3hmMjVlZHAuaDBzDAAAAGUyd3htMXF3Lm96egwAAAAyc2M0NXB3aS4xZXcMAAAAanEzbWp6NXcu
+ YTRsDAAAADJncGFua2d4LnlxegwAAABreHNtZWNycS5oeGkMAAAAMnhlMmlzM28uMXUyDAAAADRp
+ d3Brb3MzLnp4ZgwAAAAwbmI1Z2Nwbi5paWMMAAAAcm5tbDUwMDEuMWN5DAAAAGplcWZoZjBuLnlt
+ egwAAABzem9yc2tlcS54cjQMAAAAbjRiMjB4MmUud2ZvDAAAAG11ZHlyYXUyLmtnMgwAAABoMTRh
+ ZG51ci5uc2cMAAAAZDJnNWdkMjAucjR1DAAAADRneGNodXMxLjFvdAwAAABva2t0dnFmdC56cmsM
+ AAAAbDBtbXp2bTMuZGd5DAAAAGFtY3hma2J6LnZobAwAAABzMjNrYjNqYS5zbGcMAAAAZ3h4b20z
+ a3MueG5oDAAAAHV6bHdlbGo0LjRyagwAAAAycHRjMDJzay5jbGYMAAAANGtiZmMxemQuYXcxDAAA
+ ADBha2Roam5rLmF3bAwAAABsbHNiM3Z3eS5lM3gMAAAAYmp3eHp5YzQueHNwDAAAAGdpM3lsdnJo
+ LnRxcQwAAAAyc2l2YW5iaS5kaHEMAAAAajIxZ2M0ZTMuM2NsDAAAAGJnMjRpZHh6Lm4yZQwAAAB2
+ b3pnZXJmai5yd3YMAAAAY2pyMXcxdGouazRkDAAAAGdoam5seGVjLjFuegwAAAB2dnllcGFjNC5q
+ NGIMAAAAYWF1dHN2YnYucWRuDAAAAHF3ZTAwYzJiLjExcQwAAABjYXh2d3AzZy55bjIMAAAAbXJp
+ YzF1YWQuMHJsDAAAAGp0YjVzZXF1LmF4MgwAAABzY3pyZ2xlaS5oZnUMAAAAamdseDB3aHcuZW1l
+ DAAAAGR4cG4xa210LmtkbgwAAABteHplZG1qaS5qcnIMAAAAa3FiajRjNWouYXp3DAAAADR0MnJh
+ ejFvLnlqaQwAAAB1a2Z3aTNlYy5nemQMAAAAemVjbmx6b2QubDM1DAAAAGVia2JhZDFyLnlocQwA
+ AAB5am1xaXlycC5ld2sMAAAAZ3ozaWVnNHAuaWQwDAAAADBlbmFvZXQ1LnVvagwAAAB2cGUzZTJw
+ aS5qZHAMAAAANXVsdGpweWQuc3RvDAAAAHQybmtiNHJlLmkwZwwAAAAxaHI0M2R0di4wc3EMAAAA
+ MXdhZ2pyencueXRxDAAAAHltY3VieWdrLnduZwwAAABibG1tMmdtei52Y2gMAAAAbXM0cm1lZjEu
+ aGxlDAAAAHN1eG9vanFmLmxudQwAAABnamFpb2JiMC55cmkMAAAAa3lkbWU1c28ueHRiDAAAAHEy
+ dTN1cmh5Lm5zeQwAAAAxeTJmbHp1dC53M2IMAAAAZnJwbHlwc24ubWFpDAAAADJsbm1hdzRwLnJn
+ egwAAABzeXRkd2J2aS5jd3oMAAAAeWc1ZTJmemYuZjFoDAAAAGZpYjVnaGZrLndlMAwAAABjMmJ1
+ MTF6eC5jY2UMAAAAYnc1aW1pYjUuMDJ3DAAAAHRhZTBmb2x5LmxlcAwAAABnamExM254eS41aGUM
+ AAAAengzbWt0bzQuNXV5DAAAAGVrend6bTMyLnNicwwAAABnZzB6MXh2Yi5mNG0MAAAAczIwNDVk
+ aDQudGJqDAAAADUwcmdoYmhiLnBzZgwAAAB5ajAxcHAzdS4za2oMAAAAcjFzaHdtYm8uYm9rDAAA
+ ADQxYWQxdWFlLmRhdQwAAABkZmJ2MDJ1ei4xZTUMAAAAenQyMGs1ZGwubzFqDAAAAGV3Y2Npemp6
+ LnZ6YgwAAABzZDF5cTU1Yy41M2cMAAAAaDBpaGZmd2MuY3BvDAAAAHV1NDBraDBkLjR5ZwwAAABk
+ am4yZXczMC5lbmIMAAAAc3UwemdtaG0uaHkzDAAAADRhaXRtd2psLnpyYgwAAABzYng1Zmlwbi40
+ cHQMAAAAY2NjeGlicG0ud2JiDAAAADBieHVxeDJuLmEzMAwAAAB4ZWxqcGx5dC55dWUMAAAAcXQ0
+ bTJnYXoueXlmDAAAADN4aWJpY3R4LmJ1ZAwAAABnb3BhMWY0cC5icnAMAAAAcG9oc2pmMDIuaGUy
+ DAAAAGFmYm1peXU0Lnl6bwwAAAAwbXJsZWdreC5wa2gMAAAAeW5sempseGwubmR2DAAAAGZ0eWNt
+ MTJrLmJkdAwAAABzMWVpa3hvdy5qZTIMAAAAaG9sYjNjZmkuYW9iDAAAAHp4dDNhc3IxLm40agwA
+ AAB0ZnMxZmxrMy51ZGwMAAAAZTJ6ZWZkYzQuNHRvDAAAAHFhdXI1cTFvLmthdQwAAABoNHRjMjVx
+ Mi5yNWoMAAAAajBibmhleG8uYWp0DAAAAHF0cm1rNXV0LjRpMwwAAABrZ2NuZnI0eC5oaGkMAAAA
+ MHRweTNjdnQuaDNiDAAAAHlrMHBicGkzLmxycgwAAABkand1ZGkyaS5rdW8MAAAAaDRxamo1aWQu
+ NGZtDAAAAGxyNDB0amIwLm8ycwwAAAB5emxjdTB5bi5pd2UMAAAAMHZlcDViZDUuZ2ZrDAAAAHht
+ enhibnJnLmY1egwAAAB6bnFxbWp3dy52aHMMAAAAYmhycmx4YnUucHkwDAAAAGJvcHplMTNvLmxh
+ agwAAABzNGJ4ejBndy51bTMMAAAAMmgyb3J6ZHAudnUzDAAAAGpkZGs1bWZ1Lm9hawwAAABhdHEx
+ anlseC55cXkMAAAAMGV5Y3hmd2wuaWY1DAAAADBnMmpqbXZnLnUyaQwAAABlMGJtdXJ5bi5sZnMM
+ AAAAaWRmazE0aTUueG5tDAAAAGVzMndic3RzLmxmdgwAAABycXVyb3V1aS54eGEMAAAAdGNxMXJj
+ ejIucXhtDAAAAGRoeXRzdXhlLjU1egwAAAByMGNzeWxodC5samYMAAAAandndzNmM2MuaWZiDAAA
+ AHptcGVvbHkzLjR0MwwAAAB6aXdtNHRtbS5yd2oMAAAAeXhrdnhneTEud3RhDAAAAHM0emF4cWE1
+ LnpvcwwAAAB4cW5icmkwdC5tbnEMAAAAMmV2M2MzZ3AuZHpmDAAAAHBxNXZiem9wLmh3agwAAABj
+ M3Qzd3IzMy5qY3gMAAAANXhqa2YxenMudTF2DAAAAGtkbXVvYzNrLmhodAwAAABhZ2RkY3V2bC5l
+ bnoMAAAAMnZseXYyYzUucWp1DAAAADV2c29rY2I0LnBocgwAAABiZmZnNWZmby40dGQMAAAAa2th
+ Y25xdHkuMnptDAAAAHcxdGs0cjUxLjBkNAwAAABudG5sbmJ4bi51c2sMAAAAcHQya3pobGsucTRw
+ DAAAAHd1cmcyb2IzLjVjMwwAAAA1cXA0MmdvaS50cGMMAAAAdGQ1dnBla3EuM2p0DAAAAHdwd20z
+ Y24xLmNqegwAAABtYWZhdnRkYi56cXUMAAAAcWZuams0a28ucXpkDAAAAGRja2wxdTN3LmtwYQwA
+ AAAxc3Jha291MS5rMG8MAAAAYWRrazQwdXYuaXhkDAAAAG5uMXE0MGxvLnYzYgwAAABpY2JnbWF3
+ by5hdnEMAAAAYTRkMWZleTIuNXNvDAAAAGcxejVzMWJ4LndwYQwAAAAwZWt1djU1Mi5mczAMAAAA
+ aWcxNTFwZngua29tDAAAAHZ6cGJocDBnLnBxZAwAAABmMDV3dmUzby5xZDQMAAAAMWV6dWt0cXIu
+ dmZvDAAAAHpxbXB1aTRtLjNqMwwAAABjNXFkaXBpMy55cGsMAAAAbnhvZXhvbG4udHFtDAAAAG8w
+ azQxcTFtLmwydgwAAAA1Ymp5dzRibi4xNDIMAAAAZjNkZGRwaXIuM3Z5DAAAAGpnbzR6YWhsLnZp
+ NAwAAAA0ZGMzcnNteC4zMHEMAAAAZGNxMGozNGEuY2dqDAAAAHBhNWRsa3NzLmNxcAwAAABobGhh
+ ZXFsMy5zMG4MAAAAZHlweWJ0cWQuMTBpDAAAAG50NDBmZ3JqLmRqeQwAAAAzZ3V1emJubC4yMnIM
+ AAAAd2Qyc29zcHcuMWVpDAAAADRnNWxhc2liLmVyMQwAAAB6aGtlYmxkcC5xbW0MAAAANHl3cGRx
+ MWguZHpuDAAAAGpjMmJ4aHRuLmw1cgwAAAB6djJqZG93cS5reW4MAAAAM2N0cXZncnkuMTFvDAAA
+ ADMyMjV2cXpoLms0YwwAAABrb2gxMGMxMC5mbWEMAAAAemlieGR1ZXcuNXJjDAAAAHZ6cTFtYmFy
+ LjEyZgwAAAB5cnBucDJnZy5pNGsMAAAAY3N0MGl4cXUudmNnDAAAAG5veXkzY3p6LmwybwwAAABv
+ dmdvaWs1cS54c3MMAAAAaW5xcHhxMHoueWdpDAAAAGJ0ZGtnazBrLnZxcQwAAABjazFzbXlnei5x
+ b3UMAAAAeXBicndkd3YubWFiDAAAAGlmYml0ejJ1LmpvMAwAAAB5YXcwMjUxMi5xY2UMAAAAYWZ1
+ cTNzb3IubGRiDAAAAHFyeXJhMWFsLjJwdQwAAAAzZ3cwdGtrdy5sNWEMAAAAdXF2eGJ6NGMuenhm
+ DAAAAGZ4cTVmZHplLnJ1bwwAAAB6aTRvZGpvNS52Z2IMAAAAaXJpdmN5c20ubjVpDAAAAG15NHlw
+ cmVoLnVueAwAAAB5c2ZocWpqdS4xa2UMAAAAMmQwazA0MHkuM2kwDAAAAHk1NWhud29kLnp4dQwA
+ AABsNXV2YTNoaC5oNHAMAAAAcDVoYXZ2bmMubHo1DAAAAHhraHpzdmZsLjB4dwwAAAA1dDN3cjFh
+ aC5hdW4MAAAAaHdwMDRjZnUubWFjDAAAAHJvNHkwMXc1LmowawwAAABrdXozYmN0ai40dG0MAAAA
+ cnR3c2prd3MubzF3DAAAADNjeXN0cGtuLnZ2YwwAAAAyZWR5M2hrcS56cmsMAAAAczN1emNqeTUu
+ eGF0DAAAADM1ZmNndWpwLjNsdAwAAAAybmEzbXpmei5mY3oMAAAANXllcWphYXouMjBvDAAAADBn
+ a29pNHZwLmI1dwwAAAAyZHliZWN2NC5iYWUMAAAAaWQxbno1YTUua3d5DAAAAGZzc3ExM3FvLm9y
+ ZgwAAAAxeGJxMjBudi5oM2YMAAAAazRsZ3F4aTAuZjN4DAAAAGgxYTR3MWZoLmRmbQwAAABqYTB0
+ eDFiay53MDAMAAAAbDVmZnhkYnkuMHVhDAAAADJzZTRhZ3B4Lmc1bAwAAABnbmdzY2l3MS53MGsM
+ AAAAMWZ0bXhrYzMubGF0DAAAAHNzbWF0b3JiLmJtbAwAAABseHlkajNidS4wYm0MAAAAaGwwaWkx
+ c2suMHAzDAAAAGJhbnJ4MWwxLmJ2bgwAAABwcnppcGd0eS51MXQMAAAANWFhNWwwcG8ucmUzDAAA
+ AHQzM2VjeHI0LmJpaQwAAABpbHh6MTRoMC5ycXAMAAAAdWFxMmx1MGsuemF2DAAAAGl6eTM1ZGZi
+ LnluZgwAAABvMjJjYmV2bS5jbGIMAAAAcGxsNGhjaXYuZHNnDAAAAHRidWl3c3RuLjJneAwAAABn
+ M3dnMmJ0aS4yd2MMAAAAMWNvNWY1MXIuMjRnDAAAAHNnZG56cXhkLjBqbgwAAAByenh6MTMzei55
+ bW4MAAAAMm95ZWVpajEuMXVsDAAAAHVmYnZ2MTRjLjBhNQwAAABhYWJnY2VtaC5iZm4MAAAAMXd1
+ eGJhZncubHp6DAAAADFwdDEyZGxxLmxzdQwAAAAybjJ2d2U0bi51ajAMAAAAdTFnZ3YzdzAuaHkz
+ DAAAAGlua2kxbXB3LmhkMgwAAABrc3V5bWx6by5reHgMAAAAbWt4enR0cWMubXR5DAAAADNiNGI1
+ czR0Lnd2bwwAAAB5enVoaGdwNS5oZnQMAAAAbjNneWM0cTUuZzMwDAAAAGVndW9ldHg0LmNtMAwA
+ AABta2JobmJyZS51djUMAAAAeWt5eHYwbjQuc3NmDAAAAGw0bmhhYWFsLnFnbQwAAAB6b3hlMGVn
+ ZC50MXkMAAAAZnZhbXQycWouMWVlDAAAAG16Y2J2b2ljLnE0cwwAAABoMmtrZGdsbi5vemYMAAAA
+ YnpkbGhhMTEuczJyDAAAADVjMWZxb2RmLnBxcwwAAABkanRxcXN1aS55MnYMAAAAYXVpdG13NWEu
+ emZtDAAAAG9kdzEwZ3RsLmFxNAwAAAB4cHJkdDFwcS52NW0MAAAAbG1qcWtycXYuYjFuDAAAAHBh
+ Y21pcjJnLnBkNAwAAABvbGdoM2F3Zi5qanAMAAAAeXF6bG9uMHQucnMwDAAAAHh6eHNpeGdvLnVo
+ cAwAAAB0emt1bG5jaS5ndGcMAAAAd2tlamFwMHkuemZlDAAAAGwzYnQzb2UwLmxnbAwAAAB6YnVo
+ YmNlci40d2QMAAAAMnFwcDNub2QuZmNnDAAAAHZ4M3IydHZ2Lnl1MAwAAAB6NHVidnQxby5xYWkM
+ AAAAemNlc2JuZW4uM3ZyDAAAADV5Znh2ZHV1LmhtbwwAAABvbXdjajFoNS5zbnIMAAAAaTJuaG9r
+ ZGEuM21zDAAAAHc1aGxwYXg1Lms1ZQwAAAB2NHAzcHQ0Zy52Z2oMAAAAMzMwNXFtZGguZngzDAAA
+ AHNycjV2a2liLjN0NQwAAAB2cHJ0Z3N6ai4yYWkMAAAAY2dva3pqc2EuYWdwDAAAAGk0MGFzeDN4
+ LjAybQwAAABnMGgxZ3d5aC4yNDAMAAAAZWIwczBoaGYucjByDAAAAHlscnFua21nLndyZwwAAAA0
+ c3Ayd3J2My40bzIMAAAAcXE1Z2ZyZ2YuZTRkDAAAAHprMjF4aHRxLnM1bwwAAAA0aWh3NXEzcC5z
+ MDQMAAAAZmRxdmdmNG8udGxsDAAAAGYxdnlnbmQzLnF3MwwAAAB4bGN6cWV0Mi5maXoMAAAAamVp
+ NXl0NGEuNHVhDAAAAHJmNGtiZmdmLndxegwAAAB4bnNoYWJ0aS5oYnQMAAAAenhwcnN4cnkuaGJ6
+ DAAAADFnYWI1dW1kLnN5ZAwAAABvdm1uem01MS5sNXYMAAAAd3BlZGF0NWcub2thDAAAAGp4YjV3
+ aDU0LjVnZAwAAAAxYTIyZXBjcS4xMnoMAAAAM2VucDFsaHYueDVhDAAAAGRtd29ocGdpLnJuYgwA
+ AABqdmZ1MGRwMC4weXUMAAAAZmt6aHVwcjIudGx1DAAAAGN6Z2l3emV4LmRqYgwAAABxcGptM201
+ ei56dmIMAAAAMHd1d2VobW4ubW9hDAAAAHkxZ3FtajEzLnFkZAwAAABoc2pwYWlkdS40eWwMAAAA
+ aG52cHdyMWUuaTRrDAAAAHNtdG1yZHlmLnYwawwAAABrdXBlb3hqbi5mMzAMAAAAZW9ucGNubngu
+ YmIzDAAAAGRvdmh5MXd4LmhlYgwAAAAydHRuMXRjby5nZmgMAAAAMmhkbzQ0bjAucmRiDAAAAGVp
+ ZTF1dmJtLmxkZgwAAABqenBldXduay4wZjQMAAAAZDIxZjVjenYudWN4DAAAAHB5aWZmaTRxLnlx
+ NAwAAABtZXNsNXRldy40dmYMAAAAc3ZyMDFjcHEudWduDAAAAGpvemx1Mmp4LnJnZwwAAAB4cGho
+ ZWEycy5rbG0MAAAAbnJ3cTVtNWkuMmx5DAAAAGlqZ3Nnc3Q0LjBmbwwAAAA0dWdmbHVmei5xdGUM
+ AAAAeHkxZG4xMWkucDBsDAAAAGR0dHdvY2R1LjNuNAwAAABxYW9xMGdhaS5uMW0MAAAAbHNncnB3
+ bXcuemsxDAAAAGUxMHhwb2JxLmZnbwwAAAAzbGMydGo0aC5lemIMAAAAa3d3azBydjUuMm8xDAAA
+ AHAya3ZhZGNpLmpkYgwAAAB4cmR2bW5sbi52MXcMAAAAYXowYm51bG4ua3drDAAAAGNtaXF5NHZq
+ LmFlMwwAAAAxbmNmMmEwbC5sMXQMAAAAMzVhM2ZmcmIuZmFnDAAAAGh4bHJpZDIwLmNhbQwAAABh
+ czNwcHNmdS5xd2IMAAAAdjBpMXZ6ZXguZXduDAAAAHczcHNqZ21iLnYxZwwAAAB4angyNG9uZy56
+ bGYMAAAAM3RnbzFnZnAuYnIxDAAAAGkxaDJ1b2hqLmt3NQwAAAB4ZGp6YWIway53eXEMAAAAZGph
+ MnowMjEuNTJpDAAAAHBxdHpocmNkLm93cgwAAABobXZkaXdndy4wb2cMAAAAM2d5aGd0YzMuanBk
+ DAAAAHgxYWxnZGVuLnd0dgwAAABqYjBrcGhneC51MHgMAAAAa2kxMjRpdmQuMHhqDAAAAHkxYnpy
+ b3p1LmZqaQwAAABtM20xZGIzdi5ka2IMAAAAZDAzbHB2cWYuaHl3DAAAAHdvcmZyZnhuLjJ0agwA
+ AABjMnJxemk0bC5kdXIMAAAAMjNoMmtraHEuc2h6DAAAAGxjeXl3Y2ZrLmZjegwAAABleWQ0M2Ny
+ Yy41d2kMAAAAMmhycWdzM28uamkyDAAAADJ0eTR1a2tsLjVjcwwAAAB3aHJnbmQ1Yi5lYTAMAAAA
+ amcxa2J2Y2cuYXR2DAAAADFqcWFyemhiLmNyYgwAAAAwdWhkbWY0NS5meW4MAAAAamIzYW9tMm8u
+ MGhtDAAAAHR1cnppcTRvLmpibgwAAAB5c2d0dHN4aS5ucHcMAAAAcDN0eHVtcXIubWFzDAAAAHZq
+ emVlanEzLmsydwwAAABmcG01bmdrcy52eDAMAAAAbXBzMXRtcXguM3VvDAAAADVoajFsajJkLnp5
+ cAwAAABtMXhnb3oyay50Z3IMAAAAZHNpcXpvdGgucnFqDAAAAHFxb3B5d3R5LmhoaQwAAABjaXVs
+ YWtzdC5wdXEMAAAAeWdvNGJ1MmsuMnVnDAAAAGZtY2ticm5vLnIxYgwAAABobGhhaDRuby5wcncM
+ AAAAZGI1dm92cGoudXFzDAAAADM1MnpoM3h5LjJhYgwAAAAzY3poa3VvMC5penMMAAAAM2Yxanlj
+ ZzMuajB2DAAAAGtiZHIwdzR1LmdtdAwAAAB6eDNhNHZsYS51c2sMAAAAc2J1ZmZibjQubzRwDAAA
+ ADJjMGZ2c2UzLmt2eQwAAABwZWN4MzNjMS56MDQMAAAAa21zYjFrNDIuNXBqDAAAAGNwM3ZianZ0
+ LnU1egwAAAAwbDRkbWhxdC40eG4MAAAAYWwzM2piY2MuZ3hrDAAAADNxaXBqeHYxLnhhMAwAAABl
+ aTVjZ3BiMi5qdWEMAAAAZTVvdWNnd2subW1mDAAAAGVqZmpzMGhzLm1jbAwAAAAzaXhuZWt4bS54
+ d28MAAAAdGRybWdoenoudGNiDAAAAHU0dzFldjNnLnJ5ZAwAAAByY3Bta3p3ai5lcXcMAAAANWVr
+ bG41MHcuNXM0DAAAAHh4NWx6djBtLnV3bQwAAAAwMTFjcWFuNC55enMMAAAAa25iY3JwYmwuZmx6
+ DAAAADUzbXo1d2dvLnVsbQwAAAB6eTByMGxzci5zMjIMAAAAYWhudGJ4ajQuYmJtDAAAADQybDF3
+ MnlhLmJzawwAAAB6bzAxNW01aS50enQMAAAAYmF2YWZndTIucTNlDAAAAGdzaHljcXFmLjFpZAwA
+ AAA1YjAzNXN5ZC4ybGcMAAAAbHlpZnkwaG4uenh3DAAAAGV0YXBwbGdqLmczYQwAAABtNGp0dXFh
+ di52ZWwMAAAAcWRvb2t5eHYucnF3DAAAAG9qeGI0YWhsLnZjMAwAAAA0eWNqeXd6ai54aWQMAAAA
+ c3ZqdW1uNXguNW9rDAAAADJ4amZsMmZhLm9icgwAAABjd2Z0aHBqdC5hcXMMAAAAdGM1M2JxeHMu
+ eDRjDAAAAHl4amRnYnYwLm9saAwAAABpcW5tNWh0ZS4wd2IMAAAAbGcxeXprNHEuNWpkDAAAADUy
+ dG92MmJ6LjVkaAwAAABrYzNxMWtjMS5qeXkMAAAAZ3NoeHYzeTEuNXR6DAAAAGpydWtvMGNxLnJn
+ YwwAAABlamFydmxmaS41cDUMAAAAeXgwdGpzeWEudGlvDAAAAGd1MGJ5NGJvLm4weAwAAABrejVr
+ aDB6Yy53MGQMAAAAejNwZm5heHIuaWF6DAAAAHR5ZWI1YnFqLjN4NQwAAAByd3RzbmJuci56dGEM
+ AAAANXB0dDV5MzQuNWhiDAAAAGhwZmVwMHFyLmFrYwwAAABiaW5rMHlyYy5qd28MAAAAcG1lenBz
+ amwuamQzDAAAADAzbGVnZHRvLmx5eQwAAABiMzNkYWk0My5xZXgMAAAAZGxudHFnbzMubm5xDAAA
+ AGJnaGJoa2VlLnRpcwwAAAByazBxM3Btay5jNDAMAAAAdnFjYXIxMnUua3pwDAAAADVid2FvZmJu
+ LnVwZwwAAABiZzJremkwZS53cGkMAAAAZTU0enhjZnMubHR5DAAAAGVtMDVzMnBpLm90MQwAAABv
+ YjFwMzUxbi54bWwMAAAAMGh1a3R4d2wuamV0DAAAAGtiaDF6dWxpLnA0MgwAAAB6b2NrZWtiYy5r
+ azAMAAAAd2pwYTFjMnIudmpxDAAAAHVkbmFrMXlhLjJscQwAAABub3BsenF1Zy5mY3cMAAAAZWdh
+ ZGJpd2EuZnN0DAAAAGJ2cmdkM2tjLmZmYgwAAABybnhrY2xnMy5lcmEMAAAAZGhmeGtoMmwud2wx
+ DAAAAGFyZHBqbDNoLmJvYwwAAAB3a2gzdWZ4eC55cGoMAAAAeXF5YmJoc2IucHVpDAAAAHRtem41
+ cXlzLnpwcwwAAABhNGVjZ3ZiYi51cGsMAAAAem5wMmd6MmoubGwwDAAAAHJwMHJhcHhuLml6cwwA
+ AAA0dHp0ZWRtbC54ZXcMAAAAbXEwc2Zqem0uMGVyDAAAAGN5Mmx3b24xLnczdwwAAAAxbHV1cm5x
+ Yi5qcGUMAAAAc2g1dmdrM3AuaHRqDAAAAHRlMHduYm8yLmJwcgwAAABteTB1czE1NC51b24MAAAA
+ NWhmZ2NyanYuanJjDAAAAGlmbGxpMHl3LjNkegwAAAA1eWJkamdnaC5nZHEMAAAAY2dqaWFvejUu
+ bHlpDAAAAHJ6aXc1MnViLmM0ZQwAAAByNG1xMGlzZC4xbWMMAAAAeGJlcW5md2UuNG8xDAAAAHVw
+ dTF3aXN4LnhvaQwAAABoaGd4ZHk0cS5qYnYMAAAAcXYzYjBqb3AubWFhDAAAAGR3NGQxZ2hjLjRj
+ MQwAAAB0cHNrdnJyMS5iczAMAAAAb3h0Z2N1M2EuZ2gxDAAAADNvamFlaGJ4Lm9rdAwAAAA1dGF0
+ ZmZwby50ZjQMAAAAdHM1c2N5c2gudnZwDAAAAHZncGE0amJrLnRrMgwAAABoamN3c2RvMi5waHEM
+ AAAAenZjMTMwZ3UuYjBpDAAAAHI0MWdrb2pjLnV3ZwwAAABnaHUwazByai40c24MAAAAZnoxM294
+ NGgubWxqDAAAAHMyZ2JjNXBqLnF0NQwAAAAycHJmb3Joai5mYjEMAAAAdm1icm1ucWIubGIzDAAA
+ AG1paHd2NWxhLmFmZwwAAABkdGhuZTRubC5saWsMAAAAdHh0dmZpdHcubnN2DAAAAGtiZHR5bjBs
+ LjFhaAwAAABzYmhia3Zhcy5qMm8MAAAAMHJzcDRtZmouZXU1DAAAAHpxeXVzZTV3LmY1NQwAAABr
+ Z2dwZzVzZS5nYWgMAAAAbTRjaTV4ZXoubGxhDAAAADEycTFkenBxLmEwdAwAAABuY3lyMnFzcy41
+ YTAMAAAAc2Zka2VsbW0ub3RyDAAAADRiZWdsMmZtLnh4NQwAAABzdnBscXhoNS5lbHcMAAAAZ3hh
+ b2FhbzUuZjJ4DAAAAG40c3JkZmt6LjQ0dgwAAABicHR2Mm5qbS50amwMAAAAY2FoZTBidGouYTBz
+ DAAAAGFkMGQ1dHJoLm0xdgwAAAB6dWswMW9hMy51M3gMAAAAcXoxdm90c2kudXg1DAAAAGl2Yndu
+ MjAxLnIzNQwAAABveW5xaHd2YS5ldGIMAAAAdHAzaG56b3AuZjVlDAAAAGpxcjJwbHhqLmVldAwA
+ AABnY2FvZG1iYS56M3MMAAAAandxejBkaGEueGF1DAAAAGt2MG5oMmZuLnZpYgwAAAAxNGMzanEw
+ dS5peW0MAAAAM212NGw0NTEuaGFsDAAAAGVxbXpoMXgwLjJuawwAAABzbGZub2xndy5jMHgMAAAA
+ dTNmZjVkdmIuZHozDAAAADVwNWZlMm9pLnN6cwwAAAAybmF5ajFwdS5pZG8MAAAAZDAycmZiM24u
+ djBhDAAAAGx3eW40d29jLmQyZwwAAAAycjR6bHRubS5qMWoMAAAAMWlyYnltMnQudXdpDAAAADBh
+ eHpqbTRwLjJycQwAAABibXR1eTBsaS4yZ2UVAhlMSBVwYXJxdWV0LWRvdG5ldC1zY2hlbWEVBgAV
+ DCUCGAJpZCUAABUMJQIYB3N0cmluZzElAAAVDCUCGAdzdHJpbmcyJQAAFqAfGSwZPCYIHBUMGTUG
+ CAAZGAJpZBUAFtAPFrhsFrhsJgg8GAM5OTkYATAWABbQDxgDOTk5GAEwAAAAJsBsHBUMGTUGCAAZ
+ GAdzdHJpbmcxFQAW0A8WuPsBFrj7ASbAbDwYDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzFgAW
+ 0A8YDHp6cTBrZnk0LnZibhgMMDF3d3llNGcucGZzAAAAJvjnAhwVDBk1BggAGRgHc3RyaW5nMhUA
+ FtAPFrj7ARa4+wEm+OcCPBgMenpxMGtmeTQudmJuGAwwMXd3eWU0Zy5wZnMWABbQDxgMenpxMGtm
+ eTQudmJuGAwwMXd3eWU0Zy5wZnMAAAAWqOMEFtAPABk8JrDjBBwVDBk1BggAGRgCaWQVABbQDxb0
+ fRb0fSaw4wQ8GAQxOTk5GAQxMDAwFgAW0A8YBDE5OTkYBDEwMDAAAAAmpOEFHBUMGTUGCAAZGAdz
+ dHJpbmcxFQAW0A8WuPsBFrj7ASak4QU8GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cxYAFtAP
+ GAx6emxneXhhNS40eWEYDDAxMWNxYW40Lnl6cwAAACbc3AccFQwZNQYIABkYB3N0cmluZzIVABbQ
+ Dxa4+wEWuPsBJtzcBzwYDHp6bGd5eGE1LjR5YRgMMDExY3FhbjQueXpzFgAW0A8YDHp6bGd5eGE1
+ LjR5YRgMMDExY3FhbjQueXpzAAAAFuT0BBbQDwAoTFBhcnF1ZXQuTmV0IHZlcnNpb24gMy41LjMg
+ KGJ1aWxkICcwNTc0NTFiMzc2ZmE3ZDM1ODFmMmQxODAxZmIwOTY1YWZiZWFhMGMyJykAxQIAAFBB
+ UjE=
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '80087'
+ Content-Type:
+ - application/json
+ User-Agent:
+ - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 66b6659e-996d-11eb-9ac2-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 19:54:31 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PATCH
+ uri: https://storagename.dfs.core.windows.net/utqqcontainercdb31860/csvfilecdb31860?action=append&position=0
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 19:54:31 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - 1b04ce31-501f-000b-7d7a-2dd77b000000
+ x-ms-request-server-encrypted:
+ - 'true'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 202
+ message: Accepted
+- request:
+ body: null
+ headers:
+ Accept:
+ - application/json
+ Accept-Encoding:
+ - gzip, deflate
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '0'
+ If-Match:
+ - '"0x8D8FB914AE5DEAD"'
+ User-Agent:
+ - azsdk-python-storage-dfs/12.4.0b1 Python/3.8.5 (Windows-10-10.0.19041-SP0)
+ x-ms-client-request-id:
+ - 66dabc17-996d-11eb-bb26-c8348e5fffbf
+ x-ms-date:
+ - Fri, 09 Apr 2021 19:54:32 GMT
+ x-ms-version:
+ - '2020-06-12'
+ method: PATCH
+ uri: https://storagename.dfs.core.windows.net/utqqcontainercdb31860/csvfilecdb31860?action=flush&position=80087&close=true
+ response:
+ body:
+ string: ''
+ headers:
+ Content-Length:
+ - '0'
+ Date:
+ - Fri, 09 Apr 2021 19:54:31 GMT
+ ETag:
+ - '"0x8D8FB914B1C8907"'
+ Last-Modified:
+ - Fri, 09 Apr 2021 19:54:32 GMT
+ Server:
+ - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0
+ x-ms-request-id:
+ - 1b04ce32-501f-000b-7e7a-2dd77b000000
+ x-ms-request-server-encrypted:
+ - 'false'
+ x-ms-version:
+ - '2020-06-12'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/sdk/storage/azure-storage-file-datalake/tests/resources/parquet.parquet b/sdk/storage/azure-storage-file-datalake/tests/resources/parquet.parquet
new file mode 100644
index 000000000000..8eff6678085d
Binary files /dev/null and b/sdk/storage/azure-storage-file-datalake/tests/resources/parquet.parquet differ
diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py
new file mode 100644
index 000000000000..080c121e4971
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py
@@ -0,0 +1,323 @@
+# coding: utf-8
+
+# -------------------------------------------------------------------------
+# Copyright (c) Microsoft Corporation. All rights reserved.
+# Licensed under the MIT License. See License.txt in the project root for
+# license information.
+# --------------------------------------------------------------------------
+import unittest
+
+from azure.core.exceptions import HttpResponseError
+
+
+from azure.storage.filedatalake import DataLakeServiceClient
+from testcase import (
+ StorageTestCase,
+ DataLakePreparer)
+
+# ------------------------------------------------------------------------------
+from azure.storage.filedatalake._models import AnalyticsLogging, Metrics, RetentionPolicy, \
+ StaticWebsite, CorsRule
+
+# ------------------------------------------------------------------------------
+
+
+class DatalakeServiceTest(StorageTestCase):
+ def _setUp(self, account_name, account_key):
+ url = self._get_account_url(account_name)
+ self.dsc = DataLakeServiceClient(url, account_key)
+ self.config = self.dsc._config
+
+ # --Helpers-----------------------------------------------------------------
+ def _assert_properties_default(self, prop):
+ self.assertIsNotNone(prop)
+ self._assert_logging_equal(prop['analytics_logging'], AnalyticsLogging())
+ self._assert_metrics_equal(prop['hour_metrics'], Metrics())
+ self._assert_metrics_equal(prop['minute_metrics'], Metrics())
+ self._assert_cors_equal(prop['cors'], list())
+
+ def _assert_logging_equal(self, log1, log2):
+ if log1 is None or log2 is None:
+ self.assertEqual(log1, log2)
+ return
+
+ self.assertEqual(log1.version, log2.version)
+ self.assertEqual(log1.read, log2.read)
+ self.assertEqual(log1.write, log2.write)
+ self.assertEqual(log1.delete, log2.delete)
+ self._assert_retention_equal(log1.retention_policy, log2.retention_policy)
+
+ def _assert_delete_retention_policy_equal(self, policy1, policy2):
+ if policy1 is None or policy2 is None:
+ self.assertEqual(policy1, policy2)
+ return
+
+ self.assertEqual(policy1.enabled, policy2.enabled)
+ self.assertEqual(policy1.days, policy2.days)
+
+ def _assert_static_website_equal(self, prop1, prop2):
+ if prop1 is None or prop2 is None:
+ self.assertEqual(prop1, prop2)
+ return
+
+ self.assertEqual(prop1.enabled, prop2.enabled)
+ self.assertEqual(prop1.index_document, prop2.index_document)
+ self.assertEqual(prop1.error_document404_path, prop2.error_document404_path)
+ self.assertEqual(prop1.default_index_document_path, prop2.default_index_document_path)
+
+ def _assert_delete_retention_policy_not_equal(self, policy1, policy2):
+ if policy1 is None or policy2 is None:
+ self.assertNotEqual(policy1, policy2)
+ return
+
+ self.assertFalse(policy1.enabled == policy2.enabled
+ and policy1.days == policy2.days)
+
+ def _assert_metrics_equal(self, metrics1, metrics2):
+ if metrics1 is None or metrics2 is None:
+ self.assertEqual(metrics1, metrics2)
+ return
+
+ self.assertEqual(metrics1.version, metrics2.version)
+ self.assertEqual(metrics1.enabled, metrics2.enabled)
+ self.assertEqual(metrics1.include_apis, metrics2.include_apis)
+ self._assert_retention_equal(metrics1.retention_policy, metrics2.retention_policy)
+
+ def _assert_cors_equal(self, cors1, cors2):
+ if cors1 is None or cors2 is None:
+ self.assertEqual(cors1, cors2)
+ return
+
+ self.assertEqual(len(cors1), len(cors2))
+
+ for i in range(0, len(cors1)):
+ rule1 = cors1[i]
+ rule2 = cors2[i]
+ self.assertEqual(len(rule1.allowed_origins), len(rule2.allowed_origins))
+ self.assertEqual(len(rule1.allowed_methods), len(rule2.allowed_methods))
+ self.assertEqual(rule1.max_age_in_seconds, rule2.max_age_in_seconds)
+ self.assertEqual(len(rule1.exposed_headers), len(rule2.exposed_headers))
+ self.assertEqual(len(rule1.allowed_headers), len(rule2.allowed_headers))
+
+ def _assert_retention_equal(self, ret1, ret2):
+ self.assertEqual(ret1.enabled, ret2.enabled)
+ self.assertEqual(ret1.days, ret2.days)
+
+ # --Test cases per service ---------------------------------------
+ @DataLakePreparer()
+ def test_datalake_service_properties(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ # Act
+ resp = self.dsc.set_service_properties(
+ analytics_logging=AnalyticsLogging(),
+ hour_metrics=Metrics(),
+ minute_metrics=Metrics(),
+ cors=list(),
+ target_version='2014-02-14'
+ )
+
+ # Assert
+ self.assertIsNone(resp)
+ props = self.dsc.get_service_properties()
+ self._assert_properties_default(props)
+ self.assertEqual('2014-02-14', props['target_version'])
+
+ @DataLakePreparer()
+ def test_empty_set_service_properties_exception(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ with self.assertRaises(ValueError):
+ self.dsc.set_service_properties()
+
+ @DataLakePreparer()
+ def test_set_default_service_version(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ # Act
+ self.dsc.set_service_properties(target_version='2014-02-14')
+
+ # Assert
+ received_props = self.dsc.get_service_properties()
+ self.assertEqual(received_props['target_version'], '2014-02-14')
+
+ @DataLakePreparer()
+ def test_set_delete_retention_policy(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ delete_retention_policy = RetentionPolicy(enabled=True, days=2)
+
+ # Act
+ self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy)
+
+ # Assert
+ received_props = self.dsc.get_service_properties()
+ self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy)
+
+ @DataLakePreparer()
+ def test_set_delete_retention_policy_edge_cases(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ delete_retention_policy = RetentionPolicy(enabled=True, days=1)
+ self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy)
+
+ # Assert
+ received_props = self.dsc.get_service_properties()
+ self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy)
+
+ # Should work with maximum settings
+ delete_retention_policy = RetentionPolicy(enabled=True, days=365)
+ self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy)
+
+ # Assert
+ received_props = self.dsc.get_service_properties()
+ self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy)
+
+ # Should not work with 0 days
+ delete_retention_policy = RetentionPolicy(enabled=True, days=0)
+
+ with self.assertRaises(HttpResponseError):
+ self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy)
+
+ # Assert
+ received_props = self.dsc.get_service_properties()
+ self._assert_delete_retention_policy_not_equal(
+ received_props['delete_retention_policy'], delete_retention_policy)
+
+ # Should not work with 366 days
+ delete_retention_policy = RetentionPolicy(enabled=True, days=366)
+
+ with self.assertRaises(HttpResponseError):
+ self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy)
+
+ # Assert
+ received_props = self.dsc.get_service_properties()
+ self._assert_delete_retention_policy_not_equal(
+ received_props['delete_retention_policy'], delete_retention_policy)
+
+ @DataLakePreparer()
+ def test_set_static_website_properties(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ static_website = StaticWebsite(
+ enabled=True,
+ index_document="index.html",
+ error_document404_path="errors/error/404error.html")
+
+ # Act
+ self.dsc.set_service_properties(static_website=static_website)
+
+ # Assert
+ received_props = self.dsc.get_service_properties()
+ self._assert_static_website_equal(received_props['static_website'], static_website)
+
+ @DataLakePreparer()
+ def test_disabled_static_website_properties(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ static_website = StaticWebsite(enabled=False, index_document="index.html",
+ error_document404_path="errors/error/404error.html")
+
+ # Act
+ self.dsc.set_service_properties(static_website=static_website)
+
+ # Assert
+ received_props = self.dsc.get_service_properties()
+ self._assert_static_website_equal(received_props['static_website'], StaticWebsite(enabled=False))
+
+ @DataLakePreparer()
+ def test_set_static_website_props_dont_impact_other_props(
+ self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ cors_rule1 = CorsRule(['www.xyz.com'], ['GET'])
+
+ allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"]
+ allowed_methods = ['GET', 'PUT']
+ max_age_in_seconds = 500
+ exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"]
+ allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"]
+ cors_rule2 = CorsRule(
+ allowed_origins,
+ allowed_methods,
+ max_age_in_seconds=max_age_in_seconds,
+ exposed_headers=exposed_headers,
+ allowed_headers=allowed_headers)
+
+ cors = [cors_rule1, cors_rule2]
+
+ # Act to set cors
+ self.dsc.set_service_properties(cors=cors)
+
+ # Assert cors is updated
+ received_props = self.dsc.get_service_properties()
+ self._assert_cors_equal(received_props['cors'], cors)
+
+ # Arrange to set static website properties
+ static_website = StaticWebsite(enabled=True, index_document="index.html",
+ error_document404_path="errors/error/404error.html")
+
+ # Act to set static website
+ self.dsc.set_service_properties(static_website=static_website)
+
+ # Assert static website was updated was cors was unchanged
+ received_props = self.dsc.get_service_properties()
+ self._assert_static_website_equal(received_props['static_website'], static_website)
+ self._assert_cors_equal(received_props['cors'], cors)
+
+ @DataLakePreparer()
+ def test_set_logging(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ logging = AnalyticsLogging(read=True, write=True, delete=True,
+ retention_policy=RetentionPolicy(enabled=True, days=5))
+
+ # Act
+ self.dsc.set_service_properties(analytics_logging=logging)
+
+ # Assert
+ received_props = self.dsc.get_service_properties()
+ self._assert_logging_equal(received_props['analytics_logging'], logging)
+
+ @DataLakePreparer()
+ def test_set_hour_metrics(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ hour_metrics = Metrics(
+ include_apis=False, enabled=True, retention_policy=RetentionPolicy(enabled=True, days=5))
+
+ # Act
+ self.dsc.set_service_properties(hour_metrics=hour_metrics)
+
+ # Assert
+ received_props = self.dsc.get_service_properties()
+ self._assert_metrics_equal(received_props['hour_metrics'], hour_metrics)
+
+ @DataLakePreparer()
+ def test_set_minute_metrics(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ minute_metrics = Metrics(enabled=True, include_apis=True,
+ retention_policy=RetentionPolicy(enabled=True, days=5))
+
+ # Act
+ self.dsc.set_service_properties(minute_metrics=minute_metrics)
+
+ # Assert
+ received_props = self.dsc.get_service_properties()
+ self._assert_metrics_equal(received_props['minute_metrics'], minute_metrics)
+
+ @DataLakePreparer()
+ def test_set_cors(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ cors_rule1 = CorsRule(['www.xyz.com'], ['GET'])
+
+ allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"]
+ allowed_methods = ['GET', 'PUT']
+ max_age_in_seconds = 500
+ exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"]
+ allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"]
+ cors_rule2 = CorsRule(
+ allowed_origins,
+ allowed_methods,
+ max_age_in_seconds=max_age_in_seconds,
+ exposed_headers=exposed_headers,
+ allowed_headers=allowed_headers)
+
+ cors = [cors_rule1, cors_rule2]
+
+ # Act
+ self.dsc.set_service_properties(cors=cors)
+
+ # Assert
+ received_props = self.dsc.get_service_properties()
+ self._assert_cors_equal(received_props['cors'], cors)
diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py
new file mode 100644
index 000000000000..a5227fb090fc
--- /dev/null
+++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py
@@ -0,0 +1,318 @@
+# coding: utf-8
+
+# -------------------------------------------------------------------------
+# Copyright (c) Microsoft Corporation. All rights reserved.
+# Licensed under the MIT License. See License.txt in the project root for
+# license information.
+# --------------------------------------------------------------------------
+import asyncio
+import unittest
+
+from azure.core.exceptions import HttpResponseError
+
+
+from azure.storage.filedatalake.aio import DataLakeServiceClient
+from asynctestcase import StorageTestCase
+from testcase import DataLakePreparer
+
+# ------------------------------------------------------------------------------
+from azure.storage.filedatalake._models import AnalyticsLogging, Metrics, RetentionPolicy, \
+ StaticWebsite, CorsRule
+
+# ------------------------------------------------------------------------------
+
+
+class DatalakeServiceTest(StorageTestCase):
+ def _setUp(self, account_name, account_key):
+ url = self._get_account_url(account_name)
+ self.dsc = DataLakeServiceClient(url, credential=account_key, logging_enable=True)
+ self.config = self.dsc._config
+
+ # --Helpers-----------------------------------------------------------------
+ def _assert_properties_default(self, prop):
+ self.assertIsNotNone(prop)
+ self._assert_logging_equal(prop['analytics_logging'], AnalyticsLogging())
+ self._assert_metrics_equal(prop['hour_metrics'], Metrics())
+ self._assert_metrics_equal(prop['minute_metrics'], Metrics())
+ self._assert_cors_equal(prop['cors'], list())
+
+ def _assert_logging_equal(self, log1, log2):
+ if log1 is None or log2 is None:
+ self.assertEqual(log1, log2)
+ return
+
+ self.assertEqual(log1.version, log2.version)
+ self.assertEqual(log1.read, log2.read)
+ self.assertEqual(log1.write, log2.write)
+ self.assertEqual(log1.delete, log2.delete)
+ self._assert_retention_equal(log1.retention_policy, log2.retention_policy)
+
+ def _assert_delete_retention_policy_equal(self, policy1, policy2):
+ if policy1 is None or policy2 is None:
+ self.assertEqual(policy1, policy2)
+ return
+
+ self.assertEqual(policy1.enabled, policy2.enabled)
+ self.assertEqual(policy1.days, policy2.days)
+
+ def _assert_static_website_equal(self, prop1, prop2):
+ if prop1 is None or prop2 is None:
+ self.assertEqual(prop1, prop2)
+ return
+
+ self.assertEqual(prop1.enabled, prop2.enabled)
+ self.assertEqual(prop1.index_document, prop2.index_document)
+ self.assertEqual(prop1.error_document404_path, prop2.error_document404_path)
+ self.assertEqual(prop1.default_index_document_path, prop2.default_index_document_path)
+
+ def _assert_delete_retention_policy_not_equal(self, policy1, policy2):
+ if policy1 is None or policy2 is None:
+ self.assertNotEqual(policy1, policy2)
+ return
+
+ self.assertFalse(policy1.enabled == policy2.enabled
+ and policy1.days == policy2.days)
+
+ def _assert_metrics_equal(self, metrics1, metrics2):
+ if metrics1 is None or metrics2 is None:
+ self.assertEqual(metrics1, metrics2)
+ return
+
+ self.assertEqual(metrics1.version, metrics2.version)
+ self.assertEqual(metrics1.enabled, metrics2.enabled)
+ self.assertEqual(metrics1.include_apis, metrics2.include_apis)
+ self._assert_retention_equal(metrics1.retention_policy, metrics2.retention_policy)
+
+ def _assert_cors_equal(self, cors1, cors2):
+ if cors1 is None or cors2 is None:
+ self.assertEqual(cors1, cors2)
+ return
+
+ self.assertEqual(len(cors1), len(cors2))
+
+ for i in range(0, len(cors1)):
+ rule1 = cors1[i]
+ rule2 = cors2[i]
+ self.assertEqual(len(rule1.allowed_origins), len(rule2.allowed_origins))
+ self.assertEqual(len(rule1.allowed_methods), len(rule2.allowed_methods))
+ self.assertEqual(rule1.max_age_in_seconds, rule2.max_age_in_seconds)
+ self.assertEqual(len(rule1.exposed_headers), len(rule2.exposed_headers))
+ self.assertEqual(len(rule1.allowed_headers), len(rule2.allowed_headers))
+
+ def _assert_retention_equal(self, ret1, ret2):
+ self.assertEqual(ret1.enabled, ret2.enabled)
+ self.assertEqual(ret1.days, ret2.days)
+
+ # --Test cases per service ---------------------------------------
+ @DataLakePreparer()
+ async def test_datalake_service_properties(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ # Act
+ await self.dsc.set_service_properties(
+ analytics_logging=AnalyticsLogging(),
+ hour_metrics=Metrics(),
+ minute_metrics=Metrics(),
+ cors=list(),
+ target_version='2014-02-14'
+ )
+
+ # Assert
+ props = await self.dsc.get_service_properties()
+ self._assert_properties_default(props)
+ self.assertEqual('2014-02-14', props['target_version'])
+
+ @DataLakePreparer()
+ async def test_empty_set_service_properties_exception(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ with self.assertRaises(ValueError):
+ await self.dsc.set_service_properties()
+
+ @DataLakePreparer()
+ async def test_set_default_service_version(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ # Act
+ await self.dsc.set_service_properties(target_version='2014-02-14')
+
+ # Assert
+ received_props = await self.dsc.get_service_properties()
+ self.assertEqual(received_props['target_version'], '2014-02-14')
+
+ @DataLakePreparer()
+ async def test_set_delete_retention_policy(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ delete_retention_policy = RetentionPolicy(enabled=True, days=2)
+
+ # Act
+ await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy)
+
+ # Assert
+ received_props = await self.dsc.get_service_properties()
+ self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy)
+
+ @DataLakePreparer()
+ async def test_set_delete_retention_policy_edge_cases(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ delete_retention_policy = RetentionPolicy(enabled=True, days=1)
+ await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy)
+
+ # Assert
+ received_props = await self.dsc.get_service_properties()
+ self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy)
+
+ # Should work with maximum settings
+ delete_retention_policy = RetentionPolicy(enabled=True, days=365)
+ await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy)
+
+ # Assert
+ received_props = await self.dsc.get_service_properties()
+ self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy)
+
+ # Should not work with 0 days
+ delete_retention_policy = RetentionPolicy(enabled=True, days=0)
+
+ with self.assertRaises(HttpResponseError):
+ await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy)
+
+ # Assert
+ received_props = await self.dsc.get_service_properties()
+ self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy)
+
+ # Should not work with 366 days
+ delete_retention_policy = RetentionPolicy(enabled=True, days=366)
+
+ with self.assertRaises(HttpResponseError):
+ await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy)
+
+ # Assert
+ received_props = await self.dsc.get_service_properties()
+ self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy)
+
+ @DataLakePreparer()
+ async def test_set_static_website_properties(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ static_website = StaticWebsite(
+ enabled=True,
+ index_document="index.html",
+ error_document404_path="errors/error/404error.html")
+
+ # Act
+ await self.dsc.set_service_properties(static_website=static_website)
+
+ # Assert
+ received_props = await self.dsc.get_service_properties()
+ self._assert_static_website_equal(received_props['static_website'], static_website)
+
+ @DataLakePreparer()
+ async def test_disabled_static_website_properties(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ static_website = StaticWebsite(enabled=False, index_document="index.html",
+ error_document404_path="errors/error/404error.html")
+
+ # Act
+ await self.dsc.set_service_properties(static_website=static_website)
+
+ # Assert
+ received_props = await self.dsc.get_service_properties()
+ self._assert_static_website_equal(received_props['static_website'], StaticWebsite(enabled=False))
+
+ @DataLakePreparer()
+ async def test_set_static_website_props_dont_impact_other_props(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ cors_rule1 = CorsRule(['www.xyz.com'], ['GET'])
+
+ allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"]
+ allowed_methods = ['GET', 'PUT']
+ max_age_in_seconds = 500
+ exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"]
+ allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"]
+ cors_rule2 = CorsRule(
+ allowed_origins,
+ allowed_methods,
+ max_age_in_seconds=max_age_in_seconds,
+ exposed_headers=exposed_headers,
+ allowed_headers=allowed_headers)
+
+ cors = [cors_rule1, cors_rule2]
+
+ # Act to set cors
+ await self.dsc.set_service_properties(cors=cors)
+
+ # Assert cors is updated
+ received_props = await self.dsc.get_service_properties()
+ self._assert_cors_equal(received_props['cors'], cors)
+
+ # Arrange to set static website properties
+ static_website = StaticWebsite(enabled=True, index_document="index.html",
+ error_document404_path="errors/error/404error.html")
+
+ # Act to set static website
+ await self.dsc.set_service_properties(static_website=static_website)
+
+ # Assert static website was updated was cors was unchanged
+ received_props = await self.dsc.get_service_properties()
+ self._assert_static_website_equal(received_props['static_website'], static_website)
+ self._assert_cors_equal(received_props['cors'], cors)
+
+ @DataLakePreparer()
+ async def test_set_logging(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ logging = AnalyticsLogging(read=True, write=True, delete=True, retention_policy=RetentionPolicy(enabled=True, days=5))
+
+ # Act
+ await self.dsc.set_service_properties(analytics_logging=logging)
+
+ # Assert
+ received_props = await self.dsc.get_service_properties()
+ self._assert_logging_equal(received_props['analytics_logging'], logging)
+
+ @DataLakePreparer()
+ async def test_set_hour_metrics(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ hour_metrics = Metrics(
+ include_apis=False, enabled=True, retention_policy=RetentionPolicy(enabled=True, days=5))
+
+ # Act
+ await self.dsc.set_service_properties(hour_metrics=hour_metrics)
+
+ # Assert
+ received_props = await self.dsc.get_service_properties()
+ self._assert_metrics_equal(received_props['hour_metrics'], hour_metrics)
+
+ @DataLakePreparer()
+ async def test_set_minute_metrics(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ minute_metrics = Metrics(
+ enabled=True, include_apis=True, retention_policy=RetentionPolicy(enabled=True, days=5))
+
+ # Act
+ await self.dsc.set_service_properties(minute_metrics=minute_metrics)
+
+ # Assert
+ received_props = await self.dsc.get_service_properties()
+ self._assert_metrics_equal(received_props['minute_metrics'], minute_metrics)
+
+ @DataLakePreparer()
+ async def test_set_cors(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ cors_rule1 = CorsRule(['www.xyz.com'], ['GET'])
+
+ allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"]
+ allowed_methods = ['GET', 'PUT']
+ max_age_in_seconds = 500
+ exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"]
+ allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"]
+ cors_rule2 = CorsRule(
+ allowed_origins,
+ allowed_methods,
+ max_age_in_seconds=max_age_in_seconds,
+ exposed_headers=exposed_headers,
+ allowed_headers=allowed_headers)
+
+ cors = [cors_rule1, cors_rule2]
+
+ # Act
+ await self.dsc.set_service_properties(cors=cors)
+
+ # Assert
+ received_props = await self.dsc.get_service_properties()
+ self._assert_cors_equal(received_props['cors'], cors)
diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_directory.py b/sdk/storage/azure-storage-file-datalake/tests/test_directory.py
index 9378ee0b954c..95afd9d4a3c4 100644
--- a/sdk/storage/azure-storage-file-datalake/tests/test_directory.py
+++ b/sdk/storage/azure-storage-file-datalake/tests/test_directory.py
@@ -187,9 +187,7 @@ def test_delete_directory(self, datalake_storage_account_name, datalake_storage_
directory_client = self.dsc.get_directory_client(self.file_system_name, directory_name)
directory_client.create_directory(metadata=metadata)
- response = directory_client.delete_directory()
- # Assert
- self.assertIsNone(response)
+ directory_client.delete_directory()
@DataLakePreparer()
def test_delete_directory_with_if_modified_since(self, datalake_storage_account_name, datalake_storage_account_key):
diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py
index 131d98f13818..6a2845d39e8c 100644
--- a/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py
+++ b/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py
@@ -208,9 +208,7 @@ async def test_delete_directory_async(self, datalake_storage_account_name, datal
directory_client = self.dsc.get_directory_client(self.file_system_name, directory_name)
await directory_client.create_directory(metadata=metadata)
- response = await directory_client.delete_directory()
- # Assert
- self.assertIsNone(response)
+ await directory_client.delete_directory()
@DataLakePreparer()
async def test_delete_directory_with_if_modified_since_async(self, datalake_storage_account_name, datalake_storage_account_key):
diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py
index 3fd8b20f0a3f..1137f5754e96 100644
--- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py
+++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py
@@ -21,6 +21,8 @@
# ------------------------------------------------------------------------------
from azure.storage.filedatalake import AccessPolicy, FileSystemSasPermissions
+from azure.storage.filedatalake._list_paths_helper import DirectoryPrefix
+from azure.storage.filedatalake._models import DeletedPathProperties
TEST_FILE_SYSTEM_PREFIX = 'filesystem'
# ------------------------------------------------------------------------------
@@ -412,6 +414,50 @@ def test_list_paths(self, datalake_storage_account_name, datalake_storage_accoun
self.assertEqual(len(paths), 6)
self.assertTrue(isinstance(paths[0].last_modified, datetime))
+ @DataLakePreparer()
+ def test_get_deleted_paths(self, datalake_storage_account_name, datalake_storage_account_key):
+ if not self.is_playback():
+ return
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ # Arrange
+ file_system = self._create_file_system()
+ file0 = file_system.create_file("file0")
+ file1 = file_system.create_file("file1")
+
+ dir1 = file_system.create_directory("dir1")
+ dir2 = file_system.create_directory("dir2")
+ dir3 = file_system.create_directory("dir3")
+ file_in_dir3 = dir3.create_file("file_in_dir3")
+ file_in_subdir = dir3.create_file("subdir/file_in_subdir")
+
+ file0.delete_file()
+ file1.delete_file()
+ dir1.delete_directory()
+ dir2.delete_directory()
+ file_in_dir3.delete_file()
+ file_in_subdir.delete_file()
+ deleted_paths = list(file_system.list_deleted_paths())
+ dir3_paths = list(file_system.list_deleted_paths(path_prefix="dir3/"))
+
+ # Assert
+ self.assertEqual(len(deleted_paths), 6)
+ self.assertEqual(len(dir3_paths), 2)
+ self.assertIsNotNone(dir3_paths[0].deletion_id)
+ self.assertIsNotNone(dir3_paths[1].deletion_id)
+ self.assertEqual(dir3_paths[0].name, 'dir3/file_in_dir3')
+ self.assertEqual(dir3_paths[1].name, 'dir3/subdir/file_in_subdir')
+
+ paths_generator1 = file_system.list_deleted_paths(max_results=2).by_page()
+ paths1 = list(next(paths_generator1))
+
+ paths_generator2 = file_system.list_deleted_paths(max_results=4).by_page(
+ continuation_token=paths_generator1.continuation_token)
+ paths2 = list(next(paths_generator2))
+
+ # Assert
+ self.assertEqual(len(paths1), 2)
+ self.assertEqual(len(paths2), 4)
+
@DataLakePreparer()
def test_list_paths_which_are_all_files(self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
@@ -556,6 +602,35 @@ def test_file_system_sessions_closes_properly(self, datalake_storage_account_nam
with fs_client.get_directory_client("file2") as f_client:
f_client.create_directory()
+ @DataLakePreparer()
+ def test_undelete_dir_with_version_id(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ if not self.is_playback():
+ return
+ file_system_client = self._create_file_system("fs")
+ dir_path = 'dir10'
+ dir_client = file_system_client.create_directory(dir_path)
+ resp = dir_client.delete_directory()
+ with self.assertRaises(HttpResponseError):
+ file_system_client.get_file_client(dir_path).get_file_properties()
+ restored_dir_client = file_system_client._undelete_path(dir_path, resp['deletion_id'])
+ resp = restored_dir_client.get_directory_properties()
+ self.assertIsNotNone(resp)
+
+ @DataLakePreparer()
+ def test_undelete_file_with_version_id(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ if not self.is_playback():
+ return
+ file_system_client = self._create_file_system("fs1")
+ file_path = 'dir10/fileŇ'
+ dir_client = file_system_client.create_file(file_path)
+ resp = dir_client.delete_file()
+ with self.assertRaises(HttpResponseError):
+ file_system_client.get_file_client(file_path).get_file_properties()
+ restored_file_client = file_system_client._undelete_path(file_path, resp['deletion_id'])
+ resp = restored_file_client.get_file_properties()
+ self.assertIsNotNone(resp)
# ------------------------------------------------------------------------------
if __name__ == '__main__':
unittest.main()
diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py
index 3788d1ec7377..2b31480e2662 100644
--- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py
+++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py
@@ -18,8 +18,8 @@
from azure.core.pipeline.transport import AioHttpTransport
from multidict import CIMultiDict, CIMultiDictProxy
-from azure.storage.filedatalake import AccessPolicy, generate_directory_sas, DirectorySasPermissions, \
- generate_file_system_sas, generate_account_sas, ResourceTypes, AccountSasPermissions
+from azure.storage.filedatalake import generate_account_sas, ResourceTypes, AccountSasPermissions
+from azure.storage.filedatalake import AccessPolicy, DirectorySasPermissions, generate_file_system_sas
from azure.storage.filedatalake.aio import DataLakeServiceClient, DataLakeDirectoryClient, FileSystemClient
from azure.storage.filedatalake import PublicAccess
from asynctestcase import (
@@ -105,7 +105,8 @@ async def test_file_system_exists(self, datalake_storage_account_name, datalake_
self.assertFalse(await file_system_client2.exists())
@DataLakePreparer()
- async def test_create_file_system_with_metadata_async(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_create_file_system_with_metadata_async(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
# Arrange
metadata = {'hello': 'world', 'number': '42'}
@@ -141,7 +142,8 @@ async def test_list_file_systems_async(self, datalake_storage_account_name, data
self.assertIsNotNone(file_systems[0].has_legal_hold)
@DataLakePreparer()
- async def test_delete_file_system_with_existing_file_system_async(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_delete_file_system_with_existing_file_system_async(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
# Arrange
file_system = await self._create_file_system()
@@ -174,7 +176,8 @@ async def test_rename_file_system(self, datalake_storage_account_name, datalake_
self.assertEqual(new_name, props.name)
@DataLakePreparer()
- async def test_rename_file_system_with_file_system_client(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_rename_file_system_with_file_system_client(
+ self, datalake_storage_account_name, datalake_storage_account_key):
pytest.skip("Feature not yet enabled. Make sure to record this test once enabled.")
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
old_name1 = self._get_file_system_reference(prefix="oldcontainer1")
@@ -196,7 +199,8 @@ async def test_rename_file_system_with_file_system_client(self, datalake_storage
self.assertEqual(new_name, new_file_system_props.name)
@DataLakePreparer()
- async def test_rename_file_system_with_source_lease(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_rename_file_system_with_source_lease(
+ self, datalake_storage_account_name, datalake_storage_account_key):
if not self.is_playback():
return
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
@@ -313,7 +317,8 @@ async def test_restore_file_system_with_sas(self, datalake_storage_account_name,
self.assertIsNotNone(props)
@DataLakePreparer()
- async def test_delete_none_existing_file_system_async(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_delete_none_existing_file_system_async(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
fake_file_system_client = self.dsc.get_file_system_client("fakeclient")
@@ -322,7 +327,8 @@ async def test_delete_none_existing_file_system_async(self, datalake_storage_acc
await fake_file_system_client.delete_file_system(match_condition=MatchConditions.IfMissing)
@DataLakePreparer()
- async def test_list_file_systems_with_include_metadata_async(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_list_file_systems_with_include_metadata_async(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
# Arrange
file_system = await self._create_file_system()
@@ -351,7 +357,8 @@ async def test_set_file_system_acl_async(self, datalake_storage_account_name, da
expiry=datetime.utcnow() + timedelta(hours=1),
start=datetime.utcnow())
signed_identifier1 = {'testid': access_policy}
- response = await file_system.set_file_system_access_policy(signed_identifier1, public_access=PublicAccess.FileSystem)
+ response = await file_system.set_file_system_access_policy(
+ signed_identifier1, public_access=PublicAccess.FileSystem)
self.assertIsNotNone(response.get('etag'))
self.assertIsNotNone(response.get('last_modified'))
@@ -387,7 +394,8 @@ async def test_list_file_systems_by_page_async(self, datalake_storage_account_na
self.assertGreaterEqual(len(file_systems), 3)
@DataLakePreparer()
- async def test_list_file_systems_with_public_access_async(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_list_file_systems_with_public_access_async(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
# Arrange
file_system_name = self._get_file_system_reference()
@@ -428,7 +436,8 @@ async def test_get_file_system_properties_async(self, datalake_storage_account_n
self.assertIsNotNone(props.has_legal_hold)
@DataLakePreparer()
- async def test_service_client_session_closes_after_filesystem_creation(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_service_client_session_closes_after_filesystem_creation(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
# Arrange
dsc2 = DataLakeServiceClient(self.dsc.url, credential=datalake_storage_account_key)
@@ -454,7 +463,8 @@ async def test_list_paths_async(self, datalake_storage_account_name, datalake_st
self.assertEqual(len(paths), 6)
@DataLakePreparer()
- async def test_list_paths_which_are_all_files_async(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_list_paths_which_are_all_files_async(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
# Arrange
file_system = await self._create_file_system()
@@ -468,7 +478,8 @@ async def test_list_paths_which_are_all_files_async(self, datalake_storage_accou
self.assertEqual(len(paths), 6)
@DataLakePreparer()
- async def test_list_paths_with_max_per_page_async(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_list_paths_with_max_per_page_async(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
# Arrange
file_system = await self._create_file_system()
@@ -490,7 +501,8 @@ async def test_list_paths_with_max_per_page_async(self, datalake_storage_account
self.assertEqual(len(paths2), 4)
@DataLakePreparer()
- async def test_list_paths_under_specific_path_async(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_list_paths_under_specific_path_async(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
# Arrange
file_system = await self._create_file_system()
@@ -563,7 +575,60 @@ async def test_list_paths_pages_correctly(self, datalake_storage_account_name, d
self.assertEqual(len(paths2), 6)
@DataLakePreparer()
- async def test_create_directory_from_file_system_client_async(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_get_deleted_paths(self, datalake_storage_account_name, datalake_storage_account_key):
+ if not self.is_playback():
+ return
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ # Arrange
+ file_system = await self._create_file_system()
+ file0 = await file_system.create_file("file0")
+ file1 = await file_system.create_file("file1")
+
+ dir1 = await file_system.create_directory("dir1")
+ dir2 = await file_system.create_directory("dir2")
+ dir3 = await file_system.create_directory("dir3")
+ file_in_dir3 = await dir3.create_file("file_in_dir3")
+ file_in_subdir = await dir3.create_file("subdir/file_in_subdir")
+
+ await file0.delete_file()
+ await file1.delete_file()
+ await dir1.delete_directory()
+ await dir2.delete_directory()
+ await file_in_dir3.delete_file()
+ await file_in_subdir.delete_file()
+ deleted_paths = []
+ async for path in file_system.list_deleted_paths():
+ deleted_paths.append(path)
+ dir3_paths = []
+ async for path in file_system.list_deleted_paths(path_prefix="dir3/"):
+ dir3_paths.append(path)
+
+ # Assert
+ self.assertEqual(len(deleted_paths), 6)
+ self.assertEqual(len(dir3_paths), 2)
+ self.assertIsNotNone(dir3_paths[0].deletion_id)
+ self.assertIsNotNone(dir3_paths[1].deletion_id)
+ self.assertEqual(dir3_paths[0].name, 'dir3/file_in_dir3')
+ self.assertEqual(dir3_paths[1].name, 'dir3/subdir/file_in_subdir')
+
+ paths_generator1 = file_system.list_deleted_paths(max_results=2).by_page()
+ paths1 = []
+ async for path in await paths_generator1.__anext__():
+ paths1.append(path)
+
+ paths_generator2 = file_system.list_deleted_paths(max_results=4) \
+ .by_page(continuation_token=paths_generator1.continuation_token)
+ paths2 = []
+ async for path in await paths_generator2.__anext__():
+ paths2.append(path)
+
+ # Assert
+ self.assertEqual(len(paths1), 2)
+ self.assertEqual(len(paths2), 4)
+
+ @DataLakePreparer()
+ async def test_create_directory_from_file_system_client_async(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
# Arrange
file_system = await self._create_file_system()
@@ -577,7 +642,8 @@ async def test_create_directory_from_file_system_client_async(self, datalake_sto
self.assertEqual(paths[0].name, "dir1")
@DataLakePreparer()
- async def test_create_file_from_file_system_client_async(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_create_file_from_file_system_client_async(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
# Arrange
file_system = await self._create_file_system()
@@ -604,7 +670,8 @@ async def test_get_root_directory_client_async(self, datalake_storage_account_na
@pytest.mark.live_test_only
@DataLakePreparer()
- async def test_get_access_control_using_delegation_sas_async(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_get_access_control_using_delegation_sas_async(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
url = self._get_account_url(datalake_storage_account_name)
@@ -627,7 +694,8 @@ async def test_get_access_control_using_delegation_sas_async(self, datalake_stor
dsc.account_name,
file_system_name,
delegation_key,
- permission=FileSystemSasPermissions(read=True, execute=True, manage_access_control=True, manage_ownership=True),
+ permission=FileSystemSasPermissions(
+ read=True, execute=True, manage_access_control=True, manage_ownership=True),
expiry=datetime.utcnow() + timedelta(hours=1),
agent_object_id=random_guid
)
@@ -639,7 +707,8 @@ async def test_get_access_control_using_delegation_sas_async(self, datalake_stor
@pytest.mark.live_test_only
@DataLakePreparer()
- async def test_list_paths_using_file_sys_delegation_sas_async(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_list_paths_using_file_sys_delegation_sas_async(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
url = self._get_account_url(datalake_storage_account_name)
token_credential = self.generate_oauth_token()
@@ -671,7 +740,8 @@ async def test_list_paths_using_file_sys_delegation_sas_async(self, datalake_sto
self.assertEqual(0, 0)
@DataLakePreparer()
- async def test_file_system_sessions_closes_properly_async(self, datalake_storage_account_name, datalake_storage_account_key):
+ async def test_file_system_sessions_closes_properly_async(
+ self, datalake_storage_account_name, datalake_storage_account_key):
self._setUp(datalake_storage_account_name, datalake_storage_account_key)
# Arrange
file_system_client = await self._create_file_system("fs")
@@ -685,6 +755,36 @@ async def test_file_system_sessions_closes_properly_async(self, datalake_storage
async with fs_client.get_directory_client("file2") as f_client:
await f_client.create_directory()
+ @DataLakePreparer()
+ async def test_undelete_dir_with_version_id(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ if not self.is_playback():
+ return
+ file_system_client = await self._create_file_system("fs")
+ dir_path = 'dir10'
+ dir_client = await file_system_client.create_directory(dir_path)
+ resp = await dir_client.delete_directory()
+ with self.assertRaises(HttpResponseError):
+ await file_system_client.get_file_client(dir_path).get_file_properties()
+ restored_dir_client = await file_system_client._undelete_path(dir_path, resp['deletion_id'])
+ resp = await restored_dir_client.get_directory_properties()
+ self.assertIsNotNone(resp)
+
+ @DataLakePreparer()
+ async def test_undelete_file_with_version_id(self, datalake_storage_account_name, datalake_storage_account_key):
+ self._setUp(datalake_storage_account_name, datalake_storage_account_key)
+ if not self.is_playback():
+ return
+ file_system_client = await self._create_file_system("fs")
+ file_path = 'dir10/fileŇ'
+ dir_client = await file_system_client.create_file(file_path)
+ resp = await dir_client.delete_file()
+ with self.assertRaises(HttpResponseError):
+ await file_system_client.get_file_client(file_path).get_file_properties()
+ restored_file_client = await file_system_client._undelete_path(file_path, resp['deletion_id'])
+ resp = await restored_file_client.get_file_properties()
+ self.assertIsNotNone(resp)
+
# ------------------------------------------------------------------------------
if __name__ == '__main__':
unittest.main()
diff --git a/sdk/storage/azure-storage-file-share/CHANGELOG.md b/sdk/storage/azure-storage-file-share/CHANGELOG.md
index 9032c610351d..9478bc9d6ccc 100644
--- a/sdk/storage/azure-storage-file-share/CHANGELOG.md
+++ b/sdk/storage/azure-storage-file-share/CHANGELOG.md
@@ -1,12 +1,13 @@
# Release History
+## 12.5.0b1 (Unreleased)
+
## 12.4.2 (2021-04-20)
**Fixes**
- Make `AccountName`, `AccountKey` etc. in conn_str case insensitive
- Fixed `downloader.chunks()` return chunks in different size (#9419, #15648)
- Fixed unclosed `ThreadPoolExecutor` (#8955)
-
## 12.4.1 (2021-01-20)
**Fixes**
- Fixed msrest dependency issue (#16250)
diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_lease.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_lease.py
index 61b1d9061978..7c38145c68c4 100644
--- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_lease.py
+++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_lease.py
@@ -7,7 +7,7 @@
import uuid
from typing import ( # pylint: disable=unused-import
- Optional, Any, TypeVar, TYPE_CHECKING
+ Union, Optional, Any, TypeVar, TYPE_CHECKING
)
from azure.core.tracing.decorator import distributed_trace
@@ -25,7 +25,7 @@
class ShareLeaseClient(object):
"""Creates a new ShareLeaseClient.
- This client provides lease operations on a ShareFileClient.
+ This client provides lease operations on a ShareClient or ShareFileClient.
:ivar str id:
The ID of the lease currently being maintained. This will be `None` if no
@@ -38,8 +38,9 @@ class ShareLeaseClient(object):
This will be `None` if no lease has yet been acquired or modified.
:param client:
- The client of the file to lease.
- :type client: ~azure.storage.fileshare.ShareFileClient
+ The client of the file or share to lease.
+ :type client: ~azure.storage.fileshare.ShareFileClient or
+ ~azure.storage.fileshare.ShareClient
:param str lease_id:
A string representing the lease ID of an existing lease. This value does not
need to be specified in order to acquire a new lease, or break one.
@@ -47,7 +48,7 @@ class ShareLeaseClient(object):
def __init__(
self, client, lease_id=None
): # pylint: disable=missing-client-constructor-parameter-credential,missing-client-constructor-parameter-kwargs
- # type: (ShareFileClient, Optional[str]) -> None
+ # type: (Union[ShareFileClient, ShareClient], Optional[str]) -> None
self.id = lease_id or str(uuid.uuid4())
self.last_modified = None
self.etag = None
@@ -70,14 +71,20 @@ def __exit__(self, *args):
def acquire(self, **kwargs):
# type: (**Any) -> None
"""Requests a new lease. This operation establishes and manages a lock on a
- file for write and delete operations. If the file does not have an active lease,
- the File service creates a lease on the file. If the file has an active lease,
+ file or share for write and delete operations. If the file or share does not have an active lease,
+ the File or Share service creates a lease on the file or share. If the file has an active lease,
you can only request a new lease using the active lease ID.
- If the file does not have an active lease, the File service creates a
+ If the file or share does not have an active lease, the File or Share service creates a
lease on the file and returns a new lease ID.
+ :keyword int lease_duration:
+ Specifies the duration of the lease, in seconds, or negative one
+ (-1) for a lease that never expires. File leases never expire. A non-infinite share lease can be
+ between 15 and 60 seconds. A share lease duration cannot be changed
+ using renew or change. Default is -1 (infinite share lease).
+
:keyword int timeout:
The timeout parameter is expressed in seconds.
:rtype: None
@@ -99,7 +106,7 @@ def acquire(self, **kwargs):
self.etag = response.get('etag') # type: str
@distributed_trace
- def _renew(self, **kwargs):
+ def renew(self, **kwargs):
# type: (Any) -> None
"""Renews the share lease.
@@ -134,8 +141,8 @@ def _renew(self, **kwargs):
def release(self, **kwargs):
# type: (Any) -> None
"""Releases the lease. The lease may be released if the lease ID specified on the request matches
- that associated with the file. Releasing the lease allows another client to immediately acquire
- the lease for the or file as soon as the release is complete.
+ that associated with the share or file. Releasing the lease allows another client to immediately acquire
+ the lease for the share or file as soon as the release is complete.
:keyword int timeout:
The timeout parameter is expressed in seconds.
@@ -162,7 +169,7 @@ def change(self, proposed_lease_id, **kwargs):
a new lease ID in x-ms-proposed-lease-id.
:param str proposed_lease_id:
- Proposed lease ID, in a GUID string format. The File service will raise an error
+ Proposed lease ID, in a GUID string format. The File or Share service will raise an error
(Invalid request) if the proposed lease ID is not in the correct format.
:keyword int timeout:
The timeout parameter is expressed in seconds.
@@ -186,7 +193,7 @@ def change(self, proposed_lease_id, **kwargs):
@distributed_trace
def break_lease(self, **kwargs):
# type: (Any) -> int
- """Force breaks the lease if the file has an active lease. Any authorized request can break the lease;
+ """Force breaks the lease if the file or share has an active lease. Any authorized request can break the lease;
the request is not required to specify a matching lease ID. An infinite lease breaks immediately.
Once a lease is broken, it cannot be changed. Any authorized request can break the lease;
@@ -194,6 +201,19 @@ def break_lease(self, **kwargs):
When a lease is successfully broken, the response indicates the interval
in seconds until a new lease can be acquired.
+ :keyword int lease_break_period:
+ This is the proposed duration of seconds that the share lease
+ should continue before it is broken, between 0 and 60 seconds. This
+ break period is only used if it is shorter than the time remaining
+ on the share lease. If longer, the time remaining on the share lease is used.
+ A new share lease will not be available before the break period has
+ expired, but the share lease may be held for longer than the break
+ period. If this header does not appear with a break
+ operation, a fixed-duration share lease breaks after the remaining share lease
+ period elapses, and an infinite share lease breaks immediately.
+
+ .. versionadded:: 12.6.0
+
:keyword int timeout:
The timeout parameter is expressed in seconds.
:return: Approximate time remaining in the lease period, in seconds.
diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py
index afb4457cb6b0..2b37a56d807c 100644
--- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py
+++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py
@@ -31,7 +31,7 @@
DeleteSnapshotsOptionType,
SharePermission)
from ._deserialize import deserialize_share_properties, deserialize_permission_key, deserialize_permission
-from ._serialize import get_api_version
+from ._serialize import get_api_version, get_access_conditions
from ._directory_client import ShareDirectoryClient
from ._file_client import ShareFileClient
from ._lease import ShareLeaseClient
@@ -269,21 +269,21 @@ def get_file_client(self, file_path):
_pipeline=_pipeline, _location_mode=self._location_mode)
@distributed_trace
- def _acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs):
- # type: (int, Optional[str], **Any) -> ShareLeaseClient
+ def acquire_lease(self, **kwargs):
+ # type: (**Any) -> ShareLeaseClient
"""Requests a new lease.
If the share does not have an active lease, the Share
Service creates a lease on the share and returns a new lease.
- .. versionadded:: 12.6.0
+ .. versionadded:: 12.5.0
- :param int lease_duration:
+ :kwarg int lease_duration:
Specifies the duration of the lease, in seconds, or negative one
(-1) for a lease that never expires. A non-infinite lease can be
between 15 and 60 seconds. A lease duration cannot be changed
using renew or change. Default is -1 (infinite lease).
- :param str lease_id:
+ :kwarg str lease_id:
Proposed lease ID, in a GUID string format. The Share Service
returns 400 (Invalid request) if the proposed lease ID is not
in the correct format.
@@ -301,7 +301,8 @@ def _acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs):
:dedent: 8
:caption: Acquiring a lease on a share.
"""
- kwargs['lease_duration'] = lease_duration
+ kwargs['lease_duration'] = kwargs.pop('lease_duration', -1)
+ lease_id = kwargs.pop('lease_id', None)
lease = ShareLeaseClient(self, lease_id=lease_id) # type: ignore
lease.acquire(**kwargs)
return lease
@@ -321,7 +322,7 @@ def create_share(self, **kwargs):
Possible values: 'TransactionOptimized', 'Hot', 'Cool'
:paramtype access_tier: str or ~azure.storage.fileshare.models.ShareAccessTier
- .. versionadded:: 12.6.0
+ .. versionadded:: 12.4.0
:keyword int timeout:
The timeout parameter is expressed in seconds.
@@ -427,6 +428,13 @@ def delete_share(
:param bool delete_snapshots:
Indicates if snapshots are to be deleted.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
:keyword int timeout:
The timeout parameter is expressed in seconds.
@@ -439,6 +447,7 @@ def delete_share(
:dedent: 12
:caption: Deletes the share and any snapshots.
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
delete_include = None
if delete_snapshots:
@@ -447,6 +456,7 @@ def delete_share(
self._client.share.delete(
timeout=timeout,
sharesnapshot=self.snapshot,
+ lease_access_conditions=access_conditions,
delete_snapshots=delete_include,
**kwargs)
except HttpResponseError as error:
@@ -461,6 +471,13 @@ def get_share_properties(self, **kwargs):
:keyword int timeout:
The timeout parameter is expressed in seconds.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
:returns: The share properties.
:rtype: ~azure.storage.fileshare.ShareProperties
@@ -473,12 +490,14 @@ def get_share_properties(self, **kwargs):
:dedent: 12
:caption: Gets the share properties.
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
try:
props = self._client.share.get_properties(
timeout=timeout,
sharesnapshot=self.snapshot,
cls=deserialize_share_properties,
+ lease_access_conditions=access_conditions,
**kwargs)
except HttpResponseError as error:
process_storage_error(error)
@@ -496,6 +515,13 @@ def set_share_quota(self, quota, **kwargs):
Must be greater than 0, and less than or equal to 5TB.
:keyword int timeout:
The timeout parameter is expressed in seconds.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
:returns: Share-updated property dict (Etag and last modified).
:rtype: dict(str, Any)
@@ -508,12 +534,14 @@ def set_share_quota(self, quota, **kwargs):
:dedent: 12
:caption: Sets the share quota.
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
try:
return self._client.share.set_properties( # type: ignore
timeout=timeout,
quota=quota,
access_tier=None,
+ lease_access_conditions=access_conditions,
cls=return_response_headers,
**kwargs)
except HttpResponseError as error:
@@ -524,7 +552,7 @@ def set_share_properties(self, **kwargs):
# type: (Any) -> Dict[str, Any]
"""Sets the share properties.
- .. versionadded:: 12.6.0
+ .. versionadded:: 12.4.0
:keyword access_tier:
Specifies the access tier of the share.
@@ -539,6 +567,9 @@ def set_share_properties(self, **kwargs):
Root squash to set on the share.
Only valid for NFS shares. Possible values include: 'NoRootSquash', 'RootSquash', 'AllSquash'.
:paramtype root_squash: str or ~azure.storage.fileshare.ShareRootSquash
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
:returns: Share-updated property dict (Etag and last modified).
:rtype: dict(str, Any)
@@ -551,6 +582,7 @@ def set_share_properties(self, **kwargs):
:dedent: 12
:caption: Sets the share properties.
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
access_tier = kwargs.pop('access_tier', None)
quota = kwargs.pop('quota', None)
@@ -563,6 +595,7 @@ def set_share_properties(self, **kwargs):
quota=quota,
access_tier=access_tier,
root_squash=root_squash,
+ lease_access_conditions=access_conditions,
cls=return_response_headers,
**kwargs)
except HttpResponseError as error:
@@ -582,6 +615,13 @@ def set_share_metadata(self, metadata, **kwargs):
:type metadata: dict(str, str)
:keyword int timeout:
The timeout parameter is expressed in seconds.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
:returns: Share-updated property dict (Etag and last modified).
:rtype: dict(str, Any)
@@ -594,6 +634,7 @@ def set_share_metadata(self, metadata, **kwargs):
:dedent: 12
:caption: Sets the share metadata.
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
headers = kwargs.pop('headers', {})
headers.update(add_metadata_headers(metadata))
@@ -602,6 +643,7 @@ def set_share_metadata(self, metadata, **kwargs):
timeout=timeout,
cls=return_response_headers,
headers=headers,
+ lease_access_conditions=access_conditions,
**kwargs)
except HttpResponseError as error:
process_storage_error(error)
@@ -614,14 +656,23 @@ def get_share_access_policy(self, **kwargs):
:keyword int timeout:
The timeout parameter is expressed in seconds.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
:returns: Access policy information in a dict.
:rtype: dict[str, Any]
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
try:
response, identifiers = self._client.share.get_access_policy(
timeout=timeout,
cls=return_headers_and_deserialized,
+ lease_access_conditions=access_conditions,
**kwargs)
except HttpResponseError as error:
process_storage_error(error)
@@ -644,9 +695,17 @@ def set_share_access_policy(self, signed_identifiers, **kwargs):
:type signed_identifiers: dict(str, :class:`~azure.storage.fileshare.AccessPolicy`)
:keyword int timeout:
The timeout parameter is expressed in seconds.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
:returns: Share-updated property dict (Etag and last modified).
:rtype: dict(str, Any)
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
if len(signed_identifiers) > 5:
raise ValueError(
@@ -664,6 +723,7 @@ def set_share_access_policy(self, signed_identifiers, **kwargs):
share_acl=signed_identifiers or None,
timeout=timeout,
cls=return_response_headers,
+ lease_access_conditions=access_conditions,
**kwargs)
except HttpResponseError as error:
process_storage_error(error)
@@ -678,13 +738,22 @@ def get_share_stats(self, **kwargs):
:keyword int timeout:
The timeout parameter is expressed in seconds.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
:return: The approximate size of the data (in bytes) stored on the share.
:rtype: int
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
try:
stats = self._client.share.get_statistics(
timeout=timeout,
+ lease_access_conditions=access_conditions,
**kwargs)
return stats.share_usage_bytes # type: ignore
except HttpResponseError as error:
diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py
index 91cf474e0d6f..bfd3230dfa42 100644
--- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py
+++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py
@@ -4,4 +4,4 @@
# license information.
# --------------------------------------------------------------------------
-VERSION = "12.4.2"
+VERSION = "12.5.0b1"
diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py
index 82c1550ac2df..0d99845ce901 100644
--- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py
+++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_lease_async.py
@@ -5,7 +5,7 @@
# --------------------------------------------------------------------------
# pylint: disable=invalid-overridden-method
from typing import ( # pylint: disable=unused-import
- Optional, Any, IO, Iterable, AnyStr, Dict, List, Tuple,
+ Union, Optional, Any, IO, Iterable, AnyStr, Dict, List, Tuple,
TypeVar, TYPE_CHECKING
)
@@ -25,7 +25,7 @@
class ShareLeaseClient(LeaseClientBase):
"""Creates a new ShareLeaseClient.
- This client provides lease operations on a ShareFileClient.
+ This client provides lease operations on a ShareClient or ShareFileClient.
:ivar str id:
The ID of the lease currently being maintained. This will be `None` if no
@@ -38,8 +38,9 @@ class ShareLeaseClient(LeaseClientBase):
This will be `None` if no lease has yet been acquired or modified.
:param client:
- The client of the file to lease.
- :type client: ~azure.storage.fileshare.ShareFileClient
+ The client of the file or share to lease.
+ :type client: ~azure.storage.fileshare.ShareFileClient or
+ ~azure.storage.fileshare.ShareClient
:param str lease_id:
A string representing the lease ID of an existing lease. This value does not
need to be specified in order to acquire a new lease, or break one.
@@ -61,14 +62,20 @@ async def __aexit__(self, *args):
async def acquire(self, **kwargs):
# type: (**Any) -> None
"""Requests a new lease. This operation establishes and manages a lock on a
- file for write and delete operations. If the file does not have an active lease,
- the File service creates a lease on the file. If the file has an active lease,
+ file or share for write and delete operations. If the file or share does not have an active lease,
+ the File or Share service creates a lease on the file or share. If the file has an active lease,
you can only request a new lease using the active lease ID.
- If the file does not have an active lease, the File service creates a
+ If the file or share does not have an active lease, the File or Share service creates a
lease on the file and returns a new lease ID.
+ :keyword int lease_duration:
+ Specifies the duration of the lease, in seconds, or negative one
+ (-1) for a lease that never expires. File leases never expire. A non-infinite share lease can be
+ between 15 and 60 seconds. A share lease duration cannot be changed
+ using renew or change. Default is -1 (infinite share lease).
+
:keyword int timeout:
The timeout parameter is expressed in seconds.
:rtype: None
@@ -90,7 +97,7 @@ async def acquire(self, **kwargs):
self.etag = response.get('etag') # type: str
@distributed_trace_async
- async def _renew(self, **kwargs):
+ async def renew(self, **kwargs):
# type: (Any) -> None
"""Renews the share lease.
@@ -125,8 +132,8 @@ async def _renew(self, **kwargs):
async def release(self, **kwargs):
# type: (Any) -> None
"""Releases the lease. The lease may be released if the lease ID specified on the request matches
- that associated with the file. Releasing the lease allows another client to immediately acquire
- the lease for the file as soon as the release is complete.
+ that associated with the share or file. Releasing the lease allows another client to immediately acquire
+ the lease for the share or file as soon as the release is complete.
:keyword int timeout:
The timeout parameter is expressed in seconds.
@@ -153,7 +160,7 @@ async def change(self, proposed_lease_id, **kwargs):
a new lease ID in x-ms-proposed-lease-id.
:param str proposed_lease_id:
- Proposed lease ID, in a GUID string format. The File service raises an error
+ Proposed lease ID, in a GUID string format. The File or Share service raises an error
(Invalid request) if the proposed lease ID is not in the correct format.
:keyword int timeout:
The timeout parameter is expressed in seconds.
@@ -177,7 +184,7 @@ async def change(self, proposed_lease_id, **kwargs):
@distributed_trace_async
async def break_lease(self, **kwargs):
# type: (Any) -> int
- """Force breaks the lease if the file has an active lease. Any authorized request can break the lease;
+ """Force breaks the lease if the file or share has an active lease. Any authorized request can break the lease;
the request is not required to specify a matching lease ID. An infinite lease breaks immediately.
Once a lease is broken, it cannot be changed. Any authorized request can break the lease;
@@ -185,6 +192,19 @@ async def break_lease(self, **kwargs):
When a lease is successfully broken, the response indicates the interval
in seconds until a new lease can be acquired.
+ :keyword int lease_break_period:
+ This is the proposed duration of seconds that the share lease
+ should continue before it is broken, between 0 and 60 seconds. This
+ break period is only used if it is shorter than the time remaining
+ on the share lease. If longer, the time remaining on the share lease is used.
+ A new share lease will not be available before the break period has
+ expired, but the share lease may be held for longer than the break
+ period. If this header does not appear with a break
+ operation, a fixed-duration share lease breaks after the remaining share lease
+ period elapses, and an infinite share lease breaks immediately.
+
+ .. versionadded:: 12.5.0
+
:keyword int timeout:
The timeout parameter is expressed in seconds.
:return: Approximate time remaining in the lease period, in seconds.
diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py
index 5ceae138861e..05fc93b88473 100644
--- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py
+++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py
@@ -24,7 +24,7 @@
SignedIdentifier,
DeleteSnapshotsOptionType)
from .._deserialize import deserialize_share_properties, deserialize_permission
-from .._serialize import get_api_version
+from .._serialize import get_api_version, get_access_conditions
from .._share_client import ShareClient as ShareClientBase
from ._directory_client_async import ShareDirectoryClient
from ._file_client_async import ShareFileClient
@@ -130,21 +130,21 @@ def get_file_client(self, file_path):
_pipeline=_pipeline, _location_mode=self._location_mode, loop=self._loop)
@distributed_trace_async()
- async def _acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs):
- # type: (int, Optional[str], **Any) -> ShareLeaseClient
+ async def acquire_lease(self, **kwargs):
+ # type: (**Any) -> ShareLeaseClient
"""Requests a new lease.
If the share does not have an active lease, the Share
Service creates a lease on the share and returns a new lease.
- .. versionadded:: 12.6.0
+ .. versionadded:: 12.5.0
- :param int lease_duration:
+ :keyword int lease_duration:
Specifies the duration of the lease, in seconds, or negative one
(-1) for a lease that never expires. A non-infinite lease can be
between 15 and 60 seconds. A lease duration cannot be changed
using renew or change. Default is -1 (infinite lease).
- :param str lease_id:
+ :keyword str lease_id:
Proposed lease ID, in a GUID string format. The Share Service
returns 400 (Invalid request) if the proposed lease ID is not
in the correct format.
@@ -162,7 +162,8 @@ async def _acquire_lease(self, lease_duration=-1, lease_id=None, **kwargs):
:dedent: 8
:caption: Acquiring a lease on a share.
"""
- kwargs['lease_duration'] = lease_duration
+ kwargs['lease_duration'] = kwargs.pop('lease_duration', -1)
+ lease_id = kwargs.pop('lease_id', None)
lease = ShareLeaseClient(self, lease_id=lease_id) # type: ignore
await lease.acquire(**kwargs)
return lease
@@ -182,7 +183,7 @@ async def create_share(self, **kwargs):
Possible values: 'TransactionOptimized', 'Hot', 'Cool'
:paramtype access_tier: str or ~azure.storage.fileshare.models.ShareAccessTier
- .. versionadded:: 12.6.0
+ .. versionadded:: 12.4.0
:keyword int timeout:
The timeout parameter is expressed in seconds.
@@ -290,6 +291,13 @@ async def delete_share(
Indicates if snapshots are to be deleted.
:keyword int timeout:
The timeout parameter is expressed in seconds.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
.. admonition:: Example:
.. literalinclude:: ../samples/file_samples_share_async.py
@@ -299,6 +307,7 @@ async def delete_share(
:dedent: 16
:caption: Deletes the share and any snapshots.
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
delete_include = None
if delete_snapshots:
@@ -308,6 +317,7 @@ async def delete_share(
timeout=timeout,
sharesnapshot=self.snapshot,
delete_snapshots=delete_include,
+ lease_access_conditions=access_conditions,
**kwargs)
except HttpResponseError as error:
process_storage_error(error)
@@ -321,6 +331,13 @@ async def get_share_properties(self, **kwargs):
:keyword int timeout:
The timeout parameter is expressed in seconds.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
:returns: The share properties.
:rtype: ~azure.storage.fileshare.ShareProperties
@@ -333,12 +350,14 @@ async def get_share_properties(self, **kwargs):
:dedent: 16
:caption: Gets the share properties.
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
try:
props = await self._client.share.get_properties(
timeout=timeout,
sharesnapshot=self.snapshot,
cls=deserialize_share_properties,
+ lease_access_conditions=access_conditions,
**kwargs)
except HttpResponseError as error:
process_storage_error(error)
@@ -356,6 +375,13 @@ async def set_share_quota(self, quota, **kwargs):
Must be greater than 0, and less than or equal to 5TB.
:keyword int timeout:
The timeout parameter is expressed in seconds.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
:returns: Share-updated property dict (Etag and last modified).
:rtype: dict(str, Any)
@@ -368,6 +394,7 @@ async def set_share_quota(self, quota, **kwargs):
:dedent: 16
:caption: Sets the share quota.
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
try:
return await self._client.share.set_properties( # type: ignore
@@ -375,6 +402,7 @@ async def set_share_quota(self, quota, **kwargs):
quota=quota,
access_tier=None,
cls=return_response_headers,
+ lease_access_conditions=access_conditions,
**kwargs)
except HttpResponseError as error:
process_storage_error(error)
@@ -383,7 +411,7 @@ async def set_share_properties(self, **kwargs):
# type: (Any) -> Dict[str, Any]
"""Sets the share properties.
- .. versionadded:: 12.6.0
+ .. versionadded:: 12.3.0
:keyword access_tier:
Specifies the access tier of the share.
@@ -398,6 +426,9 @@ async def set_share_properties(self, **kwargs):
Root squash to set on the share.
Only valid for NFS shares. Possible values include: 'NoRootSquash', 'RootSquash', 'AllSquash'
:paramtype root_squash: str or ~azure.storage.fileshare.ShareRootSquash
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
:returns: Share-updated property dict (Etag and last modified).
:rtype: dict(str, Any)
@@ -410,6 +441,7 @@ async def set_share_properties(self, **kwargs):
:dedent: 16
:caption: Sets the share properties.
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
access_tier = kwargs.pop('access_tier', None)
quota = kwargs.pop('quota', None)
@@ -422,6 +454,7 @@ async def set_share_properties(self, **kwargs):
quota=quota,
access_tier=access_tier,
root_squash=root_squash,
+ lease_access_conditions=access_conditions,
cls=return_response_headers,
**kwargs)
except HttpResponseError as error:
@@ -441,6 +474,13 @@ async def set_share_metadata(self, metadata, **kwargs):
:type metadata: dict(str, str)
:keyword int timeout:
The timeout parameter is expressed in seconds.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
:returns: Share-updated property dict (Etag and last modified).
:rtype: dict(str, Any)
@@ -453,6 +493,7 @@ async def set_share_metadata(self, metadata, **kwargs):
:dedent: 16
:caption: Sets the share metadata.
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
headers = kwargs.pop('headers', {})
headers.update(add_metadata_headers(metadata))
@@ -461,6 +502,7 @@ async def set_share_metadata(self, metadata, **kwargs):
timeout=timeout,
cls=return_response_headers,
headers=headers,
+ lease_access_conditions=access_conditions,
**kwargs)
except HttpResponseError as error:
process_storage_error(error)
@@ -473,14 +515,23 @@ async def get_share_access_policy(self, **kwargs):
:keyword int timeout:
The timeout parameter is expressed in seconds.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
:returns: Access policy information in a dict.
:rtype: dict[str, Any]
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
try:
response, identifiers = await self._client.share.get_access_policy(
timeout=timeout,
cls=return_headers_and_deserialized,
+ lease_access_conditions=access_conditions,
**kwargs)
except HttpResponseError as error:
process_storage_error(error)
@@ -503,9 +554,17 @@ async def set_share_access_policy(self, signed_identifiers, **kwargs):
:type signed_identifiers: dict(str, :class:`~azure.storage.fileshare.AccessPolicy`)
:keyword int timeout:
The timeout parameter is expressed in seconds.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
:returns: Share-updated property dict (Etag and last modified).
:rtype: dict(str, Any)
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
if len(signed_identifiers) > 5:
raise ValueError(
@@ -524,6 +583,7 @@ async def set_share_access_policy(self, signed_identifiers, **kwargs):
share_acl=signed_identifiers or None,
timeout=timeout,
cls=return_response_headers,
+ lease_access_conditions=access_conditions,
**kwargs)
except HttpResponseError as error:
process_storage_error(error)
@@ -538,13 +598,22 @@ async def get_share_stats(self, **kwargs):
:keyword int timeout:
The timeout parameter is expressed in seconds.
+ :keyword lease:
+ Required if the share has an active lease. Value can be a ShareLeaseClient object
+ or the lease ID as a string.
+
+ .. versionadded:: 12.5.0
+ This keyword argument was introduced in API version '2020-08-04'.
+
:return: The approximate size of the data (in bytes) stored on the share.
:rtype: int
"""
+ access_conditions = get_access_conditions(kwargs.pop('lease', None))
timeout = kwargs.pop('timeout', None)
try:
stats = await self._client.share.get_statistics(
timeout=timeout,
+ lease_access_conditions=access_conditions,
**kwargs)
return stats.share_usage_bytes # type: ignore
except HttpResponseError as error:
diff --git a/sdk/storage/azure-storage-file-share/samples/file_samples_share.py b/sdk/storage/azure-storage-file-share/samples/file_samples_share.py
index 5693e8613090..866e70daa2a5 100644
--- a/sdk/storage/azure-storage-file-share/samples/file_samples_share.py
+++ b/sdk/storage/azure-storage-file-share/samples/file_samples_share.py
@@ -143,6 +143,21 @@ def get_directory_or_file_client(self):
# Get the file client to interact with a specific file
my_file = share.get_file_client("dir1/myfile")
+ def acquire_share_lease(self):
+ # Instantiate the ShareClient from a connection string
+ from azure.storage.fileshare import ShareClient
+ share = ShareClient.from_connection_string(self.connection_string, "sharesamples")
+
+ # Create the share
+ share.create_share()
+
+ # [START acquire_and_release_lease_on_share]
+ share.create_directory("mydir")
+ lease = share.acquire_lease()
+ share.get_share_properties(lease=lease)
+ share.delete_share(lease=lease)
+ # [END acquire_and_release_lease_on_share]
+
if __name__ == '__main__':
sample = ShareSamples()
@@ -151,3 +166,4 @@ def get_directory_or_file_client(self):
sample.set_share_properties()
sample.list_directories_and_files()
sample.get_directory_or_file_client()
+ sample.acquire_share_lease()
diff --git a/sdk/storage/azure-storage-file-share/setup.py b/sdk/storage/azure-storage-file-share/setup.py
index a2cea96e1294..df38d0044dea 100644
--- a/sdk/storage/azure-storage-file-share/setup.py
+++ b/sdk/storage/azure-storage-file-share/setup.py
@@ -59,7 +59,7 @@
author_email='ascl@microsoft.com',
url='https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file-share',
classifiers=[
- "Development Status :: 5 - Production/Stable",
+ "Development Status :: 4 - Beta",
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
diff --git a/sdk/storage/azure-storage-file-share/tests/test_share.py b/sdk/storage/azure-storage-file-share/tests/test_share.py
index 2587ff91b893..93450b6a59ee 100644
--- a/sdk/storage/azure-storage-file-share/tests/test_share.py
+++ b/sdk/storage/azure-storage-file-share/tests/test_share.py
@@ -186,7 +186,6 @@ def test_undelete_share(self, resource_group, location, storage_account, storage
props = restored_share_client.get_share_properties()
self.assertIsNotNone(props)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_lease_share_acquire_and_release(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -196,7 +195,6 @@ def test_lease_share_acquire_and_release(self, resource_group, location, storage
lease.release()
# Assert
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_acquire_lease_on_sharesnapshot(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -234,7 +232,6 @@ def test_acquire_lease_on_sharesnapshot(self, resource_group, location, storage_
share_lease.release()
self._delete_shares(share.share_name)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_lease_share_renew(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -254,7 +251,6 @@ def test_lease_share_renew(self, resource_group, location, storage_account, stor
self.sleep(10)
share_client.delete_share()
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_lease_share_with_duration(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -269,7 +265,6 @@ def test_lease_share_with_duration(self, resource_group, location, storage_accou
self.sleep(15)
share_client.acquire_lease()
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_lease_share_twice(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -282,7 +277,6 @@ def test_lease_share_twice(self, resource_group, location, storage_account, stor
lease2 = share_client.acquire_lease(lease_id=lease.id)
self.assertEqual(lease.id, lease2.id)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_lease_share_with_proposed_lease_id(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -295,7 +289,6 @@ def test_lease_share_with_proposed_lease_id(self, resource_group, location, stor
# Assert
self.assertEqual(proposed_lease_id, lease.id)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_lease_share_change_lease_id(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -315,7 +308,6 @@ def test_lease_share_change_lease_id(self, resource_group, location, storage_acc
self.assertNotEqual(lease_id1, lease_id)
self.assertEqual(lease_id2, lease_id)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_set_share_metadata_with_lease_id(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -330,7 +322,6 @@ def test_set_share_metadata_with_lease_id(self, resource_group, location, storag
md = share_client.get_share_properties().metadata
self.assertDictEqual(md, metadata)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_get_share_metadata_with_lease_id(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -345,7 +336,6 @@ def test_get_share_metadata_with_lease_id(self, resource_group, location, storag
# Assert
self.assertDictEqual(md, metadata)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_get_share_properties_with_lease_id(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -365,7 +355,6 @@ def test_get_share_properties_with_lease_id(self, resource_group, location, stor
self.assertEqual(props.lease.state, 'leased')
self.assertEqual(props.lease.status, 'locked')
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_get_share_acl_with_lease_id(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -379,7 +368,6 @@ def test_get_share_acl_with_lease_id(self, resource_group, location, storage_acc
self.assertIsNotNone(acl)
self.assertIsNone(acl.get('public_access'))
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_set_share_acl_with_lease_id(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -399,7 +387,6 @@ def test_set_share_acl_with_lease_id(self, resource_group, location, storage_acc
self.assertIsNotNone(acl)
self.assertIsNone(acl.get('public_access'))
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_lease_share_break_period(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -414,7 +401,6 @@ def test_lease_share_break_period(self, resource_group, location, storage_accoun
with self.assertRaises(HttpResponseError):
share_client.delete_share(lease=lease)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_delete_share_with_lease_id(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
@@ -649,7 +635,6 @@ def test_list_shares_no_options_for_premium_account(self, resource_group, locati
self.assertIsNotNone(shares[0].next_allowed_quota_downgrade_time)
self._delete_shares()
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
def test_list_shares_leased_share(self, resource_group, location, storage_account, storage_account_key):
self._setup(storage_account, storage_account_key)
diff --git a/sdk/storage/azure-storage-file-share/tests/test_share_async.py b/sdk/storage/azure-storage-file-share/tests/test_share_async.py
index d9ff6b973d7d..e6f9ec6ba6b3 100644
--- a/sdk/storage/azure-storage-file-share/tests/test_share_async.py
+++ b/sdk/storage/azure-storage-file-share/tests/test_share_async.py
@@ -203,7 +203,6 @@ async def test_undelete_share(self, resource_group, location, storage_account, s
self.assertIsNotNone(props)
break
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_lease_share_acquire_and_release(self, resource_group, location, storage_account, storage_account_key):
@@ -214,7 +213,6 @@ async def test_lease_share_acquire_and_release(self, resource_group, location, s
await lease.release()
# Assert
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_acquire_lease_on_sharesnapshot(self, resource_group, location, storage_account, storage_account_key):
@@ -253,7 +251,6 @@ async def test_acquire_lease_on_sharesnapshot(self, resource_group, location, st
await share_lease.release()
await self._delete_shares(share.share_name)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_lease_share_renew(self, resource_group, location, storage_account, storage_account_key):
@@ -274,7 +271,6 @@ async def test_lease_share_renew(self, resource_group, location, storage_account
self.sleep(10)
await share_client.delete_share()
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_lease_share_with_duration(self, resource_group, location, storage_account, storage_account_key):
@@ -290,7 +286,6 @@ async def test_lease_share_with_duration(self, resource_group, location, storage
self.sleep(15)
await share_client.acquire_lease()
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_lease_share_twice(self, resource_group, location, storage_account, storage_account_key):
@@ -304,7 +299,6 @@ async def test_lease_share_twice(self, resource_group, location, storage_account
lease2 = await share_client.acquire_lease(lease_id=lease.id)
self.assertEqual(lease.id, lease2.id)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_lease_share_with_proposed_lease_id(self, resource_group, location, storage_account, storage_account_key):
@@ -318,7 +312,6 @@ async def test_lease_share_with_proposed_lease_id(self, resource_group, location
# Assert
self.assertEqual(proposed_lease_id, lease.id)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_lease_share_change_lease_id(self, resource_group, location, storage_account, storage_account_key):
@@ -339,7 +332,6 @@ async def test_lease_share_change_lease_id(self, resource_group, location, stora
self.assertNotEqual(lease_id1, lease_id)
self.assertEqual(lease_id2, lease_id)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_set_share_metadata_with_lease_id(self, resource_group, location, storage_account, storage_account_key):
@@ -356,7 +348,6 @@ async def test_set_share_metadata_with_lease_id(self, resource_group, location,
md = props.metadata
self.assertDictEqual(md, metadata)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_get_share_metadata_with_lease_id(self, resource_group, location, storage_account, storage_account_key):
@@ -373,7 +364,6 @@ async def test_get_share_metadata_with_lease_id(self, resource_group, location,
# Assert
self.assertDictEqual(md, metadata)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_get_share_properties_with_lease_id(self, resource_group, location, storage_account, storage_account_key):
@@ -394,7 +384,6 @@ async def test_get_share_properties_with_lease_id(self, resource_group, location
self.assertEqual(props.lease.state, 'leased')
self.assertEqual(props.lease.status, 'locked')
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_get_share_acl_with_lease_id(self, resource_group, location, storage_account, storage_account_key):
@@ -409,7 +398,6 @@ async def test_get_share_acl_with_lease_id(self, resource_group, location, stora
self.assertIsNotNone(acl)
self.assertIsNone(acl.get('public_access'))
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_set_share_acl_with_lease_id(self, resource_group, location, storage_account, storage_account_key):
@@ -430,7 +418,6 @@ async def test_set_share_acl_with_lease_id(self, resource_group, location, stora
self.assertIsNotNone(acl)
self.assertIsNone(acl.get('public_access'))
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_lease_share_break_period(self, resource_group, location, storage_account, storage_account_key):
@@ -446,7 +433,6 @@ async def test_lease_share_break_period(self, resource_group, location, storage_
with self.assertRaises(HttpResponseError):
await share_client.delete_share(lease=lease)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_delete_share_with_lease_id(self, resource_group, location, storage_account, storage_account_key):
@@ -705,7 +691,6 @@ async def test_list_shares_no_options_for_premium_account_async(self, resource_g
self.assertIsNotNone(shares[0].next_allowed_quota_downgrade_time)
await self._delete_shares(share.share_name)
- @pytest.mark.skip("Share leases are currently unavailable.")
@GlobalStorageAccountPreparer()
@AsyncStorageTestCase.await_prepared_test
async def test_list_shares_leased_share(self, resource_group, location, storage_account, storage_account_key):
diff --git a/shared_requirements.txt b/shared_requirements.txt
index 7f9c1514c5bc..768fe319ac94 100644
--- a/shared_requirements.txt
+++ b/shared_requirements.txt
@@ -148,14 +148,14 @@ pyjwt>=1.7.1
#override azure-ai-formrecognizer msrest>=0.6.21
#override azure-ai-formrecognizer azure-core<2.0.0,>=1.8.2
#override azure-storage-blob azure-core<2.0.0,>=1.10.0
-#override azure-storage-blob msrest>=0.6.18
+#override azure-storage-blob msrest>=0.6.21
#override azure-storage-blob-changefeed azure-storage-blob>=12.5.0,<13.0.0
#override azure-storage-queue azure-core<2.0.0,>=1.10.0
#override azure-storage-queue msrest>=0.6.18
#override azure-storage-file-share msrest>=0.6.18
#override azure-storage-file-share azure-core<2.0.0,>=1.10.0
#override azure-storage-file-datalake azure-core<2.0.0,>=1.10.0
-#override azure-storage-file-datalake msrest>=0.6.18
+#override azure-storage-file-datalake msrest>=0.6.21
#override azure-storage-file-datalake azure-storage-blob<13.0.0,>=12.8.0b1
#override azure-security-attestation msrest>=0.6.0
#override azure-security-attestation azure-core<2.0.0,>=1.8.2
@@ -271,4 +271,4 @@ opentelemetry-sdk<2.0.0,>=1.0.0
#override azure-mgmt-elastic msrest>=0.6.21
#override azure-mgmt-confidentialledger msrest>=0.6.21
#override azure-mgmt-mixedreality msrest>=0.6.21
-#override azure-mgmt-extendedlocation msrest>=0.6.21
+#override azure-mgmt-extendedlocation msrest>=0.6.21
\ No newline at end of file