ketcher-standalone
Version:
Web-based molecule sketcher
583 lines (513 loc) • 21.2 MB
JavaScript
/****************************************************************************
* Copyright 2021 EPAM Systems
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
***************************************************************************/
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
import _classCallCheck from '@babel/runtime/helpers/classCallCheck';
import _createClass from '@babel/runtime/helpers/createClass';
import _defineProperty from '@babel/runtime/helpers/defineProperty';
import _regeneratorRuntime from '@babel/runtime/regenerator';
import { pickStandardServerOptions, provideEditorInstance, getLabelRenderModeForIndigo, ChemicalMimeType } from 'ketcher-core';
var Command;
(function (Command) {
Command[Command["Info"] = 0] = "Info";
Command[Command["Convert"] = 1] = "Convert";
Command[Command["Layout"] = 2] = "Layout";
Command[Command["Clean"] = 3] = "Clean";
Command[Command["Aromatize"] = 4] = "Aromatize";
Command[Command["Dearomatize"] = 5] = "Dearomatize";
Command[Command["CalculateCip"] = 6] = "CalculateCip";
Command[Command["Automap"] = 7] = "Automap";
Command[Command["Check"] = 8] = "Check";
Command[Command["Calculate"] = 9] = "Calculate";
Command[Command["GenerateImageAsBase64"] = 10] = "GenerateImageAsBase64";
Command[Command["GetInChIKey"] = 11] = "GetInChIKey";
Command[Command["ExplicitHydrogens"] = 12] = "ExplicitHydrogens";
Command[Command["CalculateMacromoleculeProperties"] = 13] = "CalculateMacromoleculeProperties";
})(Command || (Command = {}));
var WorkerEvent;
(function (WorkerEvent) {
WorkerEvent["Info"] = "info";
WorkerEvent["Convert"] = "convert";
WorkerEvent["Layout"] = "layout";
WorkerEvent["Clean"] = "clean";
WorkerEvent["Aromatize"] = "aromatize";
WorkerEvent["Dearomatize"] = "dearomatize";
WorkerEvent["CalculateCip"] = "calculateCip";
WorkerEvent["Automap"] = "automap";
WorkerEvent["Check"] = "check";
WorkerEvent["Calculate"] = "calculate";
WorkerEvent["GenerateImageAsBase64"] = "generateImageAsBase64";
WorkerEvent["GetInChIKey"] = "getInChIKey";
WorkerEvent["ExplicitHydrogens"] = "convert_explicit_hydrogens";
WorkerEvent["CalculateMacromoleculeProperties"] = "calculateMacroProperties";
})(WorkerEvent || (WorkerEvent = {}));
var SupportedFormat;
(function (SupportedFormat) {
SupportedFormat["Rxn"] = "rxnfile";
SupportedFormat["Mol"] = "molfile";
SupportedFormat["Smiles"] = "smiles";
SupportedFormat["Smarts"] = "smarts";
SupportedFormat["CML"] = "cml";
SupportedFormat["InChI"] = "inchi";
SupportedFormat["InChIAuxInfo"] = "inchi-aux";
SupportedFormat["InChIKey"] = "inchi-key";
SupportedFormat["Ket"] = "ket";
SupportedFormat["CDX"] = "cdx";
SupportedFormat["CDXML"] = "cdxml";
SupportedFormat["SDF"] = "sdf";
SupportedFormat["FASTA"] = "fasta";
SupportedFormat["SEQUENCE"] = "sequence";
SupportedFormat["SEQUENCE_3_LETTER"] = "peptide-sequence-3-letter";
SupportedFormat["IDT"] = "idt";
SupportedFormat["AXOLABS"] = "axo-labs";
SupportedFormat["HELM"] = "helm";
SupportedFormat["BILN"] = "biln";
SupportedFormat["RDF"] = "rdf";
SupportedFormat["MonomerLibrary"] = "monomer-library";
})(SupportedFormat || (SupportedFormat = {}));
var domain;
// This constructor is used to store event handlers. Instantiating this is
// faster than explicitly calling `Object.create(null)` to get a "clean" empty
// object (tested with v8 v4.9).
function EventHandlers() {}
EventHandlers.prototype = Object.create(null);
function EventEmitter() {
EventEmitter.init.call(this);
}
// nodejs oddity
// require('events') === require('events').EventEmitter
EventEmitter.EventEmitter = EventEmitter;
EventEmitter.usingDomains = false;
EventEmitter.prototype.domain = undefined;
EventEmitter.prototype._events = undefined;
EventEmitter.prototype._maxListeners = undefined;
// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
EventEmitter.defaultMaxListeners = 10;
EventEmitter.init = function() {
this.domain = null;
if (EventEmitter.usingDomains) {
// if there is an active domain, then attach to it.
if (domain.active ) ;
}
if (!this._events || this._events === Object.getPrototypeOf(this)._events) {
this._events = new EventHandlers();
this._eventsCount = 0;
}
this._maxListeners = this._maxListeners || undefined;
};
// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
if (typeof n !== 'number' || n < 0 || isNaN(n))
throw new TypeError('"n" argument must be a positive number');
this._maxListeners = n;
return this;
};
function $getMaxListeners(that) {
if (that._maxListeners === undefined)
return EventEmitter.defaultMaxListeners;
return that._maxListeners;
}
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
return $getMaxListeners(this);
};
// These standalone emit* functions are used to optimize calling of event
// handlers for fast cases because emit() itself often has a variable number of
// arguments and can be deoptimized because of that. These functions always have
// the same number of arguments and thus do not get deoptimized, so the code
// inside them can execute faster.
function emitNone(handler, isFn, self) {
if (isFn)
handler.call(self);
else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i)
listeners[i].call(self);
}
}
function emitOne(handler, isFn, self, arg1) {
if (isFn)
handler.call(self, arg1);
else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i)
listeners[i].call(self, arg1);
}
}
function emitTwo(handler, isFn, self, arg1, arg2) {
if (isFn)
handler.call(self, arg1, arg2);
else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i)
listeners[i].call(self, arg1, arg2);
}
}
function emitThree(handler, isFn, self, arg1, arg2, arg3) {
if (isFn)
handler.call(self, arg1, arg2, arg3);
else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i)
listeners[i].call(self, arg1, arg2, arg3);
}
}
function emitMany(handler, isFn, self, args) {
if (isFn)
handler.apply(self, args);
else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i)
listeners[i].apply(self, args);
}
}
EventEmitter.prototype.emit = function emit(type) {
var er, handler, len, args, i, events, domain;
var doError = (type === 'error');
events = this._events;
if (events)
doError = (doError && events.error == null);
else if (!doError)
return false;
domain = this.domain;
// If there is no 'error' event listener then throw.
if (doError) {
er = arguments[1];
if (domain) {
if (!er)
er = new Error('Uncaught, unspecified "error" event');
er.domainEmitter = this;
er.domain = domain;
er.domainThrown = false;
domain.emit('error', er);
} else if (er instanceof Error) {
throw er; // Unhandled 'error' event
} else {
// At least give some kind of context to the user
var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
err.context = er;
throw err;
}
return false;
}
handler = events[type];
if (!handler)
return false;
var isFn = typeof handler === 'function';
len = arguments.length;
switch (len) {
// fast cases
case 1:
emitNone(handler, isFn, this);
break;
case 2:
emitOne(handler, isFn, this, arguments[1]);
break;
case 3:
emitTwo(handler, isFn, this, arguments[1], arguments[2]);
break;
case 4:
emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);
break;
// slower
default:
args = new Array(len - 1);
for (i = 1; i < len; i++)
args[i - 1] = arguments[i];
emitMany(handler, isFn, this, args);
}
return true;
};
function _addListener(target, type, listener, prepend) {
var m;
var events;
var existing;
if (typeof listener !== 'function')
throw new TypeError('"listener" argument must be a function');
events = target._events;
if (!events) {
events = target._events = new EventHandlers();
target._eventsCount = 0;
} else {
// To avoid recursion in the case that type === "newListener"! Before
// adding it to the listeners, first emit "newListener".
if (events.newListener) {
target.emit('newListener', type,
listener.listener ? listener.listener : listener);
// Re-assign `events` because a newListener handler could have caused the
// this._events to be assigned to a new object
events = target._events;
}
existing = events[type];
}
if (!existing) {
// Optimize the case of one listener. Don't need the extra array object.
existing = events[type] = listener;
++target._eventsCount;
} else {
if (typeof existing === 'function') {
// Adding the second element, need to change to array.
existing = events[type] = prepend ? [listener, existing] :
[existing, listener];
} else {
// If we've already got an array, just append.
if (prepend) {
existing.unshift(listener);
} else {
existing.push(listener);
}
}
// Check for listener leak
if (!existing.warned) {
m = $getMaxListeners(target);
if (m && m > 0 && existing.length > m) {
existing.warned = true;
var w = new Error('Possible EventEmitter memory leak detected. ' +
existing.length + ' ' + type + ' listeners added. ' +
'Use emitter.setMaxListeners() to increase limit');
w.name = 'MaxListenersExceededWarning';
w.emitter = target;
w.type = type;
w.count = existing.length;
emitWarning(w);
}
}
}
return target;
}
function emitWarning(e) {
typeof console.warn === 'function' ? console.warn(e) : console.log(e);
}
EventEmitter.prototype.addListener = function addListener(type, listener) {
return _addListener(this, type, listener, false);
};
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
EventEmitter.prototype.prependListener =
function prependListener(type, listener) {
return _addListener(this, type, listener, true);
};
function _onceWrap(target, type, listener) {
var fired = false;
function g() {
target.removeListener(type, g);
if (!fired) {
fired = true;
listener.apply(target, arguments);
}
}
g.listener = listener;
return g;
}
EventEmitter.prototype.once = function once(type, listener) {
if (typeof listener !== 'function')
throw new TypeError('"listener" argument must be a function');
this.on(type, _onceWrap(this, type, listener));
return this;
};
EventEmitter.prototype.prependOnceListener =
function prependOnceListener(type, listener) {
if (typeof listener !== 'function')
throw new TypeError('"listener" argument must be a function');
this.prependListener(type, _onceWrap(this, type, listener));
return this;
};
// emits a 'removeListener' event iff the listener was removed
EventEmitter.prototype.removeListener =
function removeListener(type, listener) {
var list, events, position, i, originalListener;
if (typeof listener !== 'function')
throw new TypeError('"listener" argument must be a function');
events = this._events;
if (!events)
return this;
list = events[type];
if (!list)
return this;
if (list === listener || (list.listener && list.listener === listener)) {
if (--this._eventsCount === 0)
this._events = new EventHandlers();
else {
delete events[type];
if (events.removeListener)
this.emit('removeListener', type, list.listener || listener);
}
} else if (typeof list !== 'function') {
position = -1;
for (i = list.length; i-- > 0;) {
if (list[i] === listener ||
(list[i].listener && list[i].listener === listener)) {
originalListener = list[i].listener;
position = i;
break;
}
}
if (position < 0)
return this;
if (list.length === 1) {
list[0] = undefined;
if (--this._eventsCount === 0) {
this._events = new EventHandlers();
return this;
} else {
delete events[type];
}
} else {
spliceOne(list, position);
}
if (events.removeListener)
this.emit('removeListener', type, originalListener || listener);
}
return this;
};
EventEmitter.prototype.removeAllListeners =
function removeAllListeners(type) {
var listeners, events;
events = this._events;
if (!events)
return this;
// not listening for removeListener, no need to emit
if (!events.removeListener) {
if (arguments.length === 0) {
this._events = new EventHandlers();
this._eventsCount = 0;
} else if (events[type]) {
if (--this._eventsCount === 0)
this._events = new EventHandlers();
else
delete events[type];
}
return this;
}
// emit removeListener for all listeners on all events
if (arguments.length === 0) {
var keys = Object.keys(events);
for (var i = 0, key; i < keys.length; ++i) {
key = keys[i];
if (key === 'removeListener') continue;
this.removeAllListeners(key);
}
this.removeAllListeners('removeListener');
this._events = new EventHandlers();
this._eventsCount = 0;
return this;
}
listeners = events[type];
if (typeof listeners === 'function') {
this.removeListener(type, listeners);
} else if (listeners) {
// LIFO order
do {
this.removeListener(type, listeners[listeners.length - 1]);
} while (listeners[0]);
}
return this;
};
EventEmitter.prototype.listeners = function listeners(type) {
var evlistener;
var ret;
var events = this._events;
if (!events)
ret = [];
else {
evlistener = events[type];
if (!evlistener)
ret = [];
else if (typeof evlistener === 'function')
ret = [evlistener.listener || evlistener];
else
ret = unwrapListeners(evlistener);
}
return ret;
};
EventEmitter.listenerCount = function(emitter, type) {
if (typeof emitter.listenerCount === 'function') {
return emitter.listenerCount(type);
} else {
return listenerCount.call(emitter, type);
}
};
EventEmitter.prototype.listenerCount = listenerCount;
function listenerCount(type) {
var events = this._events;
if (events) {
var evlistener = events[type];
if (typeof evlistener === 'function') {
return 1;
} else if (evlistener) {
return evlistener.length;
}
}
return 0;
}
EventEmitter.prototype.eventNames = function eventNames() {
return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];
};
// About 1.5x faster than the two-arg version of Array#splice().
function spliceOne(list, index) {
for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)
list[i] = list[k];
list.pop();
}
function arrayClone(arr, i) {
var copy = new Array(i);
while (i--)
copy[i] = arr[i];
return copy;
}
function unwrapListeners(arr) {
var ret = new Array(arr.length);
for (var i = 0; i < ret.length; ++i) {
ret[i] = arr[i].listener || arr[i];
}
return ret;
}
var STRUCT_SERVICE_NO_RENDER_INITIALIZED_EVENT = 'struct-service-no-render-initialized';
var STRUCT_SERVICE_INITIALIZED_EVENT = 'struct-service-initialized';
function decodeBase64(base64, enableUnicode) {
var binaryString = atob(base64);
if (enableUnicode) {
var binaryView = new Uint8Array(binaryString.length);
for (var i = 0, n = binaryString.length; i < n; ++i) {
binaryView[i] = binaryString.charCodeAt(i);
}
return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer));
}
return binaryString;
}
function createURL(base64, sourcemapArg, enableUnicodeArg) {
var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;
var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;
var source = decodeBase64(base64, enableUnicode);
var start = source.indexOf('\n', 10) + 1;
var body = source.substring(start) + (sourcemap ? '\/\/# sourceMappingURL=' + sourcemap : '');
var blob = new Blob([body], { type: 'application/javascript' });
return URL.createObjectURL(blob);
}
function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
var url;
return function WorkerFactory(options) {
url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
return new Worker(url, options);
};
}
var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewoJJ3VzZSBzdHJpY3QnOwoKCWZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzICh4KSB7CgkJcmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDsKCX0KCglmdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShmbiwgYmFzZWRpciwgbW9kdWxlKSB7CgkJcmV0dXJuIG1vZHVsZSA9IHsKCQkJcGF0aDogYmFzZWRpciwKCQkJZXhwb3J0czoge30sCgkJCXJlcXVpcmU6IGZ1bmN0aW9uIChwYXRoLCBiYXNlKSB7CgkJCQlyZXR1cm4gY29tbW9uanNSZXF1aXJlKHBhdGgsIChiYXNlID09PSB1bmRlZmluZWQgfHwgYmFzZSA9PT0gbnVsbCkgPyBtb2R1bGUucGF0aCA6IGJhc2UpOwoJCQl9CgkJfSwgZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzOwoJfQoKCWZ1bmN0aW9uIGNvbW1vbmpzUmVxdWlyZSAoKSB7CgkJdGhyb3cgbmV3IEVycm9yKCdEeW5hbWljIHJlcXVpcmVzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSBAcm9sbHVwL3BsdWdpbi1jb21tb25qcycpOwoJfQoKCXZhciBfdHlwZW9mXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7CglmdW5jdGlvbiBfdHlwZW9mKG8pIHsKCSAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCgkgIHJldHVybiBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgInN5bWJvbCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7CgkgICAgcmV0dXJuIHR5cGVvZiBvOwoJICB9IDogZnVuY3Rpb24gKG8pIHsKCSAgICByZXR1cm4gbyAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvOwoJICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzLCBfdHlwZW9mKG8pOwoJfQoJbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwoJfSk7CgoJdmFyIHRvUHJpbWl0aXZlXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7Cgl2YXIgX3R5cGVvZiA9IF90eXBlb2ZfMVsiZGVmYXVsdCJdOwoJZnVuY3Rpb24gdG9QcmltaXRpdmUodCwgcikgewoJICBpZiAoIm9iamVjdCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7CgkgIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOwoJICBpZiAodm9pZCAwICE9PSBlKSB7CgkgICAgdmFyIGkgPSBlLmNhbGwodCwgciB8fCAiZGVmYXVsdCIpOwoJICAgIGlmICgib2JqZWN0IiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsKCSAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwoJICB9CgkgIHJldHVybiAoInN0cmluZyIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOwoJfQoJbW9kdWxlLmV4cG9ydHMgPSB0b1ByaW1pdGl2ZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKCX0pOwoKCXZhciB0b1Byb3BlcnR5S2V5XzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7Cgl2YXIgX3R5cGVvZiA9IF90eXBlb2ZfMVsiZGVmYXVsdCJdOwoKCWZ1bmN0aW9uIHRvUHJvcGVydHlLZXkodCkgewoJICB2YXIgaSA9IHRvUHJpbWl0aXZlXzEodCwgInN0cmluZyIpOwoJICByZXR1cm4gInN5bWJvbCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgIiI7Cgl9Cgltb2R1bGUuZXhwb3J0cyA9IHRvUHJvcGVydHlLZXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7Cgl9KTsKCgl2YXIgZGVmaW5lUHJvcGVydHkgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7CglmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkgewoJICByZXR1cm4gKHIgPSB0b1Byb3BlcnR5S2V5XzEocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgewoJICAgIHZhbHVlOiB0LAoJICAgIGVudW1lcmFibGU6ICEwLAoJICAgIGNvbmZpZ3VyYWJsZTogITAsCgkgICAgd3JpdGFibGU6ICEwCgkgIH0pIDogZVtyXSA9IHQsIGU7Cgl9Cgltb2R1bGUuZXhwb3J0cyA9IF9kZWZpbmVQcm9wZXJ0eSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKCX0pOwoKCXZhciBfZGVmaW5lUHJvcGVydHkgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoZGVmaW5lUHJvcGVydHkpOwoKCXZhciBhcnJheVdpdGhIb2xlcyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHsKCWZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhyKSB7CgkgIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gcjsKCX0KCW1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aEhvbGVzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwoJfSk7CgoJdmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkgewoJZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHsKCSAgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogInVuZGVmaW5lZCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgclsiQEBpdGVyYXRvciJdOwoJICBpZiAobnVsbCAhPSB0KSB7CgkgICAgdmFyIGUsCgkgICAgICBuLAoJICAgICAgaSwKCSAgICAgIHUsCgkgICAgICBhID0gW10sCgkgICAgICBmID0gITAsCgkgICAgICBvID0gITE7CgkgICAgdHJ5IHsKCSAgICAgIGlmIChpID0gKHQgPSB0LmNhbGwocikpLm5leHQsIDAgPT09IGwpIHsKCSAgICAgICAgaWYgKE9iamVjdCh0KSAhPT0gdCkgcmV0dXJuOwoJICAgICAgICBmID0gITE7CgkgICAgICB9IGVsc2UgZm9yICg7ICEoZiA9IChlID0gaS5jYWxsKHQpKS5kb25lKSAmJiAoYS5wdXNoKGUudmFsdWUpLCBhLmxlbmd0aCAhPT0gbCk7IGYgPSAhMCk7CgkgICAgfSBjYXRjaCAocikgewoJICAgICAgbyA9ICEwLCBuID0gcjsKCSAgICB9IGZpbmFsbHkgewoJICAgICAgdHJ5IHsKCSAgICAgICAgaWYgKCFmICYmIG51bGwgIT0gdFsicmV0dXJuIl0gJiYgKHUgPSB0WyJyZXR1cm4iXSgpLCBPYmplY3QodSkgIT09IHUpKSByZXR1cm47CgkgICAgICB9IGZpbmFsbHkgewoJICAgICAgICBpZiAobykgdGhyb3cgbjsKCSAgICAgIH0KCSAgICB9CgkgICAgcmV0dXJuIGE7CgkgIH0KCX0KCW1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwoJfSk7CgoJdmFyIGFycmF5TGlrZVRvQXJyYXkgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7CglmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKSB7CgkgIChudWxsID09IGEgfHwgYSA+IHIubGVuZ3RoKSAmJiAoYSA9IHIubGVuZ3RoKTsKCSAgZm9yICh2YXIgZSA9IDAsIG4gPSBBcnJheShhKTsgZSA8IGE7IGUrKykgbltlXSA9IHJbZV07CgkgIHJldHVybiBuOwoJfQoJbW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKCX0pOwoKCXZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHsKCWZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7CgkgIGlmIChyKSB7CgkgICAgaWYgKCJzdHJpbmciID09IHR5cGVvZiByKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShyLCBhKTsKCSAgICB2YXIgdCA9IHt9LnRvU3RyaW5nLmNhbGwocikuc2xpY2UoOCwgLTEpOwoJICAgIHJldHVybiAiT2JqZWN0IiA9PT0gdCAmJiByLmNvbnN0cnVjdG9yICYmICh0ID0gci5jb25zdHJ1Y3Rvci5uYW1lKSwgIk1hcCIgPT09IHQgfHwgIlNldCIgPT09IHQgPyBBcnJheS5mcm9tKHIpIDogIkFyZ3VtZW50cyIgPT09IHQgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QodCkgPyBhcnJheUxpa2VUb0FycmF5KHIsIGEpIDogdm9pZCAwOwoJICB9Cgl9Cgltb2R1bGUuZXhwb3J0cyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKCX0pOwoKCXZhciBub25JdGVyYWJsZVJlc3QgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7CglmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgewoJICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOwoJfQoJbW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVSZXN0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwoJfSk7CgoJdmFyIHNsaWNlZFRvQXJyYXkgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7CglmdW5jdGlvbiBfc2xpY2VkVG9BcnJheShyLCBlKSB7CgkgIHJldHVybiBhcnJheVdpdGhIb2xlcyhyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBlKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBlKSB8fCBub25JdGVyYWJsZVJlc3QoKTsKCX0KCW1vZHVsZS5leHBvcnRzID0gX3NsaWNlZFRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7Cgl9KTsKCgl2YXIgX3NsaWNlZFRvQXJyYXkgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoc2xpY2VkVG9BcnJheSk7CgoJdmFyIENvbW1hbmQ7CgkoZnVuY3Rpb24gKENvbW1hbmQpIHsKCSAgQ29tbWFuZFtDb21tYW5kWyJJbmZvIl0gPSAwXSA9ICJJbmZvIjsKCSAgQ29tbWFuZFtDb21tYW5kWyJDb252ZXJ0Il0gPSAxXSA9ICJDb252ZXJ0IjsKCSAgQ29tbWFuZFtDb21tYW5kWyJMYXlvdXQiXSA9IDJdID0gIkxheW91dCI7CgkgIENvbW1hbmRbQ29tbWFuZFsiQ2xlYW4iXSA9IDNdID0gIkNsZWFuIjsKCSAgQ29tbWFuZFtDb21tYW5kWyJBcm9tYXRpemUiXSA9IDRdID0gIkFyb21hdGl6ZSI7CgkgIENvbW1hbmRbQ29tbWFuZFsiRGVhcm9tYXRpemUiXSA9IDVdID0gIkRlYXJvbWF0aXplIjsKCSAgQ29tbWFuZFtDb21tYW5kWyJDYWxjdWxhdGVDaXAiXSA9IDZdID0gIkNhbGN1bGF0ZUNpcCI7CgkgIENvbW1hbmRbQ29tbWFuZFsiQXV0b21hcCJdID0gN10gPSAiQXV0b21hcCI7CgkgIENvbW1hbmRbQ29tbWFuZFsiQ2hlY2siXSA9IDhdID0gIkNoZWNrIjsKCSAgQ29tbWFuZFtDb21tYW5kWyJDYWxjdWxhdGUiXSA9IDldID0gIkNhbGN1bGF0ZSI7CgkgIENvbW1hbmRbQ29tbWFuZFsiR2VuZXJhdGVJbWFnZUFzQmFzZTY0Il0gPSAxMF0gPSAiR2VuZXJhdGVJbWFnZUFzQmFzZTY0IjsKCSAgQ29tbWFuZFtDb21tYW5kWyJHZXRJbkNoSUtleSJdID0gMTFdID0gIkdldEluQ2hJS2V5IjsKCSAgQ29tbWFuZFtDb21tYW5kWyJFeHBsaWNpdEh5ZHJvZ2VucyJdID0gMTJdID0gIkV4cGxpY2l0SHlkcm9nZW5zIjsKCSAgQ29tbWFuZFtDb21tYW5kWyJDYWxjdWxhdGVNYWNyb21vbGVjdWxlUHJvcGVydGllcyJdID0gMTNdID0gIkNhbGN1bGF0ZU1hY3JvbW9sZWN1bGVQcm9wZXJ0aWVzIjsKCX0pKENvbW1hbmQgfHwgKENvbW1hbmQgPSB7fSkpOwoJdmFyIFdvcmtlckV2ZW50OwoJKGZ1bmN0aW9uIChXb3JrZXJFdmVudCkgewoJICBXb3JrZXJFdmVudFsiSW5mbyJdID0gImluZm8iOwoJICBXb3JrZXJFdmVudFsiQ29udmVydCJdID0gImNvbnZlcnQiOwoJICBXb3JrZXJFdmVudFsiTGF5b3V0Il0gPSAibGF5b3V0IjsKCSAgV29ya2VyRXZlbnRbIkNsZWFuIl0gPSAiY2xlYW4iOwoJICBXb3JrZXJFdmVudFsiQXJvbWF0aXplIl0gPSAiYXJvbWF0aXplIjsKCSAgV29ya2VyRXZlbnRbIkRlYXJvbWF0aXplIl0gPSAiZGVhcm9tYXRpemUiOwoJICBXb3JrZXJFdmVudFsiQ2FsY3VsYXRlQ2lwIl0gPSAiY2FsY3VsYXRlQ2lwIjsKCSAgV29ya2VyRXZlbnRbIkF1dG9tYXAiXSA9ICJhdXRvbWFwIjsKCSAgV29ya2VyRXZlbnRbIkNoZWNrIl0gPSAiY2hlY2siOwoJICBXb3JrZXJFdmVudFsiQ2FsY3VsYXRlIl0gPSAiY2FsY3VsYXRlIjsKCSAgV29ya2VyRXZlbnRbIkdlbmVyYXRlSW1hZ2VBc0Jhc2U2NCJdID0gImdlbmVyYXRlSW1hZ2VBc0Jhc2U2NCI7CgkgIFdvcmtlckV2ZW50WyJHZXRJbkNoSUtleSJdID0gImdldEluQ2hJS2V5IjsKCSAgV29ya2VyRXZlbnRbIkV4cGxpY2l0SHlkcm9nZW5zIl0gPSAiY29udmVydF9leHBsaWNpdF9oeWRyb2dlbnMiOwoJICBXb3JrZXJFdmVudFsiQ2FsY3VsYXRlTWFjcm9tb2xlY3VsZVByb3BlcnRpZXMiXSA9ICJjYWxjdWxhdGVNYWNyb1Byb3BlcnRpZXMiOwoJfSkoV29ya2VyRXZlbnQgfHwgKFdvcmtlckV2ZW50ID0ge30pKTsKCXZhciBTdXBwb3J0ZWRGb3JtYXQ7CgkoZnVuY3Rpb24gKFN1cHBvcnRlZEZvcm1hdCkgewoJICBTdXBwb3J0ZWRGb3JtYXRbIlJ4biJdID0gInJ4bmZpbGUiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIk1vbCJdID0gIm1vbGZpbGUiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIlNtaWxlcyJdID0gInNtaWxlcyI7CgkgIFN1cHBvcnRlZEZvcm1hdFsiU21hcnRzIl0gPSAic21hcnRzIjsKCSAgU3VwcG9ydGVkRm9ybWF0WyJDTUwiXSA9ICJjbWwiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIkluQ2hJIl0gPSAiaW5jaGkiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIkluQ2hJQXV4SW5mbyJdID0gImluY2hpLWF1eCI7CgkgIFN1cHBvcnRlZEZvcm1hdFsiSW5DaElLZXkiXSA9ICJpbmNoaS1rZXkiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIktldCJdID0gImtldCI7CgkgIFN1cHBvcnRlZEZvcm1hdFsiQ0RYIl0gPSAiY2R4IjsKCSAgU3VwcG9ydGVkRm9ybWF0WyJDRFhNTCJdID0gImNkeG1sIjsKCSAgU3VwcG9ydGVkRm9ybWF0WyJTREYiXSA9ICJzZGYiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIkZBU1RBIl0gPSAiZmFzdGEiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIlNFUVVFTkNFIl0gPSAic2VxdWVuY2UiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIlNFUVVFTkNFXzNfTEVUVEVSIl0gPSAicGVwdGlkZS1zZXF1ZW5jZS0zLWxldHRlciI7CgkgIFN1cHBvcnRlZEZvcm1hdFsiSURUIl0gPSAiaWR0IjsKCSAgU3VwcG9ydGVkRm9ybWF0WyJBWE9MQUJTIl0gPSAiYXhvLWxhYnMiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIkhFTE0iXSA9ICJoZWxtIjsKCSAgU3VwcG9ydGVkRm9ybWF0WyJCSUxOIl0gPSAiYmlsbiI7CgkgIFN1cHBvcnRlZEZvcm1hdFsiUkRGIl0gPSAicmRmIjsKCSAgU3VwcG9ydGVkRm9ybWF0WyJNb25vbWVyTGlicmFyeSJdID0gIm1vbm9tZXItbGlicmFyeSI7Cgl9KShTdXBwb3J0ZWRGb3JtYXQgfHwgKFN1cHBvcnRlZEZvcm1hdCA9IHt9KSk7CgoJdmFyIGluZGlnb0tldGNoZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7Cgl2YXIgTW9kdWxlPSgoKT0+e3ZhciBfc2NyaXB0TmFtZT1nbG9iYWxUaGlzLmRvY3VtZW50Py5jdXJyZW50U2NyaXB0Py5zcmM7cmV0dXJuIGFzeW5jIGZ1bmN0aW9uKG1vZHVsZUFyZz17fSl7dmFyIG1vZHVsZVJ0bjt2YXIgTW9kdWxlPW1vZHVsZUFyZzt2YXIgRU5WSVJPTk1FTlRfSVNfV0VCPSEhZ2xvYmFsVGhpcy53aW5kb3c7dmFyIEVOVklST05NRU5UX0lTX1dPUktFUj0hIWdsb2JhbFRoaXMuV29ya2VyR2xvYmFsU2NvcGU7Z2xvYmFsVGhpcy5wcm9jZXNzPy52ZXJzaW9ucz8ubm9kZSYmZ2xvYmFsVGhpcy5wcm9jZXNzPy50eXBlIT0icmVuZGVyZXIiO3ZhciB0aGlzUHJvZ3JhbT0iLi90aGlzLnByb2dyYW0iO2lmKEVOVklST05NRU5UX0lTX1dPUktFUil7X3NjcmlwdE5hbWU9c2VsZi5sb2NhdGlvbi5ocmVmO312YXIgc2NyaXB0RGlyZWN0b3J5PSIiO3ZhciByZWFkQXN5bmMscmVhZEJpbmFyeTtpZihFTlZJUk9OTUVOVF9JU19XRUJ8fEVOVklST05NRU5UX0lTX1dPUktFUil7dHJ5e3NjcmlwdERpcmVjdG9yeT1uZXcgVVJMKCIuIixfc2NyaXB0TmFtZSkuaHJlZjt9Y2F0Y2h7fXtpZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe3JlYWRCaW5hcnk9dXJsPT57dmFyIHhocj1uZXcgWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oIkdFVCIsdXJsLGZhbHNlKTt4aHIucmVzcG9uc2VUeXBlPSJhcnJheWJ1ZmZlciI7eGhyLnNlbmQobnVsbCk7cmV0dXJuIG5ldyBVaW50OEFycmF5KHhoci5yZXNwb25zZSl9O31yZWFkQXN5bmM9YXN5bmMgdXJsPT57dmFyIHJlc3BvbnNlPWF3YWl0IGZldGNoKHVybCx7Y3JlZGVudGlhbHM6InNhbWUtb3JpZ2luIn0pO2lmKHJlc3BvbnNlLm9rKXtyZXR1cm4gcmVzcG9uc2UuYXJyYXlCdWZmZXIoKX10aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzKyIgOiAiK3Jlc3BvbnNlLnVybCl9O319dmFyIG91dD1jb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO3ZhciBlcnI9Y29uc29sZS5lcnJvci5iaW5kKGNvbnNvbGUpO3ZhciB3YXNtQmluYXJ5O3ZhciBBQk9SVD1mYWxzZTtjbGFzcyBFbXNjcmlwdGVuRUh7fWNsYXNzIEVtc2NyaXB0ZW5TakxqIGV4dGVuZHMgRW1zY3JpcHRlbkVIe31jbGFzcyBDcHBFeGNlcHRpb24gZXh0ZW5kcyBFbXNjcmlwdGVuRUh7Y29uc3RydWN0b3IoZXhjUHRyKXtzdXBlcigpO3RoaXMuZXhjUHRyPWV4Y1B0cjt9fXZhciByZWFkeVByb21pc2VSZXNvbHZlLHJlYWR5UHJvbWlzZVJlamVjdDt2YXIgcnVudGltZUluaXRpYWxpemVkPWZhbHNlO2Z1bmN0aW9uIHVwZGF0ZU1lbW9yeVZpZXdzKCl7dmFyIGI9d2FzbU1lbW9yeS5idWZmZXI7SEVBUDg9bmV3IEludDhBcnJheShiKTtIRUFQMTY9bmV3IEludDE2QXJyYXkoYik7SEVBUFU4PW5ldyBVaW50OEFycmF5KGIpO0hFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGIpO0hFQVAzMj1uZXcgSW50MzJBcnJheShiKTtIRUFQVTMyPW5ldyBVaW50MzJBcnJheShiKTtIRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkoYik7SEVBUEY2ND1uZXcgRmxvYXQ2NEFycmF5KGIpO0hFQVA2ND1uZXcgQmlnSW50NjRBcnJheShiKTtIRUFQVTY0PW5ldyBCaWdVaW50NjRBcnJheShiKTt9ZnVuY3Rpb24gcHJlUnVuKCl7aWYoTW9kdWxlWyJwcmVSdW4iXSl7aWYodHlwZW9mIE1vZHVsZVsicHJlUnVuIl09PSJmdW5jdGlvbiIpTW9kdWxlWyJwcmVSdW4iXT1bTW9kdWxlWyJwcmVSdW4iXV07d2hpbGUoTW9kdWxlWyJwcmVSdW4iXS5sZW5ndGgpe2FkZE9uUHJlUnVuKE1vZHVsZVsicHJlUnVuIl0uc2hpZnQoKSk7fX1jYWxsUnVudGltZUNhbGxiYWNrcyhvblByZVJ1bnMpO31mdW5jdGlvbiBpbml0UnVudGltZSgpe3J1bnRpbWVJbml0aWFsaXplZD10cnVlO2lmKCFNb2R1bGVbIm5vRlNJbml0Il0mJiFGUy5pbml0aWFsaXplZClGUy5pbml0KCk7d2FzbUV4cG9ydHNbInpiIl0oKTtGUy5pZ25vcmVQZXJtaXNzaW9ucz1mYWxzZTt9ZnVuY3Rpb24gcG9zdFJ1bigpe2lmKE1vZHVsZVsicG9zdFJ1biJdKXtpZih0eXBlb2YgTW9kdWxlWyJwb3N0UnVuIl09PSJmdW5jdGlvbiIpTW9kdWxlWyJwb3N0UnVuIl09W01vZHVsZVsicG9zdFJ1biJdXTt3aGlsZShNb2R1bGVbInBvc3RSdW4iXS5sZW5ndGgpe2FkZE9uUG9zdFJ1bihNb2R1bGVbInBvc3RSdW4iXS5zaGlmdCgpKTt9fWNhbGxSdW50aW1lQ2FsbGJhY2tzKG9uUG9zdFJ1bnMpO31mdW5jdGlvbiBhYm9ydCh3aGF0KXtNb2R1bGVbIm9uQWJvcnQiXT8uKHdoYXQpO3doYXQ9YEFib3J0ZWQoJHt3aGF0fSlgO2Vycih3aGF0KTtBQk9SVD10cnVlO3doYXQrPSIuIEJ1aWxkIHdpdGggLXNBU1NFUlRJT05TIGZvciBtb3JlIGluZm8uIjt2YXIgZT1uZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKHdoYXQpO3JlYWR5UHJvbWlzZVJlamVjdD8uKGUpO3Rocm93IGV9dmFyIHdhc21CaW5hcnlGaWxlO2Z1bmN0aW9uIGZpbmRXYXNtQmluYXJ5KCl7cmV0dXJuIGJhc2U2NERlY29kZSgiQUdGemJRRUFBQUFCL0E3VkFXQUJmd0JnQW45L0FYOWdBWDhCZjJBRGYzOS9BWDlnQW45L0FHQURmMzkvQUdBRWYzOS9md0YvWUFSL2YzOS9BR0FGZjM5L2YzOEJmMkFHZjM5L2YzOS9BR0FGZjM5L2YzOEFZQVovZjM5L2YzOEJmMkFBQUdBSGYzOS9mMzkvZndGL1lBaC9mMzkvZjM5L2Z3Ri9ZQUovZkFGL1lBQUJmMkFIZjM5L2YzOS9md0JnQVg4QmZtQU1mMzkvZjM5L2YzOS9mMzkvQVg5Z0FYOEJmV0FJZjM5L2YzOS9mMzhBWUFKL2Z3RjlZQXQvZjM5L2YzOS9mMzkvZndGL1lBbC9mMzkvZjM5L2YzOEJmMkFDZkh3QmZHQUJmUUJnQVg4QmZHQUNmMzBBWUFOL2ZuOEFZQXAvZjM5L2YzOS9mMzkvQVg5Z0EzOThmQUYvWUFOL2ZYMEFZQUovZmdGL1lBbC9mMzkvZjM5L2YzOEFZQU4vZkh3QVlBTi9mMzhCZldBQmZRRjlZQWgvZjM5L2YzeC9md0YvWUFwL2YzOS9mMzkvZkg5L0FYOWdDbjkvZjM5L2YzOS9mMzhBWUFSL2YzOTlBR0FCZkFGL1lBWi9mMzkvZkg4QmYyQUNmMzBCZjJBQmZBRjhZQkIvZjM5L2YzOS9mMzkvZjM5L2YzOS9BWDlnQTM5L2ZRQmdBbjkvQVh4Z0EzOS9mUUYvWUFKL2ZBQmdCWDk5ZlgxOUFHQU5mMzkvZjM5L2YzOS9mMzkvZndGL1lBVi9mMzk4ZndGL1lBTjlmWDBBWUFSL2YzOS9BWDFnQW45K0FHQURmMzE5QVg5Z0JYOStmbjUrQUdBRmYzOS9mWDhBWUF0L2YzOS9mMzkvZjM5L2Z3QmdCbjkvZlg5L2Z3QmdESDkvZjM5L2YzOS9mMzkvZndCZ0FYNEJmMkFGZjN4OGZId0JmMkFEZjM1L0FYNWdFbjkvZjM5L2YzOS9mMzkvZjM5L2YzOS9md0YvWUFoL2YzOS9mMzk4ZndGL1lBVi9mMzkvZlFCZ0EzOS9md0Y4WUFaL2YzOS9mMzBBWUFWL2YzOTlmUUJnQW4xL0FYOWdEbjkvZjM5L2YzOS9mMzkvZjM5L0FYOWdCSDk4Zkg4QmYyQVBmMzkvZjN4L2YzOS9mMzkvZkg5L0FYOWdCSDkvZkh3QmYyQURmSHgvQVg5Z0JYOS9mMzkrQVg5Z0JuOS9mMzk5ZndGL1lBTi9mSDhBWUFWL2YzMTlmUUJnQTM5L2ZnQmdBbjE5QVgxZ0JIOStmbjhBWUFGK0FHQUhmMzE5ZlgxOWZRQmdCWDk4Zkh4OEFHQUVmMzE5ZlFCZ0EzOThmd0YvWUFkL2ZIeDhmSHg4QVg5Z0JYOS9mMzk4QVg5Z0IzOS9mMzE5Zlg4QVlBcC9mSHgvZjM5L2YzOS9BWDlnQkg5L2YzOEJmbUFQZjM5L2YzOS9mMzkvZjM5L2YzOS9BR0FFZjMxL2Z3QmdCMzk4Zkh4OGZIOEJmMkFGZjM5K2YzOEFZQUovZndGK1lBUi9mMzEvQUdBRWYzOTlmUUJnQm45L2YzMTlmUUJnQkg5L2ZYMEJmMkFEZjM5OEFHQURmMzkrQVg5Z0JYOS9mMzEvQVg5Z0IzOS9mMzEvZjM4QVlBVi9mMzkvZndGOFlBWi9mMzkvZjN3QmYyQUNmbjhBWUFOL2ZYOEFZQUFCZm1BSGYzeDhmSHg4ZkFCZ0FYd0JmV0FDZkg4QmZHQUVmMzE5ZlFGOVlBSitmd0YvWUFOOGZIOEJmR0FSZjM5L2YzOS9mMzkvZjM5L2YzOS9mMzhCZjJBRWYzOTlmd0YvWUFOL2YzOEJmbUFFZjM5L2ZBQmdCSDkvZjN3QmYyQUdmM3gvZjM5L0FYOWdCMzkvZjM5L2ZuNEJmMkFHZjM5L2YzNStBWDlnQkg5L2ZuOEFZQU4vZjN3QmYyQUdmMzkvZjMxL0FHQUpmMzkvZjM5OWYzOS9BWDlnQkg5L2YzMEJmMkFIZjM5L2YzOTlmd0YvWUJCL2YzOS9mMzkvZjM5L2YzOS9mMzkvQUdBSWYzOS9mMzEvZjM4QVlBUi9mMzkvQVh4Z0NIOS9mMzkvZlg5L0FYOWdCMzkvZjM5L2YzMEFZQVovZjMxOWZYMEFZQVYvZjMxL2Z3QmdCMzkvZjM5OWZYOEFZQVovZlg5L2YzOEJmV0FJZjM5OWZYMTlmWDBCZjJBRmYzOTlmWDBCZldBRmYzOS9mSHdCZjJBRmYzOTlmWDhBWUFWL2YzOS9md0Y5WUFWL2YzOStmZ0JnRFg5L2YzOS9mMzkvZjM5L2YzOEFZQVYvZjM5L2Z3RitZQU4vZlg4QmYyQUZmMzk5ZjM4QmYyQUtmMzk5ZjM5L2YzOS9md0JnQlg5L2YzMTlBWDlnQ245L2ZYMTlmWDEvZjM4QVlBbC9mMzE5ZlgxL2YzOEFZQVovZjM5L2ZYMEFZQVIvZjN4L0FYOWdCbjkvZjM5L2ZRRjlZQWQvZjM5L2ZuOS9BWDlnQm45L2YzOS9mZ0YvWUFSL2ZuOS9BWDlnQUFGOFlBTi9mbjhCZjJBRGYzNStBR0FCZlFGL1lBUi9mSHg4QUdBQ2Yzd0JmR0FGZjMxOWYzOEFZQVIrZm41K0FYOWdGWDkvZjM5L2YzOS9mMzkvZjM5L2YzOS9mMzkvZndGL1lBVi9mWDkvZndCZ0NIOS9mMzUvZjM5L0FHQUpmMzkvZlgxOWYzOS9BR0FDZkg4QmZXQUZmMzk5Zlg4QmYyQUVmSHg4ZkFGOFlCUi9mMzkvZjM5L2YzOS9mMzkvZjM5L2YzOS9md0YvWUFkL2ZIeDhmSHgvQUdBSGYzOS9mMzkvZlFGL1lBaC9mMzk5ZlgxOWZ3QmdCWDkvZjM1L0FHQUVmMzkvZmdGK1lBVi9mM3g4ZndGL1lBZC9mMzkvZkg5L0FYOWdCMzk5ZlgxOWZYMEJmMkFJZjM5L2ZYMTlmMzhBWUFKK2ZnRjhZQUo4ZndGL1lBdDhmSHg4Zkh4L2YzOS9md0JnQm45OGZIeDhmQUJnQ0g5L2YzNThmSDkvQVg5Z0JYOS9mSHg4QVg5Z0IzOS9mSHgvZjM4QmYyQUdmMzE5Zlg5L0FYMWdCbjkvZjM5L2ZRRi9ZQVI4ZjM5L0FHQUZmMzkvZjMwQmZXQUdmMzUvZjM5L0FHQURmbjkvQVg5Z0FuNStBWDFnQTM1K2ZnRi9ZQVIvZm41K0FHQUVmMzEvZndGL1lBWi9mMzk5Zlg4QVlBSjhmd0JnQ0g5L2YzOTlmMzkvQVg5Z0IzOS9mMzk5ZjM4QmYyQUZmWDkvZjM4QmZXQUpmMzEvZjM5L2YzOS9BR0FKZjMxOWZYMTlmMzkvQUdBSWYzMTlmWDEvZjM4QVlBUi9mWDEvQUFLTUI0UUJBV0VCWVFBUUFXRUJZZ0FCQVdFQll3QUtBV0VCWkFBR0FXRUJaUUFEQVdFQlpnQUZBV0VCWndBSEFXRUJhQUFBQVdFQmFRQUpBV0VCYWdBRUFXRUJhd0FBQVdFQmJBQUZBV0VCYlFBQ0FXRUJiZ0FCQVdFQmJ3QUlBV0VCY0FBQ0FXRUJjUUFDQVdFQmNnQUNBV0VCY3dBa0FXRUJkQUFSQVdFQmRRQUxBV0VCZGdBTUFXRUJkd0FXQVdFQmVBQXZBV0VCZVFCakFXRUJlZ0IvQVdFQlFRQU5BV0VCUWdBVkFXRUJRd0NBQVFGaEFVUUFSQUZoQVVVQUlRRmhBVVlBWkFGaEFVY0FOd0ZoQVVnQUZRRmhBVWtBQlFGaEFVb0FBQUZoQVVzQVpRRmhBVXdBT0FGaEFVMEFEZ0ZoQVU0QVJRRmhBVThBTUFGaEFWQUFnUUVCWVFGUkFHWUJZUUZTQUFvQllRRlRBQ2dCWVFGVUFHY0JZUUZWQUNJQllRRldBSUlCQVdFQlZ3QW9BV0VCV0FCR0FXRUJXUUFZQVdFQldnQXhBV0VCWHdCb0FXRUJKQUE4QVdFQ1lXRUFhUUZoQW1KaEFCNEJZUUpqWVFBcEFXRUNaR0VBUFFGaEFtVmhBR29CWVFKbVlRQ0RBUUZoQW1kaEFJUUJBV0VDYUdFQWhRRUJZUUpwWVFBVEFXRUNhbUVBaGdFQllRSnJZUUNIQVFGaEFteGhBSWdCQVdFQ2JXRUFpUUVCWVFKdVlRQ0tBUUZoQW05aEFFOEJZUUp3WVFDTEFRRmhBbkZoQUl3QkFXRUNjbUVBYXdGaEFuTmhBQVVCWVFKMFlRQlFBV0VDZFdFQUF3RmhBblpoQUFJQllRSjNZUUNOQVFGaEFuaGhBRkVCWVFKNVlRQ09BUUZoQW5waEFJOEJBV0VDUVdFQWtBRUJZUUpDWVFDUkFRRmhBa05oQUF3QllRSkVZUUNTQVFGaEFrVmhBQVVCWVFKR1lRQ1RBUUZoQWtkaEFHd0JZUUpJWVFBREFXRUNTV0VBQ1FGaEFrcGhBSlFCQVdFQ1MyRUFCQUZoQWt4aEFKVUJBV0VDVFdFQUJnRmhBazVoQUFZQllRSlBZUUFHQVdFQ1VHRUFsZ0VCWVFKUllRQ1hBUUZoQWxKaEFKZ0JBV0VDVTJFQW1RRUJZUUpVWVFDYUFRRmhBbFZoQUpzQkFXRUNWbUVBbkFFQllRSlhZUUJIQVdFQ1dHRUFuUUVCWVFKWllRQ2VBUUZoQWxwaEFGSUJZUUpmWVFBQUFXRUNKR0VBQkFGaEFtRmlBQWNCWVFKaVlnQUVBV0VDWTJJQUFBRmhBbVJpQUFjQllRSmxZZ0FTQVdFQ1ptSUFiUUZoQW1kaUFCQUJZUUpvWWdBTUFXRUNhV0lBQWdGaEFtcGlBSjhCQVdFQ2EySUFvQUVCWVFKc1lnQnVBV0VDYldJQWJnRmhBbTVpQUJJQllRSnZZZ0FIQVdFQ2NHSUFvUUVCWVFKeFlnQUJBV0VDY21JQUFRRmhBbk5pQUFZQllRSjBZZ0FCQVdFQ2RXSUFBd0ZoQW5aaUFLSUJBV0VDZDJJQW93RUJZUUo0WWdBTUE5UlpvVmtBQkFJUUJBSUFBd01DQUFJQ0JBRUJBZ1VFQUFFQUJBQUJCQUFIQWdVUUF3RUNBUXdFQXdjRkFBRUNBUUVGQVFJREVBVUJBZ3dBQ0FNQUNnRUFEQVFEQlF0VEJBRURBUU1FQUFNRUFBUUFCQUVqQ3dNRkFBUUJBQU1BQUFFQkJBUUNCUUFCQkFNQkJBTURBZ2NZQXdFQ0JBRUJBd1FEQlFRQ0ZnUUZCQUFBQVFFREpBQUJBZ01DQkFBQkJBRUdKUVFGQWdRQ0JRRUFCQVFEQWdNRUFnQWxOQUlDQVFFREJRTUNCQUlCQWdVQUFRRUlBZ0lCSUFFRENENENBZ0FGQVFVQ0F3UUFCQVFHT1FNQUFRZ0NBZ1FXQWdNakFRUUNBZ0VGQkFFQkFRQWdDQWNCQUFBQ09nRUJBd0lDQkFBQ0FnQUVBZ0VFQUFNQ0FBQUVBQUlEQVVnRkdRRURBZ0FFQWdFSEFRTUhBUUVBQkNvRkF3S2tBUVJUQWdZQ0FnWUdBQUVBQXdJQ0F3TUNGZ0VBQkFBR0JBSUZBUU1GQUFVRUJBTUJBUVFDQWdBRUZnUUJCQUlBQUFJSUFnRUJBZ0FCQWdJREF3UUlDQU1EQUFRQkJ3NElBZ0k1QndJakJnTUFBZ1FBQVNXbEFRQUNCZ0VDQWdVV0J3SUFBUVVMQWdJRUJRQVpCQmdDQkJnQUF3SUVBd0FEQkFBREFBRUNBam9GQXdBQkFBQUVBUVFFQkFJQ0JBY0JBUUFGQVNNQkVBUUFCd2NjVkFvQ0F3RUFBZ0VCYnd3Q0RGVUJCQUFCQVFJR0FRSUZBUVVSVmlCV0FBQUFBQzB0QUFRQUFRUUJBd0FGQVFBQ0NnWUNCQUFEQlFVRUJBSUZBUUFBQlFRQkFRQUJBQUFIQUFNQUFBa0FBQUZ3QVFvSE9nSUJBajhDQVFVQUJBY0RBZ0VFQVFBREFRRURBUVFCSXdJQ0FBQUdCQUVCQkFVWkJBQUJBd1lBQXdRRUFRRURBd0lGQVFnQUFBTUdBQXdBQUFBQkJ3WUJFQUVDQmdJQ0J3QUFCZ0VHQUFBQUFRQURBZ0lEQWdFQUJBWUNCQU1CQmdNQUNBQUhCQVFKQWdGeEF3TUFDZ0FGQWdBRUJBTUJBQW9BQmdBQ0VRWUVBQWNFQVFJQkFRTUNBZ0VDQXdJQUE2WUJCQUFBQWdRQ0l3RUZBZ0VBQUFJQ09BWnljZ3NEQndRTkJnb0lBUUVCQkFBQ0JBRURBZ0lBQkFNREFRUXlBQVVqQUFZQkJBVUVBd0JYQkFBQ0NRRUlBQUFDQVFjREFBSUlDREl3QVFNQURnQUdDdzRFQkFNQUJRSUNEd0lHQlFJREFRQUFCUVlNQWdFTkJRVUVBUUVHQUFFQkFBUWpCUUFtQ0JBQURRTUFBcWNCQlNNQ0F3VUZBUUFDQlNBQUFnSUVBQUlFQlFVT0RnUnpBZ0lEQlFVREJBQUlMZ1VFQUFFQkFnSUJCUVFCQkFBQ1dBRURBUUlJQUFJRkJRSUNGQUFBQUFFUUFRQUZCQU1SQkFFR0FnUURJd0FFQWdZR0FnRUJBUkFCQVFFQ1dRZ0FCUUlDQXlBQUJBSUZCQWdBQVFNRUFRTUNCQVFHQlFVRkFnRUNKUUFCQUFVRkN3Z0FBZ01MQVFNRUJBTUFCQVFDQUFBRUZRSUJBUUFCQXdRQUR3WUNCQU1LQUFBYkJ3TUdBZ0lDQmdNVUJCd0ZBZ1FGQkFFQUFnY0FBUVVBQXdJQkFRSURCQUFGSnc4T0FRRUpBUUVEQXdVRUNRWURBd0liQlFFRENBUURBUXdCRUFlb0FRRUZBZ0FDQkFBQUFBVXlCZ1VIQlFRQ1ZLa0JBZ01GVXdFRUFBRUFDd01BQmdvQnFnRTBEZ01BQmdFSkFBQUVBd0FBQkFRSEFBWUJCUUlCREFJQUNBSUVBUVVGQ2dBREFRY0dCUUFEQ2dBRUJBb09Cd0lFQUFVRkFRQUJCd0lBQkFJQXF3RUJDZ0FDZEFFQUFBQUNCQUFjRkFVQ0FRUUZGUVlDQXdRQkFRUUZyQUVJQXdFRUFnQUVVZ0VMQUFvTEF3TU5Fd1F5QWdZQkJRNEVBd1lCQVFRQkFBRUZBQUlCQXdFQkJ3QUZCQWtDQWdnQ0JBUUNCQUlBQXdRQUJBQUFDZ0VFclFFRkF3UUdCZ0VWQVFRSUFnVUNBZ1FDQmdOMXJnRUJBZ0laQWhJTUFBSUJCZ1FBQXdNSUFRSURCZzBPQ3dZRUFnWUdBd0lIQUFBcEN3SUFBUVFEQlFVREFnSUZBQWNFQWdRRUJBUUJBd2NKQVFNQ0FnSUVCUUlEQmdxdkFRTUtBUUlDQVFVQUJRQUVBZ0VBQkFJQkFnUUtBUVVDQWdJSkNRa0FDUWtKQkFJQkF3SUFGaVFFQXdVQ0FRQUFBQjBkQlFBQ0JnRUVCUUlCQmdnSUJRa0pBZzBIQVFZQUF3TUJBQUFFSTNFRkN3RUVCd2tBQ0FnRkNBVUlBd01BV3dFQ0FnSURLd1FOQkFNR0FRSUNBZ0VEQTdBQkRRRUNBUU1GQVFNQUJBUUhBUVFDQWdBRUFBY0NCUW9HQUM5UkFoRUZCd1lFQkFFSUFBUURBQU1FQ1FRTEhnSWVBZ0lDQWdNQ0FSQUNBbllaRUNVREFRSUxCZ0VGQXdRSUJRNEVDd29HQWdnSUFBT3hBUmdHRGdNR0N3RUFDd0VHQ2dvQkFRQUVBd0lDQXdBQ0FnSUVCQUFDQUFvS0JBUUNCQVFFQWdZRUJBSUJBUUlCQWhBQ0FBQUxDQVVIQkFZRkFBUUNDQUVCQndvS0NBSUVCd0FBQkFRQkJRZ0VCQUVMQkFNRkFBQUVCQVFFQkFJQ0JBUUVCUUFCQWdRRUJBUUVCQUlDQmdJQ0FnUUVCQVFCQlFOUkJ3SUNBZ1FFQUFjQkFBUUFBUUlFQkFJQkJ3QUJBQU1CQXdJV0JBWVVJQUFCQkFRQ0FRRW9PQUFGRUFJQUJBTURCZ0lEQXdzQUFRc0pDUUFDQmdZR0FRSUdBd1VFQkFZQ0JRZ0JCZ1FDQXdBRkFBSUNCZ1FBQVFJQ0JnQUNCUUVGQkFvQUNBSUdBQXNCQVFRS0FRTUlTUWdCQWdRREFRSUFCQVVIQVFVR0JnWUNBd2dPTmJJQkFRRUJBd2dBQkJrQ0FnUUNBUUFGQ1FJQkF3SUNBZ0FBQXh3SEFnUUJBUVFFQVFBQkFRUUFLUUlCQWdJQUFRRU1BQUVBQWdJQnN3RUJOd2wxQ2d3TURBQUxEQUFEQXdRR0JFZTBBVndDQUFrS0F3NEtBUU1LQ2dNREJBRUVBUUlLQXdBQkRBQUJBZ1FDQWdPMUFRb0RFd0lOQXhNQ0RRSXNBUVFCY0FVRkJRUUJBeVcyQVFJV0FRRUFCQkVFQWd3Q0EzTUFCd1lCQUFJQUJCd0FCZ2dRQndnRUFRUUdMZzBLQkFNR0JnTUZkd0VHQXdVRFFnMFlDd3NMQ0FzREF3TUdBQWdHQ3dZS0RRTkNFUUFHTWdNZUVRNEFCQUFBQkJVS0Nnb0FBUUFFQndjQUJ3Y0VBQVFDQWhFRUNBSUFBd0FDQWdRQ0FBQUJBQUlGQUFFQUF3Y0VBQUFGQUFNSEFBUUJCd1FCQmdnREFnSUFBUUVDQVFFREFnRVFCUWNGQVFBQUFnUUNBQU1FQUFJREFRRUJBUUVHQ1FFM0FRRUNBQUlFQUFBQkFBQUZFQUlFQUFBQkFRVUFBQWdEQXdZRUFRVUdCUUFFQVFZREFnRURCUVVBQXdBQkFnRUNCZ0lHQWdVRkFBUUVBQUFBQUFJSEF3UUNCUUlDQTBVQUF3SUZBUUFLQlFVQ0JBUUtCZ1VFQkFvRUFnUUNDQWtFQlFBQ0FBSUVGUWNFRlFJREF3SVJGUlVWRlFBRUFnTUVCQUFBQXdZQkFRSUpCQUFSQkJZV0F3TUNBUUFTQkFVREJBRUNDd0VEQWhBQkNRa0pDUWtKQ1FVQ0J3SUdBZ2NIQlFNSkFRQUZCQWdDQndFQkJnRUNCQUVCQlFnR0F3UURDQUFDQmdVREF3WUdBd1VHQ2hFQUFRQURCZ1lDQUFJQUFBc0ZBd2dJQ0FJREFBRUlBUVFGQXdFRkd3UXlWd1FBQUFZQkFnb0RBd3NEQkFNRkJBSUl0d0VDQkNNakJnTUJCQUJaQXdNSUF3WURBd0VDQkFoZEN3SURCZ29DQXdZREFRUUtBRW9FQnJnQkFnRUlCZ1FBQmdnQ0F3NERCZ2dEQlFJRkNDc0NBUUVBQWdJSWJTc0lBVEFDRVFrQ0F4Z0lDd3NJQmhBQ0lnSUNBUUVEQkFVRUFnWUJBZ2dDQVFJQkN4QUJBQVlFQWdVS0JRSUNBUVFHQWdBREF3Y0ZCSGdnVmlBREFnY0FBZ01BQUFBQUFBQUFBUU1CQkFBRU9UbTVBUUFFQWdJSUFRVUVBZ1FGQ2k4QkJRVUFDd3NLQndRRUNnTUxBd1FFVHdNQ1pyb0JYRndGQkFjRUJCd0FGUVFVQlFkZUVRWUJQRHc4UEJOZkJBc0xCVVV3QndRRUNnME5BUVVCQ0FBQ0NRY0ZGZ1VFQVFFQkJ3SUdCQW9LQlFFQ0NnVUNlUVlBQVFJRUJBTUFCQUFDQUF3Q0FnQUFBZ0lBdXdFNkF3Z0hBUWdDQVFFdExRb2xHd01DQkFFQ0JRSkl2QUVsTFMwRUN3RUNBUUVBQUFVR0FnNEFBd01CQVFGQ0tBQUxDd0lHQ3o4SUFRUURBd1FEQlFJQkdBQURDQUlDQVFFREJnSVlBUVlCQmdzR0FoRUNDQVlJQUFRTFFrSU9EUXNIQ0FFT05Bc0REZzRCRlRRT0JRWUdHQmNGREJjREJnME5TUUFIRVFBQUFRTUNBUVFCQUFFS0NnQUFCd2NBQXdVSEJ3Z0RBQUFBQ2dNQUVRUUFDZ2dCQndjQ0FBTUFBd0VBQUFFRkFBUUFBZ0VDQVFJRUFnQUFDZ1lHQmdZR0J3QUVCQUlDQUJRSEJBUURBd1VEQkFBQkFRTUJCQU1EQ1FvQkF3a0RDZ0FLQ2dvQUJ3QUFBQUFCQVFFS0FRQUJDZ0VEQXdNQ0JRTUNBUUVDQkFNQkF3RUNBZ0VCQUFvTURDRUJCQUlCQkFBQUlRQUZBUUFBQUFFQUFBQURCQUFBQkFJQ0FBQURBUU1DQVFRSEJBRUhBUUVCQndjV0FnVUZCd2NDQWdZREFRMEFBQU1CQWdFQUFBSUNBZ0lDQWdNREJnQUFCQVVFQUFJQUJ3VUZCQVFFQXdJRUJBVUVBUUVDQkFVSEJ3Y0hDQ3dHQUFNSEFBVUZBZ1VCQ2dNSEFnSUNCQWNLQndjVkFBQUtCQU1LQVFRQ0FRUUVBUUFHQndVRUJBY0ZBUVVDQVFVRUF3TUNBd1FGQVFrRUF3RUJBd2NCQmdVRkFRVUFBQU1FQkFNQUNnSUNCQUFIREFRRUFRUUFBQW9KQWdJSEJnSUNDZ1FDQlFVRkF3VUJBd0FCQWdFRUFnUUZCZ1FGQUFJQUFnTUFDQWNHQmdBQkFRRUdBZ1lIQndRRUJnSUNCQUVBQWdJQUFBTUVCd1VCQWdBQ0FRVUVBUUI2QVFJRkJRVUZCUUVCQVFFQkFBY0VBV0E5QlFFQkFBVUFCQVVLQUFFQ0FBY0JBZ0lDQWdVRkFnQUNCUUlIQ1FjSEF3RUFBQUFDQWdJQ0FnQXBBUW9BQUJZQUFBd0FaQWNLQUFRQUFnQUZBUUlIQndBS0Nnb0tBUUFBQkFVQUFnVUVBd1FDQkFFQ0JBQUFBQ2tBQndVQUFBQUFBZ1FFQWdJQ0FRRUZBQVFCQUFBQkFnY0JCQWNGQXdVRkF3SUJDaWtFQUFJRkFnY0NBZ0lDQmdJRkFnQU1BUU1EQlFjQkVRUURCUU1LdlFFR0FRRUNLQWtKQ1FRQkF3TUREUU1KQXdrQkF3a0RDUU1EQ1FNSkNnY0pCQWtGQlFVREJBUUVCd1FFQkFRRUJRQUFJZ1VMQmdNRkFRUUZBQVVBQXdBVkJnTU1Bd01EQVFFR0FnWURDUUVHQVFFR0NBRUhBQW9FQVFBQUFBRUJCZ0VDQ3dNQUFBTUJBQU1HQWdZTkRRTURBZ01SQkFRRUJBa0ZCd1lFQXdFREF3RVJBQUVJQmdFQkJnZ0dBd01EQ0FJQ0FRNEdBd1lKQVFZQUJBUUVBUUFBQWdFQUFRSUdDQXNFQmdVRUJRRUdBUVVGQkFRRUJnUUVBUUlPQmdFQkF3QUJCZzBCQUFFQkJnWUVBd0MrQVFWNkJRWUlCQU1DQlFZSUFnZ0xBZ0lBQ0FFREN3RURBUWNEQWdJREFBQURCZ3NJRFFZQ1N3UUVEQVlCQndnQkFRUUVCUVFDQVFNQURRZ0NBZ0VFQlFJQ0FBQUVDZ1VDQXdZRkFBVURBd01JQmlJSUJnWU5CUVFEQVFFQUdBSUNBZ1lDQWdJREFnTUFBd0VDQlFZQ0F3SUJCQUFCQUFFQ0FnTU5DQVFIRUZBQkFnTlFWd0lFQVFNTnZ3RUhBQVFCd0FFQkJnTUVFQUlCQ2dFREFzRUJNZ01DQWdBQkFnVUFBd0lEQVFFQ0FBSUNBZ0VFQVFFSkFRRUJCUUlBQkFJQ0FRSUFBZ0VCQWdJREFRSUVCUUlDSGdZQ0J3Y0NBZ0lGQWdNREVBSUNDQUlDQWdRQUJBSUNCZ0lFQkFjQ0JRUUdBUVlOQkFFQkJnNEJCQU1IQkFJSUFRUURNd0FnQWdnQkFnSXpBUndnSUFBQ3dnRURBUWN6QUFBRkhCd0VCQnd2TXdjRkFBVURCQW9CQkFRQUFRRUtMd01EQkFSSEJBRUVCUUVCQUNrSEJETVdBZ0VFTXlBZ1dBRUNBZ0FBQUFJQ0FnSUFBQ1FDQWhZSUFnUUVBQUFVQkFBQ0J3SUNBc01CQlFJRUFBQUhBUWNEQmd3Q0JzUUJCZ0FNREFrQ0J3TURCQXdMQXdNREF3VUFBZ2NBeFFFREJBQUFPMlVFQkFVRUx3UUZCQVFFQlFBQUJBUUVBQUFBQXdBQUFBQUFBQUVBQlFRQkF3NUpBd01EQkFRRUNBZ0d4Z0VLQ2dZRkNBTURCZ1lSQndvRUFRUURDZ29pQ0JVaUNCVWlDQlUrUGdraUNCVWlDQlVpQ0JVK1BnMG9DUW9GQ2pnRkF3TnBDd29lQmdFRkJBZ0dCQkVKQlFZREF3b0REUTBZQndVQkJ3RUxCY2NCQXdVRkF3TUpDUVFLQmdZSENBRURBUUFCQVFjQURBUURCQUFBQUFVRkJSVUZCUWdHQXdBRUJBVUJBQUlDQ0FnT0RnNE9DQTRPQ0E0Q0FRSUFBQUFBQWdNQ0FnTUVBZ0lEQlFRRUNRb0pDUW9KQ1FJR0JnWUNCWGtERUFnSUFnRUFBZ1FCQUFFRUFnSUFBZ1FCQWdJQkR3QUNBZ0VCQUFJQ0IySURBZ01EQUFVRkJ3VUhCUWNCQ2djSEFRb0hCd0VLQndmSUFRUTZ5UUVCQTFJSEFnMHRkZ05qQnpwVXlnRUNBUUlGQWlVbEpRRUJBZ0pvQXdRREFnSUlBQUV0TFFVRkFBSUJBUUlMQWdVR0F3UUJBZ1FCQkFRRUJnRUZEUUlCQ2dVQkRnRUdBUVlGQndVSENRMGlCd3NBQWdnQ0FBQUFIZzRGTkM0QkFnSU9GeEVDRFhjR0RBc0NEV3dUREFZTkVBTUFCQWNCRnhjWERRMElMZzREQXc0RUFBWUdIZ1VDQVFFREJBMElCZ3NMQ0FzdUFnVUtDZ2dCQVFFQlNRVU5Bd0FBQUFBQkFnUUVCQVFGQVFBRUFRSUJBQUFBQmdRRUFnUUVBQUFBQndVQUFBQUFBQUFBQUFVQkF3QUFBQUlFQkFBQUFBUUVBUU1BQUFBSEJRUURCd0VHQndjRUJBUUVBZ1FIQndvRkF3WUFBQUlDQWdNREFBQUVBQU5JQkVnS0J3b0FBQWNLQkFFQkJBb0JBQUFCQ0FRTkFBRUJBUUFBQXdBQUFBUUJBd0FBQUFBRUF3TUFBQUFBQVFBQUFBUUJBd0FBQUFBRUFRTUFBQUFCQUFVUkJBb0ZDUW9FQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNQUF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFJQUFRUUVBZ0lCQkFRQ0FnQUJCQVFDQWdFRUJBSUFCQVFEQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBREFBTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUdBQU1CQkFVREFBWUlBUUFEQmdRSUJBY0xDQUFNQVFzRkJBQUFBQUFGQUFVR0JBRURBQUFBREFnTEFBQUFBQUFBQlFBQ0FRTURBUVVBQXdBRkJ3UUFBZ0FBQUFBQUFBQURBQVVBQndFQUFnUUNBQUFGQkFBREVCQVFBd1FDQlFBRUFRRURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBd0FBQXdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlCQVFBQUFnQUNBQUFBQVFJS0FRRUJBQWNBQUFJQUFBQUVBQUVBQUFBSEJBTUFBQU1DQVFFQkFRQUFCUUVDQUFBQUFRQUJBZ0lCQVFBQUFnUUFBZ0FBQUFBQ0JBTUFBQUFFQUFBQUFBUUNBUUFBQUFBQkFnSUNBUUlCQWdBQkFnSUNDZ0FEQUFJQUF3TUFBd0FEQXdBQUFBQUFBd1BMQVFBREFBY0VCd1FDQVFNRUFnSUFBUU1FQWdJQkF3UUNBZ0FCQXdRQ0FnRURCQUlDQUFFREJBSUNBUU1FQWdJQkF3UUNBZ0VEQkFJSEFnb0hCd2tCQndZQkNRY0NCQUFFREFVQ0J3a0FCd2NDQndjSEJ3Y0hCd2NIQndJQ0J3Y0hCd2NIQnd3QUFnQUFCQUlDQlFJQUFBQUFBQUFDQUFvREJBQUNBd0FBQUFBQUFBUUVBd01CQlFFRUJnVVJCUUlCQndNQUFBQURCQVFFQVFNQUFBQUNBZ2NEQlFjRkJBUUtCQWNDQ2dRRkJRQUNCd0FCQ1FRSEJ3SUZCd1VBQUFBREF3QUNBQUFBQUF3QUFBQUFBQU1BQUFBQUFBQUZCUUFLQlFrRkJBUUhBZ0FBQXdRR0VRY0FBQU1EQlFZS0FBQUFBQUlGQUF3QUFBQUFBQUFBQUFJQUFBQUlDZ2NDQndVQkJ3UUdBd0FEQndRTUFnUUJBZ2dGQndNRkFRRUpBZ1VMQXdjQkJBUUdDZ0FBQUFBQUFBd0FBQVFBQUFBQUFBQUFBQUFGQWdVSkJnWUNBd01BQUFBQUFBd0FBQUlIQUFBQUFBQUFBQUFBQWdJQUFRTUFBZ0VEQWdNQ0JBRUdCZ0VBQUFBQUFnRUJBZ0FCQmdJQ0FnZ0RCZ01BQ0FJREJnTUVCUWtDQkFrQkJ3QUdBd0VDQUFRRkF3TUdBd0lEQWdBQUFBQUFCUU1HQVFrQ0JRQUVBQUlGQlFFQkFnRUJBUUVCQVFFQ0FRTUZCUWNFQlFNREF3WUdBd1lCQVFFQkFRVUJBUUVBQVFFQUFnSUFBQUFFQmdRQ0FnUUNBUUFJQUFRQ0FBSUFDZ0FGQndVS0NnVUlCZ0VEQXdBQkFRTUlBd01GQVFJQkFRVURBUU1EQmdNQUFnQUFBQUFBQUF3QUFBQUFBQUFBQUFBQUFBY0JBUW9LQ2dBQUJ3QURBd2NBQVFBREF3Y0FBUUlBQUFBQUFBQUFEQUFBR2dBQUFBQUFBQUFBQUFzQUJBUUhBQUVDQndBQkFnQUhCQVFFQVFJRkFBQUFCUUFBQVFJQUFBQWFBQUFBQWdVRUFBQUFBQUFBREFBQUFBQUFBQUFBQUFFQUFBQUVCQWNBQndjREFRRUFCd1FFQlFVSEJ3UUFCQVFFQXdBQUFBQWFBQXdBQUFBQUFBQUFBQUFBQUFBRUFRUUJCd0FLQUFBQUFBQU1BQUFBQUFBQUFBQUFBQUFBR2dVRkFBUUFBQVFFQUFBQUFBQUFEQUFBQUFBQUFBQUFBQUFBQUFNQ0FBSUFBQUFBQUFBTUFBQUFBQUFBQUFBQUFBQUFBQW9CQmdjQUFBQUFBQUFNQUFBQUFBQUFBQUFBQUFBQUFRRUVCQVFFQUFRRUF3QUFBQUFBQUF3QUFBQUFBQUFBQUFBQUFBQUFBUVFBQWdJQ0FBQUFBQUFDQkFJWUFRQUNBZ1VBQ0FzSUJRb0hCQUFEQXdBQUFEa0FCZ01DQWdNQUFBWURBQUFBQkFVQUJBQUVBZ0lGQVFNQUFBQUFBQUFFQUFBQUFRTUFBQUFNQUFZREJRUUFBQU1BQWdRQUF3QUNBQUFDQUFJQUFnQUZBQUVEQVFBREFBQUFBQUFBQlFBS0F3QURCUUFFQlFNQUJBNENBd0FBQUFBR0FBQUFBQUlBQUFVSEFnUURBQUVFQUFJREFBSUNBZ0FBQWdVQUFnSUFBQUFBQUFRQUJBRUFBQUFBQUFVREJBUUFBQUFFQUFRQUFnQUFBQVFGQkFFQkFBRUFBZ0FBQWdJQUFRRUVBd0VBQUFZRkFBQUZBQUlBQXdNREF3QUFBQWNGQUFNd0F6QXdBZ01BQUFBQUJRTURCUUVLQUFBRUJRQUtCUVVGRVFjQUJ3VUZCUVVEQndBRkF3RURBQUFBQUFBQURBQUFBQUFBQUFBQUFBQUFBQUlCQ0FRQ0FnRUFCUVFDQWdFTEJBSUVBQUFGQlFVQkF3UUVCQVVBQlFjSEJRVVVCdzBDQVFBQkFRUURBQUFBQUFBQURBQUFBQUFBQUFBQUFBQUFBQUVFQXd3QUF3QUFBQUFBQUFBQ0FBQUNBQUFDQXdRR0JBQURCQUFEQkFBRUF3QUVBQUlBQXdBQUFBTUdCZ1FBQUFBQUFBQUNBd0FFQVFBQUFBSUFBUU1EQUFBQUFBQUFBQUlDQ0FzSUF3TUFBQUFBQXdVRkFBRUJBd2dEQWdNQkFBRUhCUVFBQUFBQkF3WURBUUFBQUFBQ0FBTUFCUVVBQlFRQUFBSUFCQUVGQUFBREFBWUdBd0FIQUFNQUFBQUVCeEVFQkFBRUNBWUtJZ0VBQUFBQUJBQUJCUVFBT3dVRkFBTUZCUVFKQ2dBRWF5a0tDUWtGQkFBQ0NBQUhCd0FFQkFRVUJBTUFCQWtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEQUFBREFBQUFBQUFBQUFBQUFjQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFNSEJBUUFCQUlDQkFJQ0FRSUNBQUFDQUFJRUJBSUNCQUFFQWdJQ0FnUUVBZ1FFQUFRQ0FnRUNBZ0lDQVFBRUJBSUNBUUFFQkFJQ0FBRUVCQUlDQVFRRUFnSUFBUVFFQWdJQkJBUUNBZ0FGQVFRRUFnSUJCQVFDQWdBQkJBUUNBZ0VFQkFJQ0FBRUVCQUlDQVFRRUFnSUFBUVFDQWdFRUJBSUNBUUFFQkFJQ0FRUUVBZ0lCQUFRQ0FnRUVCQUlDQVFRQUJBSUNBUVFFQWdJQkFBUUVBZ0lCQkFRQ0FnQUJCQVFDQWdFRUJBSUFBZ0VFQkFJQ0FRUUVBZ0FGQndJQkFBUUVBZ0lCQkFBRUFnSUJCQVFDQWdFRUFBUUNBZ0VIQkFRQ0FnRUFCQVFDQWdFRUJBSUNBUUFFQkFJQ0FRUUVBZ0lCQUFRRUFnSUJCQVFDQWdFQUJBSUhBUUlCQkFRQ0FnQUJCQVFDQWdFRUJBSUNBQUVFQkFJQ0FRUUVBZ0lBQVFRRUFnSUJCQVFDQWdBRkFRUUVBZ0lCQXdRRUFnQUNBUVFDQWdFRUJBSUNBQUVFQWdJQkJBUUNCQm9FQWdBQ0FnUUVBZ0lDQndjQkNnVUpCUUVBQkFVQkNBVUVBUWNGQUFjQkJRRUZCUWNCQndBQUJRUUhCUVFBQkFRSEJRUUVCUUFHQVFVRkJRTUFCUU1EQXdNREFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3QUFBd0FBQUFBQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJCQVVEQkFFQUFRRUVCQXNIQmdBREF3WUVBd01BQUFBQUJRRUJCUUVCQUFBSkF3UUFBQUFBQUF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3QURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVnSWRBaElBQkFRRkFBRURBQUFBQXdNRkF3QVJBUVVEQXdFQkFBWURBZ01BQUFBQUFBVVJBQUFJQWdNQUFBQUFBQVVCQWdVRkFRRUFBUUVCQWdFQkFRRUFCZ1lEQVFNRkJRTURCZ0FHQXdZQkFRRUJBUUVCQUFFRUFRRUJBd0FGQVFFQkJRQVJCUVVCQVFBQ0NRY0FBQUFBQUFBTUFBQUFBQUFBQUFBQUFBQUFDUWtBQUFvSkNnUU