From 5d78f96b3d746f06d77ec46cc11aa9896d0257fa Mon Sep 17 00:00:00 2001 From: denim2x Date: Fri, 31 May 2019 09:34:20 +0300 Subject: [PATCH] Initialize repository Signed-off-by: denim2x --- .cfignore | 10 ++ .gitignore | 71 ++++++++++++ LICENSE | 7 ++ Procfile | 1 + README.md | 25 ++++ _bareasgi.py | 10 ++ app.js | 136 ++++++++++++++++++++++ config.py | 227 +++++++++++++++++++++++++++++++++++++ engine.py | 109 ++++++++++++++++++ main.py | 20 ++++ manifest.yml | 7 ++ package.json | 27 +++++ requirements.txt | 7 ++ runtime.txt | 1 + static/app.js | 65 +++++++++++ static/favicon.png | Bin 0 -> 615 bytes static/icon-512.png | Bin 0 -> 2920 bytes static/index.html | 41 +++++++ static/master.css | 216 +++++++++++++++++++++++++++++++++++ util/__init__.py | 251 +++++++++++++++++++++++++++++++++++++++++ util/list.py | 78 +++++++++++++ util/priority_queue.py | 204 +++++++++++++++++++++++++++++++++ util/pyquery.py | 94 +++++++++++++++ util/request.py | 23 ++++ util/set.py | 107 ++++++++++++++++++ util/url.py | 84 ++++++++++++++ watson/__init__.py | 8 ++ watson/assistant.py | 164 +++++++++++++++++++++++++++ 28 files changed, 1993 insertions(+) create mode 100644 .cfignore create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 Procfile create mode 100644 README.md create mode 100644 _bareasgi.py create mode 100644 app.js create mode 100644 config.py create mode 100644 engine.py create mode 100644 main.py create mode 100644 manifest.yml create mode 100644 package.json create mode 100644 requirements.txt create mode 100644 runtime.txt create mode 100644 static/app.js create mode 100644 static/favicon.png create mode 100644 static/icon-512.png create mode 100644 static/index.html create mode 100644 static/master.css create mode 100644 util/__init__.py create mode 100644 util/list.py create mode 100644 util/priority_queue.py create mode 100644 util/pyquery.py create mode 100644 util/request.py create mode 100644 util/set.py create mode 100644 util/url.py create mode 100644 watson/__init__.py create mode 100644 watson/assistant.py diff --git a/.cfignore b/.cfignore new file mode 100644 index 0000000..882ee29 --- /dev/null +++ b/.cfignore @@ -0,0 +1,10 @@ +.gitignore +LICENSE +README.md +vcap-local.json +node_modules +.settings +.git +.project +.pydevproject +*tmp-browserify* \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..04270dd --- /dev/null +++ b/.gitignore @@ -0,0 +1,71 @@ +# Logs +logs +*.log + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# C extensions +*.so + +# Distribution / packaging +bin/ +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +/lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# python virtual environment/compiled files +venv/ +*.pyc + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Intellij/PyCharm config +.idea/ + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml + +# Translations +*.mo +*.pot + +# PyBuilder +target/ + +# Mac files +*.DS_Store + +vcap-local.json +node_modules +.settings +.project +.pydevproject +config.yaml +*tmp-browserify* diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8471e1c --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +Copyright 2019 denim2x (denim2x.ml) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..469ae06 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: python3 main.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..0088c60 --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# Whizbot +Engage into interesting conversations with this multi-purpose chatbot + +## Description +This project aims to develop an interesting conversational agent with the following capabilities: + - describes itself, its abilities and others; + - answers open-ended questions with information from Wikipedia; + - displays Weather data; + - shows Chuck Norris jokes. + +## Architecture +### Frontend +- HTML5 +- JavaScript (ES6) +- CSS3 +- Rivets.js +- Domtastic + +### Backend +- Web server developed in Python3 with BareASGI, hosted on CloudFoundry service; +- Watson Assistant, for classifying intents and modeling appropriate responses; +- Weather Company Data for IBM Bluemix - for retrieving weather information; +- Wikipedia Search API - for retrieving answers to open-ended questions; +- Chuck Norris jokes API. + diff --git a/_bareasgi.py b/_bareasgi.py new file mode 100644 index 0000000..4c3ffaf --- /dev/null +++ b/_bareasgi.py @@ -0,0 +1,10 @@ +import bareasgi as _bareasgi +from bareasgi import * + +def json_response(data, status=200, headers={}): + headers = [] # FIXME + return _bareasgi.json_response(status, headers, data) + +def text_response(text, status=200, headers={}): + headers = [] + return _bareasgi.text_response(status, headers, text) diff --git a/app.js b/app.js new file mode 100644 index 0000000..108e072 --- /dev/null +++ b/app.js @@ -0,0 +1,136 @@ +'use strict'; +/*jslint node: true */ +/*jslint esversion: 6 */ +/* globals $: true */ +/* eqeqeq: false */ +/* -W041: false */ +const type = require('type-of'); +const request = require('superagent'); +const h = require('hyperscript-string'); +const $ = require('domtastic'); +const rivets = require('rivets'); + +$.fn.clear = function() { + this.forEach((e) => { + e.innerHTML = ''; + }); + return this; +}; + +$.fn.outerHTML = function() { + return this.prop('outerHTML'); +}; + +const state = { + message: '', + knowledge: [], + conversation: [], + error: false +}; + +function _error(method, url, { response: res }) { + res = res ? [res.status, res.text] : []; + console.warn(`[${method} ${url}]`, ...res); +} + +function send_message(text='', cb) { + request.post('/message').send(text).then(({ body }) => { + state.conversation.push({ text: body }); + }, (e) => { + _error('POST', '/message', e); + cb && cb(); + }); +} + +send_message(); + +$('.Conversation-input') + .on('keydown', (e) => { + let message = state.message; + if (e.code == 'Enter' && !e.shiftKey && !e.altKey && !e.ctrlKey) { + if (message == '') + return; + state.message = ''; + state.conversation.push({ text: message.split(/\s*[\n\r]+\s*/g), is_user: true }); + send_message(message, () => { + state.error = true; + }); + return false; + } + }) + .on('paste', (e) => { + e.preventDefault(); + let text = e.clipboardData.getData("text/plain"); + document.execCommand("insertHTML", false, text); + return false; + }); + +function _const(self, key, value) { + Object.defineProperty(self, key, { + value, writable: false, enumerable: true, configurable: true + }); + return self; +} + +const { Binding } = rivets._; +rivets._.Binding = class extends Binding { + parseTarget() { + if (this.binder.parseTarget) { + Object.assign(this, this.binder.parseTarget(this.keypath)); + } + return super.parseTarget(); + } + + publish() { + _const(this, 'state', 'publish'); + let ret = super.publish(); + _const(this, 'state'); + } +}; + +rivets.binders['input'] = { + parseTarget(keypath) { + let empty_class; + [keypath, empty_class] = keypath.trim().split(/\s*\?\s*/); + return { keypath, empty_class }; + }, + + bind: function(el) { + this._empty = true; + $(el).on('input.rv-input', this.publish); + this._watch = () => { + el.innerHTML = ''; + if (el.innerHTML == '') { + clearInterval(this._watcher); + } + }; + }, + + unbind: function(el) { + $(el).off('.rv-input'); + clearInterval(this._watcher); + }, + + routine: function(el, value) { + if (this.state != 'publish') { + clearInterval(this._watcher); + el.innerText = value; + } + state.error = false; + this._empty = value == ''; + if (this._empty) { + this._watcher = setInterval(this._watch, 30); + } + if (this.empty_class) { + $(el).toggleClass(this.empty_class, this._empty); + } + }, + + getValue : function(el) { + return el.innerText.trim(); + } +}; + +global.$state = state; + +rivets.bind(document.body, state); diff --git a/config.py b/config.py new file mode 100644 index 0000000..2c02523 --- /dev/null +++ b/config.py @@ -0,0 +1,227 @@ +import os, re +from itertools import chain, zip_longest +from collections import namedtuple + +from munch import munchify +import yaml + +from util import realpath, Object, Executor, HTMLParser +from util.request import Request + + +with open(realpath('config.yaml')) as f: + data = yaml.load(f, Loader=yaml.SafeLoader) + locals().update(munchify(data)) + +class chuck_norris: + _base = 'https://api.chucknorris.io/jokes' + _categories = Request('GET', f'{_base}/categories') + _random = Request('GET', f'{_base}/random') + + @classmethod + def categories(cls, raw=False): + ret = cls._categories().json() + if raw: + return ret + return ', '.join(ret) + + @classmethod + def random(cls, category=None, count=1, raw=False): + params = None + if category: + params = { 'category': category } + + executor = Executor() + for i in executor(count): + executor[cls._random](params=params) + + ret = [munchify(e.json()) for e in executor.collect()] + if raw: + return ret + return [e.value for e in ret] + +_parser = HTMLParser() +def strip_html(html): + return _parser(html).text + +class Snippet: + def __init__(self, data): + self._data = data + self._text = strip_html(data.snippet).strip() + if not re.match(r'^.*[\.!\?]$', self._text): + self._text = f"{self._text}…" + self._caption = data.title + + def __bool__(self): + return bool(self._text) + + @property + def text(self): + return self._text + + @property + def caption(self): + return self._caption + +class wikipedia: + _base = 'https://en.wikipedia.org/w/api.php' + _search = Request('GET', _base, params={ + 'action': 'query', + 'format': 'json', + 'list': 'search', + 'srsort': 'relevance', + 'srenablerewrites': 'on' + }) + def __new__(cls, query, type=None, count=None): + params = { 'srsearch': query } + if count is not None: + params['srlimit'] = count + if type is not None: + params['srprop'] = type + res = cls._search(params=params) + if not res.ok: + return [] + return munchify(res.json()).query.search + + @classmethod + def snippets(cls, query, count=None): + return [Snippet(e) for e in cls(query, 'snippet', count)] + + @classmethod + def snippet(cls, query): + ret = cls.snippets(query, 1) + return ret[0] if ret else None + +_units = Object(metric='m', imperial='e') +units_ = Object(m='metric', e='imperial') + +Precipitation = namedtuple('Precipitation', 'total hourly snow') + +class Value(dict): + def __init__(self, units, type): + super().__init__() + self._units = units + self._unit = Units[units].get(type, '') + + def _format(self, key): + return f"{self[key]}{self._unit}" + +class Temperature(Value): + def __init__(self, value, feel, min, max, units): + super().__init__(units, 'temperature') + self['value'] = value + self['feel'] = feel + + def __bool__(self): + return bool(self['value']) + + @property + def value(self): + return self._format('value') + + @property + def feel(self): + return self._format('feel') + +class Wind(Value): + def __init__(self, speed, direction, units): + super().__init__(units, 'speed') + self['speed'] = speed + self['direction'] = direction or '' + + def __bool__(self): + return bool(self['speed']) + + @property + def speed(self): + return self._format('speed') + + @property + def direction(self): + return self['direction'] + +Units = Object( + metric = Object( + temperature = '°C', + speed = ' km/h', + ), +) + +class Observation: + def __init__(self, data): + self._meta = data.metadata + self._units = units_[self._meta.units] + data = data.observation + self._data = data + self._precipitation = Precipitation(data.precip_total, data.precip_hrly, data.snow_hrly) + self._temperature = Temperature(data.temp, data.feels_like, data.min_temp, data.max_temp, self._units) + self._wind = Wind(data.wspd, data.wdir_cardinal, self._units) + + @property + def units(self): + return self._units + + @property + def observation(self): + return self._data.wx_phrase + + @property + def temperature(self): + return self._temperature + + @property + def precipitation(self): + return self._precipitation + + @property + def wind(self): + return self._wind + + @property + def pressure(self): + return self._data.pressure + + @property + def visibility(self): + return self._data.vis + +class Weather: + notions = { 'forecast', 'humidity', 'precipitation', 'pressure', 'temperature', 'visibility', 'weather', 'wind speed' } + def __init__(self, host, username, password): + self._host = host + self._auth = (username, password) + self._url = f"https://{host}/api/weather" + self._language = 'en-US' + self._params = dict(language=self._language) + self._location = Request('GET', f"{self._url}/v3/location/search", params=self._params, auth=self._auth) + self._current = None + + def __bool__(self): + return bool(self._current) + + def location(self, query): + res = self._location(params=dict(query=query)) + if not res.ok: + return False + location = res.result().location + latitude = location.latitude[0] + longitude = location.longitude[0] + geocode = f"geocode/{latitude}/{longitude}" + self._current = Request('GET', f"{self._url}/v1/{geocode}/observations.json", params=self._params, auth=self._auth) + return True + + def forecast(self, hours=None, days=None): + pass + + def get_params(self, units): + units = _units.get(units, units) + return dict(units=units, **self._params) + + def current(self, units='m'): + if not self: + return + res = self._current(params=self.get_params(units)) + if res.ok: + return Observation(res.result()) + +__all__ = { 'ibm_cloud', 'chuck_norris', 'wikipedia' } diff --git a/engine.py b/engine.py new file mode 100644 index 0000000..f6deacc --- /dev/null +++ b/engine.py @@ -0,0 +1,109 @@ +import re + +from _bareasgi import text_reader, text_response, json_response +from config import ibm_cloud, chuck_norris, wikipedia, Weather +from watson import Assistant +from util import split + + +def _clean(text): + """Strips any CR/LF/TAB characters from text""" + if text is None: + return None + return re.sub(r"\s+", " ", text) + +weather = Weather(**ibm_cloud.weather) + +assistant = Assistant(**ibm_cloud.chatbot) +wikibot = Assistant.v1(**ibm_cloud.wikibot) +assistant.link(wikibot, 0.9) + +def retry(): + return json_response(assistant(intents=['retry']).text) + +_weather = None + +async def message(scope, info, matches, content): + global _weather + text = _clean((await text_reader(content)).strip().lstrip('.').lstrip()) + if text == '': + return json_response(assistant(intents=['welcome']).text) + + if not _weather: + res = assistant(text) + if res is None: + return json_response(res.data, 404) + + if not res.intent or res.confidence < 0.9: + ret = wikipedia.snippet(text) + if not ret: + return retry() + + wikibot[text, ret.caption] = ret.text + return json_response(split(ret.text)) + else: + res = assistant(text, bypass=True) + if res and res.intent and res.confidence >= 0.9: + _weather = None + return json_response(res.text) + + if _weather or res.intent == 'weather': + if _weather: + notions = _weather + location = text + else: + ret = dict(res.entities['notion']) + notions = set() + for notion in set(ret): + if notion in Weather.notions: + notions.add(notion) + del ret[notion] + + locations = list(ret.values()) + location = locations[0].value if locations else None + if not location and not weather: + _weather = notions + return json_response(res.text) + + if location and not weather.location(location): + return retry() + + _weather = None + obs = weather.current() + if not obs: + return retry() + + answer = [] + if obs.observation: + answer.append(obs.observation) + + if 'weather' in notions: + notions.update({ 'temperature', 'wind speed' }) + + if 'temperature' in notions: + e = obs.temperature + if e: + answer.append(f"temperature: {e.value} (feels like: {e.feel})") + + if 'wind speed' in notions: + e = obs.wind + if e: + answer.append(f"wind: {e.direction} {e.speed}") + + if not answer: + return retry() + + return json_response(answer) + + if res.intent == 'chuck_norris': + category = res.entities['domain'].get('value') + if ('notion', 'categories') in res.entities: + ret = [chuck_norris.categories()] + elif ('notion', 'joke') in res.entities: + ret = chuck_norris.random(category) + else: + ret = chuck_norris.random(category, 3) + return json_response(ret) + + return json_response(res.text) + diff --git a/main.py b/main.py new file mode 100644 index 0000000..d8296d5 --- /dev/null +++ b/main.py @@ -0,0 +1,20 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +import os + +import uvicorn +from _bareasgi import Application +from bareasgi_static import add_static_file_provider + +from engine import message + +here = os.path.abspath(os.path.dirname(__file__)) + +app = Application() +app.http_router.add({'POST'}, '/message', message) + +add_static_file_provider(app, os.path.join(here, 'static'), index_filename='index.html') + +port = int(os.getenv('PORT', '80')) +uvicorn.run(app, host='0.0.0.0', port=port) diff --git a/manifest.yml b/manifest.yml new file mode 100644 index 0000000..67c38e0 --- /dev/null +++ b/manifest.yml @@ -0,0 +1,7 @@ +applications: + - name: Whizbot + host: whizbot + command: python3 main.py + buildpack: python_buildpack + domain: apps.internal + diff --git a/package.json b/package.json new file mode 100644 index 0000000..a25ff4c --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "web-knowledge-assistant", + "description": "An engaging virtual assistant capable of answering arbitrary open-ended questions", + "version": "1.0.0", + "author": "denim2x ", + "license": "MIT", + "repository": "github:denim2x/web-knowledge-assistant", + "devDependencies": { + "@vendhq/uglifyify": "^5.1.0", + "browserify": "^16.2.3" + }, + "dependencies": { + "domtastic": "^0.15.12", + "hyperscript-string": "^2.1.0", + "install": "^0.12.2", + "npm": "^6.9.0", + "rivets": "^0.9.6", + "superagent": "4.1.0", + "type-of": "^2.0.1" + }, + "scripts": { + "build": "browserify app.js -d -o static/app.js", + "prestart": "browserify app.js -g uglifyify -d -o static/app.js", + "start": "npm run-script serve", + "serve": "python3 main.py" + } +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1e47a32 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +ibm-watson +uvicorn==0.7.0 +bareasgi==1.0.3 +bareasgi_static +munch +requests +PyYAML diff --git a/runtime.txt b/runtime.txt new file mode 100644 index 0000000..a486801 --- /dev/null +++ b/runtime.txt @@ -0,0 +1 @@ +python-3.7.x \ No newline at end of file diff --git a/static/app.js b/static/app.js new file mode 100644 index 0000000..dddb741 --- /dev/null +++ b/static/app.js @@ -0,0 +1,65 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i1?t-1:0),i=1;i]*>/,f=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,a=/^[.#]?[\w-]*$/,l=function(e,t){var n;if(void 0===t&&(t=document),e){if(e instanceof y)return e;"string"!=typeof e?n=e.nodeType||e===window?[e]:e:c.test(e)?n=v(e):(t="string"==typeof t?document.querySelector(t):t.length?t[0]:t,n=p(e,t))}else n=document.querySelectorAll(null);return m(n)},d=function(e){var t=[];return r(this,function(n){return r(p(e,n),function(e){-1===t.indexOf(e)&&t.push(e)})}),l(t)},h=(e="undefined"!=typeof Element?Element.prototype:n,t=e.matches||e.matchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector,function(e,n){return t.call(e,n)}),p=function(e,t){if(a.test(e)){if("#"===e[0]){var n=(t.getElementById?t:document).getElementById(e.slice(1));return n?[n]:[]}return"."===e[0]?t.getElementsByClassName(e.slice(1)):t.getElementsByTagName(e)}return t.querySelectorAll(e)},v=function(e){if(f.test(e))return[document.createElement(RegExp.$1)];var t=[],n=document.createElement("div"),i=n.childNodes;n.innerHTML=e;for(var r=0,o=i.length;r0?this[0].value:void 0:r(this,function(t){return t.value=e})}}),X=Object.freeze({html:function(e){if(void 0===e){var t=this.nodeType?this:this[0];return t?t.innerHTML:void 0}return r(this,function(t){return t.innerHTML=e})}}),Y=function(){var e=function(e,t){var n=[];return r(this,function(i){for(;i&&i!==t;){if(h(i,e)){n.push(i);break}i=i.parentElement}}),l(u(n))};return"undefined"!=typeof Element&&Element.prototype.closest?function(t,n){if(n)return e.call(this,t,n);var i=[];return r(this,function(e){var n=e.closest(t);n&&i.push(n)}),l(u(i))}:e}(),ee=Object.freeze({closest:Y}),te=function(e,t,n,i,o){var u,s,c,f=this;return"function"==typeof t&&(n=t,t=null),e.split(" ").forEach(function(a){u=a.split("."),a=u[0]||null,s=u[1]||null,c=fe(n),r(f,function(r){if(t&&(c=pe.bind(r,t,c)),o){var u=c;c=function(o){ne.call(r,e,t,n,i),u.call(r,o)}}r.addEventListener(a,c,i||!1),se(r).push({eventName:a,handler:n,eventListener:c,selector:t,namespace:s})})},this),this},ne=function(e,t,n,i){var o,u,s,c=this;return void 0===e&&(e=""),"function"==typeof t&&(n=t,t=null),e.split(" ").forEach(function(e){return o=e.split("."),e=o[0]||null,u=o[1]||null,r(c,function(o){s=se(o),r(s.filter(function(i){return!(e&&i.eventName!==e||u&&i.namespace!==u||n&&i.handler!==n||t&&i.selector!==t)}),function(e){o.removeEventListener(e.eventName,e.eventListener,i||!1),s.splice(s.indexOf(e),1)}),e||u||t||n?0===s.length&&ce(o):ce(o)})},this),this},ie="__domtastic_event__",re=1,oe={},ue=[],se=function(e){e[ie]||(e[ie]=0===ue.length?++re:ue.pop());var t=e[ie];return oe[t]||(oe[t]=[])},ce=function(e){var t=e[ie];oe[t]&&(oe[t]=null,e[ie]=null,ue.push(t))},fe=function(e){return function(t){return e.call(this,he(t))}},ae={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"},le=function(){return!0},de=function(){return!1},he=function(e){if(!e.isDefaultPrevented||e.stopImmediatePropagation||e.stopPropagation){for(var t in ae)!function(t,n,i){e[t]=function(){return this[n]=le,i&&i.apply(this,arguments)},e[n]=de}(t,ae[t],e[t]);e._preventDefault&&e.preventDefault()}return e},pe=function(e,t,n){var i=n._target||n.target,r=Y.call([i],e,this)[0];r&&r!==this&&(r!==i&&n.isPropagationStopped&&n.isPropagationStopped()||t.call(r,n))},ve=te,me=ne,ye=Object.freeze({on:te,off:ne,one:function(e,t,n,i){return te.call(this,e,t,n,i,1)},getHandlers:se,clearHandlers:ce,proxyHandler:fe,delegateHandler:pe,bind:ve,unbind:me}),be=/^(mouse(down|up|over|out|enter|leave|move)|contextmenu|(dbl)?click)$/,ge=/^key(down|press|up)$/,Ee=function(e,t,n){var i=void 0===n?{}:n,o=i.bubbles,u=void 0===o||o,s=i.cancelable,c=void 0===s||s,f=i.preventDefault,a=void 0!==f&&f,l=new(Ne(e))(e,{bubbles:u,cancelable:c,preventDefault:a,detail:t});return l._preventDefault=a,r(this,function(n){!u||je||Ce(n)?Te(n,l):Oe(n,e,{bubbles:u,cancelable:c,preventDefault:a,detail:t})})},Ne=function(e){return Ae?be.test(e)?MouseEvent:ge.test(e)?KeyboardEvent:CustomEvent:CustomEvent},Ce=function(e){return e===window||e===document||K(e.ownerDocument.documentElement,e)},Oe=function(e,t,n){void 0===n&&(n={}),n.bubbles=!1;var i=new CustomEvent(t,n);i._target=e;do{Te(e,i)}while(e=e.parentNode)},we=["blur","focus","select","submit"],Te=function(e,t){-1===we.indexOf(t.type)||"function"!=typeof e[t.type]||t._preventDefault||t.cancelable?e.dispatchEvent(t):e[t.type]()};!function(){var e=function(e,t){void 0===t&&(t={bubbles:!1,cancelable:!1,detail:void 0});var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),n};e.prototype=n.CustomEvent&&n.CustomEvent.prototype,n.CustomEvent=e}();var je=function(){var e=!1,t=n.document;if(t){var i=t.createElement("div"),r=i.cloneNode();i.appendChild(r),i.addEventListener("e",function(){e=!0}),r.dispatchEvent(new CustomEvent("e",{bubbles:!0}))}return e}(),Ae=function(){try{new MouseEvent("click")}catch(e){return!1}return!0}(),Le=Object.freeze({trigger:Ee,triggerHandler:function(e,t){this[0]&&Ee.call(this[0],e,t,{bubbles:!1,preventDefault:!0})}}),De=Object.freeze({ready:function(e){return/complete|loaded|interactive/.test(document.readyState)&&document.body?e():document.addEventListener("DOMContentLoaded",e,!1),this}}),ze=n.$,_e=Object.freeze({noConflict:function(){return n.$=ze,this}}),Me=function(e,t){return l([].slice.apply(this,arguments))},xe=Object.freeze({children:function(e){var t=[];return r(this,function(n){n.children&&r(n.children,function(n){(!e||e&&h(n,e))&&t.push(n)})}),l(t)},concat:function(e){var t=this;return r(l(e),function(e){-1===[].indexOf.call(t,e)&&[].push.call(t,e)}),this},contents:function(){var e=[];return r(this,function(t){return e.push.apply(e,i(t.childNodes))}),l(e)},eq:function(e){return Me.call(this,e,e+1)},first:function(){return Me.call(this,0,1)},get:function(e){return this[e]},parent:function(e){var t=[];return r(this,function(n){(!e||e&&h(n.parentNode,e))&&t.push(n.parentNode)}),l(t)},siblings:function(e){var t=[];return r(this,function(n){return r(n.parentNode.children,function(i){i!==n&&(!e||e&&h(i,e))&&t.push(i)})}),l(t)},slice:Me}),Se=Array.isArray,Pe=Object.freeze({isFunction:function(e){return"function"==typeof e},isArray:Se}),He={},$e={};return void 0!==b&&(($e=l).matches=h,He.find=d),o($e,W,_e,Pe),o(He,M,P,F,q,U,Q,V,X,ye,Le,De,ee,xe),$e.fn=He,$e.version="0.15.12",$e.extend=o,$e.BaseClass=x($e.fn),$e}); + +},{}],5:[function(require,module,exports){ +"use strict";const arrify=require("arrify"),isPlainObject=require("is-plain-object"),classNames=require("classnames"),render=require("./render"),utils=require("./utils"),h=(e,s,r)=>{s&&!isPlainObject(s)?(r=s,s={}):s||(s={}),r=arrify(r);const i=utils.getSelectorParts(e);return i.id&&(s.id=i.id),i.classes.length&&(s.class=classNames(s.class,i.classes)),render(i.tag,s,r)};module.exports=exports=h; + +},{"./render":6,"./utils":7,"arrify":1,"classnames":2,"is-plain-object":8}],6:[function(require,module,exports){ +"use strict";const voidElements=require("void-elements"),arrify=require("arrify");function renderAttributes(e){return(e=Object.keys(e).filter(r=>void 0!==e[r]&&null!==e[r]&&!1!==e[r]).map(r=>!0===e[r]?r:`${r}="${e[r]}"`).join(" "))?` ${e}`:""}function renderChildren(e){return 0===(e=arrify(e)).length?"":1===e.length?e[0]:`\n\t${e.join("\n\t")}\n`}module.exports=exports=function(e,r,t){return"!doctype"===e||voidElements[e]?`<${e}${renderAttributes(r)}>`:`<${e}${renderAttributes(r)}>${renderChildren(t)}`}; + +},{"arrify":1,"void-elements":19}],7:[function(require,module,exports){ +"use strict";const SELECTOR_REGEX=/(^|#|\.)[^#\.]+/g;function getTag(t){return"#"===t[0][0]||"."===t[0][0]?"div":t[0].toLowerCase()}function getClasses(t){return t.filter(isClass).map(slice(1))}function getId(t){return t.filter(isId).map(slice(1))[0]}function slice(t,e){return s=>s.slice(t,e)}function isId(t){return"#"===t[0]}function isClass(t){return"."===t[0]}exports.getSelectorParts=(t=>{const e=t.match(SELECTOR_REGEX);if(!e)throw new Error(`Invalid selector! Should have the format "name.class1.class2#id", but was: "${t}"`);return{tag:getTag(e),id:getId(e),classes:getClasses(e)}}); + +},{}],8:[function(require,module,exports){ +"use strict";var isObject=require("isobject");function isObjectObject(t){return!0===isObject(t)&&"[object Object]"===Object.prototype.toString.call(t)}module.exports=function(t){var e,c;return!1!==isObjectObject(t)&&("function"==typeof(e=t.constructor)&&(!1!==isObjectObject(c=e.prototype)&&!1!==c.hasOwnProperty("isPrototypeOf")))}; + +},{"isobject":9}],9:[function(require,module,exports){ +"use strict";module.exports=function(r){return null!=r&&"object"==typeof r&&!1===Array.isArray(r)}; + +},{}],10:[function(require,module,exports){ +(function(){var t,e,i,n,s,r=function(t,e){return function(){return t.apply(e,arguments)}},o=[].slice,l={}.hasOwnProperty,u=function(t,e){for(var i in e)l.call(e,i)&&(t[i]=e[i]);function n(){this.constructor=t}return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},h=[].indexOf||function(t){for(var e=0,i=this.length;e0&&n=0?this.static[l]=s.value:u.type===t.TypeParser.types.primitive?this.static[l]=u.value:this.observers[l]=s.value)}return u(i,e),i.prototype.sync=function(){},i.prototype.update=function(){},i.prototype.publish=function(){},i.prototype.locals=function(){var t,e,i,n,s,r;for(t in i={},s=this.static)n=s[t],i[t]=n;for(t in r=this.observers)e=r[t],i[t]=e.value();return i},i.prototype.camelCase=function(t){return t.replace(/-([a-z])/g,function(t){return t[1].toUpperCase()})},i.prototype.bind=function(){var e,i,n,s,r,o,l,u,h,a,p,d,c,f,b,v,m,y,g,w;if(!this.bound){for(i in f=this.observers)n=f[i],this.observers[i]=this.observe(this.view.models,n,function(t){return function(e){return function(){return t.componentView.models[e]=t.observers[e].value()}}}(this).call(this,i));this.bound=!0}if(null!=this.componentView)this.componentView.bind();else{for(this.el.innerHTML=this.component.template.call(this),l=this.component.initialize.call(this,this.el,this.locals()),this.el._bound=!0,o={},a=0,d=(b=t.extensions).length;a=0));return a}}else if((null!=e?e.toString():void 0)!==(null!=(u=t.value)?u.toString():void 0))return t.value=null!=e?e:""}},t.public.binders.if={block:!0,priority:4e3,bind:function(t){var e,i;if(null==this.marker)return e=[this.view.prefix,this.type].join("-").replace("--","-"),i=t.getAttribute(e),this.marker=document.createComment(" rivets: "+this.type+" "+i+" "),this.bound=!1,t.removeAttribute(e),t.parentNode.insertBefore(this.marker,t),t.parentNode.removeChild(t)},unbind:function(){if(this.nested)return this.nested.unbind(),this.bound=!1},routine:function(e,i){var n,s,r,o;if(!!i==!this.bound){if(i){for(n in r={},o=this.view.models)s=o[n],r[n]=s;return(this.nested||(this.nested=new t.View(e,r,this.view.options()))).bind(),this.marker.parentNode.insertBefore(e,this.marker.nextSibling),this.bound=!0}return e.parentNode.removeChild(e),this.nested.unbind(),this.bound=!1}},update:function(t){var e;return null!=(e=this.nested)?e.update(t):void 0}},t.public.binders.unless={block:!0,priority:4e3,bind:function(e){return t.public.binders.if.bind.call(this,e)},unbind:function(){return t.public.binders.if.unbind.call(this)},routine:function(e,i){return t.public.binders.if.routine.call(this,e,!i)},update:function(e){return t.public.binders.if.update.call(this,e)}},t.public.binders["on-*"]={function:!0,priority:1e3,unbind:function(e){if(this.handler)return t.Util.unbindEvent(e,this.args[0],this.handler)},routine:function(e,i){return this.handler&&t.Util.unbindEvent(e,this.args[0],this.handler),t.Util.bindEvent(e,this.args[0],this.handler=this.eventHandler(i))}},t.public.binders["each-*"]={block:!0,priority:4e3,bind:function(t){var e,i,n,s;if(null==this.marker)e=[this.view.prefix,this.type].join("-").replace("--","-"),this.marker=document.createComment(" rivets: "+this.type+" "),this.iterated=[],t.removeAttribute(e),t.parentNode.insertBefore(this.marker,t),t.parentNode.removeChild(t);else for(i=0,n=(s=this.iterated).length;ii.length)for(c=0,v=(g=Array(this.iterated.length-i.length)).length;c=0&&r.splice(n,1),r.length||delete s.pointers[e],this.cleanupWeakReference(s,t[this.id])},observe:function(t,e,i){var n,s,r,o;return null==(n=this.weakReference(t).callbacks)[e]&&(n[e]=[],(null!=(s=Object.getOwnPropertyDescriptor(t,e))?s.get:void 0)||(null!=s?s.set:void 0)||(r=t[e],Object.defineProperty(t,e,{enumerable:!0,get:function(){return r},set:(o=this,function(i){var s,l,u,a,p;if(i!==r&&(o.unobserveMutations(r,t[o.id],e),r=i,l=o.weakmap[t[o.id]])){if((n=l.callbacks)[e])for(u=0,a=(p=n[e].slice()).length;u=0&&s();return o.observeMutations(i,t[o.id],e)}})}))),h.call(n[e],i)<0&&n[e].push(i),this.observeMutations(t[e],t[this.id],e)},unobserve:function(t,e,i){var n,s,r;if((r=this.weakmap[t[this.id]])&&(n=r.callbacks[e]))return(s=n.indexOf(i))>=0&&(n.splice(s,1),n.length||(delete r.callbacks[e],this.unobserveMutations(t[e],t[this.id],e))),this.cleanupWeakReference(r,t[this.id])},get:function(t,e){return t[e]},set:function(t,e,i){return t[e]=i}},t.factory=function(e){return t.sightglass=e,t.public._=t,t.public},"object"==typeof("undefined"!=typeof module&&null!==module?module.exports:void 0)?module.exports=t.factory(require("sightglass")):"function"==typeof define&&define.amd?define(["sightglass"],function(e){return this.rivets=t.factory(e)}):this.rivets=t.factory(sightglass)}).call(this); + +},{"sightglass":11}],11:[function(require,module,exports){ +(function(){function t(t,s,i,h){return new e(t,s,i,h)}function e(t,e,i,h){this.options=h||{},this.options.adapters=this.options.adapters||{},this.obj=t,this.keypath=e,this.callback=i,this.objectPath=[],this.update=this.update.bind(this),this.parse(),s(this.target=this.realize())&&this.set(!0,this.key,this.target,this.callback)}function s(t){return"object"==typeof t&&null!==t}function i(t){throw new Error("[sightglass] "+t)}t.adapters={},e.tokenize=function(t,e,s){var i,h,a=[],o={i:s,path:""};for(i=0;i{Agent.prototype[t]=function(...e){return this._defaults.push({fn:t,args:e}),this}}),Agent.prototype._setDefaults=function(t){this._defaults.forEach(e=>{t[e.fn].apply(t,e.args)})},module.exports=Agent; + +},{}],13:[function(require,module,exports){ +let root;"undefined"!=typeof window?root=window:"undefined"!=typeof self?root=self:(console.warn("Using browser-only version of superagent in non-browser environment"),root=this);const Emitter=require("component-emitter"),RequestBase=require("./request-base"),isObject=require("./is-object"),ResponseBase=require("./response-base"),Agent=require("./agent-base");function noop(){}const request=exports=module.exports=function(e,t){return"function"==typeof t?new exports.Request("GET",e).end(t):1==arguments.length?new exports.Request("GET",e):new exports.Request(e,t)};exports.Request=Request,request.getXHR=(()=>{if(!(!root.XMLHttpRequest||root.location&&"file:"==root.location.protocol&&root.ActiveXObject))return new XMLHttpRequest;try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}try{return new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(e){}try{return new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(e){}try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(e){}throw Error("Browser-only version of superagent could not find XHR")});const trim="".trim?e=>e.trim():e=>e.replace(/(^\s*|\s*$)/g,"");function serialize(e){if(!isObject(e))return e;const t=[];for(const s in e)pushEncodedKeyValuePair(t,s,e[s]);return t.join("&")}function pushEncodedKeyValuePair(e,t,s){if(null!=s)if(Array.isArray(s))s.forEach(s=>{pushEncodedKeyValuePair(e,t,s)});else if(isObject(s))for(const r in s)pushEncodedKeyValuePair(e,`${t}[${r}]`,s[r]);else e.push(encodeURIComponent(t)+"="+encodeURIComponent(s));else null===s&&e.push(encodeURIComponent(t))}function parseString(e){const t={},s=e.split("&");let r,o;for(let e=0,n=s.length;e{let e,t=null,r=null;try{r=new Response(s)}catch(e){return(t=new Error("Parser is unable to parse the response")).parse=!0,t.original=e,s.xhr?(t.rawResponse=void 0===s.xhr.responseType?s.xhr.responseText:s.xhr.response,t.status=s.xhr.status?s.xhr.status:null,t.statusCode=t.status):(t.rawResponse=null,t.status=null),s.callback(t)}s.emit("response",r);try{s._isResponseOK(r)||(e=new Error(r.statusText||"Unsuccessful HTTP response"))}catch(t){e=t}e?(e.original=t,e.response=r,e.status=r.status,s.callback(e,r)):s.callback(null,r)})}function del(e,t,s){const r=request("DELETE",e);return"function"==typeof t&&(s=t,t=null),t&&r.send(t),s&&r.end(s),r}request.serializeObject=serialize,request.parseString=parseString,request.types={html:"text/html",json:"application/json",xml:"text/xml",urlencoded:"application/x-www-form-urlencoded",form:"application/x-www-form-urlencoded","form-data":"application/x-www-form-urlencoded"},request.serialize={"application/x-www-form-urlencoded":serialize,"application/json":JSON.stringify},request.parse={"application/x-www-form-urlencoded":parseString,"application/json":JSON.parse},ResponseBase(Response.prototype),Response.prototype._parseBody=function(e){let t=request.parse[this.type];return this.req._parser?this.req._parser(this,e):(!t&&isJSON(this.type)&&(t=request.parse["application/json"]),t&&e&&(e.length||e instanceof Object)?t(e):null)},Response.prototype.toError=function(){const e=this.req,t=e.method,s=e.url,r=`cannot ${t} ${s} (${this.status})`,o=new Error(r);return o.status=this.status,o.method=t,o.url=s,o},request.Response=Response,Emitter(Request.prototype),RequestBase(Request.prototype),Request.prototype.type=function(e){return this.set("Content-Type",request.types[e]||e),this},Request.prototype.accept=function(e){return this.set("Accept",request.types[e]||e),this},Request.prototype.auth=function(e,t,s){1===arguments.length&&(t=""),"object"==typeof t&&null!==t&&(s=t,t=""),s||(s={type:"function"==typeof btoa?"basic":"auto"});return this._auth(e,t,s,e=>{if("function"==typeof btoa)return btoa(e);throw new Error("Cannot use basic auth, btoa is not a function")})},Request.prototype.query=function(e){return"string"!=typeof e&&(e=serialize(e)),e&&this._query.push(e),this},Request.prototype.attach=function(e,t,s){if(t){if(this._data)throw Error("superagent can't mix .send() and .attach()");this._getFormData().append(e,t,s||t.name)}return this},Request.prototype._getFormData=function(){return this._formData||(this._formData=new root.FormData),this._formData},Request.prototype.callback=function(e,t){if(this._shouldRetry(e,t))return this._retry();const s=this._callback;this.clearTimeout(),e&&(this._maxRetries&&(e.retries=this._retries-1),this.emit("error",e)),s(e,t)},Request.prototype.crossDomainError=function(){const e=new Error("Request has been terminated\nPossible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.");e.crossDomain=!0,e.status=this.status,e.method=this.method,e.url=this.url,this.callback(e)},Request.prototype.buffer=Request.prototype.ca=Request.prototype.agent=function(){return console.warn("This is not supported in browser version of superagent"),this},Request.prototype.pipe=Request.prototype.write=(()=>{throw Error("Streaming is not supported in browser version of superagent")}),Request.prototype._isHost=function(e){return e&&"object"==typeof e&&!Array.isArray(e)&&"[object Object]"!==Object.prototype.toString.call(e)},Request.prototype.end=function(e){this._endCalled&&console.warn("Warning: .end() was called twice. This is not supported in superagent"),this._endCalled=!0,this._callback=e||noop,this._finalizeQueryString(),this._end()},Request.prototype._end=function(){if(this._aborted)return this.callback(Error("The request has been aborted even before .end() was called"));const e=this,t=this.xhr=request.getXHR();let s=this._formData||this._data;this._setTimeouts(),t.onreadystatechange=(()=>{const s=t.readyState;if(s>=2&&e._responseTimeoutTimer&&clearTimeout(e._responseTimeoutTimer),4!=s)return;let r;try{r=t.status}catch(e){r=0}if(!r){if(e.timedout||e._aborted)return;return e.crossDomainError()}e.emit("end")});const r=(t,s)=>{s.total>0&&(s.percent=s.loaded/s.total*100),s.direction=t,e.emit("progress",s)};if(this.hasListeners("progress"))try{t.onprogress=r.bind(null,"download"),t.upload&&(t.upload.onprogress=r.bind(null,"upload"))}catch(e){}try{this.username&&this.password?t.open(this.method,this.url,!0,this.username,this.password):t.open(this.method,this.url,!0)}catch(e){return this.callback(e)}if(this._withCredentials&&(t.withCredentials=!0),!this._formData&&"GET"!=this.method&&"HEAD"!=this.method&&"string"!=typeof s&&!this._isHost(s)){const e=this._header["content-type"];let t=this._serializer||request.serialize[e?e.split(";")[0]:""];!t&&isJSON(e)&&(t=request.serialize["application/json"]),t&&(s=t(s))}for(const e in this.header)null!=this.header[e]&&this.header.hasOwnProperty(e)&&t.setRequestHeader(e,this.header[e]);this._responseType&&(t.responseType=this._responseType),this.emit("request",this),t.send(void 0!==s?s:null)},request.agent=(()=>new Agent),["GET","POST","OPTIONS","PATCH","PUT","DELETE"].forEach(e=>{Agent.prototype[e.toLowerCase()]=function(t,s){const r=new request.Request(e,t);return this._setDefaults(r),s&&r.end(s),r}}),Agent.prototype.del=Agent.prototype.delete,request.get=((e,t,s)=>{const r=request("GET",e);return"function"==typeof t&&(s=t,t=null),t&&r.query(t),s&&r.end(s),r}),request.head=((e,t,s)=>{const r=request("HEAD",e);return"function"==typeof t&&(s=t,t=null),t&&r.query(t),s&&r.end(s),r}),request.options=((e,t,s)=>{const r=request("OPTIONS",e);return"function"==typeof t&&(s=t,t=null),t&&r.send(t),s&&r.end(s),r}),request.del=del,request.delete=del,request.patch=((e,t,s)=>{const r=request("PATCH",e);return"function"==typeof t&&(s=t,t=null),t&&r.send(t),s&&r.end(s),r}),request.post=((e,t,s)=>{const r=request("POST",e);return"function"==typeof t&&(s=t,t=null),t&&r.send(t),s&&r.end(s),r}),request.put=((e,t,s)=>{const r=request("PUT",e);return"function"==typeof t&&(s=t,t=null),t&&r.send(t),s&&r.end(s),r}); + +},{"./agent-base":12,"./is-object":14,"./request-base":15,"./response-base":16,"component-emitter":3}],14:[function(require,module,exports){ +"use strict";function isObject(t){return null!==t&&"object"==typeof t}module.exports=isObject; + +},{}],15:[function(require,module,exports){ +"use strict";const isObject=require("./is-object");function RequestBase(t){if(t)return mixin(t)}function mixin(t){for(const e in RequestBase.prototype)t[e]=RequestBase.prototype[e];return t}module.exports=RequestBase,RequestBase.prototype.clearTimeout=function(){return clearTimeout(this._timer),clearTimeout(this._responseTimeoutTimer),delete this._timer,delete this._responseTimeoutTimer,this},RequestBase.prototype.parse=function(t){return this._parser=t,this},RequestBase.prototype.responseType=function(t){return this._responseType=t,this},RequestBase.prototype.serialize=function(t){return this._serializer=t,this},RequestBase.prototype.timeout=function(t){if(!t||"object"!=typeof t)return this._timeout=t,this._responseTimeout=0,this;for(const e in t)switch(e){case"deadline":this._timeout=t.deadline;break;case"response":this._responseTimeout=t.response;break;default:console.warn("Unknown timeout option",e)}return this},RequestBase.prototype.retry=function(t,e){return 0!==arguments.length&&!0!==t||(t=1),t<=0&&(t=0),this._maxRetries=t,this._retries=0,this._retryCallback=e,this};const ERROR_CODES=["ECONNRESET","ETIMEDOUT","EADDRINFO","ESOCKETTIMEDOUT"];RequestBase.prototype._shouldRetry=function(t,e){if(!this._maxRetries||this._retries++>=this._maxRetries)return!1;if(this._retryCallback)try{const s=this._retryCallback(t,e);if(!0===s)return!0;if(!1===s)return!1}catch(t){console.error(t)}if(e&&e.status&&e.status>=500&&501!=e.status)return!0;if(t){if(t.code&&~ERROR_CODES.indexOf(t.code))return!0;if(t.timeout&&"ECONNABORTED"==t.code)return!0;if(t.crossDomain)return!0}return!1},RequestBase.prototype._retry=function(){return this.clearTimeout(),this.req&&(this.req=null,this.req=this.request()),this._aborted=!1,this.timedout=!1,this._end()},RequestBase.prototype.then=function(t,e){if(!this._fullfilledPromise){const t=this;this._endCalled&&console.warn("Warning: superagent request was sent twice, because both .end() and .then() were called. Never call .end() if you use promises"),this._fullfilledPromise=new Promise((e,s)=>{t.on("error",s),t.on("abort",()=>{const t=new Error("Aborted");t.code="ABORTED",t.status=this.status,t.method=this.method,t.url=this.url,s(t)}),t.end((t,i)=>{t?s(t):e(i)})})}return this._fullfilledPromise.then(t,e)},RequestBase.prototype.catch=function(t){return this.then(void 0,t)},RequestBase.prototype.use=function(t){return t(this),this},RequestBase.prototype.ok=function(t){if("function"!=typeof t)throw Error("Callback required");return this._okCallback=t,this},RequestBase.prototype._isResponseOK=function(t){return!!t&&(this._okCallback?this._okCallback(t):t.status>=200&&t.status<300)},RequestBase.prototype.get=function(t){return this._header[t.toLowerCase()]},RequestBase.prototype.getHeader=RequestBase.prototype.get,RequestBase.prototype.set=function(t,e){if(isObject(t)){for(const e in t)this.set(e,t[e]);return this}return this._header[t.toLowerCase()]=e,this.header[t]=e,this},RequestBase.prototype.unset=function(t){return delete this._header[t.toLowerCase()],delete this.header[t],this},RequestBase.prototype.field=function(t,e){if(null==t)throw new Error(".field(name, val) name can not be empty");if(this._data)throw new Error(".field() can't be used if .send() is used. Please use only .send() or only .field() & .attach()");if(isObject(t)){for(const e in t)this.field(e,t[e]);return this}if(Array.isArray(e)){for(const s in e)this.field(t,e[s]);return this}if(null==e)throw new Error(".field(name, val) val can not be empty");return"boolean"==typeof e&&(e=""+e),this._getFormData().append(t,e),this},RequestBase.prototype.abort=function(){return this._aborted?this:(this._aborted=!0,this.xhr&&this.xhr.abort(),this.req&&this.req.abort(),this.clearTimeout(),this.emit("abort"),this)},RequestBase.prototype._auth=function(t,e,s,i){switch(s.type){case"basic":this.set("Authorization",`Basic ${i(`${t}:${e}`)}`);break;case"auto":this.username=t,this.password=e;break;case"bearer":this.set("Authorization",`Bearer ${t}`)}return this},RequestBase.prototype.withCredentials=function(t){return null==t&&(t=!0),this._withCredentials=t,this},RequestBase.prototype.redirects=function(t){return this._maxRedirects=t,this},RequestBase.prototype.maxResponseSize=function(t){if("number"!=typeof t)throw TypeError("Invalid argument");return this._maxResponseSize=t,this},RequestBase.prototype.toJSON=function(){return{method:this.method,url:this.url,data:this._data,headers:this._header}},RequestBase.prototype.send=function(t){const e=isObject(t);let s=this._header["content-type"];if(this._formData)throw new Error(".send() can't be used if .attach() or .field() is used. Please use only .send() or only .field() & .attach()");if(e&&!this._data)Array.isArray(t)?this._data=[]:this._isHost(t)||(this._data={});else if(t&&this._data&&this._isHost(this._data))throw Error("Can't merge these send calls");if(e&&isObject(this._data))for(const e in t)this._data[e]=t[e];else"string"==typeof t?(s||this.type("form"),s=this._header["content-type"],this._data="application/x-www-form-urlencoded"==s?this._data?`${this._data}&${t}`:t:(this._data||"")+t):this._data=t;return!e||this._isHost(t)?this:(s||this.type("json"),this)},RequestBase.prototype.sortQuery=function(t){return this._sort=void 0===t||t,this},RequestBase.prototype._finalizeQueryString=function(){const t=this._query.join("&");if(t&&(this.url+=(this.url.indexOf("?")>=0?"&":"?")+t),this._query.length=0,this._sort){const t=this.url.indexOf("?");if(t>=0){const e=this.url.substring(t+1).split("&");"function"==typeof this._sort?e.sort(this._sort):e.sort(),this.url=this.url.substring(0,t)+"?"+e.join("&")}}},RequestBase.prototype._appendQueryString=(()=>{console.trace("Unsupported")}),RequestBase.prototype._timeoutError=function(t,e,s){if(this._aborted)return;const i=new Error(`${t+e}ms exceeded`);i.timeout=e,i.code="ECONNABORTED",i.errno=s,this.timedout=!0,this.abort(),this.callback(i)},RequestBase.prototype._setTimeouts=function(){const t=this;this._timeout&&!this._timer&&(this._timer=setTimeout(()=>{t._timeoutError("Timeout of ",t._timeout,"ETIME")},this._timeout)),this._responseTimeout&&!this._responseTimeoutTimer&&(this._responseTimeoutTimer=setTimeout(()=>{t._timeoutError("Response timeout of ",t._responseTimeout,"ETIMEDOUT")},this._responseTimeout))}; + +},{"./is-object":14}],16:[function(require,module,exports){ +"use strict";const utils=require("./utils");function ResponseBase(t){if(t)return mixin(t)}function mixin(t){for(const s in ResponseBase.prototype)t[s]=ResponseBase.prototype[s];return t}module.exports=ResponseBase,ResponseBase.prototype.get=function(t){return this.header[t.toLowerCase()]},ResponseBase.prototype._setHeaderProperties=function(t){const s=t["content-type"]||"";this.type=utils.type(s);const e=utils.params(s);for(const t in e)this[t]=e[t];this.links={};try{t.link&&(this.links=utils.parseLinks(t.link))}catch(t){}},ResponseBase.prototype._setStatusProperties=function(t){const s=t/100|0;this.status=this.statusCode=t,this.statusType=s,this.info=1==s,this.ok=2==s,this.redirect=3==s,this.clientError=4==s,this.serverError=5==s,this.error=(4==s||5==s)&&this.toError(),this.created=201==t,this.accepted=202==t,this.noContent=204==t,this.badRequest=400==t,this.unauthorized=401==t,this.notAcceptable=406==t,this.forbidden=403==t,this.notFound=404==t,this.unprocessableEntity=422==t}; + +},{"./utils":17}],17:[function(require,module,exports){ +"use strict";exports.type=(e=>e.split(/ *; */).shift()),exports.params=(e=>e.split(/ *; */).reduce((e,t)=>{const s=t.split(/ *= */),i=s.shift(),r=s.shift();return i&&r&&(e[i]=r),e},{})),exports.parseLinks=(e=>e.split(/ *, */).reduce((e,t)=>{const s=t.split(/ *; */),i=s[0].slice(1,-1);return e[s[1].split(/ *= */)[1].slice(1,-1)]=i,e},{})),exports.cleanHeader=((e,t)=>(delete e["content-type"],delete e["content-length"],delete e["transfer-encoding"],delete e.host,t&&(delete e.authorization,delete e.cookie),e)); + +},{}],18:[function(require,module,exports){ +var toString=Object.prototype.toString;module.exports=function(e){switch(toString.call(e)){case"[object Function]":return"function";case"[object Date]":return"date";case"[object RegExp]":return"regexp";case"[object Arguments]":return"arguments";case"[object Array]":return"array";case"[object String]":return"string"}if("object"==typeof e&&e&&"number"==typeof e.length)try{if("function"==typeof e.callee)return"arguments"}catch(e){if(e instanceof TypeError)return"arguments"}return null===e?"null":void 0===e?"undefined":e&&1===e.nodeType?"element":e===Object(e)?"object":typeof e}; + +},{}],19:[function(require,module,exports){ +module.exports={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,menuitem:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}; + +},{}],20:[function(require,module,exports){ +(function (global){ +"use strict";const type=require("type-of"),request=require("superagent"),h=require("hyperscript-string"),$=require("domtastic"),rivets=require("rivets");$.fn.clear=function(){return this.forEach(e=>{e.innerHTML=""}),this},$.fn.outerHTML=function(){return this.prop("outerHTML")};const state={message:"",knowledge:[],conversation:[],error:!1};function _error(e,t,{response:s}){s=s?[s.status,s.text]:[],console.warn(`[${e} ${t}]`,...s)}function send_message(e="",t){request.post("/message").send(e).then(({body:e})=>{state.conversation.push({text:e})},e=>{_error("POST","/message",e),t&&t()})}function _const(e,t,s){return Object.defineProperty(e,t,{value:s,writable:!1,enumerable:!0,configurable:!0}),e}send_message(),$(".Conversation-input").on("keydown",e=>{let t=state.message;if("Enter"==e.code&&!e.shiftKey&&!e.altKey&&!e.ctrlKey){if(""==t)return;return state.message="",state.conversation.push({text:t.split(/\s*[\n\r]+\s*/g),is_user:!0}),send_message(t,()=>{state.error=!0}),!1}}).on("paste",e=>{e.preventDefault();let t=e.clipboardData.getData("text/plain");return document.execCommand("insertHTML",!1,t),!1});const{Binding:Binding}=rivets._;rivets._.Binding=class extends Binding{parseTarget(){return this.binder.parseTarget&&Object.assign(this,this.binder.parseTarget(this.keypath)),super.parseTarget()}publish(){_const(this,"state","publish");super.publish();_const(this,"state")}},rivets.binders.input={parseTarget(e){let t;return[e,t]=e.trim().split(/\s*\?\s*/),{keypath:e,empty_class:t}},bind:function(e){this._empty=!0,$(e).on("input.rv-input",this.publish),this._watch=(()=>{e.innerHTML="",""==e.innerHTML&&clearInterval(this._watcher)})},unbind:function(e){$(e).off(".rv-input"),clearInterval(this._watcher)},routine:function(e,t){"publish"!=this.state&&(clearInterval(this._watcher),e.innerText=t),state.error=!1,this._empty=""==t,this._empty&&(this._watcher=setInterval(this._watch,30)),this.empty_class&&$(e).toggleClass(this.empty_class,this._empty)},getValue:function(e){return e.innerText.trim()}},global.$state=state,rivets.bind(document.body,state); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"domtastic":4,"hyperscript-string":5,"rivets":10,"superagent":13,"type-of":18}]},{},[20]) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3dpa2lhLWlzLWFuc3dlcmVkL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIuLi93aWtpYS1pcy1hbnN3ZXJlZC9ub2RlX21vZHVsZXMvYXJyaWZ5L2luZGV4LmpzIiwiLi4vd2lraWEtaXMtYW5zd2VyZWQvbm9kZV9tb2R1bGVzL2NsYXNzbmFtZXMvaW5kZXguanMiLCIuLi93aWtpYS1pcy1hbnN3ZXJlZC9ub2RlX21vZHVsZXMvY29tcG9uZW50LWVtaXR0ZXIvaW5kZXguanMiLCIuLi93aWtpYS1pcy1hbnN3ZXJlZC9ub2RlX21vZHVsZXMvZG9tdGFzdGljL2Rpc3QvZG9tdGFzdGljLmpzIiwiLi4vd2lraWEtaXMtYW5zd2VyZWQvbm9kZV9tb2R1bGVzL2h5cGVyc2NyaXB0LXN0cmluZy9zcmMvaW5kZXguanMiLCIuLi93aWtpYS1pcy1hbnN3ZXJlZC9ub2RlX21vZHVsZXMvaHlwZXJzY3JpcHQtc3RyaW5nL3NyYy9yZW5kZXIuanMiLCIuLi93aWtpYS1pcy1hbnN3ZXJlZC9ub2RlX21vZHVsZXMvaHlwZXJzY3JpcHQtc3RyaW5nL3NyYy91dGlscy5qcyIsIi4uL3dpa2lhLWlzLWFuc3dlcmVkL25vZGVfbW9kdWxlcy9pcy1wbGFpbi1vYmplY3QvaW5kZXguanMiLCIuLi93aWtpYS1pcy1hbnN3ZXJlZC9ub2RlX21vZHVsZXMvaXNvYmplY3QvaW5kZXguanMiLCIuLi93aWtpYS1pcy1hbnN3ZXJlZC9ub2RlX21vZHVsZXMvcml2ZXRzL2Rpc3Qvcml2ZXRzLmpzIiwiLi4vd2lraWEtaXMtYW5zd2VyZWQvbm9kZV9tb2R1bGVzL3NpZ2h0Z2xhc3MvaW5kZXguanMiLCIuLi93aWtpYS1pcy1hbnN3ZXJlZC9ub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvYWdlbnQtYmFzZS5qcyIsIi4uL3dpa2lhLWlzLWFuc3dlcmVkL25vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi9jbGllbnQuanMiLCIuLi93aWtpYS1pcy1hbnN3ZXJlZC9ub2RlX21vZHVsZXMvc3VwZXJhZ2VudC9saWIvaXMtb2JqZWN0LmpzIiwiLi4vd2lraWEtaXMtYW5zd2VyZWQvbm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL3JlcXVlc3QtYmFzZS5qcyIsIi4uL3dpa2lhLWlzLWFuc3dlcmVkL25vZGVfbW9kdWxlcy9zdXBlcmFnZW50L2xpYi9yZXNwb25zZS1iYXNlLmpzIiwiLi4vd2lraWEtaXMtYW5zd2VyZWQvbm9kZV9tb2R1bGVzL3N1cGVyYWdlbnQvbGliL3V0aWxzLmpzIiwiLi4vd2lraWEtaXMtYW5zd2VyZWQvbm9kZV9tb2R1bGVzL3R5cGUtb2YvaW5kZXguanMiLCIuLi93aWtpYS1pcy1hbnN3ZXJlZC9ub2RlX21vZHVsZXMvdm9pZC1lbGVtZW50cy9pbmRleC5qcyIsImFwcC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTtBQ0ZBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJcInVzZSBzdHJpY3RcIjttb2R1bGUuZXhwb3J0cz1mdW5jdGlvbihyKXtyZXR1cm4gbnVsbD09cj9bXTpBcnJheS5pc0FycmF5KHIpP3I6W3JdfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltbHVaR1Y0TG1weklsMHNJbTVoYldWeklqcGJJbTF2WkhWc1pTSXNJbVY0Y0c5eWRITWlMQ0oyWVd3aUxDSkJjbkpoZVNJc0ltbHpRWEp5WVhraVhTd2liV0Z3Y0dsdVozTWlPaUpCUVVGQkxHRkJRMEZCTEU5QlFVOURMRkZCUVZVc1UwRkJWVU1zUjBGRE1VSXNUMEZCU1VFc1RVRkJRVUVzUlVGRFNTeEhRVWRFUXl4TlFVRk5ReXhSUVVGUlJpeEhRVUZQUVN4RlFVRk5MRU5CUVVOQklpd2labWxzWlNJNklrVTZYRnhYYjNKcmMzQmhZMlZjWEhkcGEybGhMV2x6TFdGdWMzZGxjbVZrWEZ4dWIyUmxYMjF2WkhWc1pYTmNYR0Z5Y21sbWVWeGNhVzVrWlhndWFuTWlmUT09IiwiIWZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9e30uaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gbigpe2Zvcih2YXIgcj1bXSx0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIGY9YXJndW1lbnRzW3RdO2lmKGYpe3ZhciBvPXR5cGVvZiBmO2lmKFwic3RyaW5nXCI9PT1vfHxcIm51bWJlclwiPT09bylyLnB1c2goZik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGYpJiZmLmxlbmd0aCl7dmFyIGk9bi5hcHBseShudWxsLGYpO2kmJnIucHVzaChpKX1lbHNlIGlmKFwib2JqZWN0XCI9PT1vKWZvcih2YXIgYSBpbiBmKWUuY2FsbChmLGEpJiZmW2FdJiZyLnB1c2goYSl9fXJldHVybiByLmpvaW4oXCIgXCIpfVwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzPyhuLmRlZmF1bHQ9bixtb2R1bGUuZXhwb3J0cz1uKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJlwib2JqZWN0XCI9PXR5cGVvZiBkZWZpbmUuYW1kJiZkZWZpbmUuYW1kP2RlZmluZShcImNsYXNzbmFtZXNcIixbXSxmdW5jdGlvbigpe3JldHVybiBufSk6d2luZG93LmNsYXNzTmFtZXM9bn0oKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltbHVaR1Y0TG1weklsMHNJbTVoYldWeklqcGJJbWhoYzA5M2JpSXNJbWhoYzA5M2JsQnliM0JsY25SNUlpd2lZMnhoYzNOT1lXMWxjeUlzSW1Oc1lYTnpaWE1pTENKcElpd2lZWEpuZFcxbGJuUnpJaXdpYkdWdVozUm9JaXdpWVhKbklpd2lZWEpuVkhsd1pTSXNJbkIxYzJnaUxDSkJjbkpoZVNJc0ltbHpRWEp5WVhraUxDSnBibTVsY2lJc0ltRndjR3g1SWl3aWEyVjVJaXdpWTJGc2JDSXNJbXB2YVc0aUxDSnRiMlIxYkdVaUxDSmxlSEJ2Y25Seklpd2laR1ZtWVhWc2RDSXNJbVJsWm1sdVpTSXNJbUZ0WkNJc0luZHBibVJ2ZHlKZExDSnRZWEJ3YVc1bmN5STZJa05CVDBNc1YwRkRRU3hoUVVWQkxFbEJRVWxCTEVWQlFWTXNSMEZCUjBNc1pVRkZhRUlzVTBGQlUwTXNTVUZIVWl4SlFVWkJMRWxCUVVsRExFVkJRVlVzUjBGRlRFTXNSVUZCU1N4RlFVRkhRU3hGUVVGSlF5eFZRVUZWUXl4UFFVRlJSaXhKUVVGTExFTkJRekZETEVsQlFVbEhMRVZCUVUxR0xGVkJRVlZFTEVkQlEzQkNMRWRCUVV0SExFVkJRVXdzUTBGRlFTeEpRVUZKUXl4VFFVRnBRa1FzUlVGRmNrSXNSMEZCWjBJc1YwRkJXa01zUjBGQmIwTXNWMEZCV2tFc1JVRkRNMEpNTEVWQlFWRk5MRXRCUVV0R0xGRkJRMUFzUjBGQlNVY3NUVUZCVFVNc1VVRkJVVW9zU1VGQlVVRXNSVUZCU1VRc1QwRkJVU3hEUVVNMVF5eEpRVUZKVFN4RlFVRlJWaXhGUVVGWFZ5eE5RVUZOTEV0QlFVMU9MRWRCUXk5Q1N5eEhRVU5JVkN4RlFVRlJUU3hMUVVGTFJ5eFJRVVZTTEVkQlFXZENMRmRCUVZwS0xFVkJRMVlzU1VGQlN5eEpRVUZKVFN4TFFVRlBVQ3hGUVVOWVVDeEZRVUZQWlN4TFFVRkxVaXhGUVVGTFR5eEpRVUZSVUN4RlFVRkpUeXhKUVVOb1ExZ3NSVUZCVVUwc1MwRkJTMHNzU1VGTmFrSXNUMEZCVDFnc1JVRkJVV0VzUzBGQlN5eExRVWRETEc5Q1FVRllReXhSUVVFd1FrRXNUMEZCVDBNc1UwRkRNME5vUWl4RlFVRlhhVUlzVVVGQlZXcENMRVZCUTNKQ1pTeFBRVUZQUXl4UlFVRlZhRUlzUjBGRFZ5eHRRa0ZCV0d0Q0xGRkJRU3RETEdsQ1FVRm1RU3hQUVVGUFF5eExRVUZ2UWtRc1QwRkJUME1zU1VGRmJrWkVMRTlCUVU4c1lVRkJZeXhIUVVGSkxGZEJRM2hDTEU5QlFVOXNRaXhKUVVkU2IwSXNUMEZCVDNCQ0xGZEJRV0ZCTEVWQk1VTjBRaUlzSW1acGJHVWlPaUpGT2x4Y1YyOXlhM053WVdObFhGeDNhV3RwWVMxcGN5MWhibk4zWlhKbFpGeGNibTlrWlY5dGIyUjFiR1Z6WEZ4amJHRnpjMjVoYldWelhGeHBibVJsZUM1cWN5SjkiLCJmdW5jdGlvbiBFbWl0dGVyKHQpe2lmKHQpcmV0dXJuIG1peGluKHQpfWZ1bmN0aW9uIG1peGluKHQpe2Zvcih2YXIgZSBpbiBFbWl0dGVyLnByb3RvdHlwZSl0W2VdPUVtaXR0ZXIucHJvdG90eXBlW2VdO3JldHVybiB0fVwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUmJihtb2R1bGUuZXhwb3J0cz1FbWl0dGVyKSxFbWl0dGVyLnByb3RvdHlwZS5vbj1FbWl0dGVyLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9LCh0aGlzLl9jYWxsYmFja3NbXCIkXCIrdF09dGhpcy5fY2FsbGJhY2tzW1wiJFwiK3RdfHxbXSkucHVzaChlKSx0aGlzfSxFbWl0dGVyLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSgpe3RoaXMub2ZmKHQsaSksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIGkuZm49ZSx0aGlzLm9uKHQsaSksdGhpc30sRW1pdHRlci5wcm90b3R5cGUub2ZmPUVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPUVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e30sMD09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fY2FsbGJhY2tzPXt9LHRoaXM7dmFyIGkscj10aGlzLl9jYWxsYmFja3NbXCIkXCIrdF07aWYoIXIpcmV0dXJuIHRoaXM7aWYoMT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1tcIiRcIit0XSx0aGlzO2Zvcih2YXIgcz0wO3M8ci5sZW5ndGg7cysrKWlmKChpPXJbc10pPT09ZXx8aS5mbj09PWUpe3Iuc3BsaWNlKHMsMSk7YnJlYWt9cmV0dXJuIHRoaXN9LEVtaXR0ZXIucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e307dmFyIGU9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSksaT10aGlzLl9jYWxsYmFja3NbXCIkXCIrdF07aWYoaSlmb3IodmFyIHI9MCxzPShpPWkuc2xpY2UoMCkpLmxlbmd0aDtyPHM7KytyKWlbcl0uYXBwbHkodGhpcyxlKTtyZXR1cm4gdGhpc30sRW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fSx0aGlzLl9jYWxsYmFja3NbXCIkXCIrdF18fFtdfSxFbWl0dGVyLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLmxpc3RlbmVycyh0KS5sZW5ndGh9O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW1sdVpHVjRMbXB6SWwwc0ltNWhiV1Z6SWpwYklrVnRhWFIwWlhJaUxDSnZZbW9pTENKdGFYaHBiaUlzSW10bGVTSXNJbkJ5YjNSdmRIbHdaU0lzSW0xdlpIVnNaU0lzSW1WNGNHOXlkSE1pTENKdmJpSXNJbUZrWkVWMlpXNTBUR2x6ZEdWdVpYSWlMQ0psZG1WdWRDSXNJbVp1SWl3aWRHaHBjeUlzSWw5allXeHNZbUZqYTNNaUxDSndkWE5vSWl3aWIyNWpaU0lzSW05bVppSXNJbUZ3Y0d4NUlpd2lZWEpuZFcxbGJuUnpJaXdpY21WdGIzWmxUR2x6ZEdWdVpYSWlMQ0p5WlcxdmRtVkJiR3hNYVhOMFpXNWxjbk1pTENKeVpXMXZkbVZGZG1WdWRFeHBjM1JsYm1WeUlpd2liR1Z1WjNSb0lpd2lZMklpTENKallXeHNZbUZqYTNNaUxDSnBJaXdpYzNCc2FXTmxJaXdpWlcxcGRDSXNJbUZ5WjNNaUxDSnpiR2xqWlNJc0ltTmhiR3dpTENKc1pXNGlMQ0pzYVhOMFpXNWxjbk1pTENKb1lYTk1hWE4wWlc1bGNuTWlYU3dpYldGd2NHbHVaM01pT2lKQlFXVkJMRk5CUVZOQkxGRkJRVkZETEVkQlEyWXNSMEZCU1VFc1JVRkJTeXhQUVVGUFF5eE5RVUZOUkN4SFFWZDRRaXhUUVVGVFF5eE5RVUZOUkN4SFFVTmlMRWxCUVVzc1NVRkJTVVVzUzBGQlQwZ3NVVUZCVVVrc1ZVRkRkRUpJTEVWQlFVbEZMRWRCUVU5SUxGRkJRVkZKTEZWQlFWVkVMRWRCUlM5Q0xFOUJRVTlHTEVWQk1VSmhMRzlDUVVGWVNTeFRRVU5VUVN4UFFVRlBReXhSUVVGVlRpeFRRWEZEYmtKQkxGRkJRVkZKTEZWQlFWVkhMRWRCUTJ4Q1VDeFJRVUZSU1N4VlFVRlZTU3hwUWtGQmJVSXNVMEZCVTBNc1JVRkJUME1zUjBGSmJrUXNUMEZJUVVNc1MwRkJTME1zVjBGQllVUXNTMEZCUzBNc1dVRkJZeXhKUVVOd1EwUXNTMEZCUzBNc1YwRkJWeXhKUVVGTlNDeEhRVUZUUlN4TFFVRkxReXhYUVVGWExFbEJRVTFJTEVsQlFWVXNTVUZETjBSSkxFdEJRVXRJTEVkQlEwUkRMRTFCWVZSWUxGRkJRVkZKTEZWQlFWVlZMRXRCUVU4c1UwRkJVMHdzUlVGQlQwTXNSMEZEZGtNc1UwRkJVMGdzU1VGRFVFa3NTMEZCUzBrc1NVRkJTVTRzUlVGQlQwWXNSMEZEYUVKSExFVkJRVWROTEUxQlFVMU1MRXRCUVUxTkxGZEJTMnBDTEU5QlJrRldMRVZCUVVkSExFZEJRVXRCTEVWQlExSkRMRXRCUVV0S0xFZEJRVWRGTEVWQlFVOUdMRWRCUTFKSkxFMUJZVlJZTEZGQlFWRkpMRlZCUVZWWExFbEJRMnhDWml4UlFVRlJTU3hWUVVGVll5eGxRVU5zUW14Q0xGRkJRVkZKTEZWQlFWVmxMRzFDUVVOc1FtNUNMRkZCUVZGSkxGVkJRVlZuUWl4dlFrRkJjMElzVTBGQlUxZ3NSVUZCVDBNc1IwRkpkRVFzUjBGSVFVTXNTMEZCUzBNc1YwRkJZVVFzUzBGQlMwTXNXVUZCWXl4SFFVZHFReXhIUVVGTFN5eFZRVUZWU1N4UFFVVnFRaXhQUVVSQlZpeExRVUZMUXl4WFFVRmhMRWRCUTFoRUxFdEJTVlFzU1VGVlNWY3NSVUZXUVVNc1JVRkJXVm9zUzBGQlMwTXNWMEZCVnl4SlFVRk5TQ3hIUVVOMFF5eEpRVUZMWXl4RlFVRlhMRTlCUVU5YUxFdEJSM1pDTEVkQlFVa3NSMEZCUzAwc1ZVRkJWVWtzVDBGRmFrSXNZMEZFVDFZc1MwRkJTME1zVjBGQlZ5eEpRVUZOU0N4SFFVTjBRa1VzUzBGTFZDeEpRVUZMTEVsQlFVbGhMRVZCUVVrc1JVRkJSMEVzUlVGQlNVUXNSVUZCVlVZc1QwRkJVVWNzU1VGRmNFTXNTVUZFUVVZc1JVRkJTME1zUlVGQlZVTXNUVUZEU21Rc1IwRkJUVmtzUlVGQlIxb3NTMEZCVDBFc1JVRkJTU3hEUVVNM1FtRXNSVUZCVlVVc1QwRkJUMFFzUlVGQlJ5eEhRVU53UWl4TlFVZEtMRTlCUVU5aUxFMUJWMVJZTEZGQlFWRkpMRlZCUVZWelFpeExRVUZQTEZOQlFWTnFRaXhIUVVOb1EwVXNTMEZCUzBNc1YwRkJZVVFzUzBGQlMwTXNXVUZCWXl4SFFVTnlReXhKUVVGSlpTeEZRVUZQTEVkQlFVZERMRTFCUVUxRExFdEJRVXRhTEZWQlFWY3NSMEZEYUVOTkxFVkJRVmxhTEV0QlFVdERMRmRCUVZjc1NVRkJUVWdzUjBGRmRFTXNSMEZCU1dNc1JVRkZSaXhKUVVGTExFbEJRVWxETEVWQlFVa3NSVUZCUjAwc1IwRkVhRUpRTEVWQlFWbEJMRVZCUVZWTExFMUJRVTBzU1VGRFNWQXNUMEZCVVVjc1JVRkJTVTBzU1VGQlQwNHNSVUZEYWtSRUxFVkJRVlZETEVkQlFVZFNMRTFCUVUxTUxFdEJRVTFuUWl4SFFVazNRaXhQUVVGUGFFSXNUVUZYVkZnc1VVRkJVVWtzVlVGQlZUSkNMRlZCUVZrc1UwRkJVM1JDTEVkQlJYSkRMRTlCUkVGRkxFdEJRVXRETEZkQlFXRkVMRXRCUVV0RExGbEJRV01zUjBGRE9VSkVMRXRCUVV0RExGZEJRVmNzU1VGQlRVZ3NTVUZCVlN4SlFWZDZRMVFzVVVGQlVVa3NWVUZCVlRSQ0xHRkJRV1VzVTBGQlUzWkNMRWRCUTNoRExGRkJRVlZGTEV0QlFVdHZRaXhWUVVGVmRFSXNSMEZCVDFraUxDSm1hV3hsSWpvaVJUcGNYRmR2Y210emNHRmpaVnhjZDJscmFXRXRhWE10WVc1emQyVnlaV1JjWEc1dlpHVmZiVzlrZFd4bGMxeGNZMjl0Y0c5dVpXNTBMV1Z0YVhSMFpYSmNYR2x1WkdWNExtcHpJbjA9IiwiIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9ZXx8c2VsZikuJD10KCl9KHRoaXMsZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgZSx0LG49XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30saT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5sZW5ndGgsbj1uZXcgQXJyYXkodCksaT0wO2k8dDtpKyspbltpXT1lW2ldO3JldHVybiBufSxyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1lLmxlbmd0aDtpZih2b2lkIDAhPT1pJiZ2b2lkIDA9PT1lLm5vZGVUeXBlKWZvcih2YXIgcj0wO3I8aTtyKyspdC5jYWxsKG4sZVtyXSxyLGUpO2Vsc2UgdC5jYWxsKG4sZSwwLGUpO3JldHVybiBlfSxvPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHQ+MT90LTE6MCksaT0xO2k8dDtpKyspbltpLTFdPWFyZ3VtZW50c1tpXTtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXX0pLGV9LHU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZmlsdGVyKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuaW5kZXhPZih0KT09PW59KX0scz0hMSxjPS9eXFxzKjwoXFx3K3whKVtePl0qPi8sZj0vXjwoXFx3KylcXHMqXFwvPz4oPzo8XFwvXFwxPnwpJC8sYT0vXlsuI10/W1xcdy1dKiQvLGw9ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZih2b2lkIDA9PT10JiYodD1kb2N1bWVudCksZSl7aWYoZSBpbnN0YW5jZW9mIHkpcmV0dXJuIGU7XCJzdHJpbmdcIiE9dHlwZW9mIGU/bj1lLm5vZGVUeXBlfHxlPT09d2luZG93P1tlXTplOmMudGVzdChlKT9uPXYoZSk6KHQ9XCJzdHJpbmdcIj09dHlwZW9mIHQ/ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KTp0Lmxlbmd0aD90WzBdOnQsbj1wKGUsdCkpfWVsc2Ugbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKG51bGwpO3JldHVybiBtKG4pfSxkPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiByKHRoaXMsZnVuY3Rpb24obil7cmV0dXJuIHIocChlLG4pLGZ1bmN0aW9uKGUpey0xPT09dC5pbmRleE9mKGUpJiZ0LnB1c2goZSl9KX0pLGwodCl9LGg9KGU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIEVsZW1lbnQ/RWxlbWVudC5wcm90b3R5cGU6bix0PWUubWF0Y2hlc3x8ZS5tYXRjaGVzU2VsZWN0b3J8fGUubW96TWF0Y2hlc1NlbGVjdG9yfHxlLm1zTWF0Y2hlc1NlbGVjdG9yfHxlLm9NYXRjaGVzU2VsZWN0b3J8fGUud2Via2l0TWF0Y2hlc1NlbGVjdG9yLGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuY2FsbChlLG4pfSkscD1mdW5jdGlvbihlLHQpe2lmKGEudGVzdChlKSl7aWYoXCIjXCI9PT1lWzBdKXt2YXIgbj0odC5nZXRFbGVtZW50QnlJZD90OmRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChlLnNsaWNlKDEpKTtyZXR1cm4gbj9bbl06W119cmV0dXJuXCIuXCI9PT1lWzBdP3QuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlLnNsaWNlKDEpKTp0LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpfXJldHVybiB0LnF1ZXJ5U2VsZWN0b3JBbGwoZSl9LHY9ZnVuY3Rpb24oZSl7aWYoZi50ZXN0KGUpKXJldHVybltkb2N1bWVudC5jcmVhdGVFbGVtZW50KFJlZ0V4cC4kMSldO3ZhciB0PVtdLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxpPW4uY2hpbGROb2RlcztuLmlubmVySFRNTD1lO2Zvcih2YXIgcj0wLG89aS5sZW5ndGg7cjxvO3IrKyl0LnB1c2goaVtyXSk7cmV0dXJuIHR9LG09ZnVuY3Rpb24oZSl7cmV0dXJuIHN8fCh5LnByb3RvdHlwZT1sLmZuLHkucHJvdG90eXBlLmNvbnN0cnVjdG9yPXkscz0hMCksbmV3IHkoZSl9LHk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aDt0PG47KXRoaXNbdF09ZVt0KytdO3RoaXMubGVuZ3RoPW59LGI9T2JqZWN0LmZyZWV6ZSh7JDpsLGZpbmQ6ZCxtYXRjaGVzOmgsRE9NdGFzdGljOnl9KSxnPUFycmF5LnByb3RvdHlwZSxFPWcuZXZlcnksTj1mdW5jdGlvbihlLHQpe3JldHVybiByKHRoaXMsZSx0KX0sQz1OLE89Zy5pbmRleE9mLHc9Zy5tYXAsVD1nLnBvcCxqPWcucHVzaCxBPWcucmVkdWNlLEw9Zy5yZWR1Y2VSaWdodCxEPWcuc2hpZnQsej1nLnNvbWUsXz1nLnVuc2hpZnQsTT1PYmplY3QuZnJlZXplKHtldmVyeTpFLGZpbHRlcjpmdW5jdGlvbihlLHQpe3ZhciBuPVwiZnVuY3Rpb25cIj09dHlwZW9mIGU/ZTpmdW5jdGlvbih0KXtyZXR1cm4gaCh0LGUpfTtyZXR1cm4gbChnLmZpbHRlci5jYWxsKHRoaXMsbix0KSl9LGZvckVhY2g6TixlYWNoOkMsaW5kZXhPZjpPLG1hcDp3LHBvcDpULHB1c2g6aixyZWR1Y2U6QSxyZWR1Y2VSaWdodDpMLHJldmVyc2U6ZnVuY3Rpb24oKXtyZXR1cm4gbChpKHRoaXMpLnJldmVyc2UoKSl9LHNoaWZ0OkQsc29tZTp6LHVuc2hpZnQ6X30pO2Z1bmN0aW9uIHgoZSl7dmFyIHQ9ZnVuY3Rpb24oKXt5LmNhbGwodGhpcyxsLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpKX07cmV0dXJuIG8odC5wcm90b3R5cGUsZSksdH12YXIgUz1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC8tKFtcXGRhLXpdKS9naSxmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9KX0sUD1PYmplY3QuZnJlZXplKHtjc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbixpLG87aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpe2lmKGU9UyhlKSx2b2lkIDA9PT10KXt2YXIgdT10aGlzLm5vZGVUeXBlP3RoaXM6dGhpc1swXTtyZXR1cm4gdT9mdW5jdGlvbihlKXtyZXR1cm4haXNOYU4ocGFyc2VGbG9hdChlKSkmJmlzRmluaXRlKGUpfShvPXUuc3R5bGVbZV0pP3BhcnNlRmxvYXQobyk6bzp2b2lkIDB9KG49e30pW2VdPXR9ZWxzZSBmb3IoaSBpbiBuPWUpbz1uW2ldLGRlbGV0ZSBuW2ldLG5bUyhpKV09bztyZXR1cm4gcih0aGlzLGZ1bmN0aW9uKGUpe2ZvcihpIGluIG4pbltpXXx8MD09PW5baV0/ZS5zdHlsZVtpXT1uW2ldOmUuc3R5bGUucmVtb3ZlUHJvcGVydHkoaS5yZXBsYWNlKC8oW2EtelxcZF0pKFtBLVpdKS9nLFwiJDEtJDJcIikudG9Mb3dlckNhc2UoKSl9KSx0aGlzfX0pLEg9QXJyYXkucHJvdG90eXBlLmZvckVhY2gsJD1mdW5jdGlvbiBlKHQpe2lmKHRoaXMgaW5zdGFuY2VvZiBOb2RlKWlmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXRoaXMuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYmVmb3JlZW5kXCIsdCk7ZWxzZSBpZih0IGluc3RhbmNlb2YgTm9kZSl0aGlzLmFwcGVuZENoaWxkKHQpO2Vsc2V7dmFyIG49dCBpbnN0YW5jZW9mIE5vZGVMaXN0P2kodCk6dDtILmNhbGwobix0aGlzLmFwcGVuZENoaWxkLmJpbmQodGhpcykpfWVsc2Ugayh0aGlzLGUsdCk7cmV0dXJuIHRoaXN9LEk9ZnVuY3Rpb24gZSh0KXtpZih0aGlzIGluc3RhbmNlb2YgTm9kZSlpZihcInN0cmluZ1wiPT10eXBlb2YgdCl0aGlzLmluc2VydEFkamFjZW50SFRNTChcImJlZm9yZWJlZ2luXCIsdCk7ZWxzZSBpZih0IGluc3RhbmNlb2YgTm9kZSl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsdGhpcyk7ZWxzZXt2YXIgbj10IGluc3RhbmNlb2YgTm9kZUxpc3Q/aSh0KTp0O0guY2FsbChuLGUuYmluZCh0aGlzKSl9ZWxzZSBrKHRoaXMsZSx0KTtyZXR1cm4gdGhpc30sQj1mdW5jdGlvbihlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZT9lOmUgaW5zdGFuY2VvZiBOb2RlP2UuY2xvbmVOb2RlKCEwKTpcImxlbmd0aFwiaW4gZT9bXS5tYXAuY2FsbChlLGZ1bmN0aW9uKGUpe3JldHVybiBlLmNsb25lTm9kZSghMCl9KTplfSxrPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIGk9ZS5sZW5ndGg7aS0tOyl7dmFyIHI9MD09PWk/bjpCKG4pO3QuY2FsbChlW2ldLHIpfX0scT1PYmplY3QuZnJlZXplKHthcHBlbmQ6JCxwcmVwZW5kOmZ1bmN0aW9uIGUodCl7aWYodGhpcyBpbnN0YW5jZW9mIE5vZGUpaWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpdGhpcy5pbnNlcnRBZGphY2VudEhUTUwoXCJhZnRlcmJlZ2luXCIsdCk7ZWxzZSBpZih0IGluc3RhbmNlb2YgTm9kZSl0aGlzLmluc2VydEJlZm9yZSh0LHRoaXMuZmlyc3RDaGlsZCk7ZWxzZXt2YXIgbj10IGluc3RhbmNlb2YgTm9kZUxpc3Q/aSh0KTp0O0guY2FsbChuLnJldmVyc2UoKSxlLmJpbmQodGhpcykpfWVsc2Ugayh0aGlzLGUsdCk7cmV0dXJuIHRoaXN9LGJlZm9yZTpJLGFmdGVyOmZ1bmN0aW9uIGUodCl7aWYodGhpcyBpbnN0YW5jZW9mIE5vZGUpaWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpdGhpcy5pbnNlcnRBZGphY2VudEhUTUwoXCJhZnRlcmVuZFwiLHQpO2Vsc2UgaWYodCBpbnN0YW5jZW9mIE5vZGUpdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpO2Vsc2V7dmFyIG49dCBpbnN0YW5jZW9mIE5vZGVMaXN0P2kodCk6dDtILmNhbGwobi5yZXZlcnNlKCksZS5iaW5kKHRoaXMpKX1lbHNlIGsodGhpcyxlLHQpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBsKEIodGhpcykpfSxfY2xvbmU6QixfZWFjaDprfSksRj1PYmplY3QuZnJlZXplKHthdHRyOmZ1bmN0aW9uKGUsdCl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUmJnZvaWQgMD09PXQpe3ZhciBuPXRoaXMubm9kZVR5cGU/dGhpczp0aGlzWzBdO3JldHVybiBuP24uZ2V0QXR0cmlidXRlKGUpOnZvaWQgMH1yZXR1cm4gcih0aGlzLGZ1bmN0aW9uKG4pe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBlKWZvcih2YXIgaSBpbiBlKW4uc2V0QXR0cmlidXRlKGksZVtpXSk7ZWxzZSBuLnNldEF0dHJpYnV0ZShlLHQpfSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHIodGhpcyxmdW5jdGlvbih0KXtyZXR1cm4gdC5yZW1vdmVBdHRyaWJ1dGUoZSl9KX19KSxSPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIodGhpcyxmdW5jdGlvbihuKXtyZXR1cm4gbi5jbGFzc0xpc3RbZV0odCl9KX0sVT1PYmplY3QuZnJlZXplKHthZGRDbGFzczpmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5sZW5ndGgmJnIoZS5zcGxpdChcIiBcIiksUi5iaW5kKHRoaXMsXCJhZGRcIikpLHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLmxlbmd0aCYmcihlLnNwbGl0KFwiIFwiKSxSLmJpbmQodGhpcyxcInJlbW92ZVwiKSksdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXtpZihlJiZlLmxlbmd0aCl7dmFyIG49XCJib29sZWFuXCI9PXR5cGVvZiB0P3Q/XCJhZGRcIjpcInJlbW92ZVwiOlwidG9nZ2xlXCI7cihlLnNwbGl0KFwiIFwiKSxSLmJpbmQodGhpcyxuKSl9cmV0dXJuIHRoaXN9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3JldHVybih0aGlzLm5vZGVUeXBlP1t0aGlzXTp0aGlzKS5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucyhlKX0pfX0pLEs9ZnVuY3Rpb24oZSx0KXtyZXR1cm4hKCFlfHwhdHx8ZT09PXQpJiYoZS5jb250YWlucz9lLmNvbnRhaW5zKHQpOiEhZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmIShlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpJk5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRElTQ09OTkVDVEVEKSl9LFc9T2JqZWN0LmZyZWV6ZSh7Y29udGFpbnM6S30pLFo9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGRvY3VtZW50JiZcImRhdGFzZXRcImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxHPVo/XCJkYXRhc2V0XCI6XCJfX0RPTVRBU1RJQ19EQVRBX19cIixKPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLy0rKC4pPy9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOlwiXCJ9KX0sUT1PYmplY3QuZnJlZXplKHtkYXRhOmZ1bmN0aW9uKGUsdCl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUmJnZvaWQgMD09PXQpe3ZhciBuPXRoaXMubm9kZVR5cGU/dGhpczp0aGlzWzBdO3JldHVybiBuJiZHIGluIG4/bltHXVtKKGUpXTp2b2lkIDB9cmV0dXJuIHIodGhpcyxmdW5jdGlvbihuKXtafHwobltHXT1uW0ddfHx7fSksbltHXVtKKGUpXT10fSl9LHByb3A6ZnVuY3Rpb24oZSx0KXtpZihcInN0cmluZ1wiPT10eXBlb2YgZSYmdm9pZCAwPT09dCl7dmFyIG49dGhpcy5ub2RlVHlwZT90aGlzOnRoaXNbMF07cmV0dXJuIG4mJm4/bltlXTp2b2lkIDB9cmV0dXJuIHIodGhpcyxmdW5jdGlvbihuKXtyZXR1cm4gbltlXT10fSl9fSksVj1PYmplY3QuZnJlZXplKHthcHBlbmRUbzpmdW5jdGlvbihlKXt2YXIgdD1cInN0cmluZ1wiPT10eXBlb2YgZT9sKGUpOmU7cmV0dXJuICQuY2FsbCh0LHRoaXMpLHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHIodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9XCJcIn0pfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLGZ1bmN0aW9uKGUpe2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfSl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7cmV0dXJuIEkuYXBwbHkodGhpcyxhcmd1bWVudHMpLnJlbW92ZSgpfSx0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXNbMF0udGV4dENvbnRlbnQ6cih0aGlzLGZ1bmN0aW9uKHQpe3JldHVybiB0LnRleHRDb250ZW50PVwiXCIrZX0pfSx2YWw6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5sZW5ndGg+MD90aGlzWzBdLnZhbHVlOnZvaWQgMDpyKHRoaXMsZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWU9ZX0pfX0pLFg9T2JqZWN0LmZyZWV6ZSh7aHRtbDpmdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lKXt2YXIgdD10aGlzLm5vZGVUeXBlP3RoaXM6dGhpc1swXTtyZXR1cm4gdD90LmlubmVySFRNTDp2b2lkIDB9cmV0dXJuIHIodGhpcyxmdW5jdGlvbih0KXtyZXR1cm4gdC5pbm5lckhUTUw9ZX0pfX0pLFk9ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbihlLHQpe3ZhciBuPVtdO3JldHVybiByKHRoaXMsZnVuY3Rpb24oaSl7Zm9yKDtpJiZpIT09dDspe2lmKGgoaSxlKSl7bi5wdXNoKGkpO2JyZWFrfWk9aS5wYXJlbnRFbGVtZW50fX0pLGwodShuKSl9O3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiBFbGVtZW50JiZFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0P2Z1bmN0aW9uKHQsbil7aWYobilyZXR1cm4gZS5jYWxsKHRoaXMsdCxuKTt2YXIgaT1bXTtyZXR1cm4gcih0aGlzLGZ1bmN0aW9uKGUpe3ZhciBuPWUuY2xvc2VzdCh0KTtuJiZpLnB1c2gobil9KSxsKHUoaSkpfTplfSgpLGVlPU9iamVjdC5mcmVlemUoe2Nsb3Nlc3Q6WX0pLHRlPWZ1bmN0aW9uKGUsdCxuLGksbyl7dmFyIHUscyxjLGY9dGhpcztyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiYobj10LHQ9bnVsbCksZS5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXt1PWEuc3BsaXQoXCIuXCIpLGE9dVswXXx8bnVsbCxzPXVbMV18fG51bGwsYz1mZShuKSxyKGYsZnVuY3Rpb24ocil7aWYodCYmKGM9cGUuYmluZChyLHQsYykpLG8pe3ZhciB1PWM7Yz1mdW5jdGlvbihvKXtuZS5jYWxsKHIsZSx0LG4saSksdS5jYWxsKHIsbyl9fXIuYWRkRXZlbnRMaXN0ZW5lcihhLGMsaXx8ITEpLHNlKHIpLnB1c2goe2V2ZW50TmFtZTphLGhhbmRsZXI6bixldmVudExpc3RlbmVyOmMsc2VsZWN0b3I6dCxuYW1lc3BhY2U6c30pfSl9LHRoaXMpLHRoaXN9LG5lPWZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLHUscyxjPXRoaXM7cmV0dXJuIHZvaWQgMD09PWUmJihlPVwiXCIpLFwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJihuPXQsdD1udWxsKSxlLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBvPWUuc3BsaXQoXCIuXCIpLGU9b1swXXx8bnVsbCx1PW9bMV18fG51bGwscihjLGZ1bmN0aW9uKG8pe3M9c2UobykscihzLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4hKGUmJmkuZXZlbnROYW1lIT09ZXx8dSYmaS5uYW1lc3BhY2UhPT11fHxuJiZpLmhhbmRsZXIhPT1ufHx0JiZpLnNlbGVjdG9yIT09dCl9KSxmdW5jdGlvbihlKXtvLnJlbW92ZUV2ZW50TGlzdGVuZXIoZS5ldmVudE5hbWUsZS5ldmVudExpc3RlbmVyLGl8fCExKSxzLnNwbGljZShzLmluZGV4T2YoZSksMSl9KSxlfHx1fHx0fHxuPzA9PT1zLmxlbmd0aCYmY2Uobyk6Y2Uobyl9KX0sdGhpcyksdGhpc30saWU9XCJfX2RvbXRhc3RpY19ldmVudF9fXCIscmU9MSxvZT17fSx1ZT1bXSxzZT1mdW5jdGlvbihlKXtlW2llXXx8KGVbaWVdPTA9PT11ZS5sZW5ndGg/KytyZTp1ZS5wb3AoKSk7dmFyIHQ9ZVtpZV07cmV0dXJuIG9lW3RdfHwob2VbdF09W10pfSxjZT1mdW5jdGlvbihlKXt2YXIgdD1lW2llXTtvZVt0XSYmKG9lW3RdPW51bGwsZVtpZV09bnVsbCx1ZS5wdXNoKHQpKX0sZmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmNhbGwodGhpcyxoZSh0KSl9fSxhZT17cHJldmVudERlZmF1bHQ6XCJpc0RlZmF1bHRQcmV2ZW50ZWRcIixzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246XCJpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZFwiLHN0b3BQcm9wYWdhdGlvbjpcImlzUHJvcGFnYXRpb25TdG9wcGVkXCJ9LGxlPWZ1bmN0aW9uKCl7cmV0dXJuITB9LGRlPWZ1bmN0aW9uKCl7cmV0dXJuITF9LGhlPWZ1bmN0aW9uKGUpe2lmKCFlLmlzRGVmYXVsdFByZXZlbnRlZHx8ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb258fGUuc3RvcFByb3BhZ2F0aW9uKXtmb3IodmFyIHQgaW4gYWUpIWZ1bmN0aW9uKHQsbixpKXtlW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbbl09bGUsaSYmaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGVbbl09ZGV9KHQsYWVbdF0sZVt0XSk7ZS5fcHJldmVudERlZmF1bHQmJmUucHJldmVudERlZmF1bHQoKX1yZXR1cm4gZX0scGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPW4uX3RhcmdldHx8bi50YXJnZXQscj1ZLmNhbGwoW2ldLGUsdGhpcylbMF07ciYmciE9PXRoaXMmJihyIT09aSYmbi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCYmbi5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpfHx0LmNhbGwocixuKSl9LHZlPXRlLG1lPW5lLHllPU9iamVjdC5mcmVlemUoe29uOnRlLG9mZjpuZSxvbmU6ZnVuY3Rpb24oZSx0LG4saSl7cmV0dXJuIHRlLmNhbGwodGhpcyxlLHQsbixpLDEpfSxnZXRIYW5kbGVyczpzZSxjbGVhckhhbmRsZXJzOmNlLHByb3h5SGFuZGxlcjpmZSxkZWxlZ2F0ZUhhbmRsZXI6cGUsYmluZDp2ZSx1bmJpbmQ6bWV9KSxiZT0vXihtb3VzZShkb3dufHVwfG92ZXJ8b3V0fGVudGVyfGxlYXZlfG1vdmUpfGNvbnRleHRtZW51fChkYmwpP2NsaWNrKSQvLGdlPS9ea2V5KGRvd258cHJlc3N8dXApJC8sRWU9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXZvaWQgMD09PW4/e306bixvPWkuYnViYmxlcyx1PXZvaWQgMD09PW98fG8scz1pLmNhbmNlbGFibGUsYz12b2lkIDA9PT1zfHxzLGY9aS5wcmV2ZW50RGVmYXVsdCxhPXZvaWQgMCE9PWYmJmYsbD1uZXcoTmUoZSkpKGUse2J1YmJsZXM6dSxjYW5jZWxhYmxlOmMscHJldmVudERlZmF1bHQ6YSxkZXRhaWw6dH0pO3JldHVybiBsLl9wcmV2ZW50RGVmYXVsdD1hLHIodGhpcyxmdW5jdGlvbihuKXshdXx8amV8fENlKG4pP1RlKG4sbCk6T2UobixlLHtidWJibGVzOnUsY2FuY2VsYWJsZTpjLHByZXZlbnREZWZhdWx0OmEsZGV0YWlsOnR9KX0pfSxOZT1mdW5jdGlvbihlKXtyZXR1cm4gQWU/YmUudGVzdChlKT9Nb3VzZUV2ZW50OmdlLnRlc3QoZSk/S2V5Ym9hcmRFdmVudDpDdXN0b21FdmVudDpDdXN0b21FdmVudH0sQ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT13aW5kb3d8fGU9PT1kb2N1bWVudHx8SyhlLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGUpfSxPZT1mdW5jdGlvbihlLHQsbil7dm9pZCAwPT09biYmKG49e30pLG4uYnViYmxlcz0hMTt2YXIgaT1uZXcgQ3VzdG9tRXZlbnQodCxuKTtpLl90YXJnZXQ9ZTtkb3tUZShlLGkpfXdoaWxlKGU9ZS5wYXJlbnROb2RlKX0sd2U9W1wiYmx1clwiLFwiZm9jdXNcIixcInNlbGVjdFwiLFwic3VibWl0XCJdLFRlPWZ1bmN0aW9uKGUsdCl7LTE9PT13ZS5pbmRleE9mKHQudHlwZSl8fFwiZnVuY3Rpb25cIiE9dHlwZW9mIGVbdC50eXBlXXx8dC5fcHJldmVudERlZmF1bHR8fHQuY2FuY2VsYWJsZT9lLmRpc3BhdGNoRXZlbnQodCk6ZVt0LnR5cGVdKCl9OyFmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9e2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMSxkZXRhaWw6dm9pZCAwfSk7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtyZXR1cm4gbi5pbml0Q3VzdG9tRXZlbnQoZSx0LmJ1YmJsZXMsdC5jYW5jZWxhYmxlLHQuZGV0YWlsKSxufTtlLnByb3RvdHlwZT1uLkN1c3RvbUV2ZW50JiZuLkN1c3RvbUV2ZW50LnByb3RvdHlwZSxuLkN1c3RvbUV2ZW50PWV9KCk7dmFyIGplPWZ1bmN0aW9uKCl7dmFyIGU9ITEsdD1uLmRvY3VtZW50O2lmKHQpe3ZhciBpPXQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxyPWkuY2xvbmVOb2RlKCk7aS5hcHBlbmRDaGlsZChyKSxpLmFkZEV2ZW50TGlzdGVuZXIoXCJlXCIsZnVuY3Rpb24oKXtlPSEwfSksci5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImVcIix7YnViYmxlczohMH0pKX1yZXR1cm4gZX0oKSxBZT1mdW5jdGlvbigpe3RyeXtuZXcgTW91c2VFdmVudChcImNsaWNrXCIpfWNhdGNoKGUpe3JldHVybiExfXJldHVybiEwfSgpLExlPU9iamVjdC5mcmVlemUoe3RyaWdnZXI6RWUsdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSx0KXt0aGlzWzBdJiZFZS5jYWxsKHRoaXNbMF0sZSx0LHtidWJibGVzOiExLHByZXZlbnREZWZhdWx0OiEwfSl9fSksRGU9T2JqZWN0LmZyZWV6ZSh7cmVhZHk6ZnVuY3Rpb24oZSl7cmV0dXJuL2NvbXBsZXRlfGxvYWRlZHxpbnRlcmFjdGl2ZS8udGVzdChkb2N1bWVudC5yZWFkeVN0YXRlKSYmZG9jdW1lbnQuYm9keT9lKCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIixlLCExKSx0aGlzfX0pLHplPW4uJCxfZT1PYmplY3QuZnJlZXplKHtub0NvbmZsaWN0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uJD16ZSx0aGlzfX0pLE1lPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGwoW10uc2xpY2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0seGU9T2JqZWN0LmZyZWV6ZSh7Y2hpbGRyZW46ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuIHIodGhpcyxmdW5jdGlvbihuKXtuLmNoaWxkcmVuJiZyKG4uY2hpbGRyZW4sZnVuY3Rpb24obil7KCFlfHxlJiZoKG4sZSkpJiZ0LnB1c2gobil9KX0pLGwodCl9LGNvbmNhdDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiByKGwoZSksZnVuY3Rpb24oZSl7LTE9PT1bXS5pbmRleE9mLmNhbGwodCxlKSYmW10ucHVzaC5jYWxsKHQsZSl9KSx0aGlzfSxjb250ZW50czpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiByKHRoaXMsZnVuY3Rpb24odCl7cmV0dXJuIGUucHVzaC5hcHBseShlLGkodC5jaGlsZE5vZGVzKSl9KSxsKGUpfSxlcTpmdW5jdGlvbihlKXtyZXR1cm4gTWUuY2FsbCh0aGlzLGUsZSsxKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gTWUuY2FsbCh0aGlzLDAsMSl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpc1tlXX0scGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiByKHRoaXMsZnVuY3Rpb24obil7KCFlfHxlJiZoKG4ucGFyZW50Tm9kZSxlKSkmJnQucHVzaChuLnBhcmVudE5vZGUpfSksbCh0KX0sc2libGluZ3M6ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuIHIodGhpcyxmdW5jdGlvbihuKXtyZXR1cm4gcihuLnBhcmVudE5vZGUuY2hpbGRyZW4sZnVuY3Rpb24oaSl7aSE9PW4mJighZXx8ZSYmaChpLGUpKSYmdC5wdXNoKGkpfSl9KSxsKHQpfSxzbGljZTpNZX0pLFNlPUFycmF5LmlzQXJyYXksUGU9T2JqZWN0LmZyZWV6ZSh7aXNGdW5jdGlvbjpmdW5jdGlvbihlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBlfSxpc0FycmF5OlNlfSksSGU9e30sJGU9e307cmV0dXJuIHZvaWQgMCE9PWImJigoJGU9bCkubWF0Y2hlcz1oLEhlLmZpbmQ9ZCksbygkZSxXLF9lLFBlKSxvKEhlLE0sUCxGLHEsVSxRLFYsWCx5ZSxMZSxEZSxlZSx4ZSksJGUuZm49SGUsJGUudmVyc2lvbj1cIjAuMTUuMTJcIiwkZS5leHRlbmQ9bywkZS5CYXNlQ2xhc3M9eCgkZS5mbiksJGV9KTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltUnZiWFJoYzNScFl5NXFjeUpkTENKdVlXMWxjeUk2V3lKbmJHOWlZV3dpTENKbVlXTjBiM0o1SWl3aVpYaHdiM0owY3lJc0ltMXZaSFZzWlNJc0ltUmxabWx1WlNJc0ltRnRaQ0lzSW5ObGJHWWlMQ0lrSWl3aWRHaHBjeUlzSW1OdmJuUmxlSFFpTENKZmJXRjBZMmhsY3lJc0luZHBiaUlzSW5kcGJtUnZkeUlzSW5SdlFYSnlZWGtpTENKamIyeHNaV04wYVc5dUlpd2liR1Z1WjNSb0lpd2ljbVZ6ZFd4MElpd2lRWEp5WVhraUxDSnBJaXdpWldGamFDSXNJbU5oYkd4aVlXTnJJaXdpZEdocGMwRnlaeUlzSW5WdVpHVm1hVzVsWkNJc0ltNXZaR1ZVZVhCbElpd2lZMkZzYkNJc0ltVjRkR1Z1WkNJc0luUmhjbWRsZENJc0lsOXNaVzRpTENKaGNtZDFiV1Z1ZEhNaUxDSnpiM1Z5WTJWeklpd2lYMnRsZVNJc0ltWnZja1ZoWTJnaUxDSnpjbU1pTENKd2NtOXdJaXdpZFc1cGNTSXNJbVpwYkhSbGNpSXNJbWwwWlcwaUxDSnBibVJsZUNJc0ltbHVaR1Y0VDJZaUxDSnBjMUJ5YjNSdmRIbHdaVk5sZENJc0luSmxSbkpoWjIxbGJuUWlMQ0p5WlZOcGJtZHNaVlJoWnlJc0luSmxVMmx0Y0d4bFUyVnNaV04wYjNJaUxDSnpaV3hsWTNSdmNpSXNJbVJ2WTNWdFpXNTBJaXdpUkU5TmRHRnpkR2xqSWl3aWRHVnpkQ0lzSW1OeVpXRjBaVVp5WVdkdFpXNTBJaXdpY1hWbGNubFRaV3hsWTNSdmNpSXNJbkYxWlhKNVUyVnNaV04wYjNKQmJHd2lMQ0ozY21Gd0lpd2labWx1WkNJc0ltNXZaR1Z6SWl3aWJtOWtaU0lzSW1Ob2FXeGtJaXdpY0hWemFDSXNJbTFoZEdOb1pYTWlMQ0pGYkdWdFpXNTBJaXdpY0hKdmRHOTBlWEJsSWl3aWJXRjBZMmhsYzFObGJHVmpkRzl5SWl3aWJXOTZUV0YwWTJobGMxTmxiR1ZqZEc5eUlpd2liWE5OWVhSamFHVnpVMlZzWldOMGIzSWlMQ0p2VFdGMFkyaGxjMU5sYkdWamRHOXlJaXdpZDJWaWEybDBUV0YwWTJobGMxTmxiR1ZqZEc5eUlpd2laV3hsYldWdWRDSXNJbWRsZEVWc1pXMWxiblJDZVVsa0lpd2ljMnhwWTJVaUxDSm5aWFJGYkdWdFpXNTBjMEo1UTJ4aGMzTk9ZVzFsSWl3aVoyVjBSV3hsYldWdWRITkNlVlJoWjA1aGJXVWlMQ0pvZEcxc0lpd2lZM0psWVhSbFJXeGxiV1Z1ZENJc0lsSmxaMFY0Y0NJc0lpUXhJaXdpWld4bGJXVnVkSE1pTENKamIyNTBZV2x1WlhJaUxDSmphR2xzWkhKbGJpSXNJbU5vYVd4a1RtOWtaWE1pTENKcGJtNWxja2hVVFV3aUxDSnNJaXdpWm00aUxDSmpiMjV6ZEhKMVkzUnZjaUlzSWs5aWFtVmpkQ0lzSW1aeVpXVjZaU0lzSWtGeWNtRjVVSEp2ZEc4aUxDSmxkbVZ5ZVNJc0ltVmhZMmdrTVNJc0ltMWhjQ0lzSW5CdmNDSXNJbkpsWkhWalpTSXNJbkpsWkhWalpWSnBaMmgwSWl3aWMyaHBablFpTENKemIyMWxJaXdpZFc1emFHbG1kQ0lzSW1GeWNtRjVJaXdpY21WMlpYSnpaU0lzSWtKaGMyVkRiR0Z6Y3lJc0ltRndhU0lzSW1Gd2NHeDVJaXdpWTJGdFpXeHBlbVVpTENKMllXeDFaU0lzSW5KbGNHeGhZMlVpTENKc1pYUjBaWElpTENKMGIxVndjR1Z5UTJGelpTSXNJbU56Y3lReElpd2lZM056SWl3aWEyVjVJaXdpYzNSNWJHVlFjbTl3Y3lJc0luWmhiQ0lzSW1selRtRk9JaXdpY0dGeWMyVkdiRzloZENJc0ltbHpSbWx1YVhSbElpd2lhWE5PZFcxbGNtbGpJaXdpYzNSNWJHVWlMQ0p5WlcxdmRtVlFjbTl3WlhKMGVTSXNJblJ2VEc5M1pYSkRZWE5sSWl3aVptOXlSV0ZqYUNReElpd2lZWEJ3Wlc1a0lpd2lUbTlrWlNJc0ltbHVjMlZ5ZEVGa2FtRmpaVzUwU0ZSTlRDSXNJbUZ3Y0dWdVpFTm9hV3hrSWl3aVRtOWtaVXhwYzNRaUxDSmlhVzVrSWl3aVgyVmhZMmdpTENKaVpXWnZjbVVpTENKd1lYSmxiblJPYjJSbElpd2lhVzV6WlhKMFFtVm1iM0psSWl3aVgyTnNiMjVsSWl3aVkyeHZibVZPYjJSbElpd2laV3dpTENKbGJHMGlMQ0prYjIwaUxDSndjbVZ3Wlc1a0lpd2labWx5YzNSRGFHbHNaQ0lzSW1GbWRHVnlJaXdpYm1WNGRGTnBZbXhwYm1jaUxDSmpiRzl1WlNJc0ltUnZiVjloZEhSeUlpd2lZWFIwY2lJc0ltZGxkRUYwZEhKcFluVjBaU0lzSWw5aGRIUnlJaXdpYzJWMFFYUjBjbWxpZFhSbElpd2ljbVZ0YjNabFFYUjBjaUlzSW5KbGJXOTJaVUYwZEhKcFluVjBaU0lzSWw5bFlXTm9KREVpTENKbWJrNWhiV1VpTENKamJHRnpjMDVoYldVaUxDSmpiR0Z6YzB4cGMzUWlMQ0prYjIxZlkyeGhjM01pTENKaFpHUkRiR0Z6Y3lJc0luTndiR2wwSWl3aWNtVnRiM1psUTJ4aGMzTWlMQ0owYjJkbmJHVkRiR0Z6Y3lJc0luTjBZWFJsSWl3aVlXTjBhVzl1SWl3aWFHRnpRMnhoYzNNaUxDSmpiMjUwWVdsdWN5SXNJbU52YlhCaGNtVkViMk4xYldWdWRGQnZjMmwwYVc5dUlpd2lSRTlEVlUxRlRsUmZVRTlUU1ZSSlQwNWZSRWxUUTA5T1RrVkRWRVZFSWl3aVpHOXRYMk52Ym5SaGFXNXpJaXdpYVhOVGRYQndiM0owYzBSaGRHRlRaWFFpTENKa2IyTjFiV1Z1ZEVWc1pXMWxiblFpTENKRVFWUkJTMFZaVUZKUFVDSXNJbU5oYldWc2FYcGxKREVpTENKemRISWlMQ0p0WVhSamFDSXNJbU5vWVhJaUxDSmtiMjFmWkdGMFlTSXNJbVJoZEdFaUxDSmtiMjFmWlhoMGNtRWlMQ0poY0hCbGJtUlVieUlzSW1WdGNIUjVJaXdpY21WdGIzWmxJaXdpY21WdGIzWmxRMmhwYkdRaUxDSnlaWEJzWVdObFYybDBhQ0lzSW5SbGVIUWlMQ0owWlhoMFEyOXVkR1Z1ZENJc0ltUnZiVjlvZEcxc0lpd2labkpoWjIxbGJuUWlMQ0pqYkc5elpYTjBJaXdpY0dGeVpXNTBSV3hsYldWdWRDSXNJbTRpTENKelpXeGxZM1J2Y2w5amJHOXpaWE4wSWl3aWIyNGlMQ0psZG1WdWRFNWhiV1Z6SWl3aWFHRnVaR3hsY2lJc0luVnpaVU5oY0hSMWNtVWlMQ0p2Ym1ObElpd2ljR0Z5ZEhNaUxDSnVZVzFsYzNCaFkyVWlMQ0psZG1WdWRFeHBjM1JsYm1WeUlpd2lYM1JvYVhNaUxDSmxkbVZ1ZEU1aGJXVWlMQ0p3Y205NGVVaGhibVJzWlhJaUxDSmtaV3hsWjJGMFpVaGhibVJzWlhJaUxDSnNhWE4wWlc1bGNpSXNJbVYyWlc1MElpd2liMlptSWl3aVlXUmtSWFpsYm5STWFYTjBaVzVsY2lJc0ltZGxkRWhoYm1Sc1pYSnpJaXdpYUdGdVpHeGxjbk1pTENKZmRHaHBjeklpTENKeVpXMXZkbVZGZG1WdWRFeHBjM1JsYm1WeUlpd2ljM0JzYVdObElpd2lZMnhsWVhKSVlXNWtiR1Z5Y3lJc0ltVjJaVzUwUzJWNVVISnZjQ0lzSW1sa0lpd2lkVzUxYzJWa1MyVjVjeUlzSW1GMVoyMWxiblJGZG1WdWRDSXNJbVYyWlc1MFRXVjBhRzlrY3lJc0luQnlaWFpsYm5SRVpXWmhkV3gwSWl3aWMzUnZjRWx0YldWa2FXRjBaVkJ5YjNCaFoyRjBhVzl1SWl3aWMzUnZjRkJ5YjNCaFoyRjBhVzl1SWl3aWNtVjBkWEp1VkhKMVpTSXNJbkpsZEhWeWJrWmhiSE5sSWl3aWFYTkVaV1poZFd4MFVISmxkbVZ1ZEdWa0lpd2liV1YwYUc5a1RtRnRaU0lzSW5SbGMzUk5aWFJvYjJST1lXMWxJaXdpYjNKcFoybHVZV3hOWlhSb2IyUWlMQ0pmY0hKbGRtVnVkRVJsWm1GMWJIUWlMQ0psZG1WdWRGUmhjbWRsZENJc0lsOTBZWEpuWlhRaUxDSmpkWEp5Wlc1MFZHRnlaMlYwSWl3aWFYTlFjbTl3WVdkaGRHbHZibE4wYjNCd1pXUWlMQ0oxYm1KcGJtUWlMQ0p2Ym1VaUxDSnlaVTF2ZFhObFJYWmxiblFpTENKeVpVdGxlVVYyWlc1MElpd2lkSEpwWjJkbGNpSXNJblI1Y0dVaUxDSmZkR1Z0Y0NJc0lsOXlaV1lpTENKZmNtVm1KR0oxWW1Kc1pYTWlMQ0ppZFdKaWJHVnpJaXdpWDNKbFppUmpZVzVqWld4aFlteGxJaXdpWTJGdVkyVnNZV0pzWlNJc0lsOXlaV1lrY0hKbGRtVnVkRVJsWm1GMWJIUWlMQ0puWlhSRmRtVnVkRU52Ym5OMGNuVmpkRzl5SWl3aVpHVjBZV2xzSWl3aWFYTkZkbVZ1ZEVKMVltSnNhVzVuU1c1RVpYUmhZMmhsWkZSeVpXVWlMQ0pwYzBGMGRHRmphR1ZrVkc5RWIyTjFiV1Z1ZENJc0ltUnBjM0JoZEdOb1JYWmxiblFpTENKMGNtbG5aMlZ5Um05eVVHRjBhQ0lzSW1selUzVndjRzl5ZEhOUGRHaGxja1YyWlc1MFEyOXVjM1J5ZFdOMGIzSnpJaXdpVFc5MWMyVkZkbVZ1ZENJc0lrdGxlV0p2WVhKa1JYWmxiblFpTENKRGRYTjBiMjFGZG1WdWRDSXNJbTkzYm1WeVJHOWpkVzFsYm5RaUxDSndZWEpoYlhNaUxDSmthWEpsWTNSRmRtVnVkRTFsZEdodlpITWlMQ0pqZFhOMGIyMUZkbVZ1ZENJc0ltTnlaV0YwWlVWMlpXNTBJaXdpYVc1cGRFTjFjM1J2YlVWMlpXNTBJaXdpYVhOQ2RXSmliR2x1WnlJc0ltUnZZeUlzSW5CaGNtVnVkQ0lzSW1VaUxDSmxkbVZ1ZEY5MGNtbG5aMlZ5SWl3aWRISnBaMmRsY2toaGJtUnNaWElpTENKbGRtVnVkRjl5WldGa2VTSXNJbkpsWVdSNUlpd2ljbVZoWkhsVGRHRjBaU0lzSW1KdlpIa2lMQ0p3Y21WMmFXOTFjMHhwWWlJc0ltNXZZMjl1Wm14cFkzUWlMQ0p1YjBOdmJtWnNhV04wSWl3aWMzUmhjblFpTENKbGJtUWlMQ0p6Wld4bFkzUnZjbDlsZUhSeVlTSXNJbU52Ym1OaGRDSXNJbU52Ym5SbGJuUnpJaXdpWlhFaUxDSm1hWEp6ZENJc0ltZGxkQ0lzSW5OcFlteHBibWR6SWl3aWMybGliR2x1WnlJc0ltbHpRWEp5WVhraUxDSnBjMFoxYm1OMGFXOXVJaXdpYjJKcUlpd2lKQ1F4SWl3aWRtVnljMmx2YmlKZExDSnRZWEJ3YVc1bmN5STZJa05CUVVNc1UwRkJWVUVzUlVGQlVVTXNSMEZEUlN4cFFrRkJXa01zVTBGQk1FTXNiMEpCUVZoRExFOUJRWGxDUVN4UFFVRlBSQ3hSUVVGVlJDeEpRVU01UkN4dFFrRkJXRWNzVVVGQmVVSkJMRTlCUVU5RExFbEJRVTFFTEU5QlFVOUlMRWxCUTI1RVJDeEZRVUZUUVN4SFFVRlZUU3hOUVVGaFF5eEZRVUZKVGl4SlFVaDJReXhEUVVsRlR5eExRVUZOTEZkQlFXTXNZVUZWY0VJc1NVRm5TMDFETEVWQlJVRkRMRVZCYkV0R1F5eEZRVUYzUWl4dlFrRkJXRU1zVDBGQmVVSkJMRTlCUVZNc1IwRlRMME5ETEVWQlFWVXNVMEZCYVVKRExFZEJTVGRDTEVsQlNFRXNTVUZCU1VNc1JVRkJVMFFzUlVGQlYwTXNUMEZEY0VKRExFVkJRVk1zU1VGQlNVTXNUVUZCVFVZc1IwRkZaRWNzUlVGQlNTeEZRVUZIUVN4RlFVRkpTQ3hGUVVGUlJ5eEpRVU14UWtZc1JVRkJUMFVzUjBGQlMwb3NSVUZCVjBrc1IwRkhla0lzVDBGQlQwWXNSMEZYVEVjc1JVRkJUeXhUUVVGalRDeEZRVUZaVFN4RlFVRlZReXhIUVVNM1F5eEpRVUZKVGl4RlFVRlRSQ3hGUVVGWFF5eFBRVVY0UWl4UlFVRmxUeXhKUVVGWVVDeFJRVUZuUkU4c1NVRkJlRUpTTEVWQlFWZFRMRk5CUTNKRExFbEJRVXNzU1VGQlNVd3NSVUZCU1N4RlFVRkhRU3hGUVVGSlNDeEZRVUZSUnl4SlFVTXhRa1VzUlVGQlUwa3NTMEZCUzBnc1JVRkJVMUFzUlVGQlYwa3NSMEZCU1VFc1JVRkJSMG9zVVVGSE0wTk5MRVZCUVZOSkxFdEJRVXRJTEVWQlFWTlFMRVZCUVZrc1JVRkJSMEVzUjBGSGVFTXNUMEZCVDBFc1IwRmxURmNzUlVGQlV5eFRRVUZuUWtNc1IwRkRNMElzU1VGQlN5eEpRVUZKUXl4RlFVRlBReXhWUVVGVllpeFBRVUZSWXl4RlFVRlZMRWxCUVVsYUxFMUJRVTFWTEVWQlFVOHNSVUZCU1VFc1JVRkJUeXhGUVVGSkxFZEJRVWxITEVWQlFVOHNSVUZCUjBFc1JVRkJUMGdzUlVGQlRVY3NTVUZEY2tkRUxFVkJRVkZETEVWQlFVOHNSMEZCUzBZc1ZVRkJWVVVzUjBGUmFFTXNUMEZNUVVRc1JVRkJVVVVzVVVGQlVTeFRRVUZWUXl4SFFVTjRRaXhKUVVGTExFbEJRVWxETEV0QlFWRkVMRVZCUTJaT0xFVkJRVTlQTEVkQlFWRkVMRVZCUVVsRExFdEJSMmhDVUN4SFFWVk1VU3hGUVVGUExGTkJRV053UWl4SFFVTjJRaXhQUVVGUFFTeEZRVUZYY1VJc1QwRkJUeXhUUVVGVlF5eEZRVUZOUXl4SFFVTjJReXhQUVVGUGRrSXNSVUZCVjNkQ0xGRkJRVkZHTEV0QlFWVkRMRXRCVDNCRFJTeEhRVUZwUWl4RlFVTnFRa01zUlVGQllTeHhRa0ZEWWtNc1JVRkJZeXcyUWtGRFpFTXNSVUZCYlVJc1owSkJlVU51UW01RExFVkJka0paTEZOQlFXMUNiME1zUlVGQlZXeERMRWRCU3pORExFbEJRVWxMTEVWQlJVb3NVVUZPWjBJc1NVRkJXa3dzU1VGRFJrRXNSVUZCVlcxRExGVkJTMUJFTEVWQlJVVXNRMEZCUVN4SFFVRkpRU3hoUVVGdlFrVXNSVUZETjBJc1QwRkJUMFlzUlVGRGMwSXNhVUpCUVdKQkxFVkJRMmhDTjBJc1JVRkJZVFpDTEVWQlFWTndRaXhWUVVGWmIwSXNTVUZCWVM5Q0xFOUJRVk1zUTBGQlF5dENMRWRCUVZsQkxFVkJRelZFU0N4RlFVRlhUU3hMUVVGTFNDeEhRVU42UWpkQ0xFVkJRV0ZwUXl4RlFVRmxTaXhKUVVVMVFteERMRVZCUVRaQ0xHbENRVUZhUVN4RlFVRjFRbTFETEZOQlFWTkpMR05CUVdOMlF5eEhRVUZYUVN4RlFVRlJUU3hQUVVGVFRpeEZRVUZSTEVkQlFVdEJMRVZCUTNoSFN5eEZRVUZoYTBNc1JVRkJZMHdzUlVGQlZXeERMRk5CVkhKRFN5eEZRVUZoT0VJc1UwRkJVMHNzYVVKQlFXbENMRTFCV1hwRExFOUJRVTlETEVWQlFVdHdReXhKUVdGV2NVTXNSVUZCVHl4VFFVRmpVaXhIUVVOMlFpeEpRVUZKVXl4RlFVRlJMRWRCVVZvc1QwRlFRV3BETEVWQlFVdFlMRXRCUVUwc1UwRkJWVFpETEVkQlEyNUNMRTlCUVU5c1F5eEZRVUZMTmtJc1JVRkJZMHdzUlVGQlZWVXNSMEZCVHl4VFFVRlZReXhKUVVOeVFpeEpRVUV4UWtZc1JVRkJUV1FzVVVGQlVXZENMRWxCUTJoQ1JpeEZRVUZOUnl4TFFVRkxSQ3hQUVVsV0wwTXNSVUZCUlRaRExFbEJZVkJKTEVkQlEwVXZReXhGUVVFMlFpeHZRa0ZCV21kRUxGRkJRVEJDUVN4UlFVRlJReXhWUVVGWkwwTXNSVUZGTDBSRUxFVkJRVmRFTEVWQlFWRXJReXhUUVVGWEwwTXNSVUZCVVd0RUxHbENRVUZ0UW14RUxFVkJRVkZ0UkN4dlFrRkJjMEp1UkN4RlFVRlJiMFFzYlVKQlFYRkNjRVFzUlVGQlVYRkVMR3RDUVVGdlFuSkVMRVZCUVZGelJDeHpRa0ZGY2tvc1UwRkJWVU1zUlVGQlUzSkNMRWRCUTNoQ0xFOUJRVTlxUXl4RlFVRlRZeXhMUVVGTGQwTXNSVUZCVTNKQ0xFdEJXVGxDU3l4RlFVRm5RaXhUUVVGMVFrd3NSVUZCVld4RExFZEJSMjVFTEVkQlJuVkNhVU1zUlVGQmFVSkpMRXRCUVV0SUxFZEJSWFpDTEVOQlEzQkNMRWRCUVc5Q0xFMUJRV2hDUVN4RlFVRlRMRWRCUVZrc1EwRkRka0lzU1VGQlNYRkNMRWRCUVZkMlJDeEZRVUZSZDBRc1pVRkJhVUo0UkN4RlFVRlZiVU1zVlVGQlZYRkNMR1ZCUVdWMFFpeEZRVUZUZFVJc1RVRkJUU3hKUVVNeFJpeFBRVUZQUml4RlFVRlZMRU5CUVVOQkxFZEJRVmNzUjBGSEwwSXNUVUZCYjBJc1RVRkJhRUp5UWl4RlFVRlRMRWRCUTBwc1F5eEZRVUZSTUVRc2RVSkJRWFZDZUVJc1JVRkJVM1ZDTEUxQlFVMHNTVUZIYUVSNlJDeEZRVUZSTWtRc2NVSkJRWEZDZWtJc1IwRkhkRU1zVDBGQlQyeERMRVZCUVZGM1F5eHBRa0ZCYVVKT0xFbEJWemxDU1N4RlFVRnBRaXhUUVVGM1FuTkNMRWRCUXpORExFZEJRVWsxUWl4RlFVRlpTeXhMUVVGTGRVSXNSMEZEYmtJc1RVRkJUeXhEUVVGRGVrSXNVMEZCVXpCQ0xHTkJRV05ETEU5QlFVOURMRXRCUjNoRExFbEJRVWxETEVWQlFWY3NSMEZEV0VNc1JVRkJXVGxDTEZOQlFWTXdRaXhqUVVGakxFOUJRMjVEU3l4RlFVRlhSQ3hGUVVGVlJTeFhRVU42UWtZc1JVRkJWVWNzVlVGQldWSXNSVUZGZEVJc1NVRkJTeXhKUVVGSmJrUXNSVUZCU1N4RlFVRkhORVFzUlVGQlNVZ3NSVUZCVXpWRUxFOUJRVkZITEVWQlFVazBSQ3hGUVVGSE5VUXNTVUZETVVOMVJDeEZRVUZUYkVJc1MwRkJTMjlDTEVWQlFWTjZSQ3hKUVVkNlFpeFBRVUZQZFVRc1IwRlhUSFpDTEVWQlFVOHNVMEZCWTNCRExFZEJUM1pDTEU5QlRrdDVRaXhKUVVOSVRTeEZRVUZWWVN4VlFVRlpia1FzUlVGQlJYZEZMRWRCUTNoQ2JFTXNSVUZCVldFc1ZVRkJWWE5DTEZsQlFXTnVReXhGUVVOc1EwNHNSMEZCYVVJc1IwRkhXaXhKUVVGSlRTeEZRVUZWTDBJc1NVRlhia0lyUWl4RlFVRlpMRk5CUVcxQ0wwSXNSMEZKYWtNc1NVRklRU3hKUVVGSlNTeEZRVUZKTEVWQlEwcElMRVZCUVZORUxFVkJRVmRETEU5QlJXcENSeXhGUVVGSlNDeEhRVU5VVUN4TFFVRkxWU3hIUVVGTFNpeEZRVUZYU1N4TFFVZDJRbFlzUzBGQlMwOHNUMEZCVTBFc1IwRkhXalJDTEVWQlFYZENjME1zVDBGQlQwTXNUMEZCVHl4RFFVTjRRek5GTEVWQlFVZEJMRVZCUTBnMFF5eExRVUZOUVN4RlFVTk9TeXhSUVVGVFFTeEZRVU5VV0N4VlFVRlhRU3hKUVUxVWMwTXNSVUZCWVd4RkxFMUJRVTE1UXl4VlFXTnVRakJDTEVWQlFWRkVMRVZCUVZkRExFMUJiVU51UW5KRUxFVkJRVlVzVTBGQmFVSllMRVZCUVZWRExFZEJRM1pETEU5QlFVOUdMRVZCUVV0WUxFdEJRVTFaTEVWQlFWVkRMRWxCUlRGQ1owVXNSVUZCVTNSRUxFVkJWVlJQTEVWQlFWVTJReXhGUVVGWE4wTXNVVUZoY2tKblJDeEZRVUZOU0N4RlFVRlhSeXhKUVZOcVFrTXNSVUZCVFVvc1JVRkJWMGtzU1VGVmFrSm9ReXhGUVVGUE5FSXNSVUZCVnpWQ0xFdEJZMnhDYVVNc1JVRkJVMHdzUlVGQlYwc3NUMEZqY0VKRExFVkJRV05PTEVWQlFWZE5MRmxCY1VKNlFrTXNSVUZCVVZBc1JVRkJWMDhzVFVGWmJrSkRMRVZCUVU5U0xFVkJRVmRSTEV0QlZXeENReXhGUVVGVlZDeEZRVUZYVXl4UlFVVnlRa01zUlVGQmNVSmFMRTlCUVU5RExFOUJRVThzUTBGRGNrTkZMRTFCUVU5QkxFVkJRMUJxUkN4UFFUTkpWeXhUUVVGblFsRXNSVUZCVlhSQ0xFZEJRM0pETEVsQlFVbEVMRVZCUVN0Q0xHMUNRVUZpZFVJc1JVRkJNRUpCTEVWQlFWY3NVMEZCVlhGQ0xFZEJRMjVGTEU5QlFVOVNMRVZCUVZGUkxFVkJRVk55UWl4SlFVVXhRaXhQUVVGUGNFTXNSVUZCUlRSRkxFVkJRVmRvUkN4UFFVRlBXQ3hMUVVGTGFFSXNTMEZCVFZrc1JVRkJWVU1zUzBGM1NXaEVWU3hSUVVGVFFTeEZRVU5VV2l4TFFVRk5hMFVzUlVGRFRpOURMRkZCUVZOQkxFVkJRMVJuUkN4SlFVRkxRU3hGUVVOTVF5eEpRVUZMUVN4RlFVTk1hRU1zUzBGQlRVRXNSVUZEVG1sRExFOUJRVkZCTEVWQlExSkRMRmxCUVdGQkxFVkJRMkpMTEZGQk9VTlpMRmRCUTFvc1QwRkJUM1pHTEVWQlFVVk5MRVZCUVZGTUxFMUJRVTF6Uml4WlFUaERka0pLTEUxQlFVOUJMRVZCUTFCRExFdEJRVTFCTEVWQlEwNURMRkZCUVZOQkxFbEJUVmdzVTBGQlUwY3NSVUZCVjBNc1IwRTRRbXhDTEVsQlFVbEVMRVZCUVZrc1YwRkRaR3hFTEVWQlFWVnlRaXhMUVVGTGFFSXNTMEZCVFVRc1JVRkJSVEJHTEZkQlFVMHNSVUZCVVhKRkxHRkJTWFpETEU5QlJFRklMRVZCUVU5elJTeEZRVUZWY2tNc1ZVRkJWM05ETEVkQlEzSkNSQ3hGUVU5VUxFbEJTVWxITEVWQlFWY3NVMEZCYTBKRExFZEJReTlDTEU5QlFVOUJMRVZCUVUxRExGRkJRVkVzWlVGQlowSXNVMEZCVlRWRExFVkJRVk0yUXl4SFFVTjBSQ3hQUVVGUFFTeEZRVUZQUXl4cFFrRTRSR1JETEVWQlFYRkNkRUlzVDBGQlQwTXNUMEZCVHl4RFFVTnlRM05DTEVsQk1VTlJMRk5CUVdGRExFVkJRVXRPTEVkQlF6RkNMRWxCUVVsUExFVkJRVmw2UlN4RlFVRk5NRVVzUlVGRmRFSXNSMEZCYlVJc2FVSkJRVkpHTEVWQlFXdENMRU5CUnpOQ0xFZEJSa0ZCTEVWQlFVMVFMRVZCUVZOUExGRkJSVTBzU1VGQlZrNHNSVUZCZFVJc1EwRkRhRU1zU1VGQlNXNURMRVZCUVZWNFJDeExRVUZMWlN4VFFVRlhaaXhMUVVGUFFTeExRVUZMTEVkQlJURkRMRTlCUVVsM1JDeEZRWEJEVFN4VFFVRnRRbTFETEVkQlEycERMRTlCUVZGVExFMUJRVTFETEZkQlFWZFdMRXRCUVZkWExGTkJRVk5ZTEVkQmNVTm9RMWtzUTBGRVVFb3NSVUZCVFRORExFVkJRVkZuUkN4TlFVRk5VQ3hKUVVOSlNTeFhRVUZYUml4SFFVRlBRU3hQUVVjMVF5eEhRVWRHUkN4RlFVRmhMRWxCUTBaRUxFZEJRVTlPTEU5QlNXeENMRWxCUVV0c1JTeExRVVpNZVVVc1JVRkJZVVFzUlVGSFdFVXNSVUZCVFVRc1JVRkJWM3BGTEZWQlExWjVSU3hGUVVGWGVrVXNSMEZEYkVKNVJTeEZRVUZYVWl4RlFVRlRha1VzU1VGQlV6QkZMRVZCWVdwRExFOUJWRUY0Uml4RlFVRkxXQ3hMUVVGTkxGTkJRVlYzUkN4SFFVTnVRaXhKUVVGTEwwSXNTMEZCVVhsRkxFVkJRMUJCTEVWQlFWZDZSU3hKUVVFNFFpeEpRVUZ5UW5sRkxFVkJRVmQ2UlN4SFFVTnFReXRDTEVWQlFWRm5SQ3hOUVVGTkwwVXNSMEZCVVhsRkxFVkJRVmQ2UlN4SFFVVnFReXRDTEVWQlFWRm5SQ3hOUVVGTlF5eGxRVUY1UW1oR0xFVkJiRVJvUTIxRkxGRkJRVkVzYjBKQlFYRkNMRk5CUVZOakxHbENRWE5FTlVNeFJ5eFJRVlZNTWtjc1JVRkJXV3hITEUxQlFVMTVReXhWUVVGVk0wSXNVVUZaTlVKeFJpeEZRVUZUTEZOQlFWTkJMRVZCUVU5d1JDeEhRVU16UWl4SFFVRkplRVFzWjBKQlFXZENOa2NzUzBGRGJFSXNSMEZCZFVJc2FVSkJRVnB5UkN4RlFVTlVlRVFzUzBGQlN6aEhMRzFDUVVGdFFpeFpRVUZoZEVRc1VVRkZja01zUjBGQlNVRXNZVUZCYlVKeFJDeExRVU55UWpkSExFdEJRVXNyUnl4WlFVRlpka1FzVDBGRFdpeERRVU5NTEVsQlFVbFRMRVZCUVZkVUxHRkJRVzFDZDBRc1UwRkJWek5ITEVWQlFWRnRSQ3hIUVVGWFFTeEZRVU5vUlcxRUxFVkJRVlV6Uml4TFFVRkxhVVFzUlVGQlZXcEZMRXRCUVVzclJ5eFpRVUZaUlN4TFFVRkxha2dzV1VGSmJrUnJTQ3hGUVVGTmJFZ3NTMEZCVFRSSExFVkJRVkZ3UkN4SFFVZDBRaXhQUVVGUGVFUXNUVUV3UTB4dFNDeEZRVUZUTEZOQlFWTkJMRVZCUVU4elJDeEhRVU16UWl4SFFVRkplRVFzWjBKQlFXZENOa2NzUzBGRGJFSXNSMEZCZFVJc2FVSkJRVnB5UkN4RlFVTlVlRVFzUzBGQlN6aEhMRzFDUVVGdFFpeGpRVUZsZEVRc1VVRkZka01zUjBGQlNVRXNZVUZCYlVKeFJDeExRVU55UWpkSExFdEJRVXR2U0N4WFFVRlhReXhoUVVGaE4wUXNSVUZCVTNoRUxGVkJRMnBETEVOQlEwd3NTVUZCU1dsRkxFVkJRVmRVTEdGQlFXMUNkMFFzVTBGQlZ6TkhMRVZCUVZGdFJDeEhRVUZYUVN4RlFVTm9SVzFFTEVWQlFWVXpSaXhMUVVGTGFVUXNSVUZCVld0RUxFVkJRVTlHTEV0QlFVdHFTQ3haUVVsNlEydElMRVZCUVUxc1NDeExRVUZOYlVnc1JVRkJVVE5FTEVkQlIzUkNMRTlCUVU5NFJDeE5RV2xFVEhOSUxFVkJRVk1zVTBGQlowSTVSQ3hIUVVNelFpeE5RVUYxUWl4cFFrRkJXa0VzUlVGRFJrRXNSVUZEUlVFc1lVRkJiVUp4UkN4TFFVTnlRbkpFTEVWQlFWRXJSQ3hYUVVGVkxFZEJRMmhDTEZkQlFWa3ZSQ3hGUVVOa0xFZEJRVWR6UWl4SlFVRkpPVVFzUzBGQlMzZERMRVZCUVZNc1UwRkJWV2RGTEVkQlEzQkRMRTlCUVU5QkxFVkJRVWRFTEZkQlFWVXNTMEZKYWtJdlJDeEhRVmRNTUVRc1JVRkJVU3hUUVVGbE5VY3NSVUZCV1dsRkxFVkJRVWxtTEVkQlIzcERMRWxCUmtFc1NVRkJTV01zUlVGQlNXaEZMRVZCUVZkRExFOUJSVm9yUkN4TFFVRkxMRU5CUTFZc1NVRkJTVzFFTEVWQlFWa3NTVUZCVG01RUxFVkJRVlZrTEVWQlFWVTRSQ3hGUVVGUE9VUXNSMEZEY2tObExFVkJRVWQyUkN4TFFVRkxWaXhGUVVGWFowVXNSMEZCU1cxRUxFdEJTWFpDUXl4RlFVRnRRbXBFTEU5QlFVOURMRTlCUVU4c1EwRkRia05yUXl4UFFVRlJRU3hGUVVOU1pTeFJRUzlJV1N4VFFVRlRRU3hGUVVGUmJrVXNSMEZETjBJc1IwRkJTWGhFTEdkQ1FVRm5RalpITEV0QlEyeENMRWRCUVhWQ0xHbENRVUZhY2tRc1JVRkRWSGhFTEV0QlFVczRSeXh0UWtGQmJVSXNZVUZCWTNSRUxGRkJSWFJETEVkQlFVbEJMR0ZCUVcxQ2NVUXNTMEZEY2tJM1J5eExRVUZMY1Vnc1lVRkJZVGRFTEVWQlFWTjRSQ3hMUVVGTE5FZ3NaMEpCUXpOQ0xFTkJRMHdzU1VGQlNUTkVMRVZCUVZkVUxHRkJRVzFDZDBRc1UwRkJWek5ITEVWQlFWRnRSQ3hIUVVGWFFTeEZRVU5vUlcxRUxFVkJRVlV6Uml4TFFVRkxhVVFzUlVGQlUzRkNMRlZCUVZkeFF5eEZRVUZSVml4TFFVRkxha2dzV1VGSmNFUnJTQ3hGUVVGTmJFZ3NTMEZCVFRKSUxFVkJRVk51UlN4SFFVZDJRaXhQUVVGUGVFUXNUVUZuU0ZCdFNDeFBRVUZSUVN4RlFVTlNWU3hOUVhoRlZTeFRRVUZUUVN4RlFVRk5ja1VzUjBGRGVrSXNSMEZCU1hoRUxHZENRVUZuUWpaSExFdEJRMnhDTEVkQlFYVkNMR2xDUVVGYWNrUXNSVUZEVkhoRUxFdEJRVXM0Unl4dFFrRkJiVUlzVjBGQldYUkVMRkZCUlhCRExFZEJRVWxCTEdGQlFXMUNjVVFzUzBGRGNrSTNSeXhMUVVGTGIwZ3NWMEZCVjBNc1lVRkJZVGRFTEVWQlFWTjRSQ3hMUVVGTE9FZ3NhVUpCUTNSRExFTkJRMHdzU1VGQlNUZEVMRVZCUVZkVUxHRkJRVzFDZDBRc1UwRkJWek5ITEVWQlFWRnRSQ3hIUVVGWFFTeEZRVU5vUlcxRUxFVkJRVlV6Uml4TFFVRkxhVVFzUlVGQlUzRkNMRlZCUVZkMVF5eEZRVUZOV2l4TFFVRkxha2dzV1VGSmJFUnJTQ3hGUVVGTmJFZ3NTMEZCVFRaSUxFVkJRVTl5UlN4SFFVZHlRaXhQUVVGUGVFUXNUVUY1UkZBclNDeE5RUzlEVlN4WFFVTldMRTlCUVU5b1NTeEZRVUZGZFVnc1JVRkJUM1JJTEZGQkswTm9Rbk5JTEU5QlFWRkJMRVZCUTFKS0xFMUJRVTlCTEVsQmJVUk1ZeXhGUVVGM1FuWkVMRTlCUVU5RExFOUJRVThzUTBGRGVFTjFSQ3hMUVdwRFV5eFRRVUZqYUVNc1JVRkJTMDRzUjBGRE5VSXNSMEZCYlVJc2FVSkJRVkpOTEZGQlFYRkRMRWxCUVZaT0xFVkJRWFZDTEVOQlF6TkVMRWxCUVVsdVF5eEZRVUZWZUVRc1MwRkJTMlVzVTBGQlYyWXNTMEZCVDBFc1MwRkJTeXhIUVVNeFF5eFBRVUZQZDBRc1JVRkJWVUVzUlVGQlVUQkZMR0ZCUVdGcVF5eFJRVUZQYmtZc1JVRkhMME1zVDBGQlQwZ3NSVUZCUzFnc1MwRkJUU3hUUVVGVmQwUXNSMEZETVVJc1IwRkJiVUlzYVVKQlFWSjVReXhGUVVOVUxFbEJRVXNzU1VGQlNXdERMRXRCUVZOc1F5eEZRVU5vUW5wRExFVkJRVkUwUlN4aFFVRmhSQ3hGUVVGUGJFTXNSVUZCU1d0RExGTkJSMnhETTBVc1JVRkJVVFJGTEdGQlFXRnVReXhGUVVGTFRpeE5RWE5DT1VJd1F5eFhRVkpsTEZOQlFXOUNjRU1zUjBGRGJrTXNUMEZCVDNSR0xFVkJRVXRZTEV0QlFVMHNVMEZCVlhkRUxFZEJRekZDTEU5QlFVOUJMRVZCUVZFNFJTeG5Ra0ZCWjBKeVF5eFJRVFJHTDBKelF5eEZRVUZWTEZOQlFXVkRMRVZCUVZGRExFZEJRMjVETEU5QlFVODVTQ3hGUVVGTFdDeExRVUZOTEZOQlFWVjNSQ3hIUVVNeFFpeFBRVUZQUVN4RlFVRlJhMFlzVlVGQlZVWXNSMEZCVVVNc1RVRkpha05GTEVWQlFYbENiRVVzVDBGQlQwTXNUMEZCVHl4RFFVTjZRMnRGTEZOQk5VVmhMRk5CUVd0Q2FrUXNSMEZMTDBJc1QwRktTVUVzUjBGQlUwRXNSVUZCVFhCR0xGRkJRMnBDU1N4RlFVRkxaMFlzUlVGQlRXdEVMRTFCUVUwc1MwRkJUVTRzUlVGQlVYUkNMRXRCUVV0cVNDeExRVUZOTEZGQlIzSkRRU3hOUVhkRlVEaEpMRmxCTTBSblFpeFRRVUZ4UW01RUxFZEJTM0pETEU5QlNrbEJMRWRCUVZOQkxFVkJRVTF3Uml4UlFVTnFRa2tzUlVGQlMyZEdMRVZCUVUxclJDeE5RVUZOTEV0QlFVMU9MRVZCUVZGMFFpeExRVUZMYWtnc1MwRkJUU3hYUVVkeVEwRXNUVUYxUkZBclNTeFpRWGhEWjBJc1UwRkJjVUp3UkN4RlFVRlBjVVFzUjBGRE5VTXNSMEZCU1hKRUxFZEJRVk5CTEVWQlFVMXdSaXhQUVVGUkxFTkJRM3BDTEVsQlFVa3dTU3hGUVVFd1FpeHJRa0ZCVmtRc1JVRkJjMEpCTEVWQlFWRXNUVUZCVVN4VFFVRlhMRk5CUTNKRmNra3NSVUZCUzJkR0xFVkJRVTFyUkN4TlFVRk5MRXRCUVUxT0xFVkJRVkYwUWl4TFFVRkxha2dzUzBGQlRXbEtMRWxCUnpWRExFOUJRVTlxU2l4TlFXMURVR3RLTEZOQmRrSmhMRk5CUVd0Q2RrUXNSMEZETDBJc1QwRkJVVE5HTEV0QlFVdGxMRk5CUVZjc1EwRkJRMllzVFVGQlVVRXNUVUZCVFcxR0xFdEJRVXNzVTBGQlZUTkNMRWRCUTNCRUxFOUJRVTlCTEVWQlFWRnJSaXhWUVVGVlV5eFRRVUZUZUVRc1VVRnhRMnhEZDBRc1JVRkJWeXhUUVVGclFtcEdMRVZCUVZkV0xFZEJRekZETEZOQlFVdFZMRWxCUVdOV0xFZEJRVmRWTEVsQlFXTldMRXRCUldwRFZTeEZRVUZWYVVZc1UwRkRXbXBHTEVWQlFWVnBSaXhUUVVGVE0wWXNTMEZEYWtKVkxFVkJRVlZyUml3eVFrRkRWbXhHTEVWQlFWVnJSaXgzUWtGQmQwSTFSaXhIUVVGWGNVUXNTMEZCUzNkRExHdERRVTB6UkVNc1JVRkJORUkzUlN4UFFVRlBReXhQUVVGUExFTkJRelZEZVVVc1UwRkJWVUVzU1VGTlVra3NSVUZCZDBNc2IwSkJRV0p1U0N4VlFVRTBRaXhaUVVGaFFTeFRRVUZUYjBnc1owSkJRemRGUXl4RlFVRmpSaXhGUVVGdlFpeFZRVUZaTEhGQ1FVVTVRMGNzUlVGQllTeFRRVUZyUWtNc1IwRkRha01zVDBGQlQwRXNSVUZCU1M5RUxGRkJRVkVzVlVGQlZ5eFRRVUZWWjBVc1JVRkJUME1zUjBGRE4wTXNUMEZCVDBFc1JVRkJUMEVzUlVGQlN5OUVMR05CUVdkQ0xFMUJjVVJ1UTJkRkxFVkJRWGRDY2tZc1QwRkJUME1zVDBGQlR5eERRVU40UTNGR0xFdEJkRU5UTEZOQlFXTTVSQ3hGUVVGTFRpeEhRVU0xUWl4SFFVRnRRaXhwUWtGQlVrMHNVVUZCY1VNc1NVRkJWazRzUlVGQmRVSXNRMEZETTBRc1NVRkJTVzVETEVWQlFWVjRSQ3hMUVVGTFpTeFRRVUZYWml4TFFVRlBRU3hMUVVGTExFZEJRekZETEU5QlFVOTNSQ3hIUVVGWGFVY3NTMEZCWldwSExFVkJRVlZCTEVWQlFWRnBSeXhIUVVGaFF5eEZRVUZYZWtRc1UwRkJVVzVHTEVWQlIzSkdMRTlCUVU5SUxFVkJRVXRZTEV0QlFVMHNVMEZCVlhkRUxFZEJRM0pDSzBZc1NVRkRTQzlHTEVWQlFWRnBSeXhIUVVGbGFrY3NSVUZCVVdsSExFbEJRV2RDTEVsQlIycEVha2NzUlVGQlVXbEhMRWRCUVdGRExFVkJRVmQ2UkN4SlFVRlJUaXhMUVRSQ01VTnNSU3hMUVdKVExGTkJRV04zUlN4RlFVRkxUaXhIUVVNMVFpeEhRVUZ0UWl4cFFrRkJVazBzVVVGQmNVTXNTVUZCVms0c1JVRkJkVUlzUTBGRE0wUXNTVUZCU1c1RExFVkJRVlY0UkN4TFFVRkxaU3hUUVVGWFppeExRVUZQUVN4TFFVRkxMRWRCUXpGRExFOUJRVTkzUkN4SFFVRlhRU3hGUVVGVlFTeEZRVUZSZVVNc1VVRkJUMjVHTEVWQlJ6ZERMRTlCUVU5SUxFVkJRVXRZTEV0QlFVMHNVMEZCVlhkRUxFZEJRekZDTEU5QlFVOUJMRVZCUVZGNVF5eEhRVUZQVGl4UFFYZEhkRUp4UlN4RlFVRjVRblpHTEU5QlFVOURMRTlCUVU4c1EwRkRla04xUml4VFFXNUdZU3hUUVVGclFucEhMRWRCUXk5Q0xFbEJRVWwyUkN4RlFVRTJRaXhwUWtGQlduVkVMRVZCUVhWQ2VrUXNSVUZCUlhsRUxFZEJRVmRCTEVWQlJYcEVMRTlCUkVGdlJDeEZRVUZQTlVZc1MwRkJTMllzUlVGQlUwUXNUVUZEWkVFc1RVRnBSbEJyU3l4TlFYUkZWU3hYUVVOV0xFOUJRVTkyU2l4RlFVRkxXQ3hMUVVGTkxGTkJRVlYzUkN4SFFVTXhRaXhQUVVGUFFTeEZRVUZSWVN4VlFVRlpMRTFCY1VVM1FqaEdMRTlCTVVSWExGZEJRMWdzVDBGQlQzaEtMRVZCUVV0WUxFdEJRVTBzVTBGQlZYZEVMRWRCUTNSQ1FTeEZRVUZSTkVRc1dVRkRWalZFTEVWQlFWRTBSQ3hYUVVGWFowUXNXVUZCV1RWSExFMUJkMFJ1UXpaSExGbEJPVU5uUWl4WFFVTm9RaXhQUVVGUGJFUXNSVUZCVHpGQ0xFMUJRVTE2Uml4TFFVRk5iMElzVjBGQlZ5dEpMRlZCT0VOeVEwY3NTMEZzUTFNc1UwRkJZek5GTEVkQlEzWkNMRmxCUVdNM1JTeEpRVUZXTmtVc1JVRkRTek5HTEV0QlFVc3NSMEZCUjNWTExGbEJSMVkxU2l4RlFVRkxXQ3hMUVVGTkxGTkJRVlYzUkN4SFFVTXhRaXhQUVVGUFFTeEZRVUZSSzBjc1dVRkJZeXhIUVVGTE5VVXNTMEUyUW5CRFVTeEpRV2hDVVN4VFFVRmhVaXhIUVVOeVFpeFpRVUZqTjBVc1NVRkJWalpGTEVWQlEwc3pSaXhMUVVGTFR5eFBRVUZUTEVWQlFVbFFMRXRCUVVzc1IwRkJSekpHTEZkQlFWRTNSU3hGUVVkd1EwZ3NSVUZCUzFnc1MwRkJUU3hUUVVGVmQwUXNSMEZETVVJc1QwRkJUMEVzUlVGQlVXMURMRTFCUVZGQkxFOUJjME4yUWpaRkxFVkJRWGRDTDBZc1QwRkJUME1zVDBGQlR5eERRVU40UTJJc1MwRmFVeXhUUVVGak5FY3NSMEZEZGtJc1VVRkJhVUl6U2l4SlFVRmlNa29zUlVGQmQwSXNRMEZETVVJc1NVRkJTV3BJTEVWQlFWVjRSQ3hMUVVGTFpTeFRRVUZYWml4TFFVRlBRU3hMUVVGTExFZEJRekZETEU5QlFVOTNSQ3hGUVVGVlFTeEZRVUZSWVN4bFFVRlpka1FzUlVGSGRrTXNUMEZCVDBnc1JVRkJTMWdzUzBGQlRTeFRRVUZWZDBRc1IwRkRNVUlzVDBGQlQwRXNSVUZCVVdFc1ZVRkJXVzlITEU5QmMwSXpRa01zUlVGQlZTeFhRVU5hTEVsQlFVbEJMRVZCUVZVc1UwRkJhVUoyU1N4RlFVRlZiRU1zUjBGRGRrTXNTVUZCU1RKRExFVkJRVkVzUjBGWFdpeFBRVlpCYWtNc1JVRkJTMWdzUzBGQlRTeFRRVUZWTmtNc1IwRkRia0lzUzBGQlQwRXNSMEZCVVVFc1NVRkJVelZETEVkQlFWTXNRMEZETDBJc1IwRkJTU3RETEVWQlFWRklMRVZCUVUxV0xFZEJRVmNzUTBGRE0wSlRMRVZCUVUxSExFdEJRVXRHTEVkQlExZ3NUVUZIUmtFc1JVRkJUMEVzUlVGQlN6aElMR2xDUVVkVU5Vc3NSVUZCUlRKQ0xFVkJRVXRyUWl4TFFVZG9RaXhOUVVFd1FpeHZRa0ZCV2tzc1UwRkJORUpCTEZGQlFWRkRMRlZCUVZWM1NDeFJRVUZ2UWl4VFFVRlZka2tzUlVGQlZXeERMRWRCUTJ4SExFZEJRVXRCTEVWQlYwZ3NUMEZCVDNsTExFVkJRVkV4U2l4TFFVRkxhRUlzUzBGQlRXMURMRVZCUVZWc1F5eEhRVlp3UXl4SlFVRkpNa01zUlVGQlVTeEhRVkZhTEU5QlVFRnFReXhGUVVGTFdDeExRVUZOTEZOQlFWVTJReXhIUVVOdVFpeEpRVUZKSzBnc1JVRkJTUzlJTEVWQlFVczJTQ3hSUVVGUmRra3NSMEZGYWtKNVNTeEhRVU5HYUVrc1JVRkJUVWNzUzBGQlN6WklMRXRCUjFJM1N5eEZRVUZGTWtJc1JVRkJTMnRDTEV0QlZtOUVPRWdzUlVGb1FqRkVMRWRCYVVOV1J5eEhRVUZuUTNCSExFOUJRVTlETEU5QlFVOHNRMEZEYUVSblJ5eFJRVUZUUVN4SlFYRkNVRWtzUjBGQlN5eFRRVUZaUXl4RlFVRlpOVWtzUlVGQlZUWkpMRVZCUVZORExFVkJRVmxETEVkQlF6bEVMRWxCVDBsRExFVkJRVTlETEVWQlFWZERMRVZCVUd4Q1F5eEZRVUZSZEV3c1MwRnhRMW9zVFVGdVEzZENMRzFDUVVGaWJVTXNTVUZEVkRaSkxFVkJRVlUzU1N4RlFVTldRU3hGUVVGWExFMUJTV0kwU1N4RlFVRlhiRU1zVFVGQlRTeExRVUZMZEVnc1VVRkJVU3hUUVVGVlowc3NSMEZEZEVOS0xFVkJRVkZKTEVWQlFWVXhReXhOUVVGTkxFdEJRM2hDTUVNc1JVRkJXVW9zUlVGQlRTeEpRVUZOTEV0QlEzaENReXhGUVVGWlJDeEZRVUZOTEVsQlFVMHNTMEZEZUVKRkxFVkJRV2RDUnl4SFFVRmhVaXhIUVVNM1FuSkxMRVZCUVVzeVN5eEZRVUZQTEZOQlFWVTVTQ3hIUVV0d1FpeEhRVXBKY2tJc1NVRkRSbXRLTEVWQlFXZENTU3hIUVVGblFuaEZMRXRCUVV0NlJDeEZRVUZUY2tJc1JVRkJWV3RLTEVsQlIzUkVTQ3hGUVVGTkxFTkJRMUlzU1VGQlNWRXNSVUZCVjB3c1JVRkZaa0VzUlVGQlowSXNVMEZCZFVKTkxFZEJRM0pEUXl4SFFVRkpOVXNzUzBGQlMzZERMRVZCUVZOMVNDeEZRVUZaTlVrc1JVRkJWVFpKTEVWQlFWTkRMRWRCUTJwRVV5eEZRVUZUTVVzc1MwRkJTM2RETEVWQlFWTnRTU3hKUVVrelFtNUpMRVZCUVZGeFNTeHBRa0ZCYVVKT0xFVkJRVmRHTEVWQlFXVktMRWxCUVdNc1IwRkRha1ZoTEVkQlFWbDBTU3hIUVVGVFZDeExRVUZMTEVOQlEzaENkMGtzVlVGQlYwRXNSVUZEV0ZBc1VVRkJVMEVzUlVGRFZFc3NZMEZCWlVFc1JVRkRabXhLTEZOQlFWVkJMRVZCUTFacFNpeFZRVUZYUVN4UFFVZGtjRXdzVFVGRFNVRXNUVUZwUWt3MFRDeEhRVUZOTEZOQlFXRmlMRVZCUVZrMVNTeEZRVUZWTmtrc1JVRkJVME1zUjBGRGNFUXNTVUZYU1VVc1JVRkJUME1zUlVGQlYxY3NSVUZZYkVKRExFVkJRVk5vVFN4TFFXZERZaXhaUVRsQ2JVSXNTVUZCWml0TExFbEJRMFpCTEVWQlFXRXNTVUZIVXl4dFFrRkJZalZKTEVsQlExUTJTU3hGUVVGVk4wa3NSVUZEVmtFc1JVRkJWeXhOUVVsaU5Fa3NSVUZCVjJ4RExFMUJRVTBzUzBGQlMzUklMRkZCUVZFc1UwRkJWV2RMTEVkQlNYUkRMRTlCU0VGS0xFVkJRVkZKTEVWQlFWVXhReXhOUVVGTkxFdEJRM2hDTUVNc1JVRkJXVW9zUlVGQlRTeEpRVUZOTEV0QlEzaENReXhGUVVGWlJDeEZRVUZOTEVsQlFVMHNTMEZEYWtKNFN5eEZRVUZMY1V3c1JVRkJVU3hUUVVGVmVFa3NSMEZETlVKMVNTeEZRVUZYUkN4SFFVRlpkRWtzUjBGRGRrSTNReXhGUVVGTGIwd3NSVUZCVTNCTExFOUJRVThzVTBGQlZVTXNSMEZETjBJc1VVRkJVekpLTEVkQlFXRXpTaXhGUVVGTE1rb3NXVUZCWTBFc1IwRkJaMEpJTEVkQlFXRjRTaXhGUVVGTGQwb3NXVUZCWTBFc1IwRkJaMEpLTEVkQlFWZHdTaXhGUVVGTGIwb3NWVUZCV1VFc1IwRkJZemRKTEVkQlFWbFFMRVZCUVV0UExGZEJRV0ZCTEV0QlF5OUxMRk5CUVZWUUxFZEJRMW8wUWl4RlFVRlJlVWtzYjBKQlFXOUNja3NzUlVGQlN6SktMRlZCUVZjelNpeEZRVUZMZVVvc1kwRkJaVW9zU1VGQll5eEhRVU01UldNc1JVRkJVMGNzVDBGQlQwZ3NSVUZCVTJwTExGRkJRVkZHTEVkQlFVOHNTMEZIY2tNeVNpeEhRVUZqU0N4SFFVRmpha29zUjBGQllUWkpMRVZCUldZc1NVRkJjRUpsTEVWQlFWTjRUQ3hSUVVOc1FqUk1MRWRCUVdNelNTeEhRVVprTWtrc1IwRkJZek5KTEUxQlMycENlRVFzVFVGRFNVRXNUVUV3UWt4dlRTeEhRVUZsTEhOQ1FVTm1ReXhIUVVGTExFVkJRMHhPTEVkQlFWY3NSMEZEV0U4c1IwRkJZU3hIUVVOaVVpeEhRVUZqTEZOQlFYRkNkRWtzUjBGRGFFTkJMRVZCUVZFMFNTeE5RVU5ZTlVrc1JVRkJVVFJKTEVsQlFYTkRMRWxCUVhSQ1JTeEhRVUZYTDB3c1UwRkJhVUk0VEN4SFFVRkxReXhIUVVGWGRrZ3NUMEZIZEVVc1NVRkJTV3RDTEVWQlFVMTZReXhGUVVGUk5Fa3NTVUZEYkVJc1QwRkJUMHdzUjBGQlV6bEdMRXRCUVZNNFJpeEhRVUZUT1VZc1IwRkJUeXhMUVZOMlEydEhMRWRCUVdkQ0xGTkJRWFZDTTBrc1IwRkRla01zU1VGQlNYbERMRVZCUVUxNlF5eEZRVUZSTkVrc1NVRkZaRXdzUjBGQlV6bEdMRXRCUTFnNFJpeEhRVUZUT1VZc1IwRkJUeXhMUVVOb1FucERMRVZCUVZFMFNTeEpRVUZuUWl4TFFVTjRRa1VzUjBGQlYzWktMRXRCUVV0clJDeExRVmxvUW5WR0xFZEJRV1VzVTBGQmMwSlNMRWRCUTNaRExFOUJRVThzVTBGQlZWY3NSMEZEWml4UFFVRlBXQ3hGUVVGUmFFc3NTMEZCUzJoQ0xFdEJRVTExVFN4SFFVRmhXaXhOUVVkMlEyRXNSMEZCWlN4RFFVTnFRa01zWlVGQlowSXNjVUpCUTJoQ1F5eDVRa0ZCTUVJc1owTkJRekZDUXl4blFrRkJhVUlzZDBKQlIyWkRMRWRCUVdFc1YwRkRaaXhQUVVGUExFZEJSMHhETEVkQlFXTXNWMEZEYUVJc1QwRkJUeXhIUVZkTVRpeEhRVUZsTEZOQlFYTkNXaXhIUVVOMlF5eEpRVUZMUVN4RlFVRk5iVUlzYjBKQlFYTkNia0lzUlVGQlRXVXNNRUpCUVRSQ1ppeEZRVUZOWjBJc1owSkJRV2xDTEVOQlEzaEdMRWxCUVVzc1NVRkJTVWtzUzBGQlkxQXNTVUZEY2tJc1UwRkJWMDhzUlVGQldVTXNSVUZCWjBKRExFZEJRM0pEZEVJc1JVRkJUVzlDTEVkQlFXTXNWMEZGYkVJc1QwRkVRUzlOTEV0QlFVdG5UaXhIUVVGclFrb3NSMEZEYUVKTExFZEJRV3RDUVN4RlFVRmxlRWdzVFVGQlRYcEdMRXRCUVUxdlFpeFpRVWQwUkhWTExFVkJRVTF4UWl4SFFVRnJRa2dzUjBGT01VSXNRMEZQUjBVc1JVRkJXVkFzUjBGQllVOHNSMEZCWVhCQ0xFVkJRVTF2UWl4SlFVYzNRM0JDTEVWQlFVMTFRaXhwUWtGRFVuWkNMRVZCUVUxakxHbENRVWxXTEU5QlFVOWtMRWRCWTB4R0xFZEJRV3RDTEZOQlFYbENkRW9zUlVGQlZUWkpMRVZCUVZOWExFZEJRMmhGTEVsQlFVbDNRaXhGUVVGamVFSXNSVUZCVFhsQ0xGTkJRVmQ2UWl4RlFVRk5la3NzVDBGRGNrTnRUU3hGUVVGblFqTkRMRVZCUVZFeFNpeExRVUZMTEVOQlFVTnRUU3hIUVVGamFFd3NSVUZCVlc1RExFMUJRVTBzUjBGRk5VUnhUaXhIUVVGcFFrRXNTVUZCYTBKeVRpeFBRVU5xUTNGT0xFbEJRV3RDUml4SFFVRnBRbmhDTEVWQlFVMHlRaXh6UWtGQmQwSXpRaXhGUVVGTk1rSXNkMEpCUTNwRmRFTXNSVUZCVVdoTExFdEJRVXR4VFN4RlFVRmxNVUlzUzBGSk9VSXhSU3hIUVVGUE5rUXNSMEZEVUhsRExFZEJRVk16UWl4SFFVVlVSQ3hIUVVGeFFteElMRTlCUVU5RExFOUJRVThzUTBGRGNrTnZSeXhIUVVGSlFTeEhRVU5LWXl4SlFVRkxRU3hIUVVOTU5FSXNTVUV6U0ZFc1UwRkJZWHBETEVWQlFWazFTU3hGUVVGVk5ra3NSVUZCVTBNc1IwRkRjRVFzVDBGQlQwZ3NSMEZCUnpsS0xFdEJRVXRvUWl4TFFVRk5LMHNzUlVGQldUVkpMRVZCUVZVMlNTeEZRVUZUUXl4RlFVRlpMRWxCTWtob1JXRXNXVUZCWVVFc1IwRkRZa3NzWTBGQlpVRXNSMEZEWmxnc1lVRkJZMEVzUjBGRFpFTXNaMEpCUVdsQ1FTeEhRVU5xUW5oRkxFdEJRVTFCTEVkQlEwNXpSeXhQUVVGUlFTeExRVTFPUlN4SFFVRmxMSFZGUVVObVF5eEhRVUZoTEhWQ1FXZENZa01zUjBGQlZTeFRRVUZwUWtNc1JVRkJUVGRFTEVWQlFVMDRSQ3hIUVVONlF5eEpRVUZKUXl4UFFVRnBRaXhKUVVGV1JDeEZRVUZ0UWl4SFFVRkxRU3hGUVVNdlFrVXNSVUZCWlVRc1JVRkJTMFVzVVVGRGNFSkJMRTlCUVRKQ0xFbEJRV3BDUkN4SFFVRnBRMEVzUlVGRE0wTkZMRVZCUVd0Q1NDeEZRVUZMU1N4WFFVTjJRa0VzVDBGQmFVTXNTVUZCY0VKRUxFZEJRVzlEUVN4RlFVTnFSRVVzUlVGQmMwSk1MRVZCUVV0eVFpeGxRVU16UWtFc1QwRkJlVU1zU1VGQmVFSXdRaXhIUVVGNVEwRXNSVUZITVVSNFF5eEZRVUZSTEVsQlJGZDVReXhIUVVGdlFsSXNSMEZETDBJc1EwRkJjVUpCTEVWQlFVMHNRMEZEY2tOSkxGRkJRVk5CTEVWQlExUkZMRmRCUVZsQkxFVkJRMXA2UWl4bFFVRm5Ra0VzUlVGRGFFSTBRaXhQUVVGUmRFVXNTVUZIVml4UFFVUkJORUlzUlVGQlRYVkNMR2RDUVVGclFsUXNSVUZEYWtJNVRDeEZRVUZMV0N4TFFVRk5MRk5CUVZWM1JDeEpRVU55UW5kTExFZEJRVmROTEVsQlFXbERReXhIUVVGeFFpOUxMRWRCUTNCRlowd3NSMEZCWTJoTUxFVkJRVk50U1N4SFFVVjJRamhETEVkQlFXVnFUQ3hGUVVGVGIwc3NSVUZCVFN4RFFVTTFRa2tzVVVGQlUwRXNSVUZEVkVVc1YwRkJXVUVzUlVGRFducENMR1ZCUVdkQ1FTeEZRVU5vUWpSQ0xFOUJRVkYwUlN4UFFVMWFjVVVzUjBGQmMwSXNVMEZCTmtKU0xFZEJRM0pFTEU5QlFVOWpMRWRCUVcxRGFrSXNSMEZCWVc1TUxFdEJRVXR6VEN4SFFVRlJaU3hYUVVGaGFrSXNSMEZCVjNCTUxFdEJRVXR6VEN4SFFVRlJaMElzWTBGQlowSkRMRmxCUVdOQkxHRkJaME55U1U0c1IwRkJkVUlzVTBGQk9FSXZTeXhIUVVOMlJDeFBRVUZKUVN4SlFVRlpjRVFzVVVGQlZXOUVMRWxCUVZsd1FpeFZRVWt2UWl0SExFVkJRVk16Uml4RlFVRlJjMHdzWTBGQlkzUkdMR2RDUVVGcFFtaEhMRWxCYVVKeVJHbE1MRWRCUVdsQ0xGTkJRWGRDYWt3c1JVRkJVMjlMTEVWQlFVMXRRaXhSUVVNelF5eEpRVUZZUVN4SlFVTkdRU3hGUVVGVExFbEJSMWhCTEVWQlFVOW1MRk5CUVZVc1JVRkRha0lzU1VGQlNYSkRMRVZCUVZFc1NVRkJTV3RFTEZsQlFWbHFRaXhGUVVGTmJVSXNSMEZEYkVOd1JDeEZRVUZOZVVJc1VVRkJWVFZLTEVWQlJXaENMRWRCUTBWblRDeEhRVUZqYUV3c1JVRkJVMjFKTEZOQlEyaENia2tzUlVGQlZVRXNSVUZCVVRSRUxHRkJZWHBDTkVnc1IwRkJjVUlzUTBGQlF5eFBRVUZSTEZGQlFWTXNVMEZCVlN4VlFVVnFSRklzUjBGQlowSXNVMEZCZFVKb1RDeEZRVUZUYlVrc1NVRkRSaXhKUVVFMVEzRkVMRWRCUVcxQ2JFNHNVVUZCVVRaS0xFVkJRVTFwUXl4UFFVRXJReXh0UWtGQmVFSndTeXhGUVVGUmJVa3NSVUZCVFdsRExFOUJRWGxDYWtNc1JVRkJUWFZDTEdsQ1FVRnZRblpDTEVWQlFVMTFReXhYUVVkcVNURkxMRVZCUVZGblRDeGpRVUZqTjBNc1IwRkdkRUp1U1N4RlFVRlJiVWtzUlVGQlRXbERMRlZCVjJ4Q0xGZEJRMFVzU1VGQlNXbENMRVZCUVdNc1UwRkJjVUpzUkN4RlFVRlBiMFFzVVVGRE4wSXNTVUZCV0VFc1NVRkRSa0VzUlVGQlV5eERRVU5RWml4VFFVRlRMRVZCUTFSRkxGbEJRVmtzUlVGRFdrY3NXVUZCVVhaT0xFbEJTVm9zU1VGQlNXMVBMRVZCUVdNM1RTeFRRVUZUT0Uwc1dVRkJXU3hsUVVWMlF5eFBRVVJCUkN4RlFVRlpSU3huUWtGQlowSjRSQ3hGUVVGUGIwUXNSVUZCVDJZc1VVRkJVMlVzUlVGQlQySXNWMEZCV1dFc1JVRkJUMVlzVVVGRGRFVlpMRWRCUjFSS0xFVkJRVmt6VEN4VlFVRlpMME1zUlVGQlNUQlBMR0ZCUVdVeFR5eEZRVUZKTUU4c1dVRkJXVE5NTEZWQlF6TkVMME1zUlVGQlNUQlBMRmxCUVdOQkxFVkJhRUp3UWl4SFFYZENRU3hKUVVGSlVDeEhRVUZuUXl4WFFVTnNReXhKUVVGSll5eEhRVUZoTEVWQlEySkRMRVZCUVUxc1VDeEZRVUZKYVVNc1UwRkZaQ3hIUVVGSmFVNHNSVUZCU3l4RFFVTlFMRWxCUVVsRExFVkJRVk5FTEVWQlFVbDJUQ3hqUVVGakxFOUJRek5DYUVJc1JVRkJVWGROTEVWQlFVOHZTQ3haUVVOdVFpdElMRVZCUVU5MlNTeFpRVUZaYWtVc1IwRkRia0ozVFN4RlFVRlBla1FzYVVKQlFXbENMRWxCUVVzc1YwRkRNMEoxUkN4SFFVRmhMRWxCUldaMFRTeEZRVUZOTUV3c1kwRkJZeXhKUVVGSlN5eFpRVUZaTEVsQlFVc3NRMEZEZGtOaUxGTkJRVk1zUzBGSllpeFBRVUZQYjBJc1JVRm9RakpDTEVkQmJVSm9RMVlzUjBGQmJVTXNWMEZEY2tNc1NVRkRSU3hKUVVGSlF5eFhRVUZYTEZOQlEyWXNUVUZCVDFrc1IwRkRVQ3hQUVVGUExFVkJSMVFzVDBGQlR5eEZRVkE0UWl4SFFWVnVRME1zUjBGQk5rSXZTeXhQUVVGUFF5eFBRVUZQTEVOQlF6ZERhVW9zVVVGQlUwRXNSMEZEVkRoQ0xHVkJjRWx0UWl4VFFVRjNRamRDTEVWQlFVMDNSQ3hIUVVNM1F5OUtMRXRCUVVzc1NVRkRVREpPTEVkQlFWRXpUU3hMUVVGTGFFSXNTMEZCU3l4SFFVRkpORTRzUlVGQlRUZEVMRVZCUVUwc1EwRkRhRU5wUlN4VFFVRlRMRVZCUTFSMlFpeG5Ra0ZCWjBJc1QwRXdTbXhDYVVRc1IwRkJNa0pxVEN4UFFVRlBReXhQUVVGUExFTkJRek5EYVV3c1RVRllWU3hUUVVGbE0wVXNSMEZQZWtJc1RVRk9TU3c0UWtGQk9FSXhTU3hMUVVGTFJpeFRRVUZUZDA0c1lVRkJaWGhPTEZOQlFWTjVUaXhMUVVOMFJUZEZMRWxCUlVFMVNTeFRRVUZUZVVvc2FVSkJRV2xDTEcxQ1FVRnZRbUlzUjBGQlV5eEhRVWRzUkdoTUxGRkJaVXc0VUN4SFFVRmpNMUFzUlVGQlNVb3NSVUZsYkVKblVTeEhRVUV3UW5STUxFOUJRVTlETEU5QlFVOHNRMEZETVVOelRDeFhRVTVsTEZkQlJXWXNUMEZFUVRkUUxFVkJRVWxLTEVWQlFVa3JVQ3hIUVVORU9WQXNVVUZ0UzB3d1JDeEhRVUZSTEZOQlFXVjFUU3hGUVVGUFF5eEhRVVZvUXl4UFFVRlBibEVzUlVGQlJTeEhRVUZITWtRc1RVRkJUU3RDTEUxQlFVMTZSaXhMUVVGTmIwSXNZVUZITlVJclR5eEhRVUU0UWpGTUxFOUJRVTlETEU5QlFVOHNRMEZET1VOUUxGTkJjRXBoTEZOQlFXdENhRU1zUjBGREwwSXNTVUZCU1ZNc1JVRkJVU3hIUVZWYUxFOUJWRUZxUXl4RlFVRkxXQ3hMUVVGTkxGTkJRVlYzUkN4SFFVTm1RU3hGUVVGUlZ5eFZRVU5XZUVRc1JVRkJTelpETEVWQlFWRlhMRk5CUVZVc1UwRkJWWEpDTEV0QlF6RkNXQ3hIUVVGWlFTeEhRVUZaWVN4RlFVRlJSaXhGUVVGUFdDeExRVU14UTFNc1JVRkJUVWNzUzBGQlMwUXNUMEZMV2k5RExFVkJRVVUyUXl4SlFUQkpWSGRPTEU5Qk4waFhMRk5CUVdkQ2FrOHNSMEZETTBJc1NVRkJTVzFLTEVWQlFWRjBUQ3hMUVU5YUxFOUJURUZYTEVWQlFVdGFMRVZCUVVWdlF5eEhRVUZYTEZOQlFWVnhRaXhKUVVObExFbEJRWEpETEVkQlFVY3hRaXhSUVVGUlpDeExRVUZMYzBzc1JVRkJUemxJTEVsQlEzcENMRWRCUVVkVUxFdEJRVXN2UWl4TFFVRkxjMHNzUlVGQlR6bElMRXRCUjJwQ2VFUXNUVUZ6U0ZCeFVTeFRRVFZIWVN4WFFVTmlMRWxCUVVsNlRpeEZRVUZSTEVkQlNWb3NUMEZJUVdwRExFVkJRVXRZTEV0QlFVMHNVMEZCVlhkRUxFZEJRMjVDTEU5QlFVOWFMRVZCUVUxSExFdEJRVXN3UXl4TlFVRk5OME1zUlVGQlQzWkRMRVZCUVZGdFJDeEZRVUZSV1N4bFFVVXhRM0pGTEVWQlFVVTJReXhKUVhkSFZEQk9MRWRCTTBaUExGTkJRVmw2VHl4SFFVTnVRaXhQUVVGUE5rSXNSMEZCVFRGRExFdEJRVXRvUWl4TFFVRk5Oa0lzUlVGQlQwRXNSVUZCVVN4SlFUSkdka013VHl4TlFTOUZWU3hYUVVOV0xFOUJRVTgzVFN4SFFVRk5NVU1zUzBGQlMyaENMRXRCUVUwc1JVRkJSeXhKUVN0Rk0wSjNVU3hKUVc1RlVTeFRRVUZoTTA4c1IwRkRja0lzVDBGQlR6ZENMRXRCUVVzMlFpeEpRVzFGV25sT0xFOUJkRVJYTEZOQlFXZENiazRzUjBGRE0wSXNTVUZCU1ZNc1JVRkJVU3hIUVUxYUxFOUJURUZxUXl4RlFVRkxXQ3hMUVVGTkxGTkJRVlYzUkN4TFFVTmtja0lzUjBGQldVRXNSMEZCV1dFc1JVRkJVVkVzUlVGQlVUUkVMRmRCUVZscVJpeExRVU4yUkZNc1JVRkJUVWNzUzBGQlMxTXNSVUZCVVRSRUxHTkJSMmhDY2tnc1JVRkJSVFpETEVsQlowUlVOazRzVTBGdVEyRXNVMEZCYTBKMFR5eEhRVU12UWl4SlFVRkpVeXhGUVVGUkxFZEJVVm9zVDBGUVFXcERMRVZCUVV0WUxFdEJRVTBzVTBGQlZYZEVMRWRCUTI1Q0xFOUJRVTgzUXl4RlFVRkxOa01zUlVGQlVUUkVMRmRCUVZkcVJDeFRRVUZWTEZOQlFWVjFUU3hIUVVNM1EwRXNTVUZCV1d4T0xFdEJRV0Z5UWl4SFFVRlpRU3hIUVVGWllTeEZRVUZSTUU0c1JVRkJVM1pQTEV0QlEzQkZVeXhGUVVGTlJ5eExRVUZMTWs0c1QwRkpWak5STEVWQlFVVTJReXhKUVRKQ1ZHTXNUVUZCVDBFc1MwRXJRa3hwVGl4SFFVRlZiRkVzVFVGQlRXdFJMRkZCUldoQ0wwTXNSMEZCYjBKdVNpeFBRVUZQUXl4UFFVRlBMRU5CUTNCRGEwMHNWMEZxUW1Vc1UwRkJiMEpETEVkQlEyNURMRTFCUVhOQ0xHMUNRVUZTUVN4SFFXbENaRVlzVVVGQlUwRXNTMEZOVUc1TUxFZEJRVTBzUjBGRFRuTk1MRWRCUVUwc1IwRjFRbFlzV1VGeVFuZENMRWxCUVdJelR5eExRVU5VTWs4c1IwRkJUUzlSTEVkQlEwWnBSQ3hSUVVGVlFTeEZRVU5rZDBNc1IwRkJTVGRETEV0QlFVOUJMRWRCUjJJeFFpeEZRVUZQTmxBc1IwRkJTM2hJTEVWQlFXTjVSeXhIUVVGWmJrTXNTVUZEZEVNelRTeEZRVUZQZFVVc1IwRkJTMGdzUlVGQlQxVXNSVUZCVDJsRExFVkJRVlZPTEVWQlFVdHBRaXhGUVVGWGJVSXNSVUZCVlVVc1JVRkJWMUVzUlVGQlZXMUNMRWRCUVU4MlJDeEhRVUZsUlN4SFFVRmhOMFVzUjBGQmEwSnpSaXhKUVVONFNWY3NSMEZCU1haTkxFZEJRVXRwUWl4SFFVVlVjMHdzUjBGQlNVTXNVVUZCVlN4VlFVVmtSQ3hIUVVGSk4xQXNUMEZCVTBFc1JVRkhXRFpRTEVkQlFVbDJUQ3hWUVVGWlFTeEZRVUZWZFV3c1IwRkJTWFpOTEVsQlNYUkNkVTBpTENKbWFXeGxJam9pUlRwY1hIZHZjbXR6Y0dGalpWeGNjR0Z1ZEc5dFlYUm9MV05vWVhSaWIzUmNYRzV2WkdWZmJXOWtkV3hsYzF4Y1pHOXRkR0Z6ZEdsalhGeGthWE4wWEZ4a2IyMTBZWE4wYVdNdWFuTWlmUT09IiwiXCJ1c2Ugc3RyaWN0XCI7Y29uc3QgYXJyaWZ5PXJlcXVpcmUoXCJhcnJpZnlcIiksaXNQbGFpbk9iamVjdD1yZXF1aXJlKFwiaXMtcGxhaW4tb2JqZWN0XCIpLGNsYXNzTmFtZXM9cmVxdWlyZShcImNsYXNzbmFtZXNcIikscmVuZGVyPXJlcXVpcmUoXCIuL3JlbmRlclwiKSx1dGlscz1yZXF1aXJlKFwiLi91dGlsc1wiKSxoPShlLHMscik9PntzJiYhaXNQbGFpbk9iamVjdChzKT8ocj1zLHM9e30pOnN8fChzPXt9KSxyPWFycmlmeShyKTtjb25zdCBpPXV0aWxzLmdldFNlbGVjdG9yUGFydHMoZSk7cmV0dXJuIGkuaWQmJihzLmlkPWkuaWQpLGkuY2xhc3Nlcy5sZW5ndGgmJihzLmNsYXNzPWNsYXNzTmFtZXMocy5jbGFzcyxpLmNsYXNzZXMpKSxyZW5kZXIoaS50YWcscyxyKX07bW9kdWxlLmV4cG9ydHM9ZXhwb3J0cz1oO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW1sdVpHVjRMbXB6SWwwc0ltNWhiV1Z6SWpwYkltRnljbWxtZVNJc0luSmxjWFZwY21VaUxDSnBjMUJzWVdsdVQySnFaV04wSWl3aVkyeGhjM05PWVcxbGN5SXNJbkpsYm1SbGNpSXNJblYwYVd4eklpd2lhQ0lzSW5ObGJHVmpkRzl5SWl3aVlYUjBjbk1pTENKamFHbHNaSEpsYmlJc0luQmhjblJ6SWl3aVoyVjBVMlZzWldOMGIzSlFZWEowY3lJc0ltbGtJaXdpWTJ4aGMzTmxjeUlzSW14bGJtZDBhQ0lzSW1Oc1lYTnpJaXdpZEdGbklpd2liVzlrZFd4bElpd2laWGh3YjNKMGN5SmRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRXNZVUZEUVN4TlFVRk5RU3hQUVVGVFF5eFJRVUZSTEZWQlEycENReXhqUVVGblFrUXNVVUZCVVN4dFFrRkRlRUpGTEZkQlFXRkdMRkZCUVZFc1kwRkRja0pITEU5QlFWTklMRkZCUVZFc1dVRkRha0pKTEUxQlFWRktMRkZCUVZFc1YwRkZhRUpMTEVWQlFVa3NRMEZCUTBNc1JVRkJWVU1zUlVGQlQwTXNTMEZEZGtKRUxFbEJRVlZPTEdOQlFXTk5MRWxCUXpOQ1F5eEZRVUZYUkN4RlFVTllRU3hGUVVGUkxFbEJRMGRCTEVsQlExaEJMRVZCUVZFc1NVRkZWRU1zUlVGQlYxUXNUMEZCVDFNc1IwRkRiRUlzVFVGQlRVTXNSVUZCVVV3c1RVRkJUVTBzYVVKQlFXbENTaXhIUVU5eVF5eFBRVTVKUnl4RlFVRk5SU3hMUVVOVVNpeEZRVUZOU1N4SFFVRkxSaXhGUVVGTlJTeEpRVVZrUml4RlFVRk5SeXhSUVVGUlF5eFRRVU5xUWs0c1JVRkJUVThzVFVGQlVWb3NWMEZCVjBzc1JVRkJUVThzVFVGQlQwd3NSVUZCVFVjc1ZVRkZkRU5VTEU5QlFVOU5MRVZCUVUxTkxFbEJRVXRTTEVWQlFVOURMRWxCUjJwRFVTeFBRVUZQUXl4UlFVRlZRU3hSUVVGVldpSXNJbVpwYkdVaU9pSkZPbHhjZDI5eWEzTndZV05sWEZ4d1lXNTBiMjFoZEdndFkyaGhkR0p2ZEZ4Y2JtOWtaVjl0YjJSMWJHVnpYRnhvZVhCbGNuTmpjbWx3ZEMxemRISnBibWRjWEhOeVkxeGNhVzVrWlhndWFuTWlmUT09IiwiXCJ1c2Ugc3RyaWN0XCI7Y29uc3Qgdm9pZEVsZW1lbnRzPXJlcXVpcmUoXCJ2b2lkLWVsZW1lbnRzXCIpLGFycmlmeT1yZXF1aXJlKFwiYXJyaWZ5XCIpO2Z1bmN0aW9uIHJlbmRlckF0dHJpYnV0ZXMoZSl7cmV0dXJuKGU9T2JqZWN0LmtleXMoZSkuZmlsdGVyKHI9PnZvaWQgMCE9PWVbcl0mJm51bGwhPT1lW3JdJiYhMSE9PWVbcl0pLm1hcChyPT4hMD09PWVbcl0/cjpgJHtyfT1cIiR7ZVtyXX1cImApLmpvaW4oXCIgXCIpKT9gICR7ZX1gOlwiXCJ9ZnVuY3Rpb24gcmVuZGVyQ2hpbGRyZW4oZSl7cmV0dXJuIDA9PT0oZT1hcnJpZnkoZSkpLmxlbmd0aD9cIlwiOjE9PT1lLmxlbmd0aD9lWzBdOmBcXG5cXHQke2Uuam9pbihcIlxcblxcdFwiKX1cXG5gfW1vZHVsZS5leHBvcnRzPWV4cG9ydHM9ZnVuY3Rpb24oZSxyLHQpe3JldHVyblwiIWRvY3R5cGVcIj09PWV8fHZvaWRFbGVtZW50c1tlXT9gPCR7ZX0ke3JlbmRlckF0dHJpYnV0ZXMocil9PmA6YDwke2V9JHtyZW5kZXJBdHRyaWJ1dGVzKHIpfT4ke3JlbmRlckNoaWxkcmVuKHQpfTwvJHtlfT5gfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkluSmxibVJsY2k1cWN5SmRMQ0p1WVcxbGN5STZXeUoyYjJsa1JXeGxiV1Z1ZEhNaUxDSnlaWEYxYVhKbElpd2lZWEp5YVdaNUlpd2ljbVZ1WkdWeVFYUjBjbWxpZFhSbGN5SXNJbUYwZEhKeklpd2lUMkpxWldOMElpd2lhMlY1Y3lJc0ltWnBiSFJsY2lJc0ltNWhiV1VpTENKMWJtUmxabWx1WldRaUxDSnRZWEFpTENKcWIybHVJaXdpY21WdVpHVnlRMmhwYkdSeVpXNGlMQ0pqYUdsc1pISmxiaUlzSW14bGJtZDBhQ0lzSW0xdlpIVnNaU0lzSW1WNGNHOXlkSE1pWFN3aWJXRndjR2x1WjNNaU9pSkJRVUZCTEdGQlEwRXNUVUZCVFVFc1lVRkJaVU1zVVVGQlVTeHBRa0ZEZGtKRExFOUJRVk5FTEZGQlFWRXNWVUZUZGtJc1UwRkJVMFVzYVVKQlFXbENReXhIUVdGNlFpeFBRVnBCUVN4RlFVRlJReXhQUVVGUFF5eExRVUZMUml4SFFVTnNRa2NzVDBGQlQwTXNVVUZEVTBNc1NVRkJhRUpNTEVWQlFVMUpMRWxCUTFVc1QwRkJhRUpLTEVWQlFVMUpMRXRCUTFVc1NVRkJhRUpLTEVWQlFVMUpMRWxCUlU1RkxFbEJRVWxHTEVsQlExa3NTVUZCYUVKS0xFVkJRVTFKTEVkQlEwNUJMRXRCUTBkQkxFMUJRVk5LTEVWQlFVMUpMRTlCUld4Q1J5eExRVUZMTEZWQlJVdFFMRWxCUlV3c1IwRkhVaXhUUVVGVFVTeGxRVUZsUXl4SFFVVjJRaXhQUVVGM1FpeExRVVI0UWtFc1JVRkJWMWdzVDBGQlQxY3NTVUZEVEVNc1QwRkRUQ3hIUVVOMVFpeEpRVUZ3UWtRc1JVRkJVME1zVDBGRFdrUXNSVUZCVXl4VlFVVklRU3hGUVVGVFJpeExRVUZMTEZsQmFrTTNRa2tzVDBGQlQwTXNVVUZCVlVFc1VVRkJWU3hUUVVGblFsSXNSVUZCVFVvc1JVRkJUMU1zUjBGRGRrUXNUVUZCWVN4aFFVRlVUQ3hIUVVGMVFsSXNZVUZCWVZFc1QwRkROVUpCTEVsQlFVOU1MR2xDUVVGcFFrTXNWVUZGZWtKSkxFbEJRVTlNTEdsQ1FVRnBRa01zVFVGQlZWRXNaVUZCWlVNc1QwRkJZMHdpTENKbWFXeGxJam9pUlRwY1hGZHZjbXR6Y0dGalpWeGNkMmxyYVdFdGFYTXRZVzV6ZDJWeVpXUmNYRzV2WkdWZmJXOWtkV3hsYzF4Y2FIbHdaWEp6WTNKcGNIUXRjM1J5YVc1blhGeHpjbU5jWEhKbGJtUmxjaTVxY3lKOSIsIlwidXNlIHN0cmljdFwiO2NvbnN0IFNFTEVDVE9SX1JFR0VYPS8oXnwjfFxcLilbXiNcXC5dKy9nO2Z1bmN0aW9uIGdldFRhZyh0KXtyZXR1cm5cIiNcIj09PXRbMF1bMF18fFwiLlwiPT09dFswXVswXT9cImRpdlwiOnRbMF0udG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBnZXRDbGFzc2VzKHQpe3JldHVybiB0LmZpbHRlcihpc0NsYXNzKS5tYXAoc2xpY2UoMSkpfWZ1bmN0aW9uIGdldElkKHQpe3JldHVybiB0LmZpbHRlcihpc0lkKS5tYXAoc2xpY2UoMSkpWzBdfWZ1bmN0aW9uIHNsaWNlKHQsZSl7cmV0dXJuIHM9PnMuc2xpY2UodCxlKX1mdW5jdGlvbiBpc0lkKHQpe3JldHVyblwiI1wiPT09dFswXX1mdW5jdGlvbiBpc0NsYXNzKHQpe3JldHVyblwiLlwiPT09dFswXX1leHBvcnRzLmdldFNlbGVjdG9yUGFydHM9KHQ9Pntjb25zdCBlPXQubWF0Y2goU0VMRUNUT1JfUkVHRVgpO2lmKCFlKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZWxlY3RvciEgU2hvdWxkIGhhdmUgdGhlIGZvcm1hdCBcIm5hbWUuY2xhc3MxLmNsYXNzMiNpZFwiLCBidXQgd2FzOiBcIiR7dH1cImApO3JldHVybnt0YWc6Z2V0VGFnKGUpLGlkOmdldElkKGUpLGNsYXNzZXM6Z2V0Q2xhc3NlcyhlKX19KTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkluVjBhV3h6TG1weklsMHNJbTVoYldWeklqcGJJbE5GVEVWRFZFOVNYMUpGUjBWWUlpd2laMlYwVkdGbklpd2liV0YwWTJobGN5SXNJblJ2VEc5M1pYSkRZWE5sSWl3aVoyVjBRMnhoYzNObGN5SXNJbVpwYkhSbGNpSXNJbWx6UTJ4aGMzTWlMQ0p0WVhBaUxDSnpiR2xqWlNJc0ltZGxkRWxrSWl3aWFYTkpaQ0lzSW1FaUxDSmlJaXdpZG1Gc0lpd2ljM1J5SWl3aVpYaHdiM0owY3lJc0ltZGxkRk5sYkdWamRHOXlVR0Z5ZEhNaUxDSnpaV3hsWTNSdmNpSXNJbTFoZEdOb0lpd2lSWEp5YjNJaUxDSjBZV2NpTENKcFpDSXNJbU5zWVhOelpYTWlYU3dpYldGd2NHbHVaM01pT2lKQlFVRkJMR0ZCUTBFc1RVRkJUVUVzWlVGQmFVSXNiVUpCWTNaQ0xGTkJRVk5ETEU5QlFVOURMRWRCUTJZc1RVRkJjMElzVFVGQmJFSkJMRVZCUVZFc1IwRkJSeXhKUVVGblF5eE5RVUZzUWtFc1JVRkJVU3hIUVVGSExFZEJRMmhETEUxQlJVUkJMRVZCUVZFc1IwRkJSME1zWTBGSGJrSXNVMEZCVTBNc1YwRkJWMFlzUjBGRGJrSXNUMEZCVDBFc1JVRkJVVWNzVDBGQlQwTXNVMEZCVTBNc1NVRkJTVU1zVFVGQlRTeEpRVWN4UXl4VFFVRlRReXhOUVVGTlVDeEhRVU5rTEU5QlFVOUJMRVZCUVZGSExFOUJRVTlMTEUxQlFVMUlMRWxCUVVsRExFMUJRVTBzU1VGQlNTeEhRVWN6UXl4VFFVRlRRU3hOUVVGTlJ5eEZRVUZIUXl4SFFVTnFRaXhQUVVGUFF5eEhRVUZQUVN4RlFVRkpUQ3hOUVVGTlJ5eEZRVUZIUXl4SFFVYzFRaXhUUVVGVFJpeExRVUZMU1N4SFFVTmlMRTFCUVd0Q0xFMUJRVmhCTEVWQlFVa3NSMEZIV2l4VFFVRlRVaXhSUVVGUlVTeEhRVU5vUWl4TlFVRnJRaXhOUVVGWVFTeEZRVUZKTEVkQmNFTmFReXhSUVVGUlF5eHBRa0ZCYlVJc1EwRkJRME1zU1VGRE0wSXNUVUZCVFdZc1JVRkJWV1VzUlVGQlUwTXNUVUZCVFd4Q0xHZENRVU12UWl4SlFVRkxSU3hGUVVOS0xFMUJRVTBzU1VGQlNXbENMSEZHUVVGeFJrWXNUVUZGYUVjc1RVRkJUeXhEUVVOT1J5eEpRVUZMYmtJc1QwRkJUME1zUjBGRFdtMUNMRWRCUVVsYUxFMUJRVTFRTEVkQlExWnZRaXhSUVVGVGJFSXNWMEZCVjBZaUxDSm1hV3hsSWpvaVJUcGNYRmR2Y210emNHRmpaVnhjZDJscmFXRXRhWE10WVc1emQyVnlaV1JjWEc1dlpHVmZiVzlrZFd4bGMxeGNhSGx3WlhKelkzSnBjSFF0YzNSeWFXNW5YRnh6Y21OY1hIVjBhV3h6TG1wekluMD0iLCJcInVzZSBzdHJpY3RcIjt2YXIgaXNPYmplY3Q9cmVxdWlyZShcImlzb2JqZWN0XCIpO2Z1bmN0aW9uIGlzT2JqZWN0T2JqZWN0KHQpe3JldHVybiEwPT09aXNPYmplY3QodCkmJlwiW29iamVjdCBPYmplY3RdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGUsYztyZXR1cm4hMSE9PWlzT2JqZWN0T2JqZWN0KHQpJiYoXCJmdW5jdGlvblwiPT10eXBlb2YoZT10LmNvbnN0cnVjdG9yKSYmKCExIT09aXNPYmplY3RPYmplY3QoYz1lLnByb3RvdHlwZSkmJiExIT09Yy5oYXNPd25Qcm9wZXJ0eShcImlzUHJvdG90eXBlT2ZcIikpKX07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbWx1WkdWNExtcHpJbDBzSW01aGJXVnpJanBiSW1selQySnFaV04wSWl3aWNtVnhkV2x5WlNJc0ltbHpUMkpxWldOMFQySnFaV04wSWl3aWJ5SXNJazlpYW1WamRDSXNJbkJ5YjNSdmRIbHdaU0lzSW5SdlUzUnlhVzVuSWl3aVkyRnNiQ0lzSW0xdlpIVnNaU0lzSW1WNGNHOXlkSE1pTENKamRHOXlJaXdpY0hKdmRDSXNJbU52Ym5OMGNuVmpkRzl5SWl3aWFHRnpUM2R1VUhKdmNHVnlkSGtpWFN3aWJXRndjR2x1WjNNaU9pSkJRVTlCTEdGQlJVRXNTVUZCU1VFc1UwRkJWME1zVVVGQlVTeFpRVVYyUWl4VFFVRlRReXhsUVVGbFF5eEhRVU4wUWl4UFFVRjFRaXhKUVVGb1FrZ3NVMEZCVTBjc1NVRkRNa0lzYjBKQlFYUkRReXhQUVVGUFF5eFZRVUZWUXl4VFFVRlRReXhMUVVGTFNpeEhRVWQwUTBzc1QwRkJUME1zVVVGQlZTeFRRVUYxUWs0c1IwRkRkRU1zU1VGQlNVOHNSVUZCUzBNc1JVRkZWQ3hQUVVFd1FpeEpRVUYwUWxRc1pVRkJaVU1zUzBGSlF5eHRRa0ZFY0VKUExFVkJRVTlRTEVWQlFVVlRMR2RDUVV0dlFpeEpRVUY2UWxZc1pVRkVTbE1zUlVGQlQwUXNSVUZCUzB3c1lVRkphVU1zU1VGQmVrTk5MRVZCUVV0RkxHVkJRV1VpTENKbWFXeGxJam9pUlRwY1hGZHZjbXR6Y0dGalpWeGNkMmxyYVdFdGFYTXRZVzV6ZDJWeVpXUmNYRzV2WkdWZmJXOWtkV3hsYzF4Y2FYTXRjR3hoYVc0dGIySnFaV04wWEZ4cGJtUmxlQzVxY3lKOSIsIlwidXNlIHN0cmljdFwiO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKHIpe3JldHVybiBudWxsIT1yJiZcIm9iamVjdFwiPT10eXBlb2YgciYmITE9PT1BcnJheS5pc0FycmF5KHIpfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltbHVaR1Y0TG1weklsMHNJbTVoYldWeklqcGJJbTF2WkhWc1pTSXNJbVY0Y0c5eWRITWlMQ0oyWVd3aUxDSkJjbkpoZVNJc0ltbHpRWEp5WVhraVhTd2liV0Z3Y0dsdVozTWlPaUpCUVU5QkxHRkJSVUZCTEU5QlFVOURMRkZCUVZVc1UwRkJhMEpETEVkQlEycERMRTlCUVdNc1RVRkJVRUVzUjBGQk9FSXNhVUpCUVZKQkxFbEJRVEpETEVsQlFYWkNReXhOUVVGTlF5eFJRVUZSUmlJc0ltWnBiR1VpT2lKRk9seGNWMjl5YTNOd1lXTmxYRngzYVd0cFlTMXBjeTFoYm5OM1pYSmxaRnhjYm05a1pWOXRiMlIxYkdWelhGeHBjMjlpYW1WamRGeGNhVzVrWlhndWFuTWlmUT09IiwiKGZ1bmN0aW9uKCl7dmFyIHQsZSxpLG4scyxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxhcmd1bWVudHMpfX0sbz1bXS5zbGljZSxsPXt9Lmhhc093blByb3BlcnR5LHU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGkgaW4gZSlsLmNhbGwoZSxpKSYmKHRbaV09ZVtpXSk7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1yZXR1cm4gbi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IG4sdC5fX3N1cGVyX189ZS5wcm90b3R5cGUsdH0saD1bXS5pbmRleE9mfHxmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxpPXRoaXMubGVuZ3RoO2U8aTtlKyspaWYoZSBpbiB0aGlzJiZ0aGlzW2VdPT09dClyZXR1cm4gZTtyZXR1cm4tMX07dD17b3B0aW9uczpbXCJwcmVmaXhcIixcInRlbXBsYXRlRGVsaW1pdGVyc1wiLFwicm9vdEludGVyZmFjZVwiLFwicHJlbG9hZERhdGFcIixcImhhbmRsZXJcIixcImV4ZWN1dGVGdW5jdGlvbnNcIl0sZXh0ZW5zaW9uczpbXCJiaW5kZXJzXCIsXCJmb3JtYXR0ZXJzXCIsXCJjb21wb25lbnRzXCIsXCJhZGFwdGVyc1wiXSxwdWJsaWM6e2JpbmRlcnM6e30sY29tcG9uZW50czp7fSxmb3JtYXR0ZXJzOnt9LGFkYXB0ZXJzOnt9LHByZWZpeDpcInJ2XCIsdGVtcGxhdGVEZWxpbWl0ZXJzOltcIntcIixcIn1cIl0scm9vdEludGVyZmFjZTpcIi5cIixwcmVsb2FkRGF0YTohMCxleGVjdXRlRnVuY3Rpb25zOiExLGl0ZXJhdGlvbkFsaWFzOmZ1bmN0aW9uKHQpe3JldHVyblwiJVwiK3QrXCIlXCJ9LGhhbmRsZXI6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmNhbGwodCxlLGkudmlldy5tb2RlbHMpfSxjb25maWd1cmU6ZnVuY3Rpb24oZSl7dmFyIGksbixzLHI7Zm9yKHMgaW4gbnVsbD09ZSYmKGU9e30pLGUpaWYocj1lW3NdLFwiYmluZGVyc1wiPT09c3x8XCJjb21wb25lbnRzXCI9PT1zfHxcImZvcm1hdHRlcnNcIj09PXN8fFwiYWRhcHRlcnNcIj09PXMpZm9yKG4gaW4gcilpPXJbbl0sdFtzXVtuXT1pO2Vsc2UgdC5wdWJsaWNbc109cn0sYmluZDpmdW5jdGlvbihlLGksbil7dmFyIHM7cmV0dXJuIG51bGw9PWkmJihpPXt9KSxudWxsPT1uJiYobj17fSksKHM9bmV3IHQuVmlldyhlLGksbikpLmJpbmQoKSxzfSxpbml0OmZ1bmN0aW9uKGUsaSxuKXt2YXIgcyxyLG87aWYobnVsbD09biYmKG49e30pLG51bGw9PWkmJihpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpLChyPShlPXQucHVibGljLmNvbXBvbmVudHNbZV0pLnRlbXBsYXRlLmNhbGwodGhpcyxpKSlpbnN0YW5jZW9mIEhUTUxFbGVtZW50KXtmb3IoO2kuZmlyc3RDaGlsZDspaS5yZW1vdmVDaGlsZChpLmZpcnN0Q2hpbGQpO2kuYXBwZW5kQ2hpbGQocil9ZWxzZSBpLmlubmVySFRNTD1yO3JldHVybiBzPWUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsaSxuKSwobz1uZXcgdC5WaWV3KGkscykpLmJpbmQoKSxvfX19LHdpbmRvdy5qUXVlcnl8fHdpbmRvdy4kPyhzPVwib25cImluKGk9d2luZG93LmpRdWVyeXx8d2luZG93LiQpLnByb3RvdHlwZT9bXCJvblwiLFwib2ZmXCJdOltcImJpbmRcIixcInVuYmluZFwiXSxlPXNbMF0sbj1zWzFdLHQuVXRpbD17YmluZEV2ZW50OmZ1bmN0aW9uKHQsbixzKXtyZXR1cm4gaSh0KVtlXShuLHMpfSx1bmJpbmRFdmVudDpmdW5jdGlvbih0LGUscyl7cmV0dXJuIGkodClbbl0oZSxzKX0sZ2V0SW5wdXRWYWx1ZTpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm5cImNoZWNrYm94XCI9PT0oZT1pKHQpKS5hdHRyKFwidHlwZVwiKT9lLmlzKFwiOmNoZWNrZWRcIik6ZS52YWwoKX19KTp0LlV0aWw9e2JpbmRFdmVudDpcImFkZEV2ZW50TGlzdGVuZXJcImluIHdpbmRvdz9mdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcihlLGksITEpfTpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQuYXR0YWNoRXZlbnQoXCJvblwiK2UsaSl9LHVuYmluZEV2ZW50OlwicmVtb3ZlRXZlbnRMaXN0ZW5lclwiaW4gd2luZG93P2Z1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsaSwhMSl9OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdC5kZXRhY2hFdmVudChcIm9uXCIrZSxpKX0sZ2V0SW5wdXRWYWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxpLG4scztpZihcImNoZWNrYm94XCI9PT10LnR5cGUpcmV0dXJuIHQuY2hlY2tlZDtpZihcInNlbGVjdC1tdWx0aXBsZVwiPT09dC50eXBlKXtmb3Iocz1bXSxpPTAsbj10Lmxlbmd0aDtpPG47aSsrKShlPXRbaV0pLnNlbGVjdGVkJiZzLnB1c2goZS52YWx1ZSk7cmV0dXJuIHN9cmV0dXJuIHQudmFsdWV9fSx0LlR5cGVQYXJzZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnR5cGVzPXtwcmltaXRpdmU6MCxrZXlwYXRoOjF9LHQucGFyc2U9ZnVuY3Rpb24odCl7cmV0dXJuL14nLionJHxeXCIuKlwiJC8udGVzdCh0KT97dHlwZTp0aGlzLnR5cGVzLnByaW1pdGl2ZSx2YWx1ZTp0LnNsaWNlKDEsLTEpfTpcInRydWVcIj09PXQ/e3R5cGU6dGhpcy50eXBlcy5wcmltaXRpdmUsdmFsdWU6ITB9OlwiZmFsc2VcIj09PXQ/e3R5cGU6dGhpcy50eXBlcy5wcmltaXRpdmUsdmFsdWU6ITF9OlwibnVsbFwiPT09dD97dHlwZTp0aGlzLnR5cGVzLnByaW1pdGl2ZSx2YWx1ZTpudWxsfTpcInVuZGVmaW5lZFwiPT09dD97dHlwZTp0aGlzLnR5cGVzLnByaW1pdGl2ZSx2YWx1ZTp2b2lkIDB9OlwiXCI9PT10P3t0eXBlOnRoaXMudHlwZXMucHJpbWl0aXZlLHZhbHVlOnZvaWQgMH06ITE9PT1pc05hTihOdW1iZXIodCkpP3t0eXBlOnRoaXMudHlwZXMucHJpbWl0aXZlLHZhbHVlOk51bWJlcih0KX06e3R5cGU6dGhpcy50eXBlcy5rZXlwYXRoLHZhbHVlOnR9fSx0fSgpLHQuVGV4dFRlbXBsYXRlUGFyc2VyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC50eXBlcz17dGV4dDowLGJpbmRpbmc6MX0sdC5wYXJzZT1mdW5jdGlvbih0LGUpe3ZhciBpLG4scyxyLG8sbCx1O2ZvcihsPVtdLHI9dC5sZW5ndGgsaT0wLG49MDtuPHI7KXtpZigoaT10LmluZGV4T2YoZVswXSxuKSk8MCl7bC5wdXNoKHt0eXBlOnRoaXMudHlwZXMudGV4dCx2YWx1ZTp0LnNsaWNlKG4pfSk7YnJlYWt9aWYoaT4wJiZuPGkmJmwucHVzaCh7dHlwZTp0aGlzLnR5cGVzLnRleHQsdmFsdWU6dC5zbGljZShuLGkpfSksbj1pK2VbMF0ubGVuZ3RoLChpPXQuaW5kZXhPZihlWzFdLG4pKTwwKXtvPXQuc2xpY2Uobi1lWzFdLmxlbmd0aCksKG51bGwhPShzPWxbbC5sZW5ndGgtMV0pP3MudHlwZTp2b2lkIDApPT09dGhpcy50eXBlcy50ZXh0P3MudmFsdWUrPW86bC5wdXNoKHt0eXBlOnRoaXMudHlwZXMudGV4dCx2YWx1ZTpvfSk7YnJlYWt9dT10LnNsaWNlKG4saSkudHJpbSgpLGwucHVzaCh7dHlwZTp0aGlzLnR5cGVzLmJpbmRpbmcsdmFsdWU6dX0pLG49aStlWzFdLmxlbmd0aH1yZXR1cm4gbH0sdH0oKSx0LlZpZXc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsaSxuKXt2YXIgcyxvLGwsdSxoLGEscCxkLGMsZixiLHYsbTtmb3IodGhpcy5lbHM9ZSx0aGlzLm1vZGVscz1pLG51bGw9PW4mJihuPXt9KSx0aGlzLnVwZGF0ZT1yKHRoaXMudXBkYXRlLHRoaXMpLHRoaXMucHVibGlzaD1yKHRoaXMucHVibGlzaCx0aGlzKSx0aGlzLnN5bmM9cih0aGlzLnN5bmMsdGhpcyksdGhpcy51bmJpbmQ9cih0aGlzLnVuYmluZCx0aGlzKSx0aGlzLmJpbmQ9cih0aGlzLmJpbmQsdGhpcyksdGhpcy5zZWxlY3Q9cih0aGlzLnNlbGVjdCx0aGlzKSx0aGlzLnRyYXZlcnNlPXIodGhpcy50cmF2ZXJzZSx0aGlzKSx0aGlzLmJ1aWxkPXIodGhpcy5idWlsZCx0aGlzKSx0aGlzLmJ1aWxkQmluZGluZz1yKHRoaXMuYnVpbGRCaW5kaW5nLHRoaXMpLHRoaXMuYmluZGluZ1JlZ0V4cD1yKHRoaXMuYmluZGluZ1JlZ0V4cCx0aGlzKSx0aGlzLm9wdGlvbnM9cih0aGlzLm9wdGlvbnMsdGhpcyksdGhpcy5lbHMuanF1ZXJ5fHx0aGlzLmVscyBpbnN0YW5jZW9mIEFycmF5fHwodGhpcy5lbHM9W3RoaXMuZWxzXSksaD0wLHA9KGM9dC5leHRlbnNpb25zKS5sZW5ndGg7aDxwO2grKyl7aWYodGhpc1tvPWNbaF1dPXt9LG5bb10pZm9yKHMgaW4gZj1uW29dKWw9ZltzXSx0aGlzW29dW3NdPWw7Zm9yKHMgaW4gYj10LnB1YmxpY1tvXSlsPWJbc10sbnVsbD09KHU9dGhpc1tvXSlbc10mJih1W3NdPWwpfWZvcihhPTAsZD0odj10Lm9wdGlvbnMpLmxlbmd0aDthPGQ7YSsrKXRoaXNbbz12W2FdXT1udWxsIT0obT1uW29dKT9tOnQucHVibGljW29dO3RoaXMuYnVpbGQoKX1yZXR1cm4gZS5wcm90b3R5cGUub3B0aW9ucz1mdW5jdGlvbigpe3ZhciBlLGksbixzLHI7Zm9yKGk9e30sbj0wLHM9KHI9dC5leHRlbnNpb25zLmNvbmNhdCh0Lm9wdGlvbnMpKS5sZW5ndGg7bjxzO24rKylpW2U9cltuXV09dGhpc1tlXTtyZXR1cm4gaX0sZS5wcm90b3R5cGUuYmluZGluZ1JlZ0V4cD1mdW5jdGlvbigpe3JldHVybiBuZXcgUmVnRXhwKFwiXlwiK3RoaXMucHJlZml4K1wiLVwiKX0sZS5wcm90b3R5cGUuYnVpbGRCaW5kaW5nPWZ1bmN0aW9uKGUsaSxuLHMpe3ZhciByLG8sbCx1LGgsYSxwO3JldHVybiBoPXt9LHA9ZnVuY3Rpb24oKXt2YXIgdCxlLGksbjtmb3Iobj1bXSx0PTAsZT0oaT1zLm1hdGNoKC8oKD86J1teJ10qJykqKD86KD86W15cXHwnXSooPzonW14nXSonKStbXlxcfCddKikrfFteXFx8XSspKXxeJC9nKSkubGVuZ3RoO3Q8ZTt0KyspYT1pW3RdLG4ucHVzaChhLnRyaW0oKSk7cmV0dXJuIG59KCksdT0ocj1mdW5jdGlvbigpe3ZhciB0LGUsaSxuO2ZvcihuPVtdLHQ9MCxlPShpPXAuc2hpZnQoKS5zcGxpdChcIjxcIikpLmxlbmd0aDt0PGU7dCsrKW89aVt0XSxuLnB1c2goby50cmltKCkpO3JldHVybiBufSgpKS5zaGlmdCgpLGguZm9ybWF0dGVycz1wLChsPXIuc2hpZnQoKSkmJihoLmRlcGVuZGVuY2llcz1sLnNwbGl0KC9cXHMrLykpLHRoaXMuYmluZGluZ3MucHVzaChuZXcgdFtlXSh0aGlzLGksbix1LGgpKX0sZS5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oKXt2YXIgZSxpLG4scyxyLG87Zm9yKHRoaXMuYmluZGluZ3M9W10sbz10aGlzLGk9ZnVuY3Rpb24oZSl7dmFyIG4scyxyLGwsdSxoLGEscCxkLGMsZixiLHY7aWYoMz09PWUubm9kZVR5cGUpe2lmKHU9dC5UZXh0VGVtcGxhdGVQYXJzZXIsKHI9by50ZW1wbGF0ZURlbGltaXRlcnMpJiYocD11LnBhcnNlKGUuZGF0YSxyKSkubGVuZ3RoJiYoMSE9PXAubGVuZ3RofHxwWzBdLnR5cGUhPT11LnR5cGVzLnRleHQpKXtmb3IoZD0wLGY9cC5sZW5ndGg7ZDxmO2QrKylhPXBbZF0saD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhLnZhbHVlKSxlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsZSksMT09PWEudHlwZSYmby5idWlsZEJpbmRpbmcoXCJUZXh0QmluZGluZ1wiLGgsbnVsbCxhLnZhbHVlKTtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9fWVsc2UgMT09PWUubm9kZVR5cGUmJihuPW8udHJhdmVyc2UoZSkpO2lmKCFuKWZvcih2PWZ1bmN0aW9uKCl7dmFyIHQsaSxuLHM7Zm9yKHM9W10sdD0wLGk9KG49ZS5jaGlsZE5vZGVzKS5sZW5ndGg7dDxpO3QrKylsPW5bdF0scy5wdXNoKGwpO3JldHVybiBzfSgpLGM9MCxiPXYubGVuZ3RoO2M8YjtjKyspcz12W2NdLGkocyl9LG49MCxzPShyPXRoaXMuZWxzKS5sZW5ndGg7bjxzO24rKyllPXJbbl0saShlKTt0aGlzLmJpbmRpbmdzLnNvcnQoZnVuY3Rpb24odCxlKXt2YXIgaSxuO3JldHVybigobnVsbCE9KGk9ZS5iaW5kZXIpP2kucHJpb3JpdHk6dm9pZCAwKXx8MCktKChudWxsIT0obj10LmJpbmRlcik/bi5wcmlvcml0eTp2b2lkIDApfHwwKX0pfSxlLnByb3RvdHlwZS50cmF2ZXJzZT1mdW5jdGlvbihlKXt2YXIgaSxuLHMscixvLGwsdSxoLGEscCxkLGMsZixiLHY7Zm9yKHI9dGhpcy5iaW5kaW5nUmVnRXhwKCksbz1cIlNDUklQVFwiPT09ZS5ub2RlTmFtZXx8XCJTVFlMRVwiPT09ZS5ub2RlTmFtZSxhPTAsZD0oZj1lLmF0dHJpYnV0ZXMpLmxlbmd0aDthPGQ7YSsrKWlmKGk9ZlthXSxyLnRlc3QoaS5uYW1lKSl7aWYodT1pLm5hbWUucmVwbGFjZShyLFwiXCIpLCEocz10aGlzLmJpbmRlcnNbdV0pKWZvcihsIGluIGI9dGhpcy5iaW5kZXJzKWg9YltsXSxcIipcIiE9PWwmJi0xIT09bC5pbmRleE9mKFwiKlwiKSYmbmV3IFJlZ0V4cChcIl5cIitsLnJlcGxhY2UoL1xcKi9nLFwiLitcIikrXCIkXCIpLnRlc3QodSkmJihzPWgpO3N8fChzPXRoaXMuYmluZGVyc1tcIipcIl0pLHMuYmxvY2smJihvPSEwLG49W2ldKX1mb3IocD0wLGM9KHY9bnx8ZS5hdHRyaWJ1dGVzKS5sZW5ndGg7cDxjO3ArKylpPXZbcF0sci50ZXN0KGkubmFtZSkmJih1PWkubmFtZS5yZXBsYWNlKHIsXCJcIiksdGhpcy5idWlsZEJpbmRpbmcoXCJCaW5kaW5nXCIsZSx1LGkudmFsdWUpKTtyZXR1cm4gb3x8KHU9ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHRoaXMuY29tcG9uZW50c1t1XSYmIWUuX2JvdW5kJiYodGhpcy5iaW5kaW5ncy5wdXNoKG5ldyB0LkNvbXBvbmVudEJpbmRpbmcodGhpcyxlLHUpKSxvPSEwKSksb30sZS5wcm90b3R5cGUuc2VsZWN0PWZ1bmN0aW9uKHQpe3ZhciBlLGksbixzLHI7Zm9yKHI9W10saT0wLG49KHM9dGhpcy5iaW5kaW5ncykubGVuZ3RoO2k8bjtpKyspdChlPXNbaV0pJiZyLnB1c2goZSk7cmV0dXJuIHJ9LGUucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24oKXt2YXIgdCxlLGk7Zm9yKHQ9MCxlPShpPXRoaXMuYmluZGluZ3MpLmxlbmd0aDt0PGU7dCsrKWlbdF0uYmluZCgpfSxlLnByb3RvdHlwZS51bmJpbmQ9ZnVuY3Rpb24oKXt2YXIgdCxlLGk7Zm9yKHQ9MCxlPShpPXRoaXMuYmluZGluZ3MpLmxlbmd0aDt0PGU7dCsrKWlbdF0udW5iaW5kKCl9LGUucHJvdG90eXBlLnN5bmM9ZnVuY3Rpb24oKXt2YXIgdCxlLGksbjtmb3IoZT0wLGk9KG49dGhpcy5iaW5kaW5ncykubGVuZ3RoO2U8aTtlKyspXCJmdW5jdGlvblwiPT10eXBlb2YodD1uW2VdKS5zeW5jJiZ0LnN5bmMoKX0sZS5wcm90b3R5cGUucHVibGlzaD1mdW5jdGlvbigpe3ZhciB0LGUsaTtmb3IodD0wLGU9KGk9dGhpcy5zZWxlY3QoZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIG51bGwhPShlPXQuYmluZGVyKT9lLnB1Ymxpc2hlczp2b2lkIDB9KSkubGVuZ3RoO3Q8ZTt0KyspaVt0XS5wdWJsaXNoKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0KXt2YXIgZSxpLG4scyxyLG87Zm9yKGkgaW4gbnVsbD09dCYmKHQ9e30pLHQpbj10W2ldLHRoaXMubW9kZWxzW2ldPW47Zm9yKHM9MCxyPShvPXRoaXMuYmluZGluZ3MpLmxlbmd0aDtzPHI7cysrKVwiZnVuY3Rpb25cIj09dHlwZW9mKGU9b1tzXSkudXBkYXRlJiZlLnVwZGF0ZSh0KX0sZX0oKSx0LkJpbmRpbmc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsZSxpLG4scyl7dGhpcy52aWV3PXQsdGhpcy5lbD1lLHRoaXMudHlwZT1pLHRoaXMua2V5cGF0aD1uLHRoaXMub3B0aW9ucz1udWxsIT1zP3M6e30sdGhpcy5nZXRWYWx1ZT1yKHRoaXMuZ2V0VmFsdWUsdGhpcyksdGhpcy51cGRhdGU9cih0aGlzLnVwZGF0ZSx0aGlzKSx0aGlzLnVuYmluZD1yKHRoaXMudW5iaW5kLHRoaXMpLHRoaXMuYmluZD1yKHRoaXMuYmluZCx0aGlzKSx0aGlzLnB1Ymxpc2g9cih0aGlzLnB1Ymxpc2gsdGhpcyksdGhpcy5zeW5jPXIodGhpcy5zeW5jLHRoaXMpLHRoaXMuc2V0PXIodGhpcy5zZXQsdGhpcyksdGhpcy5ldmVudEhhbmRsZXI9cih0aGlzLmV2ZW50SGFuZGxlcix0aGlzKSx0aGlzLmZvcm1hdHRlZFZhbHVlPXIodGhpcy5mb3JtYXR0ZWRWYWx1ZSx0aGlzKSx0aGlzLnBhcnNlRm9ybWF0dGVyQXJndW1lbnRzPXIodGhpcy5wYXJzZUZvcm1hdHRlckFyZ3VtZW50cyx0aGlzKSx0aGlzLnBhcnNlVGFyZ2V0PXIodGhpcy5wYXJzZVRhcmdldCx0aGlzKSx0aGlzLm9ic2VydmU9cih0aGlzLm9ic2VydmUsdGhpcyksdGhpcy5zZXRCaW5kZXI9cih0aGlzLnNldEJpbmRlcix0aGlzKSx0aGlzLmZvcm1hdHRlcnM9dGhpcy5vcHRpb25zLmZvcm1hdHRlcnN8fFtdLHRoaXMuZGVwZW5kZW5jaWVzPVtdLHRoaXMuZm9ybWF0dGVyT2JzZXJ2ZXJzPXt9LHRoaXMubW9kZWw9dm9pZCAwLHRoaXMuc2V0QmluZGVyKCl9cmV0dXJuIGUucHJvdG90eXBlLnNldEJpbmRlcj1mdW5jdGlvbigpe3ZhciB0LGUsaTtpZighKHRoaXMuYmluZGVyPXRoaXMudmlldy5iaW5kZXJzW3RoaXMudHlwZV0pKWZvcih0IGluIGk9dGhpcy52aWV3LmJpbmRlcnMpZT1pW3RdLFwiKlwiIT09dCYmLTEhPT10LmluZGV4T2YoXCIqXCIpJiZuZXcgUmVnRXhwKFwiXlwiK3QucmVwbGFjZSgvXFwqL2csXCIuK1wiKStcIiRcIikudGVzdCh0aGlzLnR5cGUpJiYodGhpcy5iaW5kZXI9ZSx0aGlzLmFyZ3M9bmV3IFJlZ0V4cChcIl5cIit0LnJlcGxhY2UoL1xcKi9nLFwiKC4rKVwiKStcIiRcIikuZXhlYyh0aGlzLnR5cGUpLHRoaXMuYXJncy5zaGlmdCgpKTtpZih0aGlzLmJpbmRlcnx8KHRoaXMuYmluZGVyPXRoaXMudmlldy5iaW5kZXJzW1wiKlwiXSksdGhpcy5iaW5kZXIgaW5zdGFuY2VvZiBGdW5jdGlvbilyZXR1cm4gdGhpcy5iaW5kZXI9e3JvdXRpbmU6dGhpcy5iaW5kZXJ9fSxlLnByb3RvdHlwZS5vYnNlcnZlPWZ1bmN0aW9uKGUsaSxuKXtyZXR1cm4gdC5zaWdodGdsYXNzKGUsaSxuLHtyb290OnRoaXMudmlldy5yb290SW50ZXJmYWNlLGFkYXB0ZXJzOnRoaXMudmlldy5hZGFwdGVyc30pfSxlLnByb3RvdHlwZS5wYXJzZVRhcmdldD1mdW5jdGlvbigpe3ZhciBlO3JldHVybihlPXQuVHlwZVBhcnNlci5wYXJzZSh0aGlzLmtleXBhdGgpKS50eXBlPT09dC5UeXBlUGFyc2VyLnR5cGVzLnByaW1pdGl2ZT90aGlzLnZhbHVlPWUudmFsdWU6KHRoaXMub2JzZXJ2ZXI9dGhpcy5vYnNlcnZlKHRoaXMudmlldy5tb2RlbHMsdGhpcy5rZXlwYXRoLHRoaXMuc3luYyksdGhpcy5tb2RlbD10aGlzLm9ic2VydmVyLnRhcmdldCl9LGUucHJvdG90eXBlLnBhcnNlRm9ybWF0dGVyQXJndW1lbnRzPWZ1bmN0aW9uKGUsaSl7dmFyIG4scyxyLG8sbCx1LGg7Zm9yKGU9ZnVuY3Rpb24oKXt2YXIgaSxuLHI7Zm9yKHI9W10saT0wLG49ZS5sZW5ndGg7aTxuO2krKylzPWVbaV0sci5wdXNoKHQuVHlwZVBhcnNlci5wYXJzZShzKSk7cmV0dXJuIHJ9KCksbz1bXSxuPXU9MCxoPWUubGVuZ3RoO3U8aDtuPSsrdSlzPWVbbl0sby5wdXNoKHMudHlwZT09PXQuVHlwZVBhcnNlci50eXBlcy5wcmltaXRpdmU/cy52YWx1ZTooKGw9dGhpcy5mb3JtYXR0ZXJPYnNlcnZlcnMpW2ldfHwobFtpXT17fSksKHI9dGhpcy5mb3JtYXR0ZXJPYnNlcnZlcnNbaV1bbl0pfHwocj10aGlzLm9ic2VydmUodGhpcy52aWV3Lm1vZGVscyxzLnZhbHVlLHRoaXMuc3luYyksdGhpcy5mb3JtYXR0ZXJPYnNlcnZlcnNbaV1bbl09ciksci52YWx1ZSgpKSk7cmV0dXJuIG99LGUucHJvdG90eXBlLmZvcm1hdHRlZFZhbHVlPWZ1bmN0aW9uKHQpe3ZhciBlLGksbixzLHIsbCx1LGgsYTtmb3IoaT1sPTAsdT0oaD10aGlzLmZvcm1hdHRlcnMpLmxlbmd0aDtsPHU7aT0rK2wpcz0oZT0obj1oW2ldKS5tYXRjaCgvW15cXHMnXSt8JyhbXiddfCdbXlxcc10pKid8XCIoW15cIl18XCJbXlxcc10pKlwiL2cpKS5zaGlmdCgpLG49dGhpcy52aWV3LmZvcm1hdHRlcnNbc10scj10aGlzLnBhcnNlRm9ybWF0dGVyQXJndW1lbnRzKGUsaSksKG51bGwhPW4/bi5yZWFkOnZvaWQgMClpbnN0YW5jZW9mIEZ1bmN0aW9uP3Q9KGE9bi5yZWFkKS5jYWxsLmFwcGx5KGEsW3RoaXMubW9kZWwsdF0uY29uY2F0KG8uY2FsbChyKSkpOm4gaW5zdGFuY2VvZiBGdW5jdGlvbiYmKHQ9bi5jYWxsLmFwcGx5KG4sW3RoaXMubW9kZWwsdF0uY29uY2F0KG8uY2FsbChyKSkpKTtyZXR1cm4gdH0sZS5wcm90b3R5cGUuZXZlbnRIYW5kbGVyPWZ1bmN0aW9uKHQpe3ZhciBlLGk7cmV0dXJuIGk9KGU9dGhpcykudmlldy5oYW5kbGVyLGZ1bmN0aW9uKG4pe3JldHVybiBpLmNhbGwodCx0aGlzLG4sZSl9fSxlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oZSl7dmFyIGk7cmV0dXJuIGU9ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYhdGhpcy5iaW5kZXIuZnVuY3Rpb24mJnQucHVibGljLmV4ZWN1dGVGdW5jdGlvbnM/dGhpcy5mb3JtYXR0ZWRWYWx1ZShlLmNhbGwodGhpcy5tb2RlbCkpOnRoaXMuZm9ybWF0dGVkVmFsdWUoZSksbnVsbCE9KGk9dGhpcy5iaW5kZXIucm91dGluZSk/aS5jYWxsKHRoaXMsdGhpcy5lbCxlKTp2b2lkIDB9LGUucHJvdG90eXBlLnN5bmM9ZnVuY3Rpb24oKXt2YXIgdCxlO3JldHVybiB0aGlzLnNldChmdW5jdGlvbigpe3ZhciBpLG4scyxyLG8sbCx1O2lmKHRoaXMub2JzZXJ2ZXIpe2lmKHRoaXMubW9kZWwhPT10aGlzLm9ic2VydmVyLnRhcmdldCl7Zm9yKGk9MCxzPShvPXRoaXMuZGVwZW5kZW5jaWVzKS5sZW5ndGg7aTxzO2krKykoZT1vW2ldKS51bm9ic2VydmUoKTtpZih0aGlzLmRlcGVuZGVuY2llcz1bXSxudWxsIT0odGhpcy5tb2RlbD10aGlzLm9ic2VydmVyLnRhcmdldCkmJihudWxsIT0obD10aGlzLm9wdGlvbnMuZGVwZW5kZW5jaWVzKT9sLmxlbmd0aDp2b2lkIDApKWZvcihuPTAscj0odT10aGlzLm9wdGlvbnMuZGVwZW5kZW5jaWVzKS5sZW5ndGg7bjxyO24rKyl0PXVbbl0sZT10aGlzLm9ic2VydmUodGhpcy5tb2RlbCx0LHRoaXMuc3luYyksdGhpcy5kZXBlbmRlbmNpZXMucHVzaChlKX1yZXR1cm4gdGhpcy5vYnNlcnZlci52YWx1ZSgpfXJldHVybiB0aGlzLnZhbHVlfS5jYWxsKHRoaXMpKX0sZS5wcm90b3R5cGUucHVibGlzaD1mdW5jdGlvbigpe3ZhciB0LGUsaSxuLHMscixsLHUsaCxhLHAsZDtpZih0aGlzLm9ic2VydmVyKXtmb3IobD10aGlzLmdldFZhbHVlKHRoaXMuZWwpLHM9dGhpcy5mb3JtYXR0ZXJzLmxlbmd0aC0xLGk9dT0wLGg9KGE9dGhpcy5mb3JtYXR0ZXJzLnNsaWNlKDApLnJldmVyc2UoKSkubGVuZ3RoO3U8aDtpPSsrdSllPXMtaSxuPSh0PWFbaV0uc3BsaXQoL1xccysvKSkuc2hpZnQoKSxyPXRoaXMucGFyc2VGb3JtYXR0ZXJBcmd1bWVudHModCxlKSwobnVsbCE9KHA9dGhpcy52aWV3LmZvcm1hdHRlcnNbbl0pP3AucHVibGlzaDp2b2lkIDApJiYobD0oZD10aGlzLnZpZXcuZm9ybWF0dGVyc1tuXSkucHVibGlzaC5hcHBseShkLFtsXS5jb25jYXQoby5jYWxsKHIpKSkpO3JldHVybiB0aGlzLm9ic2VydmVyLnNldFZhbHVlKGwpfX0sZS5wcm90b3R5cGUuYmluZD1mdW5jdGlvbigpe3ZhciB0LGUsaSxuLHMscixvO2lmKHRoaXMucGFyc2VUYXJnZXQoKSxudWxsIT0ocz10aGlzLmJpbmRlci5iaW5kKSYmcy5jYWxsKHRoaXMsdGhpcy5lbCksbnVsbCE9dGhpcy5tb2RlbCYmKG51bGwhPShyPXRoaXMub3B0aW9ucy5kZXBlbmRlbmNpZXMpP3IubGVuZ3RoOnZvaWQgMCkpZm9yKGk9MCxuPShvPXRoaXMub3B0aW9ucy5kZXBlbmRlbmNpZXMpLmxlbmd0aDtpPG47aSsrKXQ9b1tpXSxlPXRoaXMub2JzZXJ2ZSh0aGlzLm1vZGVsLHQsdGhpcy5zeW5jKSx0aGlzLmRlcGVuZGVuY2llcy5wdXNoKGUpO2lmKHRoaXMudmlldy5wcmVsb2FkRGF0YSlyZXR1cm4gdGhpcy5zeW5jKCl9LGUucHJvdG90eXBlLnVuYmluZD1mdW5jdGlvbigpe3ZhciB0LGUsaSxuLHMscixvLGwsdTtmb3IobnVsbCE9KHI9dGhpcy5iaW5kZXIudW5iaW5kKSYmci5jYWxsKHRoaXMsdGhpcy5lbCksbnVsbCE9KG89dGhpcy5vYnNlcnZlcikmJm8udW5vYnNlcnZlKCksbj0wLHM9KGw9dGhpcy5kZXBlbmRlbmNpZXMpLmxlbmd0aDtuPHM7bisrKWxbbl0udW5vYnNlcnZlKCk7Zm9yKGkgaW4gdGhpcy5kZXBlbmRlbmNpZXM9W10sdT10aGlzLmZvcm1hdHRlck9ic2VydmVycylmb3IodCBpbiBlPXVbaV0pZVt0XS51bm9ic2VydmUoKTtyZXR1cm4gdGhpcy5mb3JtYXR0ZXJPYnNlcnZlcnM9e319LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0KXt2YXIgZSxpO3JldHVybiBudWxsPT10JiYodD17fSksdGhpcy5tb2RlbD1udWxsIT0oZT10aGlzLm9ic2VydmVyKT9lLnRhcmdldDp2b2lkIDAsbnVsbCE9KGk9dGhpcy5iaW5kZXIudXBkYXRlKT9pLmNhbGwodGhpcyx0KTp2b2lkIDB9LGUucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJpbmRlciYmbnVsbCE9dGhpcy5iaW5kZXIuZ2V0VmFsdWU/dGhpcy5iaW5kZXIuZ2V0VmFsdWUuY2FsbCh0aGlzLGUpOnQuVXRpbC5nZXRJbnB1dFZhbHVlKGUpfSxlfSgpLHQuQ29tcG9uZW50QmluZGluZz1mdW5jdGlvbihlKXtmdW5jdGlvbiBpKGUsaSxuKXt2YXIgcyxvLGwsdSxhLHAsZCxjO2Zvcih0aGlzLnZpZXc9ZSx0aGlzLmVsPWksdGhpcy50eXBlPW4sdGhpcy51bmJpbmQ9cih0aGlzLnVuYmluZCx0aGlzKSx0aGlzLmJpbmQ9cih0aGlzLmJpbmQsdGhpcyksdGhpcy5sb2NhbHM9cih0aGlzLmxvY2Fscyx0aGlzKSx0aGlzLmNvbXBvbmVudD10aGlzLnZpZXcuY29tcG9uZW50c1t0aGlzLnR5cGVdLHRoaXMuc3RhdGljPXt9LHRoaXMub2JzZXJ2ZXJzPXt9LHRoaXMudXBzdHJlYW1PYnNlcnZlcnM9e30sbz1lLmJpbmRpbmdSZWdFeHAoKSxhPTAscD0oZD10aGlzLmVsLmF0dHJpYnV0ZXN8fFtdKS5sZW5ndGg7YTxwO2ErKylzPWRbYV0sby50ZXN0KHMubmFtZSl8fChsPXRoaXMuY2FtZWxDYXNlKHMubmFtZSksdT10LlR5cGVQYXJzZXIucGFyc2Uocy52YWx1ZSksaC5jYWxsKG51bGwhPShjPXRoaXMuY29tcG9uZW50LnN0YXRpYyk/YzpbXSxsKT49MD90aGlzLnN0YXRpY1tsXT1zLnZhbHVlOnUudHlwZT09PXQuVHlwZVBhcnNlci50eXBlcy5wcmltaXRpdmU/dGhpcy5zdGF0aWNbbF09dS52YWx1ZTp0aGlzLm9ic2VydmVyc1tsXT1zLnZhbHVlKX1yZXR1cm4gdShpLGUpLGkucHJvdG90eXBlLnN5bmM9ZnVuY3Rpb24oKXt9LGkucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe30saS5wcm90b3R5cGUucHVibGlzaD1mdW5jdGlvbigpe30saS5wcm90b3R5cGUubG9jYWxzPWZ1bmN0aW9uKCl7dmFyIHQsZSxpLG4scyxyO2Zvcih0IGluIGk9e30scz10aGlzLnN0YXRpYyluPXNbdF0saVt0XT1uO2Zvcih0IGluIHI9dGhpcy5vYnNlcnZlcnMpZT1yW3RdLGlbdF09ZS52YWx1ZSgpO3JldHVybiBpfSxpLnByb3RvdHlwZS5jYW1lbENhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvLShbYS16XSkvZyxmdW5jdGlvbih0KXtyZXR1cm4gdFsxXS50b1VwcGVyQ2FzZSgpfSl9LGkucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24oKXt2YXIgZSxpLG4scyxyLG8sbCx1LGgsYSxwLGQsYyxmLGIsdixtLHksZyx3O2lmKCF0aGlzLmJvdW5kKXtmb3IoaSBpbiBmPXRoaXMub2JzZXJ2ZXJzKW49ZltpXSx0aGlzLm9ic2VydmVyc1tpXT10aGlzLm9ic2VydmUodGhpcy52aWV3Lm1vZGVscyxuLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5jb21wb25lbnRWaWV3Lm1vZGVsc1tlXT10Lm9ic2VydmVyc1tlXS52YWx1ZSgpfX19KHRoaXMpLmNhbGwodGhpcyxpKSk7dGhpcy5ib3VuZD0hMH1pZihudWxsIT10aGlzLmNvbXBvbmVudFZpZXcpdGhpcy5jb21wb25lbnRWaWV3LmJpbmQoKTtlbHNle2Zvcih0aGlzLmVsLmlubmVySFRNTD10aGlzLmNvbXBvbmVudC50ZW1wbGF0ZS5jYWxsKHRoaXMpLGw9dGhpcy5jb21wb25lbnQuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsdGhpcy5lbCx0aGlzLmxvY2FscygpKSx0aGlzLmVsLl9ib3VuZD0hMCxvPXt9LGE9MCxkPShiPXQuZXh0ZW5zaW9ucykubGVuZ3RoO2E8ZDthKyspe2lmKG9bcj1iW2FdXT17fSx0aGlzLmNvbXBvbmVudFtyXSlmb3IoZSBpbiB2PXRoaXMuY29tcG9uZW50W3JdKXU9dltlXSxvW3JdW2VdPXU7Zm9yKGUgaW4gbT10aGlzLnZpZXdbcl0pdT1tW2VdLG51bGw9PShoPW9bcl0pW2VdJiYoaFtlXT11KX1mb3IocD0wLGM9KHk9dC5vcHRpb25zKS5sZW5ndGg7cDxjO3ArKylvW3I9eVtwXV09bnVsbCE9KGc9dGhpcy5jb21wb25lbnRbcl0pP2c6dGhpcy52aWV3W3JdO2ZvcihpIGluIHRoaXMuY29tcG9uZW50Vmlldz1uZXcgdC5WaWV3KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuZWwuY2hpbGROb2RlcyksbCxvKSx0aGlzLmNvbXBvbmVudFZpZXcuYmluZCgpLHc9dGhpcy5vYnNlcnZlcnMpcz13W2ldLHRoaXMudXBzdHJlYW1PYnNlcnZlcnNbaV09dGhpcy5vYnNlcnZlKHRoaXMuY29tcG9uZW50Vmlldy5tb2RlbHMsaSxmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxpKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaS5zZXRWYWx1ZSh0LmNvbXBvbmVudFZpZXcubW9kZWxzW2VdKX19fSh0aGlzKS5jYWxsKHRoaXMsaSxzKSl9fSxpLnByb3RvdHlwZS51bmJpbmQ9ZnVuY3Rpb24oKXt2YXIgdCxlLGksbjtmb3IodCBpbiBlPXRoaXMudXBzdHJlYW1PYnNlcnZlcnMpZVt0XS51bm9ic2VydmUoKTtmb3IodCBpbiBpPXRoaXMub2JzZXJ2ZXJzKWlbdF0udW5vYnNlcnZlKCk7cmV0dXJuIG51bGwhPShuPXRoaXMuY29tcG9uZW50Vmlldyk/bi51bmJpbmQuY2FsbCh0aGlzKTp2b2lkIDB9LGl9KHQuQmluZGluZyksdC5UZXh0QmluZGluZz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsZSxpLG4scyl7dGhpcy52aWV3PXQsdGhpcy5lbD1lLHRoaXMudHlwZT1pLHRoaXMua2V5cGF0aD1uLHRoaXMub3B0aW9ucz1udWxsIT1zP3M6e30sdGhpcy5zeW5jPXIodGhpcy5zeW5jLHRoaXMpLHRoaXMuZm9ybWF0dGVycz10aGlzLm9wdGlvbnMuZm9ybWF0dGVyc3x8W10sdGhpcy5kZXBlbmRlbmNpZXM9W10sdGhpcy5mb3JtYXR0ZXJPYnNlcnZlcnM9e319cmV0dXJuIHUoZSx0KSxlLnByb3RvdHlwZS5iaW5kZXI9e3JvdXRpbmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5kYXRhPW51bGwhPWU/ZTpcIlwifX0sZS5wcm90b3R5cGUuc3luYz1mdW5jdGlvbigpe3JldHVybiBlLl9fc3VwZXJfXy5zeW5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZX0odC5CaW5kaW5nKSx0LnB1YmxpYy5iaW5kZXJzLnRleHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dC50ZXh0Q29udGVudD90LnRleHRDb250ZW50PW51bGwhPWU/ZTpcIlwiOnQuaW5uZXJUZXh0PW51bGwhPWU/ZTpcIlwifSx0LnB1YmxpYy5iaW5kZXJzLmh0bWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5pbm5lckhUTUw9bnVsbCE9ZT9lOlwiXCJ9LHQucHVibGljLmJpbmRlcnMuc2hvdz1mdW5jdGlvbih0LGUpe3JldHVybiB0LnN0eWxlLmRpc3BsYXk9ZT9cIlwiOlwibm9uZVwifSx0LnB1YmxpYy5iaW5kZXJzLmhpZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zdHlsZS5kaXNwbGF5PWU/XCJub25lXCI6XCJcIn0sdC5wdWJsaWMuYmluZGVycy5lbmFibGVkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZGlzYWJsZWQ9IWV9LHQucHVibGljLmJpbmRlcnMuZGlzYWJsZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5kaXNhYmxlZD0hIWV9LHQucHVibGljLmJpbmRlcnMuY2hlY2tlZD17cHVibGlzaGVzOiEwLHByaW9yaXR5OjJlMyxiaW5kOmZ1bmN0aW9uKGUpe3JldHVybiB0LlV0aWwuYmluZEV2ZW50KGUsXCJjaGFuZ2VcIix0aGlzLnB1Ymxpc2gpfSx1bmJpbmQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuVXRpbC51bmJpbmRFdmVudChlLFwiY2hhbmdlXCIsdGhpcy5wdWJsaXNoKX0scm91dGluZTpmdW5jdGlvbih0LGUpe3ZhciBpO3JldHVyblwicmFkaW9cIj09PXQudHlwZT90LmNoZWNrZWQ9KG51bGwhPShpPXQudmFsdWUpP2kudG9TdHJpbmcoKTp2b2lkIDApPT09KG51bGwhPWU/ZS50b1N0cmluZygpOnZvaWQgMCk6dC5jaGVja2VkPSEhZX19LHQucHVibGljLmJpbmRlcnMudW5jaGVja2VkPXtwdWJsaXNoZXM6ITAscHJpb3JpdHk6MmUzLGJpbmQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHQuVXRpbC5iaW5kRXZlbnQoZSxcImNoYW5nZVwiLHRoaXMucHVibGlzaCl9LHVuYmluZDpmdW5jdGlvbihlKXtyZXR1cm4gdC5VdGlsLnVuYmluZEV2ZW50KGUsXCJjaGFuZ2VcIix0aGlzLnB1Ymxpc2gpfSxyb3V0aW5lOmZ1bmN0aW9uKHQsZSl7dmFyIGk7cmV0dXJuXCJyYWRpb1wiPT09dC50eXBlP3QuY2hlY2tlZD0obnVsbCE9KGk9dC52YWx1ZSk/aS50b1N0cmluZygpOnZvaWQgMCkhPT0obnVsbCE9ZT9lLnRvU3RyaW5nKCk6dm9pZCAwKTp0LmNoZWNrZWQ9IWV9fSx0LnB1YmxpYy5iaW5kZXJzLnZhbHVlPXtwdWJsaXNoZXM6ITAscHJpb3JpdHk6M2UzLGJpbmQ6ZnVuY3Rpb24oZSl7aWYoXCJJTlBVVFwiIT09ZS50YWdOYW1lfHxcInJhZGlvXCIhPT1lLnR5cGUpcmV0dXJuIHRoaXMuZXZlbnQ9XCJTRUxFQ1RcIj09PWUudGFnTmFtZT9cImNoYW5nZVwiOlwiaW5wdXRcIix0LlV0aWwuYmluZEV2ZW50KGUsdGhpcy5ldmVudCx0aGlzLnB1Ymxpc2gpfSx1bmJpbmQ6ZnVuY3Rpb24oZSl7aWYoXCJJTlBVVFwiIT09ZS50YWdOYW1lfHxcInJhZGlvXCIhPT1lLnR5cGUpcmV0dXJuIHQuVXRpbC51bmJpbmRFdmVudChlLHRoaXMuZXZlbnQsdGhpcy5wdWJsaXNoKX0scm91dGluZTpmdW5jdGlvbih0LGUpe3ZhciBuLHMscixvLGwsdSxhO2lmKFwiSU5QVVRcIj09PXQudGFnTmFtZSYmXCJyYWRpb1wiPT09dC50eXBlKXJldHVybiB0LnNldEF0dHJpYnV0ZShcInZhbHVlXCIsZSk7aWYobnVsbCE9d2luZG93LmpRdWVyeSl7aWYodD1pKHQpLChudWxsIT1lP2UudG9TdHJpbmcoKTp2b2lkIDApIT09KG51bGwhPShvPXQudmFsKCkpP28udG9TdHJpbmcoKTp2b2lkIDApKXJldHVybiB0LnZhbChudWxsIT1lP2U6XCJcIil9ZWxzZSBpZihcInNlbGVjdC1tdWx0aXBsZVwiPT09dC50eXBlKXtpZihudWxsIT1lKXtmb3IoYT1bXSxzPTAscj10Lmxlbmd0aDtzPHI7cysrKW49dFtzXSxhLnB1c2gobi5zZWxlY3RlZD0obD1uLnZhbHVlLGguY2FsbChlLGwpPj0wKSk7cmV0dXJuIGF9fWVsc2UgaWYoKG51bGwhPWU/ZS50b1N0cmluZygpOnZvaWQgMCkhPT0obnVsbCE9KHU9dC52YWx1ZSk/dS50b1N0cmluZygpOnZvaWQgMCkpcmV0dXJuIHQudmFsdWU9bnVsbCE9ZT9lOlwiXCJ9fSx0LnB1YmxpYy5iaW5kZXJzLmlmPXtibG9jazohMCxwcmlvcml0eTo0ZTMsYmluZDpmdW5jdGlvbih0KXt2YXIgZSxpO2lmKG51bGw9PXRoaXMubWFya2VyKXJldHVybiBlPVt0aGlzLnZpZXcucHJlZml4LHRoaXMudHlwZV0uam9pbihcIi1cIikucmVwbGFjZShcIi0tXCIsXCItXCIpLGk9dC5nZXRBdHRyaWJ1dGUoZSksdGhpcy5tYXJrZXI9ZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIiByaXZldHM6IFwiK3RoaXMudHlwZStcIiBcIitpK1wiIFwiKSx0aGlzLmJvdW5kPSExLHQucmVtb3ZlQXR0cmlidXRlKGUpLHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5tYXJrZXIsdCksdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpfSx1bmJpbmQ6ZnVuY3Rpb24oKXtpZih0aGlzLm5lc3RlZClyZXR1cm4gdGhpcy5uZXN0ZWQudW5iaW5kKCksdGhpcy5ib3VuZD0hMX0scm91dGluZTpmdW5jdGlvbihlLGkpe3ZhciBuLHMscixvO2lmKCEhaT09IXRoaXMuYm91bmQpe2lmKGkpe2ZvcihuIGluIHI9e30sbz10aGlzLnZpZXcubW9kZWxzKXM9b1tuXSxyW25dPXM7cmV0dXJuKHRoaXMubmVzdGVkfHwodGhpcy5uZXN0ZWQ9bmV3IHQuVmlldyhlLHIsdGhpcy52aWV3Lm9wdGlvbnMoKSkpKS5iaW5kKCksdGhpcy5tYXJrZXIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzLm1hcmtlci5uZXh0U2libGluZyksdGhpcy5ib3VuZD0hMH1yZXR1cm4gZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLHRoaXMubmVzdGVkLnVuYmluZCgpLHRoaXMuYm91bmQ9ITF9fSx1cGRhdGU6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIG51bGwhPShlPXRoaXMubmVzdGVkKT9lLnVwZGF0ZSh0KTp2b2lkIDB9fSx0LnB1YmxpYy5iaW5kZXJzLnVubGVzcz17YmxvY2s6ITAscHJpb3JpdHk6NGUzLGJpbmQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHVibGljLmJpbmRlcnMuaWYuYmluZC5jYWxsKHRoaXMsZSl9LHVuYmluZDpmdW5jdGlvbigpe3JldHVybiB0LnB1YmxpYy5iaW5kZXJzLmlmLnVuYmluZC5jYWxsKHRoaXMpfSxyb3V0aW5lOmZ1bmN0aW9uKGUsaSl7cmV0dXJuIHQucHVibGljLmJpbmRlcnMuaWYucm91dGluZS5jYWxsKHRoaXMsZSwhaSl9LHVwZGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4gdC5wdWJsaWMuYmluZGVycy5pZi51cGRhdGUuY2FsbCh0aGlzLGUpfX0sdC5wdWJsaWMuYmluZGVyc1tcIm9uLSpcIl09e2Z1bmN0aW9uOiEwLHByaW9yaXR5OjFlMyx1bmJpbmQ6ZnVuY3Rpb24oZSl7aWYodGhpcy5oYW5kbGVyKXJldHVybiB0LlV0aWwudW5iaW5kRXZlbnQoZSx0aGlzLmFyZ3NbMF0sdGhpcy5oYW5kbGVyKX0scm91dGluZTpmdW5jdGlvbihlLGkpe3JldHVybiB0aGlzLmhhbmRsZXImJnQuVXRpbC51bmJpbmRFdmVudChlLHRoaXMuYXJnc1swXSx0aGlzLmhhbmRsZXIpLHQuVXRpbC5iaW5kRXZlbnQoZSx0aGlzLmFyZ3NbMF0sdGhpcy5oYW5kbGVyPXRoaXMuZXZlbnRIYW5kbGVyKGkpKX19LHQucHVibGljLmJpbmRlcnNbXCJlYWNoLSpcIl09e2Jsb2NrOiEwLHByaW9yaXR5OjRlMyxiaW5kOmZ1bmN0aW9uKHQpe3ZhciBlLGksbixzO2lmKG51bGw9PXRoaXMubWFya2VyKWU9W3RoaXMudmlldy5wcmVmaXgsdGhpcy50eXBlXS5qb2luKFwiLVwiKS5yZXBsYWNlKFwiLS1cIixcIi1cIiksdGhpcy5tYXJrZXI9ZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIiByaXZldHM6IFwiK3RoaXMudHlwZStcIiBcIiksdGhpcy5pdGVyYXRlZD1bXSx0LnJlbW92ZUF0dHJpYnV0ZShlKSx0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMubWFya2VyLHQpLHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KTtlbHNlIGZvcihpPTAsbj0ocz10aGlzLml0ZXJhdGVkKS5sZW5ndGg7aTxuO2krKylzW2ldLmJpbmQoKX0sdW5iaW5kOmZ1bmN0aW9uKHQpe3ZhciBlLGksbjtpZihudWxsIT10aGlzLml0ZXJhdGVkKWZvcihlPTAsaT0obj10aGlzLml0ZXJhdGVkKS5sZW5ndGg7ZTxpO2UrKyluW2VdLnVuYmluZCgpfSxyb3V0aW5lOmZ1bmN0aW9uKGUsaSl7dmFyIG4scyxyLG8sbCx1LGgsYSxwLGQsYyxmLGIsdixtLHksZyx3LGs7aWYodT10aGlzLmFyZ3NbMF0saT1pfHxbXSx0aGlzLml0ZXJhdGVkLmxlbmd0aD5pLmxlbmd0aClmb3IoYz0wLHY9KGc9QXJyYXkodGhpcy5pdGVyYXRlZC5sZW5ndGgtaS5sZW5ndGgpKS5sZW5ndGg7Yzx2O2MrKylnW2NdLChkPXRoaXMuaXRlcmF0ZWQucG9wKCkpLnVuYmluZCgpLHRoaXMubWFya2VyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZC5lbHNbMF0pO2ZvcihyPWY9MCxtPWkubGVuZ3RoO2Y8bTtyPSsrZilpZihsPWlbcl0sKHM9e2luZGV4OnJ9KVt0LnB1YmxpYy5pdGVyYXRpb25BbGlhcyh1KV09cixzW3VdPWwsbnVsbD09dGhpcy5pdGVyYXRlZFtyXSl7Zm9yKG8gaW4gdz10aGlzLnZpZXcubW9kZWxzKWw9d1tvXSxudWxsPT1zW29dJiYoc1tvXT1sKTthPXRoaXMuaXRlcmF0ZWQubGVuZ3RoP3RoaXMuaXRlcmF0ZWRbdGhpcy5pdGVyYXRlZC5sZW5ndGgtMV0uZWxzWzBdOnRoaXMubWFya2VyLChoPXRoaXMudmlldy5vcHRpb25zKCkpLnByZWxvYWREYXRhPSEwLHA9ZS5jbG9uZU5vZGUoITApLChkPW5ldyB0LlZpZXcocCxzLGgpKS5iaW5kKCksdGhpcy5pdGVyYXRlZC5wdXNoKGQpLHRoaXMubWFya2VyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHAsYS5uZXh0U2libGluZyl9ZWxzZSB0aGlzLml0ZXJhdGVkW3JdLm1vZGVsc1t1XSE9PWwmJnRoaXMuaXRlcmF0ZWRbcl0udXBkYXRlKHMpO2lmKFwiT1BUSU9OXCI9PT1lLm5vZGVOYW1lKWZvcihiPTAseT0oaz10aGlzLnZpZXcuYmluZGluZ3MpLmxlbmd0aDtiPHk7YisrKShuPWtbYl0pLmVsPT09dGhpcy5tYXJrZXIucGFyZW50Tm9kZSYmXCJ2YWx1ZVwiPT09bi50eXBlJiZuLnN5bmMoKX0sdXBkYXRlOmZ1bmN0aW9uKHQpe3ZhciBlLGksbixzLHIsbztmb3IoaSBpbiBlPXt9LHQpbj10W2ldLGkhPT10aGlzLmFyZ3NbMF0mJihlW2ldPW4pO2ZvcihzPTAscj0obz10aGlzLml0ZXJhdGVkKS5sZW5ndGg7czxyO3MrKylvW3NdLnVwZGF0ZShlKX19LHQucHVibGljLmJpbmRlcnNbXCJjbGFzcy0qXCJdPWZ1bmN0aW9uKHQsZSl7dmFyIGk7aWYoIWU9PSgtMSE9PShpPVwiIFwiK3QuY2xhc3NOYW1lK1wiIFwiKS5pbmRleE9mKFwiIFwiK3RoaXMuYXJnc1swXStcIiBcIikpKXJldHVybiB0LmNsYXNzTmFtZT1lP3QuY2xhc3NOYW1lK1wiIFwiK3RoaXMuYXJnc1swXTppLnJlcGxhY2UoXCIgXCIrdGhpcy5hcmdzWzBdK1wiIFwiLFwiIFwiKS50cmltKCl9LHQucHVibGljLmJpbmRlcnNbXCIqXCJdPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGwhPWU/dC5zZXRBdHRyaWJ1dGUodGhpcy50eXBlLGUpOnQucmVtb3ZlQXR0cmlidXRlKHRoaXMudHlwZSl9LHQucHVibGljLmZvcm1hdHRlcnMuY2FsbD1mdW5jdGlvbigpe3ZhciB0LGU7cmV0dXJuIGU9YXJndW1lbnRzWzBdLHQ9Mjw9YXJndW1lbnRzLmxlbmd0aD9vLmNhbGwoYXJndW1lbnRzLDEpOltdLGUuY2FsbC5hcHBseShlLFt0aGlzXS5jb25jYXQoby5jYWxsKHQpKSl9LHQucHVibGljLmFkYXB0ZXJzW1wiLlwiXT17aWQ6XCJfcnZcIixjb3VudGVyOjAsd2Vha21hcDp7fSx3ZWFrUmVmZXJlbmNlOmZ1bmN0aW9uKHQpe3ZhciBlLGksbjtyZXR1cm4gdC5oYXNPd25Qcm9wZXJ0eSh0aGlzLmlkKXx8KGU9dGhpcy5jb3VudGVyKyssT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsdGhpcy5pZCx7dmFsdWU6ZX0pKSwoaT10aGlzLndlYWttYXApW249dFt0aGlzLmlkXV18fChpW25dPXtjYWxsYmFja3M6e319KX0sY2xlYW51cFdlYWtSZWZlcmVuY2U6ZnVuY3Rpb24odCxlKXtpZighKE9iamVjdC5rZXlzKHQuY2FsbGJhY2tzKS5sZW5ndGh8fHQucG9pbnRlcnMmJk9iamVjdC5rZXlzKHQucG9pbnRlcnMpLmxlbmd0aCkpcmV0dXJuIGRlbGV0ZSB0aGlzLndlYWttYXBbZV19LHN0dWJGdW5jdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBpLG4scztyZXR1cm4gbj10W2VdLGk9dGhpcy53ZWFrUmVmZXJlbmNlKHQpLHM9dGhpcy53ZWFrbWFwLHRbZV09ZnVuY3Rpb24oKXt2YXIgZSxyLG8sbCx1LGgsYSxwLGQ7Zm9yKHIgaW4gbz1uLmFwcGx5KHQsYXJndW1lbnRzKSxoPWkucG9pbnRlcnMpZm9yKGU9aFtyXSxsPTAsdT0oZD1udWxsIT0oYT1udWxsIT0ocD1zW3JdKT9wLmNhbGxiYWNrc1tlXTp2b2lkIDApP2E6W10pLmxlbmd0aDtsPHU7bCsrKSgwLGRbbF0pKCk7cmV0dXJuIG99fSxvYnNlcnZlTXV0YXRpb25zOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbixzLHIsbyxsLHU7aWYoQXJyYXkuaXNBcnJheSh0KSl7aWYobnVsbD09KHI9dGhpcy53ZWFrUmVmZXJlbmNlKHQpKS5wb2ludGVycylmb3Ioci5wb2ludGVycz17fSxsPTAsdT0ocz1bXCJwdXNoXCIsXCJwb3BcIixcInNoaWZ0XCIsXCJ1bnNoaWZ0XCIsXCJzb3J0XCIsXCJyZXZlcnNlXCIsXCJzcGxpY2VcIl0pLmxlbmd0aDtsPHU7bCsrKW49c1tsXSx0aGlzLnN0dWJGdW5jdGlvbih0LG4pO2lmKG51bGw9PShvPXIucG9pbnRlcnMpW2VdJiYob1tlXT1bXSksaC5jYWxsKHIucG9pbnRlcnNbZV0saSk8MClyZXR1cm4gci5wb2ludGVyc1tlXS5wdXNoKGkpfX0sdW5vYnNlcnZlTXV0YXRpb25zOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbixzLHI7aWYoQXJyYXkuaXNBcnJheSh0KSYmbnVsbCE9dFt0aGlzLmlkXSYmKHM9dGhpcy53ZWFrbWFwW3RbdGhpcy5pZF1dKSYmKHI9cy5wb2ludGVyc1tlXSkpcmV0dXJuKG49ci5pbmRleE9mKGkpKT49MCYmci5zcGxpY2UobiwxKSxyLmxlbmd0aHx8ZGVsZXRlIHMucG9pbnRlcnNbZV0sdGhpcy5jbGVhbnVwV2Vha1JlZmVyZW5jZShzLHRbdGhpcy5pZF0pfSxvYnNlcnZlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbixzLHIsbztyZXR1cm4gbnVsbD09KG49dGhpcy53ZWFrUmVmZXJlbmNlKHQpLmNhbGxiYWNrcylbZV0mJihuW2VdPVtdLChudWxsIT0ocz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkpP3MuZ2V0OnZvaWQgMCl8fChudWxsIT1zP3Muc2V0OnZvaWQgMCl8fChyPXRbZV0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sc2V0OihvPXRoaXMsZnVuY3Rpb24oaSl7dmFyIHMsbCx1LGEscDtpZihpIT09ciYmKG8udW5vYnNlcnZlTXV0YXRpb25zKHIsdFtvLmlkXSxlKSxyPWksbD1vLndlYWttYXBbdFtvLmlkXV0pKXtpZigobj1sLmNhbGxiYWNrcylbZV0pZm9yKHU9MCxhPShwPW5bZV0uc2xpY2UoKSkubGVuZ3RoO3U8YTt1Kyspcz1wW3VdLGguY2FsbChuW2VdLHMpPj0wJiZzKCk7cmV0dXJuIG8ub2JzZXJ2ZU11dGF0aW9ucyhpLHRbby5pZF0sZSl9fSl9KSkpLGguY2FsbChuW2VdLGkpPDAmJm5bZV0ucHVzaChpKSx0aGlzLm9ic2VydmVNdXRhdGlvbnModFtlXSx0W3RoaXMuaWRdLGUpfSx1bm9ic2VydmU6ZnVuY3Rpb24odCxlLGkpe3ZhciBuLHMscjtpZigocj10aGlzLndlYWttYXBbdFt0aGlzLmlkXV0pJiYobj1yLmNhbGxiYWNrc1tlXSkpcmV0dXJuKHM9bi5pbmRleE9mKGkpKT49MCYmKG4uc3BsaWNlKHMsMSksbi5sZW5ndGh8fChkZWxldGUgci5jYWxsYmFja3NbZV0sdGhpcy51bm9ic2VydmVNdXRhdGlvbnModFtlXSx0W3RoaXMuaWRdLGUpKSksdGhpcy5jbGVhbnVwV2Vha1JlZmVyZW5jZShyLHRbdGhpcy5pZF0pfSxnZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFtlXX0sc2V0OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdFtlXT1pfX0sdC5mYWN0b3J5PWZ1bmN0aW9uKGUpe3JldHVybiB0LnNpZ2h0Z2xhc3M9ZSx0LnB1YmxpYy5fPXQsdC5wdWJsaWN9LFwib2JqZWN0XCI9PXR5cGVvZihcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlJiZudWxsIT09bW9kdWxlP21vZHVsZS5leHBvcnRzOnZvaWQgMCk/bW9kdWxlLmV4cG9ydHM9dC5mYWN0b3J5KHJlcXVpcmUoXCJzaWdodGdsYXNzXCIpKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcInNpZ2h0Z2xhc3NcIl0sZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucml2ZXRzPXQuZmFjdG9yeShlKX0pOnRoaXMucml2ZXRzPXQuZmFjdG9yeShzaWdodGdsYXNzKX0pLmNhbGwodGhpcyk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbkpwZG1WMGN5NXFjeUpkTENKdVlXMWxjeUk2V3lKU2FYWmxkSE1pTENKaWFXNWtUV1YwYUc5a0lpd2lhbEYxWlhKNUlpd2lkVzVpYVc1a1RXVjBhRzlrSWl3aVgzSmxaaUlzSWw5ZlltbHVaQ0lzSW1adUlpd2liV1VpTENKaGNIQnNlU0lzSW1GeVozVnRaVzUwY3lJc0lsOWZjMnhwWTJVaUxDSnpiR2xqWlNJc0lsOWZhR0Z6VUhKdmNDSXNJbWhoYzA5M2JsQnliM0JsY25SNUlpd2lYMTlsZUhSbGJtUnpJaXdpWTJocGJHUWlMQ0p3WVhKbGJuUWlMQ0pyWlhraUxDSmpZV3hzSWl3aVkzUnZjaUlzSW5Sb2FYTWlMQ0pqYjI1emRISjFZM1J2Y2lJc0luQnliM1J2ZEhsd1pTSXNJbDlmYzNWd1pYSmZYeUlzSWw5ZmFXNWtaWGhQWmlJc0ltbHVaR1Y0VDJZaUxDSnBkR1Z0SWl3aWFTSXNJbXdpTENKc1pXNW5kR2dpTENKdmNIUnBiMjV6SWl3aVpYaDBaVzV6YVc5dWN5SXNJbkIxWW14cFl5SXNJbUpwYm1SbGNuTWlMQ0pqYjIxd2IyNWxiblJ6SWl3aVptOXliV0YwZEdWeWN5SXNJbUZrWVhCMFpYSnpJaXdpY0hKbFptbDRJaXdpZEdWdGNHeGhkR1ZFWld4cGJXbDBaWEp6SWl3aWNtOXZkRWx1ZEdWeVptRmpaU0lzSW5CeVpXeHZZV1JFWVhSaElpd2laWGhsWTNWMFpVWjFibU4wYVc5dWN5SXNJbWwwWlhKaGRHbHZia0ZzYVdGeklpd2liVzlrWld4T1lXMWxJaXdpYUdGdVpHeGxjaUlzSW1OdmJuUmxlSFFpTENKbGRpSXNJbUpwYm1ScGJtY2lMQ0oyYVdWM0lpd2liVzlrWld4eklpd2lZMjl1Wm1sbmRYSmxJaXdpWkdWelkzSnBjSFJ2Y2lJc0ltOXdkR2x2YmlJc0luWmhiSFZsSWl3aVltbHVaQ0lzSW1Wc0lpd2lWbWxsZHlJc0ltbHVhWFFpTENKamIyMXdiMjVsYm5RaUxDSmtZWFJoSWl3aWMyTnZjR1VpTENKMFpXMXdiR0YwWlNJc0ltUnZZM1Z0Wlc1MElpd2lZM0psWVhSbFJXeGxiV1Z1ZENJc0lraFVUVXhGYkdWdFpXNTBJaXdpWm1seWMzUkRhR2xzWkNJc0luSmxiVzkyWlVOb2FXeGtJaXdpWVhCd1pXNWtRMmhwYkdRaUxDSnBibTVsY2toVVRVd2lMQ0pwYm1sMGFXRnNhWHBsSWl3aWQybHVaRzkzSWl3aVZYUnBiQ0lzSW1KcGJtUkZkbVZ1ZENJc0ltVjJaVzUwSWl3aWRXNWlhVzVrUlhabGJuUWlMQ0puWlhSSmJuQjFkRlpoYkhWbElpd2lKR1ZzSWl3aVlYUjBjaUlzSW1seklpd2lkbUZzSWl3aVlXUmtSWFpsYm5STWFYTjBaVzVsY2lJc0ltRjBkR0ZqYUVWMlpXNTBJaXdpY21WdGIzWmxSWFpsYm5STWFYTjBaVzVsY2lJc0ltUmxkR0ZqYUVWMlpXNTBJaXdpYnlJc0lsOXBJaXdpWDJ4bGJpSXNJbDl5WlhOMWJIUnpJaXdpZEhsd1pTSXNJbU5vWldOclpXUWlMQ0p6Wld4bFkzUmxaQ0lzSW5CMWMyZ2lMQ0pVZVhCbFVHRnljMlZ5SWl3aWRIbHdaWE1pTENKd2NtbHRhWFJwZG1VaUxDSnJaWGx3WVhSb0lpd2ljR0Z5YzJVaUxDSnpkSEpwYm1jaUxDSjBaWE4wSWl3aWFYTk9ZVTRpTENKT2RXMWlaWElpTENKVVpYaDBWR1Z0Y0d4aGRHVlFZWEp6WlhJaUxDSjBaWGgwSWl3aVpHVnNhVzFwZEdWeWN5SXNJbWx1WkdWNElpd2liR0Z6ZEVsdVpHVjRJaXdpYkdGemRGUnZhMlZ1SWl3aWMzVmljM1J5YVc1bklpd2lkRzlyWlc1eklpd2lkSEpwYlNJc0ltVnNjeUlzSW1zaUxDSjJJaXdpWDJKaGMyVWlMQ0pmYWlJc0lsOXNaVzR4SWl3aVgzSmxaakVpTENKZmNtVm1NaUlzSWw5eVpXWXpJaXdpWDNKbFpqUWlMQ0pmY21WbU5TSXNJblZ3WkdGMFpTSXNJbkIxWW14cGMyZ2lMQ0p6ZVc1aklpd2lkVzVpYVc1a0lpd2ljMlZzWldOMElpd2lkSEpoZG1WeWMyVWlMQ0ppZFdsc1pDSXNJbUoxYVd4a1FtbHVaR2x1WnlJc0ltSnBibVJwYm1kU1pXZEZlSEFpTENKcWNYVmxjbmtpTENKQmNuSmhlU0lzSW1OdmJtTmhkQ0lzSWxKbFowVjRjQ0lzSW01dlpHVWlMQ0prWldOc1lYSmhkR2x2YmlJc0ltTjBlQ0lzSW1SbGNHVnVaR1Z1WTJsbGN5SXNJbkJwY0dVaUxDSndhWEJsY3lJc0ltMWhkR05vSWl3aWMyaHBablFpTENKemNHeHBkQ0lzSW1KcGJtUnBibWR6SWl3aVgzUm9hWE1pTENKaWJHOWpheUlzSW1Ob2FXeGtUbTlrWlNJc0ltNGlMQ0p3WVhKelpYSWlMQ0owYjJ0bGJpSXNJbTV2WkdWVWVYQmxJaXdpWTNKbFlYUmxWR1Y0ZEU1dlpHVWlMQ0p3WVhKbGJuUk9iMlJsSWl3aWFXNXpaWEowUW1WbWIzSmxJaXdpWDJzaUxDSmphR2xzWkU1dlpHVnpJaXdpYzI5eWRDSXNJbUVpTENKaUlpd2lZbWx1WkdWeUlpd2ljSEpwYjNKcGRIa2lMQ0poZEhSeWFXSjFkR1VpTENKaGRIUnlhV0oxZEdWeklpd2lhV1JsYm5ScFptbGxjaUlzSW01dlpHVk9ZVzFsSWl3aWJtRnRaU0lzSW5KbGNHeGhZMlVpTENKMGIweHZkMlZ5UTJGelpTSXNJbDlpYjNWdVpDSXNJa052YlhCdmJtVnVkRUpwYm1ScGJtY2lMQ0p3ZFdKc2FYTm9aWE1pTENKdGIyUmxiQ0lzSWtKcGJtUnBibWNpTENKblpYUldZV3gxWlNJc0luTmxkQ0lzSW1WMlpXNTBTR0Z1Wkd4bGNpSXNJbVp2Y20xaGRIUmxaRlpoYkhWbElpd2ljR0Z5YzJWR2IzSnRZWFIwWlhKQmNtZDFiV1Z1ZEhNaUxDSndZWEp6WlZSaGNtZGxkQ0lzSW05aWMyVnlkbVVpTENKelpYUkNhVzVrWlhJaUxDSm1iM0p0WVhSMFpYSlBZbk5sY25abGNuTWlMQ0poY21keklpd2laWGhsWXlJc0lrWjFibU4wYVc5dUlpd2ljbTkxZEdsdVpTSXNJbTlpYWlJc0ltTmhiR3hpWVdOcklpd2ljMmxuYUhSbmJHRnpjeUlzSW5KdmIzUWlMQ0p2WW5ObGNuWmxjaUlzSW5SaGNtZGxkQ0lzSW1admNtMWhkSFJsY2tsdVpHVjRJaXdpWVdraUxDSmhjbWNpTENKd2NtOWpaWE56WldSQmNtZHpJaXdpWm1raUxDSm1iM0p0WVhSMFpYSWlMQ0pwWkNJc0luSmxZV1FpTENKa1pYQmxibVJsYm1ONUlpd2lkVzV2WW5ObGNuWmxJaXdpWm1sU1pYWmxjbk5sWkNJc0lteGhjM1JtYjNKdFlYUjBaWEpKYm1SbGVDSXNJbkpsZG1WeWMyVWlMQ0p6WlhSV1lXeDFaU0lzSWw5emRYQmxjaUlzSW5CeWIzQmxjblI1VG1GdFpTSXNJbXh2WTJGc2N5SXNJbTlpYzJWeWRtVnljeUlzSW5Wd2MzUnlaV0Z0VDJKelpYSjJaWEp6SWl3aVkyRnRaV3hEWVhObElpd2ljbVZ6ZFd4MElpd2laM0p2ZFhCbFpDSXNJblJ2VlhCd1pYSkRZWE5sSWl3aVgzSmxaallpTENKZmNtVm1OeUlzSW1KdmRXNWtJaXdpWTI5dGNHOXVaVzUwVm1sbGR5SXNJbFJsZUhSQ2FXNWthVzVuSWl3aWRHVjRkRU52Ym5SbGJuUWlMQ0pwYm01bGNsUmxlSFFpTENKb2RHMXNJaXdpYzJodmR5SXNJbk4wZVd4bElpd2laR2x6Y0d4aGVTSXNJbWhwWkdVaUxDSmxibUZpYkdWa0lpd2laR2x6WVdKc1pXUWlMQ0owYjFOMGNtbHVaeUlzSW5WdVkyaGxZMnRsWkNJc0luUmhaMDVoYldVaUxDSnpaWFJCZEhSeWFXSjFkR1VpTENKdFlYSnJaWElpTENKcWIybHVJaXdpWjJWMFFYUjBjbWxpZFhSbElpd2lZM0psWVhSbFEyOXRiV1Z1ZENJc0luSmxiVzkyWlVGMGRISnBZblYwWlNJc0ltNWxjM1JsWkNJc0ltNWxlSFJUYVdKc2FXNW5JaXdpZFc1c1pYTnpJaXdpWm5WdVkzUnBiMjRpTENKcGRHVnlZWFJsWkNJc0ltTnZiR3hsWTNScGIyNGlMQ0p3Y21WMmFXOTFjeUlzSWw5c1pXNHlJaXdpY0c5d0lpd2lZMnh2Ym1WT2IyUmxJaXdpWld4RGJHRnpjeUlzSW1Oc1lYTnpUbUZ0WlNJc0ltTnZkVzUwWlhJaUxDSjNaV0ZyYldGd0lpd2lkMlZoYTFKbFptVnlaVzVqWlNJc0lsOXVZVzFsSWl3aVQySnFaV04wSWl3aVpHVm1hVzVsVUhKdmNHVnlkSGtpTENKallXeHNZbUZqYTNNaUxDSmpiR1ZoYm5Wd1YyVmhhMUpsWm1WeVpXNWpaU0lzSW5KbFppSXNJbXRsZVhNaUxDSndiMmx1ZEdWeWN5SXNJbk4wZFdKR2RXNWpkR2x2YmlJc0ltMWhjQ0lzSW05eWFXZHBibUZzSWl3aWNpSXNJbkpsYzNCdmJuTmxJaXdpYjJKelpYSjJaVTExZEdGMGFXOXVjeUlzSW1aMWJtTjBhVzl1Y3lJc0ltbHpRWEp5WVhraUxDSjFibTlpYzJWeWRtVk5kWFJoZEdsdmJuTWlMQ0pwWkhnaUxDSnpjR3hwWTJVaUxDSmtaWE5qSWl3aVoyVjBUM2R1VUhKdmNHVnlkSGxFWlhOamNtbHdkRzl5SWl3aVoyVjBJaXdpWlc1MWJXVnlZV0pzWlNJc0ltNWxkMVpoYkhWbElpd2lZMklpTENKbVlXTjBiM0o1SWl3aVh5SXNJbTF2WkhWc1pTSXNJbVY0Y0c5eWRITWlMQ0p5WlhGMWFYSmxJaXdpWkdWbWFXNWxJaXdpWVcxa0lpd2ljbWwyWlhSeklsMHNJbTFoY0hCcGJtZHpJam9pUTBGSlFTeFhRVU5GTEVsQlFVbEJMRVZCUVZGRExFVkJRVmxETEVWQlFWRkRMRVZCUVdORExFVkJRelZEUXl4RlFVRlRMRk5CUVZORExFVkJRVWxETEVkQlFVc3NUMEZCVHl4WFFVRlpMRTlCUVU5RUxFVkJRVWRGTEUxQlFVMUVMRVZCUVVsRkxHRkJRMnhGUXl4RlFVRlZMRWRCUVVkRExFMUJRMkpETEVWQlFWa3NSMEZCUjBNc1pVRkRaa01zUlVGQldTeFRRVUZUUXl4RlFVRlBReXhIUVVGVkxFbEJRVXNzU1VGQlNVTXNTMEZCVDBRc1JVRkJZMG9zUlVGQlZVMHNTMEZCUzBZc1JVRkJVVU1zUzBGQlRVWXNSVUZCVFVVc1IwRkJUMFFzUlVGQlQwTXNTVUZCVVN4VFFVRlRSU3hKUVVGVFF5eExRVUZMUXl4WlFVRmpUaXhGUVVFNFJ5eFBRVUZ5UjBrc1JVRkJTMGNzVlVGQldVNHNSVUZCVDAwc1ZVRkJWMUFzUlVGQlRVOHNWVUZCV1N4SlFVRkpTQ3hGUVVGUlNpeEZRVUZOVVN4VlFVRlpVQ3hGUVVGUFRTeFZRVUZyUWxBc1IwRkRkbEpUTEVWQlFWa3NSMEZCUjBNc1UwRkJWeXhUUVVGVFF5eEhRVUZSTEVsQlFVc3NTVUZCU1VNc1JVRkJTU3hGUVVGSFF5eEZRVUZKVWl4TFFVRkxVeXhQUVVGUlJpeEZRVUZKUXl4RlFVRkhSQ3hKUVVGUExFZEJRVWxCTEV0QlFVdFFMRTFCUVZGQkxFdEJRVXRQTEV0QlFVOUVMRVZCUVUwc1QwRkJUME1zUlVGQlN5eFBRVUZSTEVkQlJXNUtNMElzUlVGQlV5eERRVU5RT0VJc1VVRkJVeXhEUVVGRExGTkJRVlVzY1VKQlFYTkNMR2RDUVVGcFFpeGpRVUZsTEZWQlFWY3NiMEpCUTNKR1F5eFhRVUZaTEVOQlFVTXNWVUZCVnl4aFFVRmpMR0ZCUVdNc1dVRkRjRVJETEU5QlFWVXNRMEZEVWtNc1VVRkJVeXhIUVVOVVF5eFhRVUZaTEVkQlExcERMRmRCUVZrc1IwRkRXa01zVTBGQlZTeEhRVU5XUXl4UFFVRlJMRXRCUTFKRExHMUNRVUZ2UWl4RFFVRkRMRWxCUVVzc1MwRkRNVUpETEdOQlFXVXNTVUZEWmtNc1lVRkJZU3hGUVVOaVF5eHJRa0ZCYTBJc1JVRkRiRUpETEdWQlFXZENMRk5CUVZORExFZEJRM1pDTEUxQlFVOHNTVUZCVFVFc1JVRkJXU3hMUVVVelFrTXNVVUZCVXl4VFFVRlRReXhGUVVGVFF5eEZRVUZKUXl4SFFVTTNRaXhQUVVGUE0wSXNTMEZCUzBZc1MwRkJTekpDTEVWQlFWTkRMRVZCUVVsRExFVkJRVkZETEV0QlFVdERMRk5CUlRkRFF5eFZRVUZYTEZOQlFWTndRaXhIUVVOc1FpeEpRVUZKY1VJc1JVRkJXV3hETEVWQlFVdHRReXhGUVVGUlF5eEZRVWszUWl4SlFVRkxSQ3hMUVVoVkxFMUJRVmgwUWl4SlFVTkdRU3hGUVVGVkxFbEJSVWRCTEVWQlJXSXNSMEZFUVhWQ0xFVkJRVkYyUWl4RlFVRlJjMElzUjBGRFJDeFpRVUZZUVN4SFFVRnRReXhsUVVGWVFTeEhRVUZ6UXl4bFFVRllRU3hIUVVGelF5eGhRVUZZUVN4RlFVTm9SaXhKUVVGTGJrTXNTMEZCVDI5RExFVkJRMVpHTEVWQlFXRkZMRVZCUVUxd1F5eEhRVU51UW1wQ0xFVkJRVTl2UkN4SFFVRlJia01zUjBGQlQydERMRTlCUjNoQ2JrUXNSVUZCWlN4UFFVRkZiMFFzUjBGQlZVTXNSMEZKYWtORExFdEJRVTBzVTBGQlUwTXNSVUZCU1U0c1JVRkJVVzVDTEVkQlEzcENMRWxCUVVsclFpeEZRVk5LTEU5QlVtTXNUVUZCVmtNc1NVRkRSa0VzUlVGQlV5eEpRVVZKTEUxQlFWaHVRaXhKUVVOR1FTeEZRVUZWTEV0QlJWcHJRaXhGUVVGUExFbEJRVWxvUkN4RlFVRlBkMFFzUzBGQlMwUXNSVUZCU1U0c1JVRkJVVzVDTEVsQlF6bENkMElzVDBGRFJVNHNSMEZGVkZNc1MwRkJUU3hUUVVGVFF5eEZRVUZYU0N4RlFVRkpTU3hIUVVNMVFpeEpRVUZKUXl4RlFVRlBReXhGUVVGVllpeEZRVk55UWl4SFFWSlpMRTFCUVZKWExFbEJRMFpCTEVWQlFVOHNTVUZGUXl4TlFVRk9TaXhKUVVOR1FTeEZRVUZMVHl4VFFVRlRReXhqUVVGakxGTkJSemxDUml4SFFVUkJTQ3hGUVVGWk1VUXNSVUZCWlN4UFFVRkZhME1zVjBGQlYzZENMRWxCUTI1Q1J5eFRRVUZUTTBNc1MwRkJTMFVzUzBGQlRXMURMR05CUTJwQ1V5eFpRVUZoTEVOQlEyNURMRXRCUVU5VUxFVkJRVWRWTEZsQlExSldMRVZCUVVkWExGbEJRVmxZTEVWQlFVZFZMRmxCUlhCQ1ZpeEZRVUZIV1N4WlFVRlpUaXhSUVVWbVRpeEZRVUZIWVN4VlFVRlpVQ3hGUVV0cVFpeFBRVWhCUkN4RlFVRlJSaXhGUVVGVlZ5eFhRVUZYYmtRc1MwRkJTMFVzUzBGQlRXMURMRVZCUVVsSkxFbEJRelZEV0N4RlFVRlBMRWxCUVVsb1JDeEZRVUZQZDBRc1MwRkJTMFFzUlVGQlNVc3NTVUZEZEVKT0xFOUJRMFZPTEV0QlMxUnpRaXhQUVVGbExGRkJRVXRCTEU5QlFWVXNSMEZGYUVOc1JTeEZRVUZQTEU5QlJGQkdMRVZCUVZOdlJTeFBRVUZsTEZGQlFVdEJMRTlCUVZVc1IwRkRha0pvUkN4VlFVRlpMRU5CUVVNc1MwRkJUU3hQUVVGVExFTkJRVU1zVDBGQlVTeFZRVUZYY2tJc1JVRkJZVWNzUlVGQlN5eEhRVUZKUkN4RlFVRmxReXhGUVVGTExFZEJRMmhJU2l4RlFVRlBkVVVzUzBGQlR5eERRVU5hUXl4VlFVRlhMRk5CUVZOcVFpeEZRVUZKYTBJc1JVRkJUemRDTEVkQlF6ZENMRTlCUVU4eFF5eEZRVUZQY1VRc1IwRkJTWFJFTEVkQlFWbDNSU3hGUVVGUE4wSXNTVUZGZGtNNFFpeFpRVUZoTEZOQlFWTnVRaXhGUVVGSmEwSXNSVUZCVHpkQ0xFZEJReTlDTEU5QlFVOHhReXhGUVVGUGNVUXNSMEZCU1hCRUxFZEJRV056UlN4RlFVRlBOMElzU1VGRmVrTXJRaXhqUVVGbExGTkJRVk53UWl4SFFVTjBRaXhKUVVGSmNVSXNSVUZGU2l4TlFVRjVRaXhqUVVSNlFrRXNSVUZCVFRGRkxFVkJRVTl4UkN4SlFVTk1jMElzUzBGQlN5eFJRVU5LUkN4RlFVRkpSU3hIUVVGSExGbEJSVkJHTEVWQlFVbEhMRk5CUzJwQ0wwVXNSVUZCVDNWRkxFdEJRVThzUTBGRFdrTXNWVUZEVFN4eFFrRkJjMEpHTEU5QlEycENMRk5CUVZObUxFVkJRVWxyUWl4RlFVRlBOMElzUjBGRGVrSXNUMEZCVDFjc1JVRkJSM2xDTEdsQ1FVRnBRbEFzUlVGQlR6ZENMRWRCUVZNc1NVRkhlRU1zVTBGQlUxY3NSVUZCU1d0Q0xFVkJRVTgzUWl4SFFVTjZRaXhQUVVGUFZ5eEZRVUZITUVJc1dVRkJXU3hMUVVGUFVpeEZRVUZQTjBJc1NVRkhlRU00UWl4WlFVTk5MSGRDUVVGNVFrb3NUMEZEY0VJc1UwRkJVMllzUlVGQlNXdENMRVZCUVU4M1FpeEhRVU42UWl4UFFVRlBWeXhGUVVGSE1rSXNiMEpCUVc5Q1ZDeEZRVUZQTjBJc1IwRkJVeXhKUVVjelF5eFRRVUZUVnl4RlFVRkphMElzUlVGQlR6ZENMRWRCUTNwQ0xFOUJRVTlYTEVWQlFVYzBRaXhaUVVGWkxFdEJRVTlXTEVWQlFVODNRaXhKUVVkNFF5dENMR05CUVdVc1UwRkJVM0JDTEVkQlEzUkNMRWxCUVVrMlFpeEZRVUZIUXl4RlFVRkpReXhGUVVGTlF5eEZRVU5xUWl4SFFVRm5RaXhoUVVGYWFFTXNSVUZCUjJsRExFdEJRMHdzVDBGQlQycERMRVZCUVVkclF5eFJRVU5NTEVkQlFXZENMRzlDUVVGYWJFTXNSVUZCUjJsRExFdEJRVFJDTEVOQlJYaERMRWxCUkVGRUxFVkJRVmNzUjBGRFRrWXNSVUZCU3l4RlFVRkhReXhGUVVGUEwwSXNSVUZCUnpGQ0xFOUJRVkYzUkN4RlFVRkxReXhGUVVGTlJDeExRVU40UTBRc1JVRkJTVGRDTEVWQlFVYzRRaXhKUVVORVN5eFZRVU5LU0N4RlFVRlRTU3hMUVVGTFVDeEZRVUZGTDBJc1QwRkhjRUlzVDBGQlQydERMRVZCUlZBc1QwRkJUMmhETEVWQlFVZEdMRkZCVFd4Q2NrUXNSVUZCVHpSR0xGZEJRV0VzVjBGRGJFSXNVMEZCVTBFc1MwRnRSRlFzVDBGcVJFRkJMRVZCUVZkRExFMUJRVkVzUTBGRGFrSkRMRlZCUVZjc1JVRkRXRU1zVVVGQlV5eEhRVWRZU0N4RlFVRlhTU3hOUVVGUkxGTkJRVk5ETEVkQlF6RkNMRTFCUVVrc1owSkJRV2RDUXl4TFFVRkxSQ3hIUVVOb1FpeERRVU5NVkN4TFFVRk5jRVVzUzBGQlMzbEZMRTFCUVUxRExGVkJRMnBDZWtNc1RVRkJUelJETEVWQlFVOTBSaXhOUVVGTkxFZEJRVWtzU1VGRlRpeFRRVUZZYzBZc1JVRkRSaXhEUVVOTVZDeExRVUZOY0VVc1MwRkJTM2xGTEUxQlFVMURMRlZCUTJwQ2VrTXNUMEZCVHl4SFFVVlhMRlZCUVZnMFF5eEZRVU5HTEVOQlEweFVMRXRCUVUxd1JTeExRVUZMZVVVc1RVRkJUVU1zVlVGRGFrSjZReXhQUVVGUExFZEJSVmNzVTBGQldEUkRMRVZCUTBZc1EwRkRURlFzUzBGQlRYQkZMRXRCUVV0NVJTeE5RVUZOUXl4VlFVTnFRbnBETEUxQlFVOHNUVUZGVnl4alFVRllORU1zUlVGRFJpeERRVU5NVkN4TFFVRk5jRVVzUzBGQlMzbEZMRTFCUVUxRExGVkJRMnBDZWtNc1YwRkJUeXhIUVVWWExFdEJRVmcwUXl4RlFVTkdMRU5CUTB4VUxFdEJRVTF3UlN4TFFVRkxlVVVzVFVGQlRVTXNWVUZEYWtKNlF5eFhRVUZQTEVsQlJUQkNMRWxCUVRGQ09FTXNUVUZCVFVNc1QwRkJUMGdzU1VGRFppeERRVU5NVkN4TFFVRk5jRVVzUzBGQlMzbEZMRTFCUVUxRExGVkJRMnBDZWtNc1RVRkJUeXRETEU5QlFVOUlMRWxCUjFRc1EwRkRURlFzUzBGQlRYQkZMRXRCUVV0NVJTeE5RVUZOUlN4UlFVTnFRakZETEUxQlFVODBReXhKUVV0T1RDeEZRWEJFVnl4SFFYZEVjRUkxUml4RlFVRlBjVWNzYlVKQlFYRkNMRmRCUXpGQ0xGTkJRVk5CTEV0QmMwUlVMRTlCY0VSQlFTeEZRVUZ0UWxJc1RVRkJVU3hEUVVONlFsTXNTMEZCVFN4RlFVTk9ka1FzVVVGQlV5eEhRVWRZYzBRc1JVRkJiVUpNTEUxQlFWRXNVMEZCVTI1RExFVkJRVlV3UXl4SFFVTTFReXhKUVVGSlF5eEZRVUZQUXl4RlFVRlhReXhGUVVGWE4wVXNSVUZCVVRoRkxFVkJRVmRETEVWQlFWRjJSQ3hGUVVzMVJDeEpRVXBCZFVRc1JVRkJVeXhIUVVOVUwwVXNSVUZCVTJkRExFVkJRVk5vUXl4UFFVTnNRakpGTEVWQlFWRXNSVUZEVWtNc1JVRkJXU3hGUVVOTVFTeEZRVUZaTlVVc1IwRkJVU3hEUVVWNlFpeEpRVVJCTWtVc1JVRkJVVE5ETEVWQlFWTndReXhSUVVGUk9FVXNSVUZCVnl4SFFVRkpSU3hKUVVNMVFpeEZRVUZITEVOQlEySkhMRVZCUVU5cVFpeExRVUZMTEVOQlExWklMRXRCUVUxd1JTeExRVUZMZVVVc1RVRkJUVk1zUzBGRGFrSnFSQ3hOUVVGUFVTeEZRVUZUYkVRc1RVRkJUVGhHTEV0QlJYaENMRTFCVlVFc1IwRlNTVVFzUlVGQlVTeEhRVUZMUXl4RlFVRlpSQ3hIUVVNelFra3NSVUZCVDJwQ0xFdEJRVXNzUTBGRFZrZ3NTMEZCVFhCRkxFdEJRVXQ1UlN4TlFVRk5VeXhMUVVOcVFtcEVMRTFCUVU5UkxFVkJRVk5zUkN4TlFVRk5PRVlzUlVGQlYwUXNTMEZIY2tORExFVkJRVmxFTEVWQlFWRkVMRVZCUVZjc1IwRkJSekZGTEZGQlEyeERNa1VzUlVGQlVUTkRMRVZCUVZOd1F5eFJRVUZST0VVc1JVRkJWeXhIUVVGSlJTeEpRVU0xUWl4RlFVRkhMRU5CUTJKRkxFVkJRVms1UXl4RlFVRlRiRVFzVFVGQlRUaEdMRVZCUVZsR0xFVkJRVmNzUjBGQlJ6RkZMRk5CUlc1RExFOUJSR3hDTmtVc1JVRkJXVVVzUlVGQlQwRXNSVUZCVHk5RkxFOUJRVk1zU1VGRFZqWkZMRVZCUVZWc1FpeFZRVUZQTEV0QlFWbHdSU3hMUVVGTGVVVXNUVUZCVFZNc1MwRkRMMFJKTEVWQlFWVnlSQ3hQUVVGVGMwUXNSVUZGYmtKRExFVkJRVTlxUWl4TFFVRkxMRU5CUTFaSUxFdEJRVTF3UlN4TFFVRkxlVVVzVFVGQlRWTXNTMEZEYWtKcVJDeE5RVUZQYzBRc1NVRkhXQ3hOUVVWR2RFUXNSVUZCVVZFc1JVRkJVMnhFTEUxQlFVMDRSaXhGUVVGWFJDeEhRVUZQU3l4UFFVTjZRMFFzUlVGQlQycENMRXRCUVVzc1EwRkRWa2dzUzBGQlRYQkZMRXRCUVV0NVJTeE5RVUZOT1VNc1VVRkRha0pOTEUxQlFVOUJMRWxCUlZSdlJDeEZRVUZaUkN4RlFVRlJSQ3hGUVVGWExFZEJRVWN4UlN4UFFVZDBReXhQUVVGUEswVXNSMEZIUmxBc1JVRjJSRzFDTEVkQk1rUTFRbkpITEVWQlFVOTNSQ3hMUVVGUExGZEJRMW9zVTBGQlUwRXNSVUZCUzNORUxFVkJRVXMzUkN4RlFVRlJia0lzUjBGRGVrSXNTVUZCU1dsR0xFVkJRVWN6UkN4RlFVRlJORVFzUlVGQlIwTXNSVUZCVHpWQ0xFVkJRVWsyUWl4RlFVRkpOVUlzUlVGQlRUWkNMRVZCUVU5RExFVkJRVTlETEVWQlFVOURMRVZCUVU5RExFVkJRVTlETEVWQmNVSXhSU3hKUVhCQ1FYQkhMRXRCUVVzd1JpeEpRVUZOUVN4RlFVTllNVVlzUzBGQlN6WkNMRTlCUVZOQkxFVkJRME1zVFVGQldHNUNMRWxCUTBaQkxFVkJRVlVzU1VGRldsWXNTMEZCUzNGSExFOUJRVk53U0N4RlFVRlBaU3hMUVVGTGNVY3NUMEZCVVhKSExFMUJRMnhEUVN4TFFVRkxjMGNzVVVGQlZYSklMRVZCUVU5bExFdEJRVXR6Unl4UlFVRlRkRWNzVFVGRGNFTkJMRXRCUVV0MVJ5eExRVUZQZEVnc1JVRkJUMlVzUzBGQlMzVkhMRXRCUVUxMlJ5eE5RVU01UWtFc1MwRkJTM2RITEU5QlFWTjJTQ3hGUVVGUFpTeExRVUZMZDBjc1QwRkJVWGhITEUxQlEyeERRU3hMUVVGTGEwTXNTMEZCVDJwRUxFVkJRVTlsTEV0QlFVdHJReXhMUVVGTmJFTXNUVUZET1VKQkxFdEJRVXQ1Unl4UFFVRlRlRWdzUlVGQlQyVXNTMEZCUzNsSExFOUJRVkY2Unl4TlFVTnNRMEVzUzBGQlN6QkhMRk5CUVZkNlNDeEZRVUZQWlN4TFFVRkxNRWNzVTBGQlZURkhMRTFCUTNSRFFTeExRVUZMTWtjc1RVRkJVVEZJTEVWQlFVOWxMRXRCUVVzeVJ5eE5RVUZQTTBjc1RVRkRhRU5CTEV0QlFVczBSeXhoUVVGbE0wZ3NSVUZCVDJVc1MwRkJTelJITEdGQlFXTTFSeXhOUVVNNVEwRXNTMEZCU3paSExHTkJRV2RDTlVnc1JVRkJUMlVzUzBGQlN6WkhMR05CUVdVM1J5eE5RVU5vUkVFc1MwRkJTMVVzVVVGQlZYcENMRVZCUVU5bExFdEJRVXRWTEZGQlFWTldMRTFCUXpsQ1FTeExRVUZMTUVZc1NVRkJTVzlDTEZGQlFWVTVSeXhMUVVGTE1FWXNaVUZCWlhGQ0xGRkJRek5ETDBjc1MwRkJTekJHTEVsQlFVMHNRMEZCUXpGR0xFdEJRVXN3Uml4TlFVZGtla0lzUlVGQlN5eEZRVUZIUXl4SFFVUmlPRUlzUlVGQlVYQklMRVZCUVU4clFpeFpRVU5YUml4UFFVRlJkMFFzUlVGQlMwTXNSVUZCVFVRc1NVRkJUU3hEUVVkcVJDeEhRVVJCYWtVc1MwRkVRV2RETEVWQlFWTm5SU3hGUVVGTkwwSXNTVUZEUVN4SFFVTllka1FzUlVGQlVYTkNMRWRCUlZZc1NVRkJTekpFTEV0QlJFeE5MRVZCUVZGMlJpeEZRVUZSYzBJc1IwRkZaRFJFTEVWQlFVbExMRVZCUVUxT0xFZEJRMVl6Uml4TFFVRkxaME1zUjBGQlVUSkVMRWRCUVV0RExFVkJTWFJDTEVsQlFVdEVMRXRCUkV4UExFVkJRVkYwU0N4RlFVRmxMRTlCUVVWdlJDeEhRVVYyUWpSRUxFVkJRVWxOTEVWQlFVMVFMRWRCUTNWQ0xFOUJRVFZDUlN4RlFVRlJOMFlzUzBGQlMyZERMRWxCUVZNeVJDeExRVU42UWtVc1JVRkJUVVlzUjBGQlMwTXNSMEZMYWtJc1NVRkJTMFVzUlVGQlN5eEZRVUZIUXl4SFFVUmlTU3hGUVVGUmRrZ3NSVUZCVHpoQ0xGTkJRMWxFTEU5QlFWRnhSaXhGUVVGTFF5eEZRVUZQUkN4SlFVVTNRemxHTEV0QlJFRm5ReXhGUVVGVGJVVXNSVUZCVFV3c1NVRkROa0lzVDBGQk5VSk5MRVZCUVZFeFJpeEZRVUZSYzBJc1NVRkJiVUp2UlN4RlFVRlJlRWdzUlVGQlpTeFBRVUZGYjBRc1IwRkZPVVZvUXl4TFFVRkxNa2NzVVVFNFRsQXNUMEV6VGtGMlJTeEZRVUZMYkVNc1ZVRkJWVkVzVVVGQlZTeFhRVU4yUWl4SlFVRkpjMElzUlVGQlVYUkNMRVZCUVZOMVJDeEZRVUZKUXl4RlFVRk5PRUlzUlVGSEwwSXNTVUZHUVhSR0xFVkJRVlVzUjBGRlRIVkVMRVZCUVVzc1JVRkJSME1zUjBGRVlqaENMRVZCUVZGd1NDeEZRVUZQSzBJc1YwRkJWM0ZITEU5QlFVOXdTU3hGUVVGUE9FSXNWVUZEWkVRc1QwRkJVWGRFTEVWQlFVdERMRVZCUVUxRUxFbEJSVE5EZGtRc1JVRkVRWE5DTEVWQlFWTm5SU3hGUVVGTkwwSXNTVUZEUjJwRkxFdEJRVXRuUXl4SFFVVjZRaXhQUVVGUGRFSXNSMEZIVkRCQ0xFVkJRVXRzUXl4VlFVRlZNa2NzWTBGQlowSXNWMEZETjBJc1QwRkJUeXhKUVVGSlNTeFBRVUZQTEVsQlFVMXFTQ3hMUVVGTGFVSXNUMEZCVXl4TlFVZDRRMjFDTEVWQlFVdHNReXhWUVVGVk1FY3NZVUZCWlN4VFFVRlRha1lzUlVGQlUzVkdMRVZCUVUwNVF5eEZRVUZOSzBNc1IwRkRNVVFzU1VGQlNURkdMRVZCUVZNeVJpeEZRVUZMUXl4RlFVRmpNVU1zUlVGQlUycEZMRVZCUVZNMFJ5eEZRVUZOUXl4RlFUSkNlRVFzVDBFeFFrRTNSeXhGUVVGVkxFZEJRMVkyUnl4RlFVRlJMRmRCUTA0c1NVRkJTWFJFTEVWQlFVbERMRVZCUVUwNFFpeEZRVUZQTjBJc1JVRkhja0lzU1VGRVFVRXNSVUZCVnl4SFFVTk9SaXhGUVVGTExFVkJRVWRETEVkQlJtSTRRaXhGUVVGUmJVSXNSVUZCV1Vzc1RVRkJUU3hwUlVGRlFTOUhMRTlCUVZGM1JDeEZRVUZMUXl4RlFVRk5SQ3hKUVVNelEzRkVMRVZCUVU5MFFpeEZRVUZOTDBJc1IwRkRZa1VzUlVGQlUwa3NTMEZCU3l0RExFVkJRVXMzUWl4UlFVVnlRaXhQUVVGUGRFSXNSVUZTUkN4SFFXOUNVbEVzUjBGV1FXeEVMRVZCUVZVc1YwRkRVaXhKUVVGSmQwTXNSVUZCU1VNc1JVRkJUVGhDTEVWQlFVODNRaXhGUVVkeVFpeEpRVVJCUVN4RlFVRlhMRWRCUTA1R0xFVkJRVXNzUlVGQlIwTXNSMEZHWWpoQ0xFVkJRVkYxUWl4RlFVRk5SU3hSUVVGUlF5eE5RVUZOTEUxQlJVWnFTQ3hQUVVGUmQwUXNSVUZCUzBNc1JVRkJUVVFzU1VGRE0wTnRSQ3hGUVVGTmNFSXNSVUZCVFM5Q0xFZEJRMXBGTEVWQlFWTkpMRXRCUVVzMlF5eEZRVUZKTTBJc1VVRkZjRUlzVDBGQlQzUkNMRVZCVWtNc1NVRlZVWE5FTEZGQlEyeENMMGNzUlVGQlVVc3NWMEZCWVhkSExFZEJRMnBDUml4RlFVRmxOVVlzUlVGQlVXZEhMRmRCUTNwQ0wwY3NSVUZCVVRKSExHRkJRV1ZCTEVWQlFXRkxMRTFCUVUwc1VVRkZja014U0N4TFFVRkxNa2dzVTBGQlUzQkVMRXRCUVVzc1NVRkJTVE5HTEVWQlFVOHJReXhIUVVGVE0wSXNTMEZCVFd0SUxFVkJRVTA1UXl4RlFVRk5UeXhGUVVGVGFrVXNTMEZITTBVd1FpeEZRVUZMYkVNc1ZVRkJWWGxITEUxQlFWRXNWMEZEY2tJc1NVRkJTWGhGTEVWQlFVbDVReXhGUVVGUFdDeEZRVUZKUXl4RlFVRk5PRUlzUlVGRlVEUkNMRVZCTUVOc1FpeEpRVE5EUVRWSUxFdEJRVXN5U0N4VFFVRlhMRWRCUTBWRExFVkJkME5tTlVnc1MwRjRRMGcwUlN4RlFVTlRMRk5CUVZOelF5eEhRVU5rTEVsQlFVbFhMRVZCUVU5RExFVkJRVmN6UXl4RlFVRlpORU1zUlVGQlIwTXNSVUZCVVRsRExFVkJRVTByUXl4RlFVRlBla01zUlVGQlVYWkNMRVZCUVVrMlFpeEZRVUZKTlVJc1JVRkJUVFpDTEVWQlFVOURMRVZCUTNaR0xFZEJRWE5DTEVsQlFXeENhMElzUlVGQlMyZENMRlZCUlZBc1IwRkVRVVlzUlVGQlUzQktMRVZCUVU5eFJ5eHZRa0ZEV2tVc1JVRkJZWGxETEVWQlFVMHhSeXh6UWtGRGFFSnpSU3hGUVVGVGQwTXNSVUZCVDNCRUxFMUJRVTF6UXl4RlFVRkxNMFVzUzBGQlRUUkRMRWxCUVdFeFJTeFRRVU42UWl4SlFVRnNRaXRGTEVWQlFVOHZSU3hSUVVGblFpdEZMRVZCUVU4c1IwRkJSM0JDTEU5QlFWTTBSQ3hGUVVGUGRrUXNUVUZCVFZNc1RVRkJUeXhEUVVOc1JTeEpRVUZMYWtJc1JVRkJTeXhGUVVGSFF5eEZRVUZQYzBJc1JVRkJUeTlGTEU5QlFWRjNSQ3hGUVVGTFF5eEZRVUZOUkN4SlFVTTFRMmRGTEVWQlFWRjZReXhGUVVGUGRrSXNSMEZEWm1sQ0xFVkJRVTk0UXl4VFFVRlRlVVlzWlVGQlpVWXNSVUZCVFdoSExFOUJRM0pEYVVZc1JVRkJTMnRDTEZkQlFWZERMR0ZCUVdGdVJDeEZRVUZOWjBNc1IwRkRhRUlzU1VGQlptVXNSVUZCVFRkRUxFMUJRMUozUkN4RlFVRk5hRUlzWVVGQllTeGpRVUZsTVVJc1JVRkJUU3hMUVVGTkswTXNSVUZCVFdoSExFOUJSM2hFYVVZc1JVRkJTMnRDTEZkQlFWZDBSaXhaUVVGWmIwVXNVMEZKVUN4SlFVRnNRa0VzUlVGQlMyZENMRmRCUTJSTUxFVkJRVkZFTEVWQlFVMXNRaXhUUVVGVFVTeEpRVVY2UWl4SlFVRkxWeXhGUVZkSUxFbEJWa0UzUWl4RlFVRlJMRmRCUTA0c1NVRkJTWE5ETEVWQlFVbDJReXhGUVVGUFF5eEZRVUZQTjBJc1JVRkhkRUlzU1VGRVFVRXNSVUZCVnl4SFFVTk9iVVVzUlVGQlN5eEZRVUZIZGtNc1IwRkdZa01zUlVGQlVXdENMRVZCUVV0eFFpeFpRVVZqT1Vnc1QwRkJVVFpJTEVWQlFVdDJReXhGUVVGUGRVTXNTVUZETjBOUUxFVkJRVWt2UWl4RlFVRk5jME1zUjBGRFZtNUZMRVZCUVZOSkxFdEJRVXQzUkN4SFFVVm9RaXhQUVVGUE5VUXNSVUZTUkN4SFFWVklNa0lzUlVGQlN5eEZRVUZIUXl4RlFVRlJReXhGUVVGTmRrWXNUMEZCVVhGR0xFVkJRVXRETEVWQlFVOUVMRWxCUXpkRFowTXNSVUZCV1RsQ0xFVkJRVTFHTEVkQlEyeENiRUlzUlVGQlRXdEVMRWxCVFZRM1JDeEZRVUZMTEVWQlFVZERMRWRCUkdJNFFpeEZRVUZSYUVjc1MwRkJTekJHTEV0QlEyRnFSaXhQUVVGUmQwUXNSVUZCUzBNc1JVRkJUVVFzU1VGRE0wTTVRaXhGUVVGTE5rUXNSVUZCVFM5Q0xFZEJRMWhYTEVWQlFVMTZReXhIUVVWU2JrTXNTMEZCU3pKSUxGTkJRVk5oTEV0QlFVc3NVMEZCVTBNc1JVRkJSME1zUjBGRE4wSXNTVUZCU1hwRExFVkJRVTlETEVWQlExZ3NVVUZCSzBJc1QwRkJja0pFTEVWQlFWRjVReXhGUVVGRlF5eFJRVUZyUWpGRExFVkJRVTB5UXl4alFVRlhMRWxCUVZjc1MwRkJOa0lzVDBGQmNrSXhReXhGUVVGUmRVTXNSVUZCUlVVc1VVRkJhMEo2UXl4RlFVRk5NRU1zWTBGQlZ5eEpRVUZYTEUxQlNYUkplRWNzUlVGQlMyeERMRlZCUVZWM1J5eFRRVUZYTEZOQlFWTlJMRWRCUTJwRExFbEJRVWt5UWl4RlFVRlhReXhGUVVGWlNDeEZRVUZST1VJc1JVRkJaV2RDTEVWQlFVOXJRaXhGUVVGdlFqTkZMRVZCUVUxdVF5eEZRVUZQWjBNc1JVRkJTVFpDTEVWQlFVazFRaXhGUVVGTk5rSXNSVUZCVDBNc1JVRkJUME1zUlVGQlQwTXNSVUZKTjBnc1NVRklRVmNzUlVGQlowSTNSeXhMUVVGTE5rY3NaMEpCUTNKQ1owSXNSVUZCTUVJc1YwRkJiRUpZTEVWQlFVczRRaXhWUVVFeVF5eFZRVUZzUWpsQ0xFVkJRVXM0UWl4VFFVVjBReTlGTEVWQlFVc3NSVUZCUjBNc1IwRkVZamhDTEVWQlFWRnJRaXhGUVVGTE5FSXNXVUZEWVhKSkxFOUJRVkYzUkN4RlFVRkxReXhGUVVGTlJDeEpRVVV6UXl4SFFVUkJORVVzUlVGQldUZERMRVZCUVUwdlFpeEhRVU5rTkVNc1JVRkJZeTlDTEV0QlFVc3JSQ3hGUVVGVlNTeE5RVUZQTEVOQlJYUkRMRWRCUkVFM1JTeEZRVUZQZVVVc1JVRkJWVWtzUzBGQlMwTXNVVUZCVVhKRExFVkJRV1VzVFVGRGRrTTRRaXhGUVVGVE0wa3NTMEZCUzJFc1VVRkJVWFZFTEVsQlJURkNMRWxCUVVzeVJTeExRVVJNT1VNc1JVRkJVV3BITEV0QlFVdGhMRkZCUlZodlFpeEZRVUZSWjBVc1JVRkJUVGhETEVkQlEwc3NUVUZCWmtFc1NVRkJiVVFzU1VGQk4wSkJMRVZCUVZjeFNTeFJRVUZSTEUxQlEyeERMRWxCUVVrMFJ5eFBRVUZQTEVsQlFVODRRaXhGUVVGWFJ5eFJRVUZSTEUxQlFVOHNUVUZCVXl4TFFVTnVSSEJGTEV0QlFVdFdMRXRCUTJSMVJTeEZRVUZUTVVjc1IwRkxha0l3Unl4SlFVRlhRU3hGUVVGVE0wa3NTMEZCUzJFc1VVRkJVU3hOUVVNM1FqaElMRVZCUVU5a0xGRkJRMVJCTEVkQlFWRXNSVUZEVW1sQ0xFVkJRV0VzUTBGQlEwUXNTVUZMY0VJc1NVRkJTeTlETEVWQlFVc3NSVUZCUjBNc1IwRkVZa2NzUlVGQlVUUkRMRWRCUVdNMVFpeEZRVUZMTkVJc1dVRkRRWEpKTEU5QlFWRnhSaXhGUVVGTFF5eEZRVUZQUkN4SlFVTTNReXRETEVWQlFWa3pReXhGUVVGTlNpeEhRVU5rWlN4RlFVRmpMMElzUzBGQlN5dEVMRVZCUVZWSkxGRkJReTlDTjBVc1JVRkJUM2xGTEVWQlFWVkpMRXRCUVV0RExGRkJRVkZ5UXl4RlFVRmxMRWxCUXpkRE4wY3NTMEZCU3pSSExHRkJRV0VzVlVGQlYwMHNSVUZCVFRsRExFVkJRVTE1UlN4RlFVRlZOVWNzVVVGVmRrUXNUMEZRU3pSR0xFbEJRMGg2UkN4RlFVRlBPRU1zUlVGQlN6aENMRk5CUVZOSExHTkJRMnBDYmtvc1MwRkJTMk1zVjBGQlYzTkVMRXRCUVZVNFF5eEZRVUZMYTBNc1UwRkRha053U2l4TFFVRkxNa2dzVTBGQlUzQkVMRXRCUVVzc1NVRkJTVE5HTEVWQlFVOTVTeXhwUWtGQmFVSnlTaXhMUVVGTmEwZ3NSVUZCVFRsRExFbEJRek5FZVVRc1IwRkJVU3hKUVVkTVFTeEhRVWRVZWtZc1JVRkJTMnhETEZWQlFWVjFSeXhQUVVGVExGTkJRVk4yU0N4SFFVTXZRaXhKUVVGSmVVTXNSVUZCVTNORExFVkJRVWxETEVWQlFVMDRRaXhGUVVGUE4wSXNSVUZIT1VJc1NVRkVRVUVzUlVGQlZ5eEhRVU5PUml4RlFVRkxMRVZCUVVkRExFZEJSbUk0UWl4RlFVRlJhRWNzUzBGQlN6SklMRlZCUldGc1NDeFBRVUZSZDBRc1JVRkJTME1zUlVGQlRVUXNTVUZGZGtNdlJTeEZRVVJLZVVNc1JVRkJWWEZGTEVWQlFVMHZRaXhMUVVWa1JTeEZRVUZUU1N4TFFVRkxOVU1zUjBGSGJFSXNUMEZCVDNkRExFZEJSMVF2UWl4RlFVRkxiRU1zVlVGQlZXZERMRXRCUVU4c1YwRkRjRUlzU1VGQllTdENMRVZCUVVsRExFVkJRVTA0UWl4RlFVVjJRaXhKUVVGTEwwSXNSVUZCU3l4RlFVRkhReXhIUVVSaU9FSXNSVUZCVVdoSExFdEJRVXN5U0N4VlFVTmhiRWdzVDBGQlVYZEVMRVZCUVV0RExFVkJRVTFFTEVsQlEycERLMElzUlVGQlRTOUNMRWRCUTFJdlFpeFJRVWxhUlN4RlFVRkxiRU1zVlVGQlZYTkhMRTlCUVZNc1YwRkRkRUlzU1VGQllYWkRMRVZCUVVsRExFVkJRVTA0UWl4RlFVVjJRaXhKUVVGTEwwSXNSVUZCU3l4RlFVRkhReXhIUVVSaU9FSXNSVUZCVVdoSExFdEJRVXN5U0N4VlFVTmhiRWdzVDBGQlVYZEVMRVZCUVV0RExFVkJRVTFFTEVsQlEycERLMElzUlVGQlRTOUNMRWRCUTFKMVF5eFZRVWxhY0VVc1JVRkJTMnhETEZWQlFWVnhSeXhMUVVGUExGZEJRM0JDTEVsQlFVazFSU3hGUVVGVGMwTXNSVUZCU1VNc1JVRkJUVGhDTEVWQlJYWkNMRWxCUVVzdlFpeEZRVUZMTEVWQlFVZERMRWRCUkdJNFFpeEZRVUZSYUVjc1MwRkJTekpJTEZWQlEyRnNTQ3hQUVVGUmQwUXNSVUZCUzBNc1JVRkJUVVFzU1VGRlppeHRRa0ZFTlVKMFF5eEZRVUZWY1VVc1JVRkJUUzlDTEVsQlEwZHpReXhOUVVOcVFqVkZMRVZCUVZFMFJTeFJRVXRrYmtVc1JVRkJTMnhETEZWQlFWVnZSeXhSUVVGVkxGZEJRM1pDTEVsQlFXRnlReXhGUVVGSlF5eEZRVUZOT0VJc1JVRkxka0lzU1VGQlN5OUNMRVZCUVVzc1JVRkJSME1zUjBGS1lqaENMRVZCUVZGb1J5eExRVUZMZVVjc1QwRkJUeXhUUVVGVGFVTXNSMEZETTBJc1NVRkJTVEZETEVWQlEwb3NUMEZCTmtJc1QwRkJja0pCTEVWQlFWRXdReXhGUVVGRlF5eFJRVUZyUWpORExFVkJRVTF6UkN4bFFVRlpMRXRCUlRsQ04wa3NUMEZCVVhkRUxFVkJRVXRETEVWQlFVMUVMRWxCUTJwREswSXNSVUZCVFM5Q0xFZEJRMUp4UXl4WFFVbGFiRVVzUlVGQlMyeERMRlZCUVZWdFJ5eFBRVUZUTEZOQlFWTjRSU3hIUVVNdlFpeEpRVUZKUml4RlFVRlRPVUlzUlVGQlN6QktMRVZCUVU5MFJpeEZRVUZKUXl4RlFVRk5PRUlzUlVGSmJrTXNTVUZCUzI1SExFdEJTRk1zVFVGQlZtZERMRWxCUTBaQkxFVkJRVk1zU1VGRlEwRXNSVUZEVmpCSUxFVkJRVkV4U0N4RlFVRlBhRU1zUjBGRFprY3NTMEZCU3paQ0xFOUJRVTlvUXl4SFFVRlBNRW9zUlVGSGNrSXNTVUZCUzNSR0xFVkJRVXNzUlVGQlIwTXNSMEZFWWpoQ0xFVkJRVkZvUnl4TFFVRkxNa2dzVlVGRFlXeElMRTlCUVZGM1JDeEZRVUZMUXl4RlFVRk5SQ3hKUVVWaUxHMUNRVVE1UW5SRExFVkJRVlZ4UlN4RlFVRk5MMElzU1VGRFIyOURMRkZCUTJwQ01VVXNSVUZCVVRCRkxFOUJRVTk0UlN4SlFVdGtUeXhGUVRWUlN5eEhRV2RTWkhoRUxFVkJRVTgwU3l4UlFVRlZMRmRCUTJZc1UwRkJVMEVzUlVGQlVUVklMRVZCUVUxUExFVkJRVWxwUXl4RlFVRk5UeXhGUVVGVGFrVXNSMEZEZUVOV0xFdEJRVXMwUWl4TFFVRlBRU3hGUVVOYU5VSXNTMEZCUzIxRExFZEJRVXRCTEVWQlExWnVReXhMUVVGTGIwVXNTMEZCVDBFc1JVRkRXbkJGTEV0QlFVc3lSU3hSUVVGVlFTeEZRVU5tTTBVc1MwRkJTMVVzVVVGQmNVSXNUVUZCV0VFc1JVRkJhMEpCTEVWQlFWVXNSMEZETTBOV0xFdEJRVXQ1U2l4VFFVRlhlRXNzUlVGQlQyVXNTMEZCUzNsS0xGTkJRVlY2U2l4TlFVTjBRMEVzUzBGQlMzRkhMRTlCUVZOd1NDeEZRVUZQWlN4TFFVRkxjVWNzVDBGQlVYSkhMRTFCUTJ4RFFTeExRVUZMZDBjc1QwRkJVM1pJTEVWQlFVOWxMRXRCUVV0M1J5eFBRVUZSZUVjc1RVRkRiRU5CTEV0QlFVdHJReXhMUVVGUGFrUXNSVUZCVDJVc1MwRkJTMnRETEV0QlFVMXNReXhOUVVNNVFrRXNTMEZCUzNOSExGRkJRVlZ5U0N4RlFVRlBaU3hMUVVGTGMwY3NVVUZCVTNSSExFMUJRM0JEUVN4TFFVRkxkVWNzUzBGQlQzUklMRVZCUVU5bExFdEJRVXQxUnl4TFFVRk5ka2NzVFVGRE9VSkJMRXRCUVVzd1NpeEpRVUZOZWtzc1JVRkJUMlVzUzBGQlN6QktMRWxCUVVzeFNpeE5RVU0xUWtFc1MwRkJTekpLTEdGQlFXVXhTeXhGUVVGUFpTeExRVUZMTWtvc1lVRkJZek5LTEUxQlF6bERRU3hMUVVGTE5Fb3NaVUZCYVVJelN5eEZRVUZQWlN4TFFVRkxORW9zWlVGQlowSTFTaXhOUVVOc1JFRXNTMEZCU3paS0xIZENRVUV3UWpWTExFVkJRVTlsTEV0QlFVczJTaXgzUWtGQmVVSTNTaXhOUVVOd1JVRXNTMEZCU3poS0xGbEJRV00zU3l4RlFVRlBaU3hMUVVGTE9Fb3NXVUZCWVRsS0xFMUJRelZEUVN4TFFVRkxLMG9zVVVGQlZUbExMRVZCUVU5bExFdEJRVXNyU2l4UlFVRlRMMG9zVFVGRGNFTkJMRXRCUVV0blN5eFZRVUZaTDBzc1JVRkJUMlVzUzBGQlMyZExMRlZCUVZkb1N5eE5RVU40UTBFc1MwRkJTMlVzVjBGQllXWXNTMEZCUzFVc1VVRkJVVXNzV1VGQll5eEhRVU0zUTJZc1MwRkJTM0ZJTEdGQlFXVXNSMEZEY0VKeVNDeExRVUZMYVVzc2JVSkJRWEZDTEVkQlF6RkNha3NzUzBGQlMzVktMRmRCUVZFc1JVRkRZblpLTEV0QlFVdG5TeXhaUVRaTlVDeFBRVEZOUVZJc1JVRkJVWFJLTEZWQlFWVTRTaXhWUVVGWkxGZEJRelZDTEVsQlFVbHFRaXhGUVVGdlFqbEhMRVZCUVU4clJDeEZRVU12UWl4TFFVRk5hRWNzUzBGQlN6SkpMRTlCUVZNelNTeExRVUZMTkVJc1MwRkJTMllzVVVGQlVXSXNTMEZCUzI5RkxFOUJSWHBETEVsQlFVc3lSU3hMUVVSTUwwTXNSVUZCVVdoSExFdEJRVXMwUWl4TFFVRkxaaXhSUVVWb1FtOUNMRVZCUVZFclJDeEZRVUZOSzBNc1IwRkRTeXhOUVVGbVFTeEpRVUZ0UkN4SlFVRTNRa0VzUlVGQlZ6RkpMRkZCUVZFc1RVRkRiRU1zU1VGQlNUUkhMRTlCUVU4c1NVRkJUemhDTEVWQlFWZEhMRkZCUVZFc1RVRkJUeXhOUVVGVExFdEJRMjVFY0VVc1MwRkJTemxGTEV0QlFVdHZSU3hSUVVOdVFuQkZMRXRCUVVzeVNTeFBRVUZUTVVjc1JVRkRaR3BETEV0QlFVdHJTeXhMUVVGUExFbEJRVWxxUkN4UFFVRlBMRWxCUVU4NFFpeEZRVUZYUnl4UlFVRlJMRTFCUVU4c1VVRkJWeXhMUVVGTGFVSXNTMEZCUzI1TExFdEJRVXR2UlN4TlFVTnNSbkJGTEV0QlFVdHJTeXhMUVVGTGVrTXNVMEZOYkVJc1IwRkVRWHBJTEV0QlFVc3lTU3hUUVVGWE0wa3NTMEZCU3pKSkxFOUJRVk16U1N4TFFVRkxORUlzUzBGQlMyWXNVVUZCVVN4TlFVTTFRMklzUzBGQlN6SkpMR3RDUVVGclFubENMRk5CUTNwQ0xFOUJRVTl3U3l4TFFVRkxNa2tzVDBGQlV5eERRVU51UWpCQ0xGRkJRVk55U3l4TFFVRkxNa2tzVTBGTGNFSmhMRVZCUVZGMFNpeFZRVUZWTmtvc1VVRkJWU3hUUVVGVFR5eEZRVUZMTTBZc1JVRkJVelJHTEVkQlEycEVMRTlCUVU4elRDeEZRVUZQTkV3c1YwRkJWMFlzUlVGQlN6TkdMRVZCUVZNMFJpeEZRVUZWTEVOQlF5OURSU3hMUVVGTmVrc3NTMEZCU3pSQ0xFdEJRVXRVTEdOQlEyaENTQ3hUUVVGVmFFSXNTMEZCU3pSQ0xFdEJRVXRhTEZsQlNYaENkMGtzUlVGQlVYUktMRlZCUVZVMFNpeFpRVUZqTEZkQlF6bENMRWxCUVVrM1FpeEZRVVZLTEU5QlJFRkJMRVZCUVZGeVNpeEZRVUZQTkVZc1YwRkJWMGtzVFVGQlRUVkZMRXRCUVVzeVJTeFZRVU16UWxBc1QwRkJVM2hHTEVWQlFVODBSaXhYUVVGWFF5eE5RVUZOUXl4VlFVTnNRekZGTEV0QlFVdHBReXhOUVVGUlowY3NSVUZCVFdoSExFOUJSVEZDYWtNc1MwRkJTekJMTEZOQlFWY3hTeXhMUVVGTEswb3NVVUZCVVM5S0xFdEJRVXMwUWl4TFFVRkxReXhQUVVGUk4wSXNTMEZCU3pKRkxGRkJRVk16UlN4TFFVRkxkVWNzVFVGRE0wUjJSeXhMUVVGTGRVb3NUVUZCVVhaS0xFdEJRVXN3U3l4VFFVRlRReXhUUVVsMFEyNUNMRVZCUVZGMFNpeFZRVUZWTWtvc2QwSkJRVEJDTEZOQlFWTkxMRVZCUVUxVkxFZEJRM3BFTEVsQlFVbERMRVZCUVVsRExFVkJRVXRLTEVWQlFWVkxMRVZCUVdWc1JpeEZRVUZQTlVJc1JVRkJTVU1zUlVGWGFrUXNTVUZXUVdkSExFVkJRVThzVjBGRFRDeEpRVUZKYWtjc1JVRkJTVU1zUlVGQlRVTXNSVUZGWkN4SlFVUkJRU3hGUVVGWExFZEJRMDVHTEVWQlFVc3NSVUZCUjBNc1JVRkJUMmRITEVWQlFVdDZTaXhQUVVGUmQwUXNSVUZCUzBNc1JVRkJUVVFzU1VGRE1VTTJSeXhGUVVGTldpeEZRVUZMYWtjc1IwRkRXRVVzUlVGQlUwa3NTMEZCU3pOR0xFVkJRVTgwUml4WFFVRlhTU3hOUVVGTmEwY3NTVUZGZUVNc1QwRkJUek5ITEVWQlVFWXNSMEZUVURSSExFVkJRV2RDTEVkQlExaEdMRVZCUVVzMVJ5eEZRVUZMTEVWQlFVZERMRVZCUVU5blJ5eEZRVUZMZWtvc1QwRkJVWGRFTEVWQlFVdERMRVZCUVUweVJ5eEpRVUZQTlVjc1JVRkRkRVEyUnl4RlFVRk5XaXhGUVVGTFZ5eEhRVU5ZUlN4RlFVRmplRWNzUzBGQlMzVkhMRVZCUVVreFJ5eFBRVUZUZUVZc1JVRkJUelJHTEZkQlFWZERMRTFCUVUxRExGVkJRVmx2Unl4RlFVRkpOMGtzVVVGQlZUUkVMRVZCUVZFM1JpeExRVUZMYVVzc2IwSkJRVzlDVnl4TFFVRnZRaTlGTEVWQlFVMHJSU3hIUVVGclFpeExRVUZQUml4RlFVRlhNVXNzUzBGQlMybExMRzFDUVVGdFFsY3NSMEZCWjBKRExFMUJRVkZJTEVWQlFWY3hTeXhMUVVGTEswb3NVVUZCVVM5S0xFdEJRVXMwUWl4TFFVRkxReXhQUVVGUmFVb3NSVUZCU1RkSkxFMUJRVTlxUXl4TFFVRkxkVWNzVFVGQlQzWkhMRXRCUVV0cFN5eHRRa0ZCYlVKWExFZEJRV2RDUXl4SFFVRk5TQ3hIUVVGdlFrRXNSVUZCVTNwSkxGVkJSUzlYTEU5QlFVODRTU3hIUVVkVWRrSXNSVUZCVVhSS0xGVkJRVlV3U2l4bFFVRnBRaXhUUVVGVE0wZ3NSMEZETVVNc1NVRkJTV2xKTEVWQlFVMWpMRVZCUVVsRExFVkJRVmRETEVWQlFVbElMRVZCUVdVNVJ5eEZRVUZKUXl4RlFVRk5PRUlzUlVGQlQwTXNSVUZGTjBRc1NVRkJTeXRGTEVWQlFVc3ZSeXhGUVVGTExFVkJRVWRETEVkQlJHeENPRUlzUlVGQlVXaEhMRXRCUVV0bExGbEJRMnRDVGl4UFFVRlJkMFFzUlVGQlMwTXNSVUZCVFRoSExFbEJRVTh2Unl4RlFVZDJSR2xJTEVkQlJFRm9RaXhIUVVSQlpTeEZRVUZaYWtZc1JVRkJUV2RHTEVsQlEwUjRSQ3hOUVVGTkxDdERRVU5pUXl4UlFVTldkMFFzUlVGQldXcE1MRXRCUVVzMFFpeExRVUZMWWl4WFFVRlhiVXNzUjBGRGFrTklMRVZCUVdkQ0wwc3NTMEZCU3paS0xIZENRVUYzUWtzc1JVRkJUV01zU1VGRGFrTXNUVUZCWWtNc1JVRkJiMEpCTEVWQlFWVkZMRlZCUVU4c1lVRkJiVUptTEZOQlF6TkVia2tzUjBGQlUyZEZMRVZCUVZGblJpeEZRVUZWUlN4TlFVRk5ja3dzUzBGQlMxWXNUVUZCVFRaSExFVkJRVThzUTBGQlEycEhMRXRCUVV0MVNpeE5RVUZQZEVnc1IwRkJUeXRGTEU5QlFVOHhTQ3hGUVVGUlVTeExRVUZMYVV3c1MwRkRiRVpGTEdGQlFYRkNZaXhYUVVNNVFtNUpMRVZCUVZGblNpeEZRVUZWYmt3c1MwRkJTMVlzVFVGQlRUWk1MRVZCUVZjc1EwRkJRMnBNTEV0QlFVdDFTaXhOUVVGUGRFZ3NSMEZCVHl0RkxFOUJRVTh4U0N4RlFVRlJVU3hMUVVGTGFVd3NUVUZIY0VZc1QwRkJUemxKTEVkQlIxUjFTQ3hGUVVGUmRFb3NWVUZCVlhsS0xHRkJRV1VzVTBGQlUzcExMRWRCUTNoRExFbEJRVWw1UXl4RlFVRlRTQ3hGUVVWaUxFOUJSRUZCTEVkQlFWZEhMRVZCUVZVelFpeE5RVUZOTkVJc1MwRkJTMG9zVVVGRGVrSXNVMEZCVTBVc1IwRkRaQ3hQUVVGUFJpeEZRVUZSTVVJc1MwRkJTMW9zUlVGQlNXTXNTMEZCVFRCQ0xFVkJRVWxETEV0QlNYUkROa2dzUlVGQlVYUktMRlZCUVZWM1NpeEpRVUZOTEZOQlFWTjZTQ3hIUVVNdlFpeEpRVUZKSzBRc1JVRkZTaXhQUVVSQkwwUXNSVUZCVVVFc1lVRkJhVUp0U1N4WFFVRmhjRXNzUzBGQlN6SkpMRTlCUVdsQ0xGVkJRVXN2U2l4RlFVRmxMRTlCUVVWNVF5eHBRa0ZCYlVKeVFpeExRVUZMTkVvc1pVRkJaVE5JTEVWQlFVMXVReXhMUVVGTFJTeExRVUZMZFVvc1VVRkJWWFpLTEV0QlFVczBTaXhsUVVGbE0wZ3NSMEZETDBnc1QwRkJhRU1yUkN4RlFVRlJhRWNzUzBGQlN6SkpMRTlCUVU4d1FpeFRRVUZ0UW5KRkxFVkJRVTFzUnl4TFFVRkxSU3hMUVVGTlFTeExRVUZMYlVNc1IwRkJTVVlzVVVGQlV5eEhRVWR3Um5WSUxFVkJRVkYwU2l4VlFVRlZjVWNzUzBGQlR5eFhRVU4yUWl4SlFVRkpOa1VzUlVGQldWWXNSVUZEYUVJc1QwRkJUekZMTEV0QlFVc3dTaXhKUVVGSkxGZEJRMlFzU1VGQlNYcEdMRVZCUVVrMlFpeEZRVUZKTlVJc1JVRkJUVFpDTEVWQlFVOURMRVZCUVU5RExFVkJRVTlETEVWQlEzWkRMRWRCUVVsc1J5eExRVUZMTUVzc1UwRkJWU3hEUVVOcVFpeEhRVUZKTVVzc1MwRkJTM1ZLTEZGQlFWVjJTaXhMUVVGTE1Fc3NVMEZCVTBNc1QwRkJVU3hEUVVWMlF5eEpRVUZMTVVjc1JVRkJTeXhGUVVGSFF5eEhRVVJpT0VJc1JVRkJVV2hITEV0QlFVdHhTQ3hqUVVOaE5VY3NUMEZCVVhkRUxFVkJRVXRETEVWQlFVMUVMRXRCUXpORGVVY3NSVUZCVnpGRkxFVkJRVTB2UWl4SlFVTlNiMGdzV1VGSFdDeEhRVVJCY2t3c1MwRkJTM0ZJTEdGQlFXVXNSMEZEZDBJc1QwRkJkRU55U0N4TFFVRkxkVW9zVFVGQlVYWktMRXRCUVVzd1N5eFRRVUZUUXl4VlFVRTBSQ3hQUVVGMFF6RkZMRVZCUVZGcVJ5eExRVUZMVlN4UlFVRlJNa2NzWTBGQmQwSndRaXhGUVVGTmVFWXNXVUZCVXl4SFFVVnFTQ3hKUVVGTGNVWXNSVUZCU3l4RlFVRkhReXhIUVVSaVJ5eEZRVUZSYkVjc1MwRkJTMVVzVVVGQlVUSkhMR05CUTAwMVJ5eFBRVUZSY1VZc1JVRkJTME1zUlVGQlQwUXNTVUZETjBOelJpeEZRVUZoYkVZc1JVRkJUVW9zUjBGRGJrSTBSU3hGUVVGWE1Vc3NTMEZCU3l0S0xGRkJRVkV2U2l4TFFVRkxkVW9zVFVGQlR6WkNMRVZCUVZsd1RDeExRVUZMZFVjc1RVRkRja1IyUnl4TFFVRkxjVWdzWVVGQllUbERMRXRCUVV0dFJ5eEhRVWszUWl4UFFVRlBNVXNzUzBGQlN6QkxMRk5CUVZONlNTeFJRVVZ5UWl4UFFVRlBha01zUzBGQlMybERMRTlCUldKdVF5eExRVUZMUlN4UlFVZFdkMG9zUlVGQlVYUktMRlZCUVZWdlJ5eFJRVUZWTEZkQlF6RkNMRWxCUVVrMFJDeEZRVUZOWXl4RlFVRkpUU3hGUVVGMVFrb3NSVUZCU1Vzc1JVRkJiMEpTTEVWQlFXVTVTU3hGUVVGUFowTXNSVUZCU1VNc1JVRkJUVGhDTEVWQlFVOURMRVZCUVU5RExFVkJRek5ITEVkQlFVbHNSeXhMUVVGTE1Fc3NVMEZCVlN4RFFVbHFRaXhKUVVoQmVra3NSVUZCVVdwRExFdEJRVXQ1U2l4VFFVRlRla29zUzBGQlMyMURMRWxCUXpOQ2Iwb3NSVUZCY1VKMlRDeExRVUZMWlN4WFFVRlhUaXhQUVVGVExFVkJSWHBETmtzc1JVRkJZWEpJTEVWQlFVc3NSVUZCUjBNc1IwRkVNVUk0UWl4RlFVRlJhRWNzUzBGQlMyVXNWMEZCVjNoQ0xFMUJRVTBzUjBGQlIybE5MRmRCUTAwdlN5eFBRVUZSZDBRc1JVRkJTME1zUlVGQlRXOUlMRWxCUVdWeVNDeEZRVVYyUlN0SExFVkJRVXRQTEVWQlFYRkNSQ3hGUVVVeFFrb3NSMEZFUVdoQ0xFVkJSbGxzUlN4RlFVRk5jMFlzUjBGRlJEVkVMRTFCUVUwc1VVRkRZa1FzVVVGRFZuTkVMRVZCUVdkQ0wwc3NTMEZCU3paS0xIZENRVUYzUWtzc1JVRkJUV01zU1VGRFZDeFBRVUZ5UXk5RkxFVkJRVkZxUnl4TFFVRkxORUlzUzBGQlMySXNWMEZCVjIxTExFbEJRV1ZxUml4RlFVRk5TeXhoUVVGVkxFdEJReTlFY2tVc1IwRkJVMmxGTEVWQlFWRnNSeXhMUVVGTE5FSXNTMEZCUzJJc1YwRkJWMjFMTEVsQlFVczFSU3hSUVVGUmJFZ3NUVUZCVFRoSExFVkJRVThzUTBGQlEycEZMRWRCUVU4clJTeFBRVUZQTVVnc1JVRkJVVkVzUzBGQlMybE1MRTFCUjJoSExFOUJRVTh2U3l4TFFVRkxNRXNzVTBGQlUyVXNVMEZCVTNoS0xFdEJTV3hEZFVnc1JVRkJVWFJLTEZWQlFWVm5ReXhMUVVGUExGZEJRM1pDTEVsQlFVbHJTaXhGUVVGWlZpeEZRVUZWZWtjc1JVRkJTVU1zUlVGQlRUaENMRVZCUVU5RExFVkJRVTlETEVWQlMyeEVMRWRCU2tGc1J5eExRVUZMT0Vvc1kwRkROa0lzVDBGQk4wSTVSQ3hGUVVGUmFFY3NTMEZCU3pKSkxFOUJRVTk2Unl4UFFVTjJRamhFTEVWQlFVMXNSeXhMUVVGTFJTeExRVUZOUVN4TFFVRkxiVU1zU1VGRlRDeE5RVUZrYmtNc1MwRkJTM1ZLTEZGQlFUQkVMRTlCUVhSRGRFUXNSVUZCVVdwSExFdEJRVXRWTEZGQlFWRXlSeXhqUVVGM1FuQkNMRVZCUVUxNFJpeFpRVUZUTEVkQlJYaEdMRWxCUVV0M1JDeEZRVUZMTEVWQlFVZERMRWRCUkdKblF5eEZRVUZSYkVjc1MwRkJTMVVzVVVGQlVUSkhMR05CUTBzMVJ5eFBRVUZSZDBRc1JVRkJTME1zUlVGQlRVUXNTVUZETTBOdFNDeEZRVUZoYkVZc1JVRkJUV3BETEVkQlEyNUNlVWNzUlVGQlZ6RkxMRXRCUVVzclNpeFJRVUZSTDBvc1MwRkJTM1ZLTEUxQlFVODJRaXhGUVVGWmNFd3NTMEZCUzNWSExFMUJRM0pFZGtjc1MwRkJTM0ZJTEdGQlFXRTVReXhMUVVGTGJVY3NSMEZITTBJc1IwRkJTVEZMTEV0QlFVczBRaXhMUVVGTFVpeFpRVU5hTEU5QlFVOXdRaXhMUVVGTGRVY3NVVUZKYUVKcFJDeEZRVUZSZEVvc1ZVRkJWWE5ITEU5QlFWTXNWMEZEZWtJc1NVRkJTWEZGTEVWQlFVbFlMRVZCUVUxakxFVkJRV012Unl4RlFVRkpReXhGUVVGTk9FSXNSVUZCVDBNc1JVRkJUME1zUlVGQlQwTXNSVUZSTTBRc1NVRlFiME1zVDBGQkwwSklMRVZCUVZGb1J5eExRVUZMTWtrc1QwRkJUMjVETEZOQlEzWkNVaXhGUVVGTmJFY3NTMEZCUzBVc1MwRkJUVUVzUzBGQlMyMURMRWxCUlU4c1QwRkJNVUk0UkN4RlFVRlJha2NzUzBGQlN6QkxMRmRCUTJoQ2VrVXNSVUZCVFc5R0xGbEJSMGh3U0N4RlFVRkxMRVZCUVVkRExFZEJSR0puUXl4RlFVRlJiRWNzUzBGQlMzRklMR05CUTJFMVJ5eFBRVUZSZDBRc1JVRkJTME1zUlVGQlRVUXNTVUZEYUVOcFF5eEZRVUZOYWtNc1IwRkRVbTlJTEZsQlNWZ3NTVUZCUzB3c1MwRkdUR2hNTEV0QlFVdHhTQ3hoUVVGbExFZEJRM0JDYkVJc1JVRkJVVzVITEV0QlFVdHBTeXh0UWtGSFdDeEpRVUZMV1N4TFFVUk1XQ3hGUVVGUEwwUXNSVUZCVFRaRkxFZEJSVUZrTEVWQlFVdFhMRWRCUTFCUkxGbEJSMklzVDBGQlQzSk1MRXRCUVV0cFN5eHRRa0ZCY1VJc1NVRkhia05VTEVWQlFWRjBTaXhWUVVGVmJVY3NUMEZCVXl4VFFVRlRlRVVzUjBGRGJFTXNTVUZCU1cxRkxFVkJRVTlETEVWQlMxZ3NUMEZLWXl4TlFVRldjRVVzU1VGRFJrRXNSVUZCVXl4SlFVVllOMElzUzBGQlMzVktMRTFCUVcxRExFOUJRVEZDZGtRc1JVRkJVV2hITEV0QlFVc3dTeXhWUVVGdlFqRkZMRVZCUVUweVJTeFpRVUZUTEVWQlEzWkNMRTlCUVM5Q01VVXNSVUZCVVdwSExFdEJRVXN5U1N4UFFVRlBkRU1zVVVGQmEwSktMRVZCUVUxdVJ5eExRVUZMUlN4TFFVRk5Oa0lzVVVGQlZTeEhRVWN6UlRKSUxFVkJRVkYwU2l4VlFVRlZkVW9zVTBGQlZ5eFRRVUZUZEVnc1IwRkRjRU1zVDBGQlNXNURMRXRCUVVzeVNTeFJRVUZ0UXl4TlFVRjRRak5KTEV0QlFVc3lTU3hQUVVGUFl5eFRRVU4yUW5wS0xFdEJRVXN5U1N4UFFVRlBZeXhUUVVGVE0wb3NTMEZCUzBVc1MwRkJUVzFETEVkQlJXaERka1FzUlVGQlQzVkZMRXRCUVV0SkxHTkJRV053UWl4SlFVazVRbkZJTEVWQmNrOVJMRWRCZVU5cVFqVkxMRVZCUVU5NVN5eHBRa0ZCYlVJc1UwRkJWWEZETEVkQlIyeERMRk5CUVZOeVF5eEZRVUZwUW5wSUxFVkJRVTFQTEVWQlFVbHBReXhIUVVOc1F5eEpRVUZKZVVVc1JVRkJWMmhETEVWQlFXVTRSU3hGUVVGak1VUXNSVUZCVDJoRkxFVkJRVWxETEVWQlFVMDRRaXhGUVVGUFF5eEZRV0Z3UlN4SlFWcEJha2NzUzBGQlN6UkNMRXRCUVU5QkxFVkJRMW8xUWl4TFFVRkxiVU1zUjBGQlMwRXNSVUZEVm01RExFdEJRVXR2UlN4TFFVRlBRU3hGUVVOYWNFVXNTMEZCUzNkSExFOUJRVk4yU0N4RlFVRlBaU3hMUVVGTGQwY3NUMEZCVVhoSExFMUJRMnhEUVN4TFFVRkxhME1zUzBGQlQycEVMRVZCUVU5bExFdEJRVXRyUXl4TFFVRk5iRU1zVFVGRE9VSkJMRXRCUVVzMFRDeFBRVUZUTTAwc1JVRkJUMlVzUzBGQlN6Uk1MRTlCUVZFMVRDeE5RVU5zUTBFc1MwRkJTM05ETEZWQlFWbDBReXhMUVVGTE5FSXNTMEZCUzJRc1YwRkJWMlFzUzBGQlMyOUZMRTFCUXpORGNFVXNTMEZCWVN4UFFVRkpMRWRCUTJwQ1FTeExRVUZMTmt3c1ZVRkJXU3hIUVVOcVFqZE1MRXRCUVVzNFRDeHJRa0ZCYjBJc1IwRkRla0pxUml4RlFVRm5RbXBHTEVWQlFVdHBSaXhuUWtGRmFFSTFReXhGUVVGTExFVkJRVWRETEVkQlJHSTRRaXhGUVVGUmFFY3NTMEZCUzIxRExFZEJRVWN5Unl4WlFVRmpMRWxCUTBweVNTeFBRVUZSZDBRc1JVRkJTME1zUlVGQlRVUXNTVUZETTBNMFJTeEZRVUZaTjBNc1JVRkJUUzlDTEVkQlEySTBReXhGUVVGakwwSXNTMEZCU3l0RUxFVkJRVlZKTEZGQlEyaERNRU1zUlVGQlpUTk1MRXRCUVVzclRDeFZRVUZWYkVRc1JVRkJWVWtzVFVGRGVFTm9RaXhGUVVGUmNrb3NSVUZCVHpSR0xGZEJRVmRKTEUxQlFVMXBSU3hGUVVGVk5VY3NUMEZEZEVNM1FpeEZRVUZWVGl4TFFVRXlReXhQUVVGeVEyMUhMRVZCUVZGcVJ5eExRVUZMYzBNc1ZVRkJhMElzVVVGQllUSkVMRVZCUVZFc1IwRkJTVEJHTEVsQlFXbENMRVZCUXpOR00wd3NTMEZCWVN4UFFVRkZNa3dzUjBGQlowSTVReXhGUVVGVk5VY3NUVUZEYUVOblJ5eEZRVUZOTjBRc1QwRkJVM2hHTEVWQlFVODBSaXhYUVVGWFF5eE5RVUZOUXl4VlFVTm9SREZGTEV0QlFXRXNUMEZCUlRKTUxFZEJRV2RDTVVRc1JVRkJUV2hITEUxQlJYSkRha01zUzBGQlN6Wk1MRlZCUVZWR0xFZEJRV2RDT1VNc1JVRkJWVFZITEU5QlowaHFSQ3hQUVRGSlFYWkRMRVZCUVZVeVNpeEZRVUZyUW5GRExFZEJaME0xUW5KRExFVkJRV2xDYmtvc1ZVRkJWWEZITEV0QlFVOHNZVUZGYkVNNFF5eEZRVUZwUW01S0xGVkJRVlZ0Unl4UFFVRlRMR0ZCUlhCRFowUXNSVUZCYVVKdVNpeFZRVUZWYjBjc1VVRkJWU3hoUVVWeVF5dERMRVZCUVdsQ2Jrb3NWVUZCVlRCTUxFOUJRVk1zVjBGRGJFTXNTVUZCU1M5TUxFVkJRVXMyU3l4RlFVRlZjMElzUlVGQlVTOUtMRVZCUVU4clJDeEZRVUZQUXl4RlFVZDZReXhKUVVGTGNFY3NTMEZHVEcxTkxFVkJRVk1zUjBGRFZHaEhMRVZCUVZGb1J5eExRVUZoTEU5QlJXNUNhVU1zUlVGQlVTdEVMRVZCUVUxdVJ5eEhRVU5rYlUwc1JVRkJUMjVOTEVkQlFVOXZReXhGUVVkb1FpeEpRVUZMY0VNc1MwRkVURzlITEVWQlFWRnFSeXhMUVVGTE5rd3NWVUZGV0c1Q0xFVkJRVmQ2UlN4RlFVRk5jRWNzUjBGRGFrSnRUU3hGUVVGUGJrMHNSMEZCVHpaTExFVkJRVk42U1N4UlFVVjZRaXhQUVVGUEswb3NSMEZIVkRORExFVkJRV2xDYmtvc1ZVRkJWVFpNTEZWQlFWa3NVMEZCVTJ4SUxFZEJRemxETEU5QlFVOUJMRVZCUVU5eFJTeFJRVUZSTEZsQlFXRXNVMEZCVXl0RExFZEJRekZETEU5QlFVOUJMRVZCUVZFc1IwRkJSME1zYVVKQlNYUkNOME1zUlVGQmFVSnVTaXhWUVVGVlowTXNTMEZCVHl4WFFVTm9ReXhKUVVGSmVVUXNSVUZCUnpsR0xFVkJRVXM0UlN4RlFVRlRLMFlzUlVGQlZURkpMRVZCUVZGMFFpeEZRVUZUT0VJc1JVRkJUMjlFTEVWQlFVZERMRVZCUVU4MVFpeEZRVUZKTmtJc1JVRkJTVFZDTEVWQlFVMDJRaXhGUVVGUFF5eEZRVUZQUXl4RlFVRlBReXhGUVVGUFF5eEZRVUZQUXl4RlFVRlBLMFlzUlVGQlQwTXNSVUZEYUVrc1NVRkJTM0JOTEV0QlFVdHhUU3hOUVVGUExFTkJSV1lzU1VGQlMzaE5MRXRCUkV4dFJ5eEZRVUZSYUVjc1MwRkJTelpNTEZWQlJWaHNTQ3hGUVVGVmNVSXNSVUZCVFc1SExFZEJRMmhDUnl4TFFVRkxOa3dzVlVGQlZXaE5MRWRCUVU5SExFdEJRVXNyU2l4UlFVRlJMMG9zUzBGQlN6UkNMRXRCUVV0RExFOUJRVkU0UXl4RlFVRlZMRk5CUVZWcFJDeEhRVU4yUlN4UFFVRlBMRk5CUVZNdlNDeEhRVU5rTEU5QlFVOHNWMEZEVEN4UFFVRlBLMGdzUlVGQlRUQkZMR05CUVdONlN5eFBRVUZQYUVNc1IwRkJUeXRJTEVWQlFVMXBSU3hWUVVGVmFFMHNSMEZCUzI5RExGVkJTRTRzUTBGTk0wUnFReXhOUVVGUFJpeExRVUZMUlN4TFFVRk5TQ3hKUVVWMlFrY3NTMEZCUzNGTkxFOUJRVkVzUlVGRlppeEhRVUV3UWl4TlFVRjBRbkpOTEV0QlFVdHpUU3hqUVVOUWRFMHNTMEZCUzNOTkxHTkJRV053U3l4WFFVTmtMRU5CVFV3c1NVRk1RV3hETEV0QlFVdHRReXhIUVVGSFlTeFZRVUZaYUVRc1MwRkJTM05ETEZWQlFWVkhMRk5CUVZNelF5eExRVUZMUlN4TlFVTnFSSGRETEVWQlFWRjRReXhMUVVGTGMwTXNWVUZCVlZjc1YwRkJWMjVFTEV0QlFVdEZMRXRCUVUxQkxFdEJRVXR0UXl4SFFVRkpia01zUzBGQlN6Uk1MRlZCUXpORU5Vd3NTMEZCUzIxRExFZEJRVWRwU0N4UlFVRlRMRVZCUTJwQ01Va3NSVUZCVlN4SFFVVk1kVVFzUlVGQlN5eEZRVUZIUXl4SFFVUmlLMElzUlVGQlVYSklMRVZCUVU4clFpeFpRVU5YUml4UFFVRlJkMFFzUlVGQlMwTXNSVUZCVFVRc1NVRkJUU3hEUVVkcVJDeEhRVVJCZGtRc1JVRkVRWE5DTEVWQlFWTnBSU3hGUVVGTmFFTXNTVUZEUnl4SFFVTmtha1VzUzBGQlMzTkRMRlZCUVZWT0xFZEJSV3BDTEVsQlFVc3lSQ3hMUVVSTVR5eEZRVUZSYkVjc1MwRkJTM05ETEZWQlFWVk9MRWRCUlhKQ05FUXNSVUZCU1Uwc1JVRkJUVkFzUjBGRFZtcEdMRVZCUVZGelFpeEhRVUZSTWtRc1IwRkJTME1zUlVGSmVrSXNTVUZCUzBRc1MwRkVURkVzUlVGQlVXNUhMRXRCUVVzMFFpeExRVUZMU1N4SFFVVm9RalJFTEVWQlFVbFBMRVZCUVUxU0xFZEJRekJDTEU5QlFTOUNSU3hGUVVGUmJrWXNSVUZCVVhOQ0xFbEJRVk15UkN4TFFVTTFRa1VzUlVGQlRVWXNSMEZCUzBNc1IwRkxha0lzU1VGQlMwVXNSVUZCU3l4RlFVRkhReXhIUVVSaVN5eEZRVUZSZUVnc1JVRkJUemhDTEZOQlExbEVMRTlCUVZGeFJpeEZRVUZMUXl4RlFVRlBSQ3hKUVVVM1EzQkdMRVZCUkVGelFpeEZRVUZUYjBVc1JVRkJUVTRzU1VGRGRVTXNUMEZCYmtOeFJ5eEZRVUZSYmswc1MwRkJTM05ETEZWQlFWVk9MRWxCUVcxQ2JVc3NSVUZCVVc1TkxFdEJRVXMwUWl4TFFVRkxTU3hIUVV0cVJpeEpRVUZMYmtNc1MwRklURWNzUzBGQlMzTk5MR05CUVdkQ0xFbEJRVWt4VGl4RlFVRlBkMFFzUzBGQlN6SkZMRTFCUVUwM1J5eFZRVUZWV0N4TlFVRk5UeXhMUVVGTFJTeExRVUZMYlVNc1IwRkJSMjlITEZsQlFXRXZSaXhGUVVGUE9VSXNSMEZETlVaV0xFdEJRVXR6VFN4alFVRmpjRXNzVDBGRGJrSnJTeXhGUVVGUmNFMHNTMEZCU3paTUxGVkJSVmh1UWl4RlFVRlhNRUlzUlVGQlRYWk5MRWRCUTJwQ1J5eExRVUZMT0V3c2EwSkJRV3RDYWswc1IwRkJUMGNzUzBGQlN5dEtMRkZCUVZFdlNpeExRVUZMYzAwc1kwRkJZM3BMTEU5QlFWRm9ReXhGUVVGTkxGTkJRVlVyU0N4SFFVTndSaXhQUVVGUExGTkJRVk12U0N4RlFVRkxOa3NzUjBGRGJrSXNUMEZCVHl4WFFVTk1MRTlCUVU5QkxFVkJRVk5sTEZOQlFWTTNSQ3hGUVVGTk1FVXNZMEZCWTNwTExFOUJRVTlvUXl4TlFVaHBRaXhEUVUxNFJVY3NUVUZCVDBZc1MwRkJTMFVzUzBGQlRVZ3NSVUZCU3paTExFMUJTMmhEY2tJc1JVRkJhVUp1U2l4VlFVRlZjMGNzVDBGQlV5eFhRVU5zUXl4SlFVRkpNMGNzUlVGQlpXMUhMRVZCUVU5RExFVkJRVTlETEVWQlJXcERMRWxCUVV0eVJ5eExRVVJNYlVjc1JVRkJVV2hITEV0QlFVczRUQ3hyUWtGRlFUbEdMRVZCUVUxdVJ5eEhRVU5TZDB3c1dVRkhXQ3hKUVVGTGVFd3NTMEZFVEc5SExFVkJRVkZxUnl4TFFVRkxOa3dzVlVGRlFUVkdMRVZCUVUxd1J5eEhRVU5TZDB3c1dVRkZXQ3hQUVVGMVF5eFBRVUV2UW01R0xFVkJRVkZzUnl4TFFVRkxjMDBzWlVGQmVVSndSeXhGUVVGTlRTeFBRVUZQTVVjc1MwRkJTMFVzVjBGQlVTeEhRVWR1UlhGS0xFVkJNMGxwUWl4RFFUWkpka0o2U3l4RlFVRlBORXNzVTBGRlZqVkxMRVZCUVU4eVRpeFpRVUZqTEZOQlFWVmlMRWRCUnpkQ0xGTkJRVk5oTEVWQlFWa3pTeXhGUVVGTlR5eEZRVUZKYVVNc1JVRkJUVThzUlVGQlUycEZMRWRCUXpWRFZpeExRVUZMTkVJc1MwRkJUMEVzUlVGRFdqVkNMRXRCUVV0dFF5eEhRVUZMUVN4RlFVTldia01zUzBGQlMyOUZMRXRCUVU5QkxFVkJRMXB3UlN4TFFVRkxNa1VzVVVGQlZVRXNSVUZEWmpORkxFdEJRVXRWTEZGQlFYRkNMRTFCUVZoQkxFVkJRV3RDUVN4RlFVRlZMRWRCUXpORFZpeExRVUZMZFVjc1MwRkJUM1JJTEVWQlFVOWxMRXRCUVV0MVJ5eExRVUZOZGtjc1RVRkRPVUpCTEV0QlFVdGxMRmRCUVdGbUxFdEJRVXRWTEZGQlFWRkxMRmxCUVdNc1IwRkROME5tTEV0QlFVdHhTQ3hoUVVGbExFZEJRM0JDY2tnc1MwRkJTMmxMTEcxQ1FVRnhRaXhIUVdFMVFpeFBRWGhDUVhaTExFVkJRVlUyVFN4RlFVRmhZaXhIUVdOMlFtRXNSVUZCV1hKTkxGVkJRVlY1U1N4UFFVRlRMRU5CUXpkQ01FSXNVVUZCVXl4VFFVRlRia1FzUlVGQlRXcEdMRWRCUTNSQ0xFOUJRVTlwUml4RlFVRkxNMFVzUzBGQlowSXNUVUZCVkU0c1JVRkJaMEpCTEVWQlFWRXNTMEZKTDBOelN5eEZRVUZaY2swc1ZVRkJWWEZITEV0QlFVOHNWMEZETTBJc1QwRkJUMmRITEVWQlFWbHdUU3hWUVVGVmIwY3NTMEZCUzI1SUxFMUJRVTFaTEV0QlFVMVlMRmxCUjNwRGEwNHNSVUY2UWxrc1EwRXlRbXhDTTA0c1JVRkJUelJMTEZOQlJWWTFTeXhGUVVGbExFOUJRVVZwUXl4UlFVRlJjVVVzUzBGQlR5eFRRVUZUTDBNc1JVRkJTVVlzUjBGRE0wTXNUMEZCYzBJc1RVRkJiRUpGTEVWQlFVZHhTeXhaUVVORmNrc3NSVUZCUjNGTExGbEJRWFZDTEUxQlFWUjJTeXhGUVVGblFrRXNSVUZCVVN4SFFVVjZRMFVzUlVGQlIzTkxMRlZCUVhGQ0xFMUJRVlI0U3l4RlFVRm5Ra0VzUlVGQlVTeEpRVWxzUkhKRUxFVkJRV1VzVDBGQlJXbERMRkZCUVZFMlRDeExRVUZQTEZOQlFWTjJTeXhGUVVGSlJpeEhRVU16UXl4UFFVRlBSU3hGUVVGSFlTeFZRVUZ4UWl4TlFVRlVaaXhGUVVGblFrRXNSVUZCVVN4SlFVZG9SSEpFTEVWQlFXVXNUMEZCUldsRExGRkJRVkU0VEN4TFFVRlBMRk5CUVZONFN5eEZRVUZKUml4SFFVTXpReXhQUVVGUFJTeEZRVUZIZVVzc1RVRkJUVU1zVVVGQlZUVkxMRVZCUVZFc1IwRkJTeXhSUVVkNlEzSkVMRVZCUVdVc1QwRkJSV2xETEZGQlFWRnBUU3hMUVVGUExGTkJRVk16U3l4RlFVRkpSaXhIUVVNelF5eFBRVUZQUlN4RlFVRkhlVXNzVFVGQlRVTXNVVUZCVlRWTExFVkJRVkVzVDBGQlV5eEpRVWMzUTNKRUxFVkJRV1VzVDBGQlJXbERMRkZCUVZGclRTeFJRVUZWTEZOQlFWTTFTeXhGUVVGSlJpeEhRVU01UXl4UFFVRlBSU3hGUVVGSE5rc3NWVUZCV1M5TExFZEJSM2hDY2tRc1JVRkJaU3hQUVVGRmFVTXNVVUZCVVcxTkxGTkJRVmNzVTBGQlV6ZExMRVZCUVVsR0xFZEJReTlETEU5QlFVOUZMRVZCUVVjMlN5eFhRVUZoTDBzc1IwRkhla0p5UkN4RlFVRmxMRTlCUVVWcFF5eFJRVUZSZDBRc1VVRkJWU3hEUVVOcVEybEdMRmRCUVZjc1JVRkRXRllzVTBGQlZTeEpRVU5XTVVjc1MwRkJUU3hUUVVGVFF5eEhRVU5pTEU5QlFVOTJSQ3hGUVVGUGRVVXNTMEZCUzBNc1ZVRkJWV3BDTEVWQlFVa3NVMEZCVlc1RExFdEJRVXR6Unl4VlFVVnNSRVVzVDBGQlVTeFRRVUZUY2tVc1IwRkRaaXhQUVVGUGRrUXNSVUZCVDNWRkxFdEJRVXRITEZsQlFWbHVRaXhGUVVGSkxGTkJRVlZ1UXl4TFFVRkxjMGNzVlVGRmNFUXJSQ3hSUVVGVExGTkJRVk5zU1N4RlFVRkpSaXhIUVVOd1FpeEpRVUZKSzBRc1JVRkRTaXhOUVVGblFpeFZRVUZhTjBRc1JVRkJSMmxETEV0QlEwVnFReXhGUVVGSGEwTXNVMEZCYVVNc1QwRkJja0l5UWl4RlFVRlJOMFFzUlVGQlIwWXNUMEZCYVVJclJDeEZRVUZOYVVnc1owSkJRV0VzVFVGQmMwSXNUVUZCVkdoTUxFVkJRV2RDUVN4RlFVRk5aMHdzWjBKQlFXRXNSMEZGT1VjNVN5eEZRVUZIYTBNc1ZVRkJXWEJETEVsQlN6VkNja1FzUlVGQlpTeFBRVUZGYVVNc1VVRkJVWEZOTEZWQlFWa3NRMEZEYmtNMVJDeFhRVUZYTEVWQlExaFdMRk5CUVZVc1NVRkRWakZITEV0QlFVMHNVMEZCVTBNc1IwRkRZaXhQUVVGUGRrUXNSVUZCVDNWRkxFdEJRVXRETEZWQlFWVnFRaXhGUVVGSkxGTkJRVlZ1UXl4TFFVRkxjMGNzVlVGRmJFUkZMRTlCUVZFc1UwRkJVM0pGTEVkQlEyWXNUMEZCVDNaRUxFVkJRVTkxUlN4TFFVRkxSeXhaUVVGWmJrSXNSVUZCU1N4VFFVRlZia01zUzBGQlMzTkhMRlZCUlhCRUswUXNVVUZCVXl4VFFVRlRiRWtzUlVGQlNVWXNSMEZEY0VJc1NVRkJTU3RFTEVWQlEwb3NUVUZCWjBJc1ZVRkJXamRFTEVWQlFVZHBReXhMUVVORmFrTXNSVUZCUjJ0RExGTkJRV2xETEU5QlFYSkNNa0lzUlVGQlVUZEVMRVZCUVVkR0xFOUJRV2xDSzBRc1JVRkJUV2xJTEdkQ1FVRmhMRTFCUVhOQ0xFMUJRVlJvVEN4RlFVRm5Ra0VzUlVGQlRXZE1MR2RDUVVGaExFZEJSVGxIT1Vzc1JVRkJSMnRETEZOQlFWZHdReXhKUVVzelFuSkVMRVZCUVdVc1QwRkJSV2xETEZGQlFWRnZRaXhOUVVGUkxFTkJReTlDY1Vnc1YwRkJWeXhGUVVOWVZpeFRRVUZWTEVsQlExWXhSeXhMUVVGTkxGTkJRVk5ETEVkQlEySXNSMEZCY1VJc1ZVRkJaa0VzUlVGQlIyZE1MRk5CUVcxRExGVkJRVnBvVEN4RlFVRkhhVU1zUzBGRmFrTXNUMEZFUVhCRkxFdEJRVXR4UkN4TlFVRjFRaXhYUVVGbWJFSXNSVUZCUjJkTUxGRkJRWFZDTEZOQlFWY3NVVUZETTBOMlR5eEZRVUZQZFVVc1MwRkJTME1zVlVGQlZXcENMRVZCUVVsdVF5eExRVUZMY1VRc1RVRkJUM0pFTEV0QlFVdHpSeXhWUVVkMFJFVXNUMEZCVVN4VFFVRlRja1VzUjBGRFppeEhRVUZ4UWl4VlFVRm1RU3hGUVVGSFowd3NVMEZCYlVNc1ZVRkJXbWhNTEVWQlFVZHBReXhMUVVOcVF5eFBRVUZQZUVZc1JVRkJUM1ZGTEV0QlFVdEhMRmxCUVZsdVFpeEZRVUZKYmtNc1MwRkJTM0ZFTEUxQlFVOXlSQ3hMUVVGTGMwY3NWVUZIZUVRclJDeFJRVUZUTEZOQlFWTnNTU3hGUVVGSlJpeEhRVU53UWl4SlFVRkpLMElzUlVGQlIwTXNSVUZCU1VNc1JVRkJUVGhDTEVWQlFVOURMRVZCUVU5RExFVkJRVTh2UWl4RlFVTjBReXhIUVVGdFFpeFZRVUZtYUVNc1JVRkJSMmRNTEZOQlFXMURMRlZCUVZwb1RDeEZRVUZIYVVNc1MwRkRMMElzVDBGQlQycERMRVZCUVVkcFRDeGhRVUZoTEZGQlFWTnVUQ3hIUVVNelFpeEhRVUZ4UWl4TlFVRnFRbWxDTEU5QlFVOXdSU3hSUVVWb1FpeEhRVVJCY1VRc1JVRkJTM0pFTEVWQlFVOXhSQ3hKUVVORkxFMUJRVlJHTEVWQlFXZENRU3hGUVVGTlowd3NaMEpCUVdFc1RVRkJiVU1zVDBGQmNrSnFTQ3hGUVVGUk4wUXNSVUZCUjNkQ0xFOUJRV2xDY1VNc1JVRkJUV2xJTEdkQ1FVRmhMRWRCUTI1SExFOUJRVTg1U3l4RlFVRkhkMElzU1VGQllTeE5RVUZVTVVJc1JVRkJaMEpCTEVWQlFWRXNVMEZIZUVNc1IwRkJaMElzYjBKQlFWcEZMRVZCUVVkcFF5eE5RVU5NTEVkQlFXRXNUVUZCVkc1RExFVkJRV1VzUTBGRmFrSXNTVUZFUVd0RExFVkJRVmNzUjBGRFRrWXNSVUZCU3l4RlFVRkhReXhGUVVGUEwwSXNSVUZCUnpGQ0xFOUJRVkYzUkN4RlFVRkxReXhGUVVGTlJDeEpRVU40UTBRc1JVRkJTVGRDTEVWQlFVYzRRaXhIUVVOUVJTeEZRVUZUU1N4TFFVRkxVQ3hGUVVGRlRTeFZRVUZaTWtJc1JVRkJVV3BETEVWQlFVVXZRaXhOUVVGUE4wSXNSVUZCVlU0c1MwRkJTMjFETEVWQlFVOW5SU3hKUVVGVkxFbEJSUzlGTEU5QlFVODVRaXhSUVVWS0xFbEJRV01zVFVGQlZHeERMRVZCUVdkQ1FTeEZRVUZOWjB3c1owSkJRV0VzVFVGQmJVTXNUMEZCY2tJdlJ5eEZRVUZSTDBRc1JVRkJSMFlzVDBGQmFVSnBSU3hGUVVGTkswY3NaMEpCUVdFc1IwRkRNVWNzVDBGQlR6bExMRVZCUVVkR0xFMUJRV2xDTEUxQlFWUkJMRVZCUVdkQ1FTeEZRVUZSTEV0QlRXeEVja1FzUlVGQlpTeFBRVUZGYVVNc1VVRkJXU3hIUVVGSkxFTkJReTlDWjBnc1QwRkJUeXhGUVVOUVpTeFRRVUZWTEVsQlExWXhSeXhMUVVGTkxGTkJRVk5ETEVkQlEySXNTVUZCU1hOQ0xFVkJRVTB3UkN4RlFVTldMRWRCUVcxQ0xFMUJRV1p1U0N4TFFVRkxjVTRzVDBGUFVDeFBRVTVCTlVvc1JVRkJUeXhEUVVGRGVrUXNTMEZCU3pSQ0xFdEJRVXRZTEU5QlFWRnFRaXhMUVVGTGIwVXNUVUZCVFd0S0xFdEJRVXNzUzBGQlMzQkZMRkZCUVZFc1MwRkJUU3hMUVVNM1JDOUNMRVZCUVdOb1JpeEZRVUZIYjB3c1lVRkJZVGxLTEVkQlF6bENla1FzUzBGQlMzRk9MRTlCUVZNelN5eFRRVUZUT0Vzc1kwRkJZeXhaUVVGamVFNHNTMEZCUzI5RkxFdEJRVThzU1VGQlRTdERMRVZCUVdNc1MwRkRia1p1U0N4TFFVRkxjVTBzVDBGQlVTeEZRVU5pYkVzc1JVRkJSM05NTEdkQ1FVRm5RbWhMTEVkQlEyNUNkRUlzUlVGQlIybEhMRmRCUVZkRExHRkJRV0Z5U1N4TFFVRkxjVTRzVDBGQlVXeE1MRWRCUTJwRFFTeEZRVUZIYVVjc1YwRkJWM1JHTEZsQlFWbFlMRWxCUjNKRGNVVXNUMEZCVVN4WFFVTk9MRWRCUVVsNFJ5eExRVUZMTUU0c1QwRkZVQ3hQUVVSQk1VNHNTMEZCU3pCT0xFOUJRVTlzU0N4VFFVTk1lRWNzUzBGQlMzRk5MRTlCUVZFc1IwRkhlRUpvUXl4UlFVRlRMRk5CUVZOc1NTeEZRVUZKUml4SFFVTndRaXhKUVVGSmNFTXNSVUZCU3pCS0xFVkJRVTh4U0N4RlFVRlJiVVVzUlVGRGVFSXNTMEZCVFM5RUxFbEJRVmRxUXl4TFFVRkxjVTBzVFVGQlR5eERRVU16UWl4SFFVRkpjRXNzUlVGQlR5eERRVWRVTEVsQlFVdHdReXhMUVVaTVowTXNSVUZCVXl4SFFVTlViVVVzUlVGQlVXaEhMRXRCUVVzMFFpeExRVUZMUXl4UFFVVm9RakJJTEVWQlFWRjJSQ3hGUVVGTmJrY3NSMEZEWkdkRExFVkJRVTlvUXl4SFFVRlBNRW9zUlVGSmFFSXNUMEZHUTNaS0xFdEJRVXN3VGl4VFFVRlhNVTRzUzBGQlN6Qk9MRTlCUVZNc1NVRkJTVGxQTEVWQlFVOTNSQ3hMUVVGTFJDeEZRVUZKVGl4RlFVRlJOMElzUzBGQlN6UkNMRXRCUVV0c1FpeGhRVUZoZDBJc1QwRkRiRVpzUXl4TFFVRkxjVTRzVDBGQlQycEdMRmRCUVZkRExHRkJRV0ZzUnl4RlFVRkpia01zUzBGQlMzRk9MRTlCUVU5TkxHRkJRemRETTA0c1MwRkJTM0ZOTEU5QlFWRXNSVUZKY0VJc1QwRkdRV3hMTEVWQlFVZHBSeXhYUVVGWGRFWXNXVUZCV1Znc1IwRkRNVUp1UXl4TFFVRkxNRTRzVDBGQlQyeElMRk5CUTB4NFJ5eExRVUZMY1Uwc1QwRkJVU3hKUVVreFFtaEhMRTlCUVZFc1UwRkJVM2hGTEVkQlEyWXNTVUZCU1cxRkxFVkJRMG9zVDBGQlowTXNUMEZCZUVKQkxFVkJRVkZvUnl4TFFVRkxNRTRzVVVGQmEwSXhTQ3hGUVVGTlN5eFBRVUZQZUVVc1VVRkJWU3hKUVVsc1JXcEVMRVZCUVdVc1QwRkJSV2xETEZGQlFWRXJUU3hQUVVGVExFTkJRMmhETDBZc1QwRkJUeXhGUVVOUVpTeFRRVUZWTEVsQlExWXhSeXhMUVVGTkxGTkJRVk5ETEVkQlEySXNUMEZCVDNaRUxFVkJRV1VzVDBGQlJXbERMRkZCUVZrc1IwRkJSWEZDTEV0QlFVdHdReXhMUVVGTFJTeExRVUZOYlVNc1NVRkZlRVJ4UlN4UFFVRlJMRmRCUTA0c1QwRkJUelZJTEVWQlFXVXNUMEZCUldsRExGRkJRVmtzUjBGQlJUSkdMRTlCUVU4eFJ5eExRVUZMUlN4UFFVVndSSEZMTEZGQlFWTXNVMEZCVTJ4SkxFVkJRVWxHTEVkQlEzQkNMRTlCUVU5eVJDeEZRVUZsTEU5QlFVVnBReXhSUVVGWkxFZEJRVVYzU2l4UlFVRlJka3NzUzBGQlMwVXNTMEZCVFcxRExFZEJRVXRHTEVsQlJXaEZiMFVzVDBGQlVTeFRRVUZUZUVVc1IwRkRaaXhQUVVGUGFrUXNSVUZCWlN4UFFVRkZhVU1zVVVGQldTeEhRVUZGZDBZc1QwRkJUM1pITEV0QlFVdEZMRXRCUVUwMlFpeExRVWsxUkdwRUxFVkJRV1VzVDBGQlJXbERMRkZCUVZFc1VVRkJWU3hEUVVOcVEyZE9MRlZCUVZrc1JVRkRXbXBHTEZOQlFWVXNTVUZEVm5CRExFOUJRVkVzVTBGQlUzSkZMRWRCUTJZc1IwRkJTVzVETEV0QlFVdDNRaXhSUVVOUUxFOUJRVTgxUXl4RlFVRlBkVVVzUzBGQlMwY3NXVUZCV1c1Q0xFVkJRVWx1UXl4TFFVRkxhMHNzUzBGQlN5eEhRVUZKYkVzc1MwRkJTM2RDTEZWQlJ6RkVOa2tzVVVGQlV5eFRRVUZUYkVrc1JVRkJTVVlzUjBGSmNFSXNUMEZJU1dwRExFdEJRVXQzUWl4VFFVTlFOVU1zUlVGQlQzVkZMRXRCUVV0SExGbEJRVmx1UWl4RlFVRkpia01zUzBGQlMydExMRXRCUVVzc1IwRkJTV3hMTEV0QlFVdDNRaXhUUVVVeFF6VkRMRVZCUVU5MVJTeExRVUZMUXl4VlFVRlZha0lzUlVGQlNXNURMRXRCUVV0clN5eExRVUZMTEVkQlFVbHNTeXhMUVVGTGQwSXNVVUZCVlhoQ0xFdEJRVXN5U2l4aFFVRmhNVWdzVFVGSmNFWnlSQ3hGUVVGbExFOUJRVVZwUXl4UlFVRlJMRlZCUVZrc1EwRkRia05uU0N4UFFVRlBMRVZCUTFCbExGTkJRVlVzU1VGRFZqRkhMRXRCUVUwc1UwRkJVME1zUjBGRFlpeEpRVUZKYzBJc1JVRkJXVkVzUlVGQlNVTXNSVUZCVFRoQ0xFVkJRekZDTEVkQlFXMUNMRTFCUVdab1J5eExRVUZMY1U0c1QwRkRVRFZLTEVWQlFVOHNRMEZCUTNwRUxFdEJRVXMwUWl4TFFVRkxXQ3hQUVVGUmFrSXNTMEZCUzI5RkxFMUJRVTFyU2l4TFFVRkxMRXRCUVV0d1JTeFJRVUZSTEV0QlFVMHNTMEZETjBSc1NpeExRVUZMY1U0c1QwRkJVek5MTEZOQlFWTTRTeXhqUVVGakxGbEJRV040VGl4TFFVRkxiMFVzUzBGQlR5eExRVU12UkhCRkxFdEJRVXM0VGl4VFFVRlhMRWRCUTJoQ00wd3NSVUZCUjNOTUxHZENRVUZuUW1oTExFZEJRMjVDZEVJc1JVRkJSMmxITEZkQlFWZERMR0ZCUVdGeVNTeExRVUZMY1U0c1QwRkJVV3hNTEVkQlEzaERRU3hGUVVGSGFVY3NWMEZCVjNSR0xGbEJRVmxZTEZGQlJ6RkNMRWxCUVVzNFFpeEZRVUZMTEVWQlFVZERMRWRCUkdJNFFpeEZRVUZSYUVjc1MwRkJTemhPTEZWQlEyRnlUaXhQUVVGUmQwUXNSVUZCUzBNc1JVRkJUVVFzU1VGRGNFTXJRaXhGUVVGTkwwSXNSMEZEVWk5Q0xGRkJTVmh6UlN4UFFVRlJMRk5CUVZOeVJTeEhRVU5tTEVsQlFWVTRRaXhGUVVGSlF5eEZRVUZOT0VJc1JVRkRjRUlzUjBGQmNVSXNUVUZCYWtKb1J5eExRVUZMT0U0c1UwRkZVQ3hKUVVGTE4wb3NSVUZCU3l4RlFVRkhReXhIUVVSaU9FSXNSVUZCVVdoSExFdEJRVXM0VGl4VlFVTmhjazRzVDBGQlVYZEVMRVZCUVV0RExFVkJRVTFFTEVsQlEzQkRLMElzUlVGQlRTOUNMRWRCUTFKMVF5eFZRVWxZTmtRc1VVRkJVeXhUUVVGVGJFa3NSVUZCU1RSTUxFZEJRM0JDTEVsQlFVbHdUU3hGUVVGVFdTeEZRVUZUTmtNc1JVRkJUM1pHTEVWQlFVc3dTaXhGUVVGUGFFa3NSVUZCVjJJc1JVRkJVM05PTEVWQlFWVjJUQ3hGUVVGVllpeEZRVUZOY1VNc1JVRkJTVFpDTEVWQlFVbDNReXhGUVVGSmNFVXNSVUZCVFRaQ0xFVkJRVTlyU1N4RlFVRlBha2tzUlVGQlQwTXNSVUZCVDBNc1JVRkhja2tzUjBGR1FUTkZMRVZCUVZsMlFpeExRVUZMYTBzc1MwRkJTeXhIUVVOMFFqWkVMRVZCUVdGQkxFZEJRV01zUjBGRGRrSXZUaXhMUVVGTE9FNHNVMEZCVTNKT0xFOUJRVk56VGl4RlFVRlhkRTRzVDBGRmNFTXNTVUZCUzNkRUxFVkJRVXNzUlVGQlIwTXNSMEZFWWpoQ0xFVkJRVkZsTEUxQlFVMHZSeXhMUVVGTE9FNHNVMEZCVTNKT0xFOUJRVk56VGl4RlFVRlhkRTRzVTBGRGRFSkJMRTlCUVZGM1JDeEZRVUZMUXl4RlFVRk5SQ3hKUVVOMlF5dENMRVZCUVUwdlFpeEpRVU5XY2tNc1JVRkJUelZDTEV0QlFVczRUaXhUUVVGVFNTeFBRVU5vUWpGSUxGTkJRMHg0Unl4TFFVRkxjVTRzVDBGQlQycEdMRmRCUVZkMFJpeFpRVUZaYkVJc1JVRkJTemhFTEVsQlFVa3NTVUZIYUVRc1NVRkJTMDRzUlVGQlVWVXNSVUZCU3l4RlFVRkhReXhGUVVGUlowa3NSVUZCVjNST0xFOUJRVkZ4Uml4RlFVRkxReXhGUVVGUFdDeEpRVUZWVlN4RlFVOXdSU3hIUVU1QmVVUXNSVUZCVVhkRkxFVkJRVmN6U1N4SlFVTnVRamRETEVWQlFVOHNRMEZEVERaRExFMUJRVTlCTEVsQlJVcDRSeXhGUVVGbExFOUJRVVV3UXl4bFFVRmxReXhKUVVGak5rUXNSVUZEYmtRM1F5eEZRVUZMYUVJc1IwRkJZV2RKTEVWQlExVXNUVUZCZUVKMlNpeExRVUZMT0U0c1UwRkJVekZKTEVkQlFXZENMRU5CUldoRExFbEJRVXQyUml4TFFVUk1iMGNzUlVGQlVXcEhMRXRCUVVzMFFpeExRVUZMUXl4UFFVVm9RakJJTEVWQlFWRjBSQ3hGUVVGTmNFY3NSMEZEUnl4TlFVRmlNRU1zUlVGQlN6RkRMRXRCUTFBd1F5eEZRVUZMTVVNc1IwRkJUekJLTEVkQlIyaENlVVVzUlVGQlYyaFBMRXRCUVVzNFRpeFRRVUZUY2s0c1QwRkJVMVFzUzBGQlN6aE9MRk5CUVZNNVRpeExRVUZMT0U0c1UwRkJVM0pPTEU5QlFWTXNSMEZCUjJsR0xFbEJRVWtzUjBGQlN6RkdMRXRCUVV0eFRpeFJRVU40UmpOTkxFVkJRVlZXTEV0QlFVczBRaXhMUVVGTGJFSXNWMEZEV2xVc1lVRkJZeXhGUVVOMFFuRkNMRVZCUVZkT0xFVkJRVWRuVFN4WFFVRlZMRWxCUTNoQ2RrMHNSVUZCVHl4SlFVRkphRVFzUlVGQlQzZEVMRXRCUVV0TExFVkJRVlZHTEVWQlFVMDNRaXhKUVVOc1EzZENMRTlCUTB4c1F5eExRVUZMT0U0c1UwRkJVM1pLTEV0QlFVc3pReXhIUVVOdVFqVkNMRXRCUVV0eFRpeFBRVUZQYWtZc1YwRkJWME1zWVVGQllUVkdMRVZCUVZWMVRDeEZRVUZUVEN4clFrRkRPVU16VGl4TFFVRkxPRTRzVTBGQlV6RkpMRWRCUVU5MlJDeFBRVUZQVGl4TFFVRmxaMGtzUjBGRGNFUjJTaXhMUVVGTE9FNHNVMEZCVXpGSkxFZEJRVTlwUWl4UFFVRlBPVVFzUjBGSGFFTXNSMEZCYjBJc1YwRkJhRUpLTEVWQlFVYzJSeXhUUVVWTUxFbEJRVXRXTEVWQlFVc3NSVUZCUnpKR0xFZEJSR0l2U0N4RlFVRlJiRWNzUzBGQlN6UkNMRXRCUVVzclJpeFZRVU5UYkVnc1QwRkJVVFpJTEVWQlFVc3lSaXhGUVVGUE0wWXNTMEZETjBNelJ5eEZRVUZWZFVVc1JVRkJUVzlETEVsQlEwcHVSeXhMUVVGUGJrTXNTMEZCUzNGT0xFOUJRVTlxUml4WlFVRXJRaXhWUVVGcVFucEhMRVZCUVZGNVF5eE5RVU51UkhwRExFVkJRVkUwUlN4UlFVdG9Ra1lzVDBGQlVTeFRRVUZUZUVVc1IwRkRaaXhKUVVGSlZTeEZRVUZOTVVNc1JVRkJTekJLTEVWQlFXRjBSaXhGUVVGSlF5eEZRVUZOT0VJc1JVRkZkRU1zU1VGQlMyNUhMRXRCUkV3d1F5eEZRVUZQTEVkQlEwdFdMRVZCUTFZd1NDeEZRVUZSTVVnc1JVRkJUMmhETEVkQlExaEJMRWxCUVZGSExFdEJRVXRyU3l4TFFVRkxMRXRCUTNCQ00wZ3NSVUZCU3pGRExFZEJRVTh3U2l4SFFVbG9RaXhKUVVGTGRFWXNSVUZCU3l4RlFVRkhReXhIUVVSaU9FSXNSVUZCVVdoSExFdEJRVXM0VGl4VlFVTmhjazRzVDBGQlVYZEVMRVZCUVV0RExFVkJRVTFFTEVsQlEzQkRLMElzUlVGQlRTOUNMRWRCUTFKdlF5eFBRVUZQT1VRc1MwRkxiRUl6UkN4RlFVRmxMRTlCUVVWcFF5eFJRVUZSTEZkQlFXRXNVMEZCVTNOQ0xFVkJRVWxHTEVkQlEycEVMRWxCUVVsdFRTeEZRVVZLTEVsQlFVdHVUU3hMUVVFd1JDeExRVVF2UkcxTkxFVkJRVlVzU1VGQlRXcE5MRVZCUVVkclRTeFZRVUZaTEV0QlExQm9UeXhSUVVGUkxFbEJRVTFNTEV0QlFVdHJTeXhMUVVGTExFZEJRVXNzVFVGRGJrUXNUMEZCVHk5SUxFVkJRVWRyVFN4VlFVRlpjRTBzUlVGQllVVXNSVUZCUjJ0TkxGVkJRVmtzU1VGQlRYSlBMRXRCUVV0clN5eExRVUZMTEVkQlFVdHJSU3hGUVVGUmJFWXNVVUZCVVN4SlFVRk5iRW9zUzBGQlMydExMRXRCUVVzc1IwRkJTeXhKUVVGTExFdEJRVXQ2UlN4UlFVa3hTRGRITEVWQlFXVXNUMEZCUldsRExGRkJRVkVzUzBGQlR5eFRRVUZUYzBJc1JVRkJTVVlzUjBGRE0wTXNUMEZCWVN4TlFVRlVRU3hGUVVOTFJTeEZRVUZIYVV3c1lVRkJZWEJPTEV0QlFVdHZSU3hMUVVGTmJrTXNSMEZGTTBKRkxFVkJRVWR6VEN4blFrRkJaMEo2VGl4TFFVRkxiMFVzVDBGSmJrTjRSaXhGUVVGbExFOUJRVVZ0UXl4WFFVRnBRaXhMUVVGSkxGZEJRM0JETEVsQlFVbHRTaXhGUVVGTmFra3NSVUZGVml4UFFVUkJRU3hGUVVGUk5VTXNWVUZCVlN4SFFVRkpOa3NzUlVGQlR5eEhRVUZMTjBzc1ZVRkJWVzlDTEU5QlFWTnVRaXhGUVVGUlVTeExRVUZMVkN4VlFVRlhMRWRCUVVzc1IwRkRNMFUwUXl4RlFVRk5ia01zUzBGQlMxWXNUVUZCVFRaRExFVkJRVThzUTBGQlEycERMRTFCUVUxblNDeFBRVUZQTVVnc1JVRkJVVkVzUzBGQlMyOUxMRTFCUnpWRWRFd3NSVUZCWlN4UFFVRkZiME1zVTBGQlV5eExRVUZQTEVOQlF5OUNhMHNzUjBGQlNTeE5RVU5LYjBRc1VVRkJVeXhGUVVOVVF5eFJRVUZUTEVkQlExUkRMR05CUVdVc1UwRkJVMnhGTEVkQlEzUkNMRWxCUVVsWkxFVkJRVWx5Uml4RlFVRlBORWtzUlVGUFppeFBRVTVMYmtVc1JVRkJTVGRMTEdWQlFXVlBMRXRCUVV0clRDeE5RVU16UWtFc1JVRkJTMnhNTEV0QlFVdHpUeXhWUVVOV1NTeFBRVUZQUXl4bFFVRmxja1VzUlVGQlMzUkxMRXRCUVV0clRDeEhRVUZKTEVOQlEyeERha29zVFVGQlQybEtMRTFCUjBoeVJpeEZRVUZSTjBZc1MwRkJTM1ZQTEZOQlFWTkZMRVZCUVZGdVJTeEZRVUZKZEVzc1MwRkJTMnRNTEU5QlFWTnlSaXhGUVVGTk5Fa3NSMEZCVXl4RFFVTnlSVWNzVlVGQlZ5eE5RVWRtUXl4eFFrRkJjMElzVTBGQlUwTXNSVUZCU3pWRUxFZEJRMnhETEV0QlFVdDNSQ3hQUVVGUFN5eExRVUZMUkN4RlFVRkpSaXhYUVVGWGJrOHNVVUZEZUVKeFR5eEZRVUZKUlN4VlFVRlpUaXhQUVVGUFN5eExRVUZMUkN4RlFVRkpSU3hWUVVGVmRrOHNVVUZET1VNc1kwRkJZMVFzUzBGQlMzVlBMRkZCUVZGeVJDeEpRVWxxUXl0RUxHRkJRV01zVTBGQlV6TkZMRVZCUVV0d1RDeEhRVU14UWl4SlFVRkpaMUVzUlVGQlMwTXNSVUZCVlZvc1JVRkpia0lzVDBGSVFWa3NSVUZCVnpkRkxFVkJRVWx3VEN4SFFVTm1aMUVzUlVGQlRXeFFMRXRCUVV0M1R5eGpRVUZqYkVVc1IwRkRla0pwUlN4RlFVRlZkazhzUzBGQlMzVlBMRkZCUTFKcVJTeEZRVUZKY0V3c1IwRkJUU3hYUVVObUxFbEJRV041Unl4RlFVRkhlVW9zUlVGQlIwTXNSVUZCVlhCTUxFVkJRVWxETEVWQlFVMDRRaXhGUVVGUFF5eEZRVUZQUXl4RlFVRlBReXhGUVVjM1JDeEpRVUZMYVVvc1MwRkdURU1zUlVGQlYwWXNSVUZCVXk5UUxFMUJRVTFyVEN4RlFVRkxha3dzVjBGREwwSXlSeXhGUVVGUmEwb3NSVUZCU1VZc1UwRkpWaXhKUVVaQmNrb3NSVUZCU1Vzc1JVRkJUVzlLTEVkQlJVeHVUQ3hGUVVGTExFVkJRVWRETEVkQlJHSnBReXhGUVVGblJpeFBRVUYyUlVZc1JVRkJaME1zVDBGQmRrSkRMRVZCUVZGeFNTeEZRVUZSWVN4SlFVRmpiRW9zUlVGQlRUQkpMRlZCUVZWcVNpeFJRVUZMTEVkQlFXdENUU3hGUVVGUkxFbEJRM0pGZUVZc1QwRkJVWGRFTEVWQlFVdERMRVZCUVUxRUxFdEJRek5EYzBjc1JVRkJWM0JGTEVWQlFVMXNReXhOUVVseVFpeFBRVUZQYjB3c1NVRkhXRU1zYVVKQlFXdENMRk5CUVZOb1JpeEZRVUZMZDBVc1JVRkJTMjVMTEVkQlEyNURMRWxCUVVsNlJpeEZRVUZKY1ZFc1JVRkJWMHdzUlVGQlMzSktMRVZCUVU4MVFpeEZRVUZKUXl4RlFVTnVReXhIUVVGSk5rTXNUVUZCVFhsSkxGRkJRVkZzUml4SFFVRk5MRU5CUlhSQ0xFZEJRVzlDTEU5QlJIQkNORVVzUlVGQlRXeFFMRXRCUVV0M1R5eGpRVUZqYkVVc1NVRkRha0l3UlN4VFFVZE9MRWxCUmtGRkxFVkJRVWxHTEZOQlFWY3NSMEZGVmk5TExFVkJRVXNzUlVGQlIwTXNSMEZFWW5GTUxFVkJRVmtzUTBGQlF5eFBRVUZSTEUxQlFVOHNVVUZCVXl4VlFVRlhMRTlCUVZFc1ZVRkJWeXhYUVVOeVF6bFBMRTlCUVZGM1JDeEZRVUZMUXl4RlFVRk5SQ3hKUVVNdlF5OUZMRVZCUVV0eFVTeEZRVUZWZEV3c1IwRkRabXBGTEV0QlFVdHBVQ3hoUVVGaE0wVXNSVUZCUzNCTUxFZEJUVE5DTEVkQlNHMURMRTlCUVRsQ01rY3NSVUZCVVhGS0xFVkJRVWxHTEZWQlFWVkdMRXRCUTNwQ2Frb3NSVUZCVFdsS0xFZEJRVThzU1VGRldERlBMRVZCUVZWT0xFdEJRVXR2VUN4RlFVRkpSaXhUUVVGVFJpeEhRVUZOYmtzc1IwRkJWeXhGUVVNdlF5eFBRVUZQZFVzc1JVRkJTVVlzVTBGQlUwWXNSMEZCUzNaTExFdEJRVXRKTEV0QlNYQkRPRXNzYlVKQlFXOUNMRk5CUVZOdVJpeEZRVUZMZDBVc1JVRkJTMjVMTEVkQlEzSkRMRWxCUVVrclN5eEZRVUZMVWl4RlFVRkxSaXhGUVVOa0xFZEJRVWxxU1N4TlFVRk5lVWtzVVVGQlVXeEdMRWxCUVhsQ0xFMUJRV2hDUVN4RlFVRkpkRXNzUzBGQlMydE1MRTFCUXpsQ1owVXNSVUZCVFd4UUxFdEJRVXQxVHl4UlFVRlJha1VzUlVGQlNYUkxMRXRCUVV0clRDeFJRVU14UWpoRUxFVkJRVmRGTEVWQlFVbEdMRk5CUVZOR0xFbEJUekZDTEU5QlRrdFpMRVZCUVUxV0xFVkJRVk16VHl4UlFVRlJjMFVzUzBGQllTeEhRVU4yUTNGTExFVkJRVk5YTEU5QlFVOUVMRVZCUVVzc1IwRkZiRUpXTEVWQlFWTjJUeXhsUVVOTWVVOHNSVUZCU1VZc1UwRkJVMFlzUjBGRlpqbFBMRXRCUVVzMlR5eHhRa0ZCY1VKTExFVkJRVXMxUlN4RlFVRkpkRXNzUzBGQlMydE1MRTFCUzNaRWJrSXNVVUZCVXl4VFFVRlRUeXhGUVVGTE0wWXNSVUZCVXpSR0xFZEJRemxDTEVsQlFVbHhSU3hGUVVGWFowSXNSVUZCVFROT0xFVkJXVUV5Uml4RlFUUkNja0lzVDBGMFF6QkNMRTlCUkRGQ1owZ3NSVUZCV1RWUExFdEJRVXQzVHl4alFVRmpiRVVzUjBGQlMzTkZMRmRCUTNSQ2Frc3NTMEZEV21sTExFVkJRVlZxU3l4SFFVRlhMRWxCUlU0c1QwRkVabWxNTEVWQlFVOXNRaXhQUVVGUGJVSXNlVUpCUVhsQ2RrWXNSVUZCU3pOR0xFbEJRM1JDYVV3c1JVRkJTMFVzVTBGQlRTeExRVUZ2UWl4TlFVRlNSaXhGUVVGbFFTeEZRVUZMYkVjc1UwRkJUU3hMUVVOeVJYcElMRVZCUVZGeFNTeEZRVUZKTTBZc1IwRkRXaXRLTEU5QlFVOURMR1ZCUVdWeVJTeEZRVUZMTTBZc1JVRkJVeXhEUVVOc1EyOU1MRmxCUVZrc1JVRkRXa1FzU1VGQlN5eFhRVU5JTEU5QlFVODNUaXhIUVVWVWVVZ3NTMEZCWlRsQ0xFVkJjVUphTlVnc1MwRndRazBzVTBGQlUyZFJMRWRCUTJRc1NVRkJTVU1zUlVGQlNXWXNSVUZCUzJwTUxFVkJRVWxETEVWQlFVMDRRaXhGUVVOMlFpeEhRVUZKWjBzc1NVRkJZUzlPTEVsQlEyWXlSaXhGUVVGTk5rZ3NiVUpCUVcxQ2VFNHNSVUZCVDNGSkxFVkJRVWt4UXl4RlFVRk5jMFFzU1VGQlMzWkhMRWRCUXk5RE1VTXNSVUZCVVN0T0xFVkJRMHBrTEVWQlFVMTBTQ3hGUVVGTk1rY3NVVUZCVVdwRkxFVkJRVWt4UXl4RlFVRk5jMFFzVFVGQlRTeERRVVYwUXl4SlFVUkJNRVFzUlVGQldVMHNSVUZCU1U0c1YwRkRSbXBMTEVkQlJWb3NTVUZCUzFZc1JVRkJTeXhGUVVGSFF5eEhRVVJpT0VJc1JVRkJVVFJKTEVWQlFWVnFTeXhIUVVGVGNFWXNVMEZEUkd0Q0xFOUJRVkYzUkN4RlFVRkxReXhGUVVGTlJDeEpRVU16UTJkTkxFVkJRVXRxU3l4RlFVRk5MMElzUjBGRFVEZEVMRVZCUVZWT0xFdEJRVXM0VHl4RlFVRlZha3NzUjBGQlZYTk1MRWxCUVU4c1IwRkROVU5CTEVsQlNVNHNUMEZCVDNKSkxFVkJRVTB3U0N4cFFrRkJhVUpWTEVWQlFWVXhSaXhGUVVGSk1VTXNSVUZCVFhORUxFbEJRVXQyUnl4VlFWRnFSWFpGTEVWQlFWVk9MRXRCUVVzNFR5eEZRVUZWYWtzc1IwRkJWVFJHTEVkQlFWa3NSMEZEYWtSeFJTeEZRVUZWYWtzc1IwRkJVMG9zUzBGQlMyZEhMRWRCUlc1Q2Rrc3NTMEZCUzNOUUxHbENRVUZwUW1oR0xFVkJRVWt6Uml4SFFVRlZNa1lzUlVGQlNYUkxMRXRCUVV0clRDeEpRVUZMZGtjc1NVRkZNMFF3Unl4VlFVRlhMRk5CUVZObUxFVkJRVXN6Uml4RlFVRlRORVlzUjBGRGFFTXNTVUZCU1hGRkxFVkJRVmRqTEVWQlFVdFNMRVZCUTNCQ0xFbEJRVWxCTEVWQlFVMXNVQ3hMUVVGTGRVOHNVVUZCVVdwRkxFVkJRVWwwU3l4TFFVRkxhMHdzVVVGRE1VSXdSQ3hGUVVGWlRTeEZRVUZKVGl4VlFVRlZha3NzU1VGUk5VSXNUMEZRU3l0TExFVkJRVTFrTEVWQlFWVjJUeXhSUVVGUmEwc3NTMEZCWXl4SlFVTjZRM0ZGTEVWQlFWVmxMRTlCUVU5RUxFVkJRVXNzUjBGRGFrSmtMRVZCUVZWdVR5eG5Ra0ZEVG5sUExFVkJRVWxPTEZWQlFWVnFTeXhIUVVOeVFqTkZMRXRCUVV0NVVDeHRRa0ZCYlVKdVJpeEZRVUZKTTBZc1IwRkJWVEpHTEVWQlFVbDBTeXhMUVVGTGEwd3NTVUZCUzNaSExFdEJSMnBFTTBVc1MwRkJTelpQTEhGQ1FVRnhRa3NzUlVGQlN6VkZMRVZCUVVsMFN5eExRVUZMYTB3c1RVRkpja1EwUlN4SlFVRkxMRk5CUVZONFJpeEZRVUZMTTBZc1IwRkRha0lzVDBGQlR6SkdMRVZCUVVrelJpeEpRVVZpSzBVc1NVRkJTeXhUUVVGVFdTeEZRVUZMTTBZc1JVRkJVekZETEVkQlF6RkNMRTlCUVU5eFNTeEZRVUZKTTBZc1IwRkJWekZETEVsQlNURkNja1FzUlVGQlQzTlNMRkZCUVZVc1UwRkJVekZHTEVkQlIzaENMRTlCUmtFMVRDeEZRVUZQTkV3c1YwRkJZVUVzUlVGRGNFSTFUQ3hGUVVGbExFOUJRVVYxVWl4RlFVRkpkbElzUlVGRFpFRXNSVUZCWlN4UlFVZHZSU3hwUWtGQk9VUXNiMEpCUVZoM1VpeFJRVUZ4UXl4UFFVRllRU3hQUVVGclFrRXNUMEZCVDBNc1lVRkJWU3hIUVVNNVJVUXNUMEZCVDBNc1VVRkJWWHBTTEVWQlFVOXpVaXhSUVVGUlNTeFJRVUZSTEdWQlEySXNiVUpCUVZoRExGRkJRWGxDUVN4UFFVRlBReXhKUVVOb1JFUXNUMEZCVHl4RFFVRkRMR05CUVdVc1UwRkJVeTlHTEVkQlF6bENMRTlCUVU5NFN5eExRVUZMZVZFc1QwRkJVemRTTEVWQlFVOXpVaXhSUVVGUk1VWXNTMEZIZEVONFN5eExRVUZMZVZFc1QwRkJVemRTTEVWQlFVOXpVaXhSUVVGUk1VWXNZMEZIT1VJeFN5eExRVUZMUlNJc0ltWnBiR1VpT2lKRk9seGNkMjl5YTNOd1lXTmxYRnh3WVc1MGIyMWhkR2d0WTJoaGRHSnZkRnhjYm05a1pWOXRiMlIxYkdWelhGeHlhWFpsZEhOY1hHUnBjM1JjWEhKcGRtVjBjeTVxY3lKOSIsIihmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxzLGksaCl7cmV0dXJuIG5ldyBlKHQscyxpLGgpfWZ1bmN0aW9uIGUodCxlLGksaCl7dGhpcy5vcHRpb25zPWh8fHt9LHRoaXMub3B0aW9ucy5hZGFwdGVycz10aGlzLm9wdGlvbnMuYWRhcHRlcnN8fHt9LHRoaXMub2JqPXQsdGhpcy5rZXlwYXRoPWUsdGhpcy5jYWxsYmFjaz1pLHRoaXMub2JqZWN0UGF0aD1bXSx0aGlzLnVwZGF0ZT10aGlzLnVwZGF0ZS5iaW5kKHRoaXMpLHRoaXMucGFyc2UoKSxzKHRoaXMudGFyZ2V0PXRoaXMucmVhbGl6ZSgpKSYmdGhpcy5zZXQoITAsdGhpcy5rZXksdGhpcy50YXJnZXQsdGhpcy5jYWxsYmFjayl9ZnVuY3Rpb24gcyh0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdCYmbnVsbCE9PXR9ZnVuY3Rpb24gaSh0KXt0aHJvdyBuZXcgRXJyb3IoXCJbc2lnaHRnbGFzc10gXCIrdCl9dC5hZGFwdGVycz17fSxlLnRva2VuaXplPWZ1bmN0aW9uKHQsZSxzKXt2YXIgaSxoLGE9W10sbz17aTpzLHBhdGg6XCJcIn07Zm9yKGk9MDtpPHQubGVuZ3RoO2krKyloPXQuY2hhckF0KGkpLH5lLmluZGV4T2YoaCk/KGEucHVzaChvKSxvPXtpOmgscGF0aDpcIlwifSk6by5wYXRoKz1oO3JldHVybiBhLnB1c2gobyksYX0sZS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oKXt2YXIgcyxoLGE9dGhpcy5pbnRlcmZhY2VzKCk7YS5sZW5ndGh8fGkoXCJNdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgYWRhcHRlciBpbnRlcmZhY2UuXCIpLH5hLmluZGV4T2YodGhpcy5rZXlwYXRoWzBdKT8ocz10aGlzLmtleXBhdGhbMF0saD10aGlzLmtleXBhdGguc3Vic3RyKDEpKToodm9pZCAwPT09KHM9dGhpcy5vcHRpb25zLnJvb3R8fHQucm9vdCkmJmkoXCJNdXN0IGRlZmluZSBhIGRlZmF1bHQgcm9vdCBhZGFwdGVyLlwiKSxoPXRoaXMua2V5cGF0aCksdGhpcy50b2tlbnM9ZS50b2tlbml6ZShoLGEscyksdGhpcy5rZXk9dGhpcy50b2tlbnMucG9wKCl9LGUucHJvdG90eXBlLnJlYWxpemU9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMub2JqLGk9ITE7cmV0dXJuIHRoaXMudG9rZW5zLmZvckVhY2goZnVuY3Rpb24oaCxhKXtzKGUpPyh2b2lkIDAhPT10aGlzLm9iamVjdFBhdGhbYV0/ZSE9PSh0PXRoaXMub2JqZWN0UGF0aFthXSkmJih0aGlzLnNldCghMSxoLHQsdGhpcy51cGRhdGUpLHRoaXMuc2V0KCEwLGgsZSx0aGlzLnVwZGF0ZSksdGhpcy5vYmplY3RQYXRoW2FdPWUpOih0aGlzLnNldCghMCxoLGUsdGhpcy51cGRhdGUpLHRoaXMub2JqZWN0UGF0aFthXT1lKSxlPXRoaXMuZ2V0KGgsZSkpOighMT09PWkmJihpPWEpLCh0PXRoaXMub2JqZWN0UGF0aFthXSkmJnRoaXMuc2V0KCExLGgsdCx0aGlzLnVwZGF0ZSkpfSx0aGlzKSwhMSE9PWkmJnRoaXMub2JqZWN0UGF0aC5zcGxpY2UoaSksZX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIHQsZTsodD10aGlzLnJlYWxpemUoKSkhPT10aGlzLnRhcmdldCYmKHModGhpcy50YXJnZXQpJiZ0aGlzLnNldCghMSx0aGlzLmtleSx0aGlzLnRhcmdldCx0aGlzLmNhbGxiYWNrKSxzKHQpJiZ0aGlzLnNldCghMCx0aGlzLmtleSx0LHRoaXMuY2FsbGJhY2spLGU9dGhpcy52YWx1ZSgpLHRoaXMudGFyZ2V0PXQsKHRoaXMudmFsdWUoKWluc3RhbmNlb2YgRnVuY3Rpb258fHRoaXMudmFsdWUoKSE9PWUpJiZ0aGlzLmNhbGxiYWNrKCkpfSxlLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbigpe2lmKHModGhpcy50YXJnZXQpKXJldHVybiB0aGlzLmdldCh0aGlzLmtleSx0aGlzLnRhcmdldCl9LGUucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKHQpe3ModGhpcy50YXJnZXQpJiZ0aGlzLmFkYXB0ZXIodGhpcy5rZXkpLnNldCh0aGlzLnRhcmdldCx0aGlzLmtleS5wYXRoLHQpfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5hZGFwdGVyKHQpLmdldChlLHQucGF0aCl9LGUucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUscyxpKXt2YXIgaD10P1wib2JzZXJ2ZVwiOlwidW5vYnNlcnZlXCI7dGhpcy5hZGFwdGVyKGUpW2hdKHMsZS5wYXRoLGkpfSxlLnByb3RvdHlwZS5pbnRlcmZhY2VzPWZ1bmN0aW9uKCl7dmFyIGU9T2JqZWN0LmtleXModGhpcy5vcHRpb25zLmFkYXB0ZXJzKTtyZXR1cm4gT2JqZWN0LmtleXModC5hZGFwdGVycykuZm9yRWFjaChmdW5jdGlvbih0KXt+ZS5pbmRleE9mKHQpfHxlLnB1c2godCl9KSxlfSxlLnByb3RvdHlwZS5hZGFwdGVyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9wdGlvbnMuYWRhcHRlcnNbZS5pXXx8dC5hZGFwdGVyc1tlLmldfSxlLnByb3RvdHlwZS51bm9ic2VydmU9ZnVuY3Rpb24oKXt2YXIgdDt0aGlzLnRva2Vucy5mb3JFYWNoKGZ1bmN0aW9uKGUscyl7KHQ9dGhpcy5vYmplY3RQYXRoW3NdKSYmdGhpcy5zZXQoITEsZSx0LHRoaXMudXBkYXRlKX0sdGhpcykscyh0aGlzLnRhcmdldCkmJnRoaXMuc2V0KCExLHRoaXMua2V5LHRoaXMudGFyZ2V0LHRoaXMuY2FsbGJhY2spfSxcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz10OlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaWdodGdsYXNzPXR9KTp0aGlzLnNpZ2h0Z2xhc3M9dH0pLmNhbGwodGhpcyk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbWx1WkdWNExtcHpJbDBzSW01aGJXVnpJanBiSW5OcFoyaDBaMnhoYzNNaUxDSnZZbW9pTENKclpYbHdZWFJvSWl3aVkyRnNiR0poWTJzaUxDSnZjSFJwYjI1eklpd2lUMkp6WlhKMlpYSWlMQ0owYUdseklpd2lZV1JoY0hSbGNuTWlMQ0p2WW1wbFkzUlFZWFJvSWl3aWRYQmtZWFJsSWl3aVltbHVaQ0lzSW5CaGNuTmxJaXdpYVhOUFltcGxZM1FpTENKMFlYSm5aWFFpTENKeVpXRnNhWHBsSWl3aWMyVjBJaXdpYTJWNUlpd2laWEp5YjNJaUxDSnRaWE56WVdkbElpd2lSWEp5YjNJaUxDSjBiMnRsYm1sNlpTSXNJbWx1ZEdWeVptRmpaWE1pTENKeWIyOTBJaXdpYVc1a1pYZ2lMQ0pqYUhJaUxDSjBiMnRsYm5NaUxDSmpkWEp5Wlc1MElpd2lhU0lzSW5CaGRHZ2lMQ0pzWlc1bmRHZ2lMQ0pqYUdGeVFYUWlMQ0pwYm1SbGVFOW1JaXdpY0hWemFDSXNJbkJ5YjNSdmRIbHdaU0lzSW5OMVluTjBjaUlzSW5CdmNDSXNJbkJ5WlhZaUxDSjFibkpsWVdOb1pXUWlMQ0ptYjNKRllXTm9JaXdpZEc5clpXNGlMQ0puWlhRaUxDSnpjR3hwWTJVaUxDSnVaWGgwSWl3aWIyeGtWbUZzZFdVaUxDSjJZV3gxWlNJc0lrWjFibU4wYVc5dUlpd2ljMlYwVm1Gc2RXVWlMQ0poWkdGd2RHVnlJaXdpWVdOMGFYWmxJaXdpWVdOMGFXOXVJaXdpVDJKcVpXTjBJaXdpYTJWNWN5SXNJblZ1YjJKelpYSjJaU0lzSW0xdlpIVnNaU0lzSW1WNGNHOXlkSE1pTENKa1pXWnBibVVpTENKaGJXUWlMQ0pqWVd4c0lsMHNJbTFoY0hCcGJtZHpJam9pUTBGQlFTeFhRVVZGTEZOQlFWTkJMRVZCUVZkRExFVkJRVXRETEVWQlFWTkRMRVZCUVZWRExFZEJRekZETEU5QlFVOHNTVUZCU1VNc1JVRkJVMG9zUlVGQlMwTXNSVUZCVTBNc1JVRkJWVU1zUjBGUE9VTXNVMEZCVTBNc1JVRkJVMG9zUlVGQlMwTXNSVUZCVTBNc1JVRkJWVU1zUjBGRGVFTkZMRXRCUVV0R0xGRkJRVlZCTEVkQlFWY3NSMEZETVVKRkxFdEJRVXRHTEZGQlFWRkhMRk5CUVZkRUxFdEJRVXRHTEZGQlFWRkhMRlZCUVZrc1IwRkRha1JFTEV0QlFVdE1MRWxCUVUxQkxFVkJRMWhMTEV0QlFVdEtMRkZCUVZWQkxFVkJRMlpKTEV0QlFVdElMRk5CUVZkQkxFVkJRMmhDUnl4TFFVRkxSU3hYUVVGaExFZEJRMnhDUml4TFFVRkxSeXhQUVVGVFNDeExRVUZMUnl4UFFVRlBReXhMUVVGTFNpeE5RVU12UWtFc1MwRkJTMHNzVVVGRlJFTXNSVUZCVTA0c1MwRkJTMDhzVDBGQlUxQXNTMEZCUzFFc1dVRkRPVUpTTEV0QlFVdFRMRXRCUVVrc1JVRkJUVlFzUzBGQlMxVXNTVUZCUzFZc1MwRkJTMDhzVDBGQlVWQXNTMEZCUzBnc1ZVRTJTeTlETEZOQlFWTlRMRVZCUVZOWUxFZEJRMmhDTEUxQlFYTkNMR2xDUVVGU1FTeEhRVUUwUWl4UFFVRlNRU3hGUVVsd1F5eFRRVUZUWjBJc1JVRkJUVU1zUjBGRFlpeE5RVUZOTEVsQlFVbERMRTFCUVUwc1owSkJRV3RDUkN4SFFXcE5jRU5zUWl4RlFVRlhUeXhUUVVGWExFZEJiMEowUWtZc1JVRkJVMlVzVTBGQlZ5eFRRVUZUYkVJc1JVRkJVMjFDTEVWQlFWbERMRWRCUTJoRUxFbEJSVWxETEVWQlFVOURMRVZCUmxCRExFVkJRVk1zUjBGRFZFTXNSVUZCVlN4RFFVRkRReXhGUVVGSFRDeEZRVUZOVFN4TFFVRk5MRWxCUnpsQ0xFbEJRVXRNTEVWQlFWRXNSVUZCUjBFc1JVRkJVWEpDTEVWQlFWRXlRaXhQUVVGUlRpeEpRVU4wUTBNc1JVRkJUWFJDTEVWQlFWRTBRaXhQUVVGUFVDeEpRVVZrUml4RlFVRlhWU3hSUVVGUlVDeEpRVU40UWtNc1JVRkJUMDhzUzBGQlMwNHNSMEZEV2tFc1JVRkJWU3hEUVVGRFF5eEZRVUZIU0N4RlFVRkxTU3hMUVVGTkxFdEJSWHBDUml4RlFVRlJSU3hOUVVGUlNpeEZRVXR3UWl4UFFVUkJReXhGUVVGUFR5eExRVUZMVGl4SFFVTk1SQ3hIUVV0VWNFSXNSVUZCVXpSQ0xGVkJRVlYwUWl4TlFVRlJMRmRCUTNwQ0xFbEJRMGxYTEVWQlFVMU5MRVZCUkU1UUxFVkJRV0ZtTEV0QlFVdGxMR0ZCUjJwQ1FTeEZRVUZYVVN4UlFVTmtXaXhGUVVGTkxHZEVRVWRFU1N4RlFVRlhWU3hSUVVGUmVrSXNTMEZCUzBvc1VVRkJVU3hMUVVOeVEyOUNMRVZCUVU5b1FpeExRVUZMU2l4UlFVRlJMRWRCUTNCQ01FSXNSVUZCVDNSQ0xFdEJRVXRLTEZGQlFWRm5ReXhQUVVGUExGVkJSV3RETEV0QlFXcEVXaXhGUVVGUGFFSXNTMEZCUzBZc1VVRkJVV3RDTEUxQlFWRjBRaXhGUVVGWGMwSXNUMEZEYWtSTUxFVkJRVTBzZFVOQlIxSlhMRVZCUVU5MFFpeExRVUZMU2l4VFFVZGtTU3hMUVVGTGJVSXNUMEZCVTNCQ0xFVkJRVk5sTEZOQlFWTlJMRVZCUVUxUUxFVkJRVmxETEVkQlEyeEVhRUlzUzBGQlMxVXNTVUZCVFZZc1MwRkJTMjFDTEU5QlFVOVZMRTlCUzNwQ09VSXNSVUZCVXpSQ0xGVkJRVlZ1UWl4UlFVRlZMRmRCUXpOQ0xFbEJSVWx6UWl4RlFVWkJWaXhGUVVGVmNFSXNTMEZCUzB3c1NVRkRabTlETEVkQlFWa3NSVUZuUTJoQ0xFOUJOMEpCTDBJc1MwRkJTMjFDTEU5QlFVOWhMRkZCUVZFc1UwRkJVME1zUlVGQlQyaENMRWRCUXpsQ1dDeEZRVUZUWXl4VFFVTXlRaXhKUVVFelFuQkNMRXRCUVV0RkxGZEJRVmRsTEVkQlEzSkNSeXhMUVVGaFZTeEZRVUZQT1VJc1MwRkJTMFVzVjBGQlYyVXNUVUZEZEVOcVFpeExRVUZMVXl4TFFVRkpMRVZCUVU5M1FpeEZRVUZQU0N4RlFVRk5PVUlzUzBGQlMwY3NVVUZEYkVOSUxFdEJRVXRUTEV0QlFVa3NSVUZCVFhkQ0xFVkJRVTlpTEVWQlFWTndRaXhMUVVGTFJ5eFJRVU53UTBnc1MwRkJTMFVzVjBGQlYyVXNSMEZCVTBjc1NVRkhNMEp3UWl4TFFVRkxVeXhMUVVGSkxFVkJRVTEzUWl4RlFVRlBZaXhGUVVGVGNFSXNTMEZCUzBjc1VVRkRjRU5JTEV0QlFVdEZMRmRCUVZkbExFZEJRVk5ITEVkQlJ6TkNRU3hGUVVGVmNFSXNTMEZCUzJ0RExFbEJRVWxFTEVWQlFVOWlMRTFCUlZJc1NVRkJaRmNzU1VGRFJrRXNSVUZCV1dRc1NVRkhWbUVzUlVGQlR6bENMRXRCUVV0RkxGZEJRVmRsTEV0QlEzcENha0lzUzBGQlMxTXNTMEZCU1N4RlFVRlBkMElzUlVGQlQwZ3NSVUZCVFRsQ0xFdEJRVXRITEZWQlIzSkRTQ3hQUVVWbExFbEJRV1FyUWl4SFFVTkdMMElzUzBGQlMwVXNWMEZCVjJsRExFOUJRVTlLTEVkQlIyeENXQ3hIUVVsVWNrSXNSVUZCVXpSQ0xGVkJRVlY0UWl4UFFVRlRMRmRCUXpGQ0xFbEJRVWxwUXl4RlFVRk5ReXhIUVVWTVJDeEZRVUZQY0VNc1MwRkJTMUVzWVVGQlpWSXNTMEZCUzA4c1UwRkRMMEpFTEVWQlFWTk9MRXRCUVV0UExGTkJRMmhDVUN4TFFVRkxVeXhMUVVGSkxFVkJRVTlVTEV0QlFVdFZMRWxCUVV0V0xFdEJRVXRQTEU5QlFWRlFMRXRCUVV0SUxGVkJSekZEVXl4RlFVRlRPRUlzU1VGRFdIQkRMRXRCUVV0VExFdEJRVWtzUlVGQlRWUXNTMEZCUzFVc1NVRkJTekJDTEVWQlFVMXdReXhMUVVGTFNDeFZRVWQwUTNkRExFVkJRVmR5UXl4TFFVRkxjME1zVVVGRGFFSjBReXhMUVVGTFR5eFBRVUZUTmtJc1IwRkhWbkJETEV0QlFVdHpReXhyUWtGQmJVSkRMRlZCUVZsMlF5eExRVUZMYzBNc1ZVRkJXVVFzU1VGQlZYSkRMRXRCUVV0SUxHRkJUVFZGUlN4RlFVRlRORUlzVlVGQlZWY3NUVUZCVVN4WFFVTjZRaXhIUVVGSmFFTXNSVUZCVTA0c1MwRkJTMDhzVVVGRGFFSXNUMEZCVDFBc1MwRkJTMnRETEVsQlFVbHNReXhMUVVGTFZTeEpRVUZMVml4TFFVRkxUeXhUUVUxdVExSXNSVUZCVXpSQ0xGVkJRVlZoTEZOQlFWY3NVMEZCVTBZc1IwRkRha05vUXl4RlFVRlRUaXhMUVVGTFR5eFRRVU5vUWxBc1MwRkJTM2xETEZGQlFWRjZReXhMUVVGTFZTeExRVUZMUkN4SlFVRkpWQ3hMUVVGTFR5eFBRVUZSVUN4TFFVRkxWU3hKUVVGSldTeExRVUZOWjBJc1NVRkxNMFIyUXl4RlFVRlRORUlzVlVGQlZVOHNTVUZCVFN4VFFVRlRlRUlzUlVGQlMyWXNSMEZEY2tNc1QwRkJUMHNzUzBGQlMzbERMRkZCUVZFdlFpeEhRVUZMZDBJc1NVRkJTWFpETEVWQlFVdGxMRVZCUVVsWkxFOUJTWGhEZGtJc1JVRkJVelJDTEZWQlFWVnNRaXhKUVVGTkxGTkJRVk5wUXl4RlFVRlJhRU1zUlVGQlMyWXNSVUZCUzBVc1IwRkRiRVFzU1VGQlNUaERMRVZCUVZORUxFVkJRVk1zVlVGQldTeFpRVU5zUXpGRExFdEJRVXQ1UXl4UlFVRlJMMElzUjBGQlMybERMRWRCUVZGb1JDeEZRVUZMWlN4RlFVRkpXU3hMUVVGTmVrSXNTVUZKTTBORkxFVkJRVk0wUWl4VlFVRlZXaXhYUVVGaExGZEJRemxDTEVsQlFVbEJMRVZCUVdFMlFpeFBRVUZQUXl4TFFVRkxOME1zUzBGQlMwWXNVVUZCVVVjc1ZVRlJNVU1zVDBGT1FUSkRMRTlCUVU5RExFdEJRVXR1UkN4RlFVRlhUeXhWUVVGVkswSXNVVUZCVVN4VFFVRlRXQ3hKUVVNeFEwNHNSVUZCVjFVc1VVRkJVVW9zU1VGRGRrSk9MRVZCUVZkWExFdEJRVXRNTEV0QlNXSk9MRWRCU1ZSb1FpeEZRVUZUTkVJc1ZVRkJWV01zVVVGQlZTeFRRVUZUTDBJc1IwRkRjRU1zVDBGQlQxWXNTMEZCUzBZc1VVRkJVVWNzVTBGQlUxTXNSVUZCU1Zjc1NVRkRMMEl6UWl4RlFVRlhUeXhUUVVGVFV5eEZRVUZKVnl4SlFVazFRblJDTEVWQlFWTTBRaXhWUVVGVmJVSXNWVUZCV1N4WFFVTTNRaXhKUVVGSmJrUXNSVUZGU2tzc1MwRkJTMjFDTEU5QlFVOWhMRkZCUVZFc1UwRkJVME1zUlVGQlQyaENMRWxCUXpsQ2RFSXNSVUZCVFVzc1MwRkJTMFVzVjBGQlYyVXNTMEZEZUVKcVFpeExRVUZMVXl4TFFVRkpMRVZCUVU5M1FpeEZRVUZQZEVNc1JVRkJTMHNzUzBGQlMwY3NVMEZGYkVOSUxFMUJSVU5OTEVWQlFWTk9MRXRCUVV0UExGTkJRMmhDVUN4TFFVRkxVeXhMUVVGSkxFVkJRVTlVTEV0QlFVdFZMRWxCUVV0V0xFdEJRVXRQTEU5QlFWRlFMRXRCUVV0SUxGZEJaVEZDTEc5Q1FVRllhMFFzVVVGQk1FSkJMRTlCUVU5RExGRkJRekZEUkN4UFFVRlBReXhSUVVGVmRFUXNSVUZEVlN4dFFrRkJXSFZFTEZGQlFYbENRU3hQUVVGUFF5eEpRVU5vUkVRc1QwRkJUeXhIUVVGSkxGZEJRMVFzVDBGQlQycEVMRXRCUVV0T0xGZEJRV0ZCTEVsQlJ6TkNUU3hMUVVGTFRpeFhRVUZoUVN4SlFVVnVRbmxFTEV0QlFVdHVSQ0lzSW1acGJHVWlPaUpGT2x4Y1YyOXlhM053WVdObFhGeDNhV3RwWVMxcGN5MWhibk4zWlhKbFpGeGNibTlrWlY5dGIyUjFiR1Z6WEZ4emFXZG9kR2RzWVhOelhGeHBibVJsZUM1cWN5SjkiLCJmdW5jdGlvbiBBZ2VudCgpe3RoaXMuX2RlZmF1bHRzPVtdfVtcInVzZVwiLFwib25cIixcIm9uY2VcIixcInNldFwiLFwicXVlcnlcIixcInR5cGVcIixcImFjY2VwdFwiLFwiYXV0aFwiLFwid2l0aENyZWRlbnRpYWxzXCIsXCJzb3J0UXVlcnlcIixcInJldHJ5XCIsXCJva1wiLFwicmVkaXJlY3RzXCIsXCJ0aW1lb3V0XCIsXCJidWZmZXJcIixcInNlcmlhbGl6ZVwiLFwicGFyc2VcIixcImNhXCIsXCJrZXlcIixcInBmeFwiLFwiY2VydFwiXS5mb3JFYWNoKHQ9PntBZ2VudC5wcm90b3R5cGVbdF09ZnVuY3Rpb24oLi4uZSl7cmV0dXJuIHRoaXMuX2RlZmF1bHRzLnB1c2goe2ZuOnQsYXJnczplfSksdGhpc319KSxBZ2VudC5wcm90b3R5cGUuX3NldERlZmF1bHRzPWZ1bmN0aW9uKHQpe3RoaXMuX2RlZmF1bHRzLmZvckVhY2goZT0+e3RbZS5mbl0uYXBwbHkodCxlLmFyZ3MpfSl9LG1vZHVsZS5leHBvcnRzPUFnZW50O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW1GblpXNTBMV0poYzJVdWFuTWlYU3dpYm1GdFpYTWlPbHNpUVdkbGJuUWlMQ0owYUdseklpd2lYMlJsWm1GMWJIUnpJaXdpWm05eVJXRmphQ0lzSW1adUlpd2ljSEp2ZEc5MGVYQmxJaXdpWVhKbmN5SXNJbkIxYzJnaUxDSmZjMlYwUkdWbVlYVnNkSE1pTENKeVpYRWlMQ0prWldZaUxDSmhjSEJzZVNJc0ltMXZaSFZzWlNJc0ltVjRjRzl5ZEhNaVhTd2liV0Z3Y0dsdVozTWlPaUpCUVVGQkxGTkJRVk5CTEZGQlExQkRMRXRCUVV0RExGVkJRVmtzUjBGSGJrSXNRMEZCUXl4TlFVRlBMRXRCUVUwc1QwRkJVU3hOUVVGUExGRkJRVk1zVDBGQlVTeFRRVUZWTEU5QlFWRXNhMEpCUVcxQ0xGbEJRV0VzVVVGQlV5eExRVUZOTEZsQlF6bEhMRlZCUVZjc1UwRkJWU3haUVVGaExGRkJRVk1zUzBGQlRTeE5RVUZQTEUxQlFVOHNVVUZCVVVNc1VVRkJVVU1zU1VGRk9VVktMRTFCUVUxTExGVkJRVlZFTEVkQlFVMHNXVUZCV1VVc1IwRkZhRU1zVDBGRVFVd3NTMEZCUzBNc1ZVRkJWVXNzUzBGQlN5eERRVUZEU0N4SFFVRkJRU3hGUVVGSlJTeExRVUZCUVN4SlFVTnNRa3dzVVVGSldFUXNUVUZCVFVzc1ZVRkJWVWNzWVVGQlpTeFRRVUZUUXl4SFFVTndRMUlzUzBGQlMwTXNWVUZCVlVNc1VVRkJVVThzU1VGRGNrSkVMRVZCUVVsRExFVkJRVWxPTEVsQlFVbFBMRTFCUVUxR0xFVkJRVXRETEVWQlFVbEtMRk5CU1dwRFRTeFBRVUZQUXl4UlFVRlZZaUlzSW1acGJHVWlPaUpGT2x4Y1YyOXlhM053WVdObFhGeDNhV3RwWVMxcGN5MWhibk4zWlhKbFpGeGNibTlrWlY5dGIyUjFiR1Z6WEZ4emRYQmxjbUZuWlc1MFhGeHNhV0pjWEdGblpXNTBMV0poYzJVdWFuTWlmUT09IiwibGV0IHJvb3Q7XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz9yb290PXdpbmRvdzpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9yb290PXNlbGY6KGNvbnNvbGUud2FybihcIlVzaW5nIGJyb3dzZXItb25seSB2ZXJzaW9uIG9mIHN1cGVyYWdlbnQgaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRcIikscm9vdD10aGlzKTtjb25zdCBFbWl0dGVyPXJlcXVpcmUoXCJjb21wb25lbnQtZW1pdHRlclwiKSxSZXF1ZXN0QmFzZT1yZXF1aXJlKFwiLi9yZXF1ZXN0LWJhc2VcIiksaXNPYmplY3Q9cmVxdWlyZShcIi4vaXMtb2JqZWN0XCIpLFJlc3BvbnNlQmFzZT1yZXF1aXJlKFwiLi9yZXNwb25zZS1iYXNlXCIpLEFnZW50PXJlcXVpcmUoXCIuL2FnZW50LWJhc2VcIik7ZnVuY3Rpb24gbm9vcCgpe31jb25zdCByZXF1ZXN0PWV4cG9ydHM9bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0P25ldyBleHBvcnRzLlJlcXVlc3QoXCJHRVRcIixlKS5lbmQodCk6MT09YXJndW1lbnRzLmxlbmd0aD9uZXcgZXhwb3J0cy5SZXF1ZXN0KFwiR0VUXCIsZSk6bmV3IGV4cG9ydHMuUmVxdWVzdChlLHQpfTtleHBvcnRzLlJlcXVlc3Q9UmVxdWVzdCxyZXF1ZXN0LmdldFhIUj0oKCk9PntpZighKCFyb290LlhNTEh0dHBSZXF1ZXN0fHxyb290LmxvY2F0aW9uJiZcImZpbGU6XCI9PXJvb3QubG9jYXRpb24ucHJvdG9jb2wmJnJvb3QuQWN0aXZlWE9iamVjdCkpcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdDt0cnl7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KFwiTWljcm9zb2Z0LlhNTEhUVFBcIil9Y2F0Y2goZSl7fXRyeXtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoXCJNc3htbDIuWE1MSFRUUC42LjBcIil9Y2F0Y2goZSl7fXRyeXtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoXCJNc3htbDIuWE1MSFRUUC4zLjBcIil9Y2F0Y2goZSl7fXRyeXtyZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoXCJNc3htbDIuWE1MSFRUUFwiKX1jYXRjaChlKXt9dGhyb3cgRXJyb3IoXCJCcm93c2VyLW9ubHkgdmVyc2lvbiBvZiBzdXBlcmFnZW50IGNvdWxkIG5vdCBmaW5kIFhIUlwiKX0pO2NvbnN0IHRyaW09XCJcIi50cmltP2U9PmUudHJpbSgpOmU9PmUucmVwbGFjZSgvKF5cXHMqfFxccyokKS9nLFwiXCIpO2Z1bmN0aW9uIHNlcmlhbGl6ZShlKXtpZighaXNPYmplY3QoZSkpcmV0dXJuIGU7Y29uc3QgdD1bXTtmb3IoY29uc3QgcyBpbiBlKXB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyKHQscyxlW3NdKTtyZXR1cm4gdC5qb2luKFwiJlwiKX1mdW5jdGlvbiBwdXNoRW5jb2RlZEtleVZhbHVlUGFpcihlLHQscyl7aWYobnVsbCE9cylpZihBcnJheS5pc0FycmF5KHMpKXMuZm9yRWFjaChzPT57cHVzaEVuY29kZWRLZXlWYWx1ZVBhaXIoZSx0LHMpfSk7ZWxzZSBpZihpc09iamVjdChzKSlmb3IoY29uc3QgciBpbiBzKXB1c2hFbmNvZGVkS2V5VmFsdWVQYWlyKGUsYCR7dH1bJHtyfV1gLHNbcl0pO2Vsc2UgZS5wdXNoKGVuY29kZVVSSUNvbXBvbmVudCh0KStcIj1cIitlbmNvZGVVUklDb21wb25lbnQocykpO2Vsc2UgbnVsbD09PXMmJmUucHVzaChlbmNvZGVVUklDb21wb25lbnQodCkpfWZ1bmN0aW9uIHBhcnNlU3RyaW5nKGUpe2NvbnN0IHQ9e30scz1lLnNwbGl0KFwiJlwiKTtsZXQgcixvO2ZvcihsZXQgZT0wLG49cy5sZW5ndGg7ZTxuOysrZSktMT09KG89KHI9c1tlXSkuaW5kZXhPZihcIj1cIikpP3RbZGVjb2RlVVJJQ29tcG9uZW50KHIpXT1cIlwiOnRbZGVjb2RlVVJJQ29tcG9uZW50KHIuc2xpY2UoMCxvKSldPWRlY29kZVVSSUNvbXBvbmVudChyLnNsaWNlKG8rMSkpO3JldHVybiB0fWZ1bmN0aW9uIHBhcnNlSGVhZGVyKGUpe2NvbnN0IHQ9ZS5zcGxpdCgvXFxyP1xcbi8pLHM9e307bGV0IHIsbyxuLGk7Zm9yKGxldCBlPTAsdT10Lmxlbmd0aDtlPHU7KytlKS0xIT09KHI9KG89dFtlXSkuaW5kZXhPZihcIjpcIikpJiYobj1vLnNsaWNlKDAscikudG9Mb3dlckNhc2UoKSxpPXRyaW0oby5zbGljZShyKzEpKSxzW25dPWkpO3JldHVybiBzfWZ1bmN0aW9uIGlzSlNPTihlKXtyZXR1cm4vW1xcLytdanNvbigkfFteLVxcd10pLy50ZXN0KGUpfWZ1bmN0aW9uIFJlc3BvbnNlKGUpe3RoaXMucmVxPWUsdGhpcy54aHI9dGhpcy5yZXEueGhyLHRoaXMudGV4dD1cIkhFQURcIiE9dGhpcy5yZXEubWV0aG9kJiYoXCJcIj09PXRoaXMueGhyLnJlc3BvbnNlVHlwZXx8XCJ0ZXh0XCI9PT10aGlzLnhoci5yZXNwb25zZVR5cGUpfHx2b2lkIDA9PT10aGlzLnhoci5yZXNwb25zZVR5cGU/dGhpcy54aHIucmVzcG9uc2VUZXh0Om51bGwsdGhpcy5zdGF0dXNUZXh0PXRoaXMucmVxLnhoci5zdGF0dXNUZXh0O2xldCB0PXRoaXMueGhyLnN0YXR1czsxMjIzPT09dCYmKHQ9MjA0KSx0aGlzLl9zZXRTdGF0dXNQcm9wZXJ0aWVzKHQpLHRoaXMuaGVhZGVyPXRoaXMuaGVhZGVycz1wYXJzZUhlYWRlcih0aGlzLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSksdGhpcy5oZWFkZXJbXCJjb250ZW50LXR5cGVcIl09dGhpcy54aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJjb250ZW50LXR5cGVcIiksdGhpcy5fc2V0SGVhZGVyUHJvcGVydGllcyh0aGlzLmhlYWRlciksbnVsbD09PXRoaXMudGV4dCYmZS5fcmVzcG9uc2VUeXBlP3RoaXMuYm9keT10aGlzLnhoci5yZXNwb25zZTp0aGlzLmJvZHk9XCJIRUFEXCIhPXRoaXMucmVxLm1ldGhvZD90aGlzLl9wYXJzZUJvZHkodGhpcy50ZXh0P3RoaXMudGV4dDp0aGlzLnhoci5yZXNwb25zZSk6bnVsbH1mdW5jdGlvbiBSZXF1ZXN0KGUsdCl7Y29uc3Qgcz10aGlzO3RoaXMuX3F1ZXJ5PXRoaXMuX3F1ZXJ5fHxbXSx0aGlzLm1ldGhvZD1lLHRoaXMudXJsPXQsdGhpcy5oZWFkZXI9e30sdGhpcy5faGVhZGVyPXt9LHRoaXMub24oXCJlbmRcIiwoKT0+e2xldCBlLHQ9bnVsbCxyPW51bGw7dHJ5e3I9bmV3IFJlc3BvbnNlKHMpfWNhdGNoKGUpe3JldHVybih0PW5ldyBFcnJvcihcIlBhcnNlciBpcyB1bmFibGUgdG8gcGFyc2UgdGhlIHJlc3BvbnNlXCIpKS5wYXJzZT0hMCx0Lm9yaWdpbmFsPWUscy54aHI/KHQucmF3UmVzcG9uc2U9dm9pZCAwPT09cy54aHIucmVzcG9uc2VUeXBlP3MueGhyLnJlc3BvbnNlVGV4dDpzLnhoci5yZXNwb25zZSx0LnN0YXR1cz1zLnhoci5zdGF0dXM/cy54aHIuc3RhdHVzOm51bGwsdC5zdGF0dXNDb2RlPXQuc3RhdHVzKToodC5yYXdSZXNwb25zZT1udWxsLHQuc3RhdHVzPW51bGwpLHMuY2FsbGJhY2sodCl9cy5lbWl0KFwicmVzcG9uc2VcIixyKTt0cnl7cy5faXNSZXNwb25zZU9LKHIpfHwoZT1uZXcgRXJyb3Ioci5zdGF0dXNUZXh0fHxcIlVuc3VjY2Vzc2Z1bCBIVFRQIHJlc3BvbnNlXCIpKX1jYXRjaCh0KXtlPXR9ZT8oZS5vcmlnaW5hbD10LGUucmVzcG9uc2U9cixlLnN0YXR1cz1yLnN0YXR1cyxzLmNhbGxiYWNrKGUscikpOnMuY2FsbGJhY2sobnVsbCxyKX0pfWZ1bmN0aW9uIGRlbChlLHQscyl7Y29uc3Qgcj1yZXF1ZXN0KFwiREVMRVRFXCIsZSk7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdCYmKHM9dCx0PW51bGwpLHQmJnIuc2VuZCh0KSxzJiZyLmVuZChzKSxyfXJlcXVlc3Quc2VyaWFsaXplT2JqZWN0PXNlcmlhbGl6ZSxyZXF1ZXN0LnBhcnNlU3RyaW5nPXBhcnNlU3RyaW5nLHJlcXVlc3QudHlwZXM9e2h0bWw6XCJ0ZXh0L2h0bWxcIixqc29uOlwiYXBwbGljYXRpb24vanNvblwiLHhtbDpcInRleHQveG1sXCIsdXJsZW5jb2RlZDpcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiLGZvcm06XCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIixcImZvcm0tZGF0YVwiOlwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCJ9LHJlcXVlc3Quc2VyaWFsaXplPXtcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiOnNlcmlhbGl6ZSxcImFwcGxpY2F0aW9uL2pzb25cIjpKU09OLnN0cmluZ2lmeX0scmVxdWVzdC5wYXJzZT17XCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIjpwYXJzZVN0cmluZyxcImFwcGxpY2F0aW9uL2pzb25cIjpKU09OLnBhcnNlfSxSZXNwb25zZUJhc2UoUmVzcG9uc2UucHJvdG90eXBlKSxSZXNwb25zZS5wcm90b3R5cGUuX3BhcnNlQm9keT1mdW5jdGlvbihlKXtsZXQgdD1yZXF1ZXN0LnBhcnNlW3RoaXMudHlwZV07cmV0dXJuIHRoaXMucmVxLl9wYXJzZXI/dGhpcy5yZXEuX3BhcnNlcih0aGlzLGUpOighdCYmaXNKU09OKHRoaXMudHlwZSkmJih0PXJlcXVlc3QucGFyc2VbXCJhcHBsaWNhdGlvbi9qc29uXCJdKSx0JiZlJiYoZS5sZW5ndGh8fGUgaW5zdGFuY2VvZiBPYmplY3QpP3QoZSk6bnVsbCl9LFJlc3BvbnNlLnByb3RvdHlwZS50b0Vycm9yPWZ1bmN0aW9uKCl7Y29uc3QgZT10aGlzLnJlcSx0PWUubWV0aG9kLHM9ZS51cmwscj1gY2Fubm90ICR7dH0gJHtzfSAoJHt0aGlzLnN0YXR1c30pYCxvPW5ldyBFcnJvcihyKTtyZXR1cm4gby5zdGF0dXM9dGhpcy5zdGF0dXMsby5tZXRob2Q9dCxvLnVybD1zLG99LHJlcXVlc3QuUmVzcG9uc2U9UmVzcG9uc2UsRW1pdHRlcihSZXF1ZXN0LnByb3RvdHlwZSksUmVxdWVzdEJhc2UoUmVxdWVzdC5wcm90b3R5cGUpLFJlcXVlc3QucHJvdG90eXBlLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2V0KFwiQ29udGVudC1UeXBlXCIscmVxdWVzdC50eXBlc1tlXXx8ZSksdGhpc30sUmVxdWVzdC5wcm90b3R5cGUuYWNjZXB0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNldChcIkFjY2VwdFwiLHJlcXVlc3QudHlwZXNbZV18fGUpLHRoaXN9LFJlcXVlc3QucHJvdG90eXBlLmF1dGg9ZnVuY3Rpb24oZSx0LHMpezE9PT1hcmd1bWVudHMubGVuZ3RoJiYodD1cIlwiKSxcIm9iamVjdFwiPT10eXBlb2YgdCYmbnVsbCE9PXQmJihzPXQsdD1cIlwiKSxzfHwocz17dHlwZTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBidG9hP1wiYmFzaWNcIjpcImF1dG9cIn0pO3JldHVybiB0aGlzLl9hdXRoKGUsdCxzLGU9PntpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBidG9hKXJldHVybiBidG9hKGUpO3Rocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgYmFzaWMgYXV0aCwgYnRvYSBpcyBub3QgYSBmdW5jdGlvblwiKX0pfSxSZXF1ZXN0LnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbihlKXtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgZSYmKGU9c2VyaWFsaXplKGUpKSxlJiZ0aGlzLl9xdWVyeS5wdXNoKGUpLHRoaXN9LFJlcXVlc3QucHJvdG90eXBlLmF0dGFjaD1mdW5jdGlvbihlLHQscyl7aWYodCl7aWYodGhpcy5fZGF0YSl0aHJvdyBFcnJvcihcInN1cGVyYWdlbnQgY2FuJ3QgbWl4IC5zZW5kKCkgYW5kIC5hdHRhY2goKVwiKTt0aGlzLl9nZXRGb3JtRGF0YSgpLmFwcGVuZChlLHQsc3x8dC5uYW1lKX1yZXR1cm4gdGhpc30sUmVxdWVzdC5wcm90b3R5cGUuX2dldEZvcm1EYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Zvcm1EYXRhfHwodGhpcy5fZm9ybURhdGE9bmV3IHJvb3QuRm9ybURhdGEpLHRoaXMuX2Zvcm1EYXRhfSxSZXF1ZXN0LnByb3RvdHlwZS5jYWxsYmFjaz1mdW5jdGlvbihlLHQpe2lmKHRoaXMuX3Nob3VsZFJldHJ5KGUsdCkpcmV0dXJuIHRoaXMuX3JldHJ5KCk7Y29uc3Qgcz10aGlzLl9jYWxsYmFjazt0aGlzLmNsZWFyVGltZW91dCgpLGUmJih0aGlzLl9tYXhSZXRyaWVzJiYoZS5yZXRyaWVzPXRoaXMuX3JldHJpZXMtMSksdGhpcy5lbWl0KFwiZXJyb3JcIixlKSkscyhlLHQpfSxSZXF1ZXN0LnByb3RvdHlwZS5jcm9zc0RvbWFpbkVycm9yPWZ1bmN0aW9uKCl7Y29uc3QgZT1uZXcgRXJyb3IoXCJSZXF1ZXN0IGhhcyBiZWVuIHRlcm1pbmF0ZWRcXG5Qb3NzaWJsZSBjYXVzZXM6IHRoZSBuZXR3b3JrIGlzIG9mZmxpbmUsIE9yaWdpbiBpcyBub3QgYWxsb3dlZCBieSBBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4sIHRoZSBwYWdlIGlzIGJlaW5nIHVubG9hZGVkLCBldGMuXCIpO2UuY3Jvc3NEb21haW49ITAsZS5zdGF0dXM9dGhpcy5zdGF0dXMsZS5tZXRob2Q9dGhpcy5tZXRob2QsZS51cmw9dGhpcy51cmwsdGhpcy5jYWxsYmFjayhlKX0sUmVxdWVzdC5wcm90b3R5cGUuYnVmZmVyPVJlcXVlc3QucHJvdG90eXBlLmNhPVJlcXVlc3QucHJvdG90eXBlLmFnZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybihcIlRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiBicm93c2VyIHZlcnNpb24gb2Ygc3VwZXJhZ2VudFwiKSx0aGlzfSxSZXF1ZXN0LnByb3RvdHlwZS5waXBlPVJlcXVlc3QucHJvdG90eXBlLndyaXRlPSgoKT0+e3Rocm93IEVycm9yKFwiU3RyZWFtaW5nIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYnJvd3NlciB2ZXJzaW9uIG9mIHN1cGVyYWdlbnRcIil9KSxSZXF1ZXN0LnByb3RvdHlwZS5faXNIb3N0PWZ1bmN0aW9uKGUpe3JldHVybiBlJiZcIm9iamVjdFwiPT10eXBlb2YgZSYmIUFycmF5LmlzQXJyYXkoZSkmJlwiW29iamVjdCBPYmplY3RdXCIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9LFJlcXVlc3QucHJvdG90eXBlLmVuZD1mdW5jdGlvbihlKXt0aGlzLl9lbmRDYWxsZWQmJmNvbnNvbGUud2FybihcIldhcm5pbmc6IC5lbmQoKSB3YXMgY2FsbGVkIHR3aWNlLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gc3VwZXJhZ2VudFwiKSx0aGlzLl9lbmRDYWxsZWQ9ITAsdGhpcy5fY2FsbGJhY2s9ZXx8bm9vcCx0aGlzLl9maW5hbGl6ZVF1ZXJ5U3RyaW5nKCksdGhpcy5fZW5kKCl9LFJlcXVlc3QucHJvdG90eXBlLl9lbmQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9hYm9ydGVkKXJldHVybiB0aGlzLmNhbGxiYWNrKEVycm9yKFwiVGhlIHJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZCBldmVuIGJlZm9yZSAuZW5kKCkgd2FzIGNhbGxlZFwiKSk7Y29uc3QgZT10aGlzLHQ9dGhpcy54aHI9cmVxdWVzdC5nZXRYSFIoKTtsZXQgcz10aGlzLl9mb3JtRGF0YXx8dGhpcy5fZGF0YTt0aGlzLl9zZXRUaW1lb3V0cygpLHQub25yZWFkeXN0YXRlY2hhbmdlPSgoKT0+e2NvbnN0IHM9dC5yZWFkeVN0YXRlO2lmKHM+PTImJmUuX3Jlc3BvbnNlVGltZW91dFRpbWVyJiZjbGVhclRpbWVvdXQoZS5fcmVzcG9uc2VUaW1lb3V0VGltZXIpLDQhPXMpcmV0dXJuO2xldCByO3RyeXtyPXQuc3RhdHVzfWNhdGNoKGUpe3I9MH1pZighcil7aWYoZS50aW1lZG91dHx8ZS5fYWJvcnRlZClyZXR1cm47cmV0dXJuIGUuY3Jvc3NEb21haW5FcnJvcigpfWUuZW1pdChcImVuZFwiKX0pO2NvbnN0IHI9KHQscyk9PntzLnRvdGFsPjAmJihzLnBlcmNlbnQ9cy5sb2FkZWQvcy50b3RhbCoxMDApLHMuZGlyZWN0aW9uPXQsZS5lbWl0KFwicHJvZ3Jlc3NcIixzKX07aWYodGhpcy5oYXNMaXN0ZW5lcnMoXCJwcm9ncmVzc1wiKSl0cnl7dC5vbnByb2dyZXNzPXIuYmluZChudWxsLFwiZG93bmxvYWRcIiksdC51cGxvYWQmJih0LnVwbG9hZC5vbnByb2dyZXNzPXIuYmluZChudWxsLFwidXBsb2FkXCIpKX1jYXRjaChlKXt9dHJ5e3RoaXMudXNlcm5hbWUmJnRoaXMucGFzc3dvcmQ/dC5vcGVuKHRoaXMubWV0aG9kLHRoaXMudXJsLCEwLHRoaXMudXNlcm5hbWUsdGhpcy5wYXNzd29yZCk6dC5vcGVuKHRoaXMubWV0aG9kLHRoaXMudXJsLCEwKX1jYXRjaChlKXtyZXR1cm4gdGhpcy5jYWxsYmFjayhlKX1pZih0aGlzLl93aXRoQ3JlZGVudGlhbHMmJih0LndpdGhDcmVkZW50aWFscz0hMCksIXRoaXMuX2Zvcm1EYXRhJiZcIkdFVFwiIT10aGlzLm1ldGhvZCYmXCJIRUFEXCIhPXRoaXMubWV0aG9kJiZcInN0cmluZ1wiIT10eXBlb2YgcyYmIXRoaXMuX2lzSG9zdChzKSl7Y29uc3QgZT10aGlzLl9oZWFkZXJbXCJjb250ZW50LXR5cGVcIl07bGV0IHQ9dGhpcy5fc2VyaWFsaXplcnx8cmVxdWVzdC5zZXJpYWxpemVbZT9lLnNwbGl0KFwiO1wiKVswXTpcIlwiXTshdCYmaXNKU09OKGUpJiYodD1yZXF1ZXN0LnNlcmlhbGl6ZVtcImFwcGxpY2F0aW9uL2pzb25cIl0pLHQmJihzPXQocykpfWZvcihjb25zdCBlIGluIHRoaXMuaGVhZGVyKW51bGwhPXRoaXMuaGVhZGVyW2VdJiZ0aGlzLmhlYWRlci5oYXNPd25Qcm9wZXJ0eShlKSYmdC5zZXRSZXF1ZXN0SGVhZGVyKGUsdGhpcy5oZWFkZXJbZV0pO3RoaXMuX3Jlc3BvbnNlVHlwZSYmKHQucmVzcG9uc2VUeXBlPXRoaXMuX3Jlc3BvbnNlVHlwZSksdGhpcy5lbWl0KFwicmVxdWVzdFwiLHRoaXMpLHQuc2VuZCh2b2lkIDAhPT1zP3M6bnVsbCl9LHJlcXVlc3QuYWdlbnQ9KCgpPT5uZXcgQWdlbnQpLFtcIkdFVFwiLFwiUE9TVFwiLFwiT1BUSU9OU1wiLFwiUEFUQ0hcIixcIlBVVFwiLFwiREVMRVRFXCJdLmZvckVhY2goZT0+e0FnZW50LnByb3RvdHlwZVtlLnRvTG93ZXJDYXNlKCldPWZ1bmN0aW9uKHQscyl7Y29uc3Qgcj1uZXcgcmVxdWVzdC5SZXF1ZXN0KGUsdCk7cmV0dXJuIHRoaXMuX3NldERlZmF1bHRzKHIpLHMmJnIuZW5kKHMpLHJ9fSksQWdlbnQucHJvdG90eXBlLmRlbD1BZ2VudC5wcm90b3R5cGUuZGVsZXRlLHJlcXVlc3QuZ2V0PSgoZSx0LHMpPT57Y29uc3Qgcj1yZXF1ZXN0KFwiR0VUXCIsZSk7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdCYmKHM9dCx0PW51bGwpLHQmJnIucXVlcnkodCkscyYmci5lbmQocykscn0pLHJlcXVlc3QuaGVhZD0oKGUsdCxzKT0+e2NvbnN0IHI9cmVxdWVzdChcIkhFQURcIixlKTtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiYocz10LHQ9bnVsbCksdCYmci5xdWVyeSh0KSxzJiZyLmVuZChzKSxyfSkscmVxdWVzdC5vcHRpb25zPSgoZSx0LHMpPT57Y29uc3Qgcj1yZXF1ZXN0KFwiT1BUSU9OU1wiLGUpO3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJihzPXQsdD1udWxsKSx0JiZyLnNlbmQodCkscyYmci5lbmQocykscn0pLHJlcXVlc3QuZGVsPWRlbCxyZXF1ZXN0LmRlbGV0ZT1kZWwscmVxdWVzdC5wYXRjaD0oKGUsdCxzKT0+e2NvbnN0IHI9cmVxdWVzdChcIlBBVENIXCIsZSk7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdCYmKHM9dCx0PW51bGwpLHQmJnIuc2VuZCh0KSxzJiZyLmVuZChzKSxyfSkscmVxdWVzdC5wb3N0PSgoZSx0LHMpPT57Y29uc3Qgcj1yZXF1ZXN0KFwiUE9TVFwiLGUpO3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJihzPXQsdD1udWxsKSx0JiZyLnNlbmQodCkscyYmci5lbmQocykscn0pLHJlcXVlc3QucHV0PSgoZSx0LHMpPT57Y29uc3Qgcj1yZXF1ZXN0KFwiUFVUXCIsZSk7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdCYmKHM9dCx0PW51bGwpLHQmJnIuc2VuZCh0KSxzJiZyLmVuZChzKSxyfSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbU5zYVdWdWRDNXFjeUpkTENKdVlXMWxjeUk2V3lKeWIyOTBJaXdpZDJsdVpHOTNJaXdpYzJWc1ppSXNJbU52Ym5OdmJHVWlMQ0ozWVhKdUlpd2lkR2hwY3lJc0lrVnRhWFIwWlhJaUxDSnlaWEYxYVhKbElpd2lVbVZ4ZFdWemRFSmhjMlVpTENKcGMwOWlhbVZqZENJc0lsSmxjM0J2Ym5ObFFtRnpaU0lzSWtGblpXNTBJaXdpYm05dmNDSXNJbkpsY1hWbGMzUWlMQ0psZUhCdmNuUnpJaXdpYlc5a2RXeGxJaXdpYldWMGFHOWtJaXdpZFhKc0lpd2lVbVZ4ZFdWemRDSXNJbVZ1WkNJc0ltRnlaM1Z0Wlc1MGN5SXNJbXhsYm1kMGFDSXNJbWRsZEZoSVVpSXNJbGhOVEVoMGRIQlNaWEYxWlhOMElpd2liRzlqWVhScGIyNGlMQ0p3Y205MGIyTnZiQ0lzSWtGamRHbDJaVmhQWW1wbFkzUWlMQ0psSWl3aVJYSnliM0lpTENKMGNtbHRJaXdpY3lJc0luSmxjR3hoWTJVaUxDSnpaWEpwWVd4cGVtVWlMQ0p2WW1vaUxDSndZV2x5Y3lJc0ltdGxlU0lzSW5CMWMyaEZibU52WkdWa1MyVjVWbUZzZFdWUVlXbHlJaXdpYW05cGJpSXNJblpoYkNJc0lrRnljbUY1SWl3aWFYTkJjbkpoZVNJc0ltWnZja1ZoWTJnaUxDSjJJaXdpYzNWaWEyVjVJaXdpY0hWemFDSXNJbVZ1WTI5a1pWVlNTVU52YlhCdmJtVnVkQ0lzSW5CaGNuTmxVM1J5YVc1bklpd2ljM1J5SWl3aWMzQnNhWFFpTENKd1lXbHlJaXdpY0c5eklpd2lhU0lzSW14bGJpSXNJbWx1WkdWNFQyWWlMQ0prWldOdlpHVlZVa2xEYjIxd2IyNWxiblFpTENKemJHbGpaU0lzSW5CaGNuTmxTR1ZoWkdWeUlpd2liR2x1WlhNaUxDSm1hV1ZzWkhNaUxDSnBibVJsZUNJc0lteHBibVVpTENKbWFXVnNaQ0lzSW5SdlRHOTNaWEpEWVhObElpd2lhWE5LVTA5T0lpd2liV2x0WlNJc0luUmxjM1FpTENKU1pYTndiMjV6WlNJc0luSmxjU0lzSW5ob2NpSXNJblJsZUhRaUxDSnlaWE53YjI1elpWUjVjR1VpTENKeVpYTndiMjV6WlZSbGVIUWlMQ0p6ZEdGMGRYTlVaWGgwSWl3aWMzUmhkSFZ6SWl3aVgzTmxkRk4wWVhSMWMxQnliM0JsY25ScFpYTWlMQ0pvWldGa1pYSWlMQ0pvWldGa1pYSnpJaXdpWjJWMFFXeHNVbVZ6Y0c5dWMyVklaV0ZrWlhKeklpd2laMlYwVW1WemNHOXVjMlZJWldGa1pYSWlMQ0pmYzJWMFNHVmhaR1Z5VUhKdmNHVnlkR2xsY3lJc0lsOXlaWE53YjI1elpWUjVjR1VpTENKaWIyUjVJaXdpY21WemNHOXVjMlVpTENKZmNHRnljMlZDYjJSNUlpd2lYM0YxWlhKNUlpd2lYMmhsWVdSbGNpSXNJbTl1SWl3aWJtVjNYMlZ5Y2lJc0ltVnljaUlzSW5KbGN5SXNJbkJoY25ObElpd2liM0pwWjJsdVlXd2lMQ0p5WVhkU1pYTndiMjV6WlNJc0luTjBZWFIxYzBOdlpHVWlMQ0pqWVd4c1ltRmpheUlzSW1WdGFYUWlMQ0pmYVhOU1pYTndiMjV6WlU5TElpd2lZM1Z6ZEc5dFgyVnljaUlzSW1SbGJDSXNJbVJoZEdFaUxDSm1iaUlzSW5ObGJtUWlMQ0p6WlhKcFlXeHBlbVZQWW1wbFkzUWlMQ0owZVhCbGN5SXNJbWgwYld3aUxDSnFjMjl1SWl3aWVHMXNJaXdpZFhKc1pXNWpiMlJsWkNJc0ltWnZjbTBpTENKbWIzSnRMV1JoZEdFaUxDSmhjSEJzYVdOaGRHbHZiaTk0TFhkM2R5MW1iM0p0TFhWeWJHVnVZMjlrWldRaUxDSmhjSEJzYVdOaGRHbHZiaTlxYzI5dUlpd2lTbE5QVGlJc0luTjBjbWx1WjJsbWVTSXNJbkJ5YjNSdmRIbHdaU0lzSW5SNWNHVWlMQ0pmY0dGeWMyVnlJaXdpVDJKcVpXTjBJaXdpZEc5RmNuSnZjaUlzSW0xelp5SXNJbk5sZENJc0ltRmpZMlZ3ZENJc0ltRjFkR2dpTENKMWMyVnlJaXdpY0dGemN5SXNJbTl3ZEdsdmJuTWlMQ0ppZEc5aElpd2lYMkYxZEdnaUxDSnpkSEpwYm1jaUxDSnhkV1Z5ZVNJc0ltRjBkR0ZqYUNJc0ltWnBiR1VpTENKZlpHRjBZU0lzSWw5blpYUkdiM0p0UkdGMFlTSXNJbUZ3Y0dWdVpDSXNJbTVoYldVaUxDSmZabTl5YlVSaGRHRWlMQ0pHYjNKdFJHRjBZU0lzSWw5emFHOTFiR1JTWlhSeWVTSXNJbDl5WlhSeWVTSXNJbDlqWVd4c1ltRmpheUlzSW1Oc1pXRnlWR2x0Wlc5MWRDSXNJbDl0WVhoU1pYUnlhV1Z6SWl3aWNtVjBjbWxsY3lJc0lsOXlaWFJ5YVdWeklpd2lZM0p2YzNORWIyMWhhVzVGY25KdmNpSXNJbU55YjNOelJHOXRZV2x1SWl3aVluVm1abVZ5SWl3aVkyRWlMQ0poWjJWdWRDSXNJbkJwY0dVaUxDSjNjbWwwWlNJc0lsOXBjMGh2YzNRaUxDSjBiMU4wY21sdVp5SXNJbU5oYkd3aUxDSmZaVzVrUTJGc2JHVmtJaXdpWDJacGJtRnNhWHBsVVhWbGNubFRkSEpwYm1jaUxDSmZaVzVrSWl3aVgyRmliM0owWldRaUxDSmZjMlYwVkdsdFpXOTFkSE1pTENKdmJuSmxZV1I1YzNSaGRHVmphR0Z1WjJVaUxDSnlaV0ZrZVZOMFlYUmxJaXdpWDNKbGMzQnZibk5sVkdsdFpXOTFkRlJwYldWeUlpd2lkR2x0WldSdmRYUWlMQ0pvWVc1a2JHVlFjbTluY21WemN5SXNJbVJwY21WamRHbHZiaUlzSW5SdmRHRnNJaXdpY0dWeVkyVnVkQ0lzSW14dllXUmxaQ0lzSW1oaGMweHBjM1JsYm1WeWN5SXNJbTl1Y0hKdlozSmxjM01pTENKaWFXNWtJaXdpZFhCc2IyRmtJaXdpZFhObGNtNWhiV1VpTENKd1lYTnpkMjl5WkNJc0ltOXdaVzRpTENKZmQybDBhRU55WldSbGJuUnBZV3h6SWl3aWQybDBhRU55WldSbGJuUnBZV3h6SWl3aVkyOXVkR1Z1ZEZSNWNHVWlMQ0pmYzJWeWFXRnNhWHBsY2lJc0ltaGhjMDkzYmxCeWIzQmxjblI1SWl3aWMyVjBVbVZ4ZFdWemRFaGxZV1JsY2lJc0lsOXpaWFJFWldaaGRXeDBjeUlzSW1kbGRDSXNJbWhsWVdRaUxDSndZWFJqYUNJc0luQnZjM1FpTENKd2RYUWlYU3dpYldGd2NHbHVaM01pT2lKQlFVbEJMRWxCUVVsQkxFdEJRMnRDTEc5Q1FVRllReXhQUVVOVVJDeExRVUZQUXl4UFFVTnJRaXh2UWtGQlZFTXNTMEZEYUVKR0xFdEJRVTlGTEUxQlJWQkRMRkZCUVZGRExFdEJRVXNzZFVWQlEySktMRXRCUVU5TExFMUJSMVFzVFVGQlRVTXNVVUZCVlVNc1VVRkJVU3h4UWtGRGJFSkRMRmxCUVdORUxGRkJRVkVzYTBKQlEzUkNSU3hUUVVGWFJpeFJRVUZSTEdWQlEyNUNSeXhoUVVGbFNDeFJRVUZSTEcxQ1FVTjJRa2tzVFVGQlVVb3NVVUZCVVN4blFrRk5kRUlzVTBGQlUwc3NVVUZOVkN4TlFVRk5ReXhSUVVGVlF5eFJRVUZWUXl4UFFVRlBSQ3hSUVVGVkxGTkJRVk5GTEVWQlFWRkRMRWRCUlRGRUxFMUJRVWtzYlVKQlFYRkNRU3hGUVVOb1FpeEpRVUZKU0N4UlFVRlJTU3hSUVVGUkxFMUJRVTlHTEVkQlFWRkhMRWxCUVVsR0xFZEJTVFZETEVkQlFVdEhMRlZCUVZWRExFOUJRMVlzU1VGQlNWQXNVVUZCVVVrc1VVRkJVU3hOUVVGUFJpeEhRVWMzUWl4SlFVRkpSaXhSUVVGUlNTeFJRVUZSUml4RlFVRlJReXhKUVVkeVEwZ3NVVUZCVVVrc1VVRkJWVUVzVVVGTmJFSk1MRkZCUVZGVExFOUJRVk1zVFVGRFppeE5RVUZKZEVJc1MwRkJTM1ZDTEdkQ1FVTkJka0lzUzBGQlMzZENMRlZCUVZrc1UwRkJWM2hDTEV0QlFVdDNRaXhUUVVGVFF5eFZRVU4yUTNwQ0xFdEJRVXN3UWl4bFFVTm1MRTlCUVU4c1NVRkJTVWdzWlVGRldDeEpRVUZOTEU5QlFVOHNTVUZCU1Vjc1kwRkJZeXh4UWtGQmQwSXNUVUZCVFVNc1NVRkROMFFzU1VGQlRTeFBRVUZQTEVsQlFVbEVMR05CUVdNc2MwSkJRWGxDTEUxQlFVMURMRWxCUXpsRUxFbEJRVTBzVDBGQlR5eEpRVUZKUkN4alFVRmpMSE5DUVVGNVFpeE5RVUZOUXl4SlFVTTVSQ3hKUVVGTkxFOUJRVThzU1VGQlNVUXNZMEZCWXl4clFrRkJjVUlzVFVGQlRVTXNTVUZGTlVRc1RVRkJUVU1zVFVGQlRTd3lSRUZYWkN4TlFVRk5ReXhMUVVGUExFZEJRVWRCTEV0QlExcERMRWRCUVV0QkxFVkJRVVZFTEU5QlExQkRMRWRCUVV0QkxFVkJRVVZETEZGQlFWRXNaVUZCWjBJc1NVRlZia01zVTBGQlUwTXNWVUZCVlVNc1IwRkRha0lzU1VGQlMzaENMRk5CUVZOM1FpeEhRVUZOTEU5QlFVOUJMRVZCUXpOQ0xFMUJRVTFETEVWQlFWRXNSMEZEWkN4SlFVRkxMRTFCUVUxRExFdEJRVTlHTEVWQlEyaENSeXgzUWtGQmQwSkdMRVZCUVU5RExFVkJRVXRHTEVWQlFVbEZMRWxCUlRGRExFOUJRVTlFTEVWQlFVMUhMRXRCUVVzc1MwRlpjRUlzVTBGQlUwUXNkMEpCUVhkQ1JpeEZRVUZQUXl4RlFVRkxSeXhIUVVNelF5eEhRVUZYTEUxQlFWQkJMRVZCUTBZc1IwRkJTVU1zVFVGQlRVTXNVVUZCVVVZc1IwRkRhRUpCTEVWQlFVbEhMRkZCUVZGRExFbEJRMVpPTEhkQ1FVRjNRa1lzUlVGQlQwTXNSVUZCUzA4c1ZVRkZha01zUjBGQlNXcERMRk5CUVZNMlFpeEhRVU5zUWl4SlFVRkpMRTFCUVUxTExFdEJRVlZNTEVWQlEyeENSaXgzUWtGQmQwSkdMRXRCUVZWRExFdEJRVTlSTEV0QlFWZE1MRVZCUVVsTExGTkJSekZFVkN4RlFVRk5WU3hMUVVGTFF5eHRRa0ZCYlVKV0xFZEJRekZDTEVsQlFVMVZMRzFDUVVGdFFsQXNVMEZGWkN4UFFVRlNRU3hIUVVOVVNpeEZRVUZOVlN4TFFVRkxReXh0UWtGQmJVSldMRWxCYTBKc1F5eFRRVUZUVnl4WlFVRlpReXhIUVVOdVFpeE5RVUZOWkN4RlFVRk5MRWRCUTA1RExFVkJRVkZoTEVWQlFVbERMRTFCUVUwc1MwRkRlRUlzU1VGQlNVTXNSVUZEUVVNc1JVRkZTaXhKUVVGTExFbEJRVWxETEVWQlFVa3NSVUZCUjBNc1JVRkJUV3hDTEVWQlFVMWlMRTlCUVZFNFFpeEZRVUZKUXl4SlFVRlBSQ3hIUVVkcVF5eEpRVVJhUkN4SFFVUkJSQ3hGUVVGUFppeEZRVUZOYVVJc1NVRkRSa1VzVVVGQlVTeE5RVVZxUW5CQ0xFVkJRVWx4UWl4dFFrRkJiVUpNTEVsQlFWTXNSMEZGYUVOb1FpeEZRVUZKY1VJc2JVSkJRVzFDVEN4RlFVRkxUU3hOUVVGTkxFVkJRVWRNTEV0QlEyNURTU3h0UWtGQmJVSk1MRVZCUVV0TkxFMUJRVTFNTEVWQlFVMHNTVUZKTVVNc1QwRkJUMnBDTEVWQk9FUlVMRk5CUVZOMVFpeFpRVUZaVkN4SFFVTnVRaXhOUVVGTlZTeEZRVUZSVml4RlFVRkpReXhOUVVGTkxGTkJRMnhDVlN4RlFVRlRMRWRCUTJZc1NVRkJTVU1zUlVGRFFVTXNSVUZEUVVNc1JVRkRRWFpDTEVWQlJVb3NTVUZCU3l4SlFVRkpZU3hGUVVGSkxFVkJRVWRETEVWQlFVMUxMRVZCUVUxd1F5eFBRVUZST0VJc1JVRkJTVU1zU1VGQlQwUXNSMEZIT1VJc1MwRkVabEVzUjBGRVFVTXNSVUZCVDBnc1JVRkJUVTRzU1VGRFFVVXNVVUZCVVN4UlFVbHlRbEVzUlVGQlVVUXNSVUZCUzB3c1RVRkJUU3hGUVVGSFNTeEhRVUZQUnl4alFVTTNRbmhDTEVWQlFVMVVMRXRCUVVzclFpeEZRVUZMVEN4TlFVRk5TU3hGUVVGUkxFbEJRemxDUkN4RlFVRlBSeXhIUVVGVGRrSXNSMEZIYkVJc1QwRkJUMjlDTEVWQlYxUXNVMEZCVTBzc1QwRkJUME1zUjBGSFpDeE5RVUZQTEhOQ1FVRnpRa01zUzBGQlMwUXNSMEZwUkhCRExGTkJRVk5GTEZOQlFWTkRMRWRCUTJoQ09VUXNTMEZCU3poRUxFbEJRVTFCTEVWQlExZzVSQ3hMUVVGTEswUXNTVUZCVFM5RUxFdEJRVXM0UkN4SlFVRkpReXhKUVVWd1FpOUVMRXRCUVV0blJTeExRVUV5UWl4UlFVRnNRbWhGTEV0QlFVczRSQ3hKUVVGSmJrUXNVMEZCT0VNc1MwRkJNVUpZTEV0QlFVc3JSQ3hKUVVGSlJTeGpRVUZwUkN4VFFVRXhRbXBGTEV0QlFVc3JSQ3hKUVVGSlJTeHZRa0ZCT0VRc1NVRkJNVUpxUlN4TFFVRkxLMFFzU1VGQlNVVXNZVUZETlVocVJTeExRVUZMSzBRc1NVRkJTVWNzWVVGRFZDeExRVU5NYkVVc1MwRkJTMjFGTEZkQlFXRnVSU3hMUVVGTE9FUXNTVUZCU1VNc1NVRkJTVWtzVjBGREwwSXNTVUZCU1VNc1JVRkJVM0JGTEV0QlFVc3JSQ3hKUVVGSlN5eFBRVVZRTEU5QlFWaEJMRWxCUTBaQkxFVkJRVk1zUzBGRldIQkZMRXRCUVV0eFJTeHhRa0ZCY1VKRUxFZEJRekZDY0VVc1MwRkJTM05GTEU5QlFWTjBSU3hMUVVGTGRVVXNVVUZCVlhCQ0xGbEJRVmx1UkN4TFFVRkxLMFFzU1VGQlNWTXNlVUpCU1d4RWVFVXNTMEZCUzNORkxFOUJRVThzWjBKQlFXdENkRVVzUzBGQlN5dEVMRWxCUVVsVkxHdENRVUZyUWl4blFrRkRla1I2UlN4TFFVRkxNRVVzY1VKQlFYRkNNVVVzUzBGQlMzTkZMRkZCUlROQ0xFOUJRVk4wUlN4TFFVRkxaMFVzVFVGQlVVWXNSVUZCU1dFc1kwRkROVUl6UlN4TFFVRkxORVVzUzBGQlR6VkZMRXRCUVVzclJDeEpRVUZKWXl4VFFVVnlRamRGTEV0QlFVczBSU3hMUVVFd1FpeFJRVUZ1UWpWRkxFdEJRVXM0UkN4SlFVRkpia1FzVDBGRGFrSllMRXRCUVVzNFJTeFhRVUZYT1VVc1MwRkJTMmRGTEV0QlFVOW9SU3hMUVVGTFowVXNTMEZCVDJoRkxFdEJRVXNyUkN4SlFVRkpZeXhWUVVOcVJDeExRV2xGVWl4VFFVRlRhRVVzVVVGQlVVWXNSVUZCVVVNc1IwRkRka0lzVFVGQlRXWXNSVUZCVDBjc1MwRkRZa0VzUzBGQlN5dEZMRTlCUVZNdlJTeExRVUZMSzBVc1VVRkJWU3hIUVVNM1FpOUZMRXRCUVV0WExFOUJRVk5CTEVWQlEyUllMRXRCUVV0WkxFbEJRVTFCTEVWQlExaGFMRXRCUVV0elJTeFBRVUZUTEVkQlEyUjBSU3hMUVVGTFowWXNVVUZCVlN4SFFVTm1hRVlzUzBGQlMybEdMRWRCUVVjc1RVRkJUeXhMUVVOaUxFbEJNRUpKUXl4RlFURkNRVU1zUlVGQlRTeExRVU5PUXl4RlFVRk5MRXRCUlZZc1NVRkRSVUVzUlVGQlRTeEpRVUZKZGtJc1UwRkJVMmhGTEVkQlEyNUNMRTFCUVUxNVFpeEhRV2RDVGl4UFFXWkJOa1FzUlVGQlRTeEpRVUZKTlVRc1RVRkJUU3d5UTBGRFdqaEVMRTlCUVZFc1JVRkRXa1lzUlVGQlNVY3NVMEZCVjJoRkxFVkJSVmg2UWl4RlFVRkxhMFVzUzBGRlVHOUNMRVZCUVVsSkxHbENRVUU0UXl4SlFVRjZRakZHTEVWQlFVdHJSU3hKUVVGSlJTeGhRVUU0UW5CRkxFVkJRVXRyUlN4SlFVRkpSeXhoUVVGbGNrVXNSVUZCUzJ0RkxFbEJRVWxqTEZOQlJXcEhUU3hGUVVGSlppeFBRVUZUZGtVc1JVRkJTMnRGTEVsQlFVbExMRTlCUVZOMlJTeEZRVUZMYTBVc1NVRkJTVXNzVDBGQlV5eExRVU5xUkdVc1JVRkJTVXNzVjBGQllVd3NSVUZCU1dZc1UwRkZja0psTEVWQlFVbEpMRmxCUVdNc1MwRkRiRUpLTEVWQlFVbG1MRTlCUVZNc1RVRkhVblpGTEVWQlFVczBSaXhUUVVGVFRpeEhRVWQyUW5SR0xFVkJRVXMyUml4TFFVRkxMRmRCUVZsT0xFZEJSM1JDTEVsQlEwOTJSaXhGUVVGTE9FWXNZMEZCWTFBc1MwRkRkRUpHTEVWQlFWVXNTVUZCU1RORUxFMUJRVTAyUkN4RlFVRkpha0lzV1VGQll5d3JRa0ZGZUVNc1RVRkJUWGxDTEVkQlEwNVdMRVZCUVZWVkxFVkJTVkpXTEVkQlEwWkJMRVZCUVZGSkxGTkJRVmRJTEVWQlEyNUNSQ3hGUVVGUlRDeFRRVUZYVHl4RlFVTnVRa1lzUlVGQlVXUXNUMEZCVTJkQ0xFVkJRVWxvUWl4UFFVTnlRblpGTEVWQlFVczBSaXhUUVVGVFVDeEZRVUZUUlN4SlFVVjJRblpHTEVWQlFVczBSaXhUUVVGVExFdEJRVTFNTEV0QmEyRXhRaXhUUVVGVFV5eEpRVUZKYWtZc1JVRkJTMnRHTEVWQlFVMURMRWRCUTNSQ0xFMUJRVTFxUXl4RlFVRk5kRVFzVVVGQlVTeFRRVUZWU1N4SFFVazVRaXhOUVVoSkxHMUNRVUZ4UW10R0xFbEJRVTlETEVWQlFVdEVMRVZCUVZGQkxFVkJRVThzVFVGRGFFUkJMRWRCUVUxb1F5eEZRVUZKYTBNc1MwRkJTMFlzUjBGRFprTXNSMEZCU1dwRExFVkJRVWxvUkN4SlFVRkphVVlzUjBGRFZHcERMRVZCTDNSQ1ZIUkVMRkZCUVZGNVJpeG5Ra0ZCYTBKMFJTeFZRV3RETVVKdVFpeFJRVUZSYVVNc1dVRkJZMEVzV1VGVGRFSnFReXhSUVVGUk1FWXNUVUZCVVN4RFFVTmtReXhMUVVGTkxGbEJRMDVETEV0QlFVMHNiVUpCUTA1RExFbEJRVXNzVjBGRFRFTXNWMEZCV1N4dlEwRkRXa01zUzBGQlVTeHZRMEZEVWtNc1dVRkJZU3h4UTBGWlptaEhMRkZCUVZGdFFpeFZRVUZaTEVOQlEyeENPRVVzYjBOQlFYRkRPVVVzVlVGRGNrTXJSU3h0UWtGQmIwSkRMRXRCUVV0RExGZEJXVE5DY0Vjc1VVRkJVVFpGTEUxQlFWRXNRMEZEWkc5Q0xHOURRVUZ4UTJoRkxGbEJRM0pEYVVVc2JVSkJRVzlDUXl4TFFVRkxkRUlzVDBFMFNETkNhRVlzWVVGQllYZEVMRk5CUVZOblJDeFhRV0YwUW1oRUxGTkJRVk5uUkN4VlFVRlZMMElzVjBGQllTeFRRVUZUY0VNc1IwRkRka01zU1VGQlNUSkRMRVZCUVZFM1JTeFJRVUZSTmtVc1RVRkJUWEpHTEV0QlFVczRSeXhOUVVNdlFpeFBRVUZKT1Vjc1MwRkJTemhFTEVsQlFVbHBSQ3hSUVVOS0wwY3NTMEZCU3poRUxFbEJRVWxwUkN4UlFVRlJMMGNzUzBGQlRUQkRMRXRCUlROQ01rTXNSMEZCVXpOQ0xFOUJRVTh4UkN4TFFVRkxPRWNzVVVGRGVFSjZRaXhGUVVGUk4wVXNVVUZCVVRaRkxFMUJRVTBzY1VKQlJXcENRU3hIUVVGVE0wTXNTVUZCVVVFc1JVRkJTVEZDTEZGQlFWVXdRaXhoUVVGbGMwVXNVVUZEYWtRelFpeEZRVUZOTTBNc1IwRkRUaXhQUVZWT2JVSXNVMEZCVTJkRUxGVkJRVlZKTEZGQlFWVXNWMEZETTBJc1RVRkJUVzVFTEVWQlFVMDVSQ3hMUVVGTE9FUXNTVUZEV0c1RUxFVkJRVk50UkN4RlFVRkpia1FzVDBGRFlrTXNSVUZCVFd0RUxFVkJRVWxzUkN4SlFVVldjMGNzV1VGQlowSjJSeXhMUVVGVlF5eE5RVUZSV2l4TFFVRkxiMFVzVlVGRGRrTmxMRVZCUVUwc1NVRkJTVFZFTEUxQlFVMHlSaXhIUVV0MFFpeFBRVXBCTDBJc1JVRkJTV1lzVDBGQlUzQkZMRXRCUVV0dlJTeFBRVU5zUW1Vc1JVRkJTWGhGTEU5QlFWTkJMRVZCUTJKM1JTeEZRVUZKZGtVc1NVRkJUVUVzUlVGRlNIVkZMRWRCVDFRelJTeFJRVUZSY1VRc1UwRkJWMEVzVTBGeFJXNUNOVVFzVVVGQlVWa3NVVUZCVVdkSExGZEJRMmhDTVVjc1dVRkJXVlVzVVVGQlVXZEhMRmRCZDBKd1FtaEhMRkZCUVZGblJ5eFZRVUZWUXl4TFFVRlBMRk5CUVZOQkxFZEJSV2hETEU5QlJFRTVSeXhMUVVGTGJVZ3NTVUZCU1N4bFFVRm5Rak5ITEZGQlFWRXdSaXhOUVVGTldTeEpRVUZUUVN4SFFVTjZRemxITEUxQmRVSlVZU3hSUVVGUlowY3NWVUZCVlU4c1QwRkJVeXhUUVVGVFRpeEhRVVZzUXl4UFFVUkJPVWNzUzBGQlMyMUlMRWxCUVVrc1UwRkJWVE5ITEZGQlFWRXdSaXhOUVVGTldTeEpRVUZUUVN4SFFVTnVRemxITEUxQllWUmhMRkZCUVZGblJ5eFZRVUZWVVN4TFFVRlBMRk5CUVZORExFVkJRVTFETEVWQlFVMURMRWRCUTNoRExFbEJRVTE2Unl4VlFVRlZReXhUUVVGUmRVY3NSVUZCVHl4SlFVTm1MR2xDUVVGVVFTeEhRVUU0UWl4UFFVRlVRU3hKUVVNNVFrTXNSVUZCVlVRc1JVRkRWa0VzUlVGQlR5eEpRVVZLUXl4SlFVTklRU3hGUVVGVkxFTkJRMUpXTEV0QlFVMHNiVUpCUVhOQ1Z5eExRVUZQTEZGQlFWVXNVMEZYYWtRc1QwRkJUM3BJTEV0QlFVc3dTQ3hOUVVGTlNpeEZRVUZOUXl4RlFVRk5ReXhGUVZCa1J5eEpRVU5rTEVkQlFVa3NiVUpCUVhOQ1JpeExRVU40UWl4UFFVRlBRU3hMUVVGTFJTeEhRVVZrTEUxQlFVMHNTVUZCU1hCSExFMUJRVTBzYjBSQmIwSndRbFlzVVVGQlVXZEhMRlZCUVZWbExFMUJRVkVzVTBGQlV6TkdMRWRCUjJwRExFMUJSa2tzYVVKQlFXMUNRU3hKUVVGTFFTeEZRVUZOVGl4VlFVRlZUU3hKUVVONFEwRXNSMEZCUzJwRExFdEJRVXNyUlN4UFFVRlBlRU1zUzBGQlMwNHNSMEZEYmtKcVF5eE5RVzlDVkdFc1VVRkJVV2RITEZWQlFWVm5RaXhQUVVGVExGTkJRVk55UlN4RlFVRlBjMFVzUlVGQlRVNHNSMEZETDBNc1IwRkJTVTBzUlVGQlRTeERRVU5TTEVkQlFVazVTQ3hMUVVGTEswZ3NUVUZEVUN4TlFVRk5lRWNzVFVGQlRTdzRRMEZIWkhaQ0xFdEJRVXRuU1N4bFFVRmxReXhQUVVGUGVrVXNSVUZCVDNORkxFVkJRVTFPTEVkQlFWZE5MRVZCUVV0SkxFMUJSVEZFTEU5QlFVOXNTU3hOUVVkVVlTeFJRVUZSWjBjc1ZVRkJWVzFDTEdGQlFXVXNWMEZKTDBJc1QwRklTMmhKTEV0QlFVdHRTU3haUVVOU2Jra3NTMEZCUzIxSkxGVkJRVmtzU1VGQlNYaEpMRXRCUVV0NVNTeFZRVVZ5UW5CSkxFdEJRVXR0U1N4WFFWbGtkRWdzVVVGQlVXZEhMRlZCUVZWd1FpeFRRVUZYTEZOQlFWTk9MRVZCUVV0RExFZEJRM3BETEVkQlFVbHdSaXhMUVVGTGNVa3NZVUZCWVd4RUxFVkJRVXRETEVkQlEzcENMRTlCUVU5d1JpeExRVUZMYzBrc1UwRkhaQ3hOUVVGTmRrTXNSVUZCU3k5R0xFdEJRVXQxU1N4VlFVTm9RblpKTEV0QlFVdDNTU3hsUVVWRWNrUXNTVUZEUlc1R0xFdEJRVXQ1U1N4alFVRmhkRVFzUlVGQlNYVkVMRkZCUVZVeFNTeExRVUZMTWtrc1UwRkJWeXhIUVVOd1JETkpMRXRCUVVzd1JpeExRVUZMTEZGQlFWTlFMRWxCUjNKQ1dTeEZRVUZIV2l4RlFVRkxReXhKUVZOV2RrVXNVVUZCVVdkSExGVkJRVlVyUWl4cFFrRkJiVUlzVjBGRGJrTXNUVUZCVFhwRUxFVkJRVTBzU1VGQlNUVkVMRTFCUVUwc1owdEJRM1JDTkVRc1JVRkJTVEJFTEdGQlFXTXNSVUZGYkVJeFJDeEZRVUZKWml4UFFVRlRjRVVzUzBGQlMyOUZMRTlCUTJ4Q1pTeEZRVUZKZUVVc1QwRkJVMWdzUzBGQlMxY3NUMEZEYkVKM1JTeEZRVUZKZGtVc1NVRkJUVm9zUzBGQlMxa3NTVUZGWmxvc1MwRkJTM2xHTEZOQlFWTk9MRWxCU1doQ2RFVXNVVUZCVVdkSExGVkJRVlZwUXl4UFFVRlRha2tzVVVGQlVXZEhMRlZCUVZWclF5eEhRVUZMYkVrc1VVRkJVV2RITEZWQlFWVnRReXhOUVVGUkxGZEJSVEZGTEU5QlJFRnNTaXhSUVVGUlF5eExRVUZMTERCRVFVTk9ReXhOUVVsVVlTeFJRVUZSWjBjc1ZVRkJWVzlETEV0QlFVOXdTU3hSUVVGUlowY3NWVUZCVlhGRExFMUJRVkVzVFVGRGFrUXNUVUZCVFROSUxFMUJRVTBzYVVWQlYyUldMRkZCUVZGblJ5eFZRVUZWYzBNc1VVRkJWU3hUUVVGcFFuWklMRWRCUlRORExFOUJRVTlCTEVkQlFVOHNhVUpCUVc5Q1FTeEpRVUZSVFN4TlFVRk5ReXhSUVVGUlVDeEpRVUZuUkN4dlFrRkJlRU52Uml4UFFVRlBTQ3hWUVVGVmRVTXNVMEZCVTBNc1MwRkJTM3BJTEVsQldXcEhaaXhSUVVGUlowY3NWVUZCVlM5R0xFbEJRVTBzVTBGQlUybEdMRWRCUXpOQ0wwWXNTMEZCUzNOS0xGbEJRMUI0U2l4UlFVRlJReXhMUVVGTExIbEZRVVZtUXl4TFFVRkxjMG9zV1VGQllTeEZRVWRzUW5SS0xFdEJRVXQxU1N4VlFVRlplRU1zUjBGQlRYaEdMRXRCUjNaQ1VDeExRVUZMZFVvc2RVSkJSVXgyU2l4TFFVRkxkMG9zVVVGSFVETkpMRkZCUVZGblJ5eFZRVUZWTWtNc1MwRkJUeXhYUVVOMlFpeEhRVUZKZUVvc1MwRkJTM2xLTEZOQlFWVXNUMEZCVDNwS0xFdEJRVXQ1Uml4VFFVRlRiRVVzVFVGQlRTd3JSRUZGT1VNc1RVRkJUVEZDTEVWQlFVOUhMRXRCUTFBclJDeEZRVUZQTDBRc1MwRkJTeXRFTEVsQlFVMTJSQ3hSUVVGUlV5eFRRVU5vUXl4SlFVRkpOa1VzUlVGQlR6bEdMRXRCUVV0dFNTeFhRVUZoYmtrc1MwRkJTeXRJTEUxQlJXeERMMGdzUzBGQlN6QktMR1ZCUjB3elJpeEZRVUZKTkVZc2JVSkJRWEZDTEUxQlEzWkNMRTFCUVUxRExFVkJRV0UzUml4RlFVRkpOa1lzVjBGSmRrSXNSMEZJU1VFc1IwRkJZeXhIUVVGTEwwb3NSVUZCUzJkTExIVkNRVU14UW5KQ0xHRkJRV0V6U1N4RlFVRkxaMHNzZFVKQlJXaENMRWRCUVV0RUxFVkJRMUFzVDBGTFJpeEpRVUZKZUVZc1JVRkRTaXhKUVVGTlFTeEZRVUZUVEN4RlFVRkpTeXhQUVVGVExFMUJRVTA1UXl4SFFVRkxPRU1zUlVGQlV5eEZRVVZvUkN4SlFVRkxRU3hGUVVGUkxFTkJRMWdzUjBGQlNYWkZMRVZCUVV0cFN5eFZRVUZaYWtzc1JVRkJTelJLTEZOQlFWVXNUMEZEY0VNc1QwRkJUelZLTEVWQlFVc3JTU3h0UWtGRlpDOUpMRVZCUVVzMlJpeExRVUZMTEZOQlNWb3NUVUZCVFhGRkxFVkJRV2xDTEVOQlFVTkRMRVZCUVZjeFNTeExRVU0zUWtFc1JVRkJSVEpKTEUxQlFWRXNTVUZEV2pOSkxFVkJRVVUwU1N4UlFVRlZOVWtzUlVGQlJUWkpMRTlCUVZNM1NTeEZRVUZGTWtrc1RVRkJVU3hMUVVWdVF6TkpMRVZCUVVVd1NTeFZRVUZaUVN4RlFVTmtia3NzUlVGQlN6WkdMRXRCUVVzc1YwRkJXWEJGTEVsQlJYaENMRWRCUVVsMFFpeExRVUZMYjBzc1lVRkJZU3haUVVOd1FpeEpRVU5GY2tjc1JVRkJTWE5ITEZkQlFXRk9MRVZCUVdWUExFdEJRVXNzUzBGQlRTeFpRVU4yUTNaSExFVkJRVWwzUnl4VFFVTk9lRWNzUlVGQlNYZEhMRTlCUVU5R0xGZEJRV0ZPTEVWQlFXVlBMRXRCUVVzc1MwRkJUU3hYUVVWd1JDeE5RVUZOYUVvc1NVRlJWaXhKUVVOTmRFSXNTMEZCUzNkTExGVkJRVmw0U3l4TFFVRkxlVXNzVTBGRGVFSXhSeXhGUVVGSk1rY3NTMEZCU3pGTExFdEJRVXRYTEU5QlFWRllMRXRCUVV0WkxFdEJRVXNzUlVGQlRWb3NTMEZCUzNkTExGTkJRVlY0U3l4TFFVRkxlVXNzVlVGRk1VUXhSeXhGUVVGSk1rY3NTMEZCU3pGTExFdEJRVXRYTEU5QlFWRllMRXRCUVV0WkxFdEJRVXNzUjBGRmJFTXNUVUZCVDNWRkxFZEJSVkFzVDBGQlQyNUdMRXRCUVV0NVJpeFRRVUZUVGl4SFFVOTJRaXhIUVVoSmJrWXNTMEZCU3pKTExHMUNRVUZyUWpWSExFVkJRVWsyUnl4cFFrRkJhMElzU1VGSE5VTTFTeXhMUVVGTGJVa3NWMEZCWVN4UFFVRlRia2tzUzBGQlMxY3NVVUZCVlN4UlFVRlZXQ3hMUVVGTFZ5eFJRVUZWTEdsQ1FVRnRRbTFHTEVsQlFWTTVSaXhMUVVGTGJVb3NVVUZCVVhKRUxFZEJRVThzUTBGRmRFZ3NUVUZCVFN0RkxFVkJRV00zU3l4TFFVRkxaMFlzVVVGQlVTeG5Ra0ZEYWtNc1NVRkJTWEpFTEVWQlFWa3pRaXhMUVVGTE9Fc3NZVUZCWlhSTExGRkJRVkZ0UWl4VlFVRlZhMG9zUlVGQlkwRXNSVUZCV1d4SkxFMUJRVTBzUzBGQlN5eEhRVUZMTEV0QlF6TkdhRUlzUjBGQllTdENMRTlCUVU5dFNDeExRVU4yUW14S0xFVkJRVmx1UWl4UlFVRlJiVUlzVlVGQlZTeHhRa0ZGTlVKQkxFbEJRVmR0UlN4RlFVRlBia1VzUlVGQlZXMUZMRWxCU1d4RExFbEJRVXNzVFVGQlRYUkRMRXRCUVZONFJDeExRVUZMYzBVc1QwRkRia0lzVFVGQlVYUkZMRXRCUVV0elJTeFBRVUZQWkN4SlFVVndRbmhFTEV0QlFVdHpSU3hQUVVGUGVVY3NaVUZCWlhaSUxFbEJRemRDVHl4RlFVRkphVWdzYVVKQlFXbENlRWdzUlVGQlQzaEVMRXRCUVV0elJTeFBRVUZQWkN4SlFVZDRRM2hFTEV0QlFVc3lSU3huUWtGRFVGb3NSVUZCU1VVc1lVRkJaV3BGTEV0QlFVc3lSU3hsUVVreFFqTkZMRXRCUVVzd1JpeExRVUZMTEZWQlFWY3hSaXhOUVVseVFpdEVMRVZCUVVscFF5eFZRVUZ4UWl4SlFVRlVSaXhGUVVGMVFrRXNSVUZCVHl4UFFVZG9SSFJHTEZGQlFWRjNTU3hOUVVGUkxFdEJRVTBzU1VGQlNURkpMRTlCUlRGQ0xFTkJRVU1zVFVGQlR5eFBRVUZSTEZWQlFWY3NVVUZCVXl4TlFVRlBMRlZCUVZVNFFpeFJRVUZSZWtJc1NVRkRNMFJNTEUxQlFVMTFSeXhWUVVGVmJFY3NSVUZCVHpoRExHVkJRV2xDTEZOQlFWTTNReXhGUVVGTGJVWXNSMEZEY0VRc1RVRkJUV3BETEVWQlFVMHNTVUZCU1hSRUxGRkJRVkZMTEZGQlFWRkdMRVZCUVZGRExFZEJTM2hETEU5QlNrRmFMRXRCUVV0cFRDeGhRVUZoYmtnc1IwRkRaR2xETEVkQlEwWnFReXhGUVVGSmFFUXNTVUZCU1dsR0xFZEJSVWhxUXl4TFFVbFllRVFzVFVGQlRYVkhMRlZCUVZWb1FpeEpRVUZOZGtZc1RVRkJUWFZITEZWQlFXdENMRTlCV1RsRGNrY3NVVUZCVVRCTExFbEJRVTBzUlVGQlEzUkxMRVZCUVV0clJpeEZRVUZOUXl4TFFVTjRRaXhOUVVGTmFrTXNSVUZCVFhSRUxGRkJRVkVzVFVGQlQwa3NSMEZKTTBJc1RVRklTU3h0UWtGQmNVSnJSaXhKUVVGUFF5eEZRVUZMUkN4RlFVRlJRU3hGUVVGUExFMUJRMmhFUVN4SFFVRk5hRU1zUlVGQlNUaEVMRTFCUVUwNVFpeEhRVU5vUWtNc1IwRkJTV3BETEVWQlFVbG9SQ3hKUVVGSmFVWXNSMEZEVkdwRExFbEJZVlIwUkN4UlFVRlJNa3NzUzBGQlR5eEZRVUZEZGtzc1JVRkJTMnRHTEVWQlFVMURMRXRCUTNwQ0xFMUJRVTFxUXl4RlFVRk5kRVFzVVVGQlVTeFBRVUZSU1N4SFFVazFRaXhOUVVoSkxHMUNRVUZ4UW10R0xFbEJRVTlETEVWQlFVdEVMRVZCUVZGQkxFVkJRVThzVFVGRGFFUkJMRWRCUVUxb1F5eEZRVUZKT0VRc1RVRkJUVGxDTEVkQlEyaENReXhIUVVGSmFrTXNSVUZCU1doRUxFbEJRVWxwUml4SFFVTlVha01zU1VGaFZIUkVMRkZCUVZGblNDeFJRVUZWTEVWQlFVTTFSeXhGUVVGTGEwWXNSVUZCVFVNc1MwRkROVUlzVFVGQlRXcERMRVZCUVUxMFJDeFJRVUZSTEZWQlFWZEpMRWRCU1M5Q0xFMUJTRWtzYlVKQlFYRkNhMFlzU1VGQlQwTXNSVUZCUzBRc1JVRkJVVUVzUlVGQlR5eE5RVU5vUkVFc1IwRkJUV2hETEVWQlFVbHJReXhMUVVGTFJpeEhRVU5tUXl4SFFVRkpha01zUlVGQlNXaEVMRWxCUVVscFJpeEhRVU5VYWtNc1NVRnhRbFIwUkN4UlFVRmhMRWxCUVVseFJpeEpRVU5xUW5KR0xGRkJRV2RDTEU5QlFVbHhSaXhKUVZsd1FuSkdMRkZCUVZFMFN5eE5RVUZSTEVWQlFVTjRTeXhGUVVGTGEwWXNSVUZCVFVNc1MwRkRNVUlzVFVGQlRXcERMRVZCUVUxMFJDeFJRVUZSTEZGQlFWTkpMRWRCU1RkQ0xFMUJTRWtzYlVKQlFYRkNhMFlzU1VGQlQwTXNSVUZCUzBRc1JVRkJVVUVzUlVGQlR5eE5RVU5vUkVFc1IwRkJUV2hETEVWQlFVbHJReXhMUVVGTFJpeEhRVU5tUXl4SFFVRkpha01zUlVGQlNXaEVMRWxCUVVscFJpeEhRVU5VYWtNc1NVRmhWSFJFTEZGQlFWRTJTeXhMUVVGUExFVkJRVU42U3l4RlFVRkxhMFlzUlVGQlRVTXNTMEZEZWtJc1RVRkJUV3BETEVWQlFVMTBSQ3hSUVVGUkxFOUJRVkZKTEVkQlNUVkNMRTFCU0Vrc2JVSkJRWEZDYTBZc1NVRkJUME1zUlVGQlMwUXNSVUZCVVVFc1JVRkJUeXhOUVVOb1JFRXNSMEZCVFdoRExFVkJRVWxyUXl4TFFVRkxSaXhIUVVObVF5eEhRVUZKYWtNc1JVRkJTV2hFTEVsQlFVbHBSaXhIUVVOVWFrTXNTVUZoVkhSRUxGRkJRVkU0U3l4SlFVRk5MRVZCUVVNeFN5eEZRVUZMYTBZc1JVRkJUVU1zUzBGRGVFSXNUVUZCVFdwRExFVkJRVTEwUkN4UlFVRlJMRTFCUVU5SkxFZEJTVE5DTEUxQlNFa3NiVUpCUVhGQ2EwWXNTVUZCVDBNc1JVRkJTMFFzUlVGQlVVRXNSVUZCVHl4TlFVTm9SRUVzUjBGQlRXaERMRVZCUVVsclF5eExRVUZMUml4SFFVTm1ReXhIUVVGSmFrTXNSVUZCU1doRUxFbEJRVWxwUml4SFFVTlVha01pTENKbWFXeGxJam9pUlRwY1hIZHZjbXR6Y0dGalpWeGNjR0Z1ZEc5dFlYUm9MV05vWVhSaWIzUmNYRzV2WkdWZmJXOWtkV3hsYzF4Y2MzVndaWEpoWjJWdWRGeGNiR2xpWEZ4amJHbGxiblF1YW5NaWZRPT0iLCJcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpc09iamVjdCh0KXtyZXR1cm4gbnVsbCE9PXQmJlwib2JqZWN0XCI9PXR5cGVvZiB0fW1vZHVsZS5leHBvcnRzPWlzT2JqZWN0O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW1sekxXOWlhbVZqZEM1cWN5SmRMQ0p1WVcxbGN5STZXeUpwYzA5aWFtVmpkQ0lzSW05aWFpSXNJbTF2WkhWc1pTSXNJbVY0Y0c5eWRITWlYU3dpYldGd2NHbHVaM01pT2lKQlFVRkJMR0ZCVlVFc1UwRkJVMEVzVTBGQlUwTXNSMEZEYUVJc1QwRkJUeXhQUVVGVFFTeEhRVUZQTEdsQ1FVRnZRa0VzUlVGSE4wTkRMRTlCUVU5RExGRkJRVlZJSWl3aVptbHNaU0k2SWtVNlhGeFhiM0pyYzNCaFkyVmNYSGRwYTJsaExXbHpMV0Z1YzNkbGNtVmtYRnh1YjJSbFgyMXZaSFZzWlhOY1hITjFjR1Z5WVdkbGJuUmNYR3hwWWx4Y2FYTXRiMkpxWldOMExtcHpJbjA9IiwiXCJ1c2Ugc3RyaWN0XCI7Y29uc3QgaXNPYmplY3Q9cmVxdWlyZShcIi4vaXMtb2JqZWN0XCIpO2Z1bmN0aW9uIFJlcXVlc3RCYXNlKHQpe2lmKHQpcmV0dXJuIG1peGluKHQpfWZ1bmN0aW9uIG1peGluKHQpe2Zvcihjb25zdCBlIGluIFJlcXVlc3RCYXNlLnByb3RvdHlwZSl0W2VdPVJlcXVlc3RCYXNlLnByb3RvdHlwZVtlXTtyZXR1cm4gdH1tb2R1bGUuZXhwb3J0cz1SZXF1ZXN0QmFzZSxSZXF1ZXN0QmFzZS5wcm90b3R5cGUuY2xlYXJUaW1lb3V0PWZ1bmN0aW9uKCl7cmV0dXJuIGNsZWFyVGltZW91dCh0aGlzLl90aW1lciksY2xlYXJUaW1lb3V0KHRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyKSxkZWxldGUgdGhpcy5fdGltZXIsZGVsZXRlIHRoaXMuX3Jlc3BvbnNlVGltZW91dFRpbWVyLHRoaXN9LFJlcXVlc3RCYXNlLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyc2VyPXQsdGhpc30sUmVxdWVzdEJhc2UucHJvdG90eXBlLnJlc3BvbnNlVHlwZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVzcG9uc2VUeXBlPXQsdGhpc30sUmVxdWVzdEJhc2UucHJvdG90eXBlLnNlcmlhbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fc2VyaWFsaXplcj10LHRoaXN9LFJlcXVlc3RCYXNlLnByb3RvdHlwZS50aW1lb3V0PWZ1bmN0aW9uKHQpe2lmKCF0fHxcIm9iamVjdFwiIT10eXBlb2YgdClyZXR1cm4gdGhpcy5fdGltZW91dD10LHRoaXMuX3Jlc3BvbnNlVGltZW91dD0wLHRoaXM7Zm9yKGNvbnN0IGUgaW4gdClzd2l0Y2goZSl7Y2FzZVwiZGVhZGxpbmVcIjp0aGlzLl90aW1lb3V0PXQuZGVhZGxpbmU7YnJlYWs7Y2FzZVwicmVzcG9uc2VcIjp0aGlzLl9yZXNwb25zZVRpbWVvdXQ9dC5yZXNwb25zZTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybihcIlVua25vd24gdGltZW91dCBvcHRpb25cIixlKX1yZXR1cm4gdGhpc30sUmVxdWVzdEJhc2UucHJvdG90eXBlLnJldHJ5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDAhPT1hcmd1bWVudHMubGVuZ3RoJiYhMCE9PXR8fCh0PTEpLHQ8PTAmJih0PTApLHRoaXMuX21heFJldHJpZXM9dCx0aGlzLl9yZXRyaWVzPTAsdGhpcy5fcmV0cnlDYWxsYmFjaz1lLHRoaXN9O2NvbnN0IEVSUk9SX0NPREVTPVtcIkVDT05OUkVTRVRcIixcIkVUSU1FRE9VVFwiLFwiRUFERFJJTkZPXCIsXCJFU09DS0VUVElNRURPVVRcIl07UmVxdWVzdEJhc2UucHJvdG90eXBlLl9zaG91bGRSZXRyeT1mdW5jdGlvbih0LGUpe2lmKCF0aGlzLl9tYXhSZXRyaWVzfHx0aGlzLl9yZXRyaWVzKys+PXRoaXMuX21heFJldHJpZXMpcmV0dXJuITE7aWYodGhpcy5fcmV0cnlDYWxsYmFjayl0cnl7Y29uc3Qgcz10aGlzLl9yZXRyeUNhbGxiYWNrKHQsZSk7aWYoITA9PT1zKXJldHVybiEwO2lmKCExPT09cylyZXR1cm4hMX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKHQpfWlmKGUmJmUuc3RhdHVzJiZlLnN0YXR1cz49NTAwJiY1MDEhPWUuc3RhdHVzKXJldHVybiEwO2lmKHQpe2lmKHQuY29kZSYmfkVSUk9SX0NPREVTLmluZGV4T2YodC5jb2RlKSlyZXR1cm4hMDtpZih0LnRpbWVvdXQmJlwiRUNPTk5BQk9SVEVEXCI9PXQuY29kZSlyZXR1cm4hMDtpZih0LmNyb3NzRG9tYWluKXJldHVybiEwfXJldHVybiExfSxSZXF1ZXN0QmFzZS5wcm90b3R5cGUuX3JldHJ5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xlYXJUaW1lb3V0KCksdGhpcy5yZXEmJih0aGlzLnJlcT1udWxsLHRoaXMucmVxPXRoaXMucmVxdWVzdCgpKSx0aGlzLl9hYm9ydGVkPSExLHRoaXMudGltZWRvdXQ9ITEsdGhpcy5fZW5kKCl9LFJlcXVlc3RCYXNlLnByb3RvdHlwZS50aGVuPWZ1bmN0aW9uKHQsZSl7aWYoIXRoaXMuX2Z1bGxmaWxsZWRQcm9taXNlKXtjb25zdCB0PXRoaXM7dGhpcy5fZW5kQ2FsbGVkJiZjb25zb2xlLndhcm4oXCJXYXJuaW5nOiBzdXBlcmFnZW50IHJlcXVlc3Qgd2FzIHNlbnQgdHdpY2UsIGJlY2F1c2UgYm90aCAuZW5kKCkgYW5kIC50aGVuKCkgd2VyZSBjYWxsZWQuIE5ldmVyIGNhbGwgLmVuZCgpIGlmIHlvdSB1c2UgcHJvbWlzZXNcIiksdGhpcy5fZnVsbGZpbGxlZFByb21pc2U9bmV3IFByb21pc2UoKGUscyk9Pnt0Lm9uKFwiZXJyb3JcIixzKSx0Lm9uKFwiYWJvcnRcIiwoKT0+e2NvbnN0IHQ9bmV3IEVycm9yKFwiQWJvcnRlZFwiKTt0LmNvZGU9XCJBQk9SVEVEXCIsdC5zdGF0dXM9dGhpcy5zdGF0dXMsdC5tZXRob2Q9dGhpcy5tZXRob2QsdC51cmw9dGhpcy51cmwscyh0KX0pLHQuZW5kKCh0LGkpPT57dD9zKHQpOmUoaSl9KX0pfXJldHVybiB0aGlzLl9mdWxsZmlsbGVkUHJvbWlzZS50aGVuKHQsZSl9LFJlcXVlc3RCYXNlLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCx0KX0sUmVxdWVzdEJhc2UucHJvdG90eXBlLnVzZT1mdW5jdGlvbih0KXtyZXR1cm4gdCh0aGlzKSx0aGlzfSxSZXF1ZXN0QmFzZS5wcm90b3R5cGUub2s9ZnVuY3Rpb24odCl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdCl0aHJvdyBFcnJvcihcIkNhbGxiYWNrIHJlcXVpcmVkXCIpO3JldHVybiB0aGlzLl9va0NhbGxiYWNrPXQsdGhpc30sUmVxdWVzdEJhc2UucHJvdG90eXBlLl9pc1Jlc3BvbnNlT0s9ZnVuY3Rpb24odCl7cmV0dXJuISF0JiYodGhpcy5fb2tDYWxsYmFjaz90aGlzLl9va0NhbGxiYWNrKHQpOnQuc3RhdHVzPj0yMDAmJnQuc3RhdHVzPDMwMCl9LFJlcXVlc3RCYXNlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2hlYWRlclt0LnRvTG93ZXJDYXNlKCldfSxSZXF1ZXN0QmFzZS5wcm90b3R5cGUuZ2V0SGVhZGVyPVJlcXVlc3RCYXNlLnByb3RvdHlwZS5nZXQsUmVxdWVzdEJhc2UucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe2lmKGlzT2JqZWN0KHQpKXtmb3IoY29uc3QgZSBpbiB0KXRoaXMuc2V0KGUsdFtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuX2hlYWRlclt0LnRvTG93ZXJDYXNlKCldPWUsdGhpcy5oZWFkZXJbdF09ZSx0aGlzfSxSZXF1ZXN0QmFzZS5wcm90b3R5cGUudW5zZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGRlbGV0ZSB0aGlzLl9oZWFkZXJbdC50b0xvd2VyQ2FzZSgpXSxkZWxldGUgdGhpcy5oZWFkZXJbdF0sdGhpc30sUmVxdWVzdEJhc2UucHJvdG90eXBlLmZpZWxkPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dCl0aHJvdyBuZXcgRXJyb3IoXCIuZmllbGQobmFtZSwgdmFsKSBuYW1lIGNhbiBub3QgYmUgZW1wdHlcIik7aWYodGhpcy5fZGF0YSl0aHJvdyBuZXcgRXJyb3IoXCIuZmllbGQoKSBjYW4ndCBiZSB1c2VkIGlmIC5zZW5kKCkgaXMgdXNlZC4gUGxlYXNlIHVzZSBvbmx5IC5zZW5kKCkgb3Igb25seSAuZmllbGQoKSAmIC5hdHRhY2goKVwiKTtpZihpc09iamVjdCh0KSl7Zm9yKGNvbnN0IGUgaW4gdCl0aGlzLmZpZWxkKGUsdFtlXSk7cmV0dXJuIHRoaXN9aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKGNvbnN0IHMgaW4gZSl0aGlzLmZpZWxkKHQsZVtzXSk7cmV0dXJuIHRoaXN9aWYobnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoXCIuZmllbGQobmFtZSwgdmFsKSB2YWwgY2FuIG5vdCBiZSBlbXB0eVwiKTtyZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIGUmJihlPVwiXCIrZSksdGhpcy5fZ2V0Rm9ybURhdGEoKS5hcHBlbmQodCxlKSx0aGlzfSxSZXF1ZXN0QmFzZS5wcm90b3R5cGUuYWJvcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWJvcnRlZD90aGlzOih0aGlzLl9hYm9ydGVkPSEwLHRoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpLHRoaXMucmVxJiZ0aGlzLnJlcS5hYm9ydCgpLHRoaXMuY2xlYXJUaW1lb3V0KCksdGhpcy5lbWl0KFwiYWJvcnRcIiksdGhpcyl9LFJlcXVlc3RCYXNlLnByb3RvdHlwZS5fYXV0aD1mdW5jdGlvbih0LGUscyxpKXtzd2l0Y2gocy50eXBlKXtjYXNlXCJiYXNpY1wiOnRoaXMuc2V0KFwiQXV0aG9yaXphdGlvblwiLGBCYXNpYyAke2koYCR7dH06JHtlfWApfWApO2JyZWFrO2Nhc2VcImF1dG9cIjp0aGlzLnVzZXJuYW1lPXQsdGhpcy5wYXNzd29yZD1lO2JyZWFrO2Nhc2VcImJlYXJlclwiOnRoaXMuc2V0KFwiQXV0aG9yaXphdGlvblwiLGBCZWFyZXIgJHt0fWApfXJldHVybiB0aGlzfSxSZXF1ZXN0QmFzZS5wcm90b3R5cGUud2l0aENyZWRlbnRpYWxzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10JiYodD0hMCksdGhpcy5fd2l0aENyZWRlbnRpYWxzPXQsdGhpc30sUmVxdWVzdEJhc2UucHJvdG90eXBlLnJlZGlyZWN0cz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWF4UmVkaXJlY3RzPXQsdGhpc30sUmVxdWVzdEJhc2UucHJvdG90eXBlLm1heFJlc3BvbnNlU2l6ZT1mdW5jdGlvbih0KXtpZihcIm51bWJlclwiIT10eXBlb2YgdCl0aHJvdyBUeXBlRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50XCIpO3JldHVybiB0aGlzLl9tYXhSZXNwb25zZVNpemU9dCx0aGlzfSxSZXF1ZXN0QmFzZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21ldGhvZDp0aGlzLm1ldGhvZCx1cmw6dGhpcy51cmwsZGF0YTp0aGlzLl9kYXRhLGhlYWRlcnM6dGhpcy5faGVhZGVyfX0sUmVxdWVzdEJhc2UucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24odCl7Y29uc3QgZT1pc09iamVjdCh0KTtsZXQgcz10aGlzLl9oZWFkZXJbXCJjb250ZW50LXR5cGVcIl07aWYodGhpcy5fZm9ybURhdGEpdGhyb3cgbmV3IEVycm9yKFwiLnNlbmQoKSBjYW4ndCBiZSB1c2VkIGlmIC5hdHRhY2goKSBvciAuZmllbGQoKSBpcyB1c2VkLiBQbGVhc2UgdXNlIG9ubHkgLnNlbmQoKSBvciBvbmx5IC5maWVsZCgpICYgLmF0dGFjaCgpXCIpO2lmKGUmJiF0aGlzLl9kYXRhKUFycmF5LmlzQXJyYXkodCk/dGhpcy5fZGF0YT1bXTp0aGlzLl9pc0hvc3QodCl8fCh0aGlzLl9kYXRhPXt9KTtlbHNlIGlmKHQmJnRoaXMuX2RhdGEmJnRoaXMuX2lzSG9zdCh0aGlzLl9kYXRhKSl0aHJvdyBFcnJvcihcIkNhbid0IG1lcmdlIHRoZXNlIHNlbmQgY2FsbHNcIik7aWYoZSYmaXNPYmplY3QodGhpcy5fZGF0YSkpZm9yKGNvbnN0IGUgaW4gdCl0aGlzLl9kYXRhW2VdPXRbZV07ZWxzZVwic3RyaW5nXCI9PXR5cGVvZiB0PyhzfHx0aGlzLnR5cGUoXCJmb3JtXCIpLHM9dGhpcy5faGVhZGVyW1wiY29udGVudC10eXBlXCJdLHRoaXMuX2RhdGE9XCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIj09cz90aGlzLl9kYXRhP2Ake3RoaXMuX2RhdGF9JiR7dH1gOnQ6KHRoaXMuX2RhdGF8fFwiXCIpK3QpOnRoaXMuX2RhdGE9dDtyZXR1cm4hZXx8dGhpcy5faXNIb3N0KHQpP3RoaXM6KHN8fHRoaXMudHlwZShcImpzb25cIiksdGhpcyl9LFJlcXVlc3RCYXNlLnByb3RvdHlwZS5zb3J0UXVlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3NvcnQ9dm9pZCAwPT09dHx8dCx0aGlzfSxSZXF1ZXN0QmFzZS5wcm90b3R5cGUuX2ZpbmFsaXplUXVlcnlTdHJpbmc9ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMuX3F1ZXJ5LmpvaW4oXCImXCIpO2lmKHQmJih0aGlzLnVybCs9KHRoaXMudXJsLmluZGV4T2YoXCI/XCIpPj0wP1wiJlwiOlwiP1wiKSt0KSx0aGlzLl9xdWVyeS5sZW5ndGg9MCx0aGlzLl9zb3J0KXtjb25zdCB0PXRoaXMudXJsLmluZGV4T2YoXCI/XCIpO2lmKHQ+PTApe2NvbnN0IGU9dGhpcy51cmwuc3Vic3RyaW5nKHQrMSkuc3BsaXQoXCImXCIpO1wiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuX3NvcnQ/ZS5zb3J0KHRoaXMuX3NvcnQpOmUuc29ydCgpLHRoaXMudXJsPXRoaXMudXJsLnN1YnN0cmluZygwLHQpK1wiP1wiK2Uuam9pbihcIiZcIil9fX0sUmVxdWVzdEJhc2UucHJvdG90eXBlLl9hcHBlbmRRdWVyeVN0cmluZz0oKCk9Pntjb25zb2xlLnRyYWNlKFwiVW5zdXBwb3J0ZWRcIil9KSxSZXF1ZXN0QmFzZS5wcm90b3R5cGUuX3RpbWVvdXRFcnJvcj1mdW5jdGlvbih0LGUscyl7aWYodGhpcy5fYWJvcnRlZClyZXR1cm47Y29uc3QgaT1uZXcgRXJyb3IoYCR7dCtlfW1zIGV4Y2VlZGVkYCk7aS50aW1lb3V0PWUsaS5jb2RlPVwiRUNPTk5BQk9SVEVEXCIsaS5lcnJubz1zLHRoaXMudGltZWRvdXQ9ITAsdGhpcy5hYm9ydCgpLHRoaXMuY2FsbGJhY2soaSl9LFJlcXVlc3RCYXNlLnByb3RvdHlwZS5fc2V0VGltZW91dHM9ZnVuY3Rpb24oKXtjb25zdCB0PXRoaXM7dGhpcy5fdGltZW91dCYmIXRoaXMuX3RpbWVyJiYodGhpcy5fdGltZXI9c2V0VGltZW91dCgoKT0+e3QuX3RpbWVvdXRFcnJvcihcIlRpbWVvdXQgb2YgXCIsdC5fdGltZW91dCxcIkVUSU1FXCIpfSx0aGlzLl90aW1lb3V0KSksdGhpcy5fcmVzcG9uc2VUaW1lb3V0JiYhdGhpcy5fcmVzcG9uc2VUaW1lb3V0VGltZXImJih0aGlzLl9yZXNwb25zZVRpbWVvdXRUaW1lcj1zZXRUaW1lb3V0KCgpPT57dC5fdGltZW91dEVycm9yKFwiUmVzcG9uc2UgdGltZW91dCBvZiBcIix0Ll9yZXNwb25zZVRpbWVvdXQsXCJFVElNRURPVVRcIil9LHRoaXMuX3Jlc3BvbnNlVGltZW91dCkpfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkluSmxjWFZsYzNRdFltRnpaUzVxY3lKZExDSnVZVzFsY3lJNld5SnBjMDlpYW1WamRDSXNJbkpsY1hWcGNtVWlMQ0pTWlhGMVpYTjBRbUZ6WlNJc0ltOWlhaUlzSW0xcGVHbHVJaXdpYTJWNUlpd2ljSEp2ZEc5MGVYQmxJaXdpYlc5a2RXeGxJaXdpWlhod2IzSjBjeUlzSW1Oc1pXRnlWR2x0Wlc5MWRDSXNJblJvYVhNaUxDSmZkR2x0WlhJaUxDSmZjbVZ6Y0c5dWMyVlVhVzFsYjNWMFZHbHRaWElpTENKd1lYSnpaU0lzSW1adUlpd2lYM0JoY25ObGNpSXNJbkpsYzNCdmJuTmxWSGx3WlNJc0luWmhiQ0lzSWw5eVpYTndiMjV6WlZSNWNHVWlMQ0p6WlhKcFlXeHBlbVVpTENKZmMyVnlhV0ZzYVhwbGNpSXNJblJwYldWdmRYUWlMQ0p2Y0hScGIyNXpJaXdpWDNScGJXVnZkWFFpTENKZmNtVnpjRzl1YzJWVWFXMWxiM1YwSWl3aWIzQjBhVzl1SWl3aVpHVmhaR3hwYm1VaUxDSnlaWE53YjI1elpTSXNJbU52Ym5OdmJHVWlMQ0ozWVhKdUlpd2ljbVYwY25raUxDSmpiM1Z1ZENJc0ltRnlaM1Z0Wlc1MGN5SXNJbXhsYm1kMGFDSXNJbDl0WVhoU1pYUnlhV1Z6SWl3aVgzSmxkSEpwWlhNaUxDSmZjbVYwY25sRFlXeHNZbUZqYXlJc0lrVlNVazlTWDBOUFJFVlRJaXdpWDNOb2IzVnNaRkpsZEhKNUlpd2laWEp5SWl3aWNtVnpJaXdpYjNabGNuSnBaR1VpTENKbElpd2laWEp5YjNJaUxDSnpkR0YwZFhNaUxDSmpiMlJsSWl3aWFXNWtaWGhQWmlJc0ltTnliM056Ukc5dFlXbHVJaXdpWDNKbGRISjVJaXdpY21WeElpd2ljbVZ4ZFdWemRDSXNJbDloWW05eWRHVmtJaXdpZEdsdFpXUnZkWFFpTENKZlpXNWtJaXdpZEdobGJpSXNJbkpsYzI5c2RtVWlMQ0p5WldwbFkzUWlMQ0pmWm5Wc2JHWnBiR3hsWkZCeWIyMXBjMlVpTENKelpXeG1JaXdpWDJWdVpFTmhiR3hsWkNJc0lsQnliMjFwYzJVaUxDSnBibTVsY2xKbGMyOXNkbVVpTENKcGJtNWxjbEpsYW1WamRDSXNJbTl1SWl3aVJYSnliM0lpTENKdFpYUm9iMlFpTENKMWNtd2lMQ0psYm1RaUxDSmpZaUlzSW5WdVpHVm1hVzVsWkNJc0luVnpaU0lzSW05cklpd2lYMjlyUTJGc2JHSmhZMnNpTENKZmFYTlNaWE53YjI1elpVOUxJaXdpWjJWMElpd2labWxsYkdRaUxDSmZhR1ZoWkdWeUlpd2lkRzlNYjNkbGNrTmhjMlVpTENKblpYUklaV0ZrWlhJaUxDSnpaWFFpTENKb1pXRmtaWElpTENKMWJuTmxkQ0lzSW01aGJXVWlMQ0pmWkdGMFlTSXNJa0Z5Y21GNUlpd2lhWE5CY25KaGVTSXNJbWtpTENKZloyVjBSbTl5YlVSaGRHRWlMQ0poY0hCbGJtUWlMQ0poWW05eWRDSXNJbmhvY2lJc0ltVnRhWFFpTENKZllYVjBhQ0lzSW5WelpYSWlMQ0p3WVhOeklpd2lZbUZ6WlRZMFJXNWpiMlJsY2lJc0luUjVjR1VpTENKMWMyVnlibUZ0WlNJc0luQmhjM04zYjNKa0lpd2lkMmwwYUVOeVpXUmxiblJwWVd4eklpd2lYM2RwZEdoRGNtVmtaVzUwYVdGc2N5SXNJbkpsWkdseVpXTjBjeUlzSW00aUxDSmZiV0Y0VW1Wa2FYSmxZM1J6SWl3aWJXRjRVbVZ6Y0c5dWMyVlRhWHBsSWl3aVZIbHdaVVZ5Y205eUlpd2lYMjFoZUZKbGMzQnZibk5sVTJsNlpTSXNJblJ2U2xOUFRpSXNJbVJoZEdFaUxDSm9aV0ZrWlhKeklpd2ljMlZ1WkNJc0ltbHpUMkpxSWl3aVgyWnZjbTFFWVhSaElpd2lYMmx6U0c5emRDSXNJbk52Y25SUmRXVnllU0lzSW5OdmNuUWlMQ0pmYzI5eWRDSXNJbDltYVc1aGJHbDZaVkYxWlhKNVUzUnlhVzVuSWl3aWNYVmxjbmtpTENKZmNYVmxjbmtpTENKcWIybHVJaXdpYVc1a1pYZ2lMQ0p4ZFdWeWVVRnljaUlzSW5OMVluTjBjbWx1WnlJc0luTndiR2wwSWl3aVgyRndjR1Z1WkZGMVpYSjVVM1J5YVc1bklpd2lkSEpoWTJVaUxDSmZkR2x0Wlc5MWRFVnljbTl5SWl3aWNtVmhjMjl1SWl3aVpYSnlibThpTENKallXeHNZbUZqYXlJc0lsOXpaWFJVYVcxbGIzVjBjeUlzSW5ObGRGUnBiV1Z2ZFhRaVhTd2liV0Z3Y0dsdVozTWlPaUpCUVVGQkxHRkJTMEVzVFVGQlRVRXNVMEZCVjBNc1VVRkJVU3hsUVdONlFpeFRRVUZUUXl4WlFVRlpReXhIUVVOdVFpeEhRVUZKUVN4RlFVRkxMRTlCUVU5RExFMUJRVTFFTEVkQlYzaENMRk5CUVZORExFMUJRVTFFTEVkQlEySXNTVUZCU3l4TlFVRk5SU3hMUVVGUFNDeFpRVUZaU1N4VlFVTTFRa2dzUlVGQlNVVXNSMEZCVDBnc1dVRkJXVWtzVlVGQlZVUXNSMEZGYmtNc1QwRkJUMFlzUlVGNFFsUkpMRTlCUVU5RExGRkJRVlZPTEZsQmEwTnFRa0VzV1VGQldVa3NWVUZCVlVjc1lVRkJaU3hYUVV0dVF5eFBRVXBCUVN4aFFVRmhReXhMUVVGTFF5eFJRVU5zUWtZc1lVRkJZVU1zUzBGQlMwVXNPRUpCUTFoR0xFdEJRVXRETEdOQlEweEVMRXRCUVV0RkxITkNRVU5NUml4TlFWbFVVaXhaUVVGWlNTeFZRVUZWVHl4TlFVRlJMRk5CUVdWRExFZEJSVE5ETEU5QlJFRktMRXRCUVV0TExGRkJRVlZFTEVWQlExSktMRTFCY1VKVVVpeFpRVUZaU1N4VlFVRlZWU3hoUVVGbExGTkJRVk5ETEVkQlJUVkRMRTlCUkVGUUxFdEJRVXRSTEdOQlFXZENSQ3hGUVVOa1VDeE5RVmxVVWl4WlFVRlpTU3hWUVVGVllTeFZRVUZaTEZOQlFXMUNUQ3hIUVVWdVJDeFBRVVJCU2l4TFFVRkxWU3haUVVGalRpeEZRVU5hU2l4TlFXZENWRklzV1VGQldVa3NWVUZCVldVc1VVRkJWU3hUUVVGcFFrTXNSMEZETDBNc1NVRkJTMEVzUjBGQlZ5eHBRa0ZCYjBKQkxFVkJSMnhETEU5QlJrRmFMRXRCUVV0aExGTkJRVmRFTEVWQlEyaENXaXhMUVVGTFl5eHBRa0ZCYlVJc1JVRkRha0prTEV0QlIxUXNTVUZCU1N4TlFVRk5aU3hMUVVGVlNDeEZRVU5zUWl4UFFVRlBSeXhIUVVOTUxFbEJRVXNzVjBGRFNHWXNTMEZCUzJFc1UwRkJWMFFzUlVGQlVVa3NVMEZEZUVJc1RVRkRSaXhKUVVGTExGZEJRMGhvUWl4TFFVRkxZeXhwUWtGQmJVSkdMRVZCUVZGTExGTkJRMmhETEUxQlEwWXNVVUZEUlVNc1VVRkJVVU1zUzBGQlN5eDVRa0ZCTUVKS0xFZEJSemRETEU5QlFVOW1MRTFCWTFSU0xGbEJRVmxKTEZWQlFWVjNRaXhOUVVGUkxGTkJRV1ZETEVWQlFVOXFRaXhIUVU5c1JDeFBRVXg1UWl4SlFVRnlRbXRDTEZWQlFWVkRMRk5CUVRCQ0xFbEJRVlpHTEVsQlFXZENRU3hGUVVGUkxFZEJRMnhFUVN4SFFVRlRMRWxCUVVkQkxFVkJRVkVzUjBGRGVFSnlRaXhMUVVGTGQwSXNXVUZCWTBnc1JVRkRia0p5UWl4TFFVRkxlVUlzVTBGQlZ5eEZRVU5vUW5wQ0xFdEJRVXN3UWl4bFFVRnBRblJDTEVWQlEyWktMRTFCUjFRc1RVRkJUVEpDTEZsQlFXTXNRMEZEYkVJc1lVRkRRU3haUVVOQkxGbEJRMEVzYlVKQlYwWnVReXhaUVVGWlNTeFZRVUZWWjBNc1lVRkJaU3hUUVVGVFF5eEZRVUZMUXl4SFFVTnFSQ3hKUVVGTE9VSXNTMEZCUzNkQ0xHRkJRV1Y0UWl4TFFVRkxlVUlzV1VGQlkzcENMRXRCUVV0M1FpeFpRVU12UXl4UFFVRlBMRVZCUlZRc1IwRkJTWGhDTEV0QlFVc3dRaXhsUVVOUUxFbEJRMFVzVFVGQlRVc3NSVUZCVnk5Q0xFdEJRVXN3UWl4bFFVRmxSeXhGUVVGTFF5eEhRVU14UXl4SlFVRnBRaXhKUVVGaVF5eEZRVUZ0UWl4UFFVRlBMRVZCUXpsQ0xFbEJRV2xDTEVsQlFXSkJMRVZCUVc5Q0xFOUJRVThzUlVGRkwwSXNUVUZCVFVNc1IwRkRUbVFzVVVGQlVXVXNUVUZCVFVRc1IwRkhiRUlzUjBGQlNVWXNSMEZCVDBFc1JVRkJTVWtzVVVGQlZVb3NSVUZCU1Vrc1VVRkJWU3hMUVVGeFFpeExRVUZrU2l4RlFVRkpTU3hQUVVGbExFOUJRVThzUlVGRGVFVXNSMEZCU1V3c1JVRkJTeXhEUVVOUUxFZEJRVWxCTEVWQlFVbE5MRTlCUVZOU0xGbEJRVmxUTEZGQlFWRlFMRVZCUVVsTkxFMUJRVThzVDBGQlR5eEZRVVYyUkN4SFFVRkpUaXhGUVVGSmJFSXNVMEZCZFVJc1owSkJRVnByUWl4RlFVRkpUU3hMUVVGM1FpeFBRVUZQTEVWQlEzUkVMRWRCUVVsT0xFVkJRVWxSTEZsQlFXRXNUMEZCVHl4RlFVVTVRaXhQUVVGUExFZEJWVlEzUXl4WlFVRlpTU3hWUVVGVk1FTXNUMEZCVXl4WFFXRTNRaXhQUVZoQmRFTXNTMEZCUzBRc1pVRkhSRU1zUzBGQlMzVkRMRTFCUTFCMlF5eExRVUZMZFVNc1NVRkJUU3hMUVVOWWRrTXNTMEZCUzNWRExFbEJRVTEyUXl4TFFVRkxkME1zVjBGSGJFSjRReXhMUVVGTGVVTXNWVUZCVnl4RlFVTm9RbnBETEV0QlFVc3dReXhWUVVGWExFVkJSVlF4UXl4TFFVRkxNa01zVVVGWFpHNUVMRmxCUVZsSkxGVkJRVlZuUkN4TFFVRlBMRk5CUVdORExFVkJRVk5ETEVkQlEyeEVMRWxCUVVzNVF5eExRVUZMSzBNc2JVSkJRVzlDTEVOQlF6VkNMRTFCUVUxRExFVkJRVTlvUkN4TFFVTlVRU3hMUVVGTGFVUXNXVUZEVUM5Q0xGRkJRVkZETEV0QlFVc3NhMGxCUldadVFpeExRVUZMSzBNc2JVSkJRWEZDTEVsQlFVbEhMRkZCUVZFc1EwRkJRME1zUlVGQlkwTXNTMEZEYmtSS0xFVkJRVXRMTEVkQlFVY3NVVUZCVTBRc1IwRkRha0pLTEVWQlFVdExMRWRCUVVjc1VVRkJVeXhMUVVObUxFMUJRVTE0UWl4RlFVRk5MRWxCUVVsNVFpeE5RVUZOTEZkQlEzUkNla0lzUlVGQlNVMHNTMEZCVHl4VlFVTllUaXhGUVVGSlN5eFBRVUZUYkVNc1MwRkJTMnRETEU5QlEyeENUQ3hGUVVGSk1FSXNUMEZCVTNaRUxFdEJRVXQxUkN4UFFVTnNRakZDTEVWQlFVa3lRaXhKUVVGTmVFUXNTMEZCUzNkRUxFbEJRMlpLTEVWQlFWbDJRaXhMUVVWa2JVSXNSVUZCUzFNc1NVRkJTU3hEUVVGRE5VSXNSVUZCUzBNc1MwRkRWRVFzUlVGQlMzVkNMRVZCUVZsMlFpeEhRVU5vUW5OQ0xFVkJRV0Z5UWl4UFFVbDRRaXhQUVVGUE9VSXNTMEZCU3l0RExHMUNRVUZ0UWtnc1MwRkJTME1zUlVGQlUwTXNTVUZITDBOMFJDeFpRVUZaU1N4VlFVRnBRaXhOUVVGSkxGTkJRVk00UkN4SFFVTjRReXhQUVVGUE1VUXNTMEZCU3pSRExGVkJRVXRsTEVWQlFWZEVMRWxCVHpsQ2JFVXNXVUZCV1Vrc1ZVRkJWV2RGTEVsQlFVMHNVMEZCWVhoRUxFZEJSWFpETEU5QlJFRkJMRVZCUVVkS0xFMUJRMGxCTEUxQlIxUlNMRmxCUVZsSkxGVkJRVlZwUlN4SFFVRkxMRk5CUVZOSUxFZEJRMnhETEVkQlFVa3NiVUpCUVhOQ1FTeEZRVUZKTEUxQlFVMUtMRTFCUVUwc2NVSkJSVEZETEU5QlJFRjBSQ3hMUVVGTE9FUXNXVUZCWTBvc1JVRkRXakZFTEUxQlIxUlNMRmxCUVZsSkxGVkJRVlZ0UlN4alFVRm5RaXhUUVVGVGFrTXNSMEZETjBNc1VVRkJTMEVzU1VGSlJEbENMRXRCUVVzNFJDeFpRVU5CT1VRc1MwRkJTemhFTEZsQlFWbG9ReXhIUVVkdVFrRXNSVUZCU1Vrc1VVRkJWU3hMUVVGUFNpeEZRVUZKU1N4UFFVRlRMRTFCV1RORE1VTXNXVUZCV1Vrc1ZVRkJWVzlGTEVsQlFVMHNVMEZCVTBNc1IwRkRia01zVDBGQlQycEZMRXRCUVV0clJTeFJRVUZSUkN4RlFVRk5SU3huUWtGbE5VSXpSU3haUVVGWlNTeFZRVUZWZDBVc1ZVRkJXVFZGTEZsQlFWbEpMRlZCUVZWdlJTeEpRWFZDZUVSNFJTeFpRVUZaU1N4VlFVRlZlVVVzU1VGQlRTeFRRVUZUU2l4RlFVRlBNVVFzUjBGRE1VTXNSMEZCU1dwQ0xGTkJRVk15UlN4SFFVRlJMRU5CUTI1Q0xFbEJRVXNzVFVGQlRYUkZMRXRCUVU5elJTeEZRVU5vUW1wRkxFdEJRVXR4UlN4SlFVRkpNVVVzUlVGQlMzTkZMRVZCUVUxMFJTeEpRVVYwUWl4UFFVRlBTeXhMUVVsVUxFOUJSa0ZCTEV0QlFVdHJSU3hSUVVGUlJDeEZRVUZOUlN4bFFVRnBRalZFTEVWQlEzQkRVQ3hMUVVGTGMwVXNUMEZCVDB3c1IwRkJVekZFTEVWQlEyUlFMRTFCWlZSU0xGbEJRVmxKTEZWQlFWVXlSU3hOUVVGUkxGTkJRVk5PTEVkQlIzSkRMR05CUms5cVJTeExRVUZMYTBVc1VVRkJVVVFzUlVGQlRVVXNjMEpCUTI1Q2JrVXNTMEZCUzNORkxFOUJRVTlNTEVkQlExcHFSU3hOUVhOQ1ZGSXNXVUZCV1Vrc1ZVRkJWWEZGTEUxQlFWRXNVMEZCVTA4c1JVRkJUV3BGTEVkQlJUTkRMRWRCUVVrc1RVRkJVMmxGTEVWQlExZ3NUVUZCVFN4SlFVRkpiRUlzVFVGQlRTd3lRMEZIYkVJc1IwRkJTWFJFTEV0QlFVdDVSU3hOUVVOUUxFMUJRVTBzU1VGQlNXNUNMRTFCUVUwc2JVZEJSMnhDTEVkQlFVbG9SU3hUUVVGVGEwWXNSMEZCVHl4RFFVTnNRaXhKUVVGTExFMUJRVTAzUlN4TFFVRlBOa1VzUlVGRGFFSjRSU3hMUVVGTGFVVXNUVUZCVFhSRkxFVkJRVXMyUlN4RlFVRkxOMFVzU1VGRmRrSXNUMEZCVDBzc1MwRkhWQ3hIUVVGSk1FVXNUVUZCVFVNc1VVRkJVWEJGTEVkQlFVMHNRMEZEZEVJc1NVRkJTeXhOUVVGTmNVVXNTMEZCUzNKRkxFVkJRMlJRTEV0QlFVdHBSU3hOUVVGTlR5eEZRVUZOYWtVc1JVRkJTWEZGTEVsQlJYWkNMRTlCUVU4MVJTeExRVWxVTEVkQlFVa3NUVUZCVTA4c1JVRkRXQ3hOUVVGTkxFbEJRVWtyUXl4TlFVRk5MREJEUVUxc1FpeE5RVXBKTEd0Q1FVRnhRaTlETEVsQlEzWkNRU3hGUVVGTkxFZEJRVXRCTEVkQlJXSlFMRXRCUVVzMlJTeGxRVUZsUXl4UFFVRlBUaXhGUVVGTmFrVXNSMEZETVVKUUxFMUJVMVJTTEZsQlFWbEpMRlZCUVZWdFJpeE5RVUZSTEZkQlF6VkNMRTlCUVVrdlJTeExRVUZMZVVNc1UwRkRRWHBETEUxQlJWUkJMRXRCUVV0NVF5eFZRVUZYTEVWQlEyaENla01zUzBGQlMyZEdMRXRCUVU5b1JpeExRVUZMWjBZc1NVRkJTVVFzVVVGRGNrSXZSU3hMUVVGTGRVTXNTMEZCVDNaRExFdEJRVXQxUXl4SlFVRkpkME1zVVVGRGNrSXZSU3hMUVVGTFJDeGxRVU5NUXl4TFFVRkxhVVlzUzBGQlN5eFRRVU5JYWtZc1QwRkhWRklzV1VGQldVa3NWVUZCVlhOR0xFMUJRVkVzVTBGQlUwTXNSVUZCVFVNc1JVRkJUWGhGTEVWQlFWTjVSU3hIUVVNeFJDeFBRVUZSZWtVc1JVRkJVVEJGTEUxQlEyUXNTVUZCU3l4UlFVTklkRVlzUzBGQlMzRkZMRWxCUVVrc2VVSkJRVEJDWjBJc1MwRkJhVUpHTEV0QlFWRkRMRkZCUXpWRUxFMUJSVVlzU1VGQlN5eFBRVU5JY0VZc1MwRkJTM1ZHTEZOQlFWZEtMRVZCUTJoQ2JrWXNTMEZCUzNkR0xGTkJRVmRLTEVWQlEyaENMRTFCUlVZc1NVRkJTeXhUUVVOSWNFWXNTMEZCUzNGRkxFbEJRVWtzTUVKQlFUSkNZeXhMUVVkNFF5eFBRVUZQYmtZc1RVRmpWRklzV1VGQldVa3NWVUZCVlRaR0xHZENRVUZyUWl4VFFVRlRjRU1zUjBGSkwwTXNUMEZHVlUwc1RVRkJUazRzU1VGQmFVSkJMRWRCUVVzc1IwRkRNVUp5UkN4TFFVRkxNRVlzYVVKQlFXMUNja01zUlVGRGFrSnlSQ3hOUVZkVVVpeFpRVUZaU1N4VlFVRlZLMFlzVlVGQldTeFRRVUZUUXl4SFFVVjZReXhQUVVSQk5VWXNTMEZCU3paR0xHTkJRV2RDUkN4RlFVTmtOVVlzVFVGVlZGSXNXVUZCV1Vrc1ZVRkJWV3RITEdkQ1FVRnJRaXhUUVVGVFJpeEhRVU12UXl4SFFVRkpMR2xDUVVGdlFrRXNSVUZEZEVJc1RVRkJUVWNzVlVGQlZTeHZRa0ZIYkVJc1QwRkVRUzlHTEV0QlFVdG5SeXhwUWtGQmJVSktMRVZCUTJwQ05VWXNUVUZaVkZJc1dVRkJXVWtzVlVGQlZYRkhMRTlCUVZNc1YwRkROMElzVFVGQlR5eERRVU5NTVVNc1QwRkJVWFpFTEV0QlFVdDFSQ3hQUVVOaVF5eEpRVUZMZUVRc1MwRkJTM2RFTEVsQlExWXdReXhMUVVGTmJFY3NTMEZCUzNsRkxFMUJRMWd3UWl4UlFVRlRia2NzUzBGQlMydEZMRlZCTkVOc1FqRkZMRmxCUVZsSkxGVkJRVlYzUnl4TFFVRlBMRk5CUVZOR0xFZEJRM0JETEUxQlFVMUhMRVZCUVZFdlJ5eFRRVUZUTkVjc1IwRkRka0lzU1VGQlNWb3NSVUZCVDNSR0xFdEJRVXRyUlN4UlFVRlJMR2RDUVVWNFFpeEhRVUZKYkVVc1MwRkJTM05ITEZWQlExQXNUVUZCVFN4SlFVRkphRVFzVFVGQlRTeG5TRUZIYkVJc1IwRkJTU3RETEVsQlFWVnlSeXhMUVVGTGVVVXNUVUZEWWtNc1RVRkJUVU1zVVVGQlVYVkNMRWRCUTJoQ2JFY3NTMEZCUzNsRkxFMUJRVkVzUjBGRFNIcEZMRXRCUVV0MVJ5eFJRVUZSVEN4TFFVTjJRbXhITEV0QlFVdDVSU3hOUVVGUkxGTkJSVllzUjBGQlNYbENMRWRCUVZGc1J5eExRVUZMZVVVc1QwRkJVM3BGTEV0QlFVdDFSeXhSUVVGUmRrY3NTMEZCUzNsRkxFOUJRMnBFTEUxQlFVMXVRaXhOUVVGTkxHZERRVWxrTEVkQlFVa3JReXhIUVVGVEwwY3NVMEZCVTFVc1MwRkJTM2xGTEU5QlEzcENMRWxCUVVzc1RVRkJUVGxGTEV0QlFVOTFSeXhGUVVOb1FteEhMRXRCUVV0NVJTeE5RVUZOT1VVc1IwRkJUM1ZITEVWQlFVdDJSeXhQUVVWb1FpeHBRa0ZCYlVKMVJ5eEhRVVYyUWxvc1IwRkJUWFJHTEV0QlFVdHpSaXhMUVVGTExGRkJRM0pDUVN4RlFVRlBkRVlzUzBGQlMydEZMRkZCUVZFc1owSkJSV3hDYkVVc1MwRkJTM2xGTEUxQlJFZ3NjVU5CUVhWRFlTeEZRVU0xUW5SR0xFdEJRVXQ1UlN4VFFVTllla1VzUzBGQlMzbEZMRk5CUVZONVFpeEpRVU5xUWtFc1IwRkZWV3hITEV0QlFVdDVSU3hQUVVGVExFbEJRVTE1UWl4SFFVZHdRMnhITEV0QlFVdDVSU3hOUVVGUmVVSXNSVUZIWml4UFFVRkxSeXhIUVVGVGNrY3NTMEZCUzNWSExGRkJRVkZNTEVkQlEyeENiRWNzVFVGSlNuTkdMRWRCUVUxMFJpeExRVUZMYzBZc1MwRkJTeXhSUVVOa2RFWXNUMEVyUWxSU0xGbEJRVmxKTEZWQlFWVTBSeXhWUVVGWkxGTkJRVk5ETEVkQlIzcERMRTlCUkVGNlJ5eExRVUZMTUVjc1YwRkJkMElzU1VGQlZFUXNSMEZCT0VKQkxFVkJRek5EZWtjc1RVRlJWRklzV1VGQldVa3NWVUZCVlN0SExIRkNRVUYxUWl4WFFVTXpReXhOUVVGTlF5eEZRVUZSTlVjc1MwRkJTelpITEU5QlFVOURMRXRCUVVzc1MwRk5MMElzUjBGTVNVWXNTVUZEUmpWSExFdEJRVXQzUkN4TlFVRlJlRVFzUzBGQlMzZEVMRWxCUVVsd1FpeFJRVUZSTEUxQlFWRXNSVUZCU1N4SlFVRk5MRXRCUVU5M1JTeEhRVVY2UkRWSExFdEJRVXMyUnl4UFFVRlBkRVlzVDBGQlV5eEZRVVZxUW5aQ0xFdEJRVXN3Unl4TlFVRlBMRU5CUTJRc1RVRkJUVXNzUlVGQlVTOUhMRXRCUVV0M1JDeEpRVUZKY0VJc1VVRkJVU3hMUVVNdlFpeEhRVUZKTWtVc1IwRkJVeXhGUVVGSExFTkJRMlFzVFVGQlRVTXNSVUZCVjJoSUxFdEJRVXQzUkN4SlFVRkplVVFzVlVGQlZVWXNSVUZCVVN4SFFVRkhSeXhOUVVGTkxFdEJRMnBFTEcxQ1FVRnpRbXhJTEV0QlFVc3dSeXhOUVVNM1FrMHNSVUZCVTFBc1MwRkJTM3BITEV0QlFVc3dSeXhQUVVWdVFrMHNSVUZCVTFBc1QwRkZXSHBITEV0QlFVdDNSQ3hKUVVGTmVFUXNTMEZCUzNkRUxFbEJRVWw1UkN4VlFVRlZMRVZCUVVkR0xFZEJRVk1zU1VGQlRVTXNSVUZCVTBZc1MwRkJTeXhSUVUxd1JYUklMRmxCUVZsSkxGVkJRVlYxU0N4dFFrRkJjVUlzVFVGQlQycEhMRkZCUVZGclJ5eE5RVUZOTEdsQ1FWRm9SVFZJTEZsQlFWbEpMRlZCUVZWNVNDeGpRVUZuUWl4VFFVRlRReXhGUVVGUk0wY3NSVUZCVXpSSExFZEJRemxFTEVkQlFVbDJTQ3hMUVVGTGVVTXNVMEZEVUN4UFFVVkdMRTFCUVUxYUxFVkJRVTBzU1VGQlNYbENMRk5CUVZOblJTeEZRVUZUTTBjc1owSkJRMnhEYTBJc1JVRkJTV3hDTEZGQlFWVkJMRVZCUTJSclFpeEZRVUZKVFN4TFFVRlBMR1ZCUTFoT0xFVkJRVWt3Uml4TlFVRlJRU3hGUVVOYWRrZ3NTMEZCU3pCRExGVkJRVmNzUlVGRGFFSXhReXhMUVVGTEswVXNVVUZEVEM5RkxFdEJRVXQzU0N4VFFVRlRNMFlzU1VGSGFFSnlReXhaUVVGWlNTeFZRVUZWTmtnc1lVRkJaU3hYUVVOdVF5eE5RVUZOZWtVc1JVRkJUMmhFTEV0QlIxUkJMRXRCUVV0aExGZEJRV0ZpTEV0QlFVdERMRk5CUTNwQ1JDeExRVUZMUXl4UFFVRlRlVWdzVjBGQlZ5eExRVU4yUWpGRkxFVkJRVXR4UlN4alFVRmpMR05CUVdWeVJTeEZRVUZMYmtNc1UwRkJWU3hWUVVOb1JHSXNTMEZCUzJFc1YwRkhUbUlzUzBGQlMyTXNiVUpCUVhGQ1pDeExRVUZMUlN4M1FrRkRha05HTEV0QlFVdEZMSE5DUVVGM1FuZElMRmRCUVZjc1MwRkRkRU14UlN4RlFVRkxjVVVzWTBGQll5eDFRa0ZCZDBKeVJTeEZRVUZMYkVNc2FVSkJRV3RDTEdOQlEycEZaQ3hMUVVGTFl5SXNJbVpwYkdVaU9pSkZPbHhjVjI5eWEzTndZV05sWEZ4M2FXdHBZUzFwY3kxaGJuTjNaWEpsWkZ4Y2JtOWtaVjl0YjJSMWJHVnpYRnh6ZFhCbGNtRm5aVzUwWEZ4c2FXSmNYSEpsY1hWbGMzUXRZbUZ6WlM1cWN5SjkiLCJcInVzZSBzdHJpY3RcIjtjb25zdCB1dGlscz1yZXF1aXJlKFwiLi91dGlsc1wiKTtmdW5jdGlvbiBSZXNwb25zZUJhc2UodCl7aWYodClyZXR1cm4gbWl4aW4odCl9ZnVuY3Rpb24gbWl4aW4odCl7Zm9yKGNvbnN0IHMgaW4gUmVzcG9uc2VCYXNlLnByb3RvdHlwZSl0W3NdPVJlc3BvbnNlQmFzZS5wcm90b3R5cGVbc107cmV0dXJuIHR9bW9kdWxlLmV4cG9ydHM9UmVzcG9uc2VCYXNlLFJlc3BvbnNlQmFzZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmhlYWRlclt0LnRvTG93ZXJDYXNlKCldfSxSZXNwb25zZUJhc2UucHJvdG90eXBlLl9zZXRIZWFkZXJQcm9wZXJ0aWVzPWZ1bmN0aW9uKHQpe2NvbnN0IHM9dFtcImNvbnRlbnQtdHlwZVwiXXx8XCJcIjt0aGlzLnR5cGU9dXRpbHMudHlwZShzKTtjb25zdCBlPXV0aWxzLnBhcmFtcyhzKTtmb3IoY29uc3QgdCBpbiBlKXRoaXNbdF09ZVt0XTt0aGlzLmxpbmtzPXt9O3RyeXt0LmxpbmsmJih0aGlzLmxpbmtzPXV0aWxzLnBhcnNlTGlua3ModC5saW5rKSl9Y2F0Y2godCl7fX0sUmVzcG9uc2VCYXNlLnByb3RvdHlwZS5fc2V0U3RhdHVzUHJvcGVydGllcz1mdW5jdGlvbih0KXtjb25zdCBzPXQvMTAwfDA7dGhpcy5zdGF0dXM9dGhpcy5zdGF0dXNDb2RlPXQsdGhpcy5zdGF0dXNUeXBlPXMsdGhpcy5pbmZvPTE9PXMsdGhpcy5vaz0yPT1zLHRoaXMucmVkaXJlY3Q9Mz09cyx0aGlzLmNsaWVudEVycm9yPTQ9PXMsdGhpcy5zZXJ2ZXJFcnJvcj01PT1zLHRoaXMuZXJyb3I9KDQ9PXN8fDU9PXMpJiZ0aGlzLnRvRXJyb3IoKSx0aGlzLmNyZWF0ZWQ9MjAxPT10LHRoaXMuYWNjZXB0ZWQ9MjAyPT10LHRoaXMubm9Db250ZW50PTIwND09dCx0aGlzLmJhZFJlcXVlc3Q9NDAwPT10LHRoaXMudW5hdXRob3JpemVkPTQwMT09dCx0aGlzLm5vdEFjY2VwdGFibGU9NDA2PT10LHRoaXMuZm9yYmlkZGVuPTQwMz09dCx0aGlzLm5vdEZvdW5kPTQwND09dCx0aGlzLnVucHJvY2Vzc2FibGVFbnRpdHk9NDIyPT10fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkluSmxjM0J2Ym5ObExXSmhjMlV1YW5NaVhTd2libUZ0WlhNaU9sc2lkWFJwYkhNaUxDSnlaWEYxYVhKbElpd2lVbVZ6Y0c5dWMyVkNZWE5sSWl3aWIySnFJaXdpYldsNGFXNGlMQ0pyWlhraUxDSndjbTkwYjNSNWNHVWlMQ0p0YjJSMWJHVWlMQ0psZUhCdmNuUnpJaXdpWjJWMElpd2labWxsYkdRaUxDSjBhR2x6SWl3aWFHVmhaR1Z5SWl3aWRHOU1iM2RsY2tOaGMyVWlMQ0pmYzJWMFNHVmhaR1Z5VUhKdmNHVnlkR2xsY3lJc0ltTjBJaXdpZEhsd1pTSXNJbkJoY21GdGN5SXNJbXhwYm10eklpd2liR2x1YXlJc0luQmhjbk5sVEdsdWEzTWlMQ0psY25JaUxDSmZjMlYwVTNSaGRIVnpVSEp2Y0dWeWRHbGxjeUlzSW5OMFlYUjFjeUlzSW5OMFlYUjFjME52WkdVaUxDSnpkR0YwZFhOVWVYQmxJaXdpYVc1bWJ5SXNJbTlySWl3aWNtVmthWEpsWTNRaUxDSmpiR2xsYm5SRmNuSnZjaUlzSW5ObGNuWmxja1Z5Y205eUlpd2laWEp5YjNJaUxDSjBiMFZ5Y205eUlpd2lZM0psWVhSbFpDSXNJbUZqWTJWd2RHVmtJaXdpYm05RGIyNTBaVzUwSWl3aVltRmtVbVZ4ZFdWemRDSXNJblZ1WVhWMGFHOXlhWHBsWkNJc0ltNXZkRUZqWTJWd2RHRmliR1VpTENKbWIzSmlhV1JrWlc0aUxDSnViM1JHYjNWdVpDSXNJblZ1Y0hKdlkyVnpjMkZpYkdWRmJuUnBkSGtpWFN3aWJXRndjR2x1WjNNaU9pSkJRVUZCTEdGQlRVRXNUVUZCVFVFc1RVRkJVVU1zVVVGQlVTeFhRV04wUWl4VFFVRlRReXhoUVVGaFF5eEhRVU53UWl4SFFVRkpRU3hGUVVGTExFOUJRVTlETEUxQlFVMUVMRWRCVjNoQ0xGTkJRVk5ETEUxQlFVMUVMRWRCUTJJc1NVRkJTeXhOUVVGTlJTeExRVUZQU0N4aFFVRmhTU3hWUVVNM1FrZ3NSVUZCU1VVc1IwRkJUMGdzWVVGQllVa3NWVUZCVlVRc1IwRkZjRU1zVDBGQlQwWXNSVUY0UWxSSkxFOUJRVTlETEZGQlFWVk9MR0ZCYlVOcVFrRXNZVUZCWVVrc1ZVRkJWVWNzU1VGQlRTeFRRVUZUUXl4SFFVTndReXhQUVVGUFF5eExRVUZMUXl4UFFVRlBSaXhGUVVGTlJ5eG5Ra0ZsTTBKWUxHRkJRV0ZKTEZWQlFWVlJMSEZDUVVGMVFpeFRRVUZUUml4SFFVdHVSQ3hOUVVGTlJ5eEZRVUZMU0N4RlFVRlBMR2xDUVVGdFFpeEhRVU55UTBRc1MwRkJTMHNzUzBGQlQyaENMRTFCUVUxblFpeExRVUZMUkN4SFFVZDJRaXhOUVVGTlJTeEZRVUZUYWtJc1RVRkJUV2xDTEU5QlFVOUdMRWRCUXpWQ0xFbEJRVXNzVFVGQlRWWXNTMEZCVDFrc1JVRkJVVTRzUzBGQlMwNHNSMEZCVDFrc1JVRkJUMW9zUjBGRk4wTk5MRXRCUVV0UExFMUJRVkVzUjBGSFlpeEpRVU5SVGl4RlFVRlBUeXhQUVVOUVVpeExRVUZMVHl4TlFVRlJiRUlzVFVGQlRXOUNMRmRCUVZkU0xFVkJRVTlQTEU5QlJUTkRMRTFCUVU5RkxFMUJNRUppYmtJc1lVRkJZVWtzVlVGQlZXZENMSEZDUVVGMVFpeFRRVUZUUXl4SFFVTnVSQ3hOUVVGTlVDeEZRVUZQVHl4RlFVRlRMRWxCUVUwc1JVRkhOVUphTEV0QlFVdFpMRTlCUVZOYUxFdEJRVXRoTEZkQlFXRkVMRVZCUTJoRFdpeExRVUZMWXl4WFFVRmhWQ3hGUVVkc1Frd3NTMEZCUzJVc1MwRkJUeXhIUVVGTFZpeEZRVU5xUWt3c1MwRkJTMmRDTEVkQlFVc3NSMEZCUzFnc1JVRkRaa3dzUzBGQlMybENMRk5CUVZjc1IwRkJTMW9zUlVGRGNrSk1MRXRCUVV0clFpeFpRVUZqTEVkQlFVdGlMRVZCUTNoQ1RDeExRVUZMYlVJc1dVRkJZeXhIUVVGTFpDeEZRVU40UWt3c1MwRkJTMjlDTEU5QlFWTXNSMEZCUzJZc1IwRkJVU3hIUVVGTFFTeEpRVU14UWt3c1MwRkJTM0ZDTEZWQlNWaHlRaXhMUVVGTGMwSXNVVUZCVlN4TFFVRlBWaXhGUVVOMFFsb3NTMEZCUzNWQ0xGTkJRVmNzUzBGQlQxZ3NSVUZEZGtKYUxFdEJRVXQzUWl4VlFVRlpMRXRCUVU5YUxFVkJRM2hDV2l4TFFVRkxlVUlzVjBGQllTeExRVUZQWWl4RlFVTjZRbG9zUzBGQlN6QkNMR0ZCUVdVc1MwRkJUMlFzUlVGRE0wSmFMRXRCUVVzeVFpeGpRVUZuUWl4TFFVRlBaaXhGUVVNMVFsb3NTMEZCU3pSQ0xGVkJRVmtzUzBGQlQyaENMRVZCUTNoQ1dpeExRVUZMTmtJc1UwRkJWeXhMUVVGUGFrSXNSVUZEZGtKYUxFdEJRVXM0UWl4dlFrRkJjMElzUzBGQlQyeENJaXdpWm1sc1pTSTZJa1U2WEZ4WGIzSnJjM0JoWTJWY1hIZHBhMmxoTFdsekxXRnVjM2RsY21Wa1hGeHViMlJsWDIxdlpIVnNaWE5jWEhOMWNHVnlZV2RsYm5SY1hHeHBZbHhjY21WemNHOXVjMlV0WW1GelpTNXFjeUo5IiwiXCJ1c2Ugc3RyaWN0XCI7ZXhwb3J0cy50eXBlPShlPT5lLnNwbGl0KC8gKjsgKi8pLnNoaWZ0KCkpLGV4cG9ydHMucGFyYW1zPShlPT5lLnNwbGl0KC8gKjsgKi8pLnJlZHVjZSgoZSx0KT0+e2NvbnN0IHM9dC5zcGxpdCgvICo9ICovKSxpPXMuc2hpZnQoKSxyPXMuc2hpZnQoKTtyZXR1cm4gaSYmciYmKGVbaV09ciksZX0se30pKSxleHBvcnRzLnBhcnNlTGlua3M9KGU9PmUuc3BsaXQoLyAqLCAqLykucmVkdWNlKChlLHQpPT57Y29uc3Qgcz10LnNwbGl0KC8gKjsgKi8pLGk9c1swXS5zbGljZSgxLC0xKTtyZXR1cm4gZVtzWzFdLnNwbGl0KC8gKj0gKi8pWzFdLnNsaWNlKDEsLTEpXT1pLGV9LHt9KSksZXhwb3J0cy5jbGVhbkhlYWRlcj0oKGUsdCk9PihkZWxldGUgZVtcImNvbnRlbnQtdHlwZVwiXSxkZWxldGUgZVtcImNvbnRlbnQtbGVuZ3RoXCJdLGRlbGV0ZSBlW1widHJhbnNmZXItZW5jb2RpbmdcIl0sZGVsZXRlIGUuaG9zdCx0JiYoZGVsZXRlIGUuYXV0aG9yaXphdGlvbixkZWxldGUgZS5jb29raWUpLGUpKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkluVjBhV3h6TG1weklsMHNJbTVoYldWeklqcGJJbVY0Y0c5eWRITWlMQ0owZVhCbElpd2ljM1J5SWl3aWMzQnNhWFFpTENKemFHbG1kQ0lzSW5CaGNtRnRjeUlzSW5KbFpIVmpaU0lzSW05aWFpSXNJbkJoY25Seklpd2lhMlY1SWl3aWRtRnNJaXdpY0dGeWMyVk1hVzVyY3lJc0luVnliQ0lzSW5Oc2FXTmxJaXdpWTJ4bFlXNUlaV0ZrWlhJaUxDSm9aV0ZrWlhJaUxDSmphR0Z1WjJWelQzSnBaMmx1SWwwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4aFFWVkJRU3hSUVVGUlF5eExRVUZQUXl4RFFVRkJRU3hIUVVGUFFTeEZRVUZKUXl4TlFVRk5MRk5CUVZORExGTkJWWHBEU2l4UlFVRlJTeXhQUVVGVFNDeERRVUZCUVN4SFFVRlBRU3hGUVVGSlF5eE5RVUZOTEZOQlFWTkhMRTlCUVU4c1EwRkJRME1zUlVGQlMwd3NTMEZEZEVRc1RVRkJUVTBzUlVGQlVVNHNSVUZCU1VNc1RVRkJUU3hUUVVOc1FrMHNSVUZCVFVRc1JVRkJUVW9zVVVGRFdrMHNSVUZCVFVZc1JVRkJUVW9zVVVGSGJFSXNUMEZFU1Vzc1IwRkJUME1zU1VGQlMwZ3NSVUZCU1VVc1IwRkJUME1zUjBGRGNFSklMRWRCUTA0c1MwRlZTRkFzVVVGQlVWY3NWMEZCWVZRc1EwRkJRVUVzUjBGQlQwRXNSVUZCU1VNc1RVRkJUU3hUUVVGVFJ5eFBRVUZQTEVOQlFVTkRMRVZCUVV0TUxFdEJRekZFTEUxQlFVMU5MRVZCUVZGT0xFVkJRVWxETEUxQlFVMHNVMEZEYkVKVExFVkJRVTFLTEVWQlFVMHNSMEZCUjBzc1RVRkJUU3hIUVVGSkxFZEJSeTlDTEU5QlJFRk9MRVZCUkZsRExFVkJRVTBzUjBGQlIwd3NUVUZCVFN4VFFVRlRMRWRCUVVkVkxFMUJRVTBzUjBGQlNTeEpRVU4wUTBRc1JVRkRTa3dzUjBGRFRpeExRVlZJVUN4UlFVRlJZeXhaUVVGakxFVkJRVU5ETEVWQlFWRkRMRmxCUTNSQ1JDeEZRVUZQTEhWQ1FVTlFRU3hGUVVGUExIbENRVU5RUVN4RlFVRlBMRFJDUVVOUVFTeEZRVUZoTEV0QlJXaENReXhYUVVOTFJDeEZRVUZ6UWl4eFFrRkRkRUpCTEVWQlFXVXNVVUZGYWtKQklpd2labWxzWlNJNklrVTZYRnhYYjNKcmMzQmhZMlZjWEhkcGEybGhMV2x6TFdGdWMzZGxjbVZrWEZ4dWIyUmxYMjF2WkhWc1pYTmNYSE4xY0dWeVlXZGxiblJjWEd4cFlseGNkWFJwYkhNdWFuTWlmUT09IiwidmFyIHRvU3RyaW5nPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7c3dpdGNoKHRvU3RyaW5nLmNhbGwoZSkpe2Nhc2VcIltvYmplY3QgRnVuY3Rpb25dXCI6cmV0dXJuXCJmdW5jdGlvblwiO2Nhc2VcIltvYmplY3QgRGF0ZV1cIjpyZXR1cm5cImRhdGVcIjtjYXNlXCJbb2JqZWN0IFJlZ0V4cF1cIjpyZXR1cm5cInJlZ2V4cFwiO2Nhc2VcIltvYmplY3QgQXJndW1lbnRzXVwiOnJldHVyblwiYXJndW1lbnRzXCI7Y2FzZVwiW29iamVjdCBBcnJheV1cIjpyZXR1cm5cImFycmF5XCI7Y2FzZVwiW29iamVjdCBTdHJpbmddXCI6cmV0dXJuXCJzdHJpbmdcIn1pZihcIm9iamVjdFwiPT10eXBlb2YgZSYmZSYmXCJudW1iZXJcIj09dHlwZW9mIGUubGVuZ3RoKXRyeXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmNhbGxlZSlyZXR1cm5cImFyZ3VtZW50c1wifWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBUeXBlRXJyb3IpcmV0dXJuXCJhcmd1bWVudHNcIn1yZXR1cm4gbnVsbD09PWU/XCJudWxsXCI6dm9pZCAwPT09ZT9cInVuZGVmaW5lZFwiOmUmJjE9PT1lLm5vZGVUeXBlP1wiZWxlbWVudFwiOmU9PT1PYmplY3QoZSk/XCJvYmplY3RcIjp0eXBlb2YgZX07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbWx1WkdWNExtcHpJbDBzSW01aGJXVnpJanBiSW5SdlUzUnlhVzVuSWl3aVQySnFaV04wSWl3aWNISnZkRzkwZVhCbElpd2liVzlrZFd4bElpd2laWGh3YjNKMGN5SXNJblpoYkNJc0ltTmhiR3dpTENKc1pXNW5kR2dpTENKallXeHNaV1VpTENKbGVDSXNJbFI1Y0dWRmNuSnZjaUlzSW5WdVpHVm1hVzVsWkNJc0ltNXZaR1ZVZVhCbElsMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeEpRVUZKUVN4VFFVRlhReXhQUVVGUFF5eFZRVUZWUml4VFFVVm9RMGNzVDBGQlQwTXNVVUZCVlN4VFFVRlRReXhIUVVONFFpeFBRVUZSVEN4VFFVRlRUU3hMUVVGTFJDeEpRVU53UWl4SlFVRkxMRzlDUVVGeFFpeE5RVUZQTEZkQlEycERMRWxCUVVzc1owSkJRV2xDTEUxQlFVOHNUMEZETjBJc1NVRkJTeXhyUWtGQmJVSXNUVUZCVHl4VFFVTXZRaXhKUVVGTExIRkNRVUZ6UWl4TlFVRlBMRmxCUTJ4RExFbEJRVXNzYVVKQlFXdENMRTFCUVU4c1VVRkRPVUlzU1VGQlN5eHJRa0ZCYlVJc1RVRkJUeXhUUVVkcVF5eEhRVUZyUWl4cFFrRkJVRUVzUjBGQmJVSkJMRWRCUVRSQ0xHbENRVUZrUVN4RlFVRkpSU3hQUVVNNVF5eEpRVU5GTEVkQlFYbENMRzFDUVVGa1JpeEZRVUZKUnl4UFFVRnpRaXhOUVVGUExGbEJRelZETEUxQlFVOURMRWRCUTFBc1IwRkJTVUVzWVVGQlkwTXNWVUZEYUVJc1RVRkJUeXhaUVV0aUxFOUJRVmtzVDBGQlVrd3NSVUZCY1VJc1dVRkRZazBzU1VGQlVrNHNSVUZCTUVJc1dVRkRNVUpCTEVkQlFYZENMRWxCUVdwQ1FTeEZRVUZKVHl4VFFVRjFRaXhWUVVOc1ExQXNTVUZCVVVvc1QwRkJUMGtzUjBGQllTeG5Ra0ZGYkVKQklpd2labWxzWlNJNklrVTZYRngzYjNKcmMzQmhZMlZjWEhCaGJuUnZiV0YwYUMxamFHRjBZbTkwWEZ4dWIyUmxYMjF2WkhWc1pYTmNYSFI1Y0dVdGIyWmNYR2x1WkdWNExtcHpJbjA9IiwibW9kdWxlLmV4cG9ydHM9e2FyZWE6ITAsYmFzZTohMCxicjohMCxjb2w6ITAsZW1iZWQ6ITAsaHI6ITAsaW1nOiEwLGlucHV0OiEwLGtleWdlbjohMCxsaW5rOiEwLG1lbnVpdGVtOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLHdicjohMH07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJbWx1WkdWNExtcHpJbDBzSW01aGJXVnpJanBiSW0xdlpIVnNaU0lzSW1WNGNHOXlkSE1pTENKaGNtVmhJaXdpWW1GelpTSXNJbUp5SWl3aVkyOXNJaXdpWlcxaVpXUWlMQ0pvY2lJc0ltbHRaeUlzSW1sdWNIVjBJaXdpYTJWNVoyVnVJaXdpYkdsdWF5SXNJbTFsYm5WcGRHVnRJaXdpYldWMFlTSXNJbkJoY21GdElpd2ljMjkxY21ObElpd2lkSEpoWTJzaUxDSjNZbklpWFN3aWJXRndjR2x1WjNNaU9pSkJRVXRCUVN4UFFVRlBReXhSUVVGVkxFTkJRMlpETEUxQlFWRXNSVUZEVWtNc1RVRkJVU3hGUVVOU1F5eEpRVUZOTEVWQlEwNURMRXRCUVU4c1JVRkRVRU1zVDBGQlV5eEZRVU5VUXl4SlFVRk5MRVZCUTA1RExFdEJRVThzUlVGRFVFTXNUMEZCVXl4RlFVTlVReXhSUVVGVkxFVkJRMVpETEUxQlFWRXNSVUZEVWtNc1ZVRkJXU3hGUVVOYVF5eE5RVUZSTEVWQlExSkRMRTlCUVZNc1JVRkRWRU1zVVVGQlZTeEZRVU5XUXl4UFFVRlRMRVZCUTFSRExFdEJRVThpTENKbWFXeGxJam9pUlRwY1hGZHZjbXR6Y0dGalpWeGNkMmxyYVdFdGFYTXRZVzV6ZDJWeVpXUmNYRzV2WkdWZmJXOWtkV3hsYzF4Y2RtOXBaQzFsYkdWdFpXNTBjMXhjYVc1a1pYZ3Vhbk1pZlE9PSIsIlwidXNlIHN0cmljdFwiO2NvbnN0IHR5cGU9cmVxdWlyZShcInR5cGUtb2ZcIikscmVxdWVzdD1yZXF1aXJlKFwic3VwZXJhZ2VudFwiKSxoPXJlcXVpcmUoXCJoeXBlcnNjcmlwdC1zdHJpbmdcIiksJD1yZXF1aXJlKFwiZG9tdGFzdGljXCIpLHJpdmV0cz1yZXF1aXJlKFwicml2ZXRzXCIpOyQuZm4uY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mb3JFYWNoKGU9PntlLmlubmVySFRNTD1cIlwifSksdGhpc30sJC5mbi5vdXRlckhUTUw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wKFwib3V0ZXJIVE1MXCIpfTtjb25zdCBzdGF0ZT17bWVzc2FnZTpcIlwiLGtub3dsZWRnZTpbXSxjb252ZXJzYXRpb246W10sZXJyb3I6ITF9O2Z1bmN0aW9uIF9lcnJvcihlLHQse3Jlc3BvbnNlOnN9KXtzPXM/W3Muc3RhdHVzLHMudGV4dF06W10sY29uc29sZS53YXJuKGBbJHtlfSAke3R9XWAsLi4ucyl9ZnVuY3Rpb24gc2VuZF9tZXNzYWdlKGU9XCJcIix0KXtyZXF1ZXN0LnBvc3QoXCIvbWVzc2FnZVwiKS5zZW5kKGUpLnRoZW4oKHtib2R5OmV9KT0+e3N0YXRlLmNvbnZlcnNhdGlvbi5wdXNoKHt0ZXh0OmV9KX0sZT0+e19lcnJvcihcIlBPU1RcIixcIi9tZXNzYWdlXCIsZSksdCYmdCgpfSl9ZnVuY3Rpb24gX2NvbnN0KGUsdCxzKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6cyx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGV9c2VuZF9tZXNzYWdlKCksJChcIi5Db252ZXJzYXRpb24taW5wdXRcIikub24oXCJrZXlkb3duXCIsZT0+e2xldCB0PXN0YXRlLm1lc3NhZ2U7aWYoXCJFbnRlclwiPT1lLmNvZGUmJiFlLnNoaWZ0S2V5JiYhZS5hbHRLZXkmJiFlLmN0cmxLZXkpe2lmKFwiXCI9PXQpcmV0dXJuO3JldHVybiBzdGF0ZS5tZXNzYWdlPVwiXCIsc3RhdGUuY29udmVyc2F0aW9uLnB1c2goe3RleHQ6dC5zcGxpdCgvXFxzKltcXG5cXHJdK1xccyovZyksaXNfdXNlcjohMH0pLHNlbmRfbWVzc2FnZSh0LCgpPT57c3RhdGUuZXJyb3I9ITB9KSwhMX19KS5vbihcInBhc3RlXCIsZT0+e2UucHJldmVudERlZmF1bHQoKTtsZXQgdD1lLmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIik7cmV0dXJuIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5zZXJ0SFRNTFwiLCExLHQpLCExfSk7Y29uc3R7QmluZGluZzpCaW5kaW5nfT1yaXZldHMuXztyaXZldHMuXy5CaW5kaW5nPWNsYXNzIGV4dGVuZHMgQmluZGluZ3twYXJzZVRhcmdldCgpe3JldHVybiB0aGlzLmJpbmRlci5wYXJzZVRhcmdldCYmT2JqZWN0LmFzc2lnbih0aGlzLHRoaXMuYmluZGVyLnBhcnNlVGFyZ2V0KHRoaXMua2V5cGF0aCkpLHN1cGVyLnBhcnNlVGFyZ2V0KCl9cHVibGlzaCgpe19jb25zdCh0aGlzLFwic3RhdGVcIixcInB1Ymxpc2hcIik7c3VwZXIucHVibGlzaCgpO19jb25zdCh0aGlzLFwic3RhdGVcIil9fSxyaXZldHMuYmluZGVycy5pbnB1dD17cGFyc2VUYXJnZXQoZSl7bGV0IHQ7cmV0dXJuW2UsdF09ZS50cmltKCkuc3BsaXQoL1xccypcXD9cXHMqLykse2tleXBhdGg6ZSxlbXB0eV9jbGFzczp0fX0sYmluZDpmdW5jdGlvbihlKXt0aGlzLl9lbXB0eT0hMCwkKGUpLm9uKFwiaW5wdXQucnYtaW5wdXRcIix0aGlzLnB1Ymxpc2gpLHRoaXMuX3dhdGNoPSgoKT0+e2UuaW5uZXJIVE1MPVwiXCIsXCJcIj09ZS5pbm5lckhUTUwmJmNsZWFySW50ZXJ2YWwodGhpcy5fd2F0Y2hlcil9KX0sdW5iaW5kOmZ1bmN0aW9uKGUpeyQoZSkub2ZmKFwiLnJ2LWlucHV0XCIpLGNsZWFySW50ZXJ2YWwodGhpcy5fd2F0Y2hlcil9LHJvdXRpbmU6ZnVuY3Rpb24oZSx0KXtcInB1Ymxpc2hcIiE9dGhpcy5zdGF0ZSYmKGNsZWFySW50ZXJ2YWwodGhpcy5fd2F0Y2hlciksZS5pbm5lclRleHQ9dCksc3RhdGUuZXJyb3I9ITEsdGhpcy5fZW1wdHk9XCJcIj09dCx0aGlzLl9lbXB0eSYmKHRoaXMuX3dhdGNoZXI9c2V0SW50ZXJ2YWwodGhpcy5fd2F0Y2gsMzApKSx0aGlzLmVtcHR5X2NsYXNzJiYkKGUpLnRvZ2dsZUNsYXNzKHRoaXMuZW1wdHlfY2xhc3MsdGhpcy5fZW1wdHkpfSxnZXRWYWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lclRleHQudHJpbSgpfX0sZ2xvYmFsLiRzdGF0ZT1zdGF0ZSxyaXZldHMuYmluZChkb2N1bWVudC5ib2R5LHN0YXRlKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltRndjQzVxY3lKZExDSnVZVzFsY3lJNld5SjBlWEJsSWl3aWNtVnhkV2x5WlNJc0luSmxjWFZsYzNRaUxDSm9JaXdpSkNJc0luSnBkbVYwY3lJc0ltWnVJaXdpWTJ4bFlYSWlMQ0owYUdseklpd2labTl5UldGamFDSXNJbVVpTENKcGJtNWxja2hVVFV3aUxDSnZkWFJsY2toVVRVd2lMQ0p3Y205d0lpd2ljM1JoZEdVaUxDSnRaWE56WVdkbElpd2lhMjV2ZDJ4bFpHZGxJaXdpWTI5dWRtVnljMkYwYVc5dUlpd2laWEp5YjNJaUxDSmZaWEp5YjNJaUxDSnRaWFJvYjJRaUxDSjFjbXdpTENKeVpYTndiMjV6WlNJc0luSmxjeUlzSW5OMFlYUjFjeUlzSW5SbGVIUWlMQ0pqYjI1emIyeGxJaXdpZDJGeWJpSXNJbk5sYm1SZmJXVnpjMkZuWlNJc0ltTmlJaXdpY0c5emRDSXNJbk5sYm1RaUxDSjBhR1Z1SWl3aVltOWtlU0lzSW5CMWMyZ2lMQ0pmWTI5dWMzUWlMQ0p6Wld4bUlpd2lhMlY1SWl3aWRtRnNkV1VpTENKUFltcGxZM1FpTENKa1pXWnBibVZRY205d1pYSjBlU0lzSW5keWFYUmhZbXhsSWl3aVpXNTFiV1Z5WVdKc1pTSXNJbU52Ym1acFozVnlZV0pzWlNJc0ltOXVJaXdpWTI5a1pTSXNJbk5vYVdaMFMyVjVJaXdpWVd4MFMyVjVJaXdpWTNSeWJFdGxlU0lzSW5Od2JHbDBJaXdpYVhOZmRYTmxjaUlzSW5CeVpYWmxiblJFWldaaGRXeDBJaXdpWTJ4cGNHSnZZWEprUkdGMFlTSXNJbWRsZEVSaGRHRWlMQ0prYjJOMWJXVnVkQ0lzSW1WNFpXTkRiMjF0WVc1a0lpd2lRbWx1WkdsdVp5SXNJbDhpTENKYmIySnFaV04wSUU5aWFtVmpkRjBpTENKaWFXNWtaWElpTENKd1lYSnpaVlJoY21kbGRDSXNJbUZ6YzJsbmJpSXNJbXRsZVhCaGRHZ2lMQ0p6ZFhCbGNpSXNJbkIxWW14cGMyZ2lMQ0ppYVc1a1pYSnpJaXdpWlcxd2RIbGZZMnhoYzNNaUxDSjBjbWx0SWl3aVltbHVaQ0lzSW1Wc0lpd2lYMlZ0Y0hSNUlpd2lYM2RoZEdOb0lpd2lZMnhsWVhKSmJuUmxjblpoYkNJc0lsOTNZWFJqYUdWeUlpd2lkVzVpYVc1a0lpd2liMlptSWl3aWNtOTFkR2x1WlNJc0ltbHVibVZ5VkdWNGRDSXNJbk5sZEVsdWRHVnlkbUZzSWl3aWRHOW5aMnhsUTJ4aGMzTWlMQ0puWlhSV1lXeDFaU0lzSW1kc2IySmhiQ0lzSWlSemRHRjBaU0pkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzWVVGTlFTeE5RVUZOUVN4TFFVRlBReXhSUVVGUkxGZEJRMlpETEZGQlFWVkVMRkZCUVZFc1kwRkRiRUpGTEVWQlFVbEdMRkZCUVZFc2MwSkJRMXBITEVWQlFVbElMRkZCUVZFc1lVRkRXa2tzVDBGQlUwb3NVVUZCVVN4VlFVVjJRa2NzUlVGQlJVVXNSMEZCUjBNc1RVRkJVU3hYUVVsWUxFOUJTRUZETEV0QlFVdERMRkZCUVZORExFbEJRMXBCTEVWQlFVVkRMRlZCUVZrc1MwRkZWRWdzVFVGSFZFb3NSVUZCUlVVc1IwRkJSMDBzVlVGQldTeFhRVU5tTEU5QlFVOUtMRXRCUVV0TExFdEJRVXNzWTBGSGJrSXNUVUZCVFVNc1RVRkJVU3hEUVVOYVF5eFJRVUZUTEVkQlExUkRMRlZCUVZjc1IwRkRXRU1zWVVGQll5eEhRVU5rUXl4UFFVRlBMRWRCUjFRc1UwRkJVME1zVDBGQlQwTXNSVUZCVVVNc1IwRkJUME1zVTBGQlZVTXNTVUZEZGtOQkxFVkJRVTFCTEVWQlFVMHNRMEZCUTBFc1JVRkJTVU1zVDBGQlVVUXNSVUZCU1VVc1RVRkJVU3hIUVVOeVEwTXNVVUZCVVVNc1UwRkJVMUFzUzBGQlZVTXNVVUZCVjBVc1IwRkhlRU1zVTBGQlUwc3NZVUZCWVVnc1JVRkJTeXhIUVVGSlNTeEhRVU0zUWpOQ0xGRkJRVkUwUWl4TFFVRkxMRmxCUVZsRExFdEJRVXRPTEVkQlFVMVBMRXRCUVVzc1JVRkJSME1zUzBGQlFVRXNUVUZETVVOdVFpeE5RVUZOUnl4aFFVRmhhVUlzUzBGQlN5eERRVUZGVkN4TFFVRk5VU3hMUVVNNVFuWkNMRWxCUTBaVExFOUJRVThzVDBGQlVTeFhRVUZaVkN4SFFVTXpRbTFDTEVkQlFVMUJMRTFCTWtKV0xGTkJRVk5OTEU5QlFVOURMRVZCUVUxRExFVkJRVXRETEVkQlNYcENMRTlCU0VGRExFOUJRVTlETEdWQlFXVktMRVZCUVUxRExFVkJRVXNzUTBGREwwSkRMRTFCUVVGQkxFVkJRVTlITEZWQlFWVXNSVUZCVDBNc1dVRkJXU3hGUVVGTlF5eGpRVUZqTEVsQlJXNUVVQ3hGUVROQ1ZGSXNaVUZGUVhoQ0xFVkJRVVVzZFVKQlEwTjNReXhIUVVGSExGVkJRVmxzUXl4SlFVTmtMRWxCUVVsTExFVkJRVlZFTEUxQlFVMURMRkZCUTNCQ0xFZEJRV01zVTBGQlZrd3NSVUZCUlcxRExFOUJRVzlDYmtNc1JVRkJSVzlETEZkQlFXRndReXhGUVVGRmNVTXNVMEZCVjNKRExFVkJRVVZ6UXl4UlFVRlRMRU5CUXk5RUxFZEJRV1VzU1VGQldHcERMRVZCUTBZc1QwRk5SaXhQUVV4QlJDeE5RVUZOUXl4UlFVRlZMRWRCUTJoQ1JDeE5RVUZOUnl4aFFVRmhhVUlzUzBGQlN5eERRVUZGVkN4TFFVRk5WaXhGUVVGUmEwTXNUVUZCVFN4clFrRkJiVUpETEZOQlFWTXNTVUZETVVWMFFpeGhRVUZoWWl4RlFVRlRMRXRCUTNCQ1JDeE5RVUZOU1N4UFFVRlJMRXRCUlZRc1MwRkhWakJDTEVkQlFVY3NVVUZCVld4RExFbEJRMXBCTEVWQlFVVjVReXhwUWtGRFJpeEpRVUZKTVVJc1JVRkJUMllzUlVGQlJUQkRMR05CUVdORExGRkJRVkVzWTBGRmJrTXNUMEZFUVVNc1UwRkJVME1zV1VGQldTeGpRVUZqTEVWQlFVODVRaXhKUVVOdVF5eEpRVlZZTEUxQlFVMHJRaXhSUVVGRlFTeFRRVUZaYmtRc1QwRkJUMjlFTEVWQlF6TkNjRVFzVDBGQlQyOUVMRVZCUVVWRUxGRkJRVlVzWTBGQlkwRXNVVUZETDBKRkxHTkJTVVVzVDBGSVNXeEVMRXRCUVV0dFJDeFBRVUZQUXl4aFFVTmtja0lzVDBGQlQzTkNMRTlCUVU5eVJDeExRVUZOUVN4TFFVRkxiVVFzVDBGQlQwTXNXVUZCV1hCRUxFdEJRVXR6UkN4VlFVVTFRME1zVFVGQlRVZ3NZMEZIWmtZc1ZVRkRSWFpDTEU5QlFVOHpRaXhMUVVGTkxGRkJRVk1zVjBGRFduVkVMRTFCUVUxRExGVkJRMmhDTjBJc1QwRkJUek5DTEV0QlFVMHNWMEZKYWtKSUxFOUJRVTgwUkN4UlFVRmxMRTFCUVVrc1EwRkRlRUpRTEZsQlFWbEpMRWRCUTFZc1NVRkJTVWtzUlVGRlNpeFBRVVJEU2l4RlFVRlRTU3hIUVVGbFNpeEZRVUZSU3l4UFFVRlBiRUlzVFVGQlRTeFpRVU4yUXl4RFFVRkZZU3hSUVVGQlFTeEZRVUZUU1N4WlFVRkJRU3hKUVVkd1FrVXNTMEZCVFN4VFFVRlRReXhIUVVOaU4wUXNTMEZCU3poRUxGRkJRVk1zUlVGRFpHeEZMRVZCUVVWcFJTeEhRVUZKZWtJc1IwRkJSeXhwUWtGQmEwSndReXhMUVVGTGQwUXNVMEZEYUVONFJDeExRVUZMSzBRc1QwRkJVeXhOUVVOYVJpeEZRVUZITVVRc1ZVRkJXU3hIUVVOTExFbEJRV2hDTUVRc1JVRkJSekZFTEZkQlEwdzJSQ3hqUVVGamFFVXNTMEZCUzJsRkxHRkJTM3BDUXl4UFFVRlJMRk5CUVZOTUxFZEJRMlpxUlN4RlFVRkZhVVVzUjBGQlNVMHNTVUZCU1N4aFFVTldTQ3hqUVVGamFFVXNTMEZCUzJsRkxGZEJSM0pDUnl4UlFVRlRMRk5CUVZOUUxFVkJRVWt2UWl4SFFVTkdMRmRCUVdRNVFpeExRVUZMVFN4UlFVTlFNRVFzWTBGQlkyaEZMRXRCUVV0cFJTeFZRVU51UWtvc1JVRkJSMUVzVlVGQldYWkRMRWRCUldwQ2VFSXNUVUZCVFVrc1QwRkJVU3hGUVVOa1ZpeExRVUZMT0VRc1QwRkJhMElzU1VGQlZHaERMRVZCUTFZNVFpeExRVUZMT0VRc1UwRkRVRGxFTEV0QlFVdHBSU3hUUVVGWFN5eFpRVUZaZEVVc1MwRkJTeXRFTEU5QlFWRXNTMEZGZGtNdlJDeExRVUZMTUVRc1lVRkRVRGxFTEVWQlFVVnBSU3hIUVVGSlZTeFpRVUZaZGtVc1MwRkJTekJFTEZsQlFXRXhSQ3hMUVVGTE9FUXNVMEZKTjBOVkxGTkJRVmNzVTBGQlUxZ3NSMEZEYkVJc1QwRkJUMEVzUlVGQlIxRXNWVUZCVlZZc1UwRkplRUpqTEU5QlFVOURMRTlCUVZOd1JTeE5RVVZvUWxRc1QwRkJUeXRFTEV0QlFVdGtMRk5CUVZOeVFpeExRVUZOYmtJaUxDSm1hV3hsSWpvaVJUcGNYSGR2Y210emNHRmpaVnhjY0dGdWRHOXRZWFJvTFdOb1lYUmliM1JjWEdGd2NDNXFjeUo5Il19 diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..d7c92543c078ed68fdc5265185094e31a37935a6 GIT binary patch literal 615 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>3ZGPv(*?m*yc2AzuJ9+NJ=^&B5sq?xf&FKXT_Dq^9X_2Vxkf!92 zrfi?4?2xWxpJwQttL2uZ>6)qSmaXNIDQ}x;;#Z|$o0(a?!Ze^-!7kI#D;H?pImQot zKuWkI$S;^7OwY%{spI&8V~38kpE$n%=)uDV$5SGJ(u_&o?k)@+tg;?J4rhT!WHAE+ z-w_aIoT|+y4HRTA@$_|Nf6OW_q^is#^ED7CG}F_?F+}2WZvS&Tj}EM8 zDBbe@e-G==?O}XA>rQg_t-Cjh_?)I(-X$CO+^W>6VTx!g57XD6e@z*R^Bb3^>~#8W{A#9i z^4i*^QSYZ&UR4sSl<55?#TH<`?Cr08*}lR5>)#3QVbpldyK%UO_ zQmvAUQh^kMk%6J5u7Rnpk#UHjnU%4*m9eR|fsvJgfjXP`925lTmk1WZti_{>U<5@#6toCL1O-7*ghb&I5rGhb;Z<^rIvpyS zR^AO52k}99>J(a3NEj8S1gDHnMTL?$Dd++raU>cHfw{3(iLFfgZ}wXEp8b7i?{m&Q zd!K!7{`O#hV$}1280Fy zWZ45?M*v>n6!r)podPgI2k0ZhY3qP_NC_Xw$gJ-E2<(AKK9v}e&l$0#^IA>uQ;EGbl0F1PTooK`na>_ zzf8<5$SWvw4`G#7oMCZ!`wx9;wJz2pgykG?kZ~yA+AHov@u}$KBcUkQBb2p1jJ?7? z(ae>WkbPliVp;XMngbcfay}_$$hsaHpN1(+aF~xZcGe zGr>%Bxc&37)Ze+htwth248L{9&|qJ@aH8+dXrJV=lpU?e8vWB{dRuzO?p@3S&jP<& z@nV;-X{{UEx2@$7!&tOW&&CV>HplB~DyaJVEiZ8VNYb$&<9~U;r8%tU9t-c~J7C2f zS!P&fI8tFbUZatuST8h(!|CHZ@8hLJ(Gr5qRVqQHp3Ie(OdfR+Mh?rBUGmZ=J6oqh zxjC%`-*I~dwB@q;h`O03@Ak+}^X?&X@no?NJQQ~|mP{ThmltJP&>UqyxJX8MjeXp) z+5$eVm4^_Dyr4&?7FmE9y(E|)6GFeR{wcC-hrC9TW zQ};3dz>$8o77cls&eKMU;)-z^pQ-)JY0I8oL8nu>Q&bCyW2r>W^LCQe3X~6@i&ZhZ zW-`mYAMxZRshaE=b95TDft%Lw09iEmYtRkEVQJKqGdpIjBdHP8QSz!CFnKkXZZ-Kid&@^dOwIzU` z0X@Cx4&uHXMz5`JUe&(A8bk0MAtD)#Ia4xQkQDJ}+!l!*Y|{?{k!jnS1#eBS1Iyg7 zqm_mPsRHa%Z69kAH5=|#G?PHpFff&CgI!yTz;WH96^O6kS7haZ#IGf7wy>@Hrnj-a z)VDXy?v$an%Fiw5jHI_>glZ~S7xB4^4W)`8@QKxN5uJP)O&v~bBE3#;8=NQok1|(a zkEq%QrWPi_&S|g6!6la#LEuE^A|3m80DF>DMXyZOQ*<2971$x)>`9*Pa)T5N+Vnmt z$`I?UAnDKY#O#b`p;u}KHP?B=)Wd&U8D=(IH~0Ic!Q0FZVpDU!JjN7r7#bGLBe>_7 zLGKbBqo!)z4S&_CsA@@mruHIlft*RbAUikhIwPlc3oZMN&kO{nqDbUgArzr}eg6?81#4Ryrt!W4uw?fS^PyPnRP27EymT+FaG~- z;n!jN{XYrV4Luc^x;R!!sxJ5vAIFZpIg%Z>myLSHvQWGM7s@IRC(0Tp7uT>=Zl11d zJzYHj YWune0ECzqv>t!{jZVvWs*hJ6!FK@%Vi~s-t literal 0 HcmV?d00001 diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..768a5af --- /dev/null +++ b/static/index.html @@ -0,0 +1,41 @@ + + + + + + Whizbot + + + + + + + + + + + +
+
+

Whizbot

+
+ +
+
+
+
+
{ para }
+
+
+
+
+ Your message here... +
+
+
+
+ + + + + diff --git a/static/master.css b/static/master.css new file mode 100644 index 0000000..4fc7dca --- /dev/null +++ b/static/master.css @@ -0,0 +1,216 @@ +@import url('https://fonts.googleapis.com/css?family=Nunito'); + +:root { + --top: 0; + --left: 0; + font-size: 15px; +} + +html { + padding: 0; + overflow: hidden; +} + +body { + padding: 0; + position: relative; + margin: 0; +} + +body, textarea { + font-family: 'Nunito', sans-serif; +} + +textarea:focus { + outline: none; +} + +button { + cursor: pointer; +} + +.u-checkbox { + background: hsl(0deg, 0%, 68%); + --check: 0; + border-radius: 3px; + width: var(--size); + height: var(--size); + display: inline-block; + vertical-align: -5px; + -webkit-appearance: none; + position: relative; + --size: 16px; + cursor: pointer; + outline: none; + margin-right: 5px; +} + +.u-checkbox:checked { + --check: 0.8; +} + +.u-checkbox:before { + content: ''; + display: block; + position: absolute; + left: 0; + top: 0; + box-sizing: border-box; + width: 100%; + height: 100%; + background: no-repeat center/85% url(https://image.flaticon.com/icons/svg/128/128384.svg); + opacity: var(--check); + transition: 0.3s opacity; +} + +.u-textbox { + word-wrap: break-word; +} + +/*.u-textbox:before {*/ +/* content: attr(placeholder);*/ +.u-placeholder { + color: hsl(0deg, 0%, 67%); + font-style: italic; + opacity: 0; + position: absolute; + top: var(--top); + left: var(--left); + pointer-events: none; + + transition: 0.2s opacity; +} + +.u-textbox.empty * { + display: none; +} + +/*.u-textbox.empty:before {*/ +.u-textbox.empty + .u-placeholder { + opacity: 1; +} + +.error { + background: hsl(0deg, 68%, 87%); +} + +.Root { + height: 100vh; + width: 100vw; + overflow: hidden; +} + +.Root-body { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + display: grid; + grid-template-columns: auto; + grid-template-rows: min-content auto; + background: hsl(0deg, 0%, 80%); +} + +.Header { + width: 100%; + padding: 10px 10px; + box-sizing: border-box; + margin-top: 0; + top: 0; + left: 0; + z-index: 1; + grid-row: 1; + grid-column: 1 / 2; +} + +.Header-title { + font-size: 1.2em; + text-align: left; + margin-bottom: 0; + text-shadow: 2px 2px 2px #0003; + width: min-content; + white-space: nowrap; + color: hsl(0deg, 0%, 15%); + padding: 1px 14px; + border-radius: 6px 6px 0 0; + margin-top: 0; +} + +.Conversation { + grid-row: 2; + grid-column: 1; + display: flex; + flex-direction: column-reverse; + background: hsl(0deg, 0%, 90%); + position: relative; + overflow-x: auto; + overflow-y: auto; + height: 100%; +} + +.Conversation-body { + grid-row: 1; + position: absolute; + bottom: 0; + width: 100%; + min-width: 380px; +} + +.Conversation-history { + padding: 15px; + margin: 0 auto; + display: flex; + flex-direction: column; + list-style: none; + box-sizing: border-box; + max-width: 900px; +} + +.Conversation-message { + border-radius: 13px; + background: hsl(0deg, 0%, 80%); + padding: 10px; + max-width: 80%; + width: max-content; + align-self: flex-end; + margin-bottom: 10px; + box-sizing: border-box; +} + +.Conversation-message.user { + align-self: initial; +} + +.Conversation-para { + font: inherit; + white-space: pre-line; + margin-top: 0; + margin-bottom: 8px; + line-height: 1.37; +} + +.Conversation-para:last-child { + margin-bottom: 0; +} + +.Conversation-textbox { + --top: 10px; + --left: 10px; + padding: var(--top) var(--left); + box-sizing: border-box; + position: sticky; + bottom: 0; + width: 100%; + background: hsla(0deg, 0%, 90%, 90%); + transition: 0.4s background-color; +} + +.Conversation-input { + border: none; + padding: 0; + bottom: 0; + background: none; + width: 100%; + min-height: 150px; + outline: none; +} diff --git a/util/__init__.py b/util/__init__.py new file mode 100644 index 0000000..9b03d4c --- /dev/null +++ b/util/__init__.py @@ -0,0 +1,251 @@ +import os, re +from platform import python_version_tuple as get_pyversion +from statistics import mean as _mean, StatisticsError +from time import time_ns +from datetime import timedelta +from concurrent.futures import ThreadPoolExecutor as _Executor +from html.parser import HTMLParser as _HTMLParser + +from munch import munchify + + +pyversion = tuple(int(e) for e in get_pyversion()) +if pyversion >= (3, 6, 0): + OrderedDict = dict +else: + from collections import OrderedDict + +__dir__ = os.path.normpath(os.path.dirname(os.path.realpath(__file__)) + '/..') + +def realpath(path): + return os.path.join(__dir__, path) + +def new(cls, *args, **kw): + if not isinstance(cls, type): + cls = type(cls) + return cls(*args, **kw) + +def attach(target): + def deco(func): + setattr(target, func.__name__, func) + return func + return deco + +def mixin(target): + exclude = { '__module__', '__dict__', '__weakref__', '__doc__', '__new__' } + def deco(cls): + for name, attr in cls.__dict__.items(): + if name in exclude: + continue + setattr(target, name, attr) + return cls + return deco + +class Object: + def __new__(cls, **kw): + return munchify(kw) + +class Map: + def __new__(cls, data=None, key=None): + if isinstance(key, property): + key = property.fget + if data is None: + return + if key: + return dict((key(e), e) for e in data) + return dict(data) + +class String: + def encode(self, *args, **kw): + if str(self): + return str(self).encode(*args, **kw) + + def __str__(self): + pass + +class List: + def __new__(cls, self): + if self is None: + return [] + if hasattr(self, '__len__'): + return self + return list(self) + +class Data: + def __init__(self, data=None): + self._data = List(data) + + def __getitem__(self, index): + return self._data[index] if self else None + + def __len__(self): + return len(self._data) + + def __bool__(self): + return bool(self._data) + + def __iter__(self): + yield from self._data + + def _append(self, item): + return self._data.append(item) + +class TimeDelta: # Immutable data class + def __init__(self, days=0, secs=0, nanos=0, micros=0, millis=0, mins=0, *args, **kw): + self._time = timedelta(days, secs + nanos / 1e9, micros, millis, mins, *args, **kw) + self.secs = self.time.total_seconds() + + self.mins = self.secs / 60 + self.hours = self.mins / 60 + self.days = self.hours / 24 + + self.millis = self.secs * 1e3 + self.micros = self.secs * 1e6 + self.nanos = self.secs * 1e9 + + @property + def time(self): + return self._time + +class Timer: + def __init__(self, *args, **kw): + self._time = None + self.duration = TimeDelta(*args, **kw) + + @property + def duration(self): + return self._duration + + @duration.setter + def duration(self, value): + self._duration = value + return self.reset() + + def reset(self): + if self._time is None: + return False + self._time = None + return True + + @property + def elapsed(self): + return TimeDelta(nanos=self._elapsed) + + def restart(self): + return self() + + def __call__(self): + self._time = time_ns() + + def __bool__(self): + if self._elapsed <= self._duration.nanos: + return False + return self.reset() + + @property + def _elapsed(self): + if self._time is None: + return 0 + return time_ns() - self._time + +def mean(data, default=None): + try: + return _mean(data) + except StatisticsError: + return default + +def _bisect(self, value, key, a, b): + n = b - a + if n <= 0: + return a + m = (a + b) // 2 + x = key(self[m]) + if value == x: + return m + if value < x: + return _bisect(self, value, key, a, m-1) + return _bisect(self, value, key, m+1, b) + +def bisect(self, value, key=None): + if key is None: + key = lambda e: e + return _bisect(self, value, key, 0, len(self)) + +_newline = r'\s*[\n\r]+\s*' + +def strip(text): + return re.sub(_newline, '', text) + +def split(text): + return re.split(_newline, text) + +def casefold(self): + return str(self).casefold() + +def sign(self): + if self == 0: + return 0 + return -1 if self < 0 else 1 + +class Future: + def __init__(self, func, executor): + self._func = func + self._executor = executor + + def __call__(self, *args, **kw): + self._executor.submit(self._func, *args, **kw) + return self + +class Executor: + def __init__(self, src=None): #FIXME + self._executor = None + self._futures = None + + def __call__(self, *args, **kw): #FIXME + _range = range(*args, **kw) + self._executor = _Executor(max_workers=len(_range)) + self._futures = [] + yield from _range + + def __bool__(self): + return bool(self._executor) + + def __getitem__(self, func): + return Future(func, self) + + def __iter__(self): + if self: + for future in self._futures: + yield future.result() + self._executor.shutdown(False) + self._executor = None + + def collect(self): + return tuple(self) + + def submit(self, func, *args, **kw): + if self: + future = self._executor.submit(func, *args, **kw) + self._futures.append(future) + +class HTMLParser(_HTMLParser): + def __init__(self, html=None): + super().__init__() + self.strict = False + self.convert_charrefs = True + self._text = [] + self(html) + + def handle_data(self, text): + self._text.append(text) + + def __call__(self, html): + self.reset() + self._text.clear() + if html is not None: + self.feed(html) + return self + + @property + def text(self): + return re.sub(r" +", " ", ''.join(self._text)) diff --git a/util/list.py b/util/list.py new file mode 100644 index 0000000..49dc692 --- /dev/null +++ b/util/list.py @@ -0,0 +1,78 @@ +from util import new, Set + +class SortedList(list): + def __init__(self, src=None, key=None): + super().__init__(self, src) + self._key = key + + def sort(self): + super().sort(self._key) + return self + +class _List: + def __add__(self, item): + return new(self, [*self, item]) + + def __radd__(self, item): + return new(self, [item, *self]) + + def __and__(self, other): + return new(self, [*self, *other]) + + def __rand__(self, other): + return new(self, [*other, *self]) + + def __mul__(self, other): + return new(self, zip(self, other)) + + def __rmul__(self, other): + return new(self, zip(other, self)) + + def join(self, sep=''): + return sep.join(self) + + def range(self): + return range(len(self)) + + def get(self, index, default=None): + return self[index] if index in self.range() else default + + def index(self, item, default=None): + try: + return super().index(item) + except ValueError: + return default + +class Tuple(_List, tuple): + def __repr__(self): + return tuple.__repr__(self) + +class List(_List, list): + def __init__(self, src=None, banned=None, **kw): + super().__init__() + self.__banned = Set(banned) + self.__format = kw.get('format', '{item}') + self._str = kw.get('str', ', ') + self.extend(src) + + def __repr__(self): + return list.__repr__(self) + + def _format(self, item): + return self.__format.format(item=str(item)) + + def __str__(self): + return self._str.join(self._format(e) for e in self) + + def _banned(self, kw): + return self.__banned | kw.get('banned') + + def append(self, item, **kw): + if item not in self._banned(kw): + super().append(item) + + def extend(self, other, **kw): + if other is None: + return False + super().extend(e for e in other if e not in self._banned(kw)) + return True diff --git a/util/priority_queue.py b/util/priority_queue.py new file mode 100644 index 0000000..2e35e53 --- /dev/null +++ b/util/priority_queue.py @@ -0,0 +1,204 @@ +from __future__ import print_function +from math import inf +from collections import namedtuple +from sortedcontainers import SortedKeyList + + +Element = namedtuple('Element', ('value', 'rank')) + +class PriorityQueue: + def __init__(self, capacity=None, key=None): + self._data = SortedKeyList(key=self._rank) + self._capacity = inf if capacity is None else capacity + self._key = key + + def _rank(self, item): + if self._key: + return self._key(*item) + return item.rank + + def add(self, value, rank): + self._data.add(Element(value, rank)) + self._shrink() + + def clear(self): + return self._data.clear() + + def __repr__(self): + return f"PriorityQueue([{', '.join(f'{v}: {r}' for (v, r) in self._data)}])" + + def _shrink(self): + while len(self._data) > self._capacity: + self._data.pop() + + def update(self, src): + raise NotImplementedError + + def __contains__(self, value): + raise NotImplementedError + + def __iter__(self): + for value, rank in self._data: + yield value + + def __getitem__(self, index): + if isinstance(index, int): + return self._data[index].value + return list(self)[index] + + def size(self): + return len(self._data) + +# Based on the work of Pravin Paratey (April 15, 2011) +# Joachim Hagege (June 18, 2014) +# +# Code released under BSD license +# +class _PriorityQueue: + def __init__(self, size=inf, key=None, default=0): + self.heap = [] + self.k = size + self.__key = key + self._default = default + + def _key(self, obj): + value, key = obj + _key = self.__key + if key is None: + return _key(value) if _key else self._default + return key + + def __getitem__(self, index): + return self.heap[index] + + def __iter__(self): + for value, key in self.heap: + yield value + + def __repr__(self): + return repr(self.heap) + + def parent(self, index): + """ + Parent will be at math.floor(index/2). Since integer division + simulates the floor function, we don't explicity use it + """ + return int(index / 2) + + def left_child(self, index): + return 2 * index + 1 + + def right_child(self, index): + return 2 * index + 2 + + def max_heapify(self, index): + """ + Responsible for maintaining the heap property of the heap. + This function assumes that the subtree located at left and right + child satisfies the max-heap property. But the tree at index + (current node) does not. O(log n) + """ + left_index = self.left_child(index) + right_index = self.right_child(index) + + largest = index + #if left_index < len(self.heap) and self.heap[left_index][DISTANCE_INDEX] > self.heap[index][DISTANCE_INDEX]: + if left_index < len(self.heap) and self._item(left_index) > self._item(index): + largest = left_index + #if right_index < len(self.heap) and self.heap[right_index][DISTANCE_INDEX] > self.heap[largest][DISTANCE_INDEX]: + if right_index < len(self.heap) and self._item(right_index) > self._item(largest): + largest = right_index + + if largest != index: + self.heap[index], self.heap[largest] = self.heap[largest], self.heap[index] + self.max_heapify(largest) + + def build_max_heap(self): + """ + Responsible for building the heap bottom up. It starts with the lowest non-leaf nodes + and calls heapify on them. This function is useful for initialising a heap with an + unordered array. O(n) + We shall note that all the elements after floor(size/2) are leaves. + """ + for i in xrange(len(self.heap)/2, -1, -1): + self.max_heapify(i) + + def heap_sort(self): + """ The heap-sort algorithm with a time complexity O(n*log(n)) + We run n times the max_heapify (O(log n)) + """ + self.build_max_heap() + output = [] + for i in xrange(len(self.heap)-1, 0, -1): + self.heap[0], self.heap[i] = self.heap[i], self.heap[0] + output.append(self.heap.pop()) + self.max_heapify(0) + output.append(self.heap.pop()) + self.heap = output + + def _item(self, index): + return self._key(self.heap[index]) + + def propagate_up(self, index): + """ Compares index with parent and swaps node if larger O(log(n)) """ + #while index != 0 and self.heap[self.parent(index)][DISTANCE_INDEX] < self.heap[index][DISTANCE_INDEX]: + while index != 0 and self._item(self.parent(index)) < self._item(index): + self.heap[index], self.heap[self.parent(index)] = self.heap[self.parent(index)], self.heap[index] + index = self.parent(index) + + # Here is the whole logic of the Bounded Priority queue. + # Add an element only if size < k and if size == k, only if the element value is less than + def add(self, value, key=None): + obj = Element(value, key) + # If number of elements == k and new element < max_elem: + # extract_max and add the new element. + # Else: + # Add the new element. + size = self.size() + + # Size == k, The priority queue is at capacity. + if size == self.k: + max_elem = self.max() + + # The new element has a lower distance than the biggest one. + # Then we insert, otherwise, don't insert. + #if obj[DISTANCE_INDEX] < max_elem: + if self._key(obj) < max_elem: + self.extract_max() + self.heap_append(obj) + + # if size == 0 or 0 < Size < k + else: + self.heap_append(obj) + + def heap_append(self, obj): + """ Adds an element in the heap O(ln(n)) """ + self.heap.append(obj) + self.propagate_up(len(self.heap) - 1) # Index value is 1 less than length + + def max(self): + # The highest distance will always be at the index 0 (heap invariant) + return self.heap[0][1] + + def size(self): + return len(self.heap) + + def extract_max(self): + """ + Part of the Priority Queue, extracts the element on the top of the heap and + then re-heapifies. O(log n) + """ + max = self.heap[0] + data = self.heap.pop() + if len(self.heap) > 0: + self.heap[0] = data + self.max_heapify(0) + return max + + def increment(self, key, value): + """ Increments key by the input value. O(log n) """ + for i in xrange(len(self.heap)): + if self.heap[i][0] == key: + self.heap[i] = (value + self.heap[i][1], key) + self.propagate_up(i) + break diff --git a/util/pyquery.py b/util/pyquery.py new file mode 100644 index 0000000..b7acf9e --- /dev/null +++ b/util/pyquery.py @@ -0,0 +1,94 @@ +from itertools import islice + +from util import attach + +from pyquery import PyQuery as pq, text as _text + + +class Text: + _tag = 'text' + _html = f'<{_tag}>' + def __new__(cls, text, prev=None): + return pq(cls._html).append(text or '').before(prev) + +_text.INLINE_TAGS.update([Text._tag]) + +def _Text(node, prev=None): + return Text(node, prev)[0] if isinstance(node, str) else node + +_before = pq.before +@attach(pq.fn) +def before(other): + if other is None: + return this + return _before(this, other) + +#@attach(pq.fn) +def _iter(this): + if not this: + return this + prev = _Text(this[0]) + yield pq(prev) + for node in islice(this, 1, None): + if isinstance(node, str): + elem = Text(node) + yield elem.set(_prev=pq(prev)) + prev = elem[0] + else: + yield pq(node) + prev = node + +@attach(pq.fn) +def test(include=None, exclude=None): + if not this.is_(include): + return False + + if exclude and this.is_(exclude): + return False + + return True + +@attach(pq.fn) +def set(**kw): + for name, val in kw.items(): + setattr(this, name, val) + return this + +_prev = pq.prev +@attach(pq.fn) +def prev(sel=None): + if hasattr(this, '_prev'): + return this._prev.filter(sel) + return _prev(this, sel) + +@attach(pq.fn) +def default(name, default=None): + value = this.attr(name) + return default if value is None else value + +_items = pq.items +@attach(pq.fn) +def items(include=None, exclude=None): + for node in _iter(this): + if node.test(include, exclude): + yield node + +@attach(pq.fn) +def tail(sel=None): + return pq([Text(e.tail)[0] for e in this]).filter(sel) + +@attach(pq.fn) +def nextUntil(sel=None, filter=None): + res = OrderedSet() + if sel is None: + sel = ':not(*)' + for node in this.items(): + while True: + res.update(node.tail(filter)) + node = node.next() + if node.is_(sel) or not node: + break + if node.is_(filter): + res.update(node) + + return pq(res[:]) diff --git a/util/request.py b/util/request.py new file mode 100644 index 0000000..f35ead4 --- /dev/null +++ b/util/request.py @@ -0,0 +1,23 @@ +from util import mixin + +from munch import munchify +from requests import Request, Session, Response +_session = Session() + +@mixin(Request) +class _Request: + def __call__(self, params=None, json=None): + req = self.prepare() + if params: + req.prepare_url(req.url, params) + if json: + req.prepare_body(None, self.files, json) + return _session.send(req) + + +@mixin(Response) +class _Reponse: + def result(self): + if self.ok: + return munchify(self.json()) + diff --git a/util/set.py b/util/set.py new file mode 100644 index 0000000..54f2746 --- /dev/null +++ b/util/set.py @@ -0,0 +1,107 @@ +from util import OrderedDict + + +def _check(value): + if isinstance(value, bool): + return True + try: + iter(value) + return True + except TypeError: + return False + +class Set(set): + def __init__(self, src): + super().__init__() + self._bool = None + self.update(src) + + def clone(self): + res = Set(self) + res._bool = self._bool + return res + + def union(self, other): + if _check(other): + return self.clone().update(other) + return self + + def __contains__(self, item): + if super().__contains__(item): + return True + return self._bool is bool(item) + + def update(self, src): + if isinstance(src, bool): + if self._bool is None: + self._bool = src + return True + return False + if _check(src): + super().update(src) + return True + return False + +Set.__or__ = Set.union + +class OrderedSet: + def __init__(self, src=None): + super().__init__() + self._data = OrderedDict() + + if src: + self.update(src) + + def update(self, *sources): + for src in sources: + for item in src: + self.add(item) + return self + + def difference_update(self, src): + for item in src: + self.discard(item) + return self + + def add(self, item): + if item in self: + return False + self._data[item] = None + return True + + def __contains__(self, item): + return item in self._data + + def discard(self, item): + if item in self: + return False + del self._data[item] + return True + + def remove(self, item): + if not self.discard(item): + raise KeyError + + def __iter__(self): + yield from self._data + + def clear(self): + if not self: + return False + self._data.clear() + return True + + def __bool__(self): + return bool(self._data) + + def __repr__(self): + return f"{{{', '.join(repr(e) for e in self)}}}" + + def __len__(self): + return len(self._data) + + def __getitem__(self, index): + res = list(self) + if index == slice(None): + return res + return res[index] diff --git a/util/url.py b/util/url.py new file mode 100644 index 0000000..8e60c9e --- /dev/null +++ b/util/url.py @@ -0,0 +1,84 @@ +import os +from urllib.parse import urlsplit, urlunsplit, SplitResult + +from util import Tuple + + +class URL(object): + class _Dict(dict): + _extra = { 'basename', 'subdomain' } + + def regular(self, key): + return key in self and key not in self._extra + + def __setitem__(self, key, value): + if key is 'path': + super().__setitem__('basename', os.path.basename(value) if value else '') + elif key is 'netloc': + domain = value.rsplit('.', 2) + super().__setitem__('subdomain', domain[0] if len(domain) is 3 else '') + + return super().__setitem__(key, value) + + _keys = Tuple(SplitResult._fields) + basename = None + subdomain = None + + def __init__(self, url=None, cut=None): + self.__dict__ = self._Dict() + _keys = self._keys + if isinstance(url, str): + data = _keys * urlsplit(url) + elif isinstance(url, dict): + data = url + elif url is not None: + data = _keys * url + else: + data = [] + + index = len(_keys) + if isinstance(cut, str): + index = _keys.index(cut, index) + elif isinstance(cut, int): + index = cut + + _dict = dict(data) + for k in _keys[:index]: + self._set(k, _dict.get(k, '')) + for k in _keys[index:]: + self._set(k) + + def _set(self, key, value=''): + self.__dict__[key] = value + + def _regular(self, key): + return self.__dict__.regular(key) + + def _key(self, key): + return key if isinstance(key, str) else self._keys.get(key) + + def __getitem__(self, key): + return self.__dict__[self._key(key)] + + def __setitem__(self, key, value): + key = self._key(key) + if self._regular(key): + self._set(key, value) + + def __len__(self): + return len(self._keys) + + def __iter__(self): + for k in self._keys: + yield self[k] + + def __str__(self): + return urlunsplit(self) + + def format(self, *args, **kw): + return str(self).format(*args, **kw) + + def __repr__(self): + _name = self.__class__.__name__ + data = (f"{k}='{self[k]}'" for k in self._keys) + return f"{_name}({', '.join(data)})" diff --git a/watson/__init__.py b/watson/__init__.py new file mode 100644 index 0000000..1163b05 --- /dev/null +++ b/watson/__init__.py @@ -0,0 +1,8 @@ +from munch import munchify + + +class Result: + def __new__(cls, res): + return munchify(res.get_result()) + +from .assistant import Assistant diff --git a/watson/assistant.py b/watson/assistant.py new file mode 100644 index 0000000..50a0e61 --- /dev/null +++ b/watson/assistant.py @@ -0,0 +1,164 @@ +from itertools import chain, repeat +from collections import namedtuple, defaultdict +from uuid import uuid4 +from datetime import datetime +import re + +from ibm_watson import AssistantV2, AssistantV1 +from ibm_watson.assistant_v2 import MessageInput, MessageInputOptions, RuntimeIntent +from ibm_watson.assistant_v1 import \ + MessageInput as MessageInput_1, RuntimeIntent as RuntimeIntent_1, \ + Example, DialogNodeOutput, DialogNodeOutputGeneric, DialogNodeOutputTextValuesElement as DialogNodeText +from munch import munchify + +from util import Timer, Data, String, split, Object +from watson import Result + +def uuid(): + return uuid4().hex + +_Output = namedtuple('Output', 'text intent confidence') + +Fallback = namedtuple('Fallback', 'assistant threshold') + +class Assistant: + _api = AssistantV2 + api_version = 2 + @classmethod + def v1(cls, id, **kw): + return V1(id, **kw) + + def __init__(self, id, **kw): + self._id = id + self._service = self._api(**kw) + self._session = None + self._timer = Timer(mins=5) + self.return_context = True + self.version = self._service.version + self.context = None + self._fallback = None + + @property + def session_id(self): + if not self._session or self._timer: # expired + self._session = self._service.create_session(self._id).get_result()['session_id'] + self._timer() # restart timer + return self._session + + def _output(self, output, text, intents): + fallback = self._fallback + if not output: + return output + if fallback and output.confidence < fallback.threshold or not output.intent: + return fallback.assistant(text, intents) + return output + + def __call__(self, text=None, intents=None, bypass=False): + if intents: + intents = [RuntimeIntent(e, 1) for e in intents] + options = MessageInputOptions(return_context=self.return_context) + input = MessageInput(text=text, intents=intents, options=options)._to_dict() + + res = Result(self._service.message(self._id, self.session_id, input, self.context)) + self.context = res.get('context') + ret = Output(res.output) + return ret if bypass else self._output(ret, text, intents) + + def __setitem__(self, input, output): + raise NotImplementedError + + def link(self, assistant, threshold): + assert 0 < threshold <= 1 + self._fallback = Fallback(assistant, threshold) + +class Intent: + _maxlen = 1024 + def __new__(cls, text, description=None): + assert isinstance(text, str) + text = text.strip() + assert 0 < len(text) <= cls._maxlen + assert not re.match(r"[\n\r\t]", text) + examples = [Example(text, created=datetime.now())] + return Object(intent=uuid(), description=description, examples=examples) + +class DialogNode: + _maxlen = 4096 + def __new__(cls, intent, text): + assert isinstance(text, str) + text = text.strip() + assert 0 < len(text) <= cls._maxlen + values = [DialogNodeText(text)] + generic = [DialogNodeOutputGeneric('text', values)] + output = DialogNodeOutput(generic) + name = intent.intent + return Object(dialog_node=name, description=intent.description, conditions=f'#{name}', output=output) + +class V1(Assistant): + _api = AssistantV1 + api_version = 1 + def __call__(self, text, intents=None): + input = MessageInput_1(text=text)._to_dict() + res = Result(self._service.message(self._id, input, alternate_intents=False, context=self.context)) + self.context = res.get('context') + return self._output(Output_1(res), text, intents) + + def __setitem__(self, input, output): + description = None + if not isinstance(input, str): + input, description = input + + intent = Intent(input, description) + self._service.create_intent(self._id, **intent) + + node = DialogNode(intent, output) + self._service.create_dialog_node(self._id, **node) + +_entities = ({},) +_intents = repeat(RuntimeIntent(None, 1)) +class Output(Data): + def __init__(self, output): + super().__init__() + self._source = output + + entities = defaultdict(dict) + for e in output.entities: + entities[e.entity][e.value] = e + entities[e.entity, e.value] = e + self._entities = entities #munchify(entities) + + for g, i in zip(output.generic, chain(output.intents, _intents)): + self._append(_Output(g.text, i.intent, i.confidence)) + + @property + def entities(self): + return self._entities + + @property + def _text(self): + return self[0].text if self else None + + @property + def text(self): + return split(self._text) if self else [] + + @property + def intent(self): + return self[0].intent if self else None + + @property + def confidence(self): + return self[0].confidence if self else None + + @property + def data(self): + return self._source + +_intents_1 = repeat(RuntimeIntent_1(None, 1)) +class Output_1(Output): + def __init__(self, data): + Data.__init__(self) + #super().__init__() + self._source = data + for t, i in zip(data.output.text, chain(data.intents, _intents_1)): + self._append(_Output(t, i.intent, i.confidence)) + \ No newline at end of file