kipon-xrmservice
Version:
Dynamics 365 CE web api wrapper for angular, making life easier when building angular based web resources
585 lines • 97.4 kB
JavaScript
import { Injectable } from '@angular/core';
import { HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { XrmConfigService } from './xrmconfig.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
import * as i2 from "./xrmform.service";
export class XrmEntityKey {
}
export class Expand {
toExpandString() {
let _ex = this.name;
if (this.select != null || this.filter != null) {
_ex += '(';
}
let semi = '';
if (this.select != null) {
_ex += '$select=' + this.select;
semi = ';';
}
if (this.filter != null) {
_ex += semi + '$filter=' + this.filter;
}
if (this.select != null || this.filter != null) {
_ex += ')';
}
return _ex;
}
}
export class XrmService {
constructor(http, injector, xrmformService) {
this.http = http;
this.injector = injector;
this.xrmformService = xrmformService;
this.defaultApiUrl = "/api/data/v9.0/";
this.contextFallback = null;
this.apiUrl = '/api/data/v9.0/';
this.apiVersion = 'v9.0';
this.debug = false;
this.token = null;
this.forceHttps = false;
this.keyTries = 0;
}
setVersion(v) {
this.apiUrl = this.defaultApiUrl.replace("9.0", v);
}
getContext() {
if (this.contextFallback != null) {
return this.contextFallback;
}
var x = this.xrmformService.getContext();
if (x != null) {
if (typeof x.getVersion == 'undefined') {
x.getVersion = () => "9.0.0.0";
}
if (typeof x.$devClientUrl == 'undefined') {
x.$devClientUrl = () => { return this.getContext().getClientUrl() + this.apiUrl; };
this.contextFallback = x;
this.initializeVersion(this.contextFallback.getVersion());
}
return x;
}
this.log('using fake context');
let baseUrl = "http://localhost:4200";
let version = 'v9.0';
var comesfrom = window.location.href.toLowerCase();
if (comesfrom.indexOf("webresources") >= 0) {
var domain = window.location.href.split('/')[2];
var proto = comesfrom.startsWith("https://") ? "https://" : "http://";
// to-do, find a better way to render multi org sub url from the url. (for now - never needed on online, therefore blank for https, but might be needed for onpre running https ... )
var sub = comesfrom.startsWith("https://") ? "" : "/" + window.location.href.split('/')[3];
baseUrl = proto + domain + sub;
}
try {
var configService = this.injector.get(XrmConfigService);
if (configService != null) {
let config = configService.getConfig();
if (config != null && config.endpoints != null && config.endpoints.orgUri != null && config.endpoints.orgUri != '') {
baseUrl = config.endpoints.orgUri;
}
if (config != null && config.version != null && config.version != '') {
version = config.version;
}
}
}
catch (err) {
// no worry, XrmConfigService is optional
}
this.contextFallback = {
getClientUrl() {
return baseUrl;
},
getQueryStringParameters() {
let search = window.location.search;
let hashes = search.slice(search.indexOf('?') + 1).split('&');
let params = {};
hashes.map(hash => {
let [key, val] = hash.split('=');
params[key] = decodeURIComponent(val);
});
return params;
},
getVersion() {
return version.substring(1) + '.0.0';
},
getUserId() {
return this["userid"];
},
getUserName() {
return this["username"];
},
$devClientUrl() {
return this['$clienturl'];
}
};
var headers = this.getDefaultHeader();
this.http.get(this.forceHTTPS(baseUrl) + "/api/data/" + version + "/WhoAmI()", { headers: headers }).subscribe(r => {
this.log(r);
let url = r['@odata.context'];
let firstpart = url.split('/api/data/')[0];
let version = url.split('/api/data/')[1].split('/')[0];
this.contextFallback["$clienturl"] = firstpart + '/api/data/' + version + '/';
this.contextFallback["userid"] = r["UserId"];
this.contextFallback["username"] = "Dev. fallback from whoami";
this.initializeVersion(this.contextFallback.getVersion());
});
var x = this.contextFallback;
return this.contextFallback;
}
getCurrentUserId() {
var ctx = this.getContext();
if (ctx.getUserId() == null || ctx.getUserId() == '') {
var headers = this.getDefaultHeader();
var url = this.forceHTTPS(ctx.getClientUrl()) + this.apiUrl + "/WhoAmI()";
this.log(url);
return this.http.get(url, { headers: headers }).pipe(map(r => { return r["UserId"]; }));
}
else {
this.log('get user from normal crm context');
this.log('should result in ' + ctx.getUserId());
return new Observable(obs => {
setTimeout(() => obs.next(ctx.getUserId()), 100);
});
}
}
getCurrentKey(repeatForCreateForm = false) {
// First we try to find id and type in the url, this allow forcing a specific entity, directly from standard url parameters
let params = this.getQueryStringParameters();
let result = new XrmEntityKey();
let id = params["id"];
let type = params["typename"];
if (id == null || id == '') {
params = this.getContext().getQueryStringParameters();
id = params["id"];
type = params["typename"];
}
if (this.xrmformService.getFormType() == 1 && repeatForCreateForm) {
var obs = new Observable(sub => {
this.tryGetKey(sub);
});
return obs;
}
let key = this.xrmformService.getFormKey(id, type);
if (key != null && key.id != null) {
result.id = this.toGuid(key.id);
result.entityType = key.type;
return new Observable(obs => obs.next(result));
}
if (this.xrmformService.getFormType() == 2) {
key = this.xrmformService.getFormKey(id, type);
if (key != null) {
result.id = this.toGuid(key.id);
result.entityType = key.type;
return new Observable(obs => obs.next(result));
}
else {
return new Observable(obs => {
var iv = setInterval(() => {
let key = this.xrmformService.getFormKey(id, type);
if (key != null) {
clearInterval(iv);
result.id = this.toGuid(key.id);
result.entityType = key.type;
obs.next(result);
}
}, 800);
});
}
}
else {
// it was not an entity form, or the entity form was not in edit mode.
result.id = this.toGuid(result.id);
return new Observable(obs => obs.next(result));
}
}
get(entityTypes, id, fields, expand = null) {
let headers = new HttpHeaders({ 'Accept': 'application/json' });
if (this.token != null) {
headers = headers.append("Authorization", "Bearer " + this.token);
}
headers = headers.append("OData-MaxVersion", "4.0");
headers = headers.append("OData-Version", "4.0");
headers = headers.append("Content-Type", "application/json; charset=utf-8");
headers = headers.append("Prefer", "odata.include-annotations=*");
headers = headers.append("Cache-Control", "no-cache");
let addFields = '';
let sep = '?';
if (fields != null && fields != '') {
addFields = sep + "$select=" + fields;
sep = '&';
}
let _ex = this.expandString(expand, sep);
let _id = id.replace("{", "").replace("}", "");
let url = this.getContext().getClientUrl() + this.apiUrl + entityTypes + "(" + _id + ")" + addFields + _ex;
this.log(url);
return this.http.get(this.forceHTTPS(url), { headers: headers });
}
query(entityTypes, fields, filter, orderBy = null, top = 0, count = false) {
let me = this;
let headers = new HttpHeaders({ 'Accept': 'application/json' });
if (this.token != null) {
headers = headers.append("Authorization", "Bearer " + this.token);
}
headers = headers.append("OData-MaxVersion", "4.0");
headers = headers.append("OData-Version", "4.0");
headers = headers.append("Content-Type", "application/json; charset=utf-8");
headers = headers.append("Prefer", "odata.include-annotations=\"*\"");
if (top > 0) {
headers = headers.append("Prefer", "odata.maxpagesize=" + top.toString());
}
else {
}
headers = headers.append("Cache-Control", "no-cache");
let url = this.getContext().getClientUrl() + this.apiUrl + entityTypes;
if ((fields != null && fields != '') || (filter != null && filter != '') || (orderBy != null && orderBy != '') || top > 0) {
url += "?";
}
let sep = '';
if (fields != null && fields != '') {
url += '$select=' + fields;
sep = '&';
}
if (filter != null && filter != '') {
url += sep + '$filter=' + filter;
sep = '&';
}
if (orderBy != null && orderBy != '') {
url += sep + '$orderby=' + orderBy;
sep = '&';
}
if (count) {
url += sep + '$count=true';
sep = '&';
}
return this.http.get(this.forceHTTPS(url), { headers: headers }).pipe(map(response => {
let result = me.resolveQueryResult(response, top, [url], 0);
return result;
}));
}
create(entityType, entity) {
let headers = new HttpHeaders({ 'Accept': 'application/json' });
if (this.token != null) {
headers = headers.append("Authorization", "Bearer " + this.token);
}
headers = headers.append("OData-MaxVersion", "4.0");
headers = headers.append("OData-Version", "4.0");
headers = headers.append("Content-Type", "application/json; charset=utf-8");
headers = headers.append("Prefer", "odata.include-annotations=*");
headers = headers.append("Prefer", "return=representation");
let options = {
headers: headers,
};
return this.http.post(this.forceHTTPS(this.getContext().getClientUrl()) + this.apiUrl + entityType, entity, { headers: headers, observe: "response" }).pipe(map((res) => {
if (res.body == null) {
let entityId = res.headers.get('OData-EntityId');
let result = { id: entityId.split('(')[1].replace(')', ''), $keyonly: true };
return result;
}
else {
return res.body;
}
}));
}
update(entityType, entity, id, fields = null) {
let headers = new HttpHeaders({ 'Accept': 'application/json' });
if (this.token != null) {
headers = headers.append("Authorization", "Bearer " + this.token);
}
headers = headers.append("OData-MaxVersion", "4.0");
headers = headers.append("OData-Version", "4.0");
headers = headers.append("Content-Type", "application/json; charset=utf-8");
headers = headers.append("Prefer", "odata.include-annotations=*");
headers = headers.append("Prefer", "return=representation");
let _f = '';
if (fields != null) {
_f = '?$select=' + fields;
}
let fUrl = this.getContext().getClientUrl() + this.apiUrl + entityType + "(" + id + ")" + _f;
this.log(fUrl);
return this.http.patch(this.forceHTTPS(fUrl), entity, { headers: headers }).pipe(map(response => {
if (response == null || this.getContext().getVersion().startsWith("8.0") || this.getContext().getVersion().startsWith("8.1")) {
return entity;
}
return response;
}));
}
put(entityType, id, field, value, propertyValueAs = null) {
if (propertyValueAs == null)
propertyValueAs = 'value';
let headers = new HttpHeaders({ 'Accept': 'application/json' });
if (this.token != null) {
headers = headers.append("Authorization", "Bearer " + this.token);
}
headers = headers.append("OData-MaxVersion", "4.0");
headers = headers.append("OData-Version", "4.0");
headers = headers.append("Content-Type", "application/json; charset=utf-8");
headers = headers.append("Prefer", "odata.include-annotations=*");
let v = {};
v[propertyValueAs] = value;
this.log(v);
let url = this.getContext().getClientUrl() + this.apiUrl + entityType + "(" + id + ")/" + field;
this.log(url);
if (v[propertyValueAs] != null) {
return this.http.put(this.forceHTTPS(url), v, { headers: headers }).pipe(map(response => null));
}
else {
return this.http.delete(this.forceHTTPS(url), { headers: headers }).pipe(map(response => null));
}
}
delete(entityType, id) {
let headers = new HttpHeaders({ 'Accept': 'application/json' });
if (this.token != null) {
headers = headers.append("Authorization", "Bearer " + this.token);
}
headers = headers.append("OData-MaxVersion", "4.0");
headers = headers.append("OData-Version", "4.0");
headers = headers.append("Content-Type", "application/json; charset=utf-8");
headers = headers.append("Prefer", "odata.include-annotations=*");
let url = this.getContext().getClientUrl() + this.apiUrl + entityType + "(" + id + ")";
this.log(url);
return this.http.delete(this.forceHTTPS(url), { headers: headers }).pipe(map(response => null));
}
getParameter(param) {
return this.getQueryStringParameters()[param];
}
associate(fromType, fromId, toType, toId, refname) {
let headers = new HttpHeaders({ 'Accept': 'application/json' });
if (this.token != null) {
headers = headers.append("Authorization", "Bearer " + this.token);
}
headers = headers.append("OData-MaxVersion", "4.0");
headers = headers.append("OData-Version", "4.0");
headers = headers.append("Content-Type", "application/json; charset=utf-8");
headers = headers.append("Prefer", "odata.include-annotations=*");
let url = this.getContext().getClientUrl() + this.apiUrl + fromType + "(" + this.toGuid(fromId) + ")/" + refname + "/$ref";
let data = {
"@odata.id": this.getContext().$devClientUrl() + toType + "(" + this.toGuid(toId) + ")"
};
if (this.debug) {
this.log(url);
this.log(data);
}
return this.http.post(this.forceHTTPS(url), data, { headers: headers }).pipe(map(response => null));
}
disassociate(fromType, fromId, toType, toId, refname) {
let headers = new HttpHeaders({ 'Accept': 'application/json' });
if (this.token != null) {
headers = headers.append("Authorization", "Bearer " + this.token);
}
headers = headers.append("OData-MaxVersion", "4.0");
headers = headers.append("OData-Version", "4.0");
let url = this.getContext().getClientUrl() + this.apiUrl + fromType + "(" + this.toGuid(fromId) + ")/" + refname + "/$ref?$id=" + this.getContext().$devClientUrl() + toType + "(" + this.toGuid(toId) + ")";
this.log(url);
return this.http.delete(this.forceHTTPS(url), { headers: headers }).pipe(map(response => {
this.log(response);
return null;
}));
}
func(name, data, boundType = null, boundId = null) {
let headers = new HttpHeaders({ 'Accept': 'application/json' });
if (this.token != null) {
headers = headers.append("Authorization", "Bearer " + this.token);
}
headers = headers.append("OData-MaxVersion", "4.0");
headers = headers.append("OData-Version", "4.0");
let url = this.getContext().getClientUrl() + this.apiUrl + name;
if (boundType != null) {
url = this.getContext().getClientUrl() + this.apiUrl + boundType + "(" + this.toGuid(boundId) + ")/" + name;
}
if (data != null && data.length > 0) {
url += data;
}
else {
url += "()";
}
this.log(url);
return this.http.get(this.forceHTTPS(url), { headers: headers }).pipe(map(response => {
this.log(response);
return response;
}));
}
action(name, data, boundType = null, boundId = null) {
let headers = new HttpHeaders({ 'Accept': 'application/json' });
if (this.token != null) {
headers = headers.append("Authorization", "Bearer " + this.token);
}
headers = headers.append("OData-MaxVersion", "4.0");
headers = headers.append("OData-Version", "4.0");
let url = this.getContext().getClientUrl() + this.apiUrl + name;
if (boundType != null) {
url = this.getContext().getClientUrl() + this.apiUrl + boundType + "(" + this.toGuid(boundId) + ")/" + name;
}
this.log(url);
return this.http.post(this.forceHTTPS(url), data, { headers: headers }).pipe(map(response => {
this.log(response);
return response;
}));
}
log(message) {
if (this.debug) {
if (typeof message == 'string') {
console.dir(message);
}
else {
console.log(message);
}
}
}
tryGetKey(sub) {
setTimeout(() => {
var key = this.xrmformService.getFormKey(null, null, true);
if (key.id != null && key.id != '' && key.type != null && key.type != '') {
let result = new XrmEntityKey();
result.entityType = key.type;
result.id = key.id;
sub.next(result);
}
else {
this.keyTries++;
if (this.keyTries < 900) {
// continue try for 1/2 hour at most
this.tryGetKey(sub);
}
}
}, 2000);
}
initializeVersion(_v) {
if (_v == null) {
_v = '9.0.0.0';
}
let v = _v.split('.');
this.setVersion(v[0] + "." + v[1]);
this.apiVersion = 'v' + v[0] + '.' + v[1];
}
expandString(expand, sep) {
if (expand == null || expand.name == null || expand.name == '')
return '';
let _ex = sep + '$expand=' + expand.toExpandString();
if (expand.additional != null && expand.additional.length > 0) {
expand.additional.forEach(ad => {
_ex += "," + ad.toExpandString();
});
}
return _ex;
}
resolveQueryResult(response, top, pages, pageIndex) {
let me = this;
let result = {
context: response["@odata.context"],
count: response["@odata.count"],
value: response["value"],
pages: pages,
prev: null,
next: null,
pageIndex: pageIndex,
top: top,
nextLink: null
};
let nextLink = response["@odata.nextLink"];
if (nextLink != null && nextLink != '') {
let start = nextLink.indexOf('/api');
nextLink = me.getContext().getClientUrl() + nextLink.substring(start);
result = {
context: result.context,
count: response["@odata.count"],
value: result.value,
pages: pages,
pageIndex: pageIndex,
prev: null,
top: top,
nextLink: nextLink,
next: () => {
let headers = new HttpHeaders({ 'Accept': 'application/json' });
if (this.token != null) {
headers = headers.append("Authorization", "Bearer " + this.token);
}
headers = headers.append("OData-MaxVersion", "4.0");
headers = headers.append("OData-Version", "4.0");
headers = headers.append("Content-Type", "application/json; charset=utf-8");
headers = headers.append("Prefer", "odata.include-annotations=\"*\"");
if (top > 0) {
headers = headers.append("Prefer", "odata.maxpagesize=" + top.toString());
}
headers = headers.append("Cache-Control", "no-cache");
return me.http.get(me.forceHTTPS(nextLink), { headers: headers }).pipe(map(r => {
pages.push(nextLink);
let pr = me.resolveQueryResult(r, top, pages, pageIndex + 1);
return pr;
}));
}
};
}
if (result.pageIndex >= 1) {
result.prev = () => {
let headers = new HttpHeaders({ 'Accept': 'application/json' });
if (this.token != null) {
headers = headers.append("Authorization", "Bearer " + this.token);
}
headers = headers.append("OData-MaxVersion", "4.0");
headers = headers.append("OData-Version", "4.0");
headers = headers.append("Content-Type", "application/json; charset=utf-8");
headers = headers.append("Prefer", "odata.include-annotations=\"*\"");
if (top > 0) {
headers = headers.append("Prefer", "odata.maxpagesize=" + top.toString());
}
else {
}
headers = headers.append("Cache-Control", "no-cache");
let lastPage = result.pages[result.pageIndex - 1];
return me.http.get(me.forceHTTPS(lastPage), { headers: headers }).pipe(map(r => {
result.pages.splice(result.pages.length - 1, 1);
let pr = me.resolveQueryResult(r, top, result.pages, result.pageIndex - 1);
return pr;
}));
};
}
return result;
}
getQueryStringParameters() {
let search = window.location.search;
let hashes = search.slice(search.indexOf('?') + 1).split('&');
let params = {};
hashes.map(hash => {
let [key, val] = hash.split('=');
params[key] = decodeURIComponent(val);
});
return params;
}
toGuid(v) {
// 5C48BB2A-BFC0-4E56-A262-8494E0F6A8FD
if (v == null || v == '') {
return v;
}
v = decodeURIComponent(v).replace('{', '').replace('}', '');
if (v.indexOf('-') >= 0) {
return v;
}
return v.substr(0, 8) + '-' + v.substr(8, 4) + '-' + v.substr(12, 4) + '-' + v.substr(16, 4) + '-' + v.substr(20);
}
getDefaultHeader() {
let headers = new HttpHeaders({ 'Accept': 'application/json' });
if (this.token != null) {
this.log('crmtoken used: ' + this.token);
headers = headers.append("Authorization", "Bearer " + this.token);
}
headers = headers.append("OData-MaxVersion", "4.0");
headers = headers.append("OData-Version", "4.0");
headers = headers.append("Content-Type", "application/json; charset=utf-8");
headers = headers.append("Prefer", "odata.include-annotations=\"*\"");
return headers;
}
forceHTTPS(v) {
if (this.forceHttps && v.startsWith("http://")) {
return v.replace("http://", "https://");
}
return v;
}
}
XrmService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: XrmService, deps: [{ token: i1.HttpClient }, { token: i0.Injector }, { token: i2.XrmFormService }], target: i0.ɵɵFactoryTarget.Injectable });
XrmService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: XrmService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: XrmService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i0.Injector }, { type: i2.XrmFormService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHJtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9raXBvbi14cm1zZXJ2aWNlL3NyYy9saWIveHJtLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUVyRCxPQUFPLEVBQWMsV0FBVyxFQUFnQixNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxVQUFVLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRXBDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBR3ZELE1BQU0sT0FBTyxZQUFZO0NBR3hCO0FBZUQsTUFBTSxPQUFPLE1BQU07SUFNakIsY0FBYztRQUNaLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDcEIsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRTtZQUM5QyxHQUFHLElBQUksR0FBRyxDQUFDO1NBQ1o7UUFDRCxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ3ZCLEdBQUcsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNoQyxJQUFJLEdBQUcsR0FBRyxDQUFBO1NBQ1g7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ3ZCLEdBQUcsSUFBSSxJQUFJLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDeEM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQzlDLEdBQUcsSUFBSSxHQUFHLENBQUM7U0FDWjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGO0FBR0QsTUFBTSxPQUFPLFVBQVU7SUFVckIsWUFBb0IsSUFBZ0IsRUFBVSxRQUFrQixFQUFVLGNBQThCO1FBQXBGLFNBQUksR0FBSixJQUFJLENBQVk7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQVUsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBVGhHLGtCQUFhLEdBQVcsaUJBQWlCLENBQUM7UUFDMUMsb0JBQWUsR0FBZSxJQUFJLENBQUM7UUFDM0MsV0FBTSxHQUFXLGlCQUFpQixDQUFDO1FBQ25DLGVBQVUsR0FBVyxNQUFNLENBQUM7UUFDNUIsVUFBSyxHQUFZLEtBQUssQ0FBQztRQUN2QixVQUFLLEdBQVcsSUFBSSxDQUFDO1FBQ3JCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDcEIsYUFBUSxHQUFXLENBQUMsQ0FBQztJQUc3QixDQUFDO0lBRUQsVUFBVSxDQUFDLENBQVM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUdELFVBQVU7UUFDUixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxFQUFFO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztTQUM3QjtRQUVELElBQUksQ0FBQyxHQUFlLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFckQsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2IsSUFBSSxPQUFPLENBQUMsQ0FBQyxVQUFVLElBQUksV0FBVyxFQUFFO2dCQUN0QyxDQUFDLENBQUMsVUFBVSxHQUFHLEdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQTthQUN2QztZQUVELElBQUksT0FBTyxDQUFDLENBQUMsYUFBYSxJQUFJLFdBQVcsRUFBRTtnQkFDekMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFBLENBQUMsQ0FBQyxDQUFDO2dCQUNsRixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQzthQUMzRDtZQUNELE9BQU8sQ0FBQyxDQUFDO1NBQ1Y7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDL0IsSUFBSSxPQUFPLEdBQUcsdUJBQXVCLENBQUM7UUFDdEMsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXJCLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25ELElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUMsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBRXRFLHFMQUFxTDtZQUNyTCxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0YsT0FBTyxHQUFHLEtBQUssR0FBRyxNQUFNLEdBQUcsR0FBRyxDQUFDO1NBQ2hDO1FBRUQsSUFBSTtZQUNGLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFxQixDQUFDO1lBQzVFLElBQUksYUFBYSxJQUFJLElBQUksRUFBRTtnQkFDekIsSUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN2QyxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFBRTtvQkFDbEgsT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO2lCQUNuQztnQkFDRCxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUU7b0JBQ3BFLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO2lCQUMxQjthQUNGO1NBQ0Y7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLHlDQUF5QztTQUMxQztRQUVELElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDckIsWUFBWTtnQkFDVixPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDO1lBQ0Qsd0JBQXdCO2dCQUN0QixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDcEMsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNoQixJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7b0JBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDdkMsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUNELFVBQVU7Z0JBQ1IsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUN2QyxDQUFDO1lBQ0QsU0FBUztnQkFDUCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QixDQUFDO1lBQ0QsV0FBVztnQkFDVCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixDQUFDO1lBQ0QsYUFBYTtnQkFDWCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM1QixDQUFDO1NBQ0YsQ0FBQztRQUVGLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXRDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsWUFBWSxHQUFHLE9BQU8sR0FBRyxXQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDakgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNaLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBVyxDQUFDO1lBRXhDLElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFdkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsR0FBRyxTQUFTLEdBQUcsWUFBWSxHQUFHLE9BQU8sR0FBRyxHQUFHLENBQUM7WUFFOUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRywyQkFBMkIsQ0FBQztZQUMvRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUU3QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM1QixJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUVwRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUV0QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQzFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEY7YUFBTTtZQUNMLElBQUksQ0FBQyxHQUFHLENBQUMsa0NBQWtDLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELE9BQU8sSUFBSSxVQUFVLENBQVMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2xDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBSUQsYUFBYSxDQUFDLHNCQUErQixLQUFLO1FBQ2hELDJIQUEySDtRQUMzSCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWhDLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFHOUIsSUFBSSxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDMUIsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ3RELEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEIsSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMzQjtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksbUJBQW1CLEVBQUU7WUFDakUsSUFBSSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQWUsR0FBRyxDQUFDLEVBQUU7Z0JBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLEdBQUcsQ0FBQztTQUNaO1FBR0QsSUFBSSxHQUFHLEdBQWUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9ELElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRTtZQUNqQyxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUM3QixPQUFPLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUMxQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtnQkFDZixNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQzdCLE9BQU8sSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7YUFDaEQ7aUJBQU07Z0JBQ0wsT0FBTyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDMUIsSUFBSSxFQUFFLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTt3QkFDeEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUNuRCxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7NEJBQ2YsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNsQixNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNoQyxNQUFNLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7NEJBQzdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7eUJBQ2xCO29CQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDVixDQUFDLENBQUMsQ0FBQzthQUNKO1NBQ0Y7YUFBTTtZQUNMLHNFQUFzRTtZQUN0RSxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLE9BQU8sSUFBSSxVQUFVLENBQWUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDOUQ7SUFDSCxDQUFDO0lBSUQsR0FBRyxDQUFJLFdBQW1CLEVBQUUsRUFBVSxFQUFFLE1BQWMsRUFBRSxTQUFpQixJQUFJO1FBQzNFLElBQUksT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ3RCLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUV0RCxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBRWQsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxFQUFFLEVBQUU7WUFDbEMsU0FBUyxHQUFHLEdBQUcsR0FBRyxVQUFVLEdBQUcsTUFBTSxDQUFDO1lBQ3RDLEdBQUcsR0FBRyxHQUFHLENBQUM7U0FDWDtRQUVELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXpDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFL0MsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLFNBQVMsR0FBRyxHQUFHLENBQUM7UUFDM0csSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVkLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFNRCxLQUFLLENBQUksV0FBbUIsRUFBRSxNQUFjLEVBQUUsTUFBYyxFQUFFLFVBQWtCLElBQUksRUFBRSxNQUFjLENBQUMsRUFBRSxRQUFpQixLQUFLO1FBQzNILElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztRQUNkLElBQUksT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ3RCLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtZQUNYLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUMzRTthQUFNO1NBQ047UUFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFdEQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksRUFBRSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtZQUN6SCxHQUFHLElBQUksR0FBRyxDQUFDO1NBQ1o7UUFDRCxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFFYixJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLEVBQUUsRUFBRTtZQUNsQyxHQUFHLElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQztZQUMzQixHQUFHLEdBQUcsR0FBRyxDQUFDO1NBQ1g7UUFFRCxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLEVBQUUsRUFBRTtZQUNsQyxHQUFHLElBQUksR0FBRyxHQUFHLFVBQVUsR0FBRyxNQUFNLENBQUM7WUFDakMsR0FBRyxHQUFHLEdBQUcsQ0FBQztTQUNYO1FBRUQsSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLE9BQU8sSUFBSSxFQUFFLEVBQUU7WUFDcEMsR0FBRyxJQUFJLEdBQUcsR0FBRyxXQUFXLEdBQUcsT0FBTyxDQUFDO1lBQ25DLEdBQUcsR0FBRyxHQUFHLENBQUM7U0FDWDtRQUVELElBQUksS0FBSyxFQUFFO1lBQ1QsR0FBRyxJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUM7WUFDM0IsR0FBRyxHQUFHLEdBQUcsQ0FBQztTQUNYO1FBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNuRixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUksUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQsTUFBTSxDQUFJLFVBQWtCLEVBQUUsTUFBUztRQUNyQyxJQUFJLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtZQUN0QixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNuRTtRQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUM1RSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUNsRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUU1RCxJQUFJLE9BQU8sR0FBRztZQUNaLE9BQU8sRUFBRSxPQUFPO1NBQ2pCLENBQUE7UUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUM3SixDQUFDLEdBQXNCLEVBQUUsRUFBRTtZQUN6QixJQUFJLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFO2dCQUNwQixJQUFJLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBVyxDQUFDO2dCQUMzRCxJQUFJLE1BQU0sR0FBRyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUM3RSxPQUFPLE1BQU0sQ0FBQzthQUNmO2lCQUFNO2dCQUNMLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQzthQUNqQjtRQUNILENBQUMsQ0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBSUQsTUFBTSxDQUFJLFVBQWtCLEVBQUUsTUFBUyxFQUFFLEVBQVUsRUFBRSxTQUFpQixJQUFJO1FBQ3hFLElBQUksT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ3RCLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBRTVELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNaLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtZQUNsQixFQUFFLEdBQUcsV0FBVyxHQUFHLE1BQU0sQ0FBQztTQUMzQjtRQUVELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDN0YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVmLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzlGLElBQUksUUFBUSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzVILE9BQU8sTUFBTSxDQUFDO2FBQ2Y7WUFDRCxPQUFPLFFBQWEsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUlELEdBQUcsQ0FBQyxVQUFrQixFQUFFLEVBQVUsRUFBRSxLQUFhLEVBQUUsS0FBVSxFQUFFLGtCQUEwQixJQUFJO1FBQzNGLElBQUksZUFBZSxJQUFJLElBQUk7WUFBRSxlQUFlLEdBQUcsT0FBTyxDQUFDO1FBRXZELElBQUksT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ3RCLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyxHQUFHLEVBQ1AsQ0FBQztRQUVGLENBQUMsQ0FBQyxlQUFlLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUdaLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7UUFDaEcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVkLElBQUksQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLElBQUksRUFBRTtZQUM5QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDakc7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ2pHO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFrQixFQUFFLEVBQVU7UUFDbkMsSUFBSSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDdEIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbkU7UUFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLENBQUM7UUFDNUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFFbEUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWE7UUFDeEIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsU0FBUyxDQUFDLFFBQWdCLEVBQUUsTUFBYyxFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQUUsT0FBZTtRQUN2RixJQUFJLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtZQUN0QixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNuRTtRQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUM1RSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUVsRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFM0gsSUFBSSxJQUFJLEdBQUc7WUFDVCxXQUFXLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHO1NBQ3hGLENBQUE7UUFFRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoQjtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBRUQsWUFBWSxDQUFDLFFBQWdCLEVBQUUsTUFBYyxFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQUUsT0FBZTtRQUMxRixJQUFJLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtZQUN0QixPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNuRTtRQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVqRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFHLE9BQU8sR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDN00sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVkLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDdEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBSUQsSUFBSSxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsWUFBb0IsSUFBSSxFQUFFLFVBQWtCLElBQUk7UUFDL0UsSUFBSSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDdEIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbkU7UUFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFakQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2hFLElBQUk