UNPKG

ketcher-standalone

Version:
583 lines (513 loc) 21.2 MB
/**************************************************************************** * 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