From c25a9a3dc78f5c97f6e120b4438238cad6ceb1c0 Mon Sep 17 00:00:00 2001 From: Alexey Velikiy Date: Sun, 27 May 2018 19:34:24 +0300 Subject: [PATCH] deps & data folder (#1) --- .gitignore | 2 + server/build/webpack.base.conf.js | 9 - server/build/webpack.dev.conf.js | 10 + server/dist/server.js | 27506 ---------------------------- server/package.json | 12 +- server/src/config.ts | 11 +- server/src/index.ts | 4 + server/src/services/analytics.ts | 7 +- server/src/services/data.ts | 14 + 9 files changed, 42 insertions(+), 27533 deletions(-) delete mode 100644 server/dist/server.js create mode 100644 server/src/services/data.ts diff --git a/.gitignore b/.gitignore index 0adb95d..3fdaa4d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ node_modules/ dist/ .vscode/ package-lock.json +server/dist +data \ No newline at end of file diff --git a/server/build/webpack.base.conf.js b/server/build/webpack.base.conf.js index b3ae4a7..4f43557 100644 --- a/server/build/webpack.base.conf.js +++ b/server/build/webpack.base.conf.js @@ -21,15 +21,6 @@ module.exports = { filename: "server.js", path: resolve('dist') }, - // externals: [ - // function(context, request, callback) { - // if(request[0] == '.') { - // callback(); - // } else { - // callback(null, "require('" + request + "')"); - // } - // } - // ], plugins: [ new webpack.optimize.OccurrenceOrderPlugin(), new webpack.HotModuleReplacementPlugin(), diff --git a/server/build/webpack.dev.conf.js b/server/build/webpack.dev.conf.js index 7be3655..ddaca27 100644 --- a/server/build/webpack.dev.conf.js +++ b/server/build/webpack.dev.conf.js @@ -1,4 +1,14 @@ var base = require('./webpack.base.conf'); base.watch = true; + +base.externals = [ + function(context, request, callback) { + if(request[0] == '.') { + callback(); + } else { + callback(null, "require('" + request + "')"); + } + } +] module.exports = base; \ No newline at end of file diff --git a/server/dist/server.js b/server/dist/server.js deleted file mode 100644 index a27a2d4..0000000 --- a/server/dist/server.js +++ /dev/null @@ -1,27506 +0,0 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ function hotDownloadUpdateChunk(chunkId) { // eslint-disable-line no-unused-vars -/******/ var chunk = require("./" + "" + chunkId + "." + hotCurrentHash + ".hot-update.js"); -/******/ hotAddUpdateChunk(chunk.id, chunk.modules); -/******/ } -/******/ -/******/ function hotDownloadManifest() { // eslint-disable-line no-unused-vars -/******/ try { -/******/ var update = require("./" + "" + hotCurrentHash + ".hot-update.json"); -/******/ } catch(e) { -/******/ return Promise.resolve(); -/******/ } -/******/ return Promise.resolve(update); -/******/ } -/******/ -/******/ function hotDisposeChunk(chunkId) { //eslint-disable-line no-unused-vars -/******/ delete installedChunks[chunkId]; -/******/ } -/******/ -/******/ -/******/ -/******/ var hotApplyOnUpdate = true; -/******/ var hotCurrentHash = "43bdd4d92634f91732ce"; // eslint-disable-line no-unused-vars -/******/ var hotRequestTimeout = 10000; -/******/ var hotCurrentModuleData = {}; -/******/ var hotCurrentChildModule; // eslint-disable-line no-unused-vars -/******/ var hotCurrentParents = []; // eslint-disable-line no-unused-vars -/******/ var hotCurrentParentsTemp = []; // eslint-disable-line no-unused-vars -/******/ -/******/ function hotCreateRequire(moduleId) { // eslint-disable-line no-unused-vars -/******/ var me = installedModules[moduleId]; -/******/ if(!me) return __webpack_require__; -/******/ var fn = function(request) { -/******/ if(me.hot.active) { -/******/ if(installedModules[request]) { -/******/ if(installedModules[request].parents.indexOf(moduleId) < 0) -/******/ installedModules[request].parents.push(moduleId); -/******/ } else { -/******/ hotCurrentParents = [moduleId]; -/******/ hotCurrentChildModule = request; -/******/ } -/******/ if(me.children.indexOf(request) < 0) -/******/ me.children.push(request); -/******/ } else { -/******/ console.warn("[HMR] unexpected require(" + request + ") from disposed module " + moduleId); -/******/ hotCurrentParents = []; -/******/ } -/******/ return __webpack_require__(request); -/******/ }; -/******/ var ObjectFactory = function ObjectFactory(name) { -/******/ return { -/******/ configurable: true, -/******/ enumerable: true, -/******/ get: function() { -/******/ return __webpack_require__[name]; -/******/ }, -/******/ set: function(value) { -/******/ __webpack_require__[name] = value; -/******/ } -/******/ }; -/******/ }; -/******/ for(var name in __webpack_require__) { -/******/ if(Object.prototype.hasOwnProperty.call(__webpack_require__, name) && name !== "e") { -/******/ Object.defineProperty(fn, name, ObjectFactory(name)); -/******/ } -/******/ } -/******/ fn.e = function(chunkId) { -/******/ if(hotStatus === "ready") -/******/ hotSetStatus("prepare"); -/******/ hotChunksLoading++; -/******/ return __webpack_require__.e(chunkId).then(finishChunkLoading, function(err) { -/******/ finishChunkLoading(); -/******/ throw err; -/******/ }); -/******/ -/******/ function finishChunkLoading() { -/******/ hotChunksLoading--; -/******/ if(hotStatus === "prepare") { -/******/ if(!hotWaitingFilesMap[chunkId]) { -/******/ hotEnsureUpdateChunk(chunkId); -/******/ } -/******/ if(hotChunksLoading === 0 && hotWaitingFiles === 0) { -/******/ hotUpdateDownloaded(); -/******/ } -/******/ } -/******/ } -/******/ }; -/******/ return fn; -/******/ } -/******/ -/******/ function hotCreateModule(moduleId) { // eslint-disable-line no-unused-vars -/******/ var hot = { -/******/ // private stuff -/******/ _acceptedDependencies: {}, -/******/ _declinedDependencies: {}, -/******/ _selfAccepted: false, -/******/ _selfDeclined: false, -/******/ _disposeHandlers: [], -/******/ _main: hotCurrentChildModule !== moduleId, -/******/ -/******/ // Module API -/******/ active: true, -/******/ accept: function(dep, callback) { -/******/ if(typeof dep === "undefined") -/******/ hot._selfAccepted = true; -/******/ else if(typeof dep === "function") -/******/ hot._selfAccepted = dep; -/******/ else if(typeof dep === "object") -/******/ for(var i = 0; i < dep.length; i++) -/******/ hot._acceptedDependencies[dep[i]] = callback || function() {}; -/******/ else -/******/ hot._acceptedDependencies[dep] = callback || function() {}; -/******/ }, -/******/ decline: function(dep) { -/******/ if(typeof dep === "undefined") -/******/ hot._selfDeclined = true; -/******/ else if(typeof dep === "object") -/******/ for(var i = 0; i < dep.length; i++) -/******/ hot._declinedDependencies[dep[i]] = true; -/******/ else -/******/ hot._declinedDependencies[dep] = true; -/******/ }, -/******/ dispose: function(callback) { -/******/ hot._disposeHandlers.push(callback); -/******/ }, -/******/ addDisposeHandler: function(callback) { -/******/ hot._disposeHandlers.push(callback); -/******/ }, -/******/ removeDisposeHandler: function(callback) { -/******/ var idx = hot._disposeHandlers.indexOf(callback); -/******/ if(idx >= 0) hot._disposeHandlers.splice(idx, 1); -/******/ }, -/******/ -/******/ // Management API -/******/ check: hotCheck, -/******/ apply: hotApply, -/******/ status: function(l) { -/******/ if(!l) return hotStatus; -/******/ hotStatusHandlers.push(l); -/******/ }, -/******/ addStatusHandler: function(l) { -/******/ hotStatusHandlers.push(l); -/******/ }, -/******/ removeStatusHandler: function(l) { -/******/ var idx = hotStatusHandlers.indexOf(l); -/******/ if(idx >= 0) hotStatusHandlers.splice(idx, 1); -/******/ }, -/******/ -/******/ //inherit from previous dispose call -/******/ data: hotCurrentModuleData[moduleId] -/******/ }; -/******/ hotCurrentChildModule = undefined; -/******/ return hot; -/******/ } -/******/ -/******/ var hotStatusHandlers = []; -/******/ var hotStatus = "idle"; -/******/ -/******/ function hotSetStatus(newStatus) { -/******/ hotStatus = newStatus; -/******/ for(var i = 0; i < hotStatusHandlers.length; i++) -/******/ hotStatusHandlers[i].call(null, newStatus); -/******/ } -/******/ -/******/ // while downloading -/******/ var hotWaitingFiles = 0; -/******/ var hotChunksLoading = 0; -/******/ var hotWaitingFilesMap = {}; -/******/ var hotRequestedFilesMap = {}; -/******/ var hotAvailableFilesMap = {}; -/******/ var hotDeferred; -/******/ -/******/ // The update info -/******/ var hotUpdate, hotUpdateNewHash; -/******/ -/******/ function toModuleId(id) { -/******/ var isNumber = (+id) + "" === id; -/******/ return isNumber ? +id : id; -/******/ } -/******/ -/******/ function hotCheck(apply) { -/******/ if(hotStatus !== "idle") throw new Error("check() is only allowed in idle status"); -/******/ hotApplyOnUpdate = apply; -/******/ hotSetStatus("check"); -/******/ return hotDownloadManifest(hotRequestTimeout).then(function(update) { -/******/ if(!update) { -/******/ hotSetStatus("idle"); -/******/ return null; -/******/ } -/******/ hotRequestedFilesMap = {}; -/******/ hotWaitingFilesMap = {}; -/******/ hotAvailableFilesMap = update.c; -/******/ hotUpdateNewHash = update.h; -/******/ -/******/ hotSetStatus("prepare"); -/******/ var promise = new Promise(function(resolve, reject) { -/******/ hotDeferred = { -/******/ resolve: resolve, -/******/ reject: reject -/******/ }; -/******/ }); -/******/ hotUpdate = {}; -/******/ var chunkId = 0; -/******/ { // eslint-disable-line no-lone-blocks -/******/ /*globals chunkId */ -/******/ hotEnsureUpdateChunk(chunkId); -/******/ } -/******/ if(hotStatus === "prepare" && hotChunksLoading === 0 && hotWaitingFiles === 0) { -/******/ hotUpdateDownloaded(); -/******/ } -/******/ return promise; -/******/ }); -/******/ } -/******/ -/******/ function hotAddUpdateChunk(chunkId, moreModules) { // eslint-disable-line no-unused-vars -/******/ if(!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId]) -/******/ return; -/******/ hotRequestedFilesMap[chunkId] = false; -/******/ for(var moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ hotUpdate[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(--hotWaitingFiles === 0 && hotChunksLoading === 0) { -/******/ hotUpdateDownloaded(); -/******/ } -/******/ } -/******/ -/******/ function hotEnsureUpdateChunk(chunkId) { -/******/ if(!hotAvailableFilesMap[chunkId]) { -/******/ hotWaitingFilesMap[chunkId] = true; -/******/ } else { -/******/ hotRequestedFilesMap[chunkId] = true; -/******/ hotWaitingFiles++; -/******/ hotDownloadUpdateChunk(chunkId); -/******/ } -/******/ } -/******/ -/******/ function hotUpdateDownloaded() { -/******/ hotSetStatus("ready"); -/******/ var deferred = hotDeferred; -/******/ hotDeferred = null; -/******/ if(!deferred) return; -/******/ if(hotApplyOnUpdate) { -/******/ // Wrap deferred object in Promise to mark it as a well-handled Promise to -/******/ // avoid triggering uncaught exception warning in Chrome. -/******/ // See https://bugs.chromium.org/p/chromium/issues/detail?id=465666 -/******/ Promise.resolve().then(function() { -/******/ return hotApply(hotApplyOnUpdate); -/******/ }).then( -/******/ function(result) { -/******/ deferred.resolve(result); -/******/ }, -/******/ function(err) { -/******/ deferred.reject(err); -/******/ } -/******/ ); -/******/ } else { -/******/ var outdatedModules = []; -/******/ for(var id in hotUpdate) { -/******/ if(Object.prototype.hasOwnProperty.call(hotUpdate, id)) { -/******/ outdatedModules.push(toModuleId(id)); -/******/ } -/******/ } -/******/ deferred.resolve(outdatedModules); -/******/ } -/******/ } -/******/ -/******/ function hotApply(options) { -/******/ if(hotStatus !== "ready") throw new Error("apply() is only allowed in ready status"); -/******/ options = options || {}; -/******/ -/******/ var cb; -/******/ var i; -/******/ var j; -/******/ var module; -/******/ var moduleId; -/******/ -/******/ function getAffectedStuff(updateModuleId) { -/******/ var outdatedModules = [updateModuleId]; -/******/ var outdatedDependencies = {}; -/******/ -/******/ var queue = outdatedModules.slice().map(function(id) { -/******/ return { -/******/ chain: [id], -/******/ id: id -/******/ }; -/******/ }); -/******/ while(queue.length > 0) { -/******/ var queueItem = queue.pop(); -/******/ var moduleId = queueItem.id; -/******/ var chain = queueItem.chain; -/******/ module = installedModules[moduleId]; -/******/ if(!module || module.hot._selfAccepted) -/******/ continue; -/******/ if(module.hot._selfDeclined) { -/******/ return { -/******/ type: "self-declined", -/******/ chain: chain, -/******/ moduleId: moduleId -/******/ }; -/******/ } -/******/ if(module.hot._main) { -/******/ return { -/******/ type: "unaccepted", -/******/ chain: chain, -/******/ moduleId: moduleId -/******/ }; -/******/ } -/******/ for(var i = 0; i < module.parents.length; i++) { -/******/ var parentId = module.parents[i]; -/******/ var parent = installedModules[parentId]; -/******/ if(!parent) continue; -/******/ if(parent.hot._declinedDependencies[moduleId]) { -/******/ return { -/******/ type: "declined", -/******/ chain: chain.concat([parentId]), -/******/ moduleId: moduleId, -/******/ parentId: parentId -/******/ }; -/******/ } -/******/ if(outdatedModules.indexOf(parentId) >= 0) continue; -/******/ if(parent.hot._acceptedDependencies[moduleId]) { -/******/ if(!outdatedDependencies[parentId]) -/******/ outdatedDependencies[parentId] = []; -/******/ addAllToSet(outdatedDependencies[parentId], [moduleId]); -/******/ continue; -/******/ } -/******/ delete outdatedDependencies[parentId]; -/******/ outdatedModules.push(parentId); -/******/ queue.push({ -/******/ chain: chain.concat([parentId]), -/******/ id: parentId -/******/ }); -/******/ } -/******/ } -/******/ -/******/ return { -/******/ type: "accepted", -/******/ moduleId: updateModuleId, -/******/ outdatedModules: outdatedModules, -/******/ outdatedDependencies: outdatedDependencies -/******/ }; -/******/ } -/******/ -/******/ function addAllToSet(a, b) { -/******/ for(var i = 0; i < b.length; i++) { -/******/ var item = b[i]; -/******/ if(a.indexOf(item) < 0) -/******/ a.push(item); -/******/ } -/******/ } -/******/ -/******/ // at begin all updates modules are outdated -/******/ // the "outdated" status can propagate to parents if they don't accept the children -/******/ var outdatedDependencies = {}; -/******/ var outdatedModules = []; -/******/ var appliedUpdate = {}; -/******/ -/******/ var warnUnexpectedRequire = function warnUnexpectedRequire() { -/******/ console.warn("[HMR] unexpected require(" + result.moduleId + ") to disposed module"); -/******/ }; -/******/ -/******/ for(var id in hotUpdate) { -/******/ if(Object.prototype.hasOwnProperty.call(hotUpdate, id)) { -/******/ moduleId = toModuleId(id); -/******/ var result; -/******/ if(hotUpdate[id]) { -/******/ result = getAffectedStuff(moduleId); -/******/ } else { -/******/ result = { -/******/ type: "disposed", -/******/ moduleId: id -/******/ }; -/******/ } -/******/ var abortError = false; -/******/ var doApply = false; -/******/ var doDispose = false; -/******/ var chainInfo = ""; -/******/ if(result.chain) { -/******/ chainInfo = "\nUpdate propagation: " + result.chain.join(" -> "); -/******/ } -/******/ switch(result.type) { -/******/ case "self-declined": -/******/ if(options.onDeclined) -/******/ options.onDeclined(result); -/******/ if(!options.ignoreDeclined) -/******/ abortError = new Error("Aborted because of self decline: " + result.moduleId + chainInfo); -/******/ break; -/******/ case "declined": -/******/ if(options.onDeclined) -/******/ options.onDeclined(result); -/******/ if(!options.ignoreDeclined) -/******/ abortError = new Error("Aborted because of declined dependency: " + result.moduleId + " in " + result.parentId + chainInfo); -/******/ break; -/******/ case "unaccepted": -/******/ if(options.onUnaccepted) -/******/ options.onUnaccepted(result); -/******/ if(!options.ignoreUnaccepted) -/******/ abortError = new Error("Aborted because " + moduleId + " is not accepted" + chainInfo); -/******/ break; -/******/ case "accepted": -/******/ if(options.onAccepted) -/******/ options.onAccepted(result); -/******/ doApply = true; -/******/ break; -/******/ case "disposed": -/******/ if(options.onDisposed) -/******/ options.onDisposed(result); -/******/ doDispose = true; -/******/ break; -/******/ default: -/******/ throw new Error("Unexception type " + result.type); -/******/ } -/******/ if(abortError) { -/******/ hotSetStatus("abort"); -/******/ return Promise.reject(abortError); -/******/ } -/******/ if(doApply) { -/******/ appliedUpdate[moduleId] = hotUpdate[moduleId]; -/******/ addAllToSet(outdatedModules, result.outdatedModules); -/******/ for(moduleId in result.outdatedDependencies) { -/******/ if(Object.prototype.hasOwnProperty.call(result.outdatedDependencies, moduleId)) { -/******/ if(!outdatedDependencies[moduleId]) -/******/ outdatedDependencies[moduleId] = []; -/******/ addAllToSet(outdatedDependencies[moduleId], result.outdatedDependencies[moduleId]); -/******/ } -/******/ } -/******/ } -/******/ if(doDispose) { -/******/ addAllToSet(outdatedModules, [result.moduleId]); -/******/ appliedUpdate[moduleId] = warnUnexpectedRequire; -/******/ } -/******/ } -/******/ } -/******/ -/******/ // Store self accepted outdated modules to require them later by the module system -/******/ var outdatedSelfAcceptedModules = []; -/******/ for(i = 0; i < outdatedModules.length; i++) { -/******/ moduleId = outdatedModules[i]; -/******/ if(installedModules[moduleId] && installedModules[moduleId].hot._selfAccepted) -/******/ outdatedSelfAcceptedModules.push({ -/******/ module: moduleId, -/******/ errorHandler: installedModules[moduleId].hot._selfAccepted -/******/ }); -/******/ } -/******/ -/******/ // Now in "dispose" phase -/******/ hotSetStatus("dispose"); -/******/ Object.keys(hotAvailableFilesMap).forEach(function(chunkId) { -/******/ if(hotAvailableFilesMap[chunkId] === false) { -/******/ hotDisposeChunk(chunkId); -/******/ } -/******/ }); -/******/ -/******/ var idx; -/******/ var queue = outdatedModules.slice(); -/******/ while(queue.length > 0) { -/******/ moduleId = queue.pop(); -/******/ module = installedModules[moduleId]; -/******/ if(!module) continue; -/******/ -/******/ var data = {}; -/******/ -/******/ // Call dispose handlers -/******/ var disposeHandlers = module.hot._disposeHandlers; -/******/ for(j = 0; j < disposeHandlers.length; j++) { -/******/ cb = disposeHandlers[j]; -/******/ cb(data); -/******/ } -/******/ hotCurrentModuleData[moduleId] = data; -/******/ -/******/ // disable module (this disables requires from this module) -/******/ module.hot.active = false; -/******/ -/******/ // remove module from cache -/******/ delete installedModules[moduleId]; -/******/ -/******/ // when disposing there is no need to call dispose handler -/******/ delete outdatedDependencies[moduleId]; -/******/ -/******/ // remove "parents" references from all children -/******/ for(j = 0; j < module.children.length; j++) { -/******/ var child = installedModules[module.children[j]]; -/******/ if(!child) continue; -/******/ idx = child.parents.indexOf(moduleId); -/******/ if(idx >= 0) { -/******/ child.parents.splice(idx, 1); -/******/ } -/******/ } -/******/ } -/******/ -/******/ // remove outdated dependency from module children -/******/ var dependency; -/******/ var moduleOutdatedDependencies; -/******/ for(moduleId in outdatedDependencies) { -/******/ if(Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)) { -/******/ module = installedModules[moduleId]; -/******/ if(module) { -/******/ moduleOutdatedDependencies = outdatedDependencies[moduleId]; -/******/ for(j = 0; j < moduleOutdatedDependencies.length; j++) { -/******/ dependency = moduleOutdatedDependencies[j]; -/******/ idx = module.children.indexOf(dependency); -/******/ if(idx >= 0) module.children.splice(idx, 1); -/******/ } -/******/ } -/******/ } -/******/ } -/******/ -/******/ // Not in "apply" phase -/******/ hotSetStatus("apply"); -/******/ -/******/ hotCurrentHash = hotUpdateNewHash; -/******/ -/******/ // insert new code -/******/ for(moduleId in appliedUpdate) { -/******/ if(Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) { -/******/ modules[moduleId] = appliedUpdate[moduleId]; -/******/ } -/******/ } -/******/ -/******/ // call accept handlers -/******/ var error = null; -/******/ for(moduleId in outdatedDependencies) { -/******/ if(Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)) { -/******/ module = installedModules[moduleId]; -/******/ if(module) { -/******/ moduleOutdatedDependencies = outdatedDependencies[moduleId]; -/******/ var callbacks = []; -/******/ for(i = 0; i < moduleOutdatedDependencies.length; i++) { -/******/ dependency = moduleOutdatedDependencies[i]; -/******/ cb = module.hot._acceptedDependencies[dependency]; -/******/ if(cb) { -/******/ if(callbacks.indexOf(cb) >= 0) continue; -/******/ callbacks.push(cb); -/******/ } -/******/ } -/******/ for(i = 0; i < callbacks.length; i++) { -/******/ cb = callbacks[i]; -/******/ try { -/******/ cb(moduleOutdatedDependencies); -/******/ } catch(err) { -/******/ if(options.onErrored) { -/******/ options.onErrored({ -/******/ type: "accept-errored", -/******/ moduleId: moduleId, -/******/ dependencyId: moduleOutdatedDependencies[i], -/******/ error: err -/******/ }); -/******/ } -/******/ if(!options.ignoreErrored) { -/******/ if(!error) -/******/ error = err; -/******/ } -/******/ } -/******/ } -/******/ } -/******/ } -/******/ } -/******/ -/******/ // Load self accepted modules -/******/ for(i = 0; i < outdatedSelfAcceptedModules.length; i++) { -/******/ var item = outdatedSelfAcceptedModules[i]; -/******/ moduleId = item.module; -/******/ hotCurrentParents = [moduleId]; -/******/ try { -/******/ __webpack_require__(moduleId); -/******/ } catch(err) { -/******/ if(typeof item.errorHandler === "function") { -/******/ try { -/******/ item.errorHandler(err); -/******/ } catch(err2) { -/******/ if(options.onErrored) { -/******/ options.onErrored({ -/******/ type: "self-accept-error-handler-errored", -/******/ moduleId: moduleId, -/******/ error: err2, -/******/ orginalError: err, // TODO remove in webpack 4 -/******/ originalError: err -/******/ }); -/******/ } -/******/ if(!options.ignoreErrored) { -/******/ if(!error) -/******/ error = err2; -/******/ } -/******/ if(!error) -/******/ error = err; -/******/ } -/******/ } else { -/******/ if(options.onErrored) { -/******/ options.onErrored({ -/******/ type: "self-accept-errored", -/******/ moduleId: moduleId, -/******/ error: err -/******/ }); -/******/ } -/******/ if(!options.ignoreErrored) { -/******/ if(!error) -/******/ error = err; -/******/ } -/******/ } -/******/ } -/******/ } -/******/ -/******/ // handle errors in accept handlers and self accepted module load -/******/ if(error) { -/******/ hotSetStatus("fail"); -/******/ return Promise.reject(error); -/******/ } -/******/ -/******/ hotSetStatus("idle"); -/******/ return new Promise(function(resolve) { -/******/ resolve(outdatedModules); -/******/ }); -/******/ } -/******/ -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {}, -/******/ hot: hotCreateModule(moduleId), -/******/ parents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp), -/******/ children: [] -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId)); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // __webpack_hash__ -/******/ __webpack_require__.h = function() { return hotCurrentHash; }; -/******/ -/******/ // Load entry module and return exports -/******/ return hotCreateRequire(118)(__webpack_require__.s = 118); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports) { - -module.exports = require("path"); - -/***/ }), -/* 1 */ -/***/ (function(module, exports) { - -module.exports = require("stream"); - -/***/ }), -/* 2 */ -/***/ (function(module, exports) { - -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -var global = module.exports = typeof window != 'undefined' && window.Math == Math - ? window : typeof self != 'undefined' && self.Math == Math ? self - // eslint-disable-next-line no-new-func - : Function('return this')(); -if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef - - -/***/ }), -/* 3 */ -/***/ (function(module, exports) { - -module.exports = require("buffer"); - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - -var store = __webpack_require__(103)('wks'); -var uid = __webpack_require__(62); -var Symbol = __webpack_require__(2).Symbol; -var USE_SYMBOL = typeof Symbol == 'function'; - -var $exports = module.exports = function (name) { - return store[name] || (store[name] = - USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); -}; - -$exports.store = store; - - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -/** - * Detect Electron renderer process, which is node, but we should - * treat as a browser. - */ - -if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(125); -} else { - module.exports = __webpack_require__(126); -} - - -/***/ }), -/* 6 */ -/***/ (function(module, exports) { - -var core = module.exports = { version: '2.5.6' }; -if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef - - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -/*! - * depd - * Copyright(c) 2014-2017 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var callSiteToString = __webpack_require__(73).callSiteToString -var eventListenerCount = __webpack_require__(73).eventListenerCount -var relative = __webpack_require__(0).relative - -/** - * Module exports. - */ - -module.exports = depd - -/** - * Get the path to base files on. - */ - -var basePath = process.cwd() - -/** - * Determine if namespace is contained in the string. - */ - -function containsNamespace (str, namespace) { - var vals = str.split(/[ ,]+/) - var ns = String(namespace).toLowerCase() - - for (var i = 0; i < vals.length; i++) { - var val = vals[i] - - // namespace contained - if (val && (val === '*' || val.toLowerCase() === ns)) { - return true - } - } - - return false -} - -/** - * Convert a data descriptor to accessor descriptor. - */ - -function convertDataDescriptorToAccessor (obj, prop, message) { - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - var value = descriptor.value - - descriptor.get = function getter () { return value } - - if (descriptor.writable) { - descriptor.set = function setter (val) { return (value = val) } - } - - delete descriptor.value - delete descriptor.writable - - Object.defineProperty(obj, prop, descriptor) - - return descriptor -} - -/** - * Create arguments string to keep arity. - */ - -function createArgumentsString (arity) { - var str = '' - - for (var i = 0; i < arity; i++) { - str += ', arg' + i - } - - return str.substr(2) -} - -/** - * Create stack string from stack. - */ - -function createStackString (stack) { - var str = this.name + ': ' + this.namespace - - if (this.message) { - str += ' deprecated ' + this.message - } - - for (var i = 0; i < stack.length; i++) { - str += '\n at ' + callSiteToString(stack[i]) - } - - return str -} - -/** - * Create deprecate for namespace in caller. - */ - -function depd (namespace) { - if (!namespace) { - throw new TypeError('argument namespace is required') - } - - var stack = getStack() - var site = callSiteLocation(stack[1]) - var file = site[0] - - function deprecate (message) { - // call to self as log - log.call(deprecate, message) - } - - deprecate._file = file - deprecate._ignored = isignored(namespace) - deprecate._namespace = namespace - deprecate._traced = istraced(namespace) - deprecate._warned = Object.create(null) - - deprecate.function = wrapfunction - deprecate.property = wrapproperty - - return deprecate -} - -/** - * Determine if namespace is ignored. - */ - -function isignored (namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.noDeprecation) { - // --no-deprecation support - return true - } - - var str = process.env.NO_DEPRECATION || '' - - // namespace ignored - return containsNamespace(str, namespace) -} - -/** - * Determine if namespace is traced. - */ - -function istraced (namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.traceDeprecation) { - // --trace-deprecation support - return true - } - - var str = process.env.TRACE_DEPRECATION || '' - - // namespace traced - return containsNamespace(str, namespace) -} - -/** - * Display deprecation message. - */ - -function log (message, site) { - var haslisteners = eventListenerCount(process, 'deprecation') !== 0 - - // abort early if no destination - if (!haslisteners && this._ignored) { - return - } - - var caller - var callFile - var callSite - var depSite - var i = 0 - var seen = false - var stack = getStack() - var file = this._file - - if (site) { - // provided site - depSite = site - callSite = callSiteLocation(stack[1]) - callSite.name = depSite.name - file = callSite[0] - } else { - // get call site - i = 2 - depSite = callSiteLocation(stack[i]) - callSite = depSite - } - - // get caller of deprecated thing in relation to file - for (; i < stack.length; i++) { - caller = callSiteLocation(stack[i]) - callFile = caller[0] - - if (callFile === file) { - seen = true - } else if (callFile === this._file) { - file = this._file - } else if (seen) { - break - } - } - - var key = caller - ? depSite.join(':') + '__' + caller.join(':') - : undefined - - if (key !== undefined && key in this._warned) { - // already warned - return - } - - this._warned[key] = true - - // generate automatic message from call site - var msg = message - if (!msg) { - msg = callSite === depSite || !callSite.name - ? defaultMessage(depSite) - : defaultMessage(callSite) - } - - // emit deprecation if listeners exist - if (haslisteners) { - var err = DeprecationError(this._namespace, msg, stack.slice(i)) - process.emit('deprecation', err) - return - } - - // format and write message - var format = process.stderr.isTTY - ? formatColor - : formatPlain - var output = format.call(this, msg, caller, stack.slice(i)) - process.stderr.write(output + '\n', 'utf8') -} - -/** - * Get call site location as array. - */ - -function callSiteLocation (callSite) { - var file = callSite.getFileName() || '' - var line = callSite.getLineNumber() - var colm = callSite.getColumnNumber() - - if (callSite.isEval()) { - file = callSite.getEvalOrigin() + ', ' + file - } - - var site = [file, line, colm] - - site.callSite = callSite - site.name = callSite.getFunctionName() - - return site -} - -/** - * Generate a default message from the site. - */ - -function defaultMessage (site) { - var callSite = site.callSite - var funcName = site.name - - // make useful anonymous name - if (!funcName) { - funcName = '' - } - - var context = callSite.getThis() - var typeName = context && callSite.getTypeName() - - // ignore useless type name - if (typeName === 'Object') { - typeName = undefined - } - - // make useful type name - if (typeName === 'Function') { - typeName = context.name || typeName - } - - return typeName && callSite.getMethodName() - ? typeName + '.' + funcName - : funcName -} - -/** - * Format deprecation message without color. - */ - -function formatPlain (msg, caller, stack) { - var timestamp = new Date().toUTCString() - - var formatted = timestamp + - ' ' + this._namespace + - ' deprecated ' + msg - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n at ' + callSiteToString(stack[i]) - } - - return formatted - } - - if (caller) { - formatted += ' at ' + formatLocation(caller) - } - - return formatted -} - -/** - * Format deprecation message with color. - */ - -function formatColor (msg, caller, stack) { - var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' + // bold cyan - ' \x1b[33;1mdeprecated\x1b[22;39m' + // bold yellow - ' \x1b[0m' + msg + '\x1b[39m' // reset - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n \x1b[36mat ' + callSiteToString(stack[i]) + '\x1b[39m' // cyan - } - - return formatted - } - - if (caller) { - formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan - } - - return formatted -} - -/** - * Format call site location. - */ - -function formatLocation (callSite) { - return relative(basePath, callSite[0]) + - ':' + callSite[1] + - ':' + callSite[2] -} - -/** - * Get the stack as array of call sites. - */ - -function getStack () { - var limit = Error.stackTraceLimit - var obj = {} - var prep = Error.prepareStackTrace - - Error.prepareStackTrace = prepareObjectStackTrace - Error.stackTraceLimit = Math.max(10, limit) - - // capture the stack - Error.captureStackTrace(obj) - - // slice this function off the top - var stack = obj.stack.slice(1) - - Error.prepareStackTrace = prep - Error.stackTraceLimit = limit - - return stack -} - -/** - * Capture call site stack from v8. - */ - -function prepareObjectStackTrace (obj, stack) { - return stack -} - -/** - * Return a wrapped function in a deprecation message. - */ - -function wrapfunction (fn, message) { - if (typeof fn !== 'function') { - throw new TypeError('argument fn must be a function') - } - - var args = createArgumentsString(fn.length) - var deprecate = this // eslint-disable-line no-unused-vars - var stack = getStack() - var site = callSiteLocation(stack[1]) - - site.name = fn.name - - // eslint-disable-next-line no-eval - var deprecatedfn = eval('(function (' + args + ') {\n' + - '"use strict"\n' + - 'log.call(deprecate, message, site)\n' + - 'return fn.apply(this, arguments)\n' + - '})') - - return deprecatedfn -} - -/** - * Wrap property in a deprecation message. - */ - -function wrapproperty (obj, prop, message) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - throw new TypeError('argument obj must be object') - } - - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - - if (!descriptor) { - throw new TypeError('must call property on owner object') - } - - if (!descriptor.configurable) { - throw new TypeError('property must be configurable') - } - - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - // set site name - site.name = prop - - // convert data descriptor - if ('value' in descriptor) { - descriptor = convertDataDescriptorToAccessor(obj, prop, message) - } - - var get = descriptor.get - var set = descriptor.set - - // wrap getter - if (typeof get === 'function') { - descriptor.get = function getter () { - log.call(deprecate, message, site) - return get.apply(this, arguments) - } - } - - // wrap setter - if (typeof set === 'function') { - descriptor.set = function setter () { - log.call(deprecate, message, site) - return set.apply(this, arguments) - } - } - - Object.defineProperty(obj, prop, descriptor) -} - -/** - * Create DeprecationError for deprecation - */ - -function DeprecationError (namespace, message, stack) { - var error = new Error() - var stackString - - Object.defineProperty(error, 'constructor', { - value: DeprecationError - }) - - Object.defineProperty(error, 'message', { - configurable: true, - enumerable: false, - value: message, - writable: true - }) - - Object.defineProperty(error, 'name', { - enumerable: false, - configurable: true, - value: 'DeprecationError', - writable: true - }) - - Object.defineProperty(error, 'namespace', { - configurable: true, - enumerable: false, - value: namespace, - writable: true - }) - - Object.defineProperty(error, 'stack', { - configurable: true, - enumerable: false, - get: function () { - if (stackString !== undefined) { - return stackString - } - - // prepare stack trace - return (stackString = createStackString.call(this, stack)) - }, - set: function setter (val) { - stackString = val - } - }) - - return error -} - - -/***/ }), -/* 8 */ -/***/ (function(module, exports) { - -module.exports = require("fs"); - -/***/ }), -/* 9 */ -/***/ (function(module, exports) { - -module.exports = function (it) { - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; - - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(2); -var core = __webpack_require__(6); -var ctx = __webpack_require__(13); -var hide = __webpack_require__(14); -var has = __webpack_require__(27); -var PROTOTYPE = 'prototype'; - -var $export = function (type, name, source) { - var IS_FORCED = type & $export.F; - var IS_GLOBAL = type & $export.G; - var IS_STATIC = type & $export.S; - var IS_PROTO = type & $export.P; - var IS_BIND = type & $export.B; - var IS_WRAP = type & $export.W; - var exports = IS_GLOBAL ? core : core[name] || (core[name] = {}); - var expProto = exports[PROTOTYPE]; - var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]; - var key, own, out; - if (IS_GLOBAL) source = name; - for (key in source) { - // contains in native - own = !IS_FORCED && target && target[key] !== undefined; - if (own && has(exports, key)) continue; - // export native or passed - out = own ? target[key] : source[key]; - // prevent global pollution for namespaces - exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] - // bind timers to global for call from export context - : IS_BIND && own ? ctx(out, global) - // wrap global constructors for prevent change them in library - : IS_WRAP && target[key] == out ? (function (C) { - var F = function (a, b, c) { - if (this instanceof C) { - switch (arguments.length) { - case 0: return new C(); - case 1: return new C(a); - case 2: return new C(a, b); - } return new C(a, b, c); - } return C.apply(this, arguments); - }; - F[PROTOTYPE] = C[PROTOTYPE]; - return F; - // make static versions for prototype methods - })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; - // export proto methods to core.%CONSTRUCTOR%.methods.%NAME% - if (IS_PROTO) { - (exports.virtual || (exports.virtual = {}))[key] = out; - // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% - if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out); - } - } -}; -// type bitmap -$export.F = 1; // forced -$export.G = 2; // global -$export.S = 4; // static -$export.P = 8; // proto -$export.B = 16; // bind -$export.W = 32; // wrap -$export.U = 64; // safe -$export.R = 128; // real proto method for `library` -module.exports = $export; - - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(9); -module.exports = function (it) { - if (!isObject(it)) throw TypeError(it + ' is not an object!'); - return it; -}; - - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @api private - */ - -var Buffer = __webpack_require__(93).Buffer -var contentDisposition = __webpack_require__(94); -var contentType = __webpack_require__(33); -var deprecate = __webpack_require__(7)('express'); -var flatten = __webpack_require__(41); -var mime = __webpack_require__(52).mime; -var etag = __webpack_require__(95); -var proxyaddr = __webpack_require__(98); -var qs = __webpack_require__(50); -var querystring = __webpack_require__(88); - -/** - * Return strong ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.etag = createETagGenerator({ weak: false }) - -/** - * Return weak ETag for `body`. - * - * @param {String|Buffer} body - * @param {String} [encoding] - * @return {String} - * @api private - */ - -exports.wetag = createETagGenerator({ weak: true }) - -/** - * Check if `path` looks absolute. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -exports.isAbsolute = function(path){ - if ('/' === path[0]) return true; - if (':' === path[1] && ('\\' === path[2] || '/' === path[2])) return true; // Windows device path - if ('\\\\' === path.substring(0, 2)) return true; // Microsoft Azure absolute path -}; - -/** - * Flatten the given `arr`. - * - * @param {Array} arr - * @return {Array} - * @api private - */ - -exports.flatten = deprecate.function(flatten, - 'utils.flatten: use array-flatten npm module instead'); - -/** - * Normalize the given `type`, for example "html" becomes "text/html". - * - * @param {String} type - * @return {Object} - * @api private - */ - -exports.normalizeType = function(type){ - return ~type.indexOf('/') - ? acceptParams(type) - : { value: mime.lookup(type), params: {} }; -}; - -/** - * Normalize `types`, for example "html" becomes "text/html". - * - * @param {Array} types - * @return {Array} - * @api private - */ - -exports.normalizeTypes = function(types){ - var ret = []; - - for (var i = 0; i < types.length; ++i) { - ret.push(exports.normalizeType(types[i])); - } - - return ret; -}; - -/** - * Generate Content-Disposition header appropriate for the filename. - * non-ascii filenames are urlencoded and a filename* parameter is added - * - * @param {String} filename - * @return {String} - * @api private - */ - -exports.contentDisposition = deprecate.function(contentDisposition, - 'utils.contentDisposition: use content-disposition npm module instead'); - -/** - * Parse accept params `str` returning an - * object with `.value`, `.quality` and `.params`. - * also includes `.originalIndex` for stable sorting - * - * @param {String} str - * @return {Object} - * @api private - */ - -function acceptParams(str, index) { - var parts = str.split(/ *; */); - var ret = { value: parts[0], quality: 1, params: {}, originalIndex: index }; - - for (var i = 1; i < parts.length; ++i) { - var pms = parts[i].split(/ *= */); - if ('q' === pms[0]) { - ret.quality = parseFloat(pms[1]); - } else { - ret.params[pms[0]] = pms[1]; - } - } - - return ret; -} - -/** - * Compile "etag" value to function. - * - * @param {Boolean|String|Function} val - * @return {Function} - * @api private - */ - -exports.compileETag = function(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = exports.wetag; - break; - case false: - break; - case 'strong': - fn = exports.etag; - break; - case 'weak': - fn = exports.wetag; - break; - default: - throw new TypeError('unknown value for etag function: ' + val); - } - - return fn; -} - -/** - * Compile "query parser" value to function. - * - * @param {String|Function} val - * @return {Function} - * @api private - */ - -exports.compileQueryParser = function compileQueryParser(val) { - var fn; - - if (typeof val === 'function') { - return val; - } - - switch (val) { - case true: - fn = querystring.parse; - break; - case false: - fn = newObject; - break; - case 'extended': - fn = parseExtendedQueryString; - break; - case 'simple': - fn = querystring.parse; - break; - default: - throw new TypeError('unknown value for query parser function: ' + val); - } - - return fn; -} - -/** - * Compile "proxy trust" value to function. - * - * @param {Boolean|String|Number|Array|Function} val - * @return {Function} - * @api private - */ - -exports.compileTrust = function(val) { - if (typeof val === 'function') return val; - - if (val === true) { - // Support plain true/false - return function(){ return true }; - } - - if (typeof val === 'number') { - // Support trusting hop count - return function(a, i){ return i < val }; - } - - if (typeof val === 'string') { - // Support comma-separated values - val = val.split(/ *, */); - } - - return proxyaddr.compile(val || []); -} - -/** - * Set the charset in a given Content-Type string. - * - * @param {String} type - * @param {String} charset - * @return {String} - * @api private - */ - -exports.setCharset = function setCharset(type, charset) { - if (!type || !charset) { - return type; - } - - // parse type - var parsed = contentType.parse(type); - - // set charset - parsed.parameters.charset = charset; - - // format type - return contentType.format(parsed); -}; - -/** - * Create an ETag generator function, generating ETags with - * the given options. - * - * @param {object} options - * @return {function} - * @private - */ - -function createETagGenerator (options) { - return function generateETag (body, encoding) { - var buf = !Buffer.isBuffer(body) - ? Buffer.from(body, encoding) - : body - - return etag(buf, options) - } -} - -/** - * Parse an extended query string with qs. - * - * @return {Object} - * @private - */ - -function parseExtendedQueryString(str) { - return qs.parse(str, { - allowPrototypes: true - }); -} - -/** - * Return new empty object. - * - * @return {Object} - * @api private - */ - -function newObject() { - return {}; -} - - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - -// optional / simple context binding -var aFunction = __webpack_require__(26); -module.exports = function (fn, that, length) { - aFunction(fn); - if (that === undefined) return fn; - switch (length) { - case 1: return function (a) { - return fn.call(that, a); - }; - case 2: return function (a, b) { - return fn.call(that, a, b); - }; - case 3: return function (a, b, c) { - return fn.call(that, a, b, c); - }; - } - return function (/* ...args */) { - return fn.apply(that, arguments); - }; -}; - - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - -var dP = __webpack_require__(15); -var createDesc = __webpack_require__(100); -module.exports = __webpack_require__(16) ? function (object, key, value) { - return dP.f(object, key, createDesc(1, value)); -} : function (object, key, value) { - object[key] = value; - return object; -}; - - -/***/ }), -/* 15 */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(11); -var IE8_DOM_DEFINE = __webpack_require__(191); -var toPrimitive = __webpack_require__(192); -var dP = Object.defineProperty; - -exports.f = __webpack_require__(16) ? Object.defineProperty : function defineProperty(O, P, Attributes) { - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if (IE8_DOM_DEFINE) try { - return dP(O, P, Attributes); - } catch (e) { /* empty */ } - if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); - if ('value' in Attributes) O[P] = Attributes.value; - return O; -}; - - -/***/ }), -/* 16 */ -/***/ (function(module, exports, __webpack_require__) { - -// Thank's IE8 for his funny defineProperty -module.exports = !__webpack_require__(44)(function () { - return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; -}); - - -/***/ }), -/* 17 */ -/***/ (function(module, exports) { - -module.exports = require("http"); - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(186), __esModule: true }; - -/***/ }), -/* 19 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { value: true }); -var path = __webpack_require__(0); -var json_1 = __webpack_require__(46); -var config_1 = __webpack_require__(31); -var fs = __webpack_require__(8); -var crypto = __webpack_require__(43); -var anomaliesNameToIdMap = {}; -function loadAnomaliesMap() { - var filename = path.join(config_1.ANOMALIES_PATH, "all_anomalies.json"); - anomaliesNameToIdMap = json_1.getJsonDataSync(filename); -} -function saveAnomaliesMap() { - var filename = path.join(config_1.ANOMALIES_PATH, "all_anomalies.json"); - json_1.writeJsonDataSync(filename, anomaliesNameToIdMap); -} -function getAnomalyIdByName(anomalyName) { - loadAnomaliesMap(); - anomalyName = anomalyName.toLowerCase(); - if (anomalyName in anomaliesNameToIdMap) { - return anomaliesNameToIdMap[anomalyName]; - } - return anomalyName; -} -exports.getAnomalyIdByName = getAnomalyIdByName; -function insertAnomaly(anomaly) { - var hashString = anomaly.name + new Date().toString(); - var anomalyId = crypto.createHash('md5').update(hashString).digest('hex'); - anomaliesNameToIdMap[anomaly.name] = anomalyId; - saveAnomaliesMap(); - // return anomalyId - // const anomalyId:AnomalyId = anomaly.name; - var filename = path.join(config_1.ANOMALIES_PATH, anomalyId + ".json"); - if (fs.existsSync(filename)) { - return null; - } - saveAnomaly(anomalyId, anomaly); - return anomalyId; -} -exports.insertAnomaly = insertAnomaly; -function removeAnomaly(anomalyId) { - var filename = path.join(config_1.ANOMALIES_PATH, anomalyId + ".json"); - fs.unlinkSync(filename); -} -exports.removeAnomaly = removeAnomaly; -function saveAnomaly(anomalyId, anomaly) { - var filename = path.join(config_1.ANOMALIES_PATH, anomalyId + ".json"); - return json_1.writeJsonDataSync(filename, anomaly); -} -exports.saveAnomaly = saveAnomaly; -function loadAnomalyById(anomalyId) { - var filename = path.join(config_1.ANOMALIES_PATH, anomalyId + ".json"); - if (!fs.existsSync(filename)) { - return null; - } - return json_1.getJsonDataSync(filename); -} -exports.loadAnomalyById = loadAnomalyById; -function loadAnomalyByName(anomalyName) { - var anomalyId = getAnomalyIdByName(anomalyName); - return loadAnomalyById(anomalyId); -} -exports.loadAnomalyByName = loadAnomalyByName; -function saveAnomalyTypeInfo(info) { - console.log('Saving'); - var filename = path.join(config_1.ANOMALIES_PATH, info.name + ".json"); - if (info.next_id === undefined) { - info.next_id = 0; - } - if (info.last_prediction_time === undefined) { - info.last_prediction_time = 0; - } - return json_1.writeJsonDataSync(filename, info); -} -exports.saveAnomalyTypeInfo = saveAnomalyTypeInfo; -function getAnomalyTypeInfo(name) { - return json_1.getJsonDataSync(path.join(config_1.ANOMALIES_PATH, name + ".json")); -} -exports.getAnomalyTypeInfo = getAnomalyTypeInfo; -function setAnomalyStatus(anomalyId, status, error) { - var info = loadAnomalyById(anomalyId); - info.status = status; - if (error !== undefined) { - info.error = error; - } else { - info.error = ''; - } - saveAnomaly(anomalyId, info); -} -exports.setAnomalyStatus = setAnomalyStatus; -function setAnomalyPredictionTime(anomalyId, lastPredictionTime) { - var info = loadAnomalyById(anomalyId); - info.last_prediction_time = lastPredictionTime; - saveAnomaly(anomalyId, info); -} -exports.setAnomalyPredictionTime = setAnomalyPredictionTime; - -/***/ }), -/* 20 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * bytes - * Copyright(c) 2012-2014 TJ Holowaychuk - * Copyright(c) 2015 Jed Watson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = bytes; -module.exports.format = format; -module.exports.parse = parse; - -/** - * Module variables. - * @private - */ - -var formatThousandsRegExp = /\B(?=(\d{3})+(?!\d))/g; - -var formatDecimalsRegExp = /(?:\.0*|(\.[^0]+)0+)$/; - -var map = { - b: 1, - kb: 1 << 10, - mb: 1 << 20, - gb: 1 << 30, - tb: ((1 << 30) * 1024) -}; - -var parseRegExp = /^((-|\+)?(\d+(?:\.\d+)?)) *(kb|mb|gb|tb)$/i; - -/** - * Convert the given value in bytes into a string or parse to string to an integer in bytes. - * - * @param {string|number} value - * @param {{ - * case: [string], - * decimalPlaces: [number] - * fixedDecimals: [boolean] - * thousandsSeparator: [string] - * unitSeparator: [string] - * }} [options] bytes options. - * - * @returns {string|number|null} - */ - -function bytes(value, options) { - if (typeof value === 'string') { - return parse(value); - } - - if (typeof value === 'number') { - return format(value, options); - } - - return null; -} - -/** - * Format the given value in bytes into a string. - * - * If the value is negative, it is kept as such. If it is a float, - * it is rounded. - * - * @param {number} value - * @param {object} [options] - * @param {number} [options.decimalPlaces=2] - * @param {number} [options.fixedDecimals=false] - * @param {string} [options.thousandsSeparator=] - * @param {string} [options.unit=] - * @param {string} [options.unitSeparator=] - * - * @returns {string|null} - * @public - */ - -function format(value, options) { - if (!Number.isFinite(value)) { - return null; - } - - var mag = Math.abs(value); - var thousandsSeparator = (options && options.thousandsSeparator) || ''; - var unitSeparator = (options && options.unitSeparator) || ''; - var decimalPlaces = (options && options.decimalPlaces !== undefined) ? options.decimalPlaces : 2; - var fixedDecimals = Boolean(options && options.fixedDecimals); - var unit = (options && options.unit) || ''; - - if (!unit || !map[unit.toLowerCase()]) { - if (mag >= map.tb) { - unit = 'TB'; - } else if (mag >= map.gb) { - unit = 'GB'; - } else if (mag >= map.mb) { - unit = 'MB'; - } else if (mag >= map.kb) { - unit = 'KB'; - } else { - unit = 'B'; - } - } - - var val = value / map[unit.toLowerCase()]; - var str = val.toFixed(decimalPlaces); - - if (!fixedDecimals) { - str = str.replace(formatDecimalsRegExp, '$1'); - } - - if (thousandsSeparator) { - str = str.replace(formatThousandsRegExp, thousandsSeparator); - } - - return str + unitSeparator + unit; -} - -/** - * Parse the string value into an integer in bytes. - * - * If no unit is given, it is assumed the value is in bytes. - * - * @param {number|string} val - * - * @returns {number|null} - * @public - */ - -function parse(val) { - if (typeof val === 'number' && !isNaN(val)) { - return val; - } - - if (typeof val !== 'string') { - return null; - } - - // Test if the string passed is valid - var results = parseRegExp.exec(val); - var floatValue; - var unit = 'b'; - - if (!results) { - // Nothing could be extracted from the given string - floatValue = parseInt(val, 10); - unit = 'b' - } else { - // Retrieve the value and the unit - floatValue = parseFloat(results[1]); - unit = results[4].toLowerCase(); - } - - return Math.floor(map[unit] * floatValue); -} - - -/***/ }), -/* 21 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * statuses - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2016 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var codes = __webpack_require__(123) - -/** - * Module exports. - * @public - */ - -module.exports = status - -// status code to message map -status.STATUS_CODES = codes - -// array of status codes -status.codes = populateStatusesMap(status, codes) - -// status codes for redirects -status.redirect = { - 300: true, - 301: true, - 302: true, - 303: true, - 305: true, - 307: true, - 308: true -} - -// status codes for empty bodies -status.empty = { - 204: true, - 205: true, - 304: true -} - -// status codes for when you should retry the request -status.retry = { - 502: true, - 503: true, - 504: true -} - -/** - * Populate the statuses map for given codes. - * @private - */ - -function populateStatusesMap (statuses, codes) { - var arr = [] - - Object.keys(codes).forEach(function forEachCode (code) { - var message = codes[code] - var status = Number(code) - - // Populate properties - statuses[status] = message - statuses[message] = status - statuses[message.toLowerCase()] = status - - // Add to array - arr.push(status) - }) - - return arr -} - -/** - * Get the status code. - * - * Given a number, this will throw if it is not a known status - * code, otherwise the code will be returned. Given a string, - * the string will be parsed for a number and return the code - * if valid, otherwise will lookup the code assuming this is - * the status message. - * - * @param {string|number} code - * @returns {number} - * @public - */ - -function status (code) { - if (typeof code === 'number') { - if (!status[code]) throw new Error('invalid status code: ' + code) - return code - } - - if (typeof code !== 'string') { - throw new TypeError('code must be a number or string') - } - - // '403' - var n = parseInt(code, 10) - if (!isNaN(n)) { - if (!status[n]) throw new Error('invalid status code: ' + n) - return n - } - - n = status[code.toLowerCase()] - if (!n) throw new Error('invalid status message: "' + code + '"') - return n -} - - -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * type-is - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var typer = __webpack_require__(152) -var mime = __webpack_require__(85) - -/** - * Module exports. - * @public - */ - -module.exports = typeofrequest -module.exports.is = typeis -module.exports.hasBody = hasbody -module.exports.normalize = normalize -module.exports.match = mimeMatch - -/** - * Compare a `value` content-type with `types`. - * Each `type` can be an extension like `html`, - * a special shortcut like `multipart` or `urlencoded`, - * or a mime type. - * - * If no types match, `false` is returned. - * Otherwise, the first `type` that matches is returned. - * - * @param {String} value - * @param {Array} types - * @public - */ - -function typeis (value, types_) { - var i - var types = types_ - - // remove parameters and normalize - var val = tryNormalizeType(value) - - // no type or invalid - if (!val) { - return false - } - - // support flattened arguments - if (types && !Array.isArray(types)) { - types = new Array(arguments.length - 1) - for (i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // no types, return the content type - if (!types || !types.length) { - return val - } - - var type - for (i = 0; i < types.length; i++) { - if (mimeMatch(normalize(type = types[i]), val)) { - return type[0] === '+' || type.indexOf('*') !== -1 - ? val - : type - } - } - - // no matches - return false -} - -/** - * Check if a request has a request body. - * A request with a body __must__ either have `transfer-encoding` - * or `content-length` headers set. - * http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 - * - * @param {Object} request - * @return {Boolean} - * @public - */ - -function hasbody (req) { - return req.headers['transfer-encoding'] !== undefined || - !isNaN(req.headers['content-length']) -} - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains any of the give mime `type`s. - * If there is no request body, `null` is returned. - * If there is no content type, `false` is returned. - * Otherwise, it returns the first `type` that matches. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * this.is('html'); // => 'html' - * this.is('text/html'); // => 'text/html' - * this.is('text/*', 'application/json'); // => 'text/html' - * - * // When Content-Type is application/json - * this.is('json', 'urlencoded'); // => 'json' - * this.is('application/json'); // => 'application/json' - * this.is('html', 'application/*'); // => 'application/json' - * - * this.is('html'); // => false - * - * @param {String|Array} types... - * @return {String|false|null} - * @public - */ - -function typeofrequest (req, types_) { - var types = types_ - - // no body - if (!hasbody(req)) { - return null - } - - // support flattened arguments - if (arguments.length > 2) { - types = new Array(arguments.length - 1) - for (var i = 0; i < types.length; i++) { - types[i] = arguments[i + 1] - } - } - - // request content type - var value = req.headers['content-type'] - - return typeis(value, types) -} - -/** - * Normalize a mime type. - * If it's a shorthand, expand it to a valid mime type. - * - * In general, you probably want: - * - * var type = is(req, ['urlencoded', 'json', 'multipart']); - * - * Then use the appropriate body parsers. - * These three are the most common request body types - * and are thus ensured to work. - * - * @param {String} type - * @private - */ - -function normalize (type) { - if (typeof type !== 'string') { - // invalid type - return false - } - - switch (type) { - case 'urlencoded': - return 'application/x-www-form-urlencoded' - case 'multipart': - return 'multipart/*' - } - - if (type[0] === '+') { - // "+json" -> "*/*+json" expando - return '*/*' + type - } - - return type.indexOf('/') === -1 - ? mime.lookup(type) - : type -} - -/** - * Check if `expected` mime type - * matches `actual` mime type with - * wildcard and +suffix support. - * - * @param {String} expected - * @param {String} actual - * @return {Boolean} - * @private - */ - -function mimeMatch (expected, actual) { - // invalid type - if (expected === false) { - return false - } - - // split types - var actualParts = actual.split('/') - var expectedParts = expected.split('/') - - // invalid format - if (actualParts.length !== 2 || expectedParts.length !== 2) { - return false - } - - // validate type - if (expectedParts[0] !== '*' && expectedParts[0] !== actualParts[0]) { - return false - } - - // validate suffix wildcard - if (expectedParts[1].substr(0, 2) === '*+') { - return expectedParts[1].length <= actualParts[1].length + 1 && - expectedParts[1].substr(1) === actualParts[1].substr(1 - expectedParts[1].length) - } - - // validate subtype - if (expectedParts[1] !== '*' && expectedParts[1] !== actualParts[1]) { - return false - } - - return true -} - -/** - * Normalize a type and remove parameters. - * - * @param {string} value - * @return {string} - * @private - */ - -function normalizeType (value) { - // parse the type - var type = typer.parse(value) - - // remove the parameters - type.parameters = undefined - - // reformat it - return typer.format(type) -} - -/** - * Try to normalize a type and remove parameters. - * - * @param {string} value - * @return {string} - * @private - */ - -function tryNormalizeType (value) { - try { - return normalizeType(value) - } catch (err) { - return null - } -} - - -/***/ }), -/* 23 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * parseurl - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2014-2017 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var url = __webpack_require__(40) -var parse = url.parse -var Url = url.Url - -/** - * Module exports. - * @public - */ - -module.exports = parseurl -module.exports.original = originalurl - -/** - * Parse the `req` url with memoization. - * - * @param {ServerRequest} req - * @return {Object} - * @public - */ - -function parseurl (req) { - var url = req.url - - if (url === undefined) { - // URL is undefined - return undefined - } - - var parsed = req._parsedUrl - - if (fresh(url, parsed)) { - // Return cached URL parse - return parsed - } - - // Parse the URL - parsed = fastparse(url) - parsed._raw = url - - return (req._parsedUrl = parsed) -}; - -/** - * Parse the `req` original url with fallback and memoization. - * - * @param {ServerRequest} req - * @return {Object} - * @public - */ - -function originalurl (req) { - var url = req.originalUrl - - if (typeof url !== 'string') { - // Fallback - return parseurl(req) - } - - var parsed = req._parsedOriginalUrl - - if (fresh(url, parsed)) { - // Return cached URL parse - return parsed - } - - // Parse the URL - parsed = fastparse(url) - parsed._raw = url - - return (req._parsedOriginalUrl = parsed) -}; - -/** - * Parse the `str` url with fast-path short-cut. - * - * @param {string} str - * @return {Object} - * @private - */ - -function fastparse (str) { - if (typeof str !== 'string' || str.charCodeAt(0) !== 0x2f /* / */) { - return parse(str) - } - - var pathname = str - var query = null - var search = null - - // This takes the regexp from https://github.com/joyent/node/pull/7878 - // Which is /^(\/[^?#\s]*)(\?[^#\s]*)?$/ - // And unrolls it into a for loop - for (var i = 1; i < str.length; i++) { - switch (str.charCodeAt(i)) { - case 0x3f: /* ? */ - if (search === null) { - pathname = str.substring(0, i) - query = str.substring(i + 1) - search = str.substring(i) - } - break - case 0x09: /* \t */ - case 0x0a: /* \n */ - case 0x0c: /* \f */ - case 0x0d: /* \r */ - case 0x20: /* */ - case 0x23: /* # */ - case 0xa0: - case 0xfeff: - return parse(str) - } - } - - var url = Url !== undefined - ? new Url() - : {} - url.path = str - url.href = str - url.pathname = pathname - url.query = query - url.search = search - - return url -} - -/** - * Determine if parsed is still fresh for url. - * - * @param {string} url - * @param {object} parsedUrl - * @return {boolean} - * @private - */ - -function fresh (url, parsedUrl) { - return typeof parsedUrl === 'object' && - parsedUrl !== null && - (Url === undefined || parsedUrl instanceof Url) && - parsedUrl._raw === url -} - - -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(187); - - -/***/ }), -/* 25 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(189), __esModule: true }; - -/***/ }), -/* 26 */ -/***/ (function(module, exports) { - -module.exports = function (it) { - if (typeof it != 'function') throw TypeError(it + ' is not a function!'); - return it; -}; - - -/***/ }), -/* 27 */ -/***/ (function(module, exports) { - -var hasOwnProperty = {}.hasOwnProperty; -module.exports = function (it, key) { - return hasOwnProperty.call(it, key); -}; - - -/***/ }), -/* 28 */ -/***/ (function(module, exports) { - -module.exports = {}; - - -/***/ }), -/* 29 */ -/***/ (function(module, exports) { - -var toString = {}.toString; - -module.exports = function (it) { - return toString.call(it).slice(8, -1); -}; - - -/***/ }), -/* 30 */ -/***/ (function(module, exports, __webpack_require__) { - -var ctx = __webpack_require__(13); -var call = __webpack_require__(204); -var isArrayIter = __webpack_require__(205); -var anObject = __webpack_require__(11); -var toLength = __webpack_require__(60); -var getIterFn = __webpack_require__(108); -var BREAK = {}; -var RETURN = {}; -var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) { - var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable); - var f = ctx(fn, that, entries ? 2 : 1); - var index = 0; - var length, step, iterator, result; - if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!'); - // fast case for arrays with default iterator - if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) { - result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); - if (result === BREAK || result === RETURN) return result; - } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) { - result = call(iterator, f, step.value, entries); - if (result === BREAK || result === RETURN) return result; - } -}; -exports.BREAK = BREAK; -exports.RETURN = RETURN; - - -/***/ }), -/* 31 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { value: true }); -var path = __webpack_require__(0); -var DATA_PATH = path.join(__dirname, '../data'); -exports.DATA_PATH = DATA_PATH; -var ANALYTICS_PATH = path.join(__dirname, '../../src'); -exports.ANALYTICS_PATH = ANALYTICS_PATH; -var ANOMALIES_PATH = path.join(ANALYTICS_PATH, 'anomalies'); -exports.ANOMALIES_PATH = ANOMALIES_PATH; -var SEGMENTS_PATH = path.join(ANALYTICS_PATH, 'segments'); -exports.SEGMENTS_PATH = SEGMENTS_PATH; -var METRICS_PATH = path.join(ANALYTICS_PATH, 'metrics'); -exports.METRICS_PATH = METRICS_PATH; - -/***/ }), -/* 32 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -module.exports = __webpack_require__(119); - - -/***/ }), -/* 33 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * content-type - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1 - * - * parameter = token "=" ( token / quoted-string ) - * token = 1*tchar - * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" - * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" - * / DIGIT / ALPHA - * ; any VCHAR, except delimiters - * quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE - * qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text - * obs-text = %x80-FF - * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) - */ -var PARAM_REGEXP = /; *([!#$%&'*+.^_`|~0-9A-Za-z-]+) *= *("(?:[\u000b\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u000b\u0020-\u00ff])*"|[!#$%&'*+.^_`|~0-9A-Za-z-]+) */g -var TEXT_REGEXP = /^[\u000b\u0020-\u007e\u0080-\u00ff]+$/ -var TOKEN_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/ - -/** - * RegExp to match quoted-pair in RFC 7230 sec 3.2.6 - * - * quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) - * obs-text = %x80-FF - */ -var QESC_REGEXP = /\\([\u000b\u0020-\u00ff])/g - -/** - * RegExp to match chars that must be quoted-pair in RFC 7230 sec 3.2.6 - */ -var QUOTE_REGEXP = /([\\"])/g - -/** - * RegExp to match type in RFC 7231 sec 3.1.1.1 - * - * media-type = type "/" subtype - * type = token - * subtype = token - */ -var TYPE_REGEXP = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/ - -/** - * Module exports. - * @public - */ - -exports.format = format -exports.parse = parse - -/** - * Format object to media type. - * - * @param {object} obj - * @return {string} - * @public - */ - -function format (obj) { - if (!obj || typeof obj !== 'object') { - throw new TypeError('argument obj is required') - } - - var parameters = obj.parameters - var type = obj.type - - if (!type || !TYPE_REGEXP.test(type)) { - throw new TypeError('invalid type') - } - - var string = type - - // append parameters - if (parameters && typeof parameters === 'object') { - var param - var params = Object.keys(parameters).sort() - - for (var i = 0; i < params.length; i++) { - param = params[i] - - if (!TOKEN_REGEXP.test(param)) { - throw new TypeError('invalid parameter name') - } - - string += '; ' + param + '=' + qstring(parameters[param]) - } - } - - return string -} - -/** - * Parse media type to object. - * - * @param {string|object} string - * @return {Object} - * @public - */ - -function parse (string) { - if (!string) { - throw new TypeError('argument string is required') - } - - // support req/res-like objects as argument - var header = typeof string === 'object' - ? getcontenttype(string) - : string - - if (typeof header !== 'string') { - throw new TypeError('argument string is required to be a string') - } - - var index = header.indexOf(';') - var type = index !== -1 - ? header.substr(0, index).trim() - : header.trim() - - if (!TYPE_REGEXP.test(type)) { - throw new TypeError('invalid media type') - } - - var obj = new ContentType(type.toLowerCase()) - - // parse parameters - if (index !== -1) { - var key - var match - var value - - PARAM_REGEXP.lastIndex = index - - while ((match = PARAM_REGEXP.exec(header))) { - if (match.index !== index) { - throw new TypeError('invalid parameter format') - } - - index += match[0].length - key = match[1].toLowerCase() - value = match[2] - - if (value[0] === '"') { - // remove quotes and escapes - value = value - .substr(1, value.length - 2) - .replace(QESC_REGEXP, '$1') - } - - obj.parameters[key] = value - } - - if (index !== header.length) { - throw new TypeError('invalid parameter format') - } - } - - return obj -} - -/** - * Get content-type from req/res objects. - * - * @param {object} - * @return {Object} - * @private - */ - -function getcontenttype (obj) { - var header - - if (typeof obj.getHeader === 'function') { - // res-like - header = obj.getHeader('content-type') - } else if (typeof obj.headers === 'object') { - // req-like - header = obj.headers && obj.headers['content-type'] - } - - if (typeof header !== 'string') { - throw new TypeError('content-type header is missing from object') - } - - return header -} - -/** - * Quote a string if necessary. - * - * @param {string} val - * @return {string} - * @private - */ - -function qstring (val) { - var str = String(val) - - // no need to quote tokens - if (TOKEN_REGEXP.test(str)) { - return str - } - - if (str.length > 0 && !TEXT_REGEXP.test(str)) { - throw new TypeError('invalid parameter value') - } - - return '"' + str.replace(QUOTE_REGEXP, '\\$1') + '"' -} - -/** - * Class to represent a content type. - * @private - */ -function ContentType (type) { - this.parameters = Object.create(null) - this.type = type -} - - -/***/ }), -/* 34 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * http-errors - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2016 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var deprecate = __webpack_require__(7)('http-errors') -var setPrototypeOf = __webpack_require__(35) -var statuses = __webpack_require__(21) -var inherits = __webpack_require__(74) - -/** - * Module exports. - * @public - */ - -module.exports = createError -module.exports.HttpError = createHttpErrorConstructor() - -// Populate exports for all constructors -populateConstructorExports(module.exports, statuses.codes, module.exports.HttpError) - -/** - * Get the code class of a status code. - * @private - */ - -function codeClass (status) { - return Number(String(status).charAt(0) + '00') -} - -/** - * Create a new HTTP Error. - * - * @returns {Error} - * @public - */ - -function createError () { - // so much arity going on ~_~ - var err - var msg - var status = 500 - var props = {} - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i] - if (arg instanceof Error) { - err = arg - status = err.status || err.statusCode || status - continue - } - switch (typeof arg) { - case 'string': - msg = arg - break - case 'number': - status = arg - if (i !== 0) { - deprecate('non-first-argument status code; replace with createError(' + arg + ', ...)') - } - break - case 'object': - props = arg - break - } - } - - if (typeof status === 'number' && (status < 400 || status >= 600)) { - deprecate('non-error status code; use only 4xx or 5xx status codes') - } - - if (typeof status !== 'number' || - (!statuses[status] && (status < 400 || status >= 600))) { - status = 500 - } - - // constructor - var HttpError = createError[status] || createError[codeClass(status)] - - if (!err) { - // create error - err = HttpError - ? new HttpError(msg) - : new Error(msg || statuses[status]) - Error.captureStackTrace(err, createError) - } - - if (!HttpError || !(err instanceof HttpError) || err.status !== status) { - // add properties to generic error - err.expose = status < 500 - err.status = err.statusCode = status - } - - for (var key in props) { - if (key !== 'status' && key !== 'statusCode') { - err[key] = props[key] - } - } - - return err -} - -/** - * Create HTTP error abstract base class. - * @private - */ - -function createHttpErrorConstructor () { - function HttpError () { - throw new TypeError('cannot construct abstract class') - } - - inherits(HttpError, Error) - - return HttpError -} - -/** - * Create a constructor for a client error. - * @private - */ - -function createClientErrorConstructor (HttpError, name, code) { - var className = name.match(/Error$/) ? name : name + 'Error' - - function ClientError (message) { - // create the error object - var msg = message != null ? message : statuses[code] - var err = new Error(msg) - - // capture a stack trace to the construction point - Error.captureStackTrace(err, ClientError) - - // adjust the [[Prototype]] - setPrototypeOf(err, ClientError.prototype) - - // redefine the error message - Object.defineProperty(err, 'message', { - enumerable: true, - configurable: true, - value: msg, - writable: true - }) - - // redefine the error name - Object.defineProperty(err, 'name', { - enumerable: false, - configurable: true, - value: className, - writable: true - }) - - return err - } - - inherits(ClientError, HttpError) - - ClientError.prototype.status = code - ClientError.prototype.statusCode = code - ClientError.prototype.expose = true - - return ClientError -} - -/** - * Create a constructor for a server error. - * @private - */ - -function createServerErrorConstructor (HttpError, name, code) { - var className = name.match(/Error$/) ? name : name + 'Error' - - function ServerError (message) { - // create the error object - var msg = message != null ? message : statuses[code] - var err = new Error(msg) - - // capture a stack trace to the construction point - Error.captureStackTrace(err, ServerError) - - // adjust the [[Prototype]] - setPrototypeOf(err, ServerError.prototype) - - // redefine the error message - Object.defineProperty(err, 'message', { - enumerable: true, - configurable: true, - value: msg, - writable: true - }) - - // redefine the error name - Object.defineProperty(err, 'name', { - enumerable: false, - configurable: true, - value: className, - writable: true - }) - - return err - } - - inherits(ServerError, HttpError) - - ServerError.prototype.status = code - ServerError.prototype.statusCode = code - ServerError.prototype.expose = false - - return ServerError -} - -/** - * Populate the exports object with constructors for every error class. - * @private - */ - -function populateConstructorExports (exports, codes, HttpError) { - codes.forEach(function forEachCode (code) { - var CodeError - var name = toIdentifier(statuses[code]) - - switch (codeClass(code)) { - case 400: - CodeError = createClientErrorConstructor(HttpError, name, code) - break - case 500: - CodeError = createServerErrorConstructor(HttpError, name, code) - break - } - - if (CodeError) { - // export the constructor - exports[code] = CodeError - exports[name] = CodeError - } - }) - - // backwards-compatibility - exports["I'mateapot"] = deprecate.function(exports.ImATeapot, - '"I\'mateapot"; use "ImATeapot" instead') -} - -/** - * Convert a string of words to a JavaScript identifier. - * @private - */ - -function toIdentifier (str) { - return str.split(' ').map(function (token) { - return token.slice(0, 1).toUpperCase() + token.slice(1) - }).join('').replace(/[^ _0-9a-z]/gi, '') -} - - -/***/ }), -/* 35 */ -/***/ (function(module, exports) { - -module.exports = Object.setPrototypeOf || ({__proto__:[]} instanceof Array ? setProtoOf : mixinProperties); - -function setProtoOf(obj, proto) { - obj.__proto__ = proto; - return obj; -} - -function mixinProperties(obj, proto) { - for (var prop in proto) { - if (!obj.hasOwnProperty(prop)) { - obj[prop] = proto[prop]; - } - } - return obj; -} - - -/***/ }), -/* 36 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * body-parser - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var createError = __webpack_require__(34) -var getBody = __webpack_require__(128) -var iconv = __webpack_require__(79) -var onFinished = __webpack_require__(37) -var zlib = __webpack_require__(84) - -/** - * Module exports. - */ - -module.exports = read - -/** - * Read a request into a buffer and parse. - * - * @param {object} req - * @param {object} res - * @param {function} next - * @param {function} parse - * @param {function} debug - * @param {object} options - * @private - */ - -function read (req, res, next, parse, debug, options) { - var length - var opts = options - var stream - - // flag as parsed - req._body = true - - // read options - var encoding = opts.encoding !== null - ? opts.encoding - : null - var verify = opts.verify - - try { - // get the content stream - stream = contentstream(req, debug, opts.inflate) - length = stream.length - stream.length = undefined - } catch (err) { - return next(err) - } - - // set raw-body options - opts.length = length - opts.encoding = verify - ? null - : encoding - - // assert charset is supported - if (opts.encoding === null && encoding !== null && !iconv.encodingExists(encoding)) { - return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { - charset: encoding.toLowerCase(), - type: 'charset.unsupported' - })) - } - - // read body - debug('read body') - getBody(stream, opts, function (error, body) { - if (error) { - var _error - - if (error.type === 'encoding.unsupported') { - // echo back charset - _error = createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', { - charset: encoding.toLowerCase(), - type: 'charset.unsupported' - }) - } else { - // set status code on error - _error = createError(400, error) - } - - // read off entire request - stream.resume() - onFinished(req, function onfinished () { - next(createError(400, _error)) - }) - return - } - - // verify - if (verify) { - try { - debug('verify body') - verify(req, res, body, encoding) - } catch (err) { - next(createError(403, err, { - body: body, - type: err.type || 'entity.verify.failed' - })) - return - } - } - - // parse - var str = body - try { - debug('parse body') - str = typeof body !== 'string' && encoding !== null - ? iconv.decode(body, encoding) - : body - req.body = parse(str) - } catch (err) { - next(createError(400, err, { - body: str, - type: err.type || 'entity.parse.failed' - })) - return - } - - next() - }) -} - -/** - * Get the content stream of the request. - * - * @param {object} req - * @param {function} debug - * @param {boolean} [inflate=true] - * @return {object} - * @api private - */ - -function contentstream (req, debug, inflate) { - var encoding = (req.headers['content-encoding'] || 'identity').toLowerCase() - var length = req.headers['content-length'] - var stream - - debug('content-encoding "%s"', encoding) - - if (inflate === false && encoding !== 'identity') { - throw createError(415, 'content encoding unsupported', { - encoding: encoding, - type: 'encoding.unsupported' - }) - } - - switch (encoding) { - case 'deflate': - stream = zlib.createInflate() - debug('inflate body') - req.pipe(stream) - break - case 'gzip': - stream = zlib.createGunzip() - debug('gunzip body') - req.pipe(stream) - break - case 'identity': - stream = req - stream.length = length - break - default: - throw createError(415, 'unsupported content encoding "' + encoding + '"', { - encoding: encoding, - type: 'encoding.unsupported' - }) - } - - return stream -} - - -/***/ }), -/* 37 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * on-finished - * Copyright(c) 2013 Jonathan Ong - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = onFinished -module.exports.isFinished = isFinished - -/** - * Module dependencies. - * @private - */ - -var first = __webpack_require__(151) - -/** - * Variables. - * @private - */ - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) } - -/** - * Invoke callback when the response has finished, useful for - * cleaning up resources afterwards. - * - * @param {object} msg - * @param {function} listener - * @return {object} - * @public - */ - -function onFinished(msg, listener) { - if (isFinished(msg) !== false) { - defer(listener, null, msg) - return msg - } - - // attach the listener to the message - attachListener(msg, listener) - - return msg -} - -/** - * Determine if message is already finished. - * - * @param {object} msg - * @return {boolean} - * @public - */ - -function isFinished(msg) { - var socket = msg.socket - - if (typeof msg.finished === 'boolean') { - // OutgoingMessage - return Boolean(msg.finished || (socket && !socket.writable)) - } - - if (typeof msg.complete === 'boolean') { - // IncomingMessage - return Boolean(msg.upgrade || !socket || !socket.readable || (msg.complete && !msg.readable)) - } - - // don't know - return undefined -} - -/** - * Attach a finished listener to the message. - * - * @param {object} msg - * @param {function} callback - * @private - */ - -function attachFinishedListener(msg, callback) { - var eeMsg - var eeSocket - var finished = false - - function onFinish(error) { - eeMsg.cancel() - eeSocket.cancel() - - finished = true - callback(error) - } - - // finished on first message event - eeMsg = eeSocket = first([[msg, 'end', 'finish']], onFinish) - - function onSocket(socket) { - // remove listener - msg.removeListener('socket', onSocket) - - if (finished) return - if (eeMsg !== eeSocket) return - - // finished on first socket event - eeSocket = first([[socket, 'error', 'close']], onFinish) - } - - if (msg.socket) { - // socket already assigned - onSocket(msg.socket) - return - } - - // wait for socket to be assigned - msg.on('socket', onSocket) - - if (msg.socket === undefined) { - // node.js 0.8 patch - patchAssignSocket(msg, onSocket) - } -} - -/** - * Attach the listener to the message. - * - * @param {object} msg - * @return {function} - * @private - */ - -function attachListener(msg, listener) { - var attached = msg.__onFinished - - // create a private single listener with queue - if (!attached || !attached.queue) { - attached = msg.__onFinished = createListener(msg) - attachFinishedListener(msg, attached) - } - - attached.queue.push(listener) -} - -/** - * Create listener on message. - * - * @param {object} msg - * @return {function} - * @private - */ - -function createListener(msg) { - function listener(err) { - if (msg.__onFinished === listener) msg.__onFinished = null - if (!listener.queue) return - - var queue = listener.queue - listener.queue = null - - for (var i = 0; i < queue.length; i++) { - queue[i](err, msg) - } - } - - listener.queue = [] - - return listener -} - -/** - * Patch ServerResponse.prototype.assignSocket for node.js 0.8. - * - * @param {ServerResponse} res - * @param {function} callback - * @private - */ - -function patchAssignSocket(res, callback) { - var assignSocket = res.assignSocket - - if (typeof assignSocket !== 'function') return - - // res.on('socket', callback) is broken in 0.8 - res.assignSocket = function _assignSocket(socket) { - assignSocket.call(this, socket) - callback(socket) - } -} - - -/***/ }), -/* 38 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * encodeurl - * Copyright(c) 2016 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = encodeUrl - -/** - * RegExp to match non-URL code points, *after* encoding (i.e. not including "%") - * and including invalid escape sequences. - * @private - */ - -var ENCODE_CHARS_REGEXP = /(?:[^\x21\x25\x26-\x3B\x3D\x3F-\x5B\x5D\x5F\x61-\x7A\x7E]|%(?:[^0-9A-Fa-f]|[0-9A-Fa-f][^0-9A-Fa-f]|$))+/g - -/** - * RegExp to match unmatched surrogate pair. - * @private - */ - -var UNMATCHED_SURROGATE_PAIR_REGEXP = /(^|[^\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF]([^\uDC00-\uDFFF]|$)/g - -/** - * String to replace unmatched surrogate pair with. - * @private - */ - -var UNMATCHED_SURROGATE_PAIR_REPLACE = '$1\uFFFD$2' - -/** - * Encode a URL to a percent-encoded form, excluding already-encoded sequences. - * - * This function will take an already-encoded URL and encode all the non-URL - * code points. This function will not encode the "%" character unless it is - * not part of a valid sequence (`%20` will be left as-is, but `%foo` will - * be encoded as `%25foo`). - * - * This encode is meant to be "safe" and does not throw errors. It will try as - * hard as it can to properly encode the given URL, including replacing any raw, - * unpaired surrogate pairs with the Unicode replacement character prior to - * encoding. - * - * @param {string} url - * @return {string} - * @public - */ - -function encodeUrl (url) { - return String(url) - .replace(UNMATCHED_SURROGATE_PAIR_REGEXP, UNMATCHED_SURROGATE_PAIR_REPLACE) - .replace(ENCODE_CHARS_REGEXP, encodeURI) -} - - -/***/ }), -/* 39 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * escape-html - * Copyright(c) 2012-2013 TJ Holowaychuk - * Copyright(c) 2015 Andreas Lubbe - * Copyright(c) 2015 Tiancheng "Timothy" Gu - * MIT Licensed - */ - - - -/** - * Module variables. - * @private - */ - -var matchHtmlRegExp = /["'&<>]/; - -/** - * Module exports. - * @public - */ - -module.exports = escapeHtml; - -/** - * Escape special characters in the given string of html. - * - * @param {string} string The string to escape for inserting into HTML - * @return {string} - * @public - */ - -function escapeHtml(string) { - var str = '' + string; - var match = matchHtmlRegExp.exec(str); - - if (!match) { - return str; - } - - var escape; - var html = ''; - var index = 0; - var lastIndex = 0; - - for (index = match.index; index < str.length; index++) { - switch (str.charCodeAt(index)) { - case 34: // " - escape = '"'; - break; - case 38: // & - escape = '&'; - break; - case 39: // ' - escape = '''; - break; - case 60: // < - escape = '<'; - break; - case 62: // > - escape = '>'; - break; - default: - continue; - } - - if (lastIndex !== index) { - html += str.substring(lastIndex, index); - } - - lastIndex = index + 1; - html += escape; - } - - return lastIndex !== index - ? html + str.substring(lastIndex, index) - : html; -} - - -/***/ }), -/* 40 */ -/***/ (function(module, exports) { - -module.exports = require("url"); - -/***/ }), -/* 41 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Expose `arrayFlatten`. - */ -module.exports = arrayFlatten - -/** - * Recursive flatten function with depth. - * - * @param {Array} array - * @param {Array} result - * @param {Number} depth - * @return {Array} - */ -function flattenWithDepth (array, result, depth) { - for (var i = 0; i < array.length; i++) { - var value = array[i] - - if (depth > 0 && Array.isArray(value)) { - flattenWithDepth(value, result, depth - 1) - } else { - result.push(value) - } - } - - return result -} - -/** - * Recursive flatten function. Omitting depth is slightly faster. - * - * @param {Array} array - * @param {Array} result - * @return {Array} - */ -function flattenForever (array, result) { - for (var i = 0; i < array.length; i++) { - var value = array[i] - - if (Array.isArray(value)) { - flattenForever(value, result) - } else { - result.push(value) - } - } - - return result -} - -/** - * Flatten an array, with the ability to define a depth. - * - * @param {Array} array - * @param {Number} depth - * @return {Array} - */ -function arrayFlatten (array, depth) { - if (depth == null) { - return flattenForever(array, []) - } - - return flattenWithDepth(array, [], depth) -} - - -/***/ }), -/* 42 */ -/***/ (function(module, exports) { - -/** - * Merge object b with object a. - * - * var a = { foo: 'bar' } - * , b = { bar: 'baz' }; - * - * merge(a, b); - * // => { foo: 'bar', bar: 'baz' } - * - * @param {Object} a - * @param {Object} b - * @return {Object} - * @api public - */ - -exports = module.exports = function(a, b){ - if (a && b) { - for (var key in b) { - a[key] = b[key]; - } - } - return a; -}; - - -/***/ }), -/* 43 */ -/***/ (function(module, exports) { - -module.exports = require("crypto"); - -/***/ }), -/* 44 */ -/***/ (function(module, exports) { - -module.exports = function (exec) { - try { - return !!exec(); - } catch (e) { - return true; - } -}; - - -/***/ }), -/* 45 */ -/***/ (function(module, exports, __webpack_require__) { - -var def = __webpack_require__(15).f; -var has = __webpack_require__(27); -var TAG = __webpack_require__(4)('toStringTag'); - -module.exports = function (it, tag, stat) { - if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); -}; - - -/***/ }), -/* 46 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _stringify = __webpack_require__(18); - -var _stringify2 = _interopRequireDefault(_stringify); - -var _regenerator = __webpack_require__(24); - -var _regenerator2 = _interopRequireDefault(_regenerator); - -var _promise = __webpack_require__(25); - -var _promise2 = _interopRequireDefault(_promise); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) { - return new (P || (P = _promise2.default))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : new P(function (resolve) { - resolve(result.value); - }).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -var fs = __webpack_require__(8); -function getJsonData(filename) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_regenerator2.default.mark(function _callee() { - var data; - return _regenerator2.default.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return new _promise2.default(function (resolve, reject) { - fs.readFile(filename, 'utf8', function (err, data) { - if (err) { - console.error(err); - reject('Can`t read file'); - } else { - resolve(data); - } - }); - }); - - case 2: - data = _context.sent; - _context.prev = 3; - return _context.abrupt("return", JSON.parse(data)); - - case 7: - _context.prev = 7; - _context.t0 = _context["catch"](3); - - console.error(_context.t0); - throw new Error('Wrong file format'); - - case 11: - case "end": - return _context.stop(); - } - } - }, _callee, this, [[3, 7]]); - })); -} -exports.getJsonData = getJsonData; -function writeJsonData(filename, data) { - return new _promise2.default(function (resolve, reject) { - fs.writeFile(filename, (0, _stringify2.default)(data), 'utf8', function (err) { - if (err) { - console.error(err); - reject('Cat`t write file'); - } else { - resolve(); - } - }); - }); -} -exports.writeJsonData = writeJsonData; -function getJsonDataSync(filename) { - var data = fs.readFileSync(filename, 'utf8'); - try { - return JSON.parse(data); - } catch (e) { - console.error(e); - throw new Error('Wrong file format'); - } -} -exports.getJsonDataSync = getJsonDataSync; -function writeJsonDataSync(filename, data) { - fs.writeFileSync(filename, (0, _stringify2.default)(data)); -} -exports.writeJsonDataSync = writeJsonDataSync; - -/***/ }), -/* 47 */ -/***/ (function(module, exports) { - -module.exports = require("events"); - -/***/ }), -/* 48 */ -/***/ (function(module, exports) { - -module.exports = require("util"); - -/***/ }), -/* 49 */ -/***/ (function(module, exports) { - -module.exports = [["0","\u0000",127,"€"],["8140","丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪",5,"乲乴",9,"乿",6,"亇亊"],["8180","亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂",6,"伋伌伒",4,"伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾",4,"佄佅佇",5,"佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢"],["8240","侤侫侭侰",4,"侶",8,"俀俁係俆俇俈俉俋俌俍俒",4,"俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿",11],["8280","個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯",10,"倻倽倿偀偁偂偄偅偆偉偊偋偍偐",4,"偖偗偘偙偛偝",7,"偦",5,"偭",8,"偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎",20,"傤傦傪傫傭",4,"傳",6,"傼"],["8340","傽",17,"僐",5,"僗僘僙僛",10,"僨僩僪僫僯僰僱僲僴僶",4,"僼",9,"儈"],["8380","儉儊儌",5,"儓",13,"儢",28,"兂兇兊兌兎兏児兒兓兗兘兙兛兝",4,"兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦",4,"冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒",5],["8440","凘凙凚凜凞凟凢凣凥",5,"凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄",5,"剋剎剏剒剓剕剗剘"],["8480","剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳",9,"剾劀劃",4,"劉",6,"劑劒劔",6,"劜劤劥劦劧劮劯劰労",9,"勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務",5,"勠勡勢勣勥",10,"勱",7,"勻勼勽匁匂匃匄匇匉匊匋匌匎"],["8540","匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯",9,"匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏"],["8580","厐",4,"厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯",6,"厷厸厹厺厼厽厾叀參",4,"収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝",4,"呣呥呧呩",7,"呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡"],["8640","咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠",4,"哫哬哯哰哱哴",5,"哻哾唀唂唃唄唅唈唊",4,"唒唓唕",5,"唜唝唞唟唡唥唦"],["8680","唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋",4,"啑啒啓啔啗",4,"啝啞啟啠啢啣啨啩啫啯",5,"啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠",6,"喨",8,"喲喴営喸喺喼喿",4,"嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗",4,"嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸",4,"嗿嘂嘃嘄嘅"],["8740","嘆嘇嘊嘋嘍嘐",7,"嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀",11,"噏",4,"噕噖噚噛噝",4],["8780","噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽",7,"嚇",6,"嚐嚑嚒嚔",14,"嚤",10,"嚰",6,"嚸嚹嚺嚻嚽",12,"囋",8,"囕囖囘囙囜団囥",5,"囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國",6],["8840","園",9,"圝圞圠圡圢圤圥圦圧圫圱圲圴",4,"圼圽圿坁坃坄坅坆坈坉坋坒",4,"坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀"],["8880","垁垇垈垉垊垍",4,"垔",6,"垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹",8,"埄",6,"埌埍埐埑埓埖埗埛埜埞埡埢埣埥",7,"埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥",4,"堫",4,"報堲堳場堶",7],["8940","堾",5,"塅",6,"塎塏塐塒塓塕塖塗塙",4,"塟",5,"塦",4,"塭",16,"塿墂墄墆墇墈墊墋墌"],["8980","墍",4,"墔",4,"墛墜墝墠",7,"墪",17,"墽墾墿壀壂壃壄壆",10,"壒壓壔壖",13,"壥",5,"壭壯壱売壴壵壷壸壺",7,"夃夅夆夈",4,"夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻"],["8a40","夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛",4,"奡奣奤奦",12,"奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦"],["8a80","妧妬妭妰妱妳",5,"妺妼妽妿",6,"姇姈姉姌姍姎姏姕姖姙姛姞",4,"姤姦姧姩姪姫姭",11,"姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪",6,"娳娵娷",4,"娽娾娿婁",4,"婇婈婋",9,"婖婗婘婙婛",5],["8b40","婡婣婤婥婦婨婩婫",8,"婸婹婻婼婽婾媀",17,"媓",6,"媜",13,"媫媬"],["8b80","媭",4,"媴媶媷媹",4,"媿嫀嫃",5,"嫊嫋嫍",4,"嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬",4,"嫲",22,"嬊",11,"嬘",25,"嬳嬵嬶嬸",7,"孁",6],["8c40","孈",7,"孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏"],["8c80","寑寔",8,"寠寢寣實寧審",4,"寯寱",6,"寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧",6,"屰屲",6,"屻屼屽屾岀岃",4,"岉岊岋岎岏岒岓岕岝",4,"岤",4],["8d40","岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅",5,"峌",5,"峓",5,"峚",6,"峢峣峧峩峫峬峮峯峱",9,"峼",4],["8d80","崁崄崅崈",5,"崏",4,"崕崗崘崙崚崜崝崟",4,"崥崨崪崫崬崯",4,"崵",7,"崿",7,"嵈嵉嵍",10,"嵙嵚嵜嵞",10,"嵪嵭嵮嵰嵱嵲嵳嵵",12,"嶃",21,"嶚嶛嶜嶞嶟嶠"],["8e40","嶡",21,"嶸",12,"巆",6,"巎",12,"巜巟巠巣巤巪巬巭"],["8e80","巰巵巶巸",4,"巿帀帄帇帉帊帋帍帎帒帓帗帞",7,"帨",4,"帯帰帲",4,"帹帺帾帿幀幁幃幆",5,"幍",6,"幖",4,"幜幝幟幠幣",14,"幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨",4,"庮",4,"庴庺庻庼庽庿",6],["8f40","廆廇廈廋",5,"廔廕廗廘廙廚廜",11,"廩廫",8,"廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤"],["8f80","弨弫弬弮弰弲",6,"弻弽弾弿彁",14,"彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢",5,"復徫徬徯",5,"徶徸徹徺徻徾",4,"忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇"],["9040","怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰",4,"怶",4,"怽怾恀恄",6,"恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀"],["9080","悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽",7,"惇惈惉惌",4,"惒惓惔惖惗惙惛惞惡",4,"惪惱惲惵惷惸惻",4,"愂愃愄愅愇愊愋愌愐",4,"愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬",18,"慀",6],["9140","慇慉態慍慏慐慒慓慔慖",6,"慞慟慠慡慣慤慥慦慩",6,"慱慲慳慴慶慸",18,"憌憍憏",4,"憕"],["9180","憖",6,"憞",8,"憪憫憭",9,"憸",5,"憿懀懁懃",4,"應懌",4,"懓懕",16,"懧",13,"懶",8,"戀",5,"戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸",4,"扂扄扅扆扊"],["9240","扏扐払扖扗扙扚扜",6,"扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋",5,"抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁"],["9280","拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳",5,"挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖",7,"捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙",6,"採掤掦掫掯掱掲掵掶掹掻掽掿揀"],["9340","揁揂揃揅揇揈揊揋揌揑揓揔揕揗",6,"揟揢揤",4,"揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆",4,"損搎搑搒搕",5,"搝搟搢搣搤"],["9380","搥搧搨搩搫搮",5,"搵",4,"搻搼搾摀摂摃摉摋",6,"摓摕摖摗摙",4,"摟",7,"摨摪摫摬摮",9,"摻",6,"撃撆撈",8,"撓撔撗撘撚撛撜撝撟",4,"撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆",6,"擏擑擓擔擕擖擙據"],["9440","擛擜擝擟擠擡擣擥擧",24,"攁",7,"攊",7,"攓",4,"攙",8],["9480","攢攣攤攦",4,"攬攭攰攱攲攳攷攺攼攽敀",4,"敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數",14,"斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱",7,"斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘",7,"旡旣旤旪旫"],["9540","旲旳旴旵旸旹旻",4,"昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷",4,"昽昿晀時晄",6,"晍晎晐晑晘"],["9580","晙晛晜晝晞晠晢晣晥晧晩",4,"晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘",4,"暞",8,"暩",4,"暯",4,"暵暶暷暸暺暻暼暽暿",25,"曚曞",7,"曧曨曪",5,"曱曵曶書曺曻曽朁朂會"],["9640","朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠",5,"朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗",4,"杝杢杣杤杦杧杫杬杮東杴杶"],["9680","杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹",7,"柂柅",9,"柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵",7,"柾栁栂栃栄栆栍栐栒栔栕栘",4,"栞栟栠栢",6,"栫",6,"栴栵栶栺栻栿桇桋桍桏桒桖",5],["9740","桜桝桞桟桪桬",7,"桵桸",8,"梂梄梇",7,"梐梑梒梔梕梖梘",9,"梣梤梥梩梪梫梬梮梱梲梴梶梷梸"],["9780","梹",6,"棁棃",5,"棊棌棎棏棐棑棓棔棖棗棙棛",4,"棡棢棤",9,"棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆",4,"椌椏椑椓",11,"椡椢椣椥",7,"椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃",16,"楕楖楘楙楛楜楟"],["9840","楡楢楤楥楧楨楩楪楬業楯楰楲",4,"楺楻楽楾楿榁榃榅榊榋榌榎",5,"榖榗榙榚榝",9,"榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽"],["9880","榾榿槀槂",7,"構槍槏槑槒槓槕",5,"槜槝槞槡",11,"槮槯槰槱槳",9,"槾樀",9,"樋",11,"標",5,"樠樢",5,"権樫樬樭樮樰樲樳樴樶",6,"樿",4,"橅橆橈",7,"橑",6,"橚"],["9940","橜",4,"橢橣橤橦",10,"橲",6,"橺橻橽橾橿檁檂檃檅",8,"檏檒",4,"檘",7,"檡",5],["9980","檧檨檪檭",114,"欥欦欨",6],["9a40","欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍",11,"歚",7,"歨歩歫",13,"歺歽歾歿殀殅殈"],["9a80","殌殎殏殐殑殔殕殗殘殙殜",4,"殢",7,"殫",7,"殶殸",6,"毀毃毄毆",4,"毌毎毐毑毘毚毜",4,"毢",7,"毬毭毮毰毱毲毴毶毷毸毺毻毼毾",6,"氈",4,"氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋",4,"汑汒汓汖汘"],["9b40","汙汚汢汣汥汦汧汫",4,"汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘"],["9b80","泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟",5,"洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽",4,"涃涄涆涇涊涋涍涏涐涒涖",4,"涜涢涥涬涭涰涱涳涴涶涷涹",5,"淁淂淃淈淉淊"],["9c40","淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽",7,"渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵"],["9c80","渶渷渹渻",7,"湅",7,"湏湐湑湒湕湗湙湚湜湝湞湠",10,"湬湭湯",14,"満溁溂溄溇溈溊",4,"溑",6,"溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪",5],["9d40","滰滱滲滳滵滶滷滸滺",7,"漃漄漅漇漈漊",4,"漐漑漒漖",9,"漡漢漣漥漦漧漨漬漮漰漲漴漵漷",6,"漿潀潁潂"],["9d80","潃潄潅潈潉潊潌潎",9,"潙潚潛潝潟潠潡潣潤潥潧",5,"潯潰潱潳潵潶潷潹潻潽",6,"澅澆澇澊澋澏",12,"澝澞澟澠澢",4,"澨",10,"澴澵澷澸澺",5,"濁濃",5,"濊",6,"濓",10,"濟濢濣濤濥"],["9e40","濦",7,"濰",32,"瀒",7,"瀜",6,"瀤",6],["9e80","瀫",9,"瀶瀷瀸瀺",17,"灍灎灐",13,"灟",11,"灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞",12,"炰炲炴炵炶為炾炿烄烅烆烇烉烋",12,"烚"],["9f40","烜烝烞烠烡烢烣烥烪烮烰",6,"烸烺烻烼烾",10,"焋",4,"焑焒焔焗焛",10,"焧",7,"焲焳焴"],["9f80","焵焷",13,"煆煇煈煉煋煍煏",12,"煝煟",4,"煥煩",4,"煯煰煱煴煵煶煷煹煻煼煾",5,"熅",4,"熋熌熍熎熐熑熒熓熕熖熗熚",4,"熡",6,"熩熪熫熭",5,"熴熶熷熸熺",8,"燄",9,"燏",4],["a040","燖",9,"燡燢燣燤燦燨",5,"燯",9,"燺",11,"爇",19],["a080","爛爜爞",9,"爩爫爭爮爯爲爳爴爺爼爾牀",6,"牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅",4,"犌犎犐犑犓",11,"犠",11,"犮犱犲犳犵犺",6,"狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛"],["a1a1"," 、。·ˉˇ¨〃々—~‖…‘’“”〔〕〈",7,"〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓"],["a2a1","ⅰ",9],["a2b1","⒈",19,"⑴",19,"①",9],["a2e5","㈠",9],["a2f1","Ⅰ",11],["a3a1","!"#¥%",88," ̄"],["a4a1","ぁ",82],["a5a1","ァ",85],["a6a1","Α",16,"Σ",6],["a6c1","α",16,"σ",6],["a6e0","︵︶︹︺︿﹀︽︾﹁﹂﹃﹄"],["a6ee","︻︼︷︸︱"],["a6f4","︳︴"],["a7a1","А",5,"ЁЖ",25],["a7d1","а",5,"ёж",25],["a840","ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═",35,"▁",6],["a880","█",7,"▓▔▕▼▽◢◣◤◥☉⊕〒〝〞"],["a8a1","āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ"],["a8bd","ńň"],["a8c0","ɡ"],["a8c5","ㄅ",36],["a940","〡",8,"㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦"],["a959","℡㈱"],["a95c","‐"],["a960","ー゛゜ヽヾ〆ゝゞ﹉",9,"﹔﹕﹖﹗﹙",8],["a980","﹢",4,"﹨﹩﹪﹫"],["a996","〇"],["a9a4","─",75],["aa40","狜狝狟狢",5,"狪狫狵狶狹狽狾狿猀猂猄",5,"猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀",8],["aa80","獉獊獋獌獎獏獑獓獔獕獖獘",7,"獡",10,"獮獰獱"],["ab40","獲",11,"獿",4,"玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣",5,"玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃",4],["ab80","珋珌珎珒",6,"珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳",4],["ac40","珸",10,"琄琇琈琋琌琍琎琑",8,"琜",5,"琣琤琧琩琫琭琯琱琲琷",4,"琽琾琿瑀瑂",11],["ac80","瑎",6,"瑖瑘瑝瑠",12,"瑮瑯瑱",4,"瑸瑹瑺"],["ad40","瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑",10,"璝璟",7,"璪",15,"璻",12],["ad80","瓈",9,"瓓",8,"瓝瓟瓡瓥瓧",6,"瓰瓱瓲"],["ae40","瓳瓵瓸",6,"甀甁甂甃甅",7,"甎甐甒甔甕甖甗甛甝甞甠",4,"甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘"],["ae80","畝",7,"畧畨畩畫",6,"畳畵當畷畺",4,"疀疁疂疄疅疇"],["af40","疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦",4,"疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇"],["af80","瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄"],["b040","癅",6,"癎",5,"癕癗",4,"癝癟癠癡癢癤",6,"癬癭癮癰",7,"癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛"],["b080","皜",7,"皥",8,"皯皰皳皵",9,"盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥"],["b140","盄盇盉盋盌盓盕盙盚盜盝盞盠",4,"盦",7,"盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎",10,"眛眜眝眞眡眣眤眥眧眪眫"],["b180","眬眮眰",4,"眹眻眽眾眿睂睄睅睆睈",7,"睒",7,"睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳"],["b240","睝睞睟睠睤睧睩睪睭",11,"睺睻睼瞁瞂瞃瞆",5,"瞏瞐瞓",11,"瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶",4],["b280","瞼瞾矀",12,"矎",8,"矘矙矚矝",4,"矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖"],["b340","矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃",5,"砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚"],["b380","硛硜硞",11,"硯",7,"硸硹硺硻硽",6,"场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚"],["b440","碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨",7,"碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚",9],["b480","磤磥磦磧磩磪磫磭",4,"磳磵磶磸磹磻",5,"礂礃礄礆",6,"础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮"],["b540","礍",5,"礔",9,"礟",4,"礥",14,"礵",4,"礽礿祂祃祄祅祇祊",8,"祔祕祘祙祡祣"],["b580","祤祦祩祪祫祬祮祰",6,"祹祻",4,"禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠"],["b640","禓",6,"禛",11,"禨",10,"禴",4,"禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙",5,"秠秡秢秥秨秪"],["b680","秬秮秱",6,"秹秺秼秾秿稁稄稅稇稈稉稊稌稏",4,"稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二"],["b740","稝稟稡稢稤",14,"稴稵稶稸稺稾穀",5,"穇",9,"穒",4,"穘",16],["b780","穩",6,"穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服"],["b840","窣窤窧窩窪窫窮",4,"窴",10,"竀",10,"竌",9,"竗竘竚竛竜竝竡竢竤竧",5,"竮竰竱竲竳"],["b880","竴",4,"竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹"],["b940","笯笰笲笴笵笶笷笹笻笽笿",5,"筆筈筊筍筎筓筕筗筙筜筞筟筡筣",10,"筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆",6,"箎箏"],["b980","箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹",7,"篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈"],["ba40","篅篈築篊篋篍篎篏篐篒篔",4,"篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲",4,"篸篹篺篻篽篿",7,"簈簉簊簍簎簐",5,"簗簘簙"],["ba80","簚",4,"簠",5,"簨簩簫",12,"簹",5,"籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖"],["bb40","籃",9,"籎",36,"籵",5,"籾",9],["bb80","粈粊",6,"粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴",4,"粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕"],["bc40","粿糀糂糃糄糆糉糋糎",6,"糘糚糛糝糞糡",6,"糩",5,"糰",7,"糹糺糼",13,"紋",5],["bc80","紑",14,"紡紣紤紥紦紨紩紪紬紭紮細",6,"肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件"],["bd40","紷",54,"絯",7],["bd80","絸",32,"健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸"],["be40","継",12,"綧",6,"綯",42],["be80","線",32,"尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻"],["bf40","緻",62],["bf80","縺縼",4,"繂",4,"繈",21,"俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀"],["c040","繞",35,"纃",23,"纜纝纞"],["c080","纮纴纻纼绖绤绬绹缊缐缞缷缹缻",6,"罃罆",9,"罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐"],["c140","罖罙罛罜罝罞罠罣",4,"罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂",7,"羋羍羏",4,"羕",4,"羛羜羠羢羣羥羦羨",6,"羱"],["c180","羳",4,"羺羻羾翀翂翃翄翆翇翈翉翋翍翏",4,"翖翗翙",5,"翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿"],["c240","翤翧翨翪翫翬翭翯翲翴",6,"翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫",5,"耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗"],["c280","聙聛",13,"聫",5,"聲",11,"隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫"],["c340","聾肁肂肅肈肊肍",5,"肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇",4,"胏",6,"胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋"],["c380","脌脕脗脙脛脜脝脟",12,"脭脮脰脳脴脵脷脹",4,"脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸"],["c440","腀",5,"腇腉腍腎腏腒腖腗腘腛",4,"腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃",4,"膉膋膌膍膎膐膒",5,"膙膚膞",4,"膤膥"],["c480","膧膩膫",7,"膴",5,"膼膽膾膿臄臅臇臈臉臋臍",6,"摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁"],["c540","臔",14,"臤臥臦臨臩臫臮",4,"臵",5,"臽臿舃與",4,"舎舏舑舓舕",5,"舝舠舤舥舦舧舩舮舲舺舼舽舿"],["c580","艀艁艂艃艅艆艈艊艌艍艎艐",7,"艙艛艜艝艞艠",7,"艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗"],["c640","艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸"],["c680","苺苼",4,"茊茋茍茐茒茓茖茘茙茝",9,"茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐"],["c740","茾茿荁荂荄荅荈荊",4,"荓荕",4,"荝荢荰",6,"荹荺荾",6,"莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡",6,"莬莭莮"],["c780","莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠"],["c840","菮華菳",4,"菺菻菼菾菿萀萂萅萇萈萉萊萐萒",5,"萙萚萛萞",5,"萩",7,"萲",5,"萹萺萻萾",7,"葇葈葉"],["c880","葊",6,"葒",4,"葘葝葞葟葠葢葤",4,"葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁"],["c940","葽",4,"蒃蒄蒅蒆蒊蒍蒏",7,"蒘蒚蒛蒝蒞蒟蒠蒢",12,"蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗"],["c980","蓘",4,"蓞蓡蓢蓤蓧",4,"蓭蓮蓯蓱",10,"蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳"],["ca40","蔃",8,"蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢",8,"蔭",9,"蔾",4,"蕄蕅蕆蕇蕋",10],["ca80","蕗蕘蕚蕛蕜蕝蕟",4,"蕥蕦蕧蕩",8,"蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱"],["cb40","薂薃薆薈",6,"薐",10,"薝",6,"薥薦薧薩薫薬薭薱",5,"薸薺",6,"藂",6,"藊",4,"藑藒"],["cb80","藔藖",5,"藝",6,"藥藦藧藨藪",14,"恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔"],["cc40","藹藺藼藽藾蘀",4,"蘆",10,"蘒蘓蘔蘕蘗",15,"蘨蘪",13,"蘹蘺蘻蘽蘾蘿虀"],["cc80","虁",11,"虒虓處",4,"虛虜虝號虠虡虣",7,"獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃"],["cd40","虭虯虰虲",6,"蚃",6,"蚎",4,"蚔蚖",5,"蚞",4,"蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻",4,"蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜"],["cd80","蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威"],["ce40","蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀",6,"蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚",5,"蝡蝢蝦",7,"蝯蝱蝲蝳蝵"],["ce80","蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎",4,"螔螕螖螘",6,"螠",4,"巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺"],["cf40","螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁",4,"蟇蟈蟉蟌",4,"蟔",6,"蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯",9],["cf80","蟺蟻蟼蟽蟿蠀蠁蠂蠄",5,"蠋",7,"蠔蠗蠘蠙蠚蠜",4,"蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓"],["d040","蠤",13,"蠳",5,"蠺蠻蠽蠾蠿衁衂衃衆",5,"衎",5,"衕衖衘衚",6,"衦衧衪衭衯衱衳衴衵衶衸衹衺"],["d080","衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗",4,"袝",4,"袣袥",5,"小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄"],["d140","袬袮袯袰袲",4,"袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚",4,"裠裡裦裧裩",6,"裲裵裶裷裺裻製裿褀褁褃",5],["d180","褉褋",4,"褑褔",4,"褜",4,"褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶"],["d240","褸",8,"襂襃襅",24,"襠",5,"襧",19,"襼"],["d280","襽襾覀覂覄覅覇",26,"摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐"],["d340","覢",30,"觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴",6],["d380","觻",4,"訁",5,"計",21,"印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉"],["d440","訞",31,"訿",8,"詉",21],["d480","詟",25,"詺",6,"浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧"],["d540","誁",7,"誋",7,"誔",46],["d580","諃",32,"铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政"],["d640","諤",34,"謈",27],["d680","謤謥謧",30,"帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑"],["d740","譆",31,"譧",4,"譭",25],["d780","讇",24,"讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座"],["d840","谸",8,"豂豃豄豅豈豊豋豍",7,"豖豗豘豙豛",5,"豣",6,"豬",6,"豴豵豶豷豻",6,"貃貄貆貇"],["d880","貈貋貍",6,"貕貖貗貙",20,"亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝"],["d940","貮",62],["d980","賭",32,"佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼"],["da40","贎",14,"贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸",8,"趂趃趆趇趈趉趌",4,"趒趓趕",9,"趠趡"],["da80","趢趤",12,"趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺"],["db40","跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾",6,"踆踇踈踋踍踎踐踑踒踓踕",7,"踠踡踤",4,"踫踭踰踲踳踴踶踷踸踻踼踾"],["db80","踿蹃蹅蹆蹌",4,"蹓",5,"蹚",11,"蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝"],["dc40","蹳蹵蹷",4,"蹽蹾躀躂躃躄躆躈",6,"躑躒躓躕",6,"躝躟",11,"躭躮躰躱躳",6,"躻",7],["dc80","軃",10,"軏",21,"堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥"],["dd40","軥",62],["dd80","輤",32,"荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺"],["de40","轅",32,"轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆"],["de80","迉",4,"迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖"],["df40","這逜連逤逥逧",5,"逰",4,"逷逹逺逽逿遀遃遅遆遈",4,"過達違遖遙遚遜",5,"遤遦遧適遪遫遬遯",4,"遶",6,"遾邁"],["df80","還邅邆邇邉邊邌",4,"邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼"],["e040","郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅",19,"鄚鄛鄜"],["e080","鄝鄟鄠鄡鄤",10,"鄰鄲",6,"鄺",8,"酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼"],["e140","酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀",4,"醆醈醊醎醏醓",6,"醜",5,"醤",5,"醫醬醰醱醲醳醶醷醸醹醻"],["e180","醼",10,"釈釋釐釒",9,"針",8,"帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺"],["e240","釦",62],["e280","鈥",32,"狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧",5,"饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂"],["e340","鉆",45,"鉵",16],["e380","銆",7,"銏",24,"恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾"],["e440","銨",5,"銯",24,"鋉",31],["e480","鋩",32,"洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑"],["e540","錊",51,"錿",10],["e580","鍊",31,"鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣"],["e640","鍬",34,"鎐",27],["e680","鎬",29,"鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩"],["e740","鏎",7,"鏗",54],["e780","鐎",32,"纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡",6,"缪缫缬缭缯",4,"缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬"],["e840","鐯",14,"鐿",43,"鑬鑭鑮鑯"],["e880","鑰",20,"钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹"],["e940","锧锳锽镃镈镋镕镚镠镮镴镵長",7,"門",42],["e980","閫",32,"椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋"],["ea40","闌",27,"闬闿阇阓阘阛阞阠阣",6,"阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗"],["ea80","陘陙陚陜陝陞陠陣陥陦陫陭",4,"陳陸",12,"隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰"],["eb40","隌階隑隒隓隕隖隚際隝",9,"隨",7,"隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖",9,"雡",6,"雫"],["eb80","雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗",4,"霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻"],["ec40","霡",8,"霫霬霮霯霱霳",4,"霺霻霼霽霿",18,"靔靕靗靘靚靜靝靟靣靤靦靧靨靪",7],["ec80","靲靵靷",4,"靽",7,"鞆",4,"鞌鞎鞏鞐鞓鞕鞖鞗鞙",4,"臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐"],["ed40","鞞鞟鞡鞢鞤",6,"鞬鞮鞰鞱鞳鞵",46],["ed80","韤韥韨韮",4,"韴韷",23,"怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨"],["ee40","頏",62],["ee80","顎",32,"睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶",4,"钼钽钿铄铈",6,"铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪"],["ef40","顯",5,"颋颎颒颕颙颣風",37,"飏飐飔飖飗飛飜飝飠",4],["ef80","飥飦飩",30,"铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒",4,"锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤",8,"镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔"],["f040","餈",4,"餎餏餑",28,"餯",26],["f080","饊",9,"饖",12,"饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨",4,"鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦",6,"鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙"],["f140","馌馎馚",10,"馦馧馩",47],["f180","駙",32,"瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃"],["f240","駺",62],["f280","騹",32,"颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒"],["f340","驚",17,"驲骃骉骍骎骔骕骙骦骩",6,"骲骳骴骵骹骻骽骾骿髃髄髆",4,"髍髎髏髐髒體髕髖髗髙髚髛髜"],["f380","髝髞髠髢髣髤髥髧髨髩髪髬髮髰",8,"髺髼",6,"鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋"],["f440","鬇鬉",5,"鬐鬑鬒鬔",10,"鬠鬡鬢鬤",10,"鬰鬱鬳",7,"鬽鬾鬿魀魆魊魋魌魎魐魒魓魕",5],["f480","魛",32,"簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤"],["f540","魼",62],["f580","鮻",32,"酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜"],["f640","鯜",62],["f680","鰛",32,"觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅",5,"龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞",5,"鲥",4,"鲫鲭鲮鲰",7,"鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋"],["f740","鰼",62],["f780","鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾",4,"鳈鳉鳑鳒鳚鳛鳠鳡鳌",4,"鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄"],["f840","鳣",62],["f880","鴢",32],["f940","鵃",62],["f980","鶂",32],["fa40","鶣",62],["fa80","鷢",32],["fb40","鸃",27,"鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴",9,"麀"],["fb80","麁麃麄麅麆麉麊麌",5,"麔",8,"麞麠",5,"麧麨麩麪"],["fc40","麫",8,"麵麶麷麹麺麼麿",4,"黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰",8,"黺黽黿",6],["fc80","鼆",4,"鼌鼏鼑鼒鼔鼕鼖鼘鼚",5,"鼡鼣",8,"鼭鼮鼰鼱"],["fd40","鼲",4,"鼸鼺鼼鼿",4,"齅",10,"齒",38],["fd80","齹",5,"龁龂龍",11,"龜龝龞龡",4,"郎凉秊裏隣"],["fe40","兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩"]] - -/***/ }), -/* 50 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var stringify = __webpack_require__(158); -var parse = __webpack_require__(159); -var formats = __webpack_require__(87); - -module.exports = { - formats: formats, - parse: parse, - stringify: stringify -}; - - -/***/ }), -/* 51 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * methods - * Copyright(c) 2013-2014 TJ Holowaychuk - * Copyright(c) 2015-2016 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var http = __webpack_require__(17); - -/** - * Module exports. - * @public - */ - -module.exports = getCurrentNodeMethods() || getBasicNodeMethods(); - -/** - * Get the current Node.js methods. - * @private - */ - -function getCurrentNodeMethods() { - return http.METHODS && http.METHODS.map(function lowerCaseMethod(method) { - return method.toLowerCase(); - }); -} - -/** - * Get the "basic" Node.js methods, a snapshot from Node.js 0.10. - * @private - */ - -function getBasicNodeMethods() { - return [ - 'get', - 'post', - 'put', - 'head', - 'delete', - 'options', - 'trace', - 'copy', - 'lock', - 'mkcol', - 'move', - 'purge', - 'propfind', - 'proppatch', - 'unlock', - 'report', - 'mkactivity', - 'checkout', - 'merge', - 'm-search', - 'notify', - 'subscribe', - 'unsubscribe', - 'patch', - 'search', - 'connect' - ]; -} - - -/***/ }), -/* 52 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * send - * Copyright(c) 2012 TJ Holowaychuk - * Copyright(c) 2014-2016 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var createError = __webpack_require__(34) -var debug = __webpack_require__(5)('send') -var deprecate = __webpack_require__(7)('send') -var destroy = __webpack_require__(167) -var encodeUrl = __webpack_require__(38) -var escapeHtml = __webpack_require__(39) -var etag = __webpack_require__(95) -var fresh = __webpack_require__(96) -var fs = __webpack_require__(8) -var mime = __webpack_require__(168) -var ms = __webpack_require__(76) -var onFinished = __webpack_require__(37) -var parseRange = __webpack_require__(97) -var path = __webpack_require__(0) -var statuses = __webpack_require__(21) -var Stream = __webpack_require__(1) -var util = __webpack_require__(48) - -/** - * Path function references. - * @private - */ - -var extname = path.extname -var join = path.join -var normalize = path.normalize -var resolve = path.resolve -var sep = path.sep - -/** - * Regular expression for identifying a bytes Range header. - * @private - */ - -var BYTES_RANGE_REGEXP = /^ *bytes=/ - -/** - * Maximum value allowed for the max age. - * @private - */ - -var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1000 // 1 year - -/** - * Regular expression to match a path with a directory up component. - * @private - */ - -var UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/ - -/** - * Module exports. - * @public - */ - -module.exports = send -module.exports.mime = mime - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {object} req - * @param {string} path - * @param {object} [options] - * @return {SendStream} - * @public - */ - -function send (req, path, options) { - return new SendStream(req, path, options) -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * @param {Request} req - * @param {String} path - * @param {object} [options] - * @private - */ - -function SendStream (req, path, options) { - Stream.call(this) - - var opts = options || {} - - this.options = opts - this.path = path - this.req = req - - this._acceptRanges = opts.acceptRanges !== undefined - ? Boolean(opts.acceptRanges) - : true - - this._cacheControl = opts.cacheControl !== undefined - ? Boolean(opts.cacheControl) - : true - - this._etag = opts.etag !== undefined - ? Boolean(opts.etag) - : true - - this._dotfiles = opts.dotfiles !== undefined - ? opts.dotfiles - : 'ignore' - - if (this._dotfiles !== 'ignore' && this._dotfiles !== 'allow' && this._dotfiles !== 'deny') { - throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"') - } - - this._hidden = Boolean(opts.hidden) - - if (opts.hidden !== undefined) { - deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead') - } - - // legacy support - if (opts.dotfiles === undefined) { - this._dotfiles = undefined - } - - this._extensions = opts.extensions !== undefined - ? normalizeList(opts.extensions, 'extensions option') - : [] - - this._immutable = opts.immutable !== undefined - ? Boolean(opts.immutable) - : false - - this._index = opts.index !== undefined - ? normalizeList(opts.index, 'index option') - : ['index.html'] - - this._lastModified = opts.lastModified !== undefined - ? Boolean(opts.lastModified) - : true - - this._maxage = opts.maxAge || opts.maxage - this._maxage = typeof this._maxage === 'string' - ? ms(this._maxage) - : Number(this._maxage) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE) - : 0 - - this._root = opts.root - ? resolve(opts.root) - : null - - if (!this._root && opts.from) { - this.from(opts.from) - } -} - -/** - * Inherits from `Stream`. - */ - -util.inherits(SendStream, Stream) - -/** - * Enable or disable etag generation. - * - * @param {Boolean} val - * @return {SendStream} - * @api public - */ - -SendStream.prototype.etag = deprecate.function(function etag (val) { - this._etag = Boolean(val) - debug('etag %s', this._etag) - return this -}, 'send.etag: pass etag as option') - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = deprecate.function(function hidden (val) { - this._hidden = Boolean(val) - this._dotfiles = undefined - debug('hidden %s', this._hidden) - return this -}, 'send.hidden: use dotfiles option') - -/** - * Set index `paths`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean|Array} paths - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = deprecate.function(function index (paths) { - var index = !paths ? [] : normalizeList(paths, 'paths argument') - debug('index %o', paths) - this._index = index - return this -}, 'send.index: pass index as option') - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = function root (path) { - this._root = resolve(String(path)) - debug('root %s', this._root) - return this -} - -SendStream.prototype.from = deprecate.function(SendStream.prototype.root, - 'send.from: pass root as option') - -SendStream.prototype.root = deprecate.function(SendStream.prototype.root, - 'send.root: pass root as option') - -/** - * Set max-age to `maxAge`. - * - * @param {Number} maxAge - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = deprecate.function(function maxage (maxAge) { - this._maxage = typeof maxAge === 'string' - ? ms(maxAge) - : Number(maxAge) - this._maxage = !isNaN(this._maxage) - ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE) - : 0 - debug('max-age %d', this._maxage) - return this -}, 'send.maxage: pass maxAge as option') - -/** - * Emit error with `status`. - * - * @param {number} status - * @param {Error} [err] - * @private - */ - -SendStream.prototype.error = function error (status, err) { - // emit if listeners instead of responding - if (hasListeners(this, 'error')) { - return this.emit('error', createError(status, err, { - expose: false - })) - } - - var res = this.res - var msg = statuses[status] || String(status) - var doc = createHtmlDocument('Error', escapeHtml(msg)) - - // clear existing headers - clearHeaders(res) - - // add error headers - if (err && err.headers) { - setHeaders(res, err.headers) - } - - // send basic response - res.statusCode = status - res.setHeader('Content-Type', 'text/html; charset=UTF-8') - res.setHeader('Content-Length', Buffer.byteLength(doc)) - res.setHeader('Content-Security-Policy', "default-src 'self'") - res.setHeader('X-Content-Type-Options', 'nosniff') - res.end(doc) -} - -/** - * Check if the pathname ends with "/". - * - * @return {boolean} - * @private - */ - -SendStream.prototype.hasTrailingSlash = function hasTrailingSlash () { - return this.path[this.path.length - 1] === '/' -} - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function isConditionalGET () { - return this.req.headers['if-match'] || - this.req.headers['if-unmodified-since'] || - this.req.headers['if-none-match'] || - this.req.headers['if-modified-since'] -} - -/** - * Check if the request preconditions failed. - * - * @return {boolean} - * @private - */ - -SendStream.prototype.isPreconditionFailure = function isPreconditionFailure () { - var req = this.req - var res = this.res - - // if-match - var match = req.headers['if-match'] - if (match) { - var etag = res.getHeader('ETag') - return !etag || (match !== '*' && parseTokenList(match).every(function (match) { - return match !== etag && match !== 'W/' + etag && 'W/' + match !== etag - })) - } - - // if-unmodified-since - var unmodifiedSince = parseHttpDate(req.headers['if-unmodified-since']) - if (!isNaN(unmodifiedSince)) { - var lastModified = parseHttpDate(res.getHeader('Last-Modified')) - return isNaN(lastModified) || lastModified > unmodifiedSince - } - - return false -} - -/** - * Strip content-* header fields. - * - * @private - */ - -SendStream.prototype.removeContentHeaderFields = function removeContentHeaderFields () { - var res = this.res - var headers = getHeaderNames(res) - - for (var i = 0; i < headers.length; i++) { - var header = headers[i] - if (header.substr(0, 8) === 'content-' && header !== 'content-location') { - res.removeHeader(header) - } - } -} - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function notModified () { - var res = this.res - debug('not modified') - this.removeContentHeaderFields() - res.statusCode = 304 - res.end() -} - -/** - * Raise error that headers already sent. - * - * @api private - */ - -SendStream.prototype.headersAlreadySent = function headersAlreadySent () { - var err = new Error('Can\'t set headers after they are sent.') - debug('headers already sent') - this.error(500, err) -} - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function isCachable () { - var statusCode = this.res.statusCode - return (statusCode >= 200 && statusCode < 300) || - statusCode === 304 -} - -/** - * Handle stat() error. - * - * @param {Error} error - * @private - */ - -SendStream.prototype.onStatError = function onStatError (error) { - switch (error.code) { - case 'ENAMETOOLONG': - case 'ENOENT': - case 'ENOTDIR': - this.error(404, error) - break - default: - this.error(500, error) - break - } -} - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function isFresh () { - return fresh(this.req.headers, { - 'etag': this.res.getHeader('ETag'), - 'last-modified': this.res.getHeader('Last-Modified') - }) -} - -/** - * Check if the range is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isRangeFresh = function isRangeFresh () { - var ifRange = this.req.headers['if-range'] - - if (!ifRange) { - return true - } - - // if-range as etag - if (ifRange.indexOf('"') !== -1) { - var etag = this.res.getHeader('ETag') - return Boolean(etag && ifRange.indexOf(etag) !== -1) - } - - // if-range as modified date - var lastModified = this.res.getHeader('Last-Modified') - return parseHttpDate(lastModified) <= parseHttpDate(ifRange) -} - -/** - * Redirect to path. - * - * @param {string} path - * @private - */ - -SendStream.prototype.redirect = function redirect (path) { - var res = this.res - - if (hasListeners(this, 'directory')) { - this.emit('directory', res, path) - return - } - - if (this.hasTrailingSlash()) { - this.error(403) - return - } - - var loc = encodeUrl(collapseLeadingSlashes(this.path + '/')) - var doc = createHtmlDocument('Redirecting', 'Redirecting to ' + - escapeHtml(loc) + '') - - // redirect - res.statusCode = 301 - res.setHeader('Content-Type', 'text/html; charset=UTF-8') - res.setHeader('Content-Length', Buffer.byteLength(doc)) - res.setHeader('Content-Security-Policy', "default-src 'self'") - res.setHeader('X-Content-Type-Options', 'nosniff') - res.setHeader('Location', loc) - res.end(doc) -} - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function pipe (res) { - // root path - var root = this._root - - // references - this.res = res - - // decode the path - var path = decode(this.path) - if (path === -1) { - this.error(400) - return res - } - - // null byte(s) - if (~path.indexOf('\0')) { - this.error(400) - return res - } - - var parts - if (root !== null) { - // normalize - if (path) { - path = normalize('.' + sep + path) - } - - // malicious path - if (UP_PATH_REGEXP.test(path)) { - debug('malicious path "%s"', path) - this.error(403) - return res - } - - // explode path parts - parts = path.split(sep) - - // join / normalize from optional root dir - path = normalize(join(root, path)) - root = normalize(root + sep) - } else { - // ".." is malicious without "root" - if (UP_PATH_REGEXP.test(path)) { - debug('malicious path "%s"', path) - this.error(403) - return res - } - - // explode path parts - parts = normalize(path).split(sep) - - // resolve the path - path = resolve(path) - } - - // dotfile handling - if (containsDotFile(parts)) { - var access = this._dotfiles - - // legacy support - if (access === undefined) { - access = parts[parts.length - 1][0] === '.' - ? (this._hidden ? 'allow' : 'ignore') - : 'allow' - } - - debug('%s dotfile "%s"', access, path) - switch (access) { - case 'allow': - break - case 'deny': - this.error(403) - return res - case 'ignore': - default: - this.error(404) - return res - } - } - - // index file support - if (this._index.length && this.hasTrailingSlash()) { - this.sendIndex(path) - return res - } - - this.sendFile(path) - return res -} - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function send (path, stat) { - var len = stat.size - var options = this.options - var opts = {} - var res = this.res - var req = this.req - var ranges = req.headers.range - var offset = options.start || 0 - - if (headersSent(res)) { - // impossible to send now - this.headersAlreadySent() - return - } - - debug('pipe "%s"', path) - - // set header fields - this.setHeader(path, stat) - - // set content-type - this.type(path) - - // conditional GET support - if (this.isConditionalGET()) { - if (this.isPreconditionFailure()) { - this.error(412) - return - } - - if (this.isCachable() && this.isFresh()) { - this.notModified() - return - } - } - - // adjust len to start/end options - len = Math.max(0, len - offset) - if (options.end !== undefined) { - var bytes = options.end - offset + 1 - if (len > bytes) len = bytes - } - - // Range support - if (this._acceptRanges && BYTES_RANGE_REGEXP.test(ranges)) { - // parse - ranges = parseRange(len, ranges, { - combine: true - }) - - // If-Range support - if (!this.isRangeFresh()) { - debug('range stale') - ranges = -2 - } - - // unsatisfiable - if (ranges === -1) { - debug('range unsatisfiable') - - // Content-Range - res.setHeader('Content-Range', contentRange('bytes', len)) - - // 416 Requested Range Not Satisfiable - return this.error(416, { - headers: {'Content-Range': res.getHeader('Content-Range')} - }) - } - - // valid (syntactically invalid/multiple ranges are treated as a regular response) - if (ranges !== -2 && ranges.length === 1) { - debug('range %j', ranges) - - // Content-Range - res.statusCode = 206 - res.setHeader('Content-Range', contentRange('bytes', len, ranges[0])) - - // adjust for requested range - offset += ranges[0].start - len = ranges[0].end - ranges[0].start + 1 - } - } - - // clone options - for (var prop in options) { - opts[prop] = options[prop] - } - - // set read options - opts.start = offset - opts.end = Math.max(offset, offset + len - 1) - - // content-length - res.setHeader('Content-Length', len) - - // HEAD support - if (req.method === 'HEAD') { - res.end() - return - } - - this.stream(path, opts) -} - -/** - * Transfer file for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendFile = function sendFile (path) { - var i = 0 - var self = this - - debug('stat "%s"', path) - fs.stat(path, function onstat (err, stat) { - if (err && err.code === 'ENOENT' && !extname(path) && path[path.length - 1] !== sep) { - // not found, check extensions - return next(err) - } - if (err) return self.onStatError(err) - if (stat.isDirectory()) return self.redirect(path) - self.emit('file', path, stat) - self.send(path, stat) - }) - - function next (err) { - if (self._extensions.length <= i) { - return err - ? self.onStatError(err) - : self.error(404) - } - - var p = path + '.' + self._extensions[i++] - - debug('stat "%s"', p) - fs.stat(p, function (err, stat) { - if (err) return next(err) - if (stat.isDirectory()) return next() - self.emit('file', p, stat) - self.send(p, stat) - }) - } -} - -/** - * Transfer index for `path`. - * - * @param {String} path - * @api private - */ -SendStream.prototype.sendIndex = function sendIndex (path) { - var i = -1 - var self = this - - function next (err) { - if (++i >= self._index.length) { - if (err) return self.onStatError(err) - return self.error(404) - } - - var p = join(path, self._index[i]) - - debug('stat "%s"', p) - fs.stat(p, function (err, stat) { - if (err) return next(err) - if (stat.isDirectory()) return next() - self.emit('file', p, stat) - self.send(p, stat) - }) - } - - next() -} - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function stream (path, options) { - // TODO: this is all lame, refactor meeee - var finished = false - var self = this - var res = this.res - - // pipe - var stream = fs.createReadStream(path, options) - this.emit('stream', stream) - stream.pipe(res) - - // response finished, done with the fd - onFinished(res, function onfinished () { - finished = true - destroy(stream) - }) - - // error handling code-smell - stream.on('error', function onerror (err) { - // request already finished - if (finished) return - - // clean up stream - finished = true - destroy(stream) - - // error - self.onStatError(err) - }) - - // end - stream.on('end', function onend () { - self.emit('end') - }) -} - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function type (path) { - var res = this.res - - if (res.getHeader('Content-Type')) return - - var type = mime.lookup(path) - - if (!type) { - debug('no content-type') - return - } - - var charset = mime.charsets.lookup(type) - - debug('content-type %s', type) - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')) -} - -/** - * Set response header fields, most - * fields may be pre-defined. - * - * @param {String} path - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function setHeader (path, stat) { - var res = this.res - - this.emit('headers', res, path, stat) - - if (this._acceptRanges && !res.getHeader('Accept-Ranges')) { - debug('accept ranges') - res.setHeader('Accept-Ranges', 'bytes') - } - - if (this._cacheControl && !res.getHeader('Cache-Control')) { - var cacheControl = 'public, max-age=' + Math.floor(this._maxage / 1000) - - if (this._immutable) { - cacheControl += ', immutable' - } - - debug('cache-control %s', cacheControl) - res.setHeader('Cache-Control', cacheControl) - } - - if (this._lastModified && !res.getHeader('Last-Modified')) { - var modified = stat.mtime.toUTCString() - debug('modified %s', modified) - res.setHeader('Last-Modified', modified) - } - - if (this._etag && !res.getHeader('ETag')) { - var val = etag(stat) - debug('etag %s', val) - res.setHeader('ETag', val) - } -} - -/** - * Clear all headers from a response. - * - * @param {object} res - * @private - */ - -function clearHeaders (res) { - var headers = getHeaderNames(res) - - for (var i = 0; i < headers.length; i++) { - res.removeHeader(headers[i]) - } -} - -/** - * Collapse all leading slashes into a single slash - * - * @param {string} str - * @private - */ -function collapseLeadingSlashes (str) { - for (var i = 0; i < str.length; i++) { - if (str[i] !== '/') { - break - } - } - - return i > 1 - ? '/' + str.substr(i) - : str -} - -/** - * Determine if path parts contain a dotfile. - * - * @api private - */ - -function containsDotFile (parts) { - for (var i = 0; i < parts.length; i++) { - var part = parts[i] - if (part.length > 1 && part[0] === '.') { - return true - } - } - - return false -} - -/** - * Create a Content-Range header. - * - * @param {string} type - * @param {number} size - * @param {array} [range] - */ - -function contentRange (type, size, range) { - return type + ' ' + (range ? range.start + '-' + range.end : '*') + '/' + size -} - -/** - * Create a minimal HTML document. - * - * @param {string} title - * @param {string} body - * @private - */ - -function createHtmlDocument (title, body) { - return '\n' + - '\n' + - '\n' + - '\n' + - '' + title + '\n' + - '\n' + - '\n' + - '
' + body + '
\n' + - '\n' + - '\n' -} - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -function decode (path) { - try { - return decodeURIComponent(path) - } catch (err) { - return -1 - } -} - -/** - * Get the header names on a respnse. - * - * @param {object} res - * @returns {array[string]} - * @private - */ - -function getHeaderNames (res) { - return typeof res.getHeaderNames !== 'function' - ? Object.keys(res._headers || {}) - : res.getHeaderNames() -} - -/** - * Determine if emitter has listeners of a given type. - * - * The way to do this check is done three different ways in Node.js >= 0.8 - * so this consolidates them into a minimal set using instance methods. - * - * @param {EventEmitter} emitter - * @param {string} type - * @returns {boolean} - * @private - */ - -function hasListeners (emitter, type) { - var count = typeof emitter.listenerCount !== 'function' - ? emitter.listeners(type).length - : emitter.listenerCount(type) - - return count > 0 -} - -/** - * Determine if the response headers have been sent. - * - * @param {object} res - * @returns {boolean} - * @private - */ - -function headersSent (res) { - return typeof res.headersSent !== 'boolean' - ? Boolean(res._header) - : res.headersSent -} - -/** - * Normalize the index option into an array. - * - * @param {boolean|string|array} val - * @param {string} name - * @private - */ - -function normalizeList (val, name) { - var list = [].concat(val || []) - - for (var i = 0; i < list.length; i++) { - if (typeof list[i] !== 'string') { - throw new TypeError(name + ' must be array of strings or false') - } - } - - return list -} - -/** - * Parse an HTTP Date into a number. - * - * @param {string} date - * @private - */ - -function parseHttpDate (date) { - var timestamp = date && Date.parse(date) - - return typeof timestamp === 'number' - ? timestamp - : NaN -} - -/** - * Parse a HTTP token list. - * - * @param {string} str - * @private - */ - -function parseTokenList (str) { - var end = 0 - var list = [] - var start = 0 - - // gather tokens - for (var i = 0, len = str.length; i < len; i++) { - switch (str.charCodeAt(i)) { - case 0x20: /* */ - if (start === end) { - start = end = i + 1 - } - break - case 0x2c: /* , */ - list.push(str.substring(start, end)) - start = end = i + 1 - break - default: - end = i + 1 - break - } - } - - // final token - list.push(str.substring(start, end)) - - return list -} - -/** - * Set an object of headers on a response. - * - * @param {object} res - * @param {object} headers - * @private - */ - -function setHeaders (res, headers) { - var keys = Object.keys(headers) - - for (var i = 0; i < keys.length; i++) { - var key = keys[i] - res.setHeader(key, headers[key]) - } -} - - -/***/ }), -/* 53 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $at = __webpack_require__(190)(true); - -// 21.1.3.27 String.prototype[@@iterator]() -__webpack_require__(56)(String, 'String', function (iterated) { - this._t = String(iterated); // target - this._i = 0; // next index -// 21.1.5.2.1 %StringIteratorPrototype%.next() -}, function () { - var O = this._t; - var index = this._i; - var point; - if (index >= O.length) return { value: undefined, done: true }; - point = $at(O, index); - this._i += point.length; - return { value: point, done: false }; -}); - - -/***/ }), -/* 54 */ -/***/ (function(module, exports) { - -// 7.1.4 ToInteger -var ceil = Math.ceil; -var floor = Math.floor; -module.exports = function (it) { - return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); -}; - - -/***/ }), -/* 55 */ -/***/ (function(module, exports) { - -// 7.2.1 RequireObjectCoercible(argument) -module.exports = function (it) { - if (it == undefined) throw TypeError("Can't call method on " + it); - return it; -}; - - -/***/ }), -/* 56 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var LIBRARY = __webpack_require__(57); -var $export = __webpack_require__(10); -var redefine = __webpack_require__(193); -var hide = __webpack_require__(14); -var Iterators = __webpack_require__(28); -var $iterCreate = __webpack_require__(194); -var setToStringTag = __webpack_require__(45); -var getPrototypeOf = __webpack_require__(200); -var ITERATOR = __webpack_require__(4)('iterator'); -var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` -var FF_ITERATOR = '@@iterator'; -var KEYS = 'keys'; -var VALUES = 'values'; - -var returnThis = function () { return this; }; - -module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { - $iterCreate(Constructor, NAME, next); - var getMethod = function (kind) { - if (!BUGGY && kind in proto) return proto[kind]; - switch (kind) { - case KEYS: return function keys() { return new Constructor(this, kind); }; - case VALUES: return function values() { return new Constructor(this, kind); }; - } return function entries() { return new Constructor(this, kind); }; - }; - var TAG = NAME + ' Iterator'; - var DEF_VALUES = DEFAULT == VALUES; - var VALUES_BUG = false; - var proto = Base.prototype; - var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; - var $default = $native || getMethod(DEFAULT); - var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; - var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; - var methods, key, IteratorPrototype; - // Fix native - if ($anyNative) { - IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); - if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { - // Set @@toStringTag to native iterators - setToStringTag(IteratorPrototype, TAG, true); - // fix for some old engines - if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis); - } - } - // fix Array#{values, @@iterator}.name in V8 / FF - if (DEF_VALUES && $native && $native.name !== VALUES) { - VALUES_BUG = true; - $default = function values() { return $native.call(this); }; - } - // Define iterator - if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { - hide(proto, ITERATOR, $default); - } - // Plug for library - Iterators[NAME] = $default; - Iterators[TAG] = returnThis; - if (DEFAULT) { - methods = { - values: DEF_VALUES ? $default : getMethod(VALUES), - keys: IS_SET ? $default : getMethod(KEYS), - entries: $entries - }; - if (FORCED) for (key in methods) { - if (!(key in proto)) redefine(proto, key, methods[key]); - } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); - } - return methods; -}; - - -/***/ }), -/* 57 */ -/***/ (function(module, exports) { - -module.exports = true; - - -/***/ }), -/* 58 */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(9); -var document = __webpack_require__(2).document; -// typeof document.createElement is 'object' in old IE -var is = isObject(document) && isObject(document.createElement); -module.exports = function (it) { - return is ? document.createElement(it) : {}; -}; - - -/***/ }), -/* 59 */ -/***/ (function(module, exports, __webpack_require__) { - -// to indexed object, toObject with fallback for non-array-like ES3 strings -var IObject = __webpack_require__(102); -var defined = __webpack_require__(55); -module.exports = function (it) { - return IObject(defined(it)); -}; - - -/***/ }), -/* 60 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.15 ToLength -var toInteger = __webpack_require__(54); -var min = Math.min; -module.exports = function (it) { - return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 -}; - - -/***/ }), -/* 61 */ -/***/ (function(module, exports, __webpack_require__) { - -var shared = __webpack_require__(103)('keys'); -var uid = __webpack_require__(62); -module.exports = function (key) { - return shared[key] || (shared[key] = uid(key)); -}; - - -/***/ }), -/* 62 */ -/***/ (function(module, exports) { - -var id = 0; -var px = Math.random(); -module.exports = function (key) { - return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); -}; - - -/***/ }), -/* 63 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(201); -var global = __webpack_require__(2); -var hide = __webpack_require__(14); -var Iterators = __webpack_require__(28); -var TO_STRING_TAG = __webpack_require__(4)('toStringTag'); - -var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' + - 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' + - 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' + - 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' + - 'TextTrackList,TouchList').split(','); - -for (var i = 0; i < DOMIterables.length; i++) { - var NAME = DOMIterables[i]; - var Collection = global[NAME]; - var proto = Collection && Collection.prototype; - if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME); - Iterators[NAME] = Iterators.Array; -} - - -/***/ }), -/* 64 */ -/***/ (function(module, exports, __webpack_require__) { - -// getting tag from 19.1.3.6 Object.prototype.toString() -var cof = __webpack_require__(29); -var TAG = __webpack_require__(4)('toStringTag'); -// ES3 wrong here -var ARG = cof(function () { return arguments; }()) == 'Arguments'; - -// fallback for IE11 Script Access Denied error -var tryGet = function (it, key) { - try { - return it[key]; - } catch (e) { /* empty */ } -}; - -module.exports = function (it) { - var O, T, B; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T - // builtinTag case - : ARG ? cof(O) - // ES3 arguments fallback - : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; -}; - - -/***/ }), -/* 65 */ -/***/ (function(module, exports) { - -module.exports = function (it, Constructor, name, forbiddenField) { - if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) { - throw TypeError(name + ': incorrect invocation!'); - } return it; -}; - - -/***/ }), -/* 66 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// 25.4.1.5 NewPromiseCapability(C) -var aFunction = __webpack_require__(26); - -function PromiseCapability(C) { - var resolve, reject; - this.promise = new C(function ($$resolve, $$reject) { - if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor'); - resolve = $$resolve; - reject = $$reject; - }); - this.resolve = aFunction(resolve); - this.reject = aFunction(reject); -} - -module.exports.f = function (C) { - return new PromiseCapability(C); -}; - - -/***/ }), -/* 67 */ -/***/ (function(module, exports, __webpack_require__) { - -var hide = __webpack_require__(14); -module.exports = function (target, src, safe) { - for (var key in src) { - if (safe && target[key]) target[key] = src[key]; - else hide(target, key, src[key]); - } return target; -}; - - -/***/ }), -/* 68 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _regenerator = __webpack_require__(24); - -var _regenerator2 = _interopRequireDefault(_regenerator); - -var _stringify = __webpack_require__(18); - -var _stringify2 = _interopRequireDefault(_stringify); - -var _promise = __webpack_require__(25); - -var _promise2 = _interopRequireDefault(_promise); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) { - return new (P || (P = _promise2.default))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : new P(function (resolve) { - resolve(result.value); - }).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -var child_process_1 = __webpack_require__(212); -var config_1 = __webpack_require__(31); -var anomalyType_1 = __webpack_require__(19); -var metrics_1 = __webpack_require__(114); -var segments_1 = __webpack_require__(70); -var event_stream_1 = __webpack_require__(215); -var learnWorker = child_process_1.spawn('python3', ['worker.py'], { cwd: config_1.ANALYTICS_PATH }); -learnWorker.stdout.pipe(event_stream_1.split()).pipe(event_stream_1.mapSync(function (line) { - onMessage(line); -})); -learnWorker.stderr.on('data', function (data) { - return console.error("worker stderr: " + data); -}); -var taskMap = {}; -var nextTaskId = 0; -function onMessage(data) { - console.log("worker stdout: " + data); - var response = JSON.parse(data); - var taskId = response.__task_id; - // let anomalyName = response.anomaly_name; - // let task = response.task; - var status = response.status; - if (status === 'success' || status === 'failed') { - if (taskId in taskMap) { - var resolver = taskMap[taskId]; - resolver(response); - delete taskMap[taskId]; - } - } -} -function runTask(task) { - var anomaly = anomalyType_1.loadAnomalyById(task.anomaly_id); - task.metric = { - datasource: anomaly.metric.datasource, - targets: anomaly.metric.targets.map(function (t) { - return metrics_1.getTarget(t); - }) - }; - task.__task_id = nextTaskId++; - var command = (0, _stringify2.default)(task); - learnWorker.stdin.write(command + "\n"); - return new _promise2.default(function (resolve, reject) { - taskMap[task.__task_id] = resolve; - }); -} -function runLearning(anomalyId) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_regenerator2.default.mark(function _callee() { - var segments, anomaly, analyticsType, preset, task, result; - return _regenerator2.default.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - segments = segments_1.getLabeledSegments(anomalyId); - - anomalyType_1.setAnomalyStatus(anomalyId, 'learning'); - anomaly = anomalyType_1.loadAnomalyById(anomalyId); - analyticsType = "anomalies"; - preset = undefined; - - if (anomaly.name.includes("jumps")) { - analyticsType = "patterns"; - preset = "steps"; - } - if (anomaly.name.includes("cliffs") || anomaly.name.includes("drops")) { - analyticsType = "patterns"; - preset = "cliffs"; - } - if (anomaly.name.includes("peaks")) { - analyticsType = "patterns"; - preset = "peaks"; - } - task = { - type: 'learn', - anomaly_id: anomalyId, - analytics_type: analyticsType, - preset: preset, - segments: segments - }; - _context.next = 11; - return runTask(task); - - case 11: - result = _context.sent; - - if (result.status === 'success') { - anomalyType_1.setAnomalyStatus(anomalyId, 'ready'); - segments_1.insertSegments(anomalyId, result.segments, false); - anomalyType_1.setAnomalyPredictionTime(anomalyId, result.last_prediction_time); - } else { - anomalyType_1.setAnomalyStatus(anomalyId, 'failed', result.error); - } - - case 13: - case "end": - return _context.stop(); - } - } - }, _callee, this); - })); -} -exports.runLearning = runLearning; -function runPredict(anomalyId) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_regenerator2.default.mark(function _callee2() { - var anomaly, analyticsType, preset, task, result, segments, lastOldSegment, firstNewSegment; - return _regenerator2.default.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - anomaly = anomalyType_1.loadAnomalyById(anomalyId); - analyticsType = "anomalies"; - preset = undefined; - - if (anomaly.name.includes("jump")) { - analyticsType = "patterns"; - preset = "steps"; - } - if (anomaly.name.includes("cliffs") || anomaly.name.includes("drops")) { - analyticsType = "patterns"; - preset = "cliffs"; - } - if (anomaly.name.includes("peaks")) { - analyticsType = "patterns"; - preset = "peaks"; - } - task = { - type: 'predict', - anomaly_id: anomalyId, - analytics_type: analyticsType, - preset: preset, - last_prediction_time: anomaly.last_prediction_time - }; - _context2.next = 9; - return runTask(task); - - case 9: - result = _context2.sent; - - if (!(result.status === 'failed')) { - _context2.next = 12; - break; - } - - return _context2.abrupt("return", []); - - case 12: - // Merging segments - segments = segments_1.getLabeledSegments(anomalyId); - - if (segments.length > 0 && result.segments.length > 0) { - lastOldSegment = segments[segments.length - 1]; - firstNewSegment = result.segments[0]; - - if (firstNewSegment.start <= lastOldSegment.finish) { - result.segments[0].start = lastOldSegment.start; - segments_1.removeSegments(anomalyId, [lastOldSegment.id]); - } - } - segments_1.insertSegments(anomalyId, result.segments, false); - anomalyType_1.setAnomalyPredictionTime(anomalyId, result.last_prediction_time); - return _context2.abrupt("return", result.segments); - - case 17: - case "end": - return _context2.stop(); - } - } - }, _callee2, this); - })); -} -exports.runPredict = runPredict; - -/***/ }), -/* 69 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(213), __esModule: true }; - -/***/ }), -/* 70 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _getIterator2 = __webpack_require__(69); - -var _getIterator3 = _interopRequireDefault(_getIterator2); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -Object.defineProperty(exports, "__esModule", { value: true }); -var path = __webpack_require__(0); -var json_1 = __webpack_require__(46); -var config_1 = __webpack_require__(31); -var anomalyType_1 = __webpack_require__(19); -function getLabeledSegments(anomalyId) { - var filename = path.join(config_1.SEGMENTS_PATH, anomalyId + "_labeled.json"); - var segments = []; - try { - segments = json_1.getJsonDataSync(filename); - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = (0, _getIterator3.default)(segments), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var segment = _step.value; - - if (segment.labeled === undefined) { - segment.labeled = false; - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - } catch (e) { - console.error(e.message); - } - return segments; -} -exports.getLabeledSegments = getLabeledSegments; -function getPredictedSegments(anomalyId) { - var filename = path.join(config_1.SEGMENTS_PATH, anomalyId + "_segments.json"); - var jsonData = void 0; - try { - jsonData = json_1.getJsonDataSync(filename); - } catch (e) { - console.error(e.message); - jsonData = []; - } - return jsonData; -} -exports.getPredictedSegments = getPredictedSegments; -function saveSegments(anomalyId, segments) { - var filename = path.join(config_1.SEGMENTS_PATH, anomalyId + "_labeled.json"); - try { - return json_1.writeJsonDataSync(filename, segments); - } catch (e) { - console.error(e.message); - throw new Error('Can`t write to db'); - } -} -exports.saveSegments = saveSegments; -function insertSegments(anomalyId, addedSegments, labeled) { - // Set status - var info = anomalyType_1.loadAnomalyById(anomalyId); - var segments = getLabeledSegments(anomalyId); - var nextId = info.next_id; - var addedIds = []; - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - for (var _iterator2 = (0, _getIterator3.default)(addedSegments), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - var segment = _step2.value; - - segment.id = nextId; - segment.labeled = labeled; - addedIds.push(nextId); - nextId++; - segments.push(segment); - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2.return) { - _iterator2.return(); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - - info.next_id = nextId; - saveSegments(anomalyId, segments); - anomalyType_1.saveAnomaly(anomalyId, info); - return addedIds; -} -exports.insertSegments = insertSegments; -function removeSegments(anomalyId, removedSegments) { - var segments = getLabeledSegments(anomalyId); - var _iteratorNormalCompletion3 = true; - var _didIteratorError3 = false; - var _iteratorError3 = undefined; - - try { - var _loop = function _loop() { - var segmentId = _step3.value; - - segments = segments.filter(function (el) { - return el.id !== segmentId; - }); - }; - - for (var _iterator3 = (0, _getIterator3.default)(removedSegments), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { - _loop(); - } - } catch (err) { - _didIteratorError3 = true; - _iteratorError3 = err; - } finally { - try { - if (!_iteratorNormalCompletion3 && _iterator3.return) { - _iterator3.return(); - } - } finally { - if (_didIteratorError3) { - throw _iteratorError3; - } - } - } - - saveSegments(anomalyId, segments); -} -exports.removeSegments = removeSegments; - -/***/ }), -/* 71 */ -/***/ (function(module, exports, __webpack_require__) { - -var Stream = __webpack_require__(1) - -// through -// -// a stream that does nothing but re-emit the input. -// useful for aggregating a series of changing but not ending streams into one stream) - -exports = module.exports = through -through.through = through - -//create a readable writable stream. - -function through (write, end, opts) { - write = write || function (data) { this.queue(data) } - end = end || function () { this.queue(null) } - - var ended = false, destroyed = false, buffer = [], _ended = false - var stream = new Stream() - stream.readable = stream.writable = true - stream.paused = false - -// stream.autoPause = !(opts && opts.autoPause === false) - stream.autoDestroy = !(opts && opts.autoDestroy === false) - - stream.write = function (data) { - write.call(this, data) - return !stream.paused - } - - function drain() { - while(buffer.length && !stream.paused) { - var data = buffer.shift() - if(null === data) - return stream.emit('end') - else - stream.emit('data', data) - } - } - - stream.queue = stream.push = function (data) { -// console.error(ended) - if(_ended) return stream - if(data === null) _ended = true - buffer.push(data) - drain() - return stream - } - - //this will be registered as the first 'end' listener - //must call destroy next tick, to make sure we're after any - //stream piped from here. - //this is only a problem if end is not emitted synchronously. - //a nicer way to do this is to make sure this is the last listener for 'end' - - stream.on('end', function () { - stream.readable = false - if(!stream.writable && stream.autoDestroy) - process.nextTick(function () { - stream.destroy() - }) - }) - - function _end () { - stream.writable = false - end.call(stream) - if(!stream.readable && stream.autoDestroy) - stream.destroy() - } - - stream.end = function (data) { - if(ended) return - ended = true - if(arguments.length) stream.write(data) - _end() // will emit or queue - return stream - } - - stream.destroy = function () { - if(destroyed) return - destroyed = true - ended = true - buffer.length = 0 - stream.writable = stream.readable = false - stream.emit('close') - return stream - } - - stream.pause = function () { - if(stream.paused) return - stream.paused = true - return stream - } - - stream.resume = function () { - if(stream.paused) { - stream.paused = false - stream.emit('resume') - } - drain() - //may have become paused again, - //as drain emits 'data'. - if(!stream.paused) - stream.emit('drain') - return stream - } - return stream -} - - - -/***/ }), -/* 72 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * body-parser - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var deprecate = __webpack_require__(7)('body-parser') - -/** - * Cache of loaded parsers. - * @private - */ - -var parsers = Object.create(null) - -/** - * @typedef Parsers - * @type {function} - * @property {function} json - * @property {function} raw - * @property {function} text - * @property {function} urlencoded - */ - -/** - * Module exports. - * @type {Parsers} - */ - -exports = module.exports = deprecate.function(bodyParser, - 'bodyParser: use individual json/urlencoded middlewares') - -/** - * JSON parser. - * @public - */ - -Object.defineProperty(exports, 'json', { - configurable: true, - enumerable: true, - get: createParserGetter('json') -}) - -/** - * Raw parser. - * @public - */ - -Object.defineProperty(exports, 'raw', { - configurable: true, - enumerable: true, - get: createParserGetter('raw') -}) - -/** - * Text parser. - * @public - */ - -Object.defineProperty(exports, 'text', { - configurable: true, - enumerable: true, - get: createParserGetter('text') -}) - -/** - * URL-encoded parser. - * @public - */ - -Object.defineProperty(exports, 'urlencoded', { - configurable: true, - enumerable: true, - get: createParserGetter('urlencoded') -}) - -/** - * Create a middleware to parse json and urlencoded bodies. - * - * @param {object} [options] - * @return {function} - * @deprecated - * @public - */ - -function bodyParser (options) { - var opts = {} - - // exclude type option - if (options) { - for (var prop in options) { - if (prop !== 'type') { - opts[prop] = options[prop] - } - } - } - - var _urlencoded = exports.urlencoded(opts) - var _json = exports.json(opts) - - return function bodyParser (req, res, next) { - _json(req, res, function (err) { - if (err) return next(err) - _urlencoded(req, res, next) - }) - } -} - -/** - * Create a getter for loading a parser. - * @private - */ - -function createParserGetter (name) { - return function get () { - return loadParser(name) - } -} - -/** - * Load a parser module. - * @private - */ - -function loadParser (parserName) { - var parser = parsers[parserName] - - if (parser !== undefined) { - return parser - } - - // this uses a switch for static require analysis - switch (parserName) { - case 'json': - parser = __webpack_require__(122) - break - case 'raw': - parser = __webpack_require__(155) - break - case 'text': - parser = __webpack_require__(156) - break - case 'urlencoded': - parser = __webpack_require__(157) - break - } - - // store to prevent invoking require() - return (parsers[parserName] = parser) -} - - -/***/ }), -/* 73 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * depd - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var EventEmitter = __webpack_require__(47).EventEmitter - -/** - * Module exports. - * @public - */ - -lazyProperty(module.exports, 'callSiteToString', function callSiteToString () { - var limit = Error.stackTraceLimit - var obj = {} - var prep = Error.prepareStackTrace - - function prepareObjectStackTrace (obj, stack) { - return stack - } - - Error.prepareStackTrace = prepareObjectStackTrace - Error.stackTraceLimit = 2 - - // capture the stack - Error.captureStackTrace(obj) - - // slice the stack - var stack = obj.stack.slice() - - Error.prepareStackTrace = prep - Error.stackTraceLimit = limit - - return stack[0].toString ? toString : __webpack_require__(120) -}) - -lazyProperty(module.exports, 'eventListenerCount', function eventListenerCount () { - return EventEmitter.listenerCount || __webpack_require__(121) -}) - -/** - * Define a lazy property. - */ - -function lazyProperty (obj, prop, getter) { - function get () { - var val = getter() - - Object.defineProperty(obj, prop, { - configurable: true, - enumerable: true, - value: val - }) - - return val - } - - Object.defineProperty(obj, prop, { - configurable: true, - enumerable: true, - get: get - }) -} - -/** - * Call toString() on the obj - */ - -function toString (obj) { - return obj.toString() -} - - -/***/ }), -/* 74 */ -/***/ (function(module, exports, __webpack_require__) { - -try { - var util = __webpack_require__(48); - if (typeof util.inherits !== 'function') throw ''; - module.exports = util.inherits; -} catch (e) { - module.exports = __webpack_require__(124); -} - - -/***/ }), -/* 75 */ -/***/ (function(module, exports, __webpack_require__) { - - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = __webpack_require__(76); - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - -exports.formatters = {}; - -/** - * Previous log timestamp. - */ - -var prevTime; - -/** - * Select a color. - * @param {String} namespace - * @return {Number} - * @api private - */ - -function selectColor(namespace) { - var hash = 0, i; - - for (i in namespace) { - hash = ((hash << 5) - hash) + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } - - return exports.colors[Math.abs(hash) % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - -function createDebug(namespace) { - - function debug() { - // disabled? - if (!debug.enabled) return; - - var self = debug; - - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - // turn the `arguments` into a proper Array - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %O - args.unshift('%O'); - } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - // apply env-specific formatting (colors, etc.) - exports.formatArgs.call(self, args); - - var logFn = debug.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } - - debug.namespace = namespace; - debug.enabled = exports.enabled(namespace); - debug.useColors = exports.useColors(); - debug.color = selectColor(namespace); - - // env-specific initialization logic for debug instances - if ('function' === typeof exports.init) { - exports.init(debug); - } - - return debug; -} - -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - -function enable(namespaces) { - exports.save(namespaces); - - exports.names = []; - exports.skips = []; - - var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - var len = split.length; - - for (var i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } -} - -/** - * Disable debug output. - * - * @api public - */ - -function disable() { - exports.enable(''); -} - -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - -function enabled(name) { - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} - -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} - - -/***/ }), -/* 76 */ -/***/ (function(module, exports) { - -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isNaN(val) === false) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtShort(ms) { - if (ms >= d) { - return Math.round(ms / d) + 'd'; - } - if (ms >= h) { - return Math.round(ms / h) + 'h'; - } - if (ms >= m) { - return Math.round(ms / m) + 'm'; - } - if (ms >= s) { - return Math.round(ms / s) + 's'; - } - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - return plural(ms, d, 'day') || - plural(ms, h, 'hour') || - plural(ms, m, 'minute') || - plural(ms, s, 'second') || - ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) { - return; - } - if (ms < n * 1.5) { - return Math.floor(ms / n) + ' ' + name; - } - return Math.ceil(ms / n) + ' ' + name + 's'; -} - - -/***/ }), -/* 77 */ -/***/ (function(module, exports) { - -module.exports = require("net"); - -/***/ }), -/* 78 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * depd - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var EventEmitter = __webpack_require__(47).EventEmitter - -/** - * Module exports. - * @public - */ - -lazyProperty(module.exports, 'callSiteToString', function callSiteToString () { - var limit = Error.stackTraceLimit - var obj = {} - var prep = Error.prepareStackTrace - - function prepareObjectStackTrace (obj, stack) { - return stack - } - - Error.prepareStackTrace = prepareObjectStackTrace - Error.stackTraceLimit = 2 - - // capture the stack - Error.captureStackTrace(obj) - - // slice the stack - var stack = obj.stack.slice() - - Error.prepareStackTrace = prep - Error.stackTraceLimit = limit - - return stack[0].toString ? toString : __webpack_require__(131) -}) - -lazyProperty(module.exports, 'eventListenerCount', function eventListenerCount () { - return EventEmitter.listenerCount || __webpack_require__(132) -}) - -/** - * Define a lazy property. - */ - -function lazyProperty (obj, prop, getter) { - function get () { - var val = getter() - - Object.defineProperty(obj, prop, { - configurable: true, - enumerable: true, - value: val - }) - - return val - } - - Object.defineProperty(obj, prop, { - configurable: true, - enumerable: true, - get: get - }) -} - -/** - * Call toString() on the obj - */ - -function toString (obj) { - return obj.toString() -} - - -/***/ }), -/* 79 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -// Some environments don't have global Buffer (e.g. React Native). -// Solution would be installing npm modules "buffer" and "stream" explicitly. -var Buffer = __webpack_require__(3).Buffer; - -var bomHandling = __webpack_require__(134), - iconv = module.exports; - -// All codecs and aliases are kept here, keyed by encoding name/alias. -// They are lazy loaded in `iconv.getCodec` from `encodings/index.js`. -iconv.encodings = null; - -// Characters emitted in case of error. -iconv.defaultCharUnicode = '�'; -iconv.defaultCharSingleByte = '?'; - -// Public API. -iconv.encode = function encode(str, encoding, options) { - str = "" + (str || ""); // Ensure string. - - var encoder = iconv.getEncoder(encoding, options); - - var res = encoder.write(str); - var trail = encoder.end(); - - return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res; -} - -iconv.decode = function decode(buf, encoding, options) { - if (typeof buf === 'string') { - if (!iconv.skipDecodeWarning) { - console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding'); - iconv.skipDecodeWarning = true; - } - - buf = new Buffer("" + (buf || ""), "binary"); // Ensure buffer. - } - - var decoder = iconv.getDecoder(encoding, options); - - var res = decoder.write(buf); - var trail = decoder.end(); - - return trail ? (res + trail) : res; -} - -iconv.encodingExists = function encodingExists(enc) { - try { - iconv.getCodec(enc); - return true; - } catch (e) { - return false; - } -} - -// Legacy aliases to convert functions -iconv.toEncoding = iconv.encode; -iconv.fromEncoding = iconv.decode; - -// Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache. -iconv._codecDataCache = {}; -iconv.getCodec = function getCodec(encoding) { - if (!iconv.encodings) - iconv.encodings = __webpack_require__(135); // Lazy load all encoding definitions. - - // Canonicalize encoding name: strip all non-alphanumeric chars and appended year. - var enc = (''+encoding).toLowerCase().replace(/[^0-9a-z]|:\d{4}$/g, ""); - - // Traverse iconv.encodings to find actual codec. - var codecOptions = {}; - while (true) { - var codec = iconv._codecDataCache[enc]; - if (codec) - return codec; - - var codecDef = iconv.encodings[enc]; - - switch (typeof codecDef) { - case "string": // Direct alias to other encoding. - enc = codecDef; - break; - - case "object": // Alias with options. Can be layered. - for (var key in codecDef) - codecOptions[key] = codecDef[key]; - - if (!codecOptions.encodingName) - codecOptions.encodingName = enc; - - enc = codecDef.type; - break; - - case "function": // Codec itself. - if (!codecOptions.encodingName) - codecOptions.encodingName = enc; - - // The codec function must load all tables and return object with .encoder and .decoder methods. - // It'll be called only once (for each different options object). - codec = new codecDef(codecOptions, iconv); - - iconv._codecDataCache[codecOptions.encodingName] = codec; // Save it to be reused later. - return codec; - - default: - throw new Error("Encoding not recognized: '" + encoding + "' (searched as: '"+enc+"')"); - } - } -} - -iconv.getEncoder = function getEncoder(encoding, options) { - var codec = iconv.getCodec(encoding), - encoder = new codec.encoder(options, codec); - - if (codec.bomAware && options && options.addBOM) - encoder = new bomHandling.PrependBOM(encoder, options); - - return encoder; -} - -iconv.getDecoder = function getDecoder(encoding, options) { - var codec = iconv.getCodec(encoding), - decoder = new codec.decoder(options, codec); - - if (codec.bomAware && !(options && options.stripBOM === false)) - decoder = new bomHandling.StripBOM(decoder, options); - - return decoder; -} - - -// Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json. -var nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node; -if (nodeVer) { - - // Load streaming support in Node v0.10+ - var nodeVerArr = nodeVer.split(".").map(Number); - if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) { - __webpack_require__(149)(iconv); - } - - // Load Node primitive extensions. - __webpack_require__(150)(iconv); -} - -if (false) { - console.error("iconv-lite warning: javascript files use encoding different from utf-8. See https://github.com/ashtuchkin/iconv-lite/wiki/Javascript-source-file-encodings for more info."); -} - - -/***/ }), -/* 80 */ -/***/ (function(module, exports) { - -module.exports = require("string_decoder"); - -/***/ }), -/* 81 */ -/***/ (function(module, exports) { - -module.exports = [["a140","",62],["a180","",32],["a240","",62],["a280","",32],["a2ab","",5],["a2e3","€"],["a2ef",""],["a2fd",""],["a340","",62],["a380","",31," "],["a440","",62],["a480","",32],["a4f4","",10],["a540","",62],["a580","",32],["a5f7","",7],["a640","",62],["a680","",32],["a6b9","",7],["a6d9","",6],["a6ec",""],["a6f3",""],["a6f6","",8],["a740","",62],["a780","",32],["a7c2","",14],["a7f2","",12],["a896","",10],["a8bc",""],["a8bf","ǹ"],["a8c1",""],["a8ea","",20],["a958",""],["a95b",""],["a95d",""],["a989","〾⿰",11],["a997","",12],["a9f0","",14],["aaa1","",93],["aba1","",93],["aca1","",93],["ada1","",93],["aea1","",93],["afa1","",93],["d7fa","",4],["f8a1","",93],["f9a1","",93],["faa1","",93],["fba1","",93],["fca1","",93],["fda1","",93],["fe50","⺁⺄㑳㑇⺈⺋㖞㘚㘎⺌⺗㥮㤘㧏㧟㩳㧐㭎㱮㳠⺧⺪䁖䅟⺮䌷⺳⺶⺷䎱䎬⺻䏝䓖䙡䙌"],["fe80","䜣䜩䝼䞍⻊䥇䥺䥽䦂䦃䦅䦆䦟䦛䦷䦶䲣䲟䲠䲡䱷䲢䴓",6,"䶮",93]] - -/***/ }), -/* 82 */ -/***/ (function(module, exports) { - -module.exports = [["0","\u0000",127],["a140"," ,、。.‧;:?!︰…‥﹐﹑﹒·﹔﹕﹖﹗|–︱—︳╴︴﹏()︵︶{}︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚"],["a1a1","﹛﹜﹝﹞‘’“”〝〞‵′#&*※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡+-×÷±√<>=≦≧≠∞≒≡﹢",4,"~∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣/"],["a240","\∕﹨$¥〒¢£%@℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁",7,"▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭"],["a2a1","╮╰╯═╞╪╡◢◣◥◤╱╲╳0",9,"Ⅰ",9,"〡",8,"十卄卅A",25,"a",21],["a340","wxyzΑ",16,"Σ",6,"α",16,"σ",6,"ㄅ",10],["a3a1","ㄐ",25,"˙ˉˊˇˋ"],["a3e1","€"],["a440","一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才"],["a4a1","丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙"],["a540","世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外"],["a5a1","央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全"],["a640","共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年"],["a6a1","式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣"],["a740","作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍"],["a7a1","均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠"],["a840","杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒"],["a8a1","芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵"],["a940","咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居"],["a9a1","屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊"],["aa40","昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠"],["aaa1","炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附"],["ab40","陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品"],["aba1","哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷"],["ac40","拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗"],["aca1","活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄"],["ad40","耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥"],["ada1","迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪"],["ae40","哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙"],["aea1","恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓"],["af40","浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷"],["afa1","砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃"],["b040","虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡"],["b0a1","陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀"],["b140","娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽"],["b1a1","情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺"],["b240","毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶"],["b2a1","瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼"],["b340","莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途"],["b3a1","部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠"],["b440","婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍"],["b4a1","插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋"],["b540","溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘"],["b5a1","窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁"],["b640","詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑"],["b6a1","間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼"],["b740","媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業"],["b7a1","楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督"],["b840","睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫"],["b8a1","腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊"],["b940","辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴"],["b9a1","飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇"],["ba40","愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢"],["baa1","滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬"],["bb40","罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤"],["bba1","說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜"],["bc40","劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂"],["bca1","慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃"],["bd40","瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯"],["bda1","翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞"],["be40","輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉"],["bea1","鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡"],["bf40","濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊"],["bfa1","縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚"],["c040","錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇"],["c0a1","嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬"],["c140","瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪"],["c1a1","薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁"],["c240","駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘"],["c2a1","癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦"],["c340","鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸"],["c3a1","獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類"],["c440","願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼"],["c4a1","纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴"],["c540","護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬"],["c5a1","禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒"],["c640","讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲"],["c940","乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕"],["c9a1","氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋"],["ca40","汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘"],["caa1","吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇"],["cb40","杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓"],["cba1","芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢"],["cc40","坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋"],["cca1","怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲"],["cd40","泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺"],["cda1","矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏"],["ce40","哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛"],["cea1","峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺"],["cf40","柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂"],["cfa1","洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀"],["d040","穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪"],["d0a1","苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱"],["d140","唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧"],["d1a1","恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤"],["d240","毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸"],["d2a1","牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐"],["d340","笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢"],["d3a1","荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐"],["d440","酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅"],["d4a1","唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏"],["d540","崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟"],["d5a1","捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉"],["d640","淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏"],["d6a1","痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟"],["d740","耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷"],["d7a1","蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪"],["d840","釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷"],["d8a1","堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔"],["d940","惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒"],["d9a1","晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞"],["da40","湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖"],["daa1","琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥"],["db40","罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳"],["dba1","菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺"],["dc40","軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈"],["dca1","隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆"],["dd40","媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤"],["dda1","搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼"],["de40","毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓"],["dea1","煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓"],["df40","稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯"],["dfa1","腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤"],["e040","觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿"],["e0a1","遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠"],["e140","凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠"],["e1a1","寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉"],["e240","榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊"],["e2a1","漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓"],["e340","禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞"],["e3a1","耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻"],["e440","裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍"],["e4a1","銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘"],["e540","噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉"],["e5a1","憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒"],["e640","澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙"],["e6a1","獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟"],["e740","膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢"],["e7a1","蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧"],["e840","踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓"],["e8a1","銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮"],["e940","噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺"],["e9a1","憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸"],["ea40","澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙"],["eaa1","瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘"],["eb40","蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠"],["eba1","諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌"],["ec40","錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕"],["eca1","魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎"],["ed40","檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶"],["eda1","瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞"],["ee40","蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞"],["eea1","謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜"],["ef40","鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰"],["efa1","鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶"],["f040","璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒"],["f0a1","臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧"],["f140","蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪"],["f1a1","鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰"],["f240","徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛"],["f2a1","礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕"],["f340","譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦"],["f3a1","鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲"],["f440","嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩"],["f4a1","禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿"],["f540","鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛"],["f5a1","鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥"],["f640","蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺"],["f6a1","騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚"],["f740","糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊"],["f7a1","驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾"],["f840","讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏"],["f8a1","齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚"],["f940","纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊"],["f9a1","龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓"]] - -/***/ }), -/* 83 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * unpipe - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = unpipe - -/** - * Determine if there are Node.js pipe-like data listeners. - * @private - */ - -function hasPipeDataListeners(stream) { - var listeners = stream.listeners('data') - - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].name === 'ondata') { - return true - } - } - - return false -} - -/** - * Unpipe a stream from all destinations. - * - * @param {object} stream - * @public - */ - -function unpipe(stream) { - if (!stream) { - throw new TypeError('argument stream is required') - } - - if (typeof stream.unpipe === 'function') { - // new-style - stream.unpipe() - return - } - - // Node.js 0.8 hack - if (!hasPipeDataListeners(stream)) { - return - } - - var listener - var listeners = stream.listeners('close') - - for (var i = 0; i < listeners.length; i++) { - listener = listeners[i] - - if (listener.name !== 'cleanup' && listener.name !== 'onclose') { - continue - } - - // invoke the listener - listener.call(stream) - } -} - - -/***/ }), -/* 84 */ -/***/ (function(module, exports) { - -module.exports = require("zlib"); - -/***/ }), -/* 85 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * mime-types - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var db = __webpack_require__(153) -var extname = __webpack_require__(0).extname - -/** - * Module variables. - * @private - */ - -var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/ -var TEXT_TYPE_REGEXP = /^text\//i - -/** - * Module exports. - * @public - */ - -exports.charset = charset -exports.charsets = { lookup: charset } -exports.contentType = contentType -exports.extension = extension -exports.extensions = Object.create(null) -exports.lookup = lookup -exports.types = Object.create(null) - -// Populate the extensions/types maps -populateMaps(exports.extensions, exports.types) - -/** - * Get the default charset for a MIME type. - * - * @param {string} type - * @return {boolean|string} - */ - -function charset (type) { - if (!type || typeof type !== 'string') { - return false - } - - // TODO: use media-typer - var match = EXTRACT_TYPE_REGEXP.exec(type) - var mime = match && db[match[1].toLowerCase()] - - if (mime && mime.charset) { - return mime.charset - } - - // default text/* to utf-8 - if (match && TEXT_TYPE_REGEXP.test(match[1])) { - return 'UTF-8' - } - - return false -} - -/** - * Create a full Content-Type header given a MIME type or extension. - * - * @param {string} str - * @return {boolean|string} - */ - -function contentType (str) { - // TODO: should this even be in this module? - if (!str || typeof str !== 'string') { - return false - } - - var mime = str.indexOf('/') === -1 - ? exports.lookup(str) - : str - - if (!mime) { - return false - } - - // TODO: use content-type or other module - if (mime.indexOf('charset') === -1) { - var charset = exports.charset(mime) - if (charset) mime += '; charset=' + charset.toLowerCase() - } - - return mime -} - -/** - * Get the default extension for a MIME type. - * - * @param {string} type - * @return {boolean|string} - */ - -function extension (type) { - if (!type || typeof type !== 'string') { - return false - } - - // TODO: use media-typer - var match = EXTRACT_TYPE_REGEXP.exec(type) - - // get extensions - var exts = match && exports.extensions[match[1].toLowerCase()] - - if (!exts || !exts.length) { - return false - } - - return exts[0] -} - -/** - * Lookup the MIME type for a file path/extension. - * - * @param {string} path - * @return {boolean|string} - */ - -function lookup (path) { - if (!path || typeof path !== 'string') { - return false - } - - // get the extension ("ext" or ".ext" or full path) - var extension = extname('x.' + path) - .toLowerCase() - .substr(1) - - if (!extension) { - return false - } - - return exports.types[extension] || false -} - -/** - * Populate the extensions and types maps. - * @private - */ - -function populateMaps (extensions, types) { - // source preference (least -> most) - var preference = ['nginx', 'apache', undefined, 'iana'] - - Object.keys(db).forEach(function forEachMimeType (type) { - var mime = db[type] - var exts = mime.extensions - - if (!exts || !exts.length) { - return - } - - // mime -> extensions - extensions[type] = exts - - // extension -> mime - for (var i = 0; i < exts.length; i++) { - var extension = exts[i] - - if (types[extension]) { - var from = preference.indexOf(db[types[extension]].source) - var to = preference.indexOf(mime.source) - - if (types[extension] !== 'application/octet-stream' && - (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) { - // skip the remapping - continue - } - } - - // set the extension -> mime - types[extension] = type - } - }) -} - - -/***/ }), -/* 86 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var has = Object.prototype.hasOwnProperty; - -var hexTable = (function () { - var array = []; - for (var i = 0; i < 256; ++i) { - array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); - } - - return array; -}()); - -var compactQueue = function compactQueue(queue) { - var obj; - - while (queue.length) { - var item = queue.pop(); - obj = item.obj[item.prop]; - - if (Array.isArray(obj)) { - var compacted = []; - - for (var j = 0; j < obj.length; ++j) { - if (typeof obj[j] !== 'undefined') { - compacted.push(obj[j]); - } - } - - item.obj[item.prop] = compacted; - } - } - - return obj; -}; - -exports.arrayToObject = function arrayToObject(source, options) { - var obj = options && options.plainObjects ? Object.create(null) : {}; - for (var i = 0; i < source.length; ++i) { - if (typeof source[i] !== 'undefined') { - obj[i] = source[i]; - } - } - - return obj; -}; - -exports.merge = function merge(target, source, options) { - if (!source) { - return target; - } - - if (typeof source !== 'object') { - if (Array.isArray(target)) { - target.push(source); - } else if (typeof target === 'object') { - if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) { - target[source] = true; - } - } else { - return [target, source]; - } - - return target; - } - - if (typeof target !== 'object') { - return [target].concat(source); - } - - var mergeTarget = target; - if (Array.isArray(target) && !Array.isArray(source)) { - mergeTarget = exports.arrayToObject(target, options); - } - - if (Array.isArray(target) && Array.isArray(source)) { - source.forEach(function (item, i) { - if (has.call(target, i)) { - if (target[i] && typeof target[i] === 'object') { - target[i] = exports.merge(target[i], item, options); - } else { - target.push(item); - } - } else { - target[i] = item; - } - }); - return target; - } - - return Object.keys(source).reduce(function (acc, key) { - var value = source[key]; - - if (has.call(acc, key)) { - acc[key] = exports.merge(acc[key], value, options); - } else { - acc[key] = value; - } - return acc; - }, mergeTarget); -}; - -exports.assign = function assignSingleSource(target, source) { - return Object.keys(source).reduce(function (acc, key) { - acc[key] = source[key]; - return acc; - }, target); -}; - -exports.decode = function (str) { - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (e) { - return str; - } -}; - -exports.encode = function encode(str) { - // This code was originally written by Brian White (mscdex) for the io.js core querystring library. - // It has been adapted here for stricter adherence to RFC 3986 - if (str.length === 0) { - return str; - } - - var string = typeof str === 'string' ? str : String(str); - - var out = ''; - for (var i = 0; i < string.length; ++i) { - var c = string.charCodeAt(i); - - if ( - c === 0x2D // - - || c === 0x2E // . - || c === 0x5F // _ - || c === 0x7E // ~ - || (c >= 0x30 && c <= 0x39) // 0-9 - || (c >= 0x41 && c <= 0x5A) // a-z - || (c >= 0x61 && c <= 0x7A) // A-Z - ) { - out += string.charAt(i); - continue; - } - - if (c < 0x80) { - out = out + hexTable[c]; - continue; - } - - if (c < 0x800) { - out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); - continue; - } - - if (c < 0xD800 || c >= 0xE000) { - out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); - continue; - } - - i += 1; - c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); - out += hexTable[0xF0 | (c >> 18)] - + hexTable[0x80 | ((c >> 12) & 0x3F)] - + hexTable[0x80 | ((c >> 6) & 0x3F)] - + hexTable[0x80 | (c & 0x3F)]; - } - - return out; -}; - -exports.compact = function compact(value) { - var queue = [{ obj: { o: value }, prop: 'o' }]; - var refs = []; - - for (var i = 0; i < queue.length; ++i) { - var item = queue[i]; - var obj = item.obj[item.prop]; - - var keys = Object.keys(obj); - for (var j = 0; j < keys.length; ++j) { - var key = keys[j]; - var val = obj[key]; - if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { - queue.push({ obj: obj, prop: key }); - refs.push(val); - } - } - } - - return compactQueue(queue); -}; - -exports.isRegExp = function isRegExp(obj) { - return Object.prototype.toString.call(obj) === '[object RegExp]'; -}; - -exports.isBuffer = function isBuffer(obj) { - if (obj === null || typeof obj === 'undefined') { - return false; - } - - return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); -}; - - -/***/ }), -/* 87 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var replace = String.prototype.replace; -var percentTwenties = /%20/g; - -module.exports = { - 'default': 'RFC3986', - formatters: { - RFC1738: function (value) { - return replace.call(value, percentTwenties, '+'); - }, - RFC3986: function (value) { - return value; - } - }, - RFC1738: 'RFC1738', - RFC3986: 'RFC3986' -}; - - -/***/ }), -/* 88 */ -/***/ (function(module, exports) { - -module.exports = require("querystring"); - -/***/ }), -/* 89 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var Route = __webpack_require__(90); -var Layer = __webpack_require__(91); -var methods = __webpack_require__(51); -var mixin = __webpack_require__(42); -var debug = __webpack_require__(5)('express:router'); -var deprecate = __webpack_require__(7)('express'); -var flatten = __webpack_require__(41); -var parseUrl = __webpack_require__(23); -var setPrototypeOf = __webpack_require__(35) - -/** - * Module variables. - * @private - */ - -var objectRegExp = /^\[object (\S+)\]$/; -var slice = Array.prototype.slice; -var toString = Object.prototype.toString; - -/** - * Initialize a new `Router` with the given `options`. - * - * @param {Object} options - * @return {Router} which is an callable function - * @public - */ - -var proto = module.exports = function(options) { - var opts = options || {}; - - function router(req, res, next) { - router.handle(req, res, next); - } - - // mixin Router class functions - setPrototypeOf(router, proto) - - router.params = {}; - router._params = []; - router.caseSensitive = opts.caseSensitive; - router.mergeParams = opts.mergeParams; - router.strict = opts.strict; - router.stack = []; - - return router; -}; - -/** - * Map the given param placeholder `name`(s) to the given callback. - * - * Parameter mapping is used to provide pre-conditions to routes - * which use normalized placeholders. For example a _:user_id_ parameter - * could automatically load a user's information from the database without - * any additional code, - * - * The callback uses the same signature as middleware, the only difference - * being that the value of the placeholder is passed, in this case the _id_ - * of the user. Once the `next()` function is invoked, just like middleware - * it will continue on to execute the route, or subsequent parameter functions. - * - * Just like in middleware, you must either respond to the request or call next - * to avoid stalling the request. - * - * app.param('user_id', function(req, res, next, id){ - * User.find(id, function(err, user){ - * if (err) { - * return next(err); - * } else if (!user) { - * return next(new Error('failed to load user')); - * } - * req.user = user; - * next(); - * }); - * }); - * - * @param {String} name - * @param {Function} fn - * @return {app} for chaining - * @public - */ - -proto.param = function param(name, fn) { - // param logic - if (typeof name === 'function') { - deprecate('router.param(fn): Refactor to use path params'); - this._params.push(name); - return; - } - - // apply param functions - var params = this._params; - var len = params.length; - var ret; - - if (name[0] === ':') { - deprecate('router.param(' + JSON.stringify(name) + ', fn): Use router.param(' + JSON.stringify(name.substr(1)) + ', fn) instead'); - name = name.substr(1); - } - - for (var i = 0; i < len; ++i) { - if (ret = params[i](name, fn)) { - fn = ret; - } - } - - // ensure we end up with a - // middleware function - if ('function' !== typeof fn) { - throw new Error('invalid param() call for ' + name + ', got ' + fn); - } - - (this.params[name] = this.params[name] || []).push(fn); - return this; -}; - -/** - * Dispatch a req, res into the router. - * @private - */ - -proto.handle = function handle(req, res, out) { - var self = this; - - debug('dispatching %s %s', req.method, req.url); - - var idx = 0; - var protohost = getProtohost(req.url) || '' - var removed = ''; - var slashAdded = false; - var paramcalled = {}; - - // store options for OPTIONS request - // only used if OPTIONS request - var options = []; - - // middleware and routes - var stack = self.stack; - - // manage inter-router variables - var parentParams = req.params; - var parentUrl = req.baseUrl || ''; - var done = restore(out, req, 'baseUrl', 'next', 'params'); - - // setup next layer - req.next = next; - - // for options requests, respond with a default if nothing else responds - if (req.method === 'OPTIONS') { - done = wrap(done, function(old, err) { - if (err || options.length === 0) return old(err); - sendOptionsResponse(res, options, old); - }); - } - - // setup basic req values - req.baseUrl = parentUrl; - req.originalUrl = req.originalUrl || req.url; - - next(); - - function next(err) { - var layerError = err === 'route' - ? null - : err; - - // remove added slash - if (slashAdded) { - req.url = req.url.substr(1); - slashAdded = false; - } - - // restore altered req.url - if (removed.length !== 0) { - req.baseUrl = parentUrl; - req.url = protohost + removed + req.url.substr(protohost.length); - removed = ''; - } - - // signal to exit router - if (layerError === 'router') { - setImmediate(done, null) - return - } - - // no more matching layers - if (idx >= stack.length) { - setImmediate(done, layerError); - return; - } - - // get pathname of request - var path = getPathname(req); - - if (path == null) { - return done(layerError); - } - - // find next matching layer - var layer; - var match; - var route; - - while (match !== true && idx < stack.length) { - layer = stack[idx++]; - match = matchLayer(layer, path); - route = layer.route; - - if (typeof match !== 'boolean') { - // hold on to layerError - layerError = layerError || match; - } - - if (match !== true) { - continue; - } - - if (!route) { - // process non-route handlers normally - continue; - } - - if (layerError) { - // routes do not match with a pending error - match = false; - continue; - } - - var method = req.method; - var has_method = route._handles_method(method); - - // build up automatic options response - if (!has_method && method === 'OPTIONS') { - appendMethods(options, route._options()); - } - - // don't even bother matching route - if (!has_method && method !== 'HEAD') { - match = false; - continue; - } - } - - // no match - if (match !== true) { - return done(layerError); - } - - // store route for dispatch on change - if (route) { - req.route = route; - } - - // Capture one-time layer values - req.params = self.mergeParams - ? mergeParams(layer.params, parentParams) - : layer.params; - var layerPath = layer.path; - - // this should be done for the layer - self.process_params(layer, paramcalled, req, res, function (err) { - if (err) { - return next(layerError || err); - } - - if (route) { - return layer.handle_request(req, res, next); - } - - trim_prefix(layer, layerError, layerPath, path); - }); - } - - function trim_prefix(layer, layerError, layerPath, path) { - if (layerPath.length !== 0) { - // Validate path breaks on a path separator - var c = path[layerPath.length] - if (c && c !== '/' && c !== '.') return next(layerError) - - // Trim off the part of the url that matches the route - // middleware (.use stuff) needs to have the path stripped - debug('trim prefix (%s) from url %s', layerPath, req.url); - removed = layerPath; - req.url = protohost + req.url.substr(protohost.length + removed.length); - - // Ensure leading slash - if (!protohost && req.url[0] !== '/') { - req.url = '/' + req.url; - slashAdded = true; - } - - // Setup base URL (no trailing slash) - req.baseUrl = parentUrl + (removed[removed.length - 1] === '/' - ? removed.substring(0, removed.length - 1) - : removed); - } - - debug('%s %s : %s', layer.name, layerPath, req.originalUrl); - - if (layerError) { - layer.handle_error(layerError, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Process any parameters for the layer. - * @private - */ - -proto.process_params = function process_params(layer, called, req, res, done) { - var params = this.params; - - // captured parameters from the layer, keys and values - var keys = layer.keys; - - // fast track - if (!keys || keys.length === 0) { - return done(); - } - - var i = 0; - var name; - var paramIndex = 0; - var key; - var paramVal; - var paramCallbacks; - var paramCalled; - - // process params in order - // param callbacks can be async - function param(err) { - if (err) { - return done(err); - } - - if (i >= keys.length ) { - return done(); - } - - paramIndex = 0; - key = keys[i++]; - name = key.name; - paramVal = req.params[name]; - paramCallbacks = params[name]; - paramCalled = called[name]; - - if (paramVal === undefined || !paramCallbacks) { - return param(); - } - - // param previously called with same value or error occurred - if (paramCalled && (paramCalled.match === paramVal - || (paramCalled.error && paramCalled.error !== 'route'))) { - // restore value - req.params[name] = paramCalled.value; - - // next param - return param(paramCalled.error); - } - - called[name] = paramCalled = { - error: null, - match: paramVal, - value: paramVal - }; - - paramCallback(); - } - - // single param callbacks - function paramCallback(err) { - var fn = paramCallbacks[paramIndex++]; - - // store updated value - paramCalled.value = req.params[key.name]; - - if (err) { - // store error - paramCalled.error = err; - param(err); - return; - } - - if (!fn) return param(); - - try { - fn(req, res, paramCallback, paramVal, key.name); - } catch (e) { - paramCallback(e); - } - } - - param(); -}; - -/** - * Use the given middleware function, with optional path, defaulting to "/". - * - * Use (like `.all`) will run for any http METHOD, but it will not add - * handlers for those methods so OPTIONS requests will not consider `.use` - * functions even if they could respond. - * - * The other difference is that _route_ path is stripped and not visible - * to the handler function. The main effect of this feature is that mounted - * handlers can operate without any code changes regardless of the "prefix" - * pathname. - * - * @public - */ - -proto.use = function use(fn) { - var offset = 0; - var path = '/'; - - // default path to '/' - // disambiguate router.use([fn]) - if (typeof fn !== 'function') { - var arg = fn; - - while (Array.isArray(arg) && arg.length !== 0) { - arg = arg[0]; - } - - // first arg is the path - if (typeof arg !== 'function') { - offset = 1; - path = fn; - } - } - - var callbacks = flatten(slice.call(arguments, offset)); - - if (callbacks.length === 0) { - throw new TypeError('Router.use() requires a middleware function') - } - - for (var i = 0; i < callbacks.length; i++) { - var fn = callbacks[i]; - - if (typeof fn !== 'function') { - throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn)) - } - - // add the middleware - debug('use %o %s', path, fn.name || '') - - var layer = new Layer(path, { - sensitive: this.caseSensitive, - strict: false, - end: false - }, fn); - - layer.route = undefined; - - this.stack.push(layer); - } - - return this; -}; - -/** - * Create a new Route for the given path. - * - * Each route contains a separate middleware stack and VERB handlers. - * - * See the Route api documentation for details on adding handlers - * and middleware to routes. - * - * @param {String} path - * @return {Route} - * @public - */ - -proto.route = function route(path) { - var route = new Route(path); - - var layer = new Layer(path, { - sensitive: this.caseSensitive, - strict: this.strict, - end: true - }, route.dispatch.bind(route)); - - layer.route = route; - - this.stack.push(layer); - return route; -}; - -// create Router#VERB functions -methods.concat('all').forEach(function(method){ - proto[method] = function(path){ - var route = this.route(path) - route[method].apply(route, slice.call(arguments, 1)); - return this; - }; -}); - -// append methods to a list of methods -function appendMethods(list, addition) { - for (var i = 0; i < addition.length; i++) { - var method = addition[i]; - if (list.indexOf(method) === -1) { - list.push(method); - } - } -} - -// get pathname of request -function getPathname(req) { - try { - return parseUrl(req).pathname; - } catch (err) { - return undefined; - } -} - -// Get get protocol + host for a URL -function getProtohost(url) { - if (typeof url !== 'string' || url.length === 0 || url[0] === '/') { - return undefined - } - - var searchIndex = url.indexOf('?') - var pathLength = searchIndex !== -1 - ? searchIndex - : url.length - var fqdnIndex = url.substr(0, pathLength).indexOf('://') - - return fqdnIndex !== -1 - ? url.substr(0, url.indexOf('/', 3 + fqdnIndex)) - : undefined -} - -// get type for error message -function gettype(obj) { - var type = typeof obj; - - if (type !== 'object') { - return type; - } - - // inspect [[Class]] for objects - return toString.call(obj) - .replace(objectRegExp, '$1'); -} - -/** - * Match path to a layer. - * - * @param {Layer} layer - * @param {string} path - * @private - */ - -function matchLayer(layer, path) { - try { - return layer.match(path); - } catch (err) { - return err; - } -} - -// merge params with parent params -function mergeParams(params, parent) { - if (typeof parent !== 'object' || !parent) { - return params; - } - - // make copy of parent for base - var obj = mixin({}, parent); - - // simple non-numeric merging - if (!(0 in params) || !(0 in parent)) { - return mixin(obj, params); - } - - var i = 0; - var o = 0; - - // determine numeric gaps - while (i in params) { - i++; - } - - while (o in parent) { - o++; - } - - // offset numeric indices in params before merge - for (i--; i >= 0; i--) { - params[i + o] = params[i]; - - // create holes for the merge when necessary - if (i < o) { - delete params[i]; - } - } - - return mixin(obj, params); -} - -// restore obj props after function -function restore(fn, obj) { - var props = new Array(arguments.length - 2); - var vals = new Array(arguments.length - 2); - - for (var i = 0; i < props.length; i++) { - props[i] = arguments[i + 2]; - vals[i] = obj[props[i]]; - } - - return function () { - // restore vals - for (var i = 0; i < props.length; i++) { - obj[props[i]] = vals[i]; - } - - return fn.apply(this, arguments); - }; -} - -// send an OPTIONS response -function sendOptionsResponse(res, options, next) { - try { - var body = options.join(','); - res.set('Allow', body); - res.send(body); - } catch (err) { - next(err); - } -} - -// wrap a function -function wrap(old, fn) { - return function proxy() { - var args = new Array(arguments.length + 1); - - args[0] = old; - for (var i = 0, len = arguments.length; i < len; i++) { - args[i + 1] = arguments[i]; - } - - fn.apply(this, args); - }; -} - - -/***/ }), -/* 90 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var debug = __webpack_require__(5)('express:router:route'); -var flatten = __webpack_require__(41); -var Layer = __webpack_require__(91); -var methods = __webpack_require__(51); - -/** - * Module variables. - * @private - */ - -var slice = Array.prototype.slice; -var toString = Object.prototype.toString; - -/** - * Module exports. - * @public - */ - -module.exports = Route; - -/** - * Initialize `Route` with the given `path`, - * - * @param {String} path - * @public - */ - -function Route(path) { - this.path = path; - this.stack = []; - - debug('new %o', path) - - // route handlers for various http methods - this.methods = {}; -} - -/** - * Determine if the route handles a given method. - * @private - */ - -Route.prototype._handles_method = function _handles_method(method) { - if (this.methods._all) { - return true; - } - - var name = method.toLowerCase(); - - if (name === 'head' && !this.methods['head']) { - name = 'get'; - } - - return Boolean(this.methods[name]); -}; - -/** - * @return {Array} supported HTTP methods - * @private - */ - -Route.prototype._options = function _options() { - var methods = Object.keys(this.methods); - - // append automatic head - if (this.methods.get && !this.methods.head) { - methods.push('head'); - } - - for (var i = 0; i < methods.length; i++) { - // make upper case - methods[i] = methods[i].toUpperCase(); - } - - return methods; -}; - -/** - * dispatch req, res into this route - * @private - */ - -Route.prototype.dispatch = function dispatch(req, res, done) { - var idx = 0; - var stack = this.stack; - if (stack.length === 0) { - return done(); - } - - var method = req.method.toLowerCase(); - if (method === 'head' && !this.methods['head']) { - method = 'get'; - } - - req.route = this; - - next(); - - function next(err) { - // signal to exit route - if (err && err === 'route') { - return done(); - } - - // signal to exit router - if (err && err === 'router') { - return done(err) - } - - var layer = stack[idx++]; - if (!layer) { - return done(err); - } - - if (layer.method && layer.method !== method) { - return next(err); - } - - if (err) { - layer.handle_error(err, req, res, next); - } else { - layer.handle_request(req, res, next); - } - } -}; - -/** - * Add a handler for all HTTP verbs to this route. - * - * Behaves just like middleware and can respond or call `next` - * to continue processing. - * - * You can use multiple `.all` call to add multiple handlers. - * - * function check_something(req, res, next){ - * next(); - * }; - * - * function validate_user(req, res, next){ - * next(); - * }; - * - * route - * .all(validate_user) - * .all(check_something) - * .get(function(req, res, next){ - * res.send('hello world'); - * }); - * - * @param {function} handler - * @return {Route} for chaining - * @api public - */ - -Route.prototype.all = function all() { - var handles = flatten(slice.call(arguments)); - - for (var i = 0; i < handles.length; i++) { - var handle = handles[i]; - - if (typeof handle !== 'function') { - var type = toString.call(handle); - var msg = 'Route.all() requires a callback function but got a ' + type - throw new TypeError(msg); - } - - var layer = Layer('/', {}, handle); - layer.method = undefined; - - this.methods._all = true; - this.stack.push(layer); - } - - return this; -}; - -methods.forEach(function(method){ - Route.prototype[method] = function(){ - var handles = flatten(slice.call(arguments)); - - for (var i = 0; i < handles.length; i++) { - var handle = handles[i]; - - if (typeof handle !== 'function') { - var type = toString.call(handle); - var msg = 'Route.' + method + '() requires a callback function but got a ' + type - throw new Error(msg); - } - - debug('%s %o', method, this.path) - - var layer = Layer('/', {}, handle); - layer.method = method; - - this.methods[method] = true; - this.stack.push(layer); - } - - return this; - }; -}); - - -/***/ }), -/* 91 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var pathRegexp = __webpack_require__(163); -var debug = __webpack_require__(5)('express:router:layer'); - -/** - * Module variables. - * @private - */ - -var hasOwnProperty = Object.prototype.hasOwnProperty; - -/** - * Module exports. - * @public - */ - -module.exports = Layer; - -function Layer(path, options, fn) { - if (!(this instanceof Layer)) { - return new Layer(path, options, fn); - } - - debug('new %o', path) - var opts = options || {}; - - this.handle = fn; - this.name = fn.name || ''; - this.params = undefined; - this.path = undefined; - this.regexp = pathRegexp(path, this.keys = [], opts); - - // set fast path flags - this.regexp.fast_star = path === '*' - this.regexp.fast_slash = path === '/' && opts.end === false -} - -/** - * Handle the error for the layer. - * - * @param {Error} error - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_error = function handle_error(error, req, res, next) { - var fn = this.handle; - - if (fn.length !== 4) { - // not a standard error handler - return next(error); - } - - try { - fn(error, req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Handle the request for the layer. - * - * @param {Request} req - * @param {Response} res - * @param {function} next - * @api private - */ - -Layer.prototype.handle_request = function handle(req, res, next) { - var fn = this.handle; - - if (fn.length > 3) { - // not a standard request handler - return next(); - } - - try { - fn(req, res, next); - } catch (err) { - next(err); - } -}; - -/** - * Check if this route matches `path`, if so - * populate `.params`. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -Layer.prototype.match = function match(path) { - var match - - if (path != null) { - // fast path non-ending match for / (any path matches) - if (this.regexp.fast_slash) { - this.params = {} - this.path = '' - return true - } - - // fast path for * (everything matched in a param) - if (this.regexp.fast_star) { - this.params = {'0': decode_param(path)} - this.path = path - return true - } - - // match the path - match = this.regexp.exec(path) - } - - if (!match) { - this.params = undefined; - this.path = undefined; - return false; - } - - // store values - this.params = {}; - this.path = match[0] - - var keys = this.keys; - var params = this.params; - - for (var i = 1; i < match.length; i++) { - var key = keys[i - 1]; - var prop = key.name; - var val = decode_param(match[i]) - - if (val !== undefined || !(hasOwnProperty.call(params, prop))) { - params[prop] = val; - } - } - - return true; -}; - -/** - * Decode param value. - * - * @param {string} val - * @return {string} - * @private - */ - -function decode_param(val) { - if (typeof val !== 'string' || val.length === 0) { - return val; - } - - try { - return decodeURIComponent(val); - } catch (err) { - if (err instanceof URIError) { - err.message = 'Failed to decode param \'' + val + '\''; - err.status = err.statusCode = 400; - } - - throw err; - } -} - - -/***/ }), -/* 92 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - */ - -var merge = __webpack_require__(42) -var parseUrl = __webpack_require__(23); -var qs = __webpack_require__(50); - -/** - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function query(options) { - var opts = merge({}, options) - var queryparse = qs.parse; - - if (typeof options === 'function') { - queryparse = options; - opts = undefined; - } - - if (opts !== undefined && opts.allowPrototypes === undefined) { - // back-compat for qs module - opts.allowPrototypes = true; - } - - return function query(req, res, next){ - if (!req.query) { - var val = parseUrl(req).query; - req.query = queryparse(val, opts); - } - - next(); - }; -}; - - -/***/ }), -/* 93 */ -/***/ (function(module, exports, __webpack_require__) { - -/* eslint-disable node/no-deprecated-api */ -var buffer = __webpack_require__(3) -var Buffer = buffer.Buffer - -// alternative to using Object.keys for old browsers -function copyProps (src, dst) { - for (var key in src) { - dst[key] = src[key] - } -} -if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { - module.exports = buffer -} else { - // Copy properties from require('buffer') - copyProps(buffer, exports) - exports.Buffer = SafeBuffer -} - -function SafeBuffer (arg, encodingOrOffset, length) { - return Buffer(arg, encodingOrOffset, length) -} - -// Copy static methods from Buffer -copyProps(Buffer, SafeBuffer) - -SafeBuffer.from = function (arg, encodingOrOffset, length) { - if (typeof arg === 'number') { - throw new TypeError('Argument must not be a number') - } - return Buffer(arg, encodingOrOffset, length) -} - -SafeBuffer.alloc = function (size, fill, encoding) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - var buf = Buffer(size) - if (fill !== undefined) { - if (typeof encoding === 'string') { - buf.fill(fill, encoding) - } else { - buf.fill(fill) - } - } else { - buf.fill(0) - } - return buf -} - -SafeBuffer.allocUnsafe = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return Buffer(size) -} - -SafeBuffer.allocUnsafeSlow = function (size) { - if (typeof size !== 'number') { - throw new TypeError('Argument must be a number') - } - return buffer.SlowBuffer(size) -} - - -/***/ }), -/* 94 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * content-disposition - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - */ - -module.exports = contentDisposition -module.exports.parse = parse - -/** - * Module dependencies. - */ - -var basename = __webpack_require__(0).basename - -/** - * RegExp to match non attr-char, *after* encodeURIComponent (i.e. not including "%") - */ - -var ENCODE_URL_ATTR_CHAR_REGEXP = /[\x00-\x20"'()*,/:;<=>?@[\\\]{}\x7f]/g // eslint-disable-line no-control-regex - -/** - * RegExp to match percent encoding escape. - */ - -var HEX_ESCAPE_REGEXP = /%[0-9A-Fa-f]{2}/ -var HEX_ESCAPE_REPLACE_REGEXP = /%([0-9A-Fa-f]{2})/g - -/** - * RegExp to match non-latin1 characters. - */ - -var NON_LATIN1_REGEXP = /[^\x20-\x7e\xa0-\xff]/g - -/** - * RegExp to match quoted-pair in RFC 2616 - * - * quoted-pair = "\" CHAR - * CHAR = - */ - -var QESC_REGEXP = /\\([\u0000-\u007f])/g - -/** - * RegExp to match chars that must be quoted-pair in RFC 2616 - */ - -var QUOTE_REGEXP = /([\\"])/g - -/** - * RegExp for various RFC 2616 grammar - * - * parameter = token "=" ( token | quoted-string ) - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) - * qdtext = > - * quoted-pair = "\" CHAR - * CHAR = - * TEXT = - * LWS = [CRLF] 1*( SP | HT ) - * CRLF = CR LF - * CR = - * LF = - * SP = - * HT = - * CTL = - * OCTET = - */ - -var PARAM_REGEXP = /;[\x09\x20]*([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*=[\x09\x20]*("(?:[\x20!\x23-\x5b\x5d-\x7e\x80-\xff]|\\[\x20-\x7e])*"|[!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*/g // eslint-disable-line no-control-regex -var TEXT_REGEXP = /^[\x20-\x7e\x80-\xff]+$/ -var TOKEN_REGEXP = /^[!#$%&'*+.0-9A-Z^_`a-z|~-]+$/ - -/** - * RegExp for various RFC 5987 grammar - * - * ext-value = charset "'" [ language ] "'" value-chars - * charset = "UTF-8" / "ISO-8859-1" / mime-charset - * mime-charset = 1*mime-charsetc - * mime-charsetc = ALPHA / DIGIT - * / "!" / "#" / "$" / "%" / "&" - * / "+" / "-" / "^" / "_" / "`" - * / "{" / "}" / "~" - * language = ( 2*3ALPHA [ extlang ] ) - * / 4ALPHA - * / 5*8ALPHA - * extlang = *3( "-" 3ALPHA ) - * value-chars = *( pct-encoded / attr-char ) - * pct-encoded = "%" HEXDIG HEXDIG - * attr-char = ALPHA / DIGIT - * / "!" / "#" / "$" / "&" / "+" / "-" / "." - * / "^" / "_" / "`" / "|" / "~" - */ - -var EXT_VALUE_REGEXP = /^([A-Za-z0-9!#$%&+\-^_`{}~]+)'(?:[A-Za-z]{2,3}(?:-[A-Za-z]{3}){0,3}|[A-Za-z]{4,8}|)'((?:%[0-9A-Fa-f]{2}|[A-Za-z0-9!#$&+.^_`|~-])+)$/ - -/** - * RegExp for various RFC 6266 grammar - * - * disposition-type = "inline" | "attachment" | disp-ext-type - * disp-ext-type = token - * disposition-parm = filename-parm | disp-ext-parm - * filename-parm = "filename" "=" value - * | "filename*" "=" ext-value - * disp-ext-parm = token "=" value - * | ext-token "=" ext-value - * ext-token = - */ - -var DISPOSITION_TYPE_REGEXP = /^([!#$%&'*+.0-9A-Z^_`a-z|~-]+)[\x09\x20]*(?:$|;)/ // eslint-disable-line no-control-regex - -/** - * Create an attachment Content-Disposition header. - * - * @param {string} [filename] - * @param {object} [options] - * @param {string} [options.type=attachment] - * @param {string|boolean} [options.fallback=true] - * @return {string} - * @api public - */ - -function contentDisposition (filename, options) { - var opts = options || {} - - // get type - var type = opts.type || 'attachment' - - // get parameters - var params = createparams(filename, opts.fallback) - - // format into string - return format(new ContentDisposition(type, params)) -} - -/** - * Create parameters object from filename and fallback. - * - * @param {string} [filename] - * @param {string|boolean} [fallback=true] - * @return {object} - * @api private - */ - -function createparams (filename, fallback) { - if (filename === undefined) { - return - } - - var params = {} - - if (typeof filename !== 'string') { - throw new TypeError('filename must be a string') - } - - // fallback defaults to true - if (fallback === undefined) { - fallback = true - } - - if (typeof fallback !== 'string' && typeof fallback !== 'boolean') { - throw new TypeError('fallback must be a string or boolean') - } - - if (typeof fallback === 'string' && NON_LATIN1_REGEXP.test(fallback)) { - throw new TypeError('fallback must be ISO-8859-1 string') - } - - // restrict to file base name - var name = basename(filename) - - // determine if name is suitable for quoted string - var isQuotedString = TEXT_REGEXP.test(name) - - // generate fallback name - var fallbackName = typeof fallback !== 'string' - ? fallback && getlatin1(name) - : basename(fallback) - var hasFallback = typeof fallbackName === 'string' && fallbackName !== name - - // set extended filename parameter - if (hasFallback || !isQuotedString || HEX_ESCAPE_REGEXP.test(name)) { - params['filename*'] = name - } - - // set filename parameter - if (isQuotedString || hasFallback) { - params.filename = hasFallback - ? fallbackName - : name - } - - return params -} - -/** - * Format object to Content-Disposition header. - * - * @param {object} obj - * @param {string} obj.type - * @param {object} [obj.parameters] - * @return {string} - * @api private - */ - -function format (obj) { - var parameters = obj.parameters - var type = obj.type - - if (!type || typeof type !== 'string' || !TOKEN_REGEXP.test(type)) { - throw new TypeError('invalid type') - } - - // start with normalized type - var string = String(type).toLowerCase() - - // append parameters - if (parameters && typeof parameters === 'object') { - var param - var params = Object.keys(parameters).sort() - - for (var i = 0; i < params.length; i++) { - param = params[i] - - var val = param.substr(-1) === '*' - ? ustring(parameters[param]) - : qstring(parameters[param]) - - string += '; ' + param + '=' + val - } - } - - return string -} - -/** - * Decode a RFC 6987 field value (gracefully). - * - * @param {string} str - * @return {string} - * @api private - */ - -function decodefield (str) { - var match = EXT_VALUE_REGEXP.exec(str) - - if (!match) { - throw new TypeError('invalid extended field value') - } - - var charset = match[1].toLowerCase() - var encoded = match[2] - var value - - // to binary string - var binary = encoded.replace(HEX_ESCAPE_REPLACE_REGEXP, pdecode) - - switch (charset) { - case 'iso-8859-1': - value = getlatin1(binary) - break - case 'utf-8': - value = new Buffer(binary, 'binary').toString('utf8') - break - default: - throw new TypeError('unsupported charset in extended field') - } - - return value -} - -/** - * Get ISO-8859-1 version of string. - * - * @param {string} val - * @return {string} - * @api private - */ - -function getlatin1 (val) { - // simple Unicode -> ISO-8859-1 transformation - return String(val).replace(NON_LATIN1_REGEXP, '?') -} - -/** - * Parse Content-Disposition header string. - * - * @param {string} string - * @return {object} - * @api private - */ - -function parse (string) { - if (!string || typeof string !== 'string') { - throw new TypeError('argument string is required') - } - - var match = DISPOSITION_TYPE_REGEXP.exec(string) - - if (!match) { - throw new TypeError('invalid type format') - } - - // normalize type - var index = match[0].length - var type = match[1].toLowerCase() - - var key - var names = [] - var params = {} - var value - - // calculate index to start at - index = PARAM_REGEXP.lastIndex = match[0].substr(-1) === ';' - ? index - 1 - : index - - // match parameters - while ((match = PARAM_REGEXP.exec(string))) { - if (match.index !== index) { - throw new TypeError('invalid parameter format') - } - - index += match[0].length - key = match[1].toLowerCase() - value = match[2] - - if (names.indexOf(key) !== -1) { - throw new TypeError('invalid duplicate parameter') - } - - names.push(key) - - if (key.indexOf('*') + 1 === key.length) { - // decode extended value - key = key.slice(0, -1) - value = decodefield(value) - - // overwrite existing value - params[key] = value - continue - } - - if (typeof params[key] === 'string') { - continue - } - - if (value[0] === '"') { - // remove quotes and escapes - value = value - .substr(1, value.length - 2) - .replace(QESC_REGEXP, '$1') - } - - params[key] = value - } - - if (index !== -1 && index !== string.length) { - throw new TypeError('invalid parameter format') - } - - return new ContentDisposition(type, params) -} - -/** - * Percent decode a single character. - * - * @param {string} str - * @param {string} hex - * @return {string} - * @api private - */ - -function pdecode (str, hex) { - return String.fromCharCode(parseInt(hex, 16)) -} - -/** - * Percent encode a single character. - * - * @param {string} char - * @return {string} - * @api private - */ - -function pencode (char) { - var hex = String(char) - .charCodeAt(0) - .toString(16) - .toUpperCase() - return hex.length === 1 - ? '%0' + hex - : '%' + hex -} - -/** - * Quote a string for HTTP. - * - * @param {string} val - * @return {string} - * @api private - */ - -function qstring (val) { - var str = String(val) - - return '"' + str.replace(QUOTE_REGEXP, '\\$1') + '"' -} - -/** - * Encode a Unicode string for HTTP (RFC 5987). - * - * @param {string} val - * @return {string} - * @api private - */ - -function ustring (val) { - var str = String(val) - - // percent encode as UTF-8 - var encoded = encodeURIComponent(str) - .replace(ENCODE_URL_ATTR_CHAR_REGEXP, pencode) - - return 'UTF-8\'\'' + encoded -} - -/** - * Class for parsed Content-Disposition header for v8 optimization - */ - -function ContentDisposition (type, parameters) { - this.type = type - this.parameters = parameters -} - - -/***/ }), -/* 95 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * etag - * Copyright(c) 2014-2016 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = etag - -/** - * Module dependencies. - * @private - */ - -var crypto = __webpack_require__(43) -var Stats = __webpack_require__(8).Stats - -/** - * Module variables. - * @private - */ - -var toString = Object.prototype.toString - -/** - * Generate an entity tag. - * - * @param {Buffer|string} entity - * @return {string} - * @private - */ - -function entitytag (entity) { - if (entity.length === 0) { - // fast-path empty - return '"0-2jmj7l5rSw0yVb/vlWAYkK/YBwk"' - } - - // compute hash of entity - var hash = crypto - .createHash('sha1') - .update(entity, 'utf8') - .digest('base64') - .substring(0, 27) - - // compute length of entity - var len = typeof entity === 'string' - ? Buffer.byteLength(entity, 'utf8') - : entity.length - - return '"' + len.toString(16) + '-' + hash + '"' -} - -/** - * Create a simple ETag. - * - * @param {string|Buffer|Stats} entity - * @param {object} [options] - * @param {boolean} [options.weak] - * @return {String} - * @public - */ - -function etag (entity, options) { - if (entity == null) { - throw new TypeError('argument entity is required') - } - - // support fs.Stats object - var isStats = isstats(entity) - var weak = options && typeof options.weak === 'boolean' - ? options.weak - : isStats - - // validate argument - if (!isStats && typeof entity !== 'string' && !Buffer.isBuffer(entity)) { - throw new TypeError('argument entity must be string, Buffer, or fs.Stats') - } - - // generate entity tag - var tag = isStats - ? stattag(entity) - : entitytag(entity) - - return weak - ? 'W/' + tag - : tag -} - -/** - * Determine if object is a Stats object. - * - * @param {object} obj - * @return {boolean} - * @api private - */ - -function isstats (obj) { - // genuine fs.Stats - if (typeof Stats === 'function' && obj instanceof Stats) { - return true - } - - // quack quack - return obj && typeof obj === 'object' && - 'ctime' in obj && toString.call(obj.ctime) === '[object Date]' && - 'mtime' in obj && toString.call(obj.mtime) === '[object Date]' && - 'ino' in obj && typeof obj.ino === 'number' && - 'size' in obj && typeof obj.size === 'number' -} - -/** - * Generate a tag for a stat. - * - * @param {object} stat - * @return {string} - * @private - */ - -function stattag (stat) { - var mtime = stat.mtime.getTime().toString(16) - var size = stat.size.toString(16) - - return '"' + size + '-' + mtime + '"' -} - - -/***/ }), -/* 96 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * fresh - * Copyright(c) 2012 TJ Holowaychuk - * Copyright(c) 2016-2017 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * RegExp to check for no-cache token in Cache-Control. - * @private - */ - -var CACHE_CONTROL_NO_CACHE_REGEXP = /(?:^|,)\s*?no-cache\s*?(?:,|$)/ - -/** - * Module exports. - * @public - */ - -module.exports = fresh - -/** - * Check freshness of the response using request and response headers. - * - * @param {Object} reqHeaders - * @param {Object} resHeaders - * @return {Boolean} - * @public - */ - -function fresh (reqHeaders, resHeaders) { - // fields - var modifiedSince = reqHeaders['if-modified-since'] - var noneMatch = reqHeaders['if-none-match'] - - // unconditional request - if (!modifiedSince && !noneMatch) { - return false - } - - // Always return stale when Cache-Control: no-cache - // to support end-to-end reload requests - // https://tools.ietf.org/html/rfc2616#section-14.9.4 - var cacheControl = reqHeaders['cache-control'] - if (cacheControl && CACHE_CONTROL_NO_CACHE_REGEXP.test(cacheControl)) { - return false - } - - // if-none-match - if (noneMatch && noneMatch !== '*') { - var etag = resHeaders['etag'] - - if (!etag) { - return false - } - - var etagStale = true - var matches = parseTokenList(noneMatch) - for (var i = 0; i < matches.length; i++) { - var match = matches[i] - if (match === etag || match === 'W/' + etag || 'W/' + match === etag) { - etagStale = false - break - } - } - - if (etagStale) { - return false - } - } - - // if-modified-since - if (modifiedSince) { - var lastModified = resHeaders['last-modified'] - var modifiedStale = !lastModified || !(parseHttpDate(lastModified) <= parseHttpDate(modifiedSince)) - - if (modifiedStale) { - return false - } - } - - return true -} - -/** - * Parse an HTTP Date into a number. - * - * @param {string} date - * @private - */ - -function parseHttpDate (date) { - var timestamp = date && Date.parse(date) - - // istanbul ignore next: guard against date.js Date.parse patching - return typeof timestamp === 'number' - ? timestamp - : NaN -} - -/** - * Parse a HTTP token list. - * - * @param {string} str - * @private - */ - -function parseTokenList (str) { - var end = 0 - var list = [] - var start = 0 - - // gather tokens - for (var i = 0, len = str.length; i < len; i++) { - switch (str.charCodeAt(i)) { - case 0x20: /* */ - if (start === end) { - start = end = i + 1 - } - break - case 0x2c: /* , */ - list.push(str.substring(start, end)) - start = end = i + 1 - break - default: - end = i + 1 - break - } - } - - // final token - list.push(str.substring(start, end)) - - return list -} - - -/***/ }), -/* 97 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * range-parser - * Copyright(c) 2012-2014 TJ Holowaychuk - * Copyright(c) 2015-2016 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = rangeParser - -/** - * Parse "Range" header `str` relative to the given file `size`. - * - * @param {Number} size - * @param {String} str - * @param {Object} [options] - * @return {Array} - * @public - */ - -function rangeParser (size, str, options) { - var index = str.indexOf('=') - - if (index === -1) { - return -2 - } - - // split the range string - var arr = str.slice(index + 1).split(',') - var ranges = [] - - // add ranges type - ranges.type = str.slice(0, index) - - // parse all ranges - for (var i = 0; i < arr.length; i++) { - var range = arr[i].split('-') - var start = parseInt(range[0], 10) - var end = parseInt(range[1], 10) - - // -nnn - if (isNaN(start)) { - start = size - end - end = size - 1 - // nnn- - } else if (isNaN(end)) { - end = size - 1 - } - - // limit last-byte-pos to current length - if (end > size - 1) { - end = size - 1 - } - - // invalid or unsatisifiable - if (isNaN(start) || isNaN(end) || start > end || start < 0) { - continue - } - - // add range - ranges.push({ - start: start, - end: end - }) - } - - if (ranges.length < 1) { - // unsatisifiable - return -1 - } - - return options && options.combine - ? combineRanges(ranges) - : ranges -} - -/** - * Combine overlapping & adjacent ranges. - * @private - */ - -function combineRanges (ranges) { - var ordered = ranges.map(mapWithIndex).sort(sortByRangeStart) - - for (var j = 0, i = 1; i < ordered.length; i++) { - var range = ordered[i] - var current = ordered[j] - - if (range.start > current.end + 1) { - // next range - ordered[++j] = range - } else if (range.end > current.end) { - // extend range - current.end = range.end - current.index = Math.min(current.index, range.index) - } - } - - // trim ordered array - ordered.length = j + 1 - - // generate combined range - var combined = ordered.sort(sortByRangeIndex).map(mapWithoutIndex) - - // copy ranges type - combined.type = ranges.type - - return combined -} - -/** - * Map function to add index value to ranges. - * @private - */ - -function mapWithIndex (range, index) { - return { - start: range.start, - end: range.end, - index: index - } -} - -/** - * Map function to remove index value from ranges. - * @private - */ - -function mapWithoutIndex (range) { - return { - start: range.start, - end: range.end - } -} - -/** - * Sort function to sort ranges by index. - * @private - */ - -function sortByRangeIndex (a, b) { - return a.index - b.index -} - -/** - * Sort function to sort ranges by start position. - * @private - */ - -function sortByRangeStart (a, b) { - return a.start - b.start -} - - -/***/ }), -/* 98 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * proxy-addr - * Copyright(c) 2014-2016 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = proxyaddr -module.exports.all = alladdrs -module.exports.compile = compile - -/** - * Module dependencies. - * @private - */ - -var forwarded = __webpack_require__(170) -var ipaddr = __webpack_require__(171) - -/** - * Variables. - * @private - */ - -var DIGIT_REGEXP = /^[0-9]+$/ -var isip = ipaddr.isValid -var parseip = ipaddr.parse - -/** - * Pre-defined IP ranges. - * @private - */ - -var IP_RANGES = { - linklocal: ['169.254.0.0/16', 'fe80::/10'], - loopback: ['127.0.0.1/8', '::1/128'], - uniquelocal: ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16', 'fc00::/7'] -} - -/** - * Get all addresses in the request, optionally stopping - * at the first untrusted. - * - * @param {Object} request - * @param {Function|Array|String} [trust] - * @public - */ - -function alladdrs (req, trust) { - // get addresses - var addrs = forwarded(req) - - if (!trust) { - // Return all addresses - return addrs - } - - if (typeof trust !== 'function') { - trust = compile(trust) - } - - for (var i = 0; i < addrs.length - 1; i++) { - if (trust(addrs[i], i)) continue - - addrs.length = i + 1 - } - - return addrs -} - -/** - * Compile argument into trust function. - * - * @param {Array|String} val - * @private - */ - -function compile (val) { - if (!val) { - throw new TypeError('argument is required') - } - - var trust - - if (typeof val === 'string') { - trust = [val] - } else if (Array.isArray(val)) { - trust = val.slice() - } else { - throw new TypeError('unsupported trust argument') - } - - for (var i = 0; i < trust.length; i++) { - val = trust[i] - - if (!IP_RANGES.hasOwnProperty(val)) { - continue - } - - // Splice in pre-defined range - val = IP_RANGES[val] - trust.splice.apply(trust, [i, 1].concat(val)) - i += val.length - 1 - } - - return compileTrust(compileRangeSubnets(trust)) -} - -/** - * Compile `arr` elements into range subnets. - * - * @param {Array} arr - * @private - */ - -function compileRangeSubnets (arr) { - var rangeSubnets = new Array(arr.length) - - for (var i = 0; i < arr.length; i++) { - rangeSubnets[i] = parseipNotation(arr[i]) - } - - return rangeSubnets -} - -/** - * Compile range subnet array into trust function. - * - * @param {Array} rangeSubnets - * @private - */ - -function compileTrust (rangeSubnets) { - // Return optimized function based on length - var len = rangeSubnets.length - return len === 0 - ? trustNone - : len === 1 - ? trustSingle(rangeSubnets[0]) - : trustMulti(rangeSubnets) -} - -/** - * Parse IP notation string into range subnet. - * - * @param {String} note - * @private - */ - -function parseipNotation (note) { - var pos = note.lastIndexOf('/') - var str = pos !== -1 - ? note.substring(0, pos) - : note - - if (!isip(str)) { - throw new TypeError('invalid IP address: ' + str) - } - - var ip = parseip(str) - - if (pos === -1 && ip.kind() === 'ipv6' && ip.isIPv4MappedAddress()) { - // Store as IPv4 - ip = ip.toIPv4Address() - } - - var max = ip.kind() === 'ipv6' - ? 128 - : 32 - - var range = pos !== -1 - ? note.substring(pos + 1, note.length) - : null - - if (range === null) { - range = max - } else if (DIGIT_REGEXP.test(range)) { - range = parseInt(range, 10) - } else if (ip.kind() === 'ipv4' && isip(range)) { - range = parseNetmask(range) - } else { - range = null - } - - if (range <= 0 || range > max) { - throw new TypeError('invalid range on address: ' + note) - } - - return [ip, range] -} - -/** - * Parse netmask string into CIDR range. - * - * @param {String} netmask - * @private - */ - -function parseNetmask (netmask) { - var ip = parseip(netmask) - var kind = ip.kind() - - return kind === 'ipv4' - ? ip.prefixLengthFromSubnetMask() - : null -} - -/** - * Determine address of proxied request. - * - * @param {Object} request - * @param {Function|Array|String} trust - * @public - */ - -function proxyaddr (req, trust) { - if (!req) { - throw new TypeError('req argument is required') - } - - if (!trust) { - throw new TypeError('trust argument is required') - } - - var addrs = alladdrs(req, trust) - var addr = addrs[addrs.length - 1] - - return addr -} - -/** - * Static trust function to trust nothing. - * - * @private - */ - -function trustNone () { - return false -} - -/** - * Compile trust function for multiple subnets. - * - * @param {Array} subnets - * @private - */ - -function trustMulti (subnets) { - return function trust (addr) { - if (!isip(addr)) return false - - var ip = parseip(addr) - var ipconv - var kind = ip.kind() - - for (var i = 0; i < subnets.length; i++) { - var subnet = subnets[i] - var subnetip = subnet[0] - var subnetkind = subnetip.kind() - var subnetrange = subnet[1] - var trusted = ip - - if (kind !== subnetkind) { - if (subnetkind === 'ipv4' && !ip.isIPv4MappedAddress()) { - // Incompatible IP addresses - continue - } - - if (!ipconv) { - // Convert IP to match subnet IP kind - ipconv = subnetkind === 'ipv4' - ? ip.toIPv4Address() - : ip.toIPv4MappedAddress() - } - - trusted = ipconv - } - - if (trusted.match(subnetip, subnetrange)) { - return true - } - } - - return false - } -} - -/** - * Compile trust function for single subnet. - * - * @param {Object} subnet - * @private - */ - -function trustSingle (subnet) { - var subnetip = subnet[0] - var subnetkind = subnetip.kind() - var subnetisipv4 = subnetkind === 'ipv4' - var subnetrange = subnet[1] - - return function trust (addr) { - if (!isip(addr)) return false - - var ip = parseip(addr) - var kind = ip.kind() - - if (kind !== subnetkind) { - if (subnetisipv4 && !ip.isIPv4MappedAddress()) { - // Incompatible IP addresses - return false - } - - // Convert IP to match subnet IP kind - ip = subnetisipv4 - ? ip.toIPv4Address() - : ip.toIPv4MappedAddress() - } - - return ip.match(subnetip, subnetrange) - } -} - - -/***/ }), -/* 99 */ -/***/ (function(module, exports) { - - - -/***/ }), -/* 100 */ -/***/ (function(module, exports) { - -module.exports = function (bitmap, value) { - return { - enumerable: !(bitmap & 1), - configurable: !(bitmap & 2), - writable: !(bitmap & 4), - value: value - }; -}; - - -/***/ }), -/* 101 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) -var anObject = __webpack_require__(11); -var dPs = __webpack_require__(195); -var enumBugKeys = __webpack_require__(104); -var IE_PROTO = __webpack_require__(61)('IE_PROTO'); -var Empty = function () { /* empty */ }; -var PROTOTYPE = 'prototype'; - -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var createDict = function () { - // Thrash, waste and sodomy: IE GC bug - var iframe = __webpack_require__(58)('iframe'); - var i = enumBugKeys.length; - var lt = '<'; - var gt = '>'; - var iframeDocument; - iframe.style.display = 'none'; - __webpack_require__(105).appendChild(iframe); - iframe.src = 'javascript:'; // eslint-disable-line no-script-url - // createDict = iframe.contentWindow.Object; - // html.removeChild(iframe); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); - iframeDocument.close(); - createDict = iframeDocument.F; - while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]]; - return createDict(); -}; - -module.exports = Object.create || function create(O, Properties) { - var result; - if (O !== null) { - Empty[PROTOTYPE] = anObject(O); - result = new Empty(); - Empty[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = createDict(); - return Properties === undefined ? result : dPs(result, Properties); -}; - - -/***/ }), -/* 102 */ -/***/ (function(module, exports, __webpack_require__) { - -// fallback for non-array-like ES3 and non-enumerable old V8 strings -var cof = __webpack_require__(29); -// eslint-disable-next-line no-prototype-builtins -module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { - return cof(it) == 'String' ? it.split('') : Object(it); -}; - - -/***/ }), -/* 103 */ -/***/ (function(module, exports, __webpack_require__) { - -var core = __webpack_require__(6); -var global = __webpack_require__(2); -var SHARED = '__core-js_shared__'; -var store = global[SHARED] || (global[SHARED] = {}); - -(module.exports = function (key, value) { - return store[key] || (store[key] = value !== undefined ? value : {}); -})('versions', []).push({ - version: core.version, - mode: __webpack_require__(57) ? 'pure' : 'global', - copyright: '© 2018 Denis Pushkarev (zloirock.ru)' -}); - - -/***/ }), -/* 104 */ -/***/ (function(module, exports) { - -// IE 8- don't enum bug keys -module.exports = ( - 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' -).split(','); - - -/***/ }), -/* 105 */ -/***/ (function(module, exports, __webpack_require__) { - -var document = __webpack_require__(2).document; -module.exports = document && document.documentElement; - - -/***/ }), -/* 106 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.13 ToObject(argument) -var defined = __webpack_require__(55); -module.exports = function (it) { - return Object(defined(it)); -}; - - -/***/ }), -/* 107 */ -/***/ (function(module, exports) { - -module.exports = function (done, value) { - return { value: value, done: !!done }; -}; - - -/***/ }), -/* 108 */ -/***/ (function(module, exports, __webpack_require__) { - -var classof = __webpack_require__(64); -var ITERATOR = __webpack_require__(4)('iterator'); -var Iterators = __webpack_require__(28); -module.exports = __webpack_require__(6).getIteratorMethod = function (it) { - if (it != undefined) return it[ITERATOR] - || it['@@iterator'] - || Iterators[classof(it)]; -}; - - -/***/ }), -/* 109 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.3.20 SpeciesConstructor(O, defaultConstructor) -var anObject = __webpack_require__(11); -var aFunction = __webpack_require__(26); -var SPECIES = __webpack_require__(4)('species'); -module.exports = function (O, D) { - var C = anObject(O).constructor; - var S; - return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); -}; - - -/***/ }), -/* 110 */ -/***/ (function(module, exports, __webpack_require__) { - -var ctx = __webpack_require__(13); -var invoke = __webpack_require__(206); -var html = __webpack_require__(105); -var cel = __webpack_require__(58); -var global = __webpack_require__(2); -var process = global.process; -var setTask = global.setImmediate; -var clearTask = global.clearImmediate; -var MessageChannel = global.MessageChannel; -var Dispatch = global.Dispatch; -var counter = 0; -var queue = {}; -var ONREADYSTATECHANGE = 'onreadystatechange'; -var defer, channel, port; -var run = function () { - var id = +this; - // eslint-disable-next-line no-prototype-builtins - if (queue.hasOwnProperty(id)) { - var fn = queue[id]; - delete queue[id]; - fn(); - } -}; -var listener = function (event) { - run.call(event.data); -}; -// Node.js 0.9+ & IE10+ has setImmediate, otherwise: -if (!setTask || !clearTask) { - setTask = function setImmediate(fn) { - var args = []; - var i = 1; - while (arguments.length > i) args.push(arguments[i++]); - queue[++counter] = function () { - // eslint-disable-next-line no-new-func - invoke(typeof fn == 'function' ? fn : Function(fn), args); - }; - defer(counter); - return counter; - }; - clearTask = function clearImmediate(id) { - delete queue[id]; - }; - // Node.js 0.8- - if (__webpack_require__(29)(process) == 'process') { - defer = function (id) { - process.nextTick(ctx(run, id, 1)); - }; - // Sphere (JS game engine) Dispatch API - } else if (Dispatch && Dispatch.now) { - defer = function (id) { - Dispatch.now(ctx(run, id, 1)); - }; - // Browsers with MessageChannel, includes WebWorkers - } else if (MessageChannel) { - channel = new MessageChannel(); - port = channel.port2; - channel.port1.onmessage = listener; - defer = ctx(port.postMessage, port, 1); - // Browsers with postMessage, skip WebWorkers - // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' - } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) { - defer = function (id) { - global.postMessage(id + '', '*'); - }; - global.addEventListener('message', listener, false); - // IE8- - } else if (ONREADYSTATECHANGE in cel('script')) { - defer = function (id) { - html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () { - html.removeChild(this); - run.call(id); - }; - }; - // Rest old browsers - } else { - defer = function (id) { - setTimeout(ctx(run, id, 1), 0); - }; - } -} -module.exports = { - set: setTask, - clear: clearTask -}; - - -/***/ }), -/* 111 */ -/***/ (function(module, exports) { - -module.exports = function (exec) { - try { - return { e: false, v: exec() }; - } catch (e) { - return { e: true, v: e }; - } -}; - - -/***/ }), -/* 112 */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(11); -var isObject = __webpack_require__(9); -var newPromiseCapability = __webpack_require__(66); - -module.exports = function (C, x) { - anObject(C); - if (isObject(x) && x.constructor === C) return x; - var promiseCapability = newPromiseCapability.f(C); - var resolve = promiseCapability.resolve; - resolve(x); - return promiseCapability.promise; -}; - - -/***/ }), -/* 113 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var global = __webpack_require__(2); -var core = __webpack_require__(6); -var dP = __webpack_require__(15); -var DESCRIPTORS = __webpack_require__(16); -var SPECIES = __webpack_require__(4)('species'); - -module.exports = function (KEY) { - var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY]; - if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, { - configurable: true, - get: function () { return this; } - }); -}; - - -/***/ }), -/* 114 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _stringify = __webpack_require__(18); - -var _stringify2 = _interopRequireDefault(_stringify); - -var _getIterator2 = __webpack_require__(69); - -var _getIterator3 = _interopRequireDefault(_getIterator2); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -Object.defineProperty(exports, "__esModule", { value: true }); -var path = __webpack_require__(0); -var json_1 = __webpack_require__(46); -var config_1 = __webpack_require__(31); -var crypto = __webpack_require__(43); -function saveTargets(targets) { - var metrics = []; - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = (0, _getIterator3.default)(targets), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var target = _step.value; - - metrics.push(saveTarget(target)); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - - return metrics; -} -exports.saveTargets = saveTargets; -function saveTarget(target) { - //const md5 = crypto.createHash('md5') - var targetId = crypto.createHash('md5').update((0, _stringify2.default)(target)).digest('hex'); - var filename = path.join(config_1.METRICS_PATH, targetId + ".json"); - json_1.writeJsonDataSync(filename, target); - return targetId; -} -function getTarget(targetId) { - var filename = path.join(config_1.METRICS_PATH, targetId + ".json"); - return json_1.getJsonDataSync(filename); -} -exports.getTarget = getTarget; - -/***/ }), -/* 115 */ -/***/ (function(module, exports, __webpack_require__) { - -var Stream = __webpack_require__(1) -var writeMethods = ["write", "end", "destroy"] -var readMethods = ["resume", "pause"] -var readEvents = ["data", "close"] -var slice = Array.prototype.slice - -module.exports = duplex - -function forEach (arr, fn) { - if (arr.forEach) { - return arr.forEach(fn) - } - - for (var i = 0; i < arr.length; i++) { - fn(arr[i], i) - } -} - -function duplex(writer, reader) { - var stream = new Stream() - var ended = false - - forEach(writeMethods, proxyWriter) - - forEach(readMethods, proxyReader) - - forEach(readEvents, proxyStream) - - reader.on("end", handleEnd) - - writer.on("drain", function() { - stream.emit("drain") - }) - - writer.on("error", reemit) - reader.on("error", reemit) - - stream.writable = writer.writable - stream.readable = reader.readable - - return stream - - function proxyWriter(methodName) { - stream[methodName] = method - - function method() { - return writer[methodName].apply(writer, arguments) - } - } - - function proxyReader(methodName) { - stream[methodName] = method - - function method() { - stream.emit(methodName) - var func = reader[methodName] - if (func) { - return func.apply(reader, arguments) - } - reader.emit(methodName) - } - } - - function proxyStream(methodName) { - reader.on(methodName, reemit) - - function reemit() { - var args = slice.call(arguments) - args.unshift(methodName) - stream.emit.apply(stream, args) - } - } - - function handleEnd() { - if (ended) { - return - } - ended = true - var args = slice.call(arguments) - args.unshift("end") - stream.emit.apply(stream, args) - } - - function reemit(err) { - stream.emit("error", err) - } -} - - -/***/ }), -/* 116 */ -/***/ (function(module, exports, __webpack_require__) { - -var META = __webpack_require__(62)('meta'); -var isObject = __webpack_require__(9); -var has = __webpack_require__(27); -var setDesc = __webpack_require__(15).f; -var id = 0; -var isExtensible = Object.isExtensible || function () { - return true; -}; -var FREEZE = !__webpack_require__(44)(function () { - return isExtensible(Object.preventExtensions({})); -}); -var setMeta = function (it) { - setDesc(it, META, { value: { - i: 'O' + ++id, // object ID - w: {} // weak collections IDs - } }); -}; -var fastKey = function (it, create) { - // return primitive with prefix - if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; - if (!has(it, META)) { - // can't set metadata to uncaught frozen object - if (!isExtensible(it)) return 'F'; - // not necessary to add metadata - if (!create) return 'E'; - // add missing metadata - setMeta(it); - // return object ID - } return it[META].i; -}; -var getWeak = function (it, create) { - if (!has(it, META)) { - // can't set metadata to uncaught frozen object - if (!isExtensible(it)) return true; - // not necessary to add metadata - if (!create) return false; - // add missing metadata - setMeta(it); - // return hash weak collections IDs - } return it[META].w; -}; -// add metadata on freeze-family methods calling -var onFreeze = function (it) { - if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it); - return it; -}; -var meta = module.exports = { - KEY: META, - NEED: false, - fastKey: fastKey, - getWeak: getWeak, - onFreeze: onFreeze -}; - - -/***/ }), -/* 117 */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(9); -module.exports = function (it, TYPE) { - if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!'); - return it; -}; - - -/***/ }), -/* 118 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { value: true }); -var express = __webpack_require__(32); -var bodyParser = __webpack_require__(72); -var anomalies_1 = __webpack_require__(185); -var segments_1 = __webpack_require__(221); -var alerts_1 = __webpack_require__(222); -var app = express(); -var PORT = process.env.HASTIC_PORT || 8000; -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ extended: true })); -app.use(function (req, res, next) { - res.header('Access-Control-Allow-Origin', '*'); - res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS'); - res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); - next(); -}); -app.use('/anomalies', anomalies_1.router); -app.use('/segments', segments_1.router); -app.use('/alerts', alerts_1.router); -app.use('/', function (req, res) { - return res.send({ status: 'OK' }); -}); -app.listen(PORT, function () { - console.log("Server is running on :" + PORT); -}); - -/***/ }), -/* 119 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - */ - -var bodyParser = __webpack_require__(72) -var EventEmitter = __webpack_require__(47).EventEmitter; -var mixin = __webpack_require__(160); -var proto = __webpack_require__(161); -var Route = __webpack_require__(90); -var Router = __webpack_require__(89); -var req = __webpack_require__(173); -var res = __webpack_require__(180); - -/** - * Expose `createApplication()`. - */ - -exports = module.exports = createApplication; - -/** - * Create an express application. - * - * @return {Function} - * @api public - */ - -function createApplication() { - var app = function(req, res, next) { - app.handle(req, res, next); - }; - - mixin(app, EventEmitter.prototype, false); - mixin(app, proto, false); - - // expose the prototype that will get set on requests - app.request = Object.create(req, { - app: { configurable: true, enumerable: true, writable: true, value: app } - }) - - // expose the prototype that will get set on responses - app.response = Object.create(res, { - app: { configurable: true, enumerable: true, writable: true, value: app } - }) - - app.init(); - return app; -} - -/** - * Expose the prototypes. - */ - -exports.application = proto; -exports.request = req; -exports.response = res; - -/** - * Expose constructors. - */ - -exports.Route = Route; -exports.Router = Router; - -/** - * Expose middleware - */ - -exports.json = bodyParser.json -exports.query = __webpack_require__(92); -exports.static = __webpack_require__(184); -exports.urlencoded = bodyParser.urlencoded - -/** - * Replace removed middleware with an appropriate error message. - */ - -;[ - 'bodyParser', - 'compress', - 'cookieSession', - 'session', - 'logger', - 'cookieParser', - 'favicon', - 'responseTime', - 'errorHandler', - 'timeout', - 'methodOverride', - 'vhost', - 'csrf', - 'directory', - 'limit', - 'multipart', - 'staticCache', -].forEach(function (name) { - Object.defineProperty(exports, name, { - get: function () { - throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.'); - }, - configurable: true - }); -}); - - -/***/ }), -/* 120 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - */ - -module.exports = callSiteToString - -/** - * Format a CallSite file location to a string. - */ - -function callSiteFileLocation (callSite) { - var fileName - var fileLocation = '' - - if (callSite.isNative()) { - fileLocation = 'native' - } else if (callSite.isEval()) { - fileName = callSite.getScriptNameOrSourceURL() - if (!fileName) { - fileLocation = callSite.getEvalOrigin() - } - } else { - fileName = callSite.getFileName() - } - - if (fileName) { - fileLocation += fileName - - var lineNumber = callSite.getLineNumber() - if (lineNumber != null) { - fileLocation += ':' + lineNumber - - var columnNumber = callSite.getColumnNumber() - if (columnNumber) { - fileLocation += ':' + columnNumber - } - } - } - - return fileLocation || 'unknown source' -} - -/** - * Format a CallSite to a string. - */ - -function callSiteToString (callSite) { - var addSuffix = true - var fileLocation = callSiteFileLocation(callSite) - var functionName = callSite.getFunctionName() - var isConstructor = callSite.isConstructor() - var isMethodCall = !(callSite.isToplevel() || isConstructor) - var line = '' - - if (isMethodCall) { - var methodName = callSite.getMethodName() - var typeName = getConstructorName(callSite) - - if (functionName) { - if (typeName && functionName.indexOf(typeName) !== 0) { - line += typeName + '.' - } - - line += functionName - - if (methodName && functionName.lastIndexOf('.' + methodName) !== functionName.length - methodName.length - 1) { - line += ' [as ' + methodName + ']' - } - } else { - line += typeName + '.' + (methodName || '') - } - } else if (isConstructor) { - line += 'new ' + (functionName || '') - } else if (functionName) { - line += functionName - } else { - addSuffix = false - line += fileLocation - } - - if (addSuffix) { - line += ' (' + fileLocation + ')' - } - - return line -} - -/** - * Get constructor name of reviver. - */ - -function getConstructorName (obj) { - var receiver = obj.receiver - return (receiver.constructor && receiver.constructor.name) || null -} - - -/***/ }), -/* 121 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * depd - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = eventListenerCount - -/** - * Get the count of listeners on an event emitter of a specific type. - */ - -function eventListenerCount (emitter, type) { - return emitter.listeners(type).length -} - - -/***/ }), -/* 122 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * body-parser - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var bytes = __webpack_require__(20) -var contentType = __webpack_require__(33) -var createError = __webpack_require__(34) -var debug = __webpack_require__(5)('body-parser:json') -var read = __webpack_require__(36) -var typeis = __webpack_require__(22) - -/** - * Module exports. - */ - -module.exports = json - -/** - * RegExp to match the first non-space in a string. - * - * Allowed whitespace is defined in RFC 7159: - * - * ws = *( - * %x20 / ; Space - * %x09 / ; Horizontal tab - * %x0A / ; Line feed or New line - * %x0D ) ; Carriage return - */ - -var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*(.)/ // eslint-disable-line no-control-regex - -/** - * Create a middleware to parse JSON bodies. - * - * @param {object} [options] - * @return {function} - * @public - */ - -function json (options) { - var opts = options || {} - - var limit = typeof opts.limit !== 'number' - ? bytes.parse(opts.limit || '100kb') - : opts.limit - var inflate = opts.inflate !== false - var reviver = opts.reviver - var strict = opts.strict !== false - var type = opts.type || 'application/json' - var verify = opts.verify || false - - if (verify !== false && typeof verify !== 'function') { - throw new TypeError('option verify must be function') - } - - // create the appropriate type checking function - var shouldParse = typeof type !== 'function' - ? typeChecker(type) - : type - - function parse (body) { - if (body.length === 0) { - // special-case empty json body, as it's a common client-side mistake - // TODO: maybe make this configurable or part of "strict" option - return {} - } - - if (strict) { - var first = firstchar(body) - - if (first !== '{' && first !== '[') { - debug('strict violation') - throw createStrictSyntaxError(body, first) - } - } - - try { - debug('parse json') - return JSON.parse(body, reviver) - } catch (e) { - throw normalizeJsonSyntaxError(e, { - stack: e.stack - }) - } - } - - return function jsonParser (req, res, next) { - if (req._body) { - debug('body already parsed') - next() - return - } - - req.body = req.body || {} - - // skip requests without bodies - if (!typeis.hasBody(req)) { - debug('skip empty body') - next() - return - } - - debug('content-type %j', req.headers['content-type']) - - // determine if request should be parsed - if (!shouldParse(req)) { - debug('skip parsing') - next() - return - } - - // assert charset per RFC 7159 sec 8.1 - var charset = getCharset(req) || 'utf-8' - if (charset.substr(0, 4) !== 'utf-') { - debug('invalid charset') - next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { - charset: charset, - type: 'charset.unsupported' - })) - return - } - - // read - read(req, res, next, parse, debug, { - encoding: charset, - inflate: inflate, - limit: limit, - verify: verify - }) - } -} - -/** - * Create strict violation syntax error matching native error. - * - * @param {string} str - * @param {string} char - * @return {Error} - * @private - */ - -function createStrictSyntaxError (str, char) { - var index = str.indexOf(char) - var partial = str.substring(0, index) + '#' - - try { - JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation') - } catch (e) { - return normalizeJsonSyntaxError(e, { - message: e.message.replace('#', char), - stack: e.stack - }) - } -} - -/** - * Get the first non-whitespace character in a string. - * - * @param {string} str - * @return {function} - * @private - */ - -function firstchar (str) { - return FIRST_CHAR_REGEXP.exec(str)[1] -} - -/** - * Get the charset of a request. - * - * @param {object} req - * @api private - */ - -function getCharset (req) { - try { - return (contentType.parse(req).parameters.charset || '').toLowerCase() - } catch (e) { - return undefined - } -} - -/** - * Normalize a SyntaxError for JSON.parse. - * - * @param {SyntaxError} error - * @param {object} obj - * @return {SyntaxError} - */ - -function normalizeJsonSyntaxError (error, obj) { - var keys = Object.getOwnPropertyNames(error) - - for (var i = 0; i < keys.length; i++) { - var key = keys[i] - if (key !== 'stack' && key !== 'message') { - delete error[key] - } - } - - var props = Object.keys(obj) - - for (var j = 0; j < props.length; j++) { - var prop = props[j] - error[prop] = obj[prop] - } - - return error -} - -/** - * Get the simple type checker. - * - * @param {string} type - * @return {function} - */ - -function typeChecker (type) { - return function checkType (req) { - return Boolean(typeis(req, type)) - } -} - - -/***/ }), -/* 123 */ -/***/ (function(module, exports) { - -module.exports = {"100":"Continue","101":"Switching Protocols","102":"Processing","200":"OK","201":"Created","202":"Accepted","203":"Non-Authoritative Information","204":"No Content","205":"Reset Content","206":"Partial Content","207":"Multi-Status","208":"Already Reported","226":"IM Used","300":"Multiple Choices","301":"Moved Permanently","302":"Found","303":"See Other","304":"Not Modified","305":"Use Proxy","306":"(Unused)","307":"Temporary Redirect","308":"Permanent Redirect","400":"Bad Request","401":"Unauthorized","402":"Payment Required","403":"Forbidden","404":"Not Found","405":"Method Not Allowed","406":"Not Acceptable","407":"Proxy Authentication Required","408":"Request Timeout","409":"Conflict","410":"Gone","411":"Length Required","412":"Precondition Failed","413":"Payload Too Large","414":"URI Too Long","415":"Unsupported Media Type","416":"Range Not Satisfiable","417":"Expectation Failed","418":"I'm a teapot","421":"Misdirected Request","422":"Unprocessable Entity","423":"Locked","424":"Failed Dependency","425":"Unordered Collection","426":"Upgrade Required","428":"Precondition Required","429":"Too Many Requests","431":"Request Header Fields Too Large","451":"Unavailable For Legal Reasons","500":"Internal Server Error","501":"Not Implemented","502":"Bad Gateway","503":"Service Unavailable","504":"Gateway Timeout","505":"HTTP Version Not Supported","506":"Variant Also Negotiates","507":"Insufficient Storage","508":"Loop Detected","509":"Bandwidth Limit Exceeded","510":"Not Extended","511":"Network Authentication Required"} - -/***/ }), -/* 124 */ -/***/ (function(module, exports) { - -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} - - -/***/ }), -/* 125 */ -/***/ (function(module, exports, __webpack_require__) { - -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = __webpack_require__(75); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = 'undefined' != typeof chrome - && 'undefined' != typeof chrome.storage - ? chrome.storage.local - : localstorage(); - -/** - * Colors. - */ - -exports.colors = [ - 'lightseagreen', - 'forestgreen', - 'goldenrod', - 'dodgerblue', - 'darkorchid', - 'crimson' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { - return true; - } - - // is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || - // double check webkit in userAgent just in case we are in a worker - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -exports.formatters.j = function(v) { - try { - return JSON.stringify(v); - } catch (err) { - return '[UnexpectedJSONParseError]: ' + err.message; - } -}; - - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs(args) { - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return; - - var c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit') - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - -function log() { - // this hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return 'object' === typeof console - && console.log - && Function.prototype.apply.call(console.log, console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - try { - if (null == namespaces) { - exports.storage.removeItem('debug'); - } else { - exports.storage.debug = namespaces; - } - } catch(e) {} -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - var r; - try { - r = exports.storage.debug; - } catch(e) {} - - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; - } - - return r; -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); - -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - -function localstorage() { - try { - return window.localStorage; - } catch (e) {} -} - - -/***/ }), -/* 126 */ -/***/ (function(module, exports, __webpack_require__) { - -/** - * Module dependencies. - */ - -var tty = __webpack_require__(127); -var util = __webpack_require__(48); - -/** - * This is the Node.js implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = __webpack_require__(75); -exports.init = init; -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [6, 2, 3, 4, 5, 1]; - -/** - * Build up the default `inspectOpts` object from the environment variables. - * - * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js - */ - -exports.inspectOpts = Object.keys(process.env).filter(function (key) { - return /^debug_/i.test(key); -}).reduce(function (obj, key) { - // camel-case - var prop = key - .substring(6) - .toLowerCase() - .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); - - // coerce string value into JS value - var val = process.env[key]; - if (/^(yes|on|true|enabled)$/i.test(val)) val = true; - else if (/^(no|off|false|disabled)$/i.test(val)) val = false; - else if (val === 'null') val = null; - else val = Number(val); - - obj[prop] = val; - return obj; -}, {}); - -/** - * The file descriptor to write the `debug()` calls to. - * Set the `DEBUG_FD` env variable to override with another value. i.e.: - * - * $ DEBUG_FD=3 node script.js 3>debug.log - */ - -var fd = parseInt(process.env.DEBUG_FD, 10) || 2; - -if (1 !== fd && 2 !== fd) { - util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')() -} - -var stream = 1 === fd ? process.stdout : - 2 === fd ? process.stderr : - createWritableStdioStream(fd); - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - return 'colors' in exports.inspectOpts - ? Boolean(exports.inspectOpts.colors) - : tty.isatty(fd); -} - -/** - * Map %o to `util.inspect()`, all on a single line. - */ - -exports.formatters.o = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts) - .split('\n').map(function(str) { - return str.trim() - }).join(' '); -}; - -/** - * Map %o to `util.inspect()`, allowing multiple lines if needed. - */ - -exports.formatters.O = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts); -}; - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs(args) { - var name = this.namespace; - var useColors = this.useColors; - - if (useColors) { - var c = this.color; - var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m'; - - args[0] = prefix + args[0].split('\n').join('\n' + prefix); - args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); - } else { - args[0] = new Date().toUTCString() - + ' ' + name + ' ' + args[0]; - } -} - -/** - * Invokes `util.format()` with the specified arguments and writes to `stream`. - */ - -function log() { - return stream.write(util.format.apply(util, arguments) + '\n'); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Copied from `node/src/node.js`. - * - * XXX: It's lame that node doesn't expose this API out-of-the-box. It also - * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. - */ - -function createWritableStdioStream (fd) { - var stream; - var tty_wrap = process.binding('tty_wrap'); - - // Note stream._type is used for test-module-load-list.js - - switch (tty_wrap.guessHandleType(fd)) { - case 'TTY': - stream = new tty.WriteStream(fd); - stream._type = 'tty'; - - // Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - case 'FILE': - var fs = __webpack_require__(8); - stream = new fs.SyncWriteStream(fd, { autoClose: false }); - stream._type = 'fs'; - break; - - case 'PIPE': - case 'TCP': - var net = __webpack_require__(77); - stream = new net.Socket({ - fd: fd, - readable: false, - writable: true - }); - - // FIXME Should probably have an option in net.Socket to create a - // stream from an existing fd which is writable only. But for now - // we'll just add this hack and set the `readable` member to false. - // Test: ./node test/fixtures/echo.js < /etc/passwd - stream.readable = false; - stream.read = null; - stream._type = 'pipe'; - - // FIXME Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - default: - // Probably an error on in uv_guess_handle() - throw new Error('Implement me. Unknown stream file type!'); - } - - // For supporting legacy API we put the FD here. - stream.fd = fd; - - stream._isStdio = true; - - return stream; -} - -/** - * Init logic for `debug` instances. - * - * Create a new `inspectOpts` object in case `useColors` is set - * differently for a particular `debug` instance. - */ - -function init (debug) { - debug.inspectOpts = {}; - - var keys = Object.keys(exports.inspectOpts); - for (var i = 0; i < keys.length; i++) { - debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; - } -} - -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ - -exports.enable(load()); - - -/***/ }), -/* 127 */ -/***/ (function(module, exports) { - -module.exports = require("tty"); - -/***/ }), -/* 128 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * raw-body - * Copyright(c) 2013-2014 Jonathan Ong - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var bytes = __webpack_require__(20) -var createError = __webpack_require__(129) -var iconv = __webpack_require__(79) -var unpipe = __webpack_require__(83) - -/** - * Module exports. - * @public - */ - -module.exports = getRawBody - -/** - * Module variables. - * @private - */ - -var ICONV_ENCODING_MESSAGE_REGEXP = /^Encoding not recognized: / - -/** - * Get the decoder for a given encoding. - * - * @param {string} encoding - * @private - */ - -function getDecoder (encoding) { - if (!encoding) return null - - try { - return iconv.getDecoder(encoding) - } catch (e) { - // error getting decoder - if (!ICONV_ENCODING_MESSAGE_REGEXP.test(e.message)) throw e - - // the encoding was not found - throw createError(415, 'specified encoding unsupported', { - encoding: encoding, - type: 'encoding.unsupported' - }) - } -} - -/** - * Get the raw body of a stream (typically HTTP). - * - * @param {object} stream - * @param {object|string|function} [options] - * @param {function} [callback] - * @public - */ - -function getRawBody (stream, options, callback) { - var done = callback - var opts = options || {} - - if (options === true || typeof options === 'string') { - // short cut for encoding - opts = { - encoding: options - } - } - - if (typeof options === 'function') { - done = options - opts = {} - } - - // validate callback is a function, if provided - if (done !== undefined && typeof done !== 'function') { - throw new TypeError('argument callback must be a function') - } - - // require the callback without promises - if (!done && !global.Promise) { - throw new TypeError('argument callback is required') - } - - // get encoding - var encoding = opts.encoding !== true - ? opts.encoding - : 'utf-8' - - // convert the limit to an integer - var limit = bytes.parse(opts.limit) - - // convert the expected length to an integer - var length = opts.length != null && !isNaN(opts.length) - ? parseInt(opts.length, 10) - : null - - if (done) { - // classic callback style - return readStream(stream, encoding, length, limit, done) - } - - return new Promise(function executor (resolve, reject) { - readStream(stream, encoding, length, limit, function onRead (err, buf) { - if (err) return reject(err) - resolve(buf) - }) - }) -} - -/** - * Halt a stream. - * - * @param {Object} stream - * @private - */ - -function halt (stream) { - // unpipe everything from the stream - unpipe(stream) - - // pause stream - if (typeof stream.pause === 'function') { - stream.pause() - } -} - -/** - * Read the data from the stream. - * - * @param {object} stream - * @param {string} encoding - * @param {number} length - * @param {number} limit - * @param {function} callback - * @public - */ - -function readStream (stream, encoding, length, limit, callback) { - var complete = false - var sync = true - - // check the length and limit options. - // note: we intentionally leave the stream paused, - // so users should handle the stream themselves. - if (limit !== null && length !== null && length > limit) { - return done(createError(413, 'request entity too large', { - expected: length, - length: length, - limit: limit, - type: 'entity.too.large' - })) - } - - // streams1: assert request encoding is buffer. - // streams2+: assert the stream encoding is buffer. - // stream._decoder: streams1 - // state.encoding: streams2 - // state.decoder: streams2, specifically < 0.10.6 - var state = stream._readableState - if (stream._decoder || (state && (state.encoding || state.decoder))) { - // developer error - return done(createError(500, 'stream encoding should not be set', { - type: 'stream.encoding.set' - })) - } - - var received = 0 - var decoder - - try { - decoder = getDecoder(encoding) - } catch (err) { - return done(err) - } - - var buffer = decoder - ? '' - : [] - - // attach listeners - stream.on('aborted', onAborted) - stream.on('close', cleanup) - stream.on('data', onData) - stream.on('end', onEnd) - stream.on('error', onEnd) - - // mark sync section complete - sync = false - - function done () { - var args = new Array(arguments.length) - - // copy arguments - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - - // mark complete - complete = true - - if (sync) { - process.nextTick(invokeCallback) - } else { - invokeCallback() - } - - function invokeCallback () { - cleanup() - - if (args[0]) { - // halt the stream on error - halt(stream) - } - - callback.apply(null, args) - } - } - - function onAborted () { - if (complete) return - - done(createError(400, 'request aborted', { - code: 'ECONNABORTED', - expected: length, - length: length, - received: received, - type: 'request.aborted' - })) - } - - function onData (chunk) { - if (complete) return - - received += chunk.length - - if (limit !== null && received > limit) { - done(createError(413, 'request entity too large', { - limit: limit, - received: received, - type: 'entity.too.large' - })) - } else if (decoder) { - buffer += decoder.write(chunk) - } else { - buffer.push(chunk) - } - } - - function onEnd (err) { - if (complete) return - if (err) return done(err) - - if (length !== null && received !== length) { - done(createError(400, 'request size did not match content length', { - expected: length, - length: length, - received: received, - type: 'request.size.invalid' - })) - } else { - var string = decoder - ? buffer + (decoder.end() || '') - : Buffer.concat(buffer) - done(null, string) - } - } - - function cleanup () { - buffer = null - - stream.removeListener('aborted', onAborted) - stream.removeListener('data', onData) - stream.removeListener('end', onEnd) - stream.removeListener('error', onEnd) - stream.removeListener('close', cleanup) - } -} - - -/***/ }), -/* 129 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * http-errors - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2016 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var deprecate = __webpack_require__(130)('http-errors') -var setPrototypeOf = __webpack_require__(133) -var statuses = __webpack_require__(21) -var inherits = __webpack_require__(74) - -/** - * Module exports. - * @public - */ - -module.exports = createError -module.exports.HttpError = createHttpErrorConstructor() - -// Populate exports for all constructors -populateConstructorExports(module.exports, statuses.codes, module.exports.HttpError) - -/** - * Get the code class of a status code. - * @private - */ - -function codeClass (status) { - return Number(String(status).charAt(0) + '00') -} - -/** - * Create a new HTTP Error. - * - * @returns {Error} - * @public - */ - -function createError () { - // so much arity going on ~_~ - var err - var msg - var status = 500 - var props = {} - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i] - if (arg instanceof Error) { - err = arg - status = err.status || err.statusCode || status - continue - } - switch (typeof arg) { - case 'string': - msg = arg - break - case 'number': - status = arg - if (i !== 0) { - deprecate('non-first-argument status code; replace with createError(' + arg + ', ...)') - } - break - case 'object': - props = arg - break - } - } - - if (typeof status === 'number' && (status < 400 || status >= 600)) { - deprecate('non-error status code; use only 4xx or 5xx status codes') - } - - if (typeof status !== 'number' || - (!statuses[status] && (status < 400 || status >= 600))) { - status = 500 - } - - // constructor - var HttpError = createError[status] || createError[codeClass(status)] - - if (!err) { - // create error - err = HttpError - ? new HttpError(msg) - : new Error(msg || statuses[status]) - Error.captureStackTrace(err, createError) - } - - if (!HttpError || !(err instanceof HttpError) || err.status !== status) { - // add properties to generic error - err.expose = status < 500 - err.status = err.statusCode = status - } - - for (var key in props) { - if (key !== 'status' && key !== 'statusCode') { - err[key] = props[key] - } - } - - return err -} - -/** - * Create HTTP error abstract base class. - * @private - */ - -function createHttpErrorConstructor () { - function HttpError () { - throw new TypeError('cannot construct abstract class') - } - - inherits(HttpError, Error) - - return HttpError -} - -/** - * Create a constructor for a client error. - * @private - */ - -function createClientErrorConstructor (HttpError, name, code) { - var className = name.match(/Error$/) ? name : name + 'Error' - - function ClientError (message) { - // create the error object - var msg = message != null ? message : statuses[code] - var err = new Error(msg) - - // capture a stack trace to the construction point - Error.captureStackTrace(err, ClientError) - - // adjust the [[Prototype]] - setPrototypeOf(err, ClientError.prototype) - - // redefine the error message - Object.defineProperty(err, 'message', { - enumerable: true, - configurable: true, - value: msg, - writable: true - }) - - // redefine the error name - Object.defineProperty(err, 'name', { - enumerable: false, - configurable: true, - value: className, - writable: true - }) - - return err - } - - inherits(ClientError, HttpError) - - ClientError.prototype.status = code - ClientError.prototype.statusCode = code - ClientError.prototype.expose = true - - return ClientError -} - -/** - * Create a constructor for a server error. - * @private - */ - -function createServerErrorConstructor (HttpError, name, code) { - var className = name.match(/Error$/) ? name : name + 'Error' - - function ServerError (message) { - // create the error object - var msg = message != null ? message : statuses[code] - var err = new Error(msg) - - // capture a stack trace to the construction point - Error.captureStackTrace(err, ServerError) - - // adjust the [[Prototype]] - setPrototypeOf(err, ServerError.prototype) - - // redefine the error message - Object.defineProperty(err, 'message', { - enumerable: true, - configurable: true, - value: msg, - writable: true - }) - - // redefine the error name - Object.defineProperty(err, 'name', { - enumerable: false, - configurable: true, - value: className, - writable: true - }) - - return err - } - - inherits(ServerError, HttpError) - - ServerError.prototype.status = code - ServerError.prototype.statusCode = code - ServerError.prototype.expose = false - - return ServerError -} - -/** - * Populate the exports object with constructors for every error class. - * @private - */ - -function populateConstructorExports (exports, codes, HttpError) { - codes.forEach(function forEachCode (code) { - var CodeError - var name = toIdentifier(statuses[code]) - - switch (codeClass(code)) { - case 400: - CodeError = createClientErrorConstructor(HttpError, name, code) - break - case 500: - CodeError = createServerErrorConstructor(HttpError, name, code) - break - } - - if (CodeError) { - // export the constructor - exports[code] = CodeError - exports[name] = CodeError - } - }) - - // backwards-compatibility - exports["I'mateapot"] = deprecate.function(exports.ImATeapot, - '"I\'mateapot"; use "ImATeapot" instead') -} - -/** - * Convert a string of words to a JavaScript identifier. - * @private - */ - -function toIdentifier (str) { - return str.split(' ').map(function (token) { - return token.slice(0, 1).toUpperCase() + token.slice(1) - }).join('').replace(/[^ _0-9a-z]/gi, '') -} - - -/***/ }), -/* 130 */ -/***/ (function(module, exports, __webpack_require__) { - -/*! - * depd - * Copyright(c) 2014-2017 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var callSiteToString = __webpack_require__(78).callSiteToString -var eventListenerCount = __webpack_require__(78).eventListenerCount -var relative = __webpack_require__(0).relative - -/** - * Module exports. - */ - -module.exports = depd - -/** - * Get the path to base files on. - */ - -var basePath = process.cwd() - -/** - * Determine if namespace is contained in the string. - */ - -function containsNamespace (str, namespace) { - var val = str.split(/[ ,]+/) - - namespace = String(namespace).toLowerCase() - - for (var i = 0; i < val.length; i++) { - if (!(str = val[i])) continue - - // namespace contained - if (str === '*' || str.toLowerCase() === namespace) { - return true - } - } - - return false -} - -/** - * Convert a data descriptor to accessor descriptor. - */ - -function convertDataDescriptorToAccessor (obj, prop, message) { - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - var value = descriptor.value - - descriptor.get = function getter () { return value } - - if (descriptor.writable) { - descriptor.set = function setter (val) { return (value = val) } - } - - delete descriptor.value - delete descriptor.writable - - Object.defineProperty(obj, prop, descriptor) - - return descriptor -} - -/** - * Create arguments string to keep arity. - */ - -function createArgumentsString (arity) { - var str = '' - - for (var i = 0; i < arity; i++) { - str += ', arg' + i - } - - return str.substr(2) -} - -/** - * Create stack string from stack. - */ - -function createStackString (stack) { - var str = this.name + ': ' + this.namespace - - if (this.message) { - str += ' deprecated ' + this.message - } - - for (var i = 0; i < stack.length; i++) { - str += '\n at ' + callSiteToString(stack[i]) - } - - return str -} - -/** - * Create deprecate for namespace in caller. - */ - -function depd (namespace) { - if (!namespace) { - throw new TypeError('argument namespace is required') - } - - var stack = getStack() - var site = callSiteLocation(stack[1]) - var file = site[0] - - function deprecate (message) { - // call to self as log - log.call(deprecate, message) - } - - deprecate._file = file - deprecate._ignored = isignored(namespace) - deprecate._namespace = namespace - deprecate._traced = istraced(namespace) - deprecate._warned = Object.create(null) - - deprecate.function = wrapfunction - deprecate.property = wrapproperty - - return deprecate -} - -/** - * Determine if namespace is ignored. - */ - -function isignored (namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.noDeprecation) { - // --no-deprecation support - return true - } - - var str = process.env.NO_DEPRECATION || '' - - // namespace ignored - return containsNamespace(str, namespace) -} - -/** - * Determine if namespace is traced. - */ - -function istraced (namespace) { - /* istanbul ignore next: tested in a child processs */ - if (process.traceDeprecation) { - // --trace-deprecation support - return true - } - - var str = process.env.TRACE_DEPRECATION || '' - - // namespace traced - return containsNamespace(str, namespace) -} - -/** - * Display deprecation message. - */ - -function log (message, site) { - var haslisteners = eventListenerCount(process, 'deprecation') !== 0 - - // abort early if no destination - if (!haslisteners && this._ignored) { - return - } - - var caller - var callFile - var callSite - var i = 0 - var seen = false - var stack = getStack() - var file = this._file - - if (site) { - // provided site - callSite = callSiteLocation(stack[1]) - callSite.name = site.name - file = callSite[0] - } else { - // get call site - i = 2 - site = callSiteLocation(stack[i]) - callSite = site - } - - // get caller of deprecated thing in relation to file - for (; i < stack.length; i++) { - caller = callSiteLocation(stack[i]) - callFile = caller[0] - - if (callFile === file) { - seen = true - } else if (callFile === this._file) { - file = this._file - } else if (seen) { - break - } - } - - var key = caller - ? site.join(':') + '__' + caller.join(':') - : undefined - - if (key !== undefined && key in this._warned) { - // already warned - return - } - - this._warned[key] = true - - // generate automatic message from call site - if (!message) { - message = callSite === site || !callSite.name - ? defaultMessage(site) - : defaultMessage(callSite) - } - - // emit deprecation if listeners exist - if (haslisteners) { - var err = DeprecationError(this._namespace, message, stack.slice(i)) - process.emit('deprecation', err) - return - } - - // format and write message - var format = process.stderr.isTTY - ? formatColor - : formatPlain - var msg = format.call(this, message, caller, stack.slice(i)) - process.stderr.write(msg + '\n', 'utf8') -} - -/** - * Get call site location as array. - */ - -function callSiteLocation (callSite) { - var file = callSite.getFileName() || '' - var line = callSite.getLineNumber() - var colm = callSite.getColumnNumber() - - if (callSite.isEval()) { - file = callSite.getEvalOrigin() + ', ' + file - } - - var site = [file, line, colm] - - site.callSite = callSite - site.name = callSite.getFunctionName() - - return site -} - -/** - * Generate a default message from the site. - */ - -function defaultMessage (site) { - var callSite = site.callSite - var funcName = site.name - - // make useful anonymous name - if (!funcName) { - funcName = '' - } - - var context = callSite.getThis() - var typeName = context && callSite.getTypeName() - - // ignore useless type name - if (typeName === 'Object') { - typeName = undefined - } - - // make useful type name - if (typeName === 'Function') { - typeName = context.name || typeName - } - - return typeName && callSite.getMethodName() - ? typeName + '.' + funcName - : funcName -} - -/** - * Format deprecation message without color. - */ - -function formatPlain (msg, caller, stack) { - var timestamp = new Date().toUTCString() - - var formatted = timestamp + - ' ' + this._namespace + - ' deprecated ' + msg - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n at ' + callSiteToString(stack[i]) - } - - return formatted - } - - if (caller) { - formatted += ' at ' + formatLocation(caller) - } - - return formatted -} - -/** - * Format deprecation message with color. - */ - -function formatColor (msg, caller, stack) { - var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' + // bold cyan - ' \x1b[33;1mdeprecated\x1b[22;39m' + // bold yellow - ' \x1b[0m' + msg + '\x1b[39m' // reset - - // add stack trace - if (this._traced) { - for (var i = 0; i < stack.length; i++) { - formatted += '\n \x1b[36mat ' + callSiteToString(stack[i]) + '\x1b[39m' // cyan - } - - return formatted - } - - if (caller) { - formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan - } - - return formatted -} - -/** - * Format call site location. - */ - -function formatLocation (callSite) { - return relative(basePath, callSite[0]) + - ':' + callSite[1] + - ':' + callSite[2] -} - -/** - * Get the stack as array of call sites. - */ - -function getStack () { - var limit = Error.stackTraceLimit - var obj = {} - var prep = Error.prepareStackTrace - - Error.prepareStackTrace = prepareObjectStackTrace - Error.stackTraceLimit = Math.max(10, limit) - - // capture the stack - Error.captureStackTrace(obj) - - // slice this function off the top - var stack = obj.stack.slice(1) - - Error.prepareStackTrace = prep - Error.stackTraceLimit = limit - - return stack -} - -/** - * Capture call site stack from v8. - */ - -function prepareObjectStackTrace (obj, stack) { - return stack -} - -/** - * Return a wrapped function in a deprecation message. - */ - -function wrapfunction (fn, message) { - if (typeof fn !== 'function') { - throw new TypeError('argument fn must be a function') - } - - var args = createArgumentsString(fn.length) - var deprecate = this // eslint-disable-line no-unused-vars - var stack = getStack() - var site = callSiteLocation(stack[1]) - - site.name = fn.name - - // eslint-disable-next-line no-eval - var deprecatedfn = eval('(function (' + args + ') {\n' + - '"use strict"\n' + - 'log.call(deprecate, message, site)\n' + - 'return fn.apply(this, arguments)\n' + - '})') - - return deprecatedfn -} - -/** - * Wrap property in a deprecation message. - */ - -function wrapproperty (obj, prop, message) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - throw new TypeError('argument obj must be object') - } - - var descriptor = Object.getOwnPropertyDescriptor(obj, prop) - - if (!descriptor) { - throw new TypeError('must call property on owner object') - } - - if (!descriptor.configurable) { - throw new TypeError('property must be configurable') - } - - var deprecate = this - var stack = getStack() - var site = callSiteLocation(stack[1]) - - // set site name - site.name = prop - - // convert data descriptor - if ('value' in descriptor) { - descriptor = convertDataDescriptorToAccessor(obj, prop, message) - } - - var get = descriptor.get - var set = descriptor.set - - // wrap getter - if (typeof get === 'function') { - descriptor.get = function getter () { - log.call(deprecate, message, site) - return get.apply(this, arguments) - } - } - - // wrap setter - if (typeof set === 'function') { - descriptor.set = function setter () { - log.call(deprecate, message, site) - return set.apply(this, arguments) - } - } - - Object.defineProperty(obj, prop, descriptor) -} - -/** - * Create DeprecationError for deprecation - */ - -function DeprecationError (namespace, message, stack) { - var error = new Error() - var stackString - - Object.defineProperty(error, 'constructor', { - value: DeprecationError - }) - - Object.defineProperty(error, 'message', { - configurable: true, - enumerable: false, - value: message, - writable: true - }) - - Object.defineProperty(error, 'name', { - enumerable: false, - configurable: true, - value: 'DeprecationError', - writable: true - }) - - Object.defineProperty(error, 'namespace', { - configurable: true, - enumerable: false, - value: namespace, - writable: true - }) - - Object.defineProperty(error, 'stack', { - configurable: true, - enumerable: false, - get: function () { - if (stackString !== undefined) { - return stackString - } - - // prepare stack trace - return (stackString = createStackString.call(this, stack)) - }, - set: function setter (val) { - stackString = val - } - }) - - return error -} - - -/***/ }), -/* 131 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * depd - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - */ - -module.exports = callSiteToString - -/** - * Format a CallSite file location to a string. - */ - -function callSiteFileLocation (callSite) { - var fileName - var fileLocation = '' - - if (callSite.isNative()) { - fileLocation = 'native' - } else if (callSite.isEval()) { - fileName = callSite.getScriptNameOrSourceURL() - if (!fileName) { - fileLocation = callSite.getEvalOrigin() - } - } else { - fileName = callSite.getFileName() - } - - if (fileName) { - fileLocation += fileName - - var lineNumber = callSite.getLineNumber() - if (lineNumber != null) { - fileLocation += ':' + lineNumber - - var columnNumber = callSite.getColumnNumber() - if (columnNumber) { - fileLocation += ':' + columnNumber - } - } - } - - return fileLocation || 'unknown source' -} - -/** - * Format a CallSite to a string. - */ - -function callSiteToString (callSite) { - var addSuffix = true - var fileLocation = callSiteFileLocation(callSite) - var functionName = callSite.getFunctionName() - var isConstructor = callSite.isConstructor() - var isMethodCall = !(callSite.isToplevel() || isConstructor) - var line = '' - - if (isMethodCall) { - var methodName = callSite.getMethodName() - var typeName = getConstructorName(callSite) - - if (functionName) { - if (typeName && functionName.indexOf(typeName) !== 0) { - line += typeName + '.' - } - - line += functionName - - if (methodName && functionName.lastIndexOf('.' + methodName) !== functionName.length - methodName.length - 1) { - line += ' [as ' + methodName + ']' - } - } else { - line += typeName + '.' + (methodName || '') - } - } else if (isConstructor) { - line += 'new ' + (functionName || '') - } else if (functionName) { - line += functionName - } else { - addSuffix = false - line += fileLocation - } - - if (addSuffix) { - line += ' (' + fileLocation + ')' - } - - return line -} - -/** - * Get constructor name of reviver. - */ - -function getConstructorName (obj) { - var receiver = obj.receiver - return (receiver.constructor && receiver.constructor.name) || null -} - - -/***/ }), -/* 132 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * depd - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = eventListenerCount - -/** - * Get the count of listeners on an event emitter of a specific type. - */ - -function eventListenerCount (emitter, type) { - return emitter.listeners(type).length -} - - -/***/ }), -/* 133 */ -/***/ (function(module, exports) { - -module.exports = Object.setPrototypeOf || ({__proto__:[]} instanceof Array ? setProtoOf : mixinProperties); - -function setProtoOf(obj, proto) { - obj.__proto__ = proto; - return obj; -} - -function mixinProperties(obj, proto) { - for (var prop in proto) { - if (!obj.hasOwnProperty(prop)) { - obj[prop] = proto[prop]; - } - } - return obj; -} - - -/***/ }), -/* 134 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var BOMChar = '\uFEFF'; - -exports.PrependBOM = PrependBOMWrapper -function PrependBOMWrapper(encoder, options) { - this.encoder = encoder; - this.addBOM = true; -} - -PrependBOMWrapper.prototype.write = function(str) { - if (this.addBOM) { - str = BOMChar + str; - this.addBOM = false; - } - - return this.encoder.write(str); -} - -PrependBOMWrapper.prototype.end = function() { - return this.encoder.end(); -} - - -//------------------------------------------------------------------------------ - -exports.StripBOM = StripBOMWrapper; -function StripBOMWrapper(decoder, options) { - this.decoder = decoder; - this.pass = false; - this.options = options || {}; -} - -StripBOMWrapper.prototype.write = function(buf) { - var res = this.decoder.write(buf); - if (this.pass || !res) - return res; - - if (res[0] === BOMChar) { - res = res.slice(1); - if (typeof this.options.stripBOM === 'function') - this.options.stripBOM(); - } - - this.pass = true; - return res; -} - -StripBOMWrapper.prototype.end = function() { - return this.decoder.end(); -} - - - -/***/ }), -/* 135 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -// Update this array if you add/rename/remove files in this directory. -// We support Browserify by skipping automatic module discovery and requiring modules directly. -var modules = [ - __webpack_require__(136), - __webpack_require__(137), - __webpack_require__(138), - __webpack_require__(139), - __webpack_require__(140), - __webpack_require__(141), - __webpack_require__(142), - __webpack_require__(143), -]; - -// Put all encoding/alias/codec definitions to single object and export it. -for (var i = 0; i < modules.length; i++) { - var module = modules[i]; - for (var enc in module) - if (Object.prototype.hasOwnProperty.call(module, enc)) - exports[enc] = module[enc]; -} - - -/***/ }), -/* 136 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var Buffer = __webpack_require__(3).Buffer; - -// Export Node.js internal encodings. - -module.exports = { - // Encodings - utf8: { type: "_internal", bomAware: true}, - cesu8: { type: "_internal", bomAware: true}, - unicode11utf8: "utf8", - - ucs2: { type: "_internal", bomAware: true}, - utf16le: "ucs2", - - binary: { type: "_internal" }, - base64: { type: "_internal" }, - hex: { type: "_internal" }, - - // Codec. - _internal: InternalCodec, -}; - -//------------------------------------------------------------------------------ - -function InternalCodec(codecOptions, iconv) { - this.enc = codecOptions.encodingName; - this.bomAware = codecOptions.bomAware; - - if (this.enc === "base64") - this.encoder = InternalEncoderBase64; - else if (this.enc === "cesu8") { - this.enc = "utf8"; // Use utf8 for decoding. - this.encoder = InternalEncoderCesu8; - - // Add decoder for versions of Node not supporting CESU-8 - if (new Buffer('eda0bdedb2a9', 'hex').toString() !== '💩') { - this.decoder = InternalDecoderCesu8; - this.defaultCharUnicode = iconv.defaultCharUnicode; - } - } -} - -InternalCodec.prototype.encoder = InternalEncoder; -InternalCodec.prototype.decoder = InternalDecoder; - -//------------------------------------------------------------------------------ - -// We use node.js internal decoder. Its signature is the same as ours. -var StringDecoder = __webpack_require__(80).StringDecoder; - -if (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method. - StringDecoder.prototype.end = function() {}; - - -function InternalDecoder(options, codec) { - StringDecoder.call(this, codec.enc); -} - -InternalDecoder.prototype = StringDecoder.prototype; - - -//------------------------------------------------------------------------------ -// Encoder is mostly trivial - -function InternalEncoder(options, codec) { - this.enc = codec.enc; -} - -InternalEncoder.prototype.write = function(str) { - return new Buffer(str, this.enc); -} - -InternalEncoder.prototype.end = function() { -} - - -//------------------------------------------------------------------------------ -// Except base64 encoder, which must keep its state. - -function InternalEncoderBase64(options, codec) { - this.prevStr = ''; -} - -InternalEncoderBase64.prototype.write = function(str) { - str = this.prevStr + str; - var completeQuads = str.length - (str.length % 4); - this.prevStr = str.slice(completeQuads); - str = str.slice(0, completeQuads); - - return new Buffer(str, "base64"); -} - -InternalEncoderBase64.prototype.end = function() { - return new Buffer(this.prevStr, "base64"); -} - - -//------------------------------------------------------------------------------ -// CESU-8 encoder is also special. - -function InternalEncoderCesu8(options, codec) { -} - -InternalEncoderCesu8.prototype.write = function(str) { - var buf = new Buffer(str.length * 3), bufIdx = 0; - for (var i = 0; i < str.length; i++) { - var charCode = str.charCodeAt(i); - // Naive implementation, but it works because CESU-8 is especially easy - // to convert from UTF-16 (which all JS strings are encoded in). - if (charCode < 0x80) - buf[bufIdx++] = charCode; - else if (charCode < 0x800) { - buf[bufIdx++] = 0xC0 + (charCode >>> 6); - buf[bufIdx++] = 0x80 + (charCode & 0x3f); - } - else { // charCode will always be < 0x10000 in javascript. - buf[bufIdx++] = 0xE0 + (charCode >>> 12); - buf[bufIdx++] = 0x80 + ((charCode >>> 6) & 0x3f); - buf[bufIdx++] = 0x80 + (charCode & 0x3f); - } - } - return buf.slice(0, bufIdx); -} - -InternalEncoderCesu8.prototype.end = function() { -} - -//------------------------------------------------------------------------------ -// CESU-8 decoder is not implemented in Node v4.0+ - -function InternalDecoderCesu8(options, codec) { - this.acc = 0; - this.contBytes = 0; - this.accBytes = 0; - this.defaultCharUnicode = codec.defaultCharUnicode; -} - -InternalDecoderCesu8.prototype.write = function(buf) { - var acc = this.acc, contBytes = this.contBytes, accBytes = this.accBytes, - res = ''; - for (var i = 0; i < buf.length; i++) { - var curByte = buf[i]; - if ((curByte & 0xC0) !== 0x80) { // Leading byte - if (contBytes > 0) { // Previous code is invalid - res += this.defaultCharUnicode; - contBytes = 0; - } - - if (curByte < 0x80) { // Single-byte code - res += String.fromCharCode(curByte); - } else if (curByte < 0xE0) { // Two-byte code - acc = curByte & 0x1F; - contBytes = 1; accBytes = 1; - } else if (curByte < 0xF0) { // Three-byte code - acc = curByte & 0x0F; - contBytes = 2; accBytes = 1; - } else { // Four or more are not supported for CESU-8. - res += this.defaultCharUnicode; - } - } else { // Continuation byte - if (contBytes > 0) { // We're waiting for it. - acc = (acc << 6) | (curByte & 0x3f); - contBytes--; accBytes++; - if (contBytes === 0) { - // Check for overlong encoding, but support Modified UTF-8 (encoding NULL as C0 80) - if (accBytes === 2 && acc < 0x80 && acc > 0) - res += this.defaultCharUnicode; - else if (accBytes === 3 && acc < 0x800) - res += this.defaultCharUnicode; - else - // Actually add character. - res += String.fromCharCode(acc); - } - } else { // Unexpected continuation byte - res += this.defaultCharUnicode; - } - } - } - this.acc = acc; this.contBytes = contBytes; this.accBytes = accBytes; - return res; -} - -InternalDecoderCesu8.prototype.end = function() { - var res = 0; - if (this.contBytes > 0) - res += this.defaultCharUnicode; - return res; -} - - -/***/ }), -/* 137 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var Buffer = __webpack_require__(3).Buffer; - -// Note: UTF16-LE (or UCS2) codec is Node.js native. See encodings/internal.js - -// == UTF16-BE codec. ========================================================== - -exports.utf16be = Utf16BECodec; -function Utf16BECodec() { -} - -Utf16BECodec.prototype.encoder = Utf16BEEncoder; -Utf16BECodec.prototype.decoder = Utf16BEDecoder; -Utf16BECodec.prototype.bomAware = true; - - -// -- Encoding - -function Utf16BEEncoder() { -} - -Utf16BEEncoder.prototype.write = function(str) { - var buf = new Buffer(str, 'ucs2'); - for (var i = 0; i < buf.length; i += 2) { - var tmp = buf[i]; buf[i] = buf[i+1]; buf[i+1] = tmp; - } - return buf; -} - -Utf16BEEncoder.prototype.end = function() { -} - - -// -- Decoding - -function Utf16BEDecoder() { - this.overflowByte = -1; -} - -Utf16BEDecoder.prototype.write = function(buf) { - if (buf.length == 0) - return ''; - - var buf2 = new Buffer(buf.length + 1), - i = 0, j = 0; - - if (this.overflowByte !== -1) { - buf2[0] = buf[0]; - buf2[1] = this.overflowByte; - i = 1; j = 2; - } - - for (; i < buf.length-1; i += 2, j+= 2) { - buf2[j] = buf[i+1]; - buf2[j+1] = buf[i]; - } - - this.overflowByte = (i == buf.length-1) ? buf[buf.length-1] : -1; - - return buf2.slice(0, j).toString('ucs2'); -} - -Utf16BEDecoder.prototype.end = function() { -} - - -// == UTF-16 codec ============================================================= -// Decoder chooses automatically from UTF-16LE and UTF-16BE using BOM and space-based heuristic. -// Defaults to UTF-16LE, as it's prevalent and default in Node. -// http://en.wikipedia.org/wiki/UTF-16 and http://encoding.spec.whatwg.org/#utf-16le -// Decoder default can be changed: iconv.decode(buf, 'utf16', {defaultEncoding: 'utf-16be'}); - -// Encoder uses UTF-16LE and prepends BOM (which can be overridden with addBOM: false). - -exports.utf16 = Utf16Codec; -function Utf16Codec(codecOptions, iconv) { - this.iconv = iconv; -} - -Utf16Codec.prototype.encoder = Utf16Encoder; -Utf16Codec.prototype.decoder = Utf16Decoder; - - -// -- Encoding (pass-through) - -function Utf16Encoder(options, codec) { - options = options || {}; - if (options.addBOM === undefined) - options.addBOM = true; - this.encoder = codec.iconv.getEncoder('utf-16le', options); -} - -Utf16Encoder.prototype.write = function(str) { - return this.encoder.write(str); -} - -Utf16Encoder.prototype.end = function() { - return this.encoder.end(); -} - - -// -- Decoding - -function Utf16Decoder(options, codec) { - this.decoder = null; - this.initialBytes = []; - this.initialBytesLen = 0; - - this.options = options || {}; - this.iconv = codec.iconv; -} - -Utf16Decoder.prototype.write = function(buf) { - if (!this.decoder) { - // Codec is not chosen yet. Accumulate initial bytes. - this.initialBytes.push(buf); - this.initialBytesLen += buf.length; - - if (this.initialBytesLen < 16) // We need more bytes to use space heuristic (see below) - return ''; - - // We have enough bytes -> detect endianness. - var buf = Buffer.concat(this.initialBytes), - encoding = detectEncoding(buf, this.options.defaultEncoding); - this.decoder = this.iconv.getDecoder(encoding, this.options); - this.initialBytes.length = this.initialBytesLen = 0; - } - - return this.decoder.write(buf); -} - -Utf16Decoder.prototype.end = function() { - if (!this.decoder) { - var buf = Buffer.concat(this.initialBytes), - encoding = detectEncoding(buf, this.options.defaultEncoding); - this.decoder = this.iconv.getDecoder(encoding, this.options); - - var res = this.decoder.write(buf), - trail = this.decoder.end(); - - return trail ? (res + trail) : res; - } - return this.decoder.end(); -} - -function detectEncoding(buf, defaultEncoding) { - var enc = defaultEncoding || 'utf-16le'; - - if (buf.length >= 2) { - // Check BOM. - if (buf[0] == 0xFE && buf[1] == 0xFF) // UTF-16BE BOM - enc = 'utf-16be'; - else if (buf[0] == 0xFF && buf[1] == 0xFE) // UTF-16LE BOM - enc = 'utf-16le'; - else { - // No BOM found. Try to deduce encoding from initial content. - // Most of the time, the content has ASCII chars (U+00**), but the opposite (U+**00) is uncommon. - // So, we count ASCII as if it was LE or BE, and decide from that. - var asciiCharsLE = 0, asciiCharsBE = 0, // Counts of chars in both positions - _len = Math.min(buf.length - (buf.length % 2), 64); // Len is always even. - - for (var i = 0; i < _len; i += 2) { - if (buf[i] === 0 && buf[i+1] !== 0) asciiCharsBE++; - if (buf[i] !== 0 && buf[i+1] === 0) asciiCharsLE++; - } - - if (asciiCharsBE > asciiCharsLE) - enc = 'utf-16be'; - else if (asciiCharsBE < asciiCharsLE) - enc = 'utf-16le'; - } - } - - return enc; -} - - - - -/***/ }), -/* 138 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var Buffer = __webpack_require__(3).Buffer; - -// UTF-7 codec, according to https://tools.ietf.org/html/rfc2152 -// See also below a UTF-7-IMAP codec, according to http://tools.ietf.org/html/rfc3501#section-5.1.3 - -exports.utf7 = Utf7Codec; -exports.unicode11utf7 = 'utf7'; // Alias UNICODE-1-1-UTF-7 -function Utf7Codec(codecOptions, iconv) { - this.iconv = iconv; -}; - -Utf7Codec.prototype.encoder = Utf7Encoder; -Utf7Codec.prototype.decoder = Utf7Decoder; -Utf7Codec.prototype.bomAware = true; - - -// -- Encoding - -var nonDirectChars = /[^A-Za-z0-9'\(\),-\.\/:\? \n\r\t]+/g; - -function Utf7Encoder(options, codec) { - this.iconv = codec.iconv; -} - -Utf7Encoder.prototype.write = function(str) { - // Naive implementation. - // Non-direct chars are encoded as "+-"; single "+" char is encoded as "+-". - return new Buffer(str.replace(nonDirectChars, function(chunk) { - return "+" + (chunk === '+' ? '' : - this.iconv.encode(chunk, 'utf16-be').toString('base64').replace(/=+$/, '')) - + "-"; - }.bind(this))); -} - -Utf7Encoder.prototype.end = function() { -} - - -// -- Decoding - -function Utf7Decoder(options, codec) { - this.iconv = codec.iconv; - this.inBase64 = false; - this.base64Accum = ''; -} - -var base64Regex = /[A-Za-z0-9\/+]/; -var base64Chars = []; -for (var i = 0; i < 256; i++) - base64Chars[i] = base64Regex.test(String.fromCharCode(i)); - -var plusChar = '+'.charCodeAt(0), - minusChar = '-'.charCodeAt(0), - andChar = '&'.charCodeAt(0); - -Utf7Decoder.prototype.write = function(buf) { - var res = "", lastI = 0, - inBase64 = this.inBase64, - base64Accum = this.base64Accum; - - // The decoder is more involved as we must handle chunks in stream. - - for (var i = 0; i < buf.length; i++) { - if (!inBase64) { // We're in direct mode. - // Write direct chars until '+' - if (buf[i] == plusChar) { - res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars. - lastI = i+1; - inBase64 = true; - } - } else { // We decode base64. - if (!base64Chars[buf[i]]) { // Base64 ended. - if (i == lastI && buf[i] == minusChar) {// "+-" -> "+" - res += "+"; - } else { - var b64str = base64Accum + buf.slice(lastI, i).toString(); - res += this.iconv.decode(new Buffer(b64str, 'base64'), "utf16-be"); - } - - if (buf[i] != minusChar) // Minus is absorbed after base64. - i--; - - lastI = i+1; - inBase64 = false; - base64Accum = ''; - } - } - } - - if (!inBase64) { - res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars. - } else { - var b64str = base64Accum + buf.slice(lastI).toString(); - - var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars. - base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future. - b64str = b64str.slice(0, canBeDecoded); - - res += this.iconv.decode(new Buffer(b64str, 'base64'), "utf16-be"); - } - - this.inBase64 = inBase64; - this.base64Accum = base64Accum; - - return res; -} - -Utf7Decoder.prototype.end = function() { - var res = ""; - if (this.inBase64 && this.base64Accum.length > 0) - res = this.iconv.decode(new Buffer(this.base64Accum, 'base64'), "utf16-be"); - - this.inBase64 = false; - this.base64Accum = ''; - return res; -} - - -// UTF-7-IMAP codec. -// RFC3501 Sec. 5.1.3 Modified UTF-7 (http://tools.ietf.org/html/rfc3501#section-5.1.3) -// Differences: -// * Base64 part is started by "&" instead of "+" -// * Direct characters are 0x20-0x7E, except "&" (0x26) -// * In Base64, "," is used instead of "/" -// * Base64 must not be used to represent direct characters. -// * No implicit shift back from Base64 (should always end with '-') -// * String must end in non-shifted position. -// * "-&" while in base64 is not allowed. - - -exports.utf7imap = Utf7IMAPCodec; -function Utf7IMAPCodec(codecOptions, iconv) { - this.iconv = iconv; -}; - -Utf7IMAPCodec.prototype.encoder = Utf7IMAPEncoder; -Utf7IMAPCodec.prototype.decoder = Utf7IMAPDecoder; -Utf7IMAPCodec.prototype.bomAware = true; - - -// -- Encoding - -function Utf7IMAPEncoder(options, codec) { - this.iconv = codec.iconv; - this.inBase64 = false; - this.base64Accum = new Buffer(6); - this.base64AccumIdx = 0; -} - -Utf7IMAPEncoder.prototype.write = function(str) { - var inBase64 = this.inBase64, - base64Accum = this.base64Accum, - base64AccumIdx = this.base64AccumIdx, - buf = new Buffer(str.length*5 + 10), bufIdx = 0; - - for (var i = 0; i < str.length; i++) { - var uChar = str.charCodeAt(i); - if (0x20 <= uChar && uChar <= 0x7E) { // Direct character or '&'. - if (inBase64) { - if (base64AccumIdx > 0) { - bufIdx += buf.write(base64Accum.slice(0, base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx); - base64AccumIdx = 0; - } - - buf[bufIdx++] = minusChar; // Write '-', then go to direct mode. - inBase64 = false; - } - - if (!inBase64) { - buf[bufIdx++] = uChar; // Write direct character - - if (uChar === andChar) // Ampersand -> '&-' - buf[bufIdx++] = minusChar; - } - - } else { // Non-direct character - if (!inBase64) { - buf[bufIdx++] = andChar; // Write '&', then go to base64 mode. - inBase64 = true; - } - if (inBase64) { - base64Accum[base64AccumIdx++] = uChar >> 8; - base64Accum[base64AccumIdx++] = uChar & 0xFF; - - if (base64AccumIdx == base64Accum.length) { - bufIdx += buf.write(base64Accum.toString('base64').replace(/\//g, ','), bufIdx); - base64AccumIdx = 0; - } - } - } - } - - this.inBase64 = inBase64; - this.base64AccumIdx = base64AccumIdx; - - return buf.slice(0, bufIdx); -} - -Utf7IMAPEncoder.prototype.end = function() { - var buf = new Buffer(10), bufIdx = 0; - if (this.inBase64) { - if (this.base64AccumIdx > 0) { - bufIdx += buf.write(this.base64Accum.slice(0, this.base64AccumIdx).toString('base64').replace(/\//g, ',').replace(/=+$/, ''), bufIdx); - this.base64AccumIdx = 0; - } - - buf[bufIdx++] = minusChar; // Write '-', then go to direct mode. - this.inBase64 = false; - } - - return buf.slice(0, bufIdx); -} - - -// -- Decoding - -function Utf7IMAPDecoder(options, codec) { - this.iconv = codec.iconv; - this.inBase64 = false; - this.base64Accum = ''; -} - -var base64IMAPChars = base64Chars.slice(); -base64IMAPChars[','.charCodeAt(0)] = true; - -Utf7IMAPDecoder.prototype.write = function(buf) { - var res = "", lastI = 0, - inBase64 = this.inBase64, - base64Accum = this.base64Accum; - - // The decoder is more involved as we must handle chunks in stream. - // It is forgiving, closer to standard UTF-7 (for example, '-' is optional at the end). - - for (var i = 0; i < buf.length; i++) { - if (!inBase64) { // We're in direct mode. - // Write direct chars until '&' - if (buf[i] == andChar) { - res += this.iconv.decode(buf.slice(lastI, i), "ascii"); // Write direct chars. - lastI = i+1; - inBase64 = true; - } - } else { // We decode base64. - if (!base64IMAPChars[buf[i]]) { // Base64 ended. - if (i == lastI && buf[i] == minusChar) { // "&-" -> "&" - res += "&"; - } else { - var b64str = base64Accum + buf.slice(lastI, i).toString().replace(/,/g, '/'); - res += this.iconv.decode(new Buffer(b64str, 'base64'), "utf16-be"); - } - - if (buf[i] != minusChar) // Minus may be absorbed after base64. - i--; - - lastI = i+1; - inBase64 = false; - base64Accum = ''; - } - } - } - - if (!inBase64) { - res += this.iconv.decode(buf.slice(lastI), "ascii"); // Write direct chars. - } else { - var b64str = base64Accum + buf.slice(lastI).toString().replace(/,/g, '/'); - - var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars. - base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future. - b64str = b64str.slice(0, canBeDecoded); - - res += this.iconv.decode(new Buffer(b64str, 'base64'), "utf16-be"); - } - - this.inBase64 = inBase64; - this.base64Accum = base64Accum; - - return res; -} - -Utf7IMAPDecoder.prototype.end = function() { - var res = ""; - if (this.inBase64 && this.base64Accum.length > 0) - res = this.iconv.decode(new Buffer(this.base64Accum, 'base64'), "utf16-be"); - - this.inBase64 = false; - this.base64Accum = ''; - return res; -} - - - - -/***/ }), -/* 139 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var Buffer = __webpack_require__(3).Buffer; - -// Single-byte codec. Needs a 'chars' string parameter that contains 256 or 128 chars that -// correspond to encoded bytes (if 128 - then lower half is ASCII). - -exports._sbcs = SBCSCodec; -function SBCSCodec(codecOptions, iconv) { - if (!codecOptions) - throw new Error("SBCS codec is called without the data.") - - // Prepare char buffer for decoding. - if (!codecOptions.chars || (codecOptions.chars.length !== 128 && codecOptions.chars.length !== 256)) - throw new Error("Encoding '"+codecOptions.type+"' has incorrect 'chars' (must be of len 128 or 256)"); - - if (codecOptions.chars.length === 128) { - var asciiString = ""; - for (var i = 0; i < 128; i++) - asciiString += String.fromCharCode(i); - codecOptions.chars = asciiString + codecOptions.chars; - } - - this.decodeBuf = new Buffer(codecOptions.chars, 'ucs2'); - - // Encoding buffer. - var encodeBuf = new Buffer(65536); - encodeBuf.fill(iconv.defaultCharSingleByte.charCodeAt(0)); - - for (var i = 0; i < codecOptions.chars.length; i++) - encodeBuf[codecOptions.chars.charCodeAt(i)] = i; - - this.encodeBuf = encodeBuf; -} - -SBCSCodec.prototype.encoder = SBCSEncoder; -SBCSCodec.prototype.decoder = SBCSDecoder; - - -function SBCSEncoder(options, codec) { - this.encodeBuf = codec.encodeBuf; -} - -SBCSEncoder.prototype.write = function(str) { - var buf = new Buffer(str.length); - for (var i = 0; i < str.length; i++) - buf[i] = this.encodeBuf[str.charCodeAt(i)]; - - return buf; -} - -SBCSEncoder.prototype.end = function() { -} - - -function SBCSDecoder(options, codec) { - this.decodeBuf = codec.decodeBuf; -} - -SBCSDecoder.prototype.write = function(buf) { - // Strings are immutable in JS -> we use ucs2 buffer to speed up computations. - var decodeBuf = this.decodeBuf; - var newBuf = new Buffer(buf.length*2); - var idx1 = 0, idx2 = 0; - for (var i = 0; i < buf.length; i++) { - idx1 = buf[i]*2; idx2 = i*2; - newBuf[idx2] = decodeBuf[idx1]; - newBuf[idx2+1] = decodeBuf[idx1+1]; - } - return newBuf.toString('ucs2'); -} - -SBCSDecoder.prototype.end = function() { -} - - -/***/ }), -/* 140 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -// Manually added data to be used by sbcs codec in addition to generated one. - -module.exports = { - // Not supported by iconv, not sure why. - "10029": "maccenteuro", - "maccenteuro": { - "type": "_sbcs", - "chars": "ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ" - }, - - "808": "cp808", - "ibm808": "cp808", - "cp808": { - "type": "_sbcs", - "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№€■ " - }, - - // Aliases of generated encodings. - "ascii8bit": "ascii", - "usascii": "ascii", - "ansix34": "ascii", - "ansix341968": "ascii", - "ansix341986": "ascii", - "csascii": "ascii", - "cp367": "ascii", - "ibm367": "ascii", - "isoir6": "ascii", - "iso646us": "ascii", - "iso646irv": "ascii", - "us": "ascii", - - "latin1": "iso88591", - "latin2": "iso88592", - "latin3": "iso88593", - "latin4": "iso88594", - "latin5": "iso88599", - "latin6": "iso885910", - "latin7": "iso885913", - "latin8": "iso885914", - "latin9": "iso885915", - "latin10": "iso885916", - - "csisolatin1": "iso88591", - "csisolatin2": "iso88592", - "csisolatin3": "iso88593", - "csisolatin4": "iso88594", - "csisolatincyrillic": "iso88595", - "csisolatinarabic": "iso88596", - "csisolatingreek" : "iso88597", - "csisolatinhebrew": "iso88598", - "csisolatin5": "iso88599", - "csisolatin6": "iso885910", - - "l1": "iso88591", - "l2": "iso88592", - "l3": "iso88593", - "l4": "iso88594", - "l5": "iso88599", - "l6": "iso885910", - "l7": "iso885913", - "l8": "iso885914", - "l9": "iso885915", - "l10": "iso885916", - - "isoir14": "iso646jp", - "isoir57": "iso646cn", - "isoir100": "iso88591", - "isoir101": "iso88592", - "isoir109": "iso88593", - "isoir110": "iso88594", - "isoir144": "iso88595", - "isoir127": "iso88596", - "isoir126": "iso88597", - "isoir138": "iso88598", - "isoir148": "iso88599", - "isoir157": "iso885910", - "isoir166": "tis620", - "isoir179": "iso885913", - "isoir199": "iso885914", - "isoir203": "iso885915", - "isoir226": "iso885916", - - "cp819": "iso88591", - "ibm819": "iso88591", - - "cyrillic": "iso88595", - - "arabic": "iso88596", - "arabic8": "iso88596", - "ecma114": "iso88596", - "asmo708": "iso88596", - - "greek" : "iso88597", - "greek8" : "iso88597", - "ecma118" : "iso88597", - "elot928" : "iso88597", - - "hebrew": "iso88598", - "hebrew8": "iso88598", - - "turkish": "iso88599", - "turkish8": "iso88599", - - "thai": "iso885911", - "thai8": "iso885911", - - "celtic": "iso885914", - "celtic8": "iso885914", - "isoceltic": "iso885914", - - "tis6200": "tis620", - "tis62025291": "tis620", - "tis62025330": "tis620", - - "10000": "macroman", - "10006": "macgreek", - "10007": "maccyrillic", - "10079": "maciceland", - "10081": "macturkish", - - "cspc8codepage437": "cp437", - "cspc775baltic": "cp775", - "cspc850multilingual": "cp850", - "cspcp852": "cp852", - "cspc862latinhebrew": "cp862", - "cpgr": "cp869", - - "msee": "cp1250", - "mscyrl": "cp1251", - "msansi": "cp1252", - "msgreek": "cp1253", - "msturk": "cp1254", - "mshebr": "cp1255", - "msarab": "cp1256", - "winbaltrim": "cp1257", - - "cp20866": "koi8r", - "20866": "koi8r", - "ibm878": "koi8r", - "cskoi8r": "koi8r", - - "cp21866": "koi8u", - "21866": "koi8u", - "ibm1168": "koi8u", - - "strk10482002": "rk1048", - - "tcvn5712": "tcvn", - "tcvn57121": "tcvn", - - "gb198880": "iso646cn", - "cn": "iso646cn", - - "csiso14jisc6220ro": "iso646jp", - "jisc62201969ro": "iso646jp", - "jp": "iso646jp", - - "cshproman8": "hproman8", - "r8": "hproman8", - "roman8": "hproman8", - "xroman8": "hproman8", - "ibm1051": "hproman8", - - "mac": "macintosh", - "csmacintosh": "macintosh", -}; - - - -/***/ }), -/* 141 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -// Generated data for sbcs codec. Don't edit manually. Regenerate using generation/gen-sbcs.js script. -module.exports = { - "437": "cp437", - "737": "cp737", - "775": "cp775", - "850": "cp850", - "852": "cp852", - "855": "cp855", - "856": "cp856", - "857": "cp857", - "858": "cp858", - "860": "cp860", - "861": "cp861", - "862": "cp862", - "863": "cp863", - "864": "cp864", - "865": "cp865", - "866": "cp866", - "869": "cp869", - "874": "windows874", - "922": "cp922", - "1046": "cp1046", - "1124": "cp1124", - "1125": "cp1125", - "1129": "cp1129", - "1133": "cp1133", - "1161": "cp1161", - "1162": "cp1162", - "1163": "cp1163", - "1250": "windows1250", - "1251": "windows1251", - "1252": "windows1252", - "1253": "windows1253", - "1254": "windows1254", - "1255": "windows1255", - "1256": "windows1256", - "1257": "windows1257", - "1258": "windows1258", - "28591": "iso88591", - "28592": "iso88592", - "28593": "iso88593", - "28594": "iso88594", - "28595": "iso88595", - "28596": "iso88596", - "28597": "iso88597", - "28598": "iso88598", - "28599": "iso88599", - "28600": "iso885910", - "28601": "iso885911", - "28603": "iso885913", - "28604": "iso885914", - "28605": "iso885915", - "28606": "iso885916", - "windows874": { - "type": "_sbcs", - "chars": "€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����" - }, - "win874": "windows874", - "cp874": "windows874", - "windows1250": { - "type": "_sbcs", - "chars": "€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙" - }, - "win1250": "windows1250", - "cp1250": "windows1250", - "windows1251": { - "type": "_sbcs", - "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя" - }, - "win1251": "windows1251", - "cp1251": "windows1251", - "windows1252": { - "type": "_sbcs", - "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" - }, - "win1252": "windows1252", - "cp1252": "windows1252", - "windows1253": { - "type": "_sbcs", - "chars": "€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�" - }, - "win1253": "windows1253", - "cp1253": "windows1253", - "windows1254": { - "type": "_sbcs", - "chars": "€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ" - }, - "win1254": "windows1254", - "cp1254": "windows1254", - "windows1255": { - "type": "_sbcs", - "chars": "€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹֺֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�" - }, - "win1255": "windows1255", - "cp1255": "windows1255", - "windows1256": { - "type": "_sbcs", - "chars": "€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے" - }, - "win1256": "windows1256", - "cp1256": "windows1256", - "windows1257": { - "type": "_sbcs", - "chars": "€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙" - }, - "win1257": "windows1257", - "cp1257": "windows1257", - "windows1258": { - "type": "_sbcs", - "chars": "€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ" - }, - "win1258": "windows1258", - "cp1258": "windows1258", - "iso88591": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" - }, - "cp28591": "iso88591", - "iso88592": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙" - }, - "cp28592": "iso88592", - "iso88593": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ħ˘£¤�Ĥ§¨İŞĞĴ­�Ż°ħ²³´µĥ·¸ışğĵ½�żÀÁÂ�ÄĊĈÇÈÉÊËÌÍÎÏ�ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ�äċĉçèéêëìíîï�ñòóôġö÷ĝùúûüŭŝ˙" - }, - "cp28593": "iso88593", - "iso88594": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄĸŖ¤ĨĻ§¨ŠĒĢŦ­Ž¯°ą˛ŗ´ĩļˇ¸šēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖ×ØŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū˙" - }, - "cp28594": "iso88594", - "iso88595": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ" - }, - "cp28595": "iso88595", - "iso88596": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ���¤�������،­�������������؛���؟�ءآأؤإئابةتثجحخدذرزسشصضطظعغ�����ـفقكلمنهوىيًٌٍَُِّْ�������������" - }, - "cp28596": "iso88596", - "iso88597": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’£€₯¦§¨©ͺ«¬­�―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�" - }, - "cp28597": "iso88597", - "iso88598": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ �¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾��������������������������������‗אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�" - }, - "cp28598": "iso88598", - "iso88599": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ" - }, - "cp28599": "iso88599", - "iso885910": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄĒĢĪĨĶ§ĻĐŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ" - }, - "cp28600": "iso885910", - "iso885911": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����" - }, - "cp28601": "iso885911", - "iso885913": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’" - }, - "cp28603": "iso885913", - "iso885914": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ­®ŸḞḟĠġṀṁ¶ṖẁṗẃṠỳẄẅṡÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŴÑÒÓÔÕÖṪØÙÚÛÜÝŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ" - }, - "cp28604": "iso885914", - "iso885915": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" - }, - "cp28605": "iso885915", - "iso885916": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ĄąŁ€„Š§š©Ș«Ź­źŻ°±ČłŽ”¶·žčș»ŒœŸżÀÁÂĂÄĆÆÇÈÉÊËÌÍÎÏĐŃÒÓÔŐÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ" - }, - "cp28606": "iso885916", - "cp437": { - "type": "_sbcs", - "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " - }, - "ibm437": "cp437", - "csibm437": "cp437", - "cp737": { - "type": "_sbcs", - "chars": "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ " - }, - "ibm737": "cp737", - "csibm737": "cp737", - "cp775": { - "type": "_sbcs", - "chars": "ĆüéāäģåćłēŖŗīŹÄÅÉæÆōöĢ¢ŚśÖÜø£ØפĀĪóŻżź”¦©®¬½¼Ł«»░▒▓│┤ĄČĘĖ╣║╗╝ĮŠ┐└┴┬├─┼ŲŪ╚╔╩╦╠═╬Žąčęėįšųūž┘┌█▄▌▐▀ÓßŌŃõÕµńĶķĻļņĒŅ’­±“¾¶§÷„°∙·¹³²■ " - }, - "ibm775": "cp775", - "csibm775": "cp775", - "cp850": { - "type": "_sbcs", - "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ " - }, - "ibm850": "cp850", - "csibm850": "cp850", - "cp852": { - "type": "_sbcs", - "chars": "ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ " - }, - "ibm852": "cp852", - "csibm852": "cp852", - "cp855": { - "type": "_sbcs", - "chars": "ђЂѓЃёЁєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџЏюЮъЪаАбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗╝йЙ┐└┴┬├─┼кК╚╔╩╦╠═╬¤лЛмМнНоОп┘┌█▄Пя▀ЯрРсСтТуУжЖвВьЬ№­ыЫзЗшШэЭщЩчЧ§■ " - }, - "ibm855": "cp855", - "csibm855": "cp855", - "cp856": { - "type": "_sbcs", - "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת�£�×����������®¬½¼�«»░▒▓│┤���©╣║╗╝¢¥┐└┴┬├─┼��╚╔╩╦╠═╬¤���������┘┌█▄¦�▀������µ�������¯´­±‗¾¶§÷¸°¨·¹³²■ " - }, - "ibm856": "cp856", - "csibm856": "cp856", - "cp857": { - "type": "_sbcs", - "chars": "ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ " - }, - "ibm857": "cp857", - "csibm857": "cp857", - "cp858": { - "type": "_sbcs", - "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø׃áíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈ€ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ " - }, - "ibm858": "cp858", - "csibm858": "cp858", - "cp860": { - "type": "_sbcs", - "chars": "ÇüéâãàÁçêÊèÍÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñѪº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " - }, - "ibm860": "cp860", - "csibm860": "cp860", - "cp861": { - "type": "_sbcs", - "chars": "ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " - }, - "ibm861": "cp861", - "csibm861": "cp861", - "cp862": { - "type": "_sbcs", - "chars": "אבגדהוזחטיךכלםמןנסעףפץצקרשת¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " - }, - "ibm862": "cp862", - "csibm862": "cp862", - "cp863": { - "type": "_sbcs", - "chars": "ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÏûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯Î⌐¬½¼¾«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " - }, - "ibm863": "cp863", - "csibm863": "cp863", - "cp864": { - "type": "_sbcs", - "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$٪&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~°·∙√▒─│┼┤┬├┴┐┌└┘β∞φ±½¼≈«»ﻷﻸ��ﻻﻼ� ­ﺂ£¤ﺄ��ﺎﺏﺕﺙ،ﺝﺡﺥ٠١٢٣٤٥٦٧٨٩ﻑ؛ﺱﺵﺹ؟¢ﺀﺁﺃﺅﻊﺋﺍﺑﺓﺗﺛﺟﺣﺧﺩﺫﺭﺯﺳﺷﺻﺿﻁﻅﻋﻏ¦¬÷×ﻉـﻓﻗﻛﻟﻣﻧﻫﻭﻯﻳﺽﻌﻎﻍﻡﹽّﻥﻩﻬﻰﻲﻐﻕﻵﻶﻝﻙﻱ■�" - }, - "ibm864": "cp864", - "csibm864": "cp864", - "cp865": { - "type": "_sbcs", - "chars": "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ " - }, - "ibm865": "cp865", - "csibm865": "cp865", - "cp866": { - "type": "_sbcs", - "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ " - }, - "ibm866": "cp866", - "csibm866": "cp866", - "cp869": { - "type": "_sbcs", - "chars": "������Ά�·¬¦‘’Έ―ΉΊΪΌ��ΎΫ©Ώ²³ά£έήίϊΐόύΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜΝ╣║╗╝ΞΟ┐└┴┬├─┼ΠΡ╚╔╩╦╠═╬ΣΤΥΦΧΨΩαβγ┘┌█▄δε▀ζηθικλμνξοπρσςτ΄­±υφχ§ψ΅°¨ωϋΰώ■ " - }, - "ibm869": "cp869", - "csibm869": "cp869", - "cp922": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®‾°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŠÑÒÓÔÕÖ×ØÙÚÛÜÝŽßàáâãäåæçèéêëìíîïšñòóôõö÷øùúûüýžÿ" - }, - "ibm922": "cp922", - "csibm922": "cp922", - "cp1046": { - "type": "_sbcs", - "chars": "ﺈ×÷ﹱˆ■│─┐┌└┘ﹹﹻﹽﹿﹷﺊﻰﻳﻲﻎﻏﻐﻶﻸﻺﻼ ¤ﺋﺑﺗﺛﺟﺣ،­ﺧﺳ٠١٢٣٤٥٦٧٨٩ﺷ؛ﺻﺿﻊ؟ﻋءآأؤإئابةتثجحخدذرزسشصضطﻇعغﻌﺂﺄﺎﻓـفقكلمنهوىيًٌٍَُِّْﻗﻛﻟﻵﻷﻹﻻﻣﻧﻬﻩ�" - }, - "ibm1046": "cp1046", - "csibm1046": "cp1046", - "cp1124": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ЁЂҐЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђґєѕіїјљњћќ§ўџ" - }, - "ibm1124": "cp1124", - "csibm1124": "cp1124", - "cp1125": { - "type": "_sbcs", - "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёҐґЄєІіЇї·√№¤■ " - }, - "ibm1125": "cp1125", - "csibm1125": "cp1125", - "cp1129": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ" - }, - "ibm1129": "cp1129", - "csibm1129": "cp1129", - "cp1133": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ກຂຄງຈສຊຍດຕຖທນບປຜຝພຟມຢຣລວຫອຮ���ຯະາຳິີຶືຸູຼັົຽ���ເແໂໃໄ່້໊໋໌ໍໆ�ໜໝ₭����������������໐໑໒໓໔໕໖໗໘໙��¢¬¦�" - }, - "ibm1133": "cp1133", - "csibm1133": "cp1133", - "cp1161": { - "type": "_sbcs", - "chars": "��������������������������������่กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู้๊๋€฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛¢¬¦ " - }, - "ibm1161": "cp1161", - "csibm1161": "cp1161", - "cp1162": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����" - }, - "ibm1162": "cp1162", - "csibm1162": "cp1162", - "cp1163": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£€¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ" - }, - "ibm1163": "cp1163", - "csibm1163": "cp1163", - "maccroatian": { - "type": "_sbcs", - "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈Ć«Č… ÀÃÕŒœĐ—“”‘’÷◊�©⁄¤‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ" - }, - "maccyrillic": { - "type": "_sbcs", - "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤" - }, - "macgreek": { - "type": "_sbcs", - "chars": "Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�" - }, - "maciceland": { - "type": "_sbcs", - "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ" - }, - "macroman": { - "type": "_sbcs", - "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ" - }, - "macromania": { - "type": "_sbcs", - "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂŞ∞±≤≥¥µ∂∑∏π∫ªºΩăş¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›Ţţ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ" - }, - "macthai": { - "type": "_sbcs", - "chars": "«»…“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู​–—฿เแโใไๅๆ็่้๊๋์ํ™๏๐๑๒๓๔๕๖๗๘๙®©����" - }, - "macturkish": { - "type": "_sbcs", - "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ" - }, - "macukraine": { - "type": "_sbcs", - "chars": "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤" - }, - "koi8r": { - "type": "_sbcs", - "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ё╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡Ё╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ" - }, - "koi8u": { - "type": "_sbcs", - "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґ╝╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪Ґ╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ" - }, - "koi8ru": { - "type": "_sbcs", - "chars": "─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґў╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪ҐЎ©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ" - }, - "koi8t": { - "type": "_sbcs", - "chars": "қғ‚Ғ„…†‡�‰ҳ‹ҲҷҶ�Қ‘’“”•–—�™�›�����ӯӮё¤ӣ¦§���«¬­®�°±²Ё�Ӣ¶·�№�»���©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ" - }, - "armscii8": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ �և։)(»«—.՝,-֊…՜՛՞ԱաԲբԳգԴդԵեԶզԷէԸըԹթԺժԻիԼլԽխԾծԿկՀհՁձՂղՃճՄմՅյՆնՇշՈոՉչՊպՋջՌռՍսՎվՏտՐրՑցՒւՓփՔքՕօՖֆ՚�" - }, - "rk1048": { - "type": "_sbcs", - "chars": "ЂЃ‚ѓ„…†‡€‰Љ‹ЊҚҺЏђ‘’“”•–—�™љ›њқһџ ҰұӘ¤Ө¦§Ё©Ғ«¬­®Ү°±Ііөµ¶·ё№ғ»әҢңүАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя" - }, - "tcvn": { - "type": "_sbcs", - "chars": "\u0000ÚỤ\u0003ỪỬỮ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010ỨỰỲỶỸÝỴ\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÀẢÃÁẠẶẬÈẺẼÉẸỆÌỈĨÍỊÒỎÕÓỌỘỜỞỠỚỢÙỦŨ ĂÂÊÔƠƯĐăâêôơưđẶ̀̀̉̃́àảãáạẲằẳẵắẴẮẦẨẪẤỀặầẩẫấậèỂẻẽéẹềểễếệìỉỄẾỒĩíịòỔỏõóọồổỗốộờởỡớợùỖủũúụừửữứựỳỷỹýỵỐ" - }, - "georgianacademy": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶçèéêëìíîïðñòóôõö÷øùúûüýþÿ" - }, - "georgianps": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზჱთიკლმნჲოპჟრსტჳუფქღყშჩცძწჭხჴჯჰჵæçèéêëìíîïðñòóôõö÷øùúûüýþÿ" - }, - "pt154": { - "type": "_sbcs", - "chars": "ҖҒӮғ„…ҶҮҲүҠӢҢҚҺҸҗ‘’“”•–—ҳҷҡӣңқһҹ ЎўЈӨҘҰ§Ё©Ә«¬ӯ®Ҝ°ұІіҙө¶·ё№ә»јҪҫҝАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя" - }, - "viscii": { - "type": "_sbcs", - "chars": "\u0000\u0001Ẳ\u0003\u0004ẴẪ\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013Ỷ\u0015\u0016\u0017\u0018Ỹ\u001a\u001b\u001c\u001dỴ\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ẠẮẰẶẤẦẨẬẼẸẾỀỂỄỆỐỒỔỖỘỢỚỜỞỊỎỌỈỦŨỤỲÕắằặấầẩậẽẹếềểễệốồổỗỠƠộờởịỰỨỪỬơớƯÀÁÂÃẢĂẳẵÈÉÊẺÌÍĨỳĐứÒÓÔạỷừửÙÚỹỵÝỡưàáâãảăữẫèéêẻìíĩỉđựòóôõỏọụùúũủýợỮ" - }, - "iso646cn": { - "type": "_sbcs", - "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������" - }, - "iso646jp": { - "type": "_sbcs", - "chars": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������" - }, - "hproman8": { - "type": "_sbcs", - "chars": "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ÀÂÈÊËÎÏ´ˋˆ¨˜ÙÛ₤¯Ýý°ÇçÑñ¡¿¤£¥§ƒ¢âêôûáéóúàèòùäëöüÅîØÆåíøæÄìÖÜÉïßÔÁÃãÐðÍÌÓÒÕõŠšÚŸÿÞþ·µ¶¾—¼½ªº«■»±�" - }, - "macintosh": { - "type": "_sbcs", - "chars": "ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ" - }, - "ascii": { - "type": "_sbcs", - "chars": "��������������������������������������������������������������������������������������������������������������������������������" - }, - "tis620": { - "type": "_sbcs", - "chars": "���������������������������������กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����" - } -} - -/***/ }), -/* 142 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var Buffer = __webpack_require__(3).Buffer; - -// Multibyte codec. In this scheme, a character is represented by 1 or more bytes. -// Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences. -// To save memory and loading time, we read table files only when requested. - -exports._dbcs = DBCSCodec; - -var UNASSIGNED = -1, - GB18030_CODE = -2, - SEQ_START = -10, - NODE_START = -1000, - UNASSIGNED_NODE = new Array(0x100), - DEF_CHAR = -1; - -for (var i = 0; i < 0x100; i++) - UNASSIGNED_NODE[i] = UNASSIGNED; - - -// Class DBCSCodec reads and initializes mapping tables. -function DBCSCodec(codecOptions, iconv) { - this.encodingName = codecOptions.encodingName; - if (!codecOptions) - throw new Error("DBCS codec is called without the data.") - if (!codecOptions.table) - throw new Error("Encoding '" + this.encodingName + "' has no data."); - - // Load tables. - var mappingTable = codecOptions.table(); - - - // Decode tables: MBCS -> Unicode. - - // decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256. - // Trie root is decodeTables[0]. - // Values: >= 0 -> unicode character code. can be > 0xFFFF - // == UNASSIGNED -> unknown/unassigned sequence. - // == GB18030_CODE -> this is the end of a GB18030 4-byte sequence. - // <= NODE_START -> index of the next node in our trie to process next byte. - // <= SEQ_START -> index of the start of a character code sequence, in decodeTableSeq. - this.decodeTables = []; - this.decodeTables[0] = UNASSIGNED_NODE.slice(0); // Create root node. - - // Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here. - this.decodeTableSeq = []; - - // Actual mapping tables consist of chunks. Use them to fill up decode tables. - for (var i = 0; i < mappingTable.length; i++) - this._addDecodeChunk(mappingTable[i]); - - this.defaultCharUnicode = iconv.defaultCharUnicode; - - - // Encode tables: Unicode -> DBCS. - - // `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance. - // Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null. - // Values: >= 0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.). - // == UNASSIGNED -> no conversion found. Output a default char. - // <= SEQ_START -> it's an index in encodeTableSeq, see below. The character starts a sequence. - this.encodeTable = []; - - // `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of - // objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key - // means end of sequence (needed when one sequence is a strict subsequence of another). - // Objects are kept separately from encodeTable to increase performance. - this.encodeTableSeq = []; - - // Some chars can be decoded, but need not be encoded. - var skipEncodeChars = {}; - if (codecOptions.encodeSkipVals) - for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) { - var val = codecOptions.encodeSkipVals[i]; - if (typeof val === 'number') - skipEncodeChars[val] = true; - else - for (var j = val.from; j <= val.to; j++) - skipEncodeChars[j] = true; - } - - // Use decode trie to recursively fill out encode tables. - this._fillEncodeTable(0, 0, skipEncodeChars); - - // Add more encoding pairs when needed. - if (codecOptions.encodeAdd) { - for (var uChar in codecOptions.encodeAdd) - if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar)) - this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]); - } - - this.defCharSB = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)]; - if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]['?']; - if (this.defCharSB === UNASSIGNED) this.defCharSB = "?".charCodeAt(0); - - - // Load & create GB18030 tables when needed. - if (typeof codecOptions.gb18030 === 'function') { - this.gb18030 = codecOptions.gb18030(); // Load GB18030 ranges. - - // Add GB18030 decode tables. - var thirdByteNodeIdx = this.decodeTables.length; - var thirdByteNode = this.decodeTables[thirdByteNodeIdx] = UNASSIGNED_NODE.slice(0); - - var fourthByteNodeIdx = this.decodeTables.length; - var fourthByteNode = this.decodeTables[fourthByteNodeIdx] = UNASSIGNED_NODE.slice(0); - - for (var i = 0x81; i <= 0xFE; i++) { - var secondByteNodeIdx = NODE_START - this.decodeTables[0][i]; - var secondByteNode = this.decodeTables[secondByteNodeIdx]; - for (var j = 0x30; j <= 0x39; j++) - secondByteNode[j] = NODE_START - thirdByteNodeIdx; - } - for (var i = 0x81; i <= 0xFE; i++) - thirdByteNode[i] = NODE_START - fourthByteNodeIdx; - for (var i = 0x30; i <= 0x39; i++) - fourthByteNode[i] = GB18030_CODE - } -} - -DBCSCodec.prototype.encoder = DBCSEncoder; -DBCSCodec.prototype.decoder = DBCSDecoder; - -// Decoder helpers -DBCSCodec.prototype._getDecodeTrieNode = function(addr) { - var bytes = []; - for (; addr > 0; addr >>= 8) - bytes.push(addr & 0xFF); - if (bytes.length == 0) - bytes.push(0); - - var node = this.decodeTables[0]; - for (var i = bytes.length-1; i > 0; i--) { // Traverse nodes deeper into the trie. - var val = node[bytes[i]]; - - if (val == UNASSIGNED) { // Create new node. - node[bytes[i]] = NODE_START - this.decodeTables.length; - this.decodeTables.push(node = UNASSIGNED_NODE.slice(0)); - } - else if (val <= NODE_START) { // Existing node. - node = this.decodeTables[NODE_START - val]; - } - else - throw new Error("Overwrite byte in " + this.encodingName + ", addr: " + addr.toString(16)); - } - return node; -} - - -DBCSCodec.prototype._addDecodeChunk = function(chunk) { - // First element of chunk is the hex mbcs code where we start. - var curAddr = parseInt(chunk[0], 16); - - // Choose the decoding node where we'll write our chars. - var writeTable = this._getDecodeTrieNode(curAddr); - curAddr = curAddr & 0xFF; - - // Write all other elements of the chunk to the table. - for (var k = 1; k < chunk.length; k++) { - var part = chunk[k]; - if (typeof part === "string") { // String, write as-is. - for (var l = 0; l < part.length;) { - var code = part.charCodeAt(l++); - if (0xD800 <= code && code < 0xDC00) { // Decode surrogate - var codeTrail = part.charCodeAt(l++); - if (0xDC00 <= codeTrail && codeTrail < 0xE000) - writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00); - else - throw new Error("Incorrect surrogate pair in " + this.encodingName + " at chunk " + chunk[0]); - } - else if (0x0FF0 < code && code <= 0x0FFF) { // Character sequence (our own encoding used) - var len = 0xFFF - code + 2; - var seq = []; - for (var m = 0; m < len; m++) - seq.push(part.charCodeAt(l++)); // Simple variation: don't support surrogates or subsequences in seq. - - writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length; - this.decodeTableSeq.push(seq); - } - else - writeTable[curAddr++] = code; // Basic char - } - } - else if (typeof part === "number") { // Integer, meaning increasing sequence starting with prev character. - var charCode = writeTable[curAddr - 1] + 1; - for (var l = 0; l < part; l++) - writeTable[curAddr++] = charCode++; - } - else - throw new Error("Incorrect type '" + typeof part + "' given in " + this.encodingName + " at chunk " + chunk[0]); - } - if (curAddr > 0xFF) - throw new Error("Incorrect chunk in " + this.encodingName + " at addr " + chunk[0] + ": too long" + curAddr); -} - -// Encoder helpers -DBCSCodec.prototype._getEncodeBucket = function(uCode) { - var high = uCode >> 8; // This could be > 0xFF because of astral characters. - if (this.encodeTable[high] === undefined) - this.encodeTable[high] = UNASSIGNED_NODE.slice(0); // Create bucket on demand. - return this.encodeTable[high]; -} - -DBCSCodec.prototype._setEncodeChar = function(uCode, dbcsCode) { - var bucket = this._getEncodeBucket(uCode); - var low = uCode & 0xFF; - if (bucket[low] <= SEQ_START) - this.encodeTableSeq[SEQ_START-bucket[low]][DEF_CHAR] = dbcsCode; // There's already a sequence, set a single-char subsequence of it. - else if (bucket[low] == UNASSIGNED) - bucket[low] = dbcsCode; -} - -DBCSCodec.prototype._setEncodeSequence = function(seq, dbcsCode) { - - // Get the root of character tree according to first character of the sequence. - var uCode = seq[0]; - var bucket = this._getEncodeBucket(uCode); - var low = uCode & 0xFF; - - var node; - if (bucket[low] <= SEQ_START) { - // There's already a sequence with - use it. - node = this.encodeTableSeq[SEQ_START-bucket[low]]; - } - else { - // There was no sequence object - allocate a new one. - node = {}; - if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; // If a char was set before - make it a single-char subsequence. - bucket[low] = SEQ_START - this.encodeTableSeq.length; - this.encodeTableSeq.push(node); - } - - // Traverse the character tree, allocating new nodes as needed. - for (var j = 1; j < seq.length-1; j++) { - var oldVal = node[uCode]; - if (typeof oldVal === 'object') - node = oldVal; - else { - node = node[uCode] = {} - if (oldVal !== undefined) - node[DEF_CHAR] = oldVal - } - } - - // Set the leaf to given dbcsCode. - uCode = seq[seq.length-1]; - node[uCode] = dbcsCode; -} - -DBCSCodec.prototype._fillEncodeTable = function(nodeIdx, prefix, skipEncodeChars) { - var node = this.decodeTables[nodeIdx]; - for (var i = 0; i < 0x100; i++) { - var uCode = node[i]; - var mbCode = prefix + i; - if (skipEncodeChars[mbCode]) - continue; - - if (uCode >= 0) - this._setEncodeChar(uCode, mbCode); - else if (uCode <= NODE_START) - this._fillEncodeTable(NODE_START - uCode, mbCode << 8, skipEncodeChars); - else if (uCode <= SEQ_START) - this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode); - } -} - - - -// == Encoder ================================================================== - -function DBCSEncoder(options, codec) { - // Encoder state - this.leadSurrogate = -1; - this.seqObj = undefined; - - // Static data - this.encodeTable = codec.encodeTable; - this.encodeTableSeq = codec.encodeTableSeq; - this.defaultCharSingleByte = codec.defCharSB; - this.gb18030 = codec.gb18030; -} - -DBCSEncoder.prototype.write = function(str) { - var newBuf = new Buffer(str.length * (this.gb18030 ? 4 : 3)), - leadSurrogate = this.leadSurrogate, - seqObj = this.seqObj, nextChar = -1, - i = 0, j = 0; - - while (true) { - // 0. Get next character. - if (nextChar === -1) { - if (i == str.length) break; - var uCode = str.charCodeAt(i++); - } - else { - var uCode = nextChar; - nextChar = -1; - } - - // 1. Handle surrogates. - if (0xD800 <= uCode && uCode < 0xE000) { // Char is one of surrogates. - if (uCode < 0xDC00) { // We've got lead surrogate. - if (leadSurrogate === -1) { - leadSurrogate = uCode; - continue; - } else { - leadSurrogate = uCode; - // Double lead surrogate found. - uCode = UNASSIGNED; - } - } else { // We've got trail surrogate. - if (leadSurrogate !== -1) { - uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00); - leadSurrogate = -1; - } else { - // Incomplete surrogate pair - only trail surrogate found. - uCode = UNASSIGNED; - } - - } - } - else if (leadSurrogate !== -1) { - // Incomplete surrogate pair - only lead surrogate found. - nextChar = uCode; uCode = UNASSIGNED; // Write an error, then current char. - leadSurrogate = -1; - } - - // 2. Convert uCode character. - var dbcsCode = UNASSIGNED; - if (seqObj !== undefined && uCode != UNASSIGNED) { // We are in the middle of the sequence - var resCode = seqObj[uCode]; - if (typeof resCode === 'object') { // Sequence continues. - seqObj = resCode; - continue; - - } else if (typeof resCode == 'number') { // Sequence finished. Write it. - dbcsCode = resCode; - - } else if (resCode == undefined) { // Current character is not part of the sequence. - - // Try default character for this sequence - resCode = seqObj[DEF_CHAR]; - if (resCode !== undefined) { - dbcsCode = resCode; // Found. Write it. - nextChar = uCode; // Current character will be written too in the next iteration. - - } else { - // TODO: What if we have no default? (resCode == undefined) - // Then, we should write first char of the sequence as-is and try the rest recursively. - // Didn't do it for now because no encoding has this situation yet. - // Currently, just skip the sequence and write current char. - } - } - seqObj = undefined; - } - else if (uCode >= 0) { // Regular character - var subtable = this.encodeTable[uCode >> 8]; - if (subtable !== undefined) - dbcsCode = subtable[uCode & 0xFF]; - - if (dbcsCode <= SEQ_START) { // Sequence start - seqObj = this.encodeTableSeq[SEQ_START-dbcsCode]; - continue; - } - - if (dbcsCode == UNASSIGNED && this.gb18030) { - // Use GB18030 algorithm to find character(s) to write. - var idx = findIdx(this.gb18030.uChars, uCode); - if (idx != -1) { - var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx]); - newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); dbcsCode = dbcsCode % 12600; - newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); dbcsCode = dbcsCode % 1260; - newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); dbcsCode = dbcsCode % 10; - newBuf[j++] = 0x30 + dbcsCode; - continue; - } - } - } - - // 3. Write dbcsCode character. - if (dbcsCode === UNASSIGNED) - dbcsCode = this.defaultCharSingleByte; - - if (dbcsCode < 0x100) { - newBuf[j++] = dbcsCode; - } - else if (dbcsCode < 0x10000) { - newBuf[j++] = dbcsCode >> 8; // high byte - newBuf[j++] = dbcsCode & 0xFF; // low byte - } - else { - newBuf[j++] = dbcsCode >> 16; - newBuf[j++] = (dbcsCode >> 8) & 0xFF; - newBuf[j++] = dbcsCode & 0xFF; - } - } - - this.seqObj = seqObj; - this.leadSurrogate = leadSurrogate; - return newBuf.slice(0, j); -} - -DBCSEncoder.prototype.end = function() { - if (this.leadSurrogate === -1 && this.seqObj === undefined) - return; // All clean. Most often case. - - var newBuf = new Buffer(10), j = 0; - - if (this.seqObj) { // We're in the sequence. - var dbcsCode = this.seqObj[DEF_CHAR]; - if (dbcsCode !== undefined) { // Write beginning of the sequence. - if (dbcsCode < 0x100) { - newBuf[j++] = dbcsCode; - } - else { - newBuf[j++] = dbcsCode >> 8; // high byte - newBuf[j++] = dbcsCode & 0xFF; // low byte - } - } else { - // See todo above. - } - this.seqObj = undefined; - } - - if (this.leadSurrogate !== -1) { - // Incomplete surrogate pair - only lead surrogate found. - newBuf[j++] = this.defaultCharSingleByte; - this.leadSurrogate = -1; - } - - return newBuf.slice(0, j); -} - -// Export for testing -DBCSEncoder.prototype.findIdx = findIdx; - - -// == Decoder ================================================================== - -function DBCSDecoder(options, codec) { - // Decoder state - this.nodeIdx = 0; - this.prevBuf = new Buffer(0); - - // Static data - this.decodeTables = codec.decodeTables; - this.decodeTableSeq = codec.decodeTableSeq; - this.defaultCharUnicode = codec.defaultCharUnicode; - this.gb18030 = codec.gb18030; -} - -DBCSDecoder.prototype.write = function(buf) { - var newBuf = new Buffer(buf.length*2), - nodeIdx = this.nodeIdx, - prevBuf = this.prevBuf, prevBufOffset = this.prevBuf.length, - seqStart = -this.prevBuf.length, // idx of the start of current parsed sequence. - uCode; - - if (prevBufOffset > 0) // Make prev buf overlap a little to make it easier to slice later. - prevBuf = Buffer.concat([prevBuf, buf.slice(0, 10)]); - - for (var i = 0, j = 0; i < buf.length; i++) { - var curByte = (i >= 0) ? buf[i] : prevBuf[i + prevBufOffset]; - - // Lookup in current trie node. - var uCode = this.decodeTables[nodeIdx][curByte]; - - if (uCode >= 0) { - // Normal character, just use it. - } - else if (uCode === UNASSIGNED) { // Unknown char. - // TODO: Callback with seq. - //var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset); - i = seqStart; // Try to parse again, after skipping first byte of the sequence ('i' will be incremented by 'for' cycle). - uCode = this.defaultCharUnicode.charCodeAt(0); - } - else if (uCode === GB18030_CODE) { - var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset); - var ptr = (curSeq[0]-0x81)*12600 + (curSeq[1]-0x30)*1260 + (curSeq[2]-0x81)*10 + (curSeq[3]-0x30); - var idx = findIdx(this.gb18030.gbChars, ptr); - uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx]; - } - else if (uCode <= NODE_START) { // Go to next trie node. - nodeIdx = NODE_START - uCode; - continue; - } - else if (uCode <= SEQ_START) { // Output a sequence of chars. - var seq = this.decodeTableSeq[SEQ_START - uCode]; - for (var k = 0; k < seq.length - 1; k++) { - uCode = seq[k]; - newBuf[j++] = uCode & 0xFF; - newBuf[j++] = uCode >> 8; - } - uCode = seq[seq.length-1]; - } - else - throw new Error("iconv-lite internal error: invalid decoding table value " + uCode + " at " + nodeIdx + "/" + curByte); - - // Write the character to buffer, handling higher planes using surrogate pair. - if (uCode > 0xFFFF) { - uCode -= 0x10000; - var uCodeLead = 0xD800 + Math.floor(uCode / 0x400); - newBuf[j++] = uCodeLead & 0xFF; - newBuf[j++] = uCodeLead >> 8; - - uCode = 0xDC00 + uCode % 0x400; - } - newBuf[j++] = uCode & 0xFF; - newBuf[j++] = uCode >> 8; - - // Reset trie node. - nodeIdx = 0; seqStart = i+1; - } - - this.nodeIdx = nodeIdx; - this.prevBuf = (seqStart >= 0) ? buf.slice(seqStart) : prevBuf.slice(seqStart + prevBufOffset); - return newBuf.slice(0, j).toString('ucs2'); -} - -DBCSDecoder.prototype.end = function() { - var ret = ''; - - // Try to parse all remaining chars. - while (this.prevBuf.length > 0) { - // Skip 1 character in the buffer. - ret += this.defaultCharUnicode; - var buf = this.prevBuf.slice(1); - - // Parse remaining as usual. - this.prevBuf = new Buffer(0); - this.nodeIdx = 0; - if (buf.length > 0) - ret += this.write(buf); - } - - this.nodeIdx = 0; - return ret; -} - -// Binary search for GB18030. Returns largest i such that table[i] <= val. -function findIdx(table, val) { - if (table[0] > val) - return -1; - - var l = 0, r = table.length; - while (l < r-1) { // always table[l] <= val < table[r] - var mid = l + Math.floor((r-l+1)/2); - if (table[mid] <= val) - l = mid; - else - r = mid; - } - return l; -} - - - -/***/ }), -/* 143 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -// Description of supported double byte encodings and aliases. -// Tables are not require()-d until they are needed to speed up library load. -// require()-s are direct to support Browserify. - -module.exports = { - - // == Japanese/ShiftJIS ==================================================== - // All japanese encodings are based on JIS X set of standards: - // JIS X 0201 - Single-byte encoding of ASCII + ¥ + Kana chars at 0xA1-0xDF. - // JIS X 0208 - Main set of 6879 characters, placed in 94x94 plane, to be encoded by 2 bytes. - // Has several variations in 1978, 1983, 1990 and 1997. - // JIS X 0212 - Supplementary plane of 6067 chars in 94x94 plane. 1990. Effectively dead. - // JIS X 0213 - Extension and modern replacement of 0208 and 0212. Total chars: 11233. - // 2 planes, first is superset of 0208, second - revised 0212. - // Introduced in 2000, revised 2004. Some characters are in Unicode Plane 2 (0x2xxxx) - - // Byte encodings are: - // * Shift_JIS: Compatible with 0201, uses not defined chars in top half as lead bytes for double-byte - // encoding of 0208. Lead byte ranges: 0x81-0x9F, 0xE0-0xEF; Trail byte ranges: 0x40-0x7E, 0x80-0x9E, 0x9F-0xFC. - // Windows CP932 is a superset of Shift_JIS. Some companies added more chars, notably KDDI. - // * EUC-JP: Up to 3 bytes per character. Used mostly on *nixes. - // 0x00-0x7F - lower part of 0201 - // 0x8E, 0xA1-0xDF - upper part of 0201 - // (0xA1-0xFE)x2 - 0208 plane (94x94). - // 0x8F, (0xA1-0xFE)x2 - 0212 plane (94x94). - // * JIS X 208: 7-bit, direct encoding of 0208. Byte ranges: 0x21-0x7E (94 values). Uncommon. - // Used as-is in ISO2022 family. - // * ISO2022-JP: Stateful encoding, with escape sequences to switch between ASCII, - // 0201-1976 Roman, 0208-1978, 0208-1983. - // * ISO2022-JP-1: Adds esc seq for 0212-1990. - // * ISO2022-JP-2: Adds esc seq for GB2313-1980, KSX1001-1992, ISO8859-1, ISO8859-7. - // * ISO2022-JP-3: Adds esc seq for 0201-1976 Kana set, 0213-2000 Planes 1, 2. - // * ISO2022-JP-2004: Adds 0213-2004 Plane 1. - // - // After JIS X 0213 appeared, Shift_JIS-2004, EUC-JISX0213 and ISO2022-JP-2004 followed, with just changing the planes. - // - // Overall, it seems that it's a mess :( http://www8.plala.or.jp/tkubota1/unicode-symbols-map2.html - - 'shiftjis': { - type: '_dbcs', - table: function() { return __webpack_require__(144) }, - encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E}, - encodeSkipVals: [{from: 0xED40, to: 0xF940}], - }, - 'csshiftjis': 'shiftjis', - 'mskanji': 'shiftjis', - 'sjis': 'shiftjis', - 'windows31j': 'shiftjis', - 'ms31j': 'shiftjis', - 'xsjis': 'shiftjis', - 'windows932': 'shiftjis', - 'ms932': 'shiftjis', - '932': 'shiftjis', - 'cp932': 'shiftjis', - - 'eucjp': { - type: '_dbcs', - table: function() { return __webpack_require__(145) }, - encodeAdd: {'\u00a5': 0x5C, '\u203E': 0x7E}, - }, - - // TODO: KDDI extension to Shift_JIS - // TODO: IBM CCSID 942 = CP932, but F0-F9 custom chars and other char changes. - // TODO: IBM CCSID 943 = Shift_JIS = CP932 with original Shift_JIS lower 128 chars. - - - // == Chinese/GBK ========================================================== - // http://en.wikipedia.org/wiki/GBK - // We mostly implement W3C recommendation: https://www.w3.org/TR/encoding/#gbk-encoder - - // Oldest GB2312 (1981, ~7600 chars) is a subset of CP936 - 'gb2312': 'cp936', - 'gb231280': 'cp936', - 'gb23121980': 'cp936', - 'csgb2312': 'cp936', - 'csiso58gb231280': 'cp936', - 'euccn': 'cp936', - - // Microsoft's CP936 is a subset and approximation of GBK. - 'windows936': 'cp936', - 'ms936': 'cp936', - '936': 'cp936', - 'cp936': { - type: '_dbcs', - table: function() { return __webpack_require__(49) }, - }, - - // GBK (~22000 chars) is an extension of CP936 that added user-mapped chars and some other. - 'gbk': { - type: '_dbcs', - table: function() { return __webpack_require__(49).concat(__webpack_require__(81)) }, - }, - 'xgbk': 'gbk', - 'isoir58': 'gbk', - - // GB18030 is an algorithmic extension of GBK. - // Main source: https://www.w3.org/TR/encoding/#gbk-encoder - // http://icu-project.org/docs/papers/gb18030.html - // http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml - // http://www.khngai.com/chinese/charmap/tblgbk.php?page=0 - 'gb18030': { - type: '_dbcs', - table: function() { return __webpack_require__(49).concat(__webpack_require__(81)) }, - gb18030: function() { return __webpack_require__(146) }, - encodeSkipVals: [0x80], - encodeAdd: {'€': 0xA2E3}, - }, - - 'chinese': 'gb18030', - - - // == Korean =============================================================== - // EUC-KR, KS_C_5601 and KS X 1001 are exactly the same. - 'windows949': 'cp949', - 'ms949': 'cp949', - '949': 'cp949', - 'cp949': { - type: '_dbcs', - table: function() { return __webpack_require__(147) }, - }, - - 'cseuckr': 'cp949', - 'csksc56011987': 'cp949', - 'euckr': 'cp949', - 'isoir149': 'cp949', - 'korean': 'cp949', - 'ksc56011987': 'cp949', - 'ksc56011989': 'cp949', - 'ksc5601': 'cp949', - - - // == Big5/Taiwan/Hong Kong ================================================ - // There are lots of tables for Big5 and cp950. Please see the following links for history: - // http://moztw.org/docs/big5/ http://www.haible.de/bruno/charsets/conversion-tables/Big5.html - // Variations, in roughly number of defined chars: - // * Windows CP 950: Microsoft variant of Big5. Canonical: http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT - // * Windows CP 951: Microsoft variant of Big5-HKSCS-2001. Seems to be never public. http://me.abelcheung.org/articles/research/what-is-cp951/ - // * Big5-2003 (Taiwan standard) almost superset of cp950. - // * Unicode-at-on (UAO) / Mozilla 1.8. Falling out of use on the Web. Not supported by other browsers. - // * Big5-HKSCS (-2001, -2004, -2008). Hong Kong standard. - // many unicode code points moved from PUA to Supplementary plane (U+2XXXX) over the years. - // Plus, it has 4 combining sequences. - // Seems that Mozilla refused to support it for 10 yrs. https://bugzilla.mozilla.org/show_bug.cgi?id=162431 https://bugzilla.mozilla.org/show_bug.cgi?id=310299 - // because big5-hkscs is the only encoding to include astral characters in non-algorithmic way. - // Implementations are not consistent within browsers; sometimes labeled as just big5. - // MS Internet Explorer switches from big5 to big5-hkscs when a patch applied. - // Great discussion & recap of what's going on https://bugzilla.mozilla.org/show_bug.cgi?id=912470#c31 - // In the encoder, it might make sense to support encoding old PUA mappings to Big5 bytes seq-s. - // Official spec: http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/2003cmp_2008.txt - // http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/terms/doc/hkscs-2008-big5-iso.txt - // - // Current understanding of how to deal with Big5(-HKSCS) is in the Encoding Standard, http://encoding.spec.whatwg.org/#big5-encoder - // Unicode mapping (http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT) is said to be wrong. - - 'windows950': 'cp950', - 'ms950': 'cp950', - '950': 'cp950', - 'cp950': { - type: '_dbcs', - table: function() { return __webpack_require__(82) }, - }, - - // Big5 has many variations and is an extension of cp950. We use Encoding Standard's as a consensus. - 'big5': 'big5hkscs', - 'big5hkscs': { - type: '_dbcs', - table: function() { return __webpack_require__(82).concat(__webpack_require__(148)) }, - encodeSkipVals: [0xa2cc], - }, - - 'cnbig5': 'big5hkscs', - 'csbig5': 'big5hkscs', - 'xxbig5': 'big5hkscs', -}; - - -/***/ }), -/* 144 */ -/***/ (function(module, exports) { - -module.exports = [["0","\u0000",128],["a1","。",62],["8140"," 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈",9,"+-±×"],["8180","÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓"],["81b8","∈∋⊆⊇⊂⊃∪∩"],["81c8","∧∨¬⇒⇔∀∃"],["81da","∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬"],["81f0","ʼn♯♭♪†‡¶"],["81fc","◯"],["824f","0",9],["8260","A",25],["8281","a",25],["829f","ぁ",82],["8340","ァ",62],["8380","ム",22],["839f","Α",16,"Σ",6],["83bf","α",16,"σ",6],["8440","А",5,"ЁЖ",25],["8470","а",5,"ёж",7],["8480","о",17],["849f","─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂"],["8740","①",19,"Ⅰ",9],["875f","㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡"],["877e","㍻"],["8780","〝〟№㏍℡㊤",4,"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪"],["889f","亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭"],["8940","院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円"],["8980","園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改"],["8a40","魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫"],["8a80","橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄"],["8b40","機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救"],["8b80","朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈"],["8c40","掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨"],["8c80","劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向"],["8d40","后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降"],["8d80","項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷"],["8e40","察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止"],["8e80","死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周"],["8f40","宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳"],["8f80","準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾"],["9040","拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨"],["9080","逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線"],["9140","繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻"],["9180","操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只"],["9240","叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄"],["9280","逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓"],["9340","邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬"],["9380","凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入"],["9440","如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅"],["9480","楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美"],["9540","鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷"],["9580","斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋"],["9640","法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆"],["9680","摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒"],["9740","諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲"],["9780","沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯"],["9840","蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕"],["989f","弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲"],["9940","僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭"],["9980","凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨"],["9a40","咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸"],["9a80","噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩"],["9b40","奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀"],["9b80","它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏"],["9c40","廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠"],["9c80","怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛"],["9d40","戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫"],["9d80","捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼"],["9e40","曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎"],["9e80","梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣"],["9f40","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯"],["9f80","麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌"],["e040","漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝"],["e080","烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱"],["e140","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿"],["e180","痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],["e240","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰"],["e280","窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆"],["e340","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷"],["e380","縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋"],["e440","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤"],["e480","艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],["e540","蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬"],["e580","蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞"],["e640","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧"],["e680","諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊"],["e740","蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜"],["e780","轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮"],["e840","錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙"],["e880","閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰"],["e940","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃"],["e980","騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈"],["ea40","鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯"],["ea80","黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙"],["ed40","纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏"],["ed80","塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱"],["ee40","犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙"],["ee80","蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"],["eeef","ⅰ",9,"¬¦'""],["f040","",62],["f080","",124],["f140","",62],["f180","",124],["f240","",62],["f280","",124],["f340","",62],["f380","",124],["f440","",62],["f480","",124],["f540","",62],["f580","",124],["f640","",62],["f680","",124],["f740","",62],["f780","",124],["f840","",62],["f880","",124],["f940",""],["fa40","ⅰ",9,"Ⅰ",9,"¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊"],["fa80","兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯"],["fb40","涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神"],["fb80","祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙"],["fc40","髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"]] - -/***/ }), -/* 145 */ -/***/ (function(module, exports) { - -module.exports = [["0","\u0000",127],["8ea1","。",62],["a1a1"," 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈",9,"+-±×÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇"],["a2a1","◆□■△▲▽▼※〒→←↑↓〓"],["a2ba","∈∋⊆⊇⊂⊃∪∩"],["a2ca","∧∨¬⇒⇔∀∃"],["a2dc","∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬"],["a2f2","ʼn♯♭♪†‡¶"],["a2fe","◯"],["a3b0","0",9],["a3c1","A",25],["a3e1","a",25],["a4a1","ぁ",82],["a5a1","ァ",85],["a6a1","Α",16,"Σ",6],["a6c1","α",16,"σ",6],["a7a1","А",5,"ЁЖ",25],["a7d1","а",5,"ёж",25],["a8a1","─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂"],["ada1","①",19,"Ⅰ",9],["adc0","㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡"],["addf","㍻〝〟№㏍℡㊤",4,"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪"],["b0a1","亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭"],["b1a1","院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応"],["b2a1","押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改"],["b3a1","魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱"],["b4a1","粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄"],["b5a1","機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京"],["b6a1","供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈"],["b7a1","掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲"],["b8a1","検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向"],["b9a1","后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込"],["baa1","此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷"],["bba1","察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時"],["bca1","次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周"],["bda1","宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償"],["bea1","勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾"],["bfa1","拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾"],["c0a1","澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線"],["c1a1","繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎"],["c2a1","臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只"],["c3a1","叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵"],["c4a1","帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓"],["c5a1","邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到"],["c6a1","董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入"],["c7a1","如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦"],["c8a1","函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美"],["c9a1","鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服"],["caa1","福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋"],["cba1","法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満"],["cca1","漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒"],["cda1","諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃"],["cea1","痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯"],["cfa1","蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕"],["d0a1","弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲"],["d1a1","僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨"],["d2a1","辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨"],["d3a1","咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉"],["d4a1","圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩"],["d5a1","奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓"],["d6a1","屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏"],["d7a1","廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚"],["d8a1","悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛"],["d9a1","戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼"],["daa1","據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼"],["dba1","曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍"],["dca1","棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣"],["dda1","檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾"],["dea1","沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌"],["dfa1","漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼"],["e0a1","燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱"],["e1a1","瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰"],["e2a1","癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬"],["e3a1","磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐"],["e4a1","筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆"],["e5a1","紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺"],["e6a1","罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋"],["e7a1","隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙"],["e8a1","茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈"],["e9a1","蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙"],["eaa1","蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞"],["eba1","襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫"],["eca1","譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊"],["eda1","蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸"],["eea1","遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮"],["efa1","錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞"],["f0a1","陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰"],["f1a1","顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷"],["f2a1","髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈"],["f3a1","鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠"],["f4a1","堯槇遙瑤凜熙"],["f9a1","纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德"],["faa1","忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱"],["fba1","犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚"],["fca1","釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑"],["fcf1","ⅰ",9,"¬¦'""],["8fa2af","˘ˇ¸˙˝¯˛˚~΄΅"],["8fa2c2","¡¦¿"],["8fa2eb","ºª©®™¤№"],["8fa6e1","ΆΈΉΊΪ"],["8fa6e7","Ό"],["8fa6e9","ΎΫ"],["8fa6ec","Ώ"],["8fa6f1","άέήίϊΐόςύϋΰώ"],["8fa7c2","Ђ",10,"ЎЏ"],["8fa7f2","ђ",10,"ўџ"],["8fa9a1","ÆĐ"],["8fa9a4","Ħ"],["8fa9a6","IJ"],["8fa9a8","ŁĿ"],["8fa9ab","ŊØŒ"],["8fa9af","ŦÞ"],["8fa9c1","æđðħıijĸłŀʼnŋøœßŧþ"],["8faaa1","ÁÀÄÂĂǍĀĄÅÃĆĈČÇĊĎÉÈËÊĚĖĒĘ"],["8faaba","ĜĞĢĠĤÍÌÏÎǏİĪĮĨĴĶĹĽĻŃŇŅÑÓÒÖÔǑŐŌÕŔŘŖŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙǕŴÝŸŶŹŽŻ"],["8faba1","áàäâăǎāąåãćĉčçċďéèëêěėēęǵĝğ"],["8fabbd","ġĥíìïîǐ"],["8fabc5","īįĩĵķĺľļńňņñóòöôǒőōõŕřŗśŝšşťţúùüûŭǔűūųůũǘǜǚǖŵýÿŷźžż"],["8fb0a1","丂丄丅丌丒丟丣两丨丫丮丯丰丵乀乁乄乇乑乚乜乣乨乩乴乵乹乿亍亖亗亝亯亹仃仐仚仛仠仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘佟佣佪佬佮佱佷佸佹佺佽佾侁侂侄"],["8fb1a1","侅侉侊侌侎侐侒侓侔侗侙侚侞侟侲侷侹侻侼侽侾俀俁俅俆俈俉俋俌俍俏俒俜俠俢俰俲俼俽俿倀倁倄倇倊倌倎倐倓倗倘倛倜倝倞倢倧倮倰倲倳倵偀偁偂偅偆偊偌偎偑偒偓偗偙偟偠偢偣偦偧偪偭偰偱倻傁傃傄傆傊傎傏傐"],["8fb2a1","傒傓傔傖傛傜傞",4,"傪傯傰傹傺傽僀僃僄僇僌僎僐僓僔僘僜僝僟僢僤僦僨僩僯僱僶僺僾儃儆儇儈儋儌儍儎僲儐儗儙儛儜儝儞儣儧儨儬儭儯儱儳儴儵儸儹兂兊兏兓兕兗兘兟兤兦兾冃冄冋冎冘冝冡冣冭冸冺冼冾冿凂"],["8fb3a1","凈减凑凒凓凕凘凞凢凥凮凲凳凴凷刁刂刅划刓刕刖刘刢刨刱刲刵刼剅剉剕剗剘剚剜剟剠剡剦剮剷剸剹劀劂劅劊劌劓劕劖劗劘劚劜劤劥劦劧劯劰劶劷劸劺劻劽勀勄勆勈勌勏勑勔勖勛勜勡勥勨勩勪勬勰勱勴勶勷匀匃匊匋"],["8fb4a1","匌匑匓匘匛匜匞匟匥匧匨匩匫匬匭匰匲匵匼匽匾卂卌卋卙卛卡卣卥卬卭卲卹卾厃厇厈厎厓厔厙厝厡厤厪厫厯厲厴厵厷厸厺厽叀叅叏叒叓叕叚叝叞叠另叧叵吂吓吚吡吧吨吪启吱吴吵呃呄呇呍呏呞呢呤呦呧呩呫呭呮呴呿"],["8fb5a1","咁咃咅咈咉咍咑咕咖咜咟咡咦咧咩咪咭咮咱咷咹咺咻咿哆哊响哎哠哪哬哯哶哼哾哿唀唁唅唈唉唌唍唎唕唪唫唲唵唶唻唼唽啁啇啉啊啍啐啑啘啚啛啞啠啡啤啦啿喁喂喆喈喎喏喑喒喓喔喗喣喤喭喲喿嗁嗃嗆嗉嗋嗌嗎嗑嗒"],["8fb6a1","嗓嗗嗘嗛嗞嗢嗩嗶嗿嘅嘈嘊嘍",5,"嘙嘬嘰嘳嘵嘷嘹嘻嘼嘽嘿噀噁噃噄噆噉噋噍噏噔噞噠噡噢噣噦噩噭噯噱噲噵嚄嚅嚈嚋嚌嚕嚙嚚嚝嚞嚟嚦嚧嚨嚩嚫嚬嚭嚱嚳嚷嚾囅囉囊囋囏囐囌囍囙囜囝囟囡囤",4,"囱囫园"],["8fb7a1","囶囷圁圂圇圊圌圑圕圚圛圝圠圢圣圤圥圩圪圬圮圯圳圴圽圾圿坅坆坌坍坒坢坥坧坨坫坭",4,"坳坴坵坷坹坺坻坼坾垁垃垌垔垗垙垚垜垝垞垟垡垕垧垨垩垬垸垽埇埈埌埏埕埝埞埤埦埧埩埭埰埵埶埸埽埾埿堃堄堈堉埡"],["8fb8a1","堌堍堛堞堟堠堦堧堭堲堹堿塉塌塍塏塐塕塟塡塤塧塨塸塼塿墀墁墇墈墉墊墌墍墏墐墔墖墝墠墡墢墦墩墱墲壄墼壂壈壍壎壐壒壔壖壚壝壡壢壩壳夅夆夋夌夒夓夔虁夝夡夣夤夨夯夰夳夵夶夿奃奆奒奓奙奛奝奞奟奡奣奫奭"],["8fb9a1","奯奲奵奶她奻奼妋妌妎妒妕妗妟妤妧妭妮妯妰妳妷妺妼姁姃姄姈姊姍姒姝姞姟姣姤姧姮姯姱姲姴姷娀娄娌娍娎娒娓娞娣娤娧娨娪娭娰婄婅婇婈婌婐婕婞婣婥婧婭婷婺婻婾媋媐媓媖媙媜媞媟媠媢媧媬媱媲媳媵媸媺媻媿"],["8fbaa1","嫄嫆嫈嫏嫚嫜嫠嫥嫪嫮嫵嫶嫽嬀嬁嬈嬗嬴嬙嬛嬝嬡嬥嬭嬸孁孋孌孒孖孞孨孮孯孼孽孾孿宁宄宆宊宎宐宑宓宔宖宨宩宬宭宯宱宲宷宺宼寀寁寍寏寖",4,"寠寯寱寴寽尌尗尞尟尣尦尩尫尬尮尰尲尵尶屙屚屜屢屣屧屨屩"],["8fbba1","屭屰屴屵屺屻屼屽岇岈岊岏岒岝岟岠岢岣岦岪岲岴岵岺峉峋峒峝峗峮峱峲峴崁崆崍崒崫崣崤崦崧崱崴崹崽崿嵂嵃嵆嵈嵕嵑嵙嵊嵟嵠嵡嵢嵤嵪嵭嵰嵹嵺嵾嵿嶁嶃嶈嶊嶒嶓嶔嶕嶙嶛嶟嶠嶧嶫嶰嶴嶸嶹巃巇巋巐巎巘巙巠巤"],["8fbca1","巩巸巹帀帇帍帒帔帕帘帟帠帮帨帲帵帾幋幐幉幑幖幘幛幜幞幨幪",4,"幰庀庋庎庢庤庥庨庪庬庱庳庽庾庿廆廌廋廎廑廒廔廕廜廞廥廫异弆弇弈弎弙弜弝弡弢弣弤弨弫弬弮弰弴弶弻弽弿彀彄彅彇彍彐彔彘彛彠彣彤彧"],["8fbda1","彯彲彴彵彸彺彽彾徉徍徏徖徜徝徢徧徫徤徬徯徰徱徸忄忇忈忉忋忐",4,"忞忡忢忨忩忪忬忭忮忯忲忳忶忺忼怇怊怍怓怔怗怘怚怟怤怭怳怵恀恇恈恉恌恑恔恖恗恝恡恧恱恾恿悂悆悈悊悎悑悓悕悘悝悞悢悤悥您悰悱悷"],["8fbea1","悻悾惂惄惈惉惊惋惎惏惔惕惙惛惝惞惢惥惲惵惸惼惽愂愇愊愌愐",4,"愖愗愙愜愞愢愪愫愰愱愵愶愷愹慁慅慆慉慞慠慬慲慸慻慼慿憀憁憃憄憋憍憒憓憗憘憜憝憟憠憥憨憪憭憸憹憼懀懁懂懎懏懕懜懝懞懟懡懢懧懩懥"],["8fbfa1","懬懭懯戁戃戄戇戓戕戜戠戢戣戧戩戫戹戽扂扃扄扆扌扐扑扒扔扖扚扜扤扭扯扳扺扽抍抎抏抐抦抨抳抶抷抺抾抿拄拎拕拖拚拪拲拴拼拽挃挄挊挋挍挐挓挖挘挩挪挭挵挶挹挼捁捂捃捄捆捊捋捎捒捓捔捘捛捥捦捬捭捱捴捵"],["8fc0a1","捸捼捽捿掂掄掇掊掐掔掕掙掚掞掤掦掭掮掯掽揁揅揈揎揑揓揔揕揜揠揥揪揬揲揳揵揸揹搉搊搐搒搔搘搞搠搢搤搥搩搪搯搰搵搽搿摋摏摑摒摓摔摚摛摜摝摟摠摡摣摭摳摴摻摽撅撇撏撐撑撘撙撛撝撟撡撣撦撨撬撳撽撾撿"],["8fc1a1","擄擉擊擋擌擎擐擑擕擗擤擥擩擪擭擰擵擷擻擿攁攄攈攉攊攏攓攔攖攙攛攞攟攢攦攩攮攱攺攼攽敃敇敉敐敒敔敟敠敧敫敺敽斁斅斊斒斕斘斝斠斣斦斮斲斳斴斿旂旈旉旎旐旔旖旘旟旰旲旴旵旹旾旿昀昄昈昉昍昑昒昕昖昝"],["8fc2a1","昞昡昢昣昤昦昩昪昫昬昮昰昱昳昹昷晀晅晆晊晌晑晎晗晘晙晛晜晠晡曻晪晫晬晾晳晵晿晷晸晹晻暀晼暋暌暍暐暒暙暚暛暜暟暠暤暭暱暲暵暻暿曀曂曃曈曌曎曏曔曛曟曨曫曬曮曺朅朇朎朓朙朜朠朢朳朾杅杇杈杌杔杕杝"],["8fc3a1","杦杬杮杴杶杻极构枎枏枑枓枖枘枙枛枰枱枲枵枻枼枽柹柀柂柃柅柈柉柒柗柙柜柡柦柰柲柶柷桒栔栙栝栟栨栧栬栭栯栰栱栳栻栿桄桅桊桌桕桗桘桛桫桮",4,"桵桹桺桻桼梂梄梆梈梖梘梚梜梡梣梥梩梪梮梲梻棅棈棌棏"],["8fc4a1","棐棑棓棖棙棜棝棥棨棪棫棬棭棰棱棵棶棻棼棽椆椉椊椐椑椓椖椗椱椳椵椸椻楂楅楉楎楗楛楣楤楥楦楨楩楬楰楱楲楺楻楿榀榍榒榖榘榡榥榦榨榫榭榯榷榸榺榼槅槈槑槖槗槢槥槮槯槱槳槵槾樀樁樃樏樑樕樚樝樠樤樨樰樲"],["8fc5a1","樴樷樻樾樿橅橆橉橊橎橐橑橒橕橖橛橤橧橪橱橳橾檁檃檆檇檉檋檑檛檝檞檟檥檫檯檰檱檴檽檾檿櫆櫉櫈櫌櫐櫔櫕櫖櫜櫝櫤櫧櫬櫰櫱櫲櫼櫽欂欃欆欇欉欏欐欑欗欛欞欤欨欫欬欯欵欶欻欿歆歊歍歒歖歘歝歠歧歫歮歰歵歽"],["8fc6a1","歾殂殅殗殛殟殠殢殣殨殩殬殭殮殰殸殹殽殾毃毄毉毌毖毚毡毣毦毧毮毱毷毹毿氂氄氅氉氍氎氐氒氙氟氦氧氨氬氮氳氵氶氺氻氿汊汋汍汏汒汔汙汛汜汫汭汯汴汶汸汹汻沅沆沇沉沔沕沗沘沜沟沰沲沴泂泆泍泏泐泑泒泔泖"],["8fc7a1","泚泜泠泧泩泫泬泮泲泴洄洇洊洎洏洑洓洚洦洧洨汧洮洯洱洹洼洿浗浞浟浡浥浧浯浰浼涂涇涑涒涔涖涗涘涪涬涴涷涹涽涿淄淈淊淎淏淖淛淝淟淠淢淥淩淯淰淴淶淼渀渄渞渢渧渲渶渹渻渼湄湅湈湉湋湏湑湒湓湔湗湜湝湞"],["8fc8a1","湢湣湨湳湻湽溍溓溙溠溧溭溮溱溳溻溿滀滁滃滇滈滊滍滎滏滫滭滮滹滻滽漄漈漊漌漍漖漘漚漛漦漩漪漯漰漳漶漻漼漭潏潑潒潓潗潙潚潝潞潡潢潨潬潽潾澃澇澈澋澌澍澐澒澓澔澖澚澟澠澥澦澧澨澮澯澰澵澶澼濅濇濈濊"],["8fc9a1","濚濞濨濩濰濵濹濼濽瀀瀅瀆瀇瀍瀗瀠瀣瀯瀴瀷瀹瀼灃灄灈灉灊灋灔灕灝灞灎灤灥灬灮灵灶灾炁炅炆炔",4,"炛炤炫炰炱炴炷烊烑烓烔烕烖烘烜烤烺焃",4,"焋焌焏焞焠焫焭焯焰焱焸煁煅煆煇煊煋煐煒煗煚煜煞煠"],["8fcaa1","煨煹熀熅熇熌熒熚熛熠熢熯熰熲熳熺熿燀燁燄燋燌燓燖燙燚燜燸燾爀爇爈爉爓爗爚爝爟爤爫爯爴爸爹牁牂牃牅牎牏牐牓牕牖牚牜牞牠牣牨牫牮牯牱牷牸牻牼牿犄犉犍犎犓犛犨犭犮犱犴犾狁狇狉狌狕狖狘狟狥狳狴狺狻"],["8fcba1","狾猂猄猅猇猋猍猒猓猘猙猞猢猤猧猨猬猱猲猵猺猻猽獃獍獐獒獖獘獝獞獟獠獦獧獩獫獬獮獯獱獷獹獼玀玁玃玅玆玎玐玓玕玗玘玜玞玟玠玢玥玦玪玫玭玵玷玹玼玽玿珅珆珉珋珌珏珒珓珖珙珝珡珣珦珧珩珴珵珷珹珺珻珽"],["8fcca1","珿琀琁琄琇琊琑琚琛琤琦琨",9,"琹瑀瑃瑄瑆瑇瑋瑍瑑瑒瑗瑝瑢瑦瑧瑨瑫瑭瑮瑱瑲璀璁璅璆璇璉璏璐璑璒璘璙璚璜璟璠璡璣璦璨璩璪璫璮璯璱璲璵璹璻璿瓈瓉瓌瓐瓓瓘瓚瓛瓞瓟瓤瓨瓪瓫瓯瓴瓺瓻瓼瓿甆"],["8fcda1","甒甖甗甠甡甤甧甩甪甯甶甹甽甾甿畀畃畇畈畎畐畒畗畞畟畡畯畱畹",5,"疁疅疐疒疓疕疙疜疢疤疴疺疿痀痁痄痆痌痎痏痗痜痟痠痡痤痧痬痮痯痱痹瘀瘂瘃瘄瘇瘈瘊瘌瘏瘒瘓瘕瘖瘙瘛瘜瘝瘞瘣瘥瘦瘩瘭瘲瘳瘵瘸瘹"],["8fcea1","瘺瘼癊癀癁癃癄癅癉癋癕癙癟癤癥癭癮癯癱癴皁皅皌皍皕皛皜皝皟皠皢",6,"皪皭皽盁盅盉盋盌盎盔盙盠盦盨盬盰盱盶盹盼眀眆眊眎眒眔眕眗眙眚眜眢眨眭眮眯眴眵眶眹眽眾睂睅睆睊睍睎睏睒睖睗睜睞睟睠睢"],["8fcfa1","睤睧睪睬睰睲睳睴睺睽瞀瞄瞌瞍瞔瞕瞖瞚瞟瞢瞧瞪瞮瞯瞱瞵瞾矃矉矑矒矕矙矞矟矠矤矦矪矬矰矱矴矸矻砅砆砉砍砎砑砝砡砢砣砭砮砰砵砷硃硄硇硈硌硎硒硜硞硠硡硣硤硨硪确硺硾碊碏碔碘碡碝碞碟碤碨碬碭碰碱碲碳"],["8fd0a1","碻碽碿磇磈磉磌磎磒磓磕磖磤磛磟磠磡磦磪磲磳礀磶磷磺磻磿礆礌礐礚礜礞礟礠礥礧礩礭礱礴礵礻礽礿祄祅祆祊祋祏祑祔祘祛祜祧祩祫祲祹祻祼祾禋禌禑禓禔禕禖禘禛禜禡禨禩禫禯禱禴禸离秂秄秇秈秊秏秔秖秚秝秞"],["8fd1a1","秠秢秥秪秫秭秱秸秼稂稃稇稉稊稌稑稕稛稞稡稧稫稭稯稰稴稵稸稹稺穄穅穇穈穌穕穖穙穜穝穟穠穥穧穪穭穵穸穾窀窂窅窆窊窋窐窑窔窞窠窣窬窳窵窹窻窼竆竉竌竎竑竛竨竩竫竬竱竴竻竽竾笇笔笟笣笧笩笪笫笭笮笯笰"],["8fd2a1","笱笴笽笿筀筁筇筎筕筠筤筦筩筪筭筯筲筳筷箄箉箎箐箑箖箛箞箠箥箬箯箰箲箵箶箺箻箼箽篂篅篈篊篔篖篗篙篚篛篨篪篲篴篵篸篹篺篼篾簁簂簃簄簆簉簋簌簎簏簙簛簠簥簦簨簬簱簳簴簶簹簺籆籊籕籑籒籓籙",5],["8fd3a1","籡籣籧籩籭籮籰籲籹籼籽粆粇粏粔粞粠粦粰粶粷粺粻粼粿糄糇糈糉糍糏糓糔糕糗糙糚糝糦糩糫糵紃紇紈紉紏紑紒紓紖紝紞紣紦紪紭紱紼紽紾絀絁絇絈絍絑絓絗絙絚絜絝絥絧絪絰絸絺絻絿綁綂綃綅綆綈綋綌綍綑綖綗綝"],["8fd4a1","綞綦綧綪綳綶綷綹緂",4,"緌緍緎緗緙縀緢緥緦緪緫緭緱緵緶緹緺縈縐縑縕縗縜縝縠縧縨縬縭縯縳縶縿繄繅繇繎繐繒繘繟繡繢繥繫繮繯繳繸繾纁纆纇纊纍纑纕纘纚纝纞缼缻缽缾缿罃罄罇罏罒罓罛罜罝罡罣罤罥罦罭"],["8fd5a1","罱罽罾罿羀羋羍羏羐羑羖羗羜羡羢羦羪羭羴羼羿翀翃翈翎翏翛翟翣翥翨翬翮翯翲翺翽翾翿耇耈耊耍耎耏耑耓耔耖耝耞耟耠耤耦耬耮耰耴耵耷耹耺耼耾聀聄聠聤聦聭聱聵肁肈肎肜肞肦肧肫肸肹胈胍胏胒胔胕胗胘胠胭胮"],["8fd6a1","胰胲胳胶胹胺胾脃脋脖脗脘脜脞脠脤脧脬脰脵脺脼腅腇腊腌腒腗腠腡腧腨腩腭腯腷膁膐膄膅膆膋膎膖膘膛膞膢膮膲膴膻臋臃臅臊臎臏臕臗臛臝臞臡臤臫臬臰臱臲臵臶臸臹臽臿舀舃舏舓舔舙舚舝舡舢舨舲舴舺艃艄艅艆"],["8fd7a1","艋艎艏艑艖艜艠艣艧艭艴艻艽艿芀芁芃芄芇芉芊芎芑芔芖芘芚芛芠芡芣芤芧芨芩芪芮芰芲芴芷芺芼芾芿苆苐苕苚苠苢苤苨苪苭苯苶苷苽苾茀茁茇茈茊茋荔茛茝茞茟茡茢茬茭茮茰茳茷茺茼茽荂荃荄荇荍荎荑荕荖荗荰荸"],["8fd8a1","荽荿莀莂莄莆莍莒莔莕莘莙莛莜莝莦莧莩莬莾莿菀菇菉菏菐菑菔菝荓菨菪菶菸菹菼萁萆萊萏萑萕萙莭萯萹葅葇葈葊葍葏葑葒葖葘葙葚葜葠葤葥葧葪葰葳葴葶葸葼葽蒁蒅蒒蒓蒕蒞蒦蒨蒩蒪蒯蒱蒴蒺蒽蒾蓀蓂蓇蓈蓌蓏蓓"],["8fd9a1","蓜蓧蓪蓯蓰蓱蓲蓷蔲蓺蓻蓽蔂蔃蔇蔌蔎蔐蔜蔞蔢蔣蔤蔥蔧蔪蔫蔯蔳蔴蔶蔿蕆蕏",4,"蕖蕙蕜",6,"蕤蕫蕯蕹蕺蕻蕽蕿薁薅薆薉薋薌薏薓薘薝薟薠薢薥薧薴薶薷薸薼薽薾薿藂藇藊藋藎薭藘藚藟藠藦藨藭藳藶藼"],["8fdaa1","藿蘀蘄蘅蘍蘎蘐蘑蘒蘘蘙蘛蘞蘡蘧蘩蘶蘸蘺蘼蘽虀虂虆虒虓虖虗虘虙虝虠",4,"虩虬虯虵虶虷虺蚍蚑蚖蚘蚚蚜蚡蚦蚧蚨蚭蚱蚳蚴蚵蚷蚸蚹蚿蛀蛁蛃蛅蛑蛒蛕蛗蛚蛜蛠蛣蛥蛧蚈蛺蛼蛽蜄蜅蜇蜋蜎蜏蜐蜓蜔蜙蜞蜟蜡蜣"],["8fdba1","蜨蜮蜯蜱蜲蜹蜺蜼蜽蜾蝀蝃蝅蝍蝘蝝蝡蝤蝥蝯蝱蝲蝻螃",6,"螋螌螐螓螕螗螘螙螞螠螣螧螬螭螮螱螵螾螿蟁蟈蟉蟊蟎蟕蟖蟙蟚蟜蟟蟢蟣蟤蟪蟫蟭蟱蟳蟸蟺蟿蠁蠃蠆蠉蠊蠋蠐蠙蠒蠓蠔蠘蠚蠛蠜蠞蠟蠨蠭蠮蠰蠲蠵"],["8fdca1","蠺蠼衁衃衅衈衉衊衋衎衑衕衖衘衚衜衟衠衤衩衱衹衻袀袘袚袛袜袟袠袨袪袺袽袾裀裊",4,"裑裒裓裛裞裧裯裰裱裵裷褁褆褍褎褏褕褖褘褙褚褜褠褦褧褨褰褱褲褵褹褺褾襀襂襅襆襉襏襒襗襚襛襜襡襢襣襫襮襰襳襵襺"],["8fdda1","襻襼襽覉覍覐覔覕覛覜覟覠覥覰覴覵覶覷覼觔",4,"觥觩觫觭觱觳觶觹觽觿訄訅訇訏訑訒訔訕訞訠訢訤訦訫訬訯訵訷訽訾詀詃詅詇詉詍詎詓詖詗詘詜詝詡詥詧詵詶詷詹詺詻詾詿誀誃誆誋誏誐誒誖誗誙誟誧誩誮誯誳"],["8fdea1","誶誷誻誾諃諆諈諉諊諑諓諔諕諗諝諟諬諰諴諵諶諼諿謅謆謋謑謜謞謟謊謭謰謷謼譂",4,"譈譒譓譔譙譍譞譣譭譶譸譹譼譾讁讄讅讋讍讏讔讕讜讞讟谸谹谽谾豅豇豉豋豏豑豓豔豗豘豛豝豙豣豤豦豨豩豭豳豵豶豻豾貆"],["8fdfa1","貇貋貐貒貓貙貛貜貤貹貺賅賆賉賋賏賖賕賙賝賡賨賬賯賰賲賵賷賸賾賿贁贃贉贒贗贛赥赩赬赮赿趂趄趈趍趐趑趕趞趟趠趦趫趬趯趲趵趷趹趻跀跅跆跇跈跊跎跑跔跕跗跙跤跥跧跬跰趼跱跲跴跽踁踄踅踆踋踑踔踖踠踡踢"],["8fe0a1","踣踦踧踱踳踶踷踸踹踽蹀蹁蹋蹍蹎蹏蹔蹛蹜蹝蹞蹡蹢蹩蹬蹭蹯蹰蹱蹹蹺蹻躂躃躉躐躒躕躚躛躝躞躢躧躩躭躮躳躵躺躻軀軁軃軄軇軏軑軔軜軨軮軰軱軷軹軺軭輀輂輇輈輏輐輖輗輘輞輠輡輣輥輧輨輬輭輮輴輵輶輷輺轀轁"],["8fe1a1","轃轇轏轑",4,"轘轝轞轥辝辠辡辤辥辦辵辶辸达迀迁迆迊迋迍运迒迓迕迠迣迤迨迮迱迵迶迻迾适逄逈逌逘逛逨逩逯逪逬逭逳逴逷逿遃遄遌遛遝遢遦遧遬遰遴遹邅邈邋邌邎邐邕邗邘邙邛邠邡邢邥邰邲邳邴邶邽郌邾郃"],["8fe2a1","郄郅郇郈郕郗郘郙郜郝郟郥郒郶郫郯郰郴郾郿鄀鄄鄅鄆鄈鄍鄐鄔鄖鄗鄘鄚鄜鄞鄠鄥鄢鄣鄧鄩鄮鄯鄱鄴鄶鄷鄹鄺鄼鄽酃酇酈酏酓酗酙酚酛酡酤酧酭酴酹酺酻醁醃醅醆醊醎醑醓醔醕醘醞醡醦醨醬醭醮醰醱醲醳醶醻醼醽醿"],["8fe3a1","釂釃釅釓釔釗釙釚釞釤釥釩釪釬",5,"釷釹釻釽鈀鈁鈄鈅鈆鈇鈉鈊鈌鈐鈒鈓鈖鈘鈜鈝鈣鈤鈥鈦鈨鈮鈯鈰鈳鈵鈶鈸鈹鈺鈼鈾鉀鉂鉃鉆鉇鉊鉍鉎鉏鉑鉘鉙鉜鉝鉠鉡鉥鉧鉨鉩鉮鉯鉰鉵",4,"鉻鉼鉽鉿銈銉銊銍銎銒銗"],["8fe4a1","銙銟銠銤銥銧銨銫銯銲銶銸銺銻銼銽銿",4,"鋅鋆鋇鋈鋋鋌鋍鋎鋐鋓鋕鋗鋘鋙鋜鋝鋟鋠鋡鋣鋥鋧鋨鋬鋮鋰鋹鋻鋿錀錂錈錍錑錔錕錜錝錞錟錡錤錥錧錩錪錳錴錶錷鍇鍈鍉鍐鍑鍒鍕鍗鍘鍚鍞鍤鍥鍧鍩鍪鍭鍯鍰鍱鍳鍴鍶"],["8fe5a1","鍺鍽鍿鎀鎁鎂鎈鎊鎋鎍鎏鎒鎕鎘鎛鎞鎡鎣鎤鎦鎨鎫鎴鎵鎶鎺鎩鏁鏄鏅鏆鏇鏉",4,"鏓鏙鏜鏞鏟鏢鏦鏧鏹鏷鏸鏺鏻鏽鐁鐂鐄鐈鐉鐍鐎鐏鐕鐖鐗鐟鐮鐯鐱鐲鐳鐴鐻鐿鐽鑃鑅鑈鑊鑌鑕鑙鑜鑟鑡鑣鑨鑫鑭鑮鑯鑱鑲钄钃镸镹"],["8fe6a1","镾閄閈閌閍閎閝閞閟閡閦閩閫閬閴閶閺閽閿闆闈闉闋闐闑闒闓闙闚闝闞闟闠闤闦阝阞阢阤阥阦阬阱阳阷阸阹阺阼阽陁陒陔陖陗陘陡陮陴陻陼陾陿隁隂隃隄隉隑隖隚隝隟隤隥隦隩隮隯隳隺雊雒嶲雘雚雝雞雟雩雯雱雺霂"],["8fe7a1","霃霅霉霚霛霝霡霢霣霨霱霳靁靃靊靎靏靕靗靘靚靛靣靧靪靮靳靶靷靸靻靽靿鞀鞉鞕鞖鞗鞙鞚鞞鞟鞢鞬鞮鞱鞲鞵鞶鞸鞹鞺鞼鞾鞿韁韄韅韇韉韊韌韍韎韐韑韔韗韘韙韝韞韠韛韡韤韯韱韴韷韸韺頇頊頙頍頎頔頖頜頞頠頣頦"],["8fe8a1","頫頮頯頰頲頳頵頥頾顄顇顊顑顒顓顖顗顙顚顢顣顥顦顪顬颫颭颮颰颴颷颸颺颻颿飂飅飈飌飡飣飥飦飧飪飳飶餂餇餈餑餕餖餗餚餛餜餟餢餦餧餫餱",4,"餹餺餻餼饀饁饆饇饈饍饎饔饘饙饛饜饞饟饠馛馝馟馦馰馱馲馵"],["8fe9a1","馹馺馽馿駃駉駓駔駙駚駜駞駧駪駫駬駰駴駵駹駽駾騂騃騄騋騌騐騑騖騞騠騢騣騤騧騭騮騳騵騶騸驇驁驄驊驋驌驎驑驔驖驝骪骬骮骯骲骴骵骶骹骻骾骿髁髃髆髈髎髐髒髕髖髗髛髜髠髤髥髧髩髬髲髳髵髹髺髽髿",4],["8feaa1","鬄鬅鬈鬉鬋鬌鬍鬎鬐鬒鬖鬙鬛鬜鬠鬦鬫鬭鬳鬴鬵鬷鬹鬺鬽魈魋魌魕魖魗魛魞魡魣魥魦魨魪",4,"魳魵魷魸魹魿鮀鮄鮅鮆鮇鮉鮊鮋鮍鮏鮐鮔鮚鮝鮞鮦鮧鮩鮬鮰鮱鮲鮷鮸鮻鮼鮾鮿鯁鯇鯈鯎鯐鯗鯘鯝鯟鯥鯧鯪鯫鯯鯳鯷鯸"],["8feba1","鯹鯺鯽鯿鰀鰂鰋鰏鰑鰖鰘鰙鰚鰜鰞鰢鰣鰦",4,"鰱鰵鰶鰷鰽鱁鱃鱄鱅鱉鱊鱎鱏鱐鱓鱔鱖鱘鱛鱝鱞鱟鱣鱩鱪鱜鱫鱨鱮鱰鱲鱵鱷鱻鳦鳲鳷鳹鴋鴂鴑鴗鴘鴜鴝鴞鴯鴰鴲鴳鴴鴺鴼鵅鴽鵂鵃鵇鵊鵓鵔鵟鵣鵢鵥鵩鵪鵫鵰鵶鵷鵻"],["8feca1","鵼鵾鶃鶄鶆鶊鶍鶎鶒鶓鶕鶖鶗鶘鶡鶪鶬鶮鶱鶵鶹鶼鶿鷃鷇鷉鷊鷔鷕鷖鷗鷚鷞鷟鷠鷥鷧鷩鷫鷮鷰鷳鷴鷾鸊鸂鸇鸎鸐鸑鸒鸕鸖鸙鸜鸝鹺鹻鹼麀麂麃麄麅麇麎麏麖麘麛麞麤麨麬麮麯麰麳麴麵黆黈黋黕黟黤黧黬黭黮黰黱黲黵"],["8feda1","黸黿鼂鼃鼉鼏鼐鼑鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿齁齃",4,"齓齕齖齗齘齚齝齞齨齩齭",4,"齳齵齺齽龏龐龑龒龔龖龗龞龡龢龣龥"]] - -/***/ }), -/* 146 */ -/***/ (function(module, exports) { - -module.exports = {"uChars":[128,165,169,178,184,216,226,235,238,244,248,251,253,258,276,284,300,325,329,334,364,463,465,467,469,471,473,475,477,506,594,610,712,716,730,930,938,962,970,1026,1104,1106,8209,8215,8218,8222,8231,8241,8244,8246,8252,8365,8452,8454,8458,8471,8482,8556,8570,8596,8602,8713,8720,8722,8726,8731,8737,8740,8742,8748,8751,8760,8766,8777,8781,8787,8802,8808,8816,8854,8858,8870,8896,8979,9322,9372,9548,9588,9616,9622,9634,9652,9662,9672,9676,9680,9702,9735,9738,9793,9795,11906,11909,11913,11917,11928,11944,11947,11951,11956,11960,11964,11979,12284,12292,12312,12319,12330,12351,12436,12447,12535,12543,12586,12842,12850,12964,13200,13215,13218,13253,13263,13267,13270,13384,13428,13727,13839,13851,14617,14703,14801,14816,14964,15183,15471,15585,16471,16736,17208,17325,17330,17374,17623,17997,18018,18212,18218,18301,18318,18760,18811,18814,18820,18823,18844,18848,18872,19576,19620,19738,19887,40870,59244,59336,59367,59413,59417,59423,59431,59437,59443,59452,59460,59478,59493,63789,63866,63894,63976,63986,64016,64018,64021,64025,64034,64037,64042,65074,65093,65107,65112,65127,65132,65375,65510,65536],"gbChars":[0,36,38,45,50,81,89,95,96,100,103,104,105,109,126,133,148,172,175,179,208,306,307,308,309,310,311,312,313,341,428,443,544,545,558,741,742,749,750,805,819,820,7922,7924,7925,7927,7934,7943,7944,7945,7950,8062,8148,8149,8152,8164,8174,8236,8240,8262,8264,8374,8380,8381,8384,8388,8390,8392,8393,8394,8396,8401,8406,8416,8419,8424,8437,8439,8445,8482,8485,8496,8521,8603,8936,8946,9046,9050,9063,9066,9076,9092,9100,9108,9111,9113,9131,9162,9164,9218,9219,11329,11331,11334,11336,11346,11361,11363,11366,11370,11372,11375,11389,11682,11686,11687,11692,11694,11714,11716,11723,11725,11730,11736,11982,11989,12102,12336,12348,12350,12384,12393,12395,12397,12510,12553,12851,12962,12973,13738,13823,13919,13933,14080,14298,14585,14698,15583,15847,16318,16434,16438,16481,16729,17102,17122,17315,17320,17402,17418,17859,17909,17911,17915,17916,17936,17939,17961,18664,18703,18814,18962,19043,33469,33470,33471,33484,33485,33490,33497,33501,33505,33513,33520,33536,33550,37845,37921,37948,38029,38038,38064,38065,38066,38069,38075,38076,38078,39108,39109,39113,39114,39115,39116,39265,39394,189000]} - -/***/ }), -/* 147 */ -/***/ (function(module, exports) { - -module.exports = [["0","\u0000",127],["8141","갂갃갅갆갋",4,"갘갞갟갡갢갣갥",6,"갮갲갳갴"],["8161","갵갶갷갺갻갽갾갿걁",9,"걌걎",5,"걕"],["8181","걖걗걙걚걛걝",18,"걲걳걵걶걹걻",4,"겂겇겈겍겎겏겑겒겓겕",6,"겞겢",5,"겫겭겮겱",6,"겺겾겿곀곂곃곅곆곇곉곊곋곍",7,"곖곘",7,"곢곣곥곦곩곫곭곮곲곴곷",4,"곾곿괁괂괃괅괇",4,"괎괐괒괓"],["8241","괔괕괖괗괙괚괛괝괞괟괡",7,"괪괫괮",5],["8261","괶괷괹괺괻괽",6,"굆굈굊",5,"굑굒굓굕굖굗"],["8281","굙",7,"굢굤",7,"굮굯굱굲굷굸굹굺굾궀궃",4,"궊궋궍궎궏궑",10,"궞",5,"궥",17,"궸",7,"귂귃귅귆귇귉",6,"귒귔",7,"귝귞귟귡귢귣귥",18],["8341","귺귻귽귾긂",5,"긊긌긎",5,"긕",7],["8361","긝",18,"긲긳긵긶긹긻긼"],["8381","긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗",4,"깞깢깣깤깦깧깪깫깭깮깯깱",6,"깺깾",5,"꺆",5,"꺍",46,"꺿껁껂껃껅",6,"껎껒",5,"껚껛껝",8],["8441","껦껧껩껪껬껮",5,"껵껶껷껹껺껻껽",8],["8461","꼆꼉꼊꼋꼌꼎꼏꼑",18],["8481","꼤",7,"꼮꼯꼱꼳꼵",6,"꼾꽀꽄꽅꽆꽇꽊",5,"꽑",10,"꽞",5,"꽦",18,"꽺",5,"꾁꾂꾃꾅꾆꾇꾉",6,"꾒꾓꾔꾖",5,"꾝",26,"꾺꾻꾽꾾"],["8541","꾿꿁",5,"꿊꿌꿏",4,"꿕",6,"꿝",4],["8561","꿢",5,"꿪",5,"꿲꿳꿵꿶꿷꿹",6,"뀂뀃"],["8581","뀅",6,"뀍뀎뀏뀑뀒뀓뀕",6,"뀞",9,"뀩",26,"끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞",29,"끾끿낁낂낃낅",6,"낎낐낒",5,"낛낝낞낣낤"],["8641","낥낦낧낪낰낲낶낷낹낺낻낽",6,"냆냊",5,"냒"],["8661","냓냕냖냗냙",6,"냡냢냣냤냦",10],["8681","냱",22,"넊넍넎넏넑넔넕넖넗넚넞",4,"넦넧넩넪넫넭",6,"넶넺",5,"녂녃녅녆녇녉",6,"녒녓녖녗녙녚녛녝녞녟녡",22,"녺녻녽녾녿놁놃",4,"놊놌놎놏놐놑놕놖놗놙놚놛놝"],["8741","놞",9,"놩",15],["8761","놹",18,"뇍뇎뇏뇑뇒뇓뇕"],["8781","뇖",5,"뇞뇠",7,"뇪뇫뇭뇮뇯뇱",7,"뇺뇼뇾",5,"눆눇눉눊눍",6,"눖눘눚",5,"눡",18,"눵",6,"눽",26,"뉙뉚뉛뉝뉞뉟뉡",6,"뉪",4],["8841","뉯",4,"뉶",5,"뉽",6,"늆늇늈늊",4],["8861","늏늒늓늕늖늗늛",4,"늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷"],["8881","늸",15,"닊닋닍닎닏닑닓",4,"닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉",6,"댒댖",5,"댝",54,"덗덙덚덝덠덡덢덣"],["8941","덦덨덪덬덭덯덲덳덵덶덷덹",6,"뎂뎆",5,"뎍"],["8961","뎎뎏뎑뎒뎓뎕",10,"뎢",5,"뎩뎪뎫뎭"],["8981","뎮",21,"돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩",18,"돽",18,"됑",6,"됙됚됛됝됞됟됡",6,"됪됬",7,"됵",15],["8a41","둅",10,"둒둓둕둖둗둙",6,"둢둤둦"],["8a61","둧",4,"둭",18,"뒁뒂"],["8a81","뒃",4,"뒉",19,"뒞",5,"뒥뒦뒧뒩뒪뒫뒭",7,"뒶뒸뒺",5,"듁듂듃듅듆듇듉",6,"듑듒듓듔듖",5,"듞듟듡듢듥듧",4,"듮듰듲",5,"듹",26,"딖딗딙딚딝"],["8b41","딞",5,"딦딫",4,"딲딳딵딶딷딹",6,"땂땆"],["8b61","땇땈땉땊땎땏땑땒땓땕",6,"땞땢",8],["8b81","땫",52,"떢떣떥떦떧떩떬떭떮떯떲떶",4,"떾떿뗁뗂뗃뗅",6,"뗎뗒",5,"뗙",18,"뗭",18],["8c41","똀",15,"똒똓똕똖똗똙",4],["8c61","똞",6,"똦",5,"똭",6,"똵",5],["8c81","똻",12,"뙉",26,"뙥뙦뙧뙩",50,"뚞뚟뚡뚢뚣뚥",5,"뚭뚮뚯뚰뚲",16],["8d41","뛃",16,"뛕",8],["8d61","뛞",17,"뛱뛲뛳뛵뛶뛷뛹뛺"],["8d81","뛻",4,"뜂뜃뜄뜆",33,"뜪뜫뜭뜮뜱",6,"뜺뜼",7,"띅띆띇띉띊띋띍",6,"띖",9,"띡띢띣띥띦띧띩",6,"띲띴띶",5,"띾띿랁랂랃랅",6,"랎랓랔랕랚랛랝랞"],["8e41","랟랡",6,"랪랮",5,"랶랷랹",8],["8e61","럂",4,"럈럊",19],["8e81","럞",13,"럮럯럱럲럳럵",6,"럾렂",4,"렊렋렍렎렏렑",6,"렚렜렞",5,"렦렧렩렪렫렭",6,"렶렺",5,"롁롂롃롅",11,"롒롔",7,"롞롟롡롢롣롥",6,"롮롰롲",5,"롹롺롻롽",7],["8f41","뢅",7,"뢎",17],["8f61","뢠",7,"뢩",6,"뢱뢲뢳뢵뢶뢷뢹",4],["8f81","뢾뢿룂룄룆",5,"룍룎룏룑룒룓룕",7,"룞룠룢",5,"룪룫룭룮룯룱",6,"룺룼룾",5,"뤅",18,"뤙",6,"뤡",26,"뤾뤿륁륂륃륅",6,"륍륎륐륒",5],["9041","륚륛륝륞륟륡",6,"륪륬륮",5,"륶륷륹륺륻륽"],["9061","륾",5,"릆릈릋릌릏",15],["9081","릟",12,"릮릯릱릲릳릵",6,"릾맀맂",5,"맊맋맍맓",4,"맚맜맟맠맢맦맧맩맪맫맭",6,"맶맻",4,"먂",5,"먉",11,"먖",33,"먺먻먽먾먿멁멃멄멅멆"],["9141","멇멊멌멏멐멑멒멖멗멙멚멛멝",6,"멦멪",5],["9161","멲멳멵멶멷멹",9,"몆몈몉몊몋몍",5],["9181","몓",20,"몪몭몮몯몱몳",4,"몺몼몾",5,"뫅뫆뫇뫉",14,"뫚",33,"뫽뫾뫿묁묂묃묅",7,"묎묐묒",5,"묙묚묛묝묞묟묡",6],["9241","묨묪묬",7,"묷묹묺묿",4,"뭆뭈뭊뭋뭌뭎뭑뭒"],["9261","뭓뭕뭖뭗뭙",7,"뭢뭤",7,"뭭",4],["9281","뭲",21,"뮉뮊뮋뮍뮎뮏뮑",18,"뮥뮦뮧뮩뮪뮫뮭",6,"뮵뮶뮸",7,"믁믂믃믅믆믇믉",6,"믑믒믔",35,"믺믻믽믾밁"],["9341","밃",4,"밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵"],["9361","밶밷밹",6,"뱂뱆뱇뱈뱊뱋뱎뱏뱑",8],["9381","뱚뱛뱜뱞",37,"벆벇벉벊벍벏",4,"벖벘벛",4,"벢벣벥벦벩",6,"벲벶",5,"벾벿볁볂볃볅",7,"볎볒볓볔볖볗볙볚볛볝",22,"볷볹볺볻볽"],["9441","볾",5,"봆봈봊",5,"봑봒봓봕",8],["9461","봞",5,"봥",6,"봭",12],["9481","봺",5,"뵁",6,"뵊뵋뵍뵎뵏뵑",6,"뵚",9,"뵥뵦뵧뵩",22,"붂붃붅붆붋",4,"붒붔붖붗붘붛붝",6,"붥",10,"붱",6,"붹",24],["9541","뷒뷓뷖뷗뷙뷚뷛뷝",11,"뷪",5,"뷱"],["9561","뷲뷳뷵뷶뷷뷹",6,"븁븂븄븆",5,"븎븏븑븒븓"],["9581","븕",6,"븞븠",35,"빆빇빉빊빋빍빏",4,"빖빘빜빝빞빟빢빣빥빦빧빩빫",4,"빲빶",4,"빾빿뺁뺂뺃뺅",6,"뺎뺒",5,"뺚",13,"뺩",14],["9641","뺸",23,"뻒뻓"],["9661","뻕뻖뻙",6,"뻡뻢뻦",5,"뻭",8],["9681","뻶",10,"뼂",5,"뼊",13,"뼚뼞",33,"뽂뽃뽅뽆뽇뽉",6,"뽒뽓뽔뽖",44],["9741","뾃",16,"뾕",8],["9761","뾞",17,"뾱",7],["9781","뾹",11,"뿆",5,"뿎뿏뿑뿒뿓뿕",6,"뿝뿞뿠뿢",89,"쀽쀾쀿"],["9841","쁀",16,"쁒",5,"쁙쁚쁛"],["9861","쁝쁞쁟쁡",6,"쁪",15],["9881","쁺",21,"삒삓삕삖삗삙",6,"삢삤삦",5,"삮삱삲삷",4,"삾샂샃샄샆샇샊샋샍샎샏샑",6,"샚샞",5,"샦샧샩샪샫샭",6,"샶샸샺",5,"섁섂섃섅섆섇섉",6,"섑섒섓섔섖",5,"섡섢섥섨섩섪섫섮"],["9941","섲섳섴섵섷섺섻섽섾섿셁",6,"셊셎",5,"셖셗"],["9961","셙셚셛셝",6,"셦셪",5,"셱셲셳셵셶셷셹셺셻"],["9981","셼",8,"솆",5,"솏솑솒솓솕솗",4,"솞솠솢솣솤솦솧솪솫솭솮솯솱",11,"솾",5,"쇅쇆쇇쇉쇊쇋쇍",6,"쇕쇖쇙",6,"쇡쇢쇣쇥쇦쇧쇩",6,"쇲쇴",7,"쇾쇿숁숂숃숅",6,"숎숐숒",5,"숚숛숝숞숡숢숣"],["9a41","숤숥숦숧숪숬숮숰숳숵",16],["9a61","쉆쉇쉉",6,"쉒쉓쉕쉖쉗쉙",6,"쉡쉢쉣쉤쉦"],["9a81","쉧",4,"쉮쉯쉱쉲쉳쉵",6,"쉾슀슂",5,"슊",5,"슑",6,"슙슚슜슞",5,"슦슧슩슪슫슮",5,"슶슸슺",33,"싞싟싡싢싥",5,"싮싰싲싳싴싵싷싺싽싾싿쌁",6,"쌊쌋쌎쌏"],["9b41","쌐쌑쌒쌖쌗쌙쌚쌛쌝",6,"쌦쌧쌪",8],["9b61","쌳",17,"썆",7],["9b81","썎",25,"썪썫썭썮썯썱썳",4,"썺썻썾",5,"쎅쎆쎇쎉쎊쎋쎍",50,"쏁",22,"쏚"],["9c41","쏛쏝쏞쏡쏣",4,"쏪쏫쏬쏮",5,"쏶쏷쏹",5],["9c61","쏿",8,"쐉",6,"쐑",9],["9c81","쐛",8,"쐥",6,"쐭쐮쐯쐱쐲쐳쐵",6,"쐾",9,"쑉",26,"쑦쑧쑩쑪쑫쑭",6,"쑶쑷쑸쑺",5,"쒁",18,"쒕",6,"쒝",12],["9d41","쒪",13,"쒹쒺쒻쒽",8],["9d61","쓆",25],["9d81","쓠",8,"쓪",5,"쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂",9,"씍씎씏씑씒씓씕",6,"씝",10,"씪씫씭씮씯씱",6,"씺씼씾",5,"앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩",6,"앲앶",5,"앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔"],["9e41","얖얙얚얛얝얞얟얡",7,"얪",9,"얶"],["9e61","얷얺얿",4,"엋엍엏엒엓엕엖엗엙",6,"엢엤엦엧"],["9e81","엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑",6,"옚옝",6,"옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉",6,"왒왖",5,"왞왟왡",10,"왭왮왰왲",5,"왺왻왽왾왿욁",6,"욊욌욎",5,"욖욗욙욚욛욝",6,"욦"],["9f41","욨욪",5,"욲욳욵욶욷욻",4,"웂웄웆",5,"웎"],["9f61","웏웑웒웓웕",6,"웞웟웢",5,"웪웫웭웮웯웱웲"],["9f81","웳",4,"웺웻웼웾",5,"윆윇윉윊윋윍",6,"윖윘윚",5,"윢윣윥윦윧윩",6,"윲윴윶윸윹윺윻윾윿읁읂읃읅",4,"읋읎읐읙읚읛읝읞읟읡",6,"읩읪읬",7,"읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛",4,"잢잧",4,"잮잯잱잲잳잵잶잷"],["a041","잸잹잺잻잾쟂",5,"쟊쟋쟍쟏쟑",6,"쟙쟚쟛쟜"],["a061","쟞",5,"쟥쟦쟧쟩쟪쟫쟭",13],["a081","쟻",4,"젂젃젅젆젇젉젋",4,"젒젔젗",4,"젞젟젡젢젣젥",6,"젮젰젲",5,"젹젺젻젽젾젿졁",6,"졊졋졎",5,"졕",26,"졲졳졵졶졷졹졻",4,"좂좄좈좉좊좎",5,"좕",7,"좞좠좢좣좤"],["a141","좥좦좧좩",18,"좾좿죀죁"],["a161","죂죃죅죆죇죉죊죋죍",6,"죖죘죚",5,"죢죣죥"],["a181","죦",14,"죶",5,"죾죿줁줂줃줇",4,"줎 、。·‥…¨〃­―∥\∼‘’“”〔〕〈",9,"±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬"],["a241","줐줒",5,"줙",18],["a261","줭",6,"줵",18],["a281","쥈",7,"쥒쥓쥕쥖쥗쥙",6,"쥢쥤",7,"쥭쥮쥯⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®"],["a341","쥱쥲쥳쥵",6,"쥽",10,"즊즋즍즎즏"],["a361","즑",6,"즚즜즞",16],["a381","즯",16,"짂짃짅짆짉짋",4,"짒짔짗짘짛!",58,"₩]",32," ̄"],["a441","짞짟짡짣짥짦짨짩짪짫짮짲",5,"짺짻짽짾짿쨁쨂쨃쨄"],["a461","쨅쨆쨇쨊쨎",5,"쨕쨖쨗쨙",12],["a481","쨦쨧쨨쨪",28,"ㄱ",93],["a541","쩇",4,"쩎쩏쩑쩒쩓쩕",6,"쩞쩢",5,"쩩쩪"],["a561","쩫",17,"쩾",5,"쪅쪆"],["a581","쪇",16,"쪙",14,"ⅰ",9],["a5b0","Ⅰ",9],["a5c1","Α",16,"Σ",6],["a5e1","α",16,"σ",6],["a641","쪨",19,"쪾쪿쫁쫂쫃쫅"],["a661","쫆",5,"쫎쫐쫒쫔쫕쫖쫗쫚",5,"쫡",6],["a681","쫨쫩쫪쫫쫭",6,"쫵",18,"쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃",7],["a741","쬋",4,"쬑쬒쬓쬕쬖쬗쬙",6,"쬢",7],["a761","쬪",22,"쭂쭃쭄"],["a781","쭅쭆쭇쭊쭋쭍쭎쭏쭑",6,"쭚쭛쭜쭞",5,"쭥",7,"㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙",9,"㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰",9,"㎀",4,"㎺",5,"㎐",4,"Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆"],["a841","쭭",10,"쭺",14],["a861","쮉",18,"쮝",6],["a881","쮤",19,"쮹",11,"ÆЪĦ"],["a8a6","IJ"],["a8a8","ĿŁØŒºÞŦŊ"],["a8b1","㉠",27,"ⓐ",25,"①",14,"½⅓⅔¼¾⅛⅜⅝⅞"],["a941","쯅",14,"쯕",10],["a961","쯠쯡쯢쯣쯥쯦쯨쯪",18],["a981","쯽",14,"찎찏찑찒찓찕",6,"찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀",27,"⒜",25,"⑴",14,"¹²³⁴ⁿ₁₂₃₄"],["aa41","찥찦찪찫찭찯찱",6,"찺찿",4,"챆챇챉챊챋챍챎"],["aa61","챏",4,"챖챚",5,"챡챢챣챥챧챩",6,"챱챲"],["aa81","챳챴챶",29,"ぁ",82],["ab41","첔첕첖첗첚첛첝첞첟첡",6,"첪첮",5,"첶첷첹"],["ab61","첺첻첽",6,"쳆쳈쳊",5,"쳑쳒쳓쳕",5],["ab81","쳛",8,"쳥",6,"쳭쳮쳯쳱",12,"ァ",85],["ac41","쳾쳿촀촂",5,"촊촋촍촎촏촑",6,"촚촜촞촟촠"],["ac61","촡촢촣촥촦촧촩촪촫촭",11,"촺",4],["ac81","촿",28,"쵝쵞쵟А",5,"ЁЖ",25],["acd1","а",5,"ёж",25],["ad41","쵡쵢쵣쵥",6,"쵮쵰쵲",5,"쵹",7],["ad61","춁",6,"춉",10,"춖춗춙춚춛춝춞춟"],["ad81","춠춡춢춣춦춨춪",5,"춱",18,"췅"],["ae41","췆",5,"췍췎췏췑",16],["ae61","췢",5,"췩췪췫췭췮췯췱",6,"췺췼췾",4],["ae81","츃츅츆츇츉츊츋츍",6,"츕츖츗츘츚",5,"츢츣츥츦츧츩츪츫"],["af41","츬츭츮츯츲츴츶",19],["af61","칊",13,"칚칛칝칞칢",5,"칪칬"],["af81","칮",5,"칶칷칹칺칻칽",6,"캆캈캊",5,"캒캓캕캖캗캙"],["b041","캚",5,"캢캦",5,"캮",12],["b061","캻",5,"컂",19],["b081","컖",13,"컦컧컩컪컭",6,"컶컺",5,"가각간갇갈갉갊감",7,"같",4,"갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆"],["b141","켂켃켅켆켇켉",6,"켒켔켖",5,"켝켞켟켡켢켣"],["b161","켥",6,"켮켲",5,"켹",11],["b181","콅",14,"콖콗콙콚콛콝",6,"콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸"],["b241","콭콮콯콲콳콵콶콷콹",6,"쾁쾂쾃쾄쾆",5,"쾍"],["b261","쾎",18,"쾢",5,"쾩"],["b281","쾪",5,"쾱",18,"쿅",6,"깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙"],["b341","쿌",19,"쿢쿣쿥쿦쿧쿩"],["b361","쿪",5,"쿲쿴쿶",5,"쿽쿾쿿퀁퀂퀃퀅",5],["b381","퀋",5,"퀒",5,"퀙",19,"끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫",4,"낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝"],["b441","퀮",5,"퀶퀷퀹퀺퀻퀽",6,"큆큈큊",5],["b461","큑큒큓큕큖큗큙",6,"큡",10,"큮큯"],["b481","큱큲큳큵",6,"큾큿킀킂",18,"뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫",4,"닳담답닷",4,"닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥"],["b541","킕",14,"킦킧킩킪킫킭",5],["b561","킳킶킸킺",5,"탂탃탅탆탇탊",5,"탒탖",4],["b581","탛탞탟탡탢탣탥",6,"탮탲",5,"탹",11,"덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸"],["b641","턅",7,"턎",17],["b661","턠",15,"턲턳턵턶턷턹턻턼턽턾"],["b681","턿텂텆",5,"텎텏텑텒텓텕",6,"텞텠텢",5,"텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗"],["b741","텮",13,"텽",6,"톅톆톇톉톊"],["b761","톋",20,"톢톣톥톦톧"],["b781","톩",6,"톲톴톶톷톸톹톻톽톾톿퇁",14,"래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩"],["b841","퇐",7,"퇙",17],["b861","퇫",8,"퇵퇶퇷퇹",13],["b881","툈툊",5,"툑",24,"륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많",4,"맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼"],["b941","툪툫툮툯툱툲툳툵",6,"툾퉀퉂",5,"퉉퉊퉋퉌"],["b961","퉍",14,"퉝",6,"퉥퉦퉧퉨"],["b981","퉩",22,"튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바",4,"받",4,"밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗"],["ba41","튍튎튏튒튓튔튖",5,"튝튞튟튡튢튣튥",6,"튭"],["ba61","튮튯튰튲",5,"튺튻튽튾틁틃",4,"틊틌",5],["ba81","틒틓틕틖틗틙틚틛틝",6,"틦",9,"틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤"],["bb41","틻",4,"팂팄팆",5,"팏팑팒팓팕팗",4,"팞팢팣"],["bb61","팤팦팧팪팫팭팮팯팱",6,"팺팾",5,"퍆퍇퍈퍉"],["bb81","퍊",31,"빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤"],["bc41","퍪",17,"퍾퍿펁펂펃펅펆펇"],["bc61","펈펉펊펋펎펒",5,"펚펛펝펞펟펡",6,"펪펬펮"],["bc81","펯",4,"펵펶펷펹펺펻펽",6,"폆폇폊",5,"폑",5,"샥샨샬샴샵샷샹섀섄섈섐섕서",4,"섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭"],["bd41","폗폙",7,"폢폤",7,"폮폯폱폲폳폵폶폷"],["bd61","폸폹폺폻폾퐀퐂",5,"퐉",13],["bd81","퐗",5,"퐞",25,"숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰"],["be41","퐸",7,"푁푂푃푅",14],["be61","푔",7,"푝푞푟푡푢푣푥",7,"푮푰푱푲"],["be81","푳",4,"푺푻푽푾풁풃",4,"풊풌풎",5,"풕",8,"쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄",6,"엌엎"],["bf41","풞",10,"풪",14],["bf61","풹",18,"퓍퓎퓏퓑퓒퓓퓕"],["bf81","퓖",5,"퓝퓞퓠",7,"퓩퓪퓫퓭퓮퓯퓱",6,"퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염",5,"옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨"],["c041","퓾",5,"픅픆픇픉픊픋픍",6,"픖픘",5],["c061","픞",25],["c081","픸픹픺픻픾픿핁핂핃핅",6,"핎핐핒",5,"핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응",7,"읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊"],["c141","핤핦핧핪핬핮",5,"핶핷핹핺핻핽",6,"햆햊햋"],["c161","햌햍햎햏햑",19,"햦햧"],["c181","햨",31,"점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓"],["c241","헊헋헍헎헏헑헓",4,"헚헜헞",5,"헦헧헩헪헫헭헮"],["c261","헯",4,"헶헸헺",5,"혂혃혅혆혇혉",6,"혒"],["c281","혖",5,"혝혞혟혡혢혣혥",7,"혮",9,"혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻"],["c341","혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝",4],["c361","홢",4,"홨홪",5,"홲홳홵",11],["c381","횁횂횄횆",5,"횎횏횑횒횓횕",7,"횞횠횢",5,"횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층"],["c441","횫횭횮횯횱",7,"횺횼",7,"훆훇훉훊훋"],["c461","훍훎훏훐훒훓훕훖훘훚",5,"훡훢훣훥훦훧훩",4],["c481","훮훯훱훲훳훴훶",5,"훾훿휁휂휃휅",11,"휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼"],["c541","휕휖휗휚휛휝휞휟휡",6,"휪휬휮",5,"휶휷휹"],["c561","휺휻휽",6,"흅흆흈흊",5,"흒흓흕흚",4],["c581","흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵",6,"흾흿힀힂",5,"힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜"],["c641","힍힎힏힑",6,"힚힜힞",5],["c6a1","퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁"],["c7a1","퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠"],["c8a1","혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝"],["caa1","伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕"],["cba1","匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢"],["cca1","瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械"],["cda1","棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜"],["cea1","科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾"],["cfa1","區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴"],["d0a1","鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣"],["d1a1","朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩",5,"那樂",4,"諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉"],["d2a1","納臘蠟衲囊娘廊",4,"乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧",5,"駑魯",10,"濃籠聾膿農惱牢磊腦賂雷尿壘",7,"嫩訥杻紐勒",5,"能菱陵尼泥匿溺多茶"],["d3a1","丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃"],["d4a1","棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅"],["d5a1","蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣"],["d6a1","煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼"],["d7a1","遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬"],["d8a1","立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅"],["d9a1","蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文"],["daa1","汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑"],["dba1","發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖"],["dca1","碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦"],["dda1","孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥"],["dea1","脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索"],["dfa1","傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署"],["e0a1","胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬"],["e1a1","聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁"],["e2a1","戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧"],["e3a1","嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁"],["e4a1","沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額"],["e5a1","櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬"],["e6a1","旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒"],["e7a1","簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳"],["e8a1","烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療"],["e9a1","窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓"],["eaa1","運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜"],["eba1","濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼"],["eca1","議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄"],["eda1","立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長"],["eea1","障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱"],["efa1","煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖"],["f0a1","靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫"],["f1a1","踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只"],["f2a1","咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯"],["f3a1","鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策"],["f4a1","責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢"],["f5a1","椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃"],["f6a1","贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託"],["f7a1","鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑"],["f8a1","阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃"],["f9a1","品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航"],["faa1","行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型"],["fba1","形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵"],["fca1","禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆"],["fda1","爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰"]] - -/***/ }), -/* 148 */ -/***/ (function(module, exports) { - -module.exports = [["8740","䏰䰲䘃䖦䕸𧉧䵷䖳𧲱䳢𧳅㮕䜶䝄䱇䱀𤊿𣘗𧍒𦺋𧃒䱗𪍑䝏䗚䲅𧱬䴇䪤䚡𦬣爥𥩔𡩣𣸆𣽡晍囻"],["8767","綕夝𨮹㷴霴𧯯寛𡵞媤㘥𩺰嫑宷峼杮薓𩥅瑡璝㡵𡵓𣚞𦀡㻬"],["87a1","𥣞㫵竼龗𤅡𨤍𣇪𠪊𣉞䌊蒄龖鐯䤰蘓墖靊鈘秐稲晠権袝瑌篅枂稬剏遆㓦珄𥶹瓆鿇垳䤯呌䄱𣚎堘穲𧭥讏䚮𦺈䆁𥶙箮𢒼鿈𢓁𢓉𢓌鿉蔄𣖻䂴鿊䓡𪷿拁灮鿋"],["8840","㇀",4,"𠄌㇅𠃑𠃍㇆㇇𠃋𡿨㇈𠃊㇉㇊㇋㇌𠄎㇍㇎ĀÁǍÀĒÉĚÈŌÓǑÒ࿿Ê̄Ế࿿Ê̌ỀÊāáǎàɑēéěèīíǐìōóǒòūúǔùǖǘǚ"],["88a1","ǜü࿿ê̄ế࿿ê̌ềêɡ⏚⏛"],["8940","𪎩𡅅"],["8943","攊"],["8946","丽滝鵎釟"],["894c","𧜵撑会伨侨兖兴农凤务动医华发变团声处备夲头学实実岚庆总斉柾栄桥济炼电纤纬纺织经统缆缷艺苏药视设询车轧轮"],["89a1","琑糼緍楆竉刧"],["89ab","醌碸酞肼"],["89b0","贋胶𠧧"],["89b5","肟黇䳍鷉鸌䰾𩷶𧀎鸊𪄳㗁"],["89c1","溚舾甙"],["89c5","䤑马骏龙禇𨑬𡷊𠗐𢫦两亁亀亇亿仫伷㑌侽㹈倃傈㑽㒓㒥円夅凛凼刅争剹劐匧㗇厩㕑厰㕓参吣㕭㕲㚁咓咣咴咹哐哯唘唣唨㖘唿㖥㖿嗗㗅"],["8a40","𧶄唥"],["8a43","𠱂𠴕𥄫喐𢳆㧬𠍁蹆𤶸𩓥䁓𨂾睺𢰸㨴䟕𨅝𦧲𤷪擝𠵼𠾴𠳕𡃴撍蹾𠺖𠰋𠽤𢲩𨉖𤓓"],["8a64","𠵆𩩍𨃩䟴𤺧𢳂骲㩧𩗴㿭㔆𥋇𩟔𧣈𢵄鵮頕"],["8a76","䏙𦂥撴哣𢵌𢯊𡁷㧻𡁯"],["8aa1","𦛚𦜖𧦠擪𥁒𠱃蹨𢆡𨭌𠜱"],["8aac","䠋𠆩㿺塳𢶍"],["8ab2","𤗈𠓼𦂗𠽌𠶖啹䂻䎺"],["8abb","䪴𢩦𡂝膪飵𠶜捹㧾𢝵跀嚡摼㹃"],["8ac9","𪘁𠸉𢫏𢳉"],["8ace","𡃈𣧂㦒㨆𨊛㕸𥹉𢃇噒𠼱𢲲𩜠㒼氽𤸻"],["8adf","𧕴𢺋𢈈𪙛𨳍𠹺𠰴𦠜羓𡃏𢠃𢤹㗻𥇣𠺌𠾍𠺪㾓𠼰𠵇𡅏𠹌"],["8af6","𠺫𠮩𠵈𡃀𡄽㿹𢚖搲𠾭"],["8b40","𣏴𧘹𢯎𠵾𠵿𢱑𢱕㨘𠺘𡃇𠼮𪘲𦭐𨳒𨶙𨳊閪哌苄喹"],["8b55","𩻃鰦骶𧝞𢷮煀腭胬尜𦕲脴㞗卟𨂽醶𠻺𠸏𠹷𠻻㗝𤷫㘉𠳖嚯𢞵𡃉𠸐𠹸𡁸𡅈𨈇𡑕𠹹𤹐𢶤婔𡀝𡀞𡃵𡃶垜𠸑"],["8ba1","𧚔𨋍𠾵𠹻𥅾㜃𠾶𡆀𥋘𪊽𤧚𡠺𤅷𨉼墙剨㘚𥜽箲孨䠀䬬鼧䧧鰟鮍𥭴𣄽嗻㗲嚉丨夂𡯁屮靑𠂆乛亻㔾尣彑忄㣺扌攵歺氵氺灬爫丬犭𤣩罒礻糹罓𦉪㓁"],["8bde","𦍋耂肀𦘒𦥑卝衤见𧢲讠贝钅镸长门𨸏韦页风飞饣𩠐鱼鸟黄歯龜丷𠂇阝户钢"],["8c40","倻淾𩱳龦㷉袏𤅎灷峵䬠𥇍㕙𥴰愢𨨲辧釶熑朙玺𣊁𪄇㲋𡦀䬐磤琂冮𨜏䀉橣𪊺䈣蘏𠩯稪𩥇𨫪靕灍匤𢁾鏴盙𨧣龧矝亣俰傼丯众龨吴綋墒壐𡶶庒庙忂𢜒斋"],["8ca1","𣏹椙橃𣱣泿"],["8ca7","爀𤔅玌㻛𤨓嬕璹讃𥲤𥚕窓篬糃繬苸薗龩袐龪躹龫迏蕟駠鈡龬𨶹𡐿䁱䊢娚"],["8cc9","顨杫䉶圽"],["8cce","藖𤥻芿𧄍䲁𦵴嵻𦬕𦾾龭龮宖龯曧繛湗秊㶈䓃𣉖𢞖䎚䔶"],["8ce6","峕𣬚諹屸㴒𣕑嵸龲煗䕘𤃬𡸣䱷㥸㑊𠆤𦱁諌侴𠈹妿腬顖𩣺弻"],["8d40","𠮟"],["8d42","𢇁𨥭䄂䚻𩁹㼇龳𪆵䃸㟖䛷𦱆䅼𨚲𧏿䕭㣔𥒚䕡䔛䶉䱻䵶䗪㿈𤬏㙡䓞䒽䇭崾嵈嵖㷼㠏嶤嶹㠠㠸幂庽弥徃㤈㤔㤿㥍惗愽峥㦉憷憹懏㦸戬抐拥挘㧸嚱"],["8da1","㨃揢揻搇摚㩋擀崕嘡龟㪗斆㪽旿晓㫲暒㬢朖㭂枤栀㭘桊梄㭲㭱㭻椉楃牜楤榟榅㮼槖㯝橥橴橱檂㯬檙㯲檫檵櫔櫶殁毁毪汵沪㳋洂洆洦涁㳯涤涱渕渘温溆𨧀溻滢滚齿滨滩漤漴㵆𣽁澁澾㵪㵵熷岙㶊瀬㶑灐灔灯灿炉𠌥䏁㗱𠻘"],["8e40","𣻗垾𦻓焾𥟠㙎榢𨯩孴穉𥣡𩓙穥穽𥦬窻窰竂竃燑𦒍䇊竚竝竪䇯咲𥰁笋筕笩𥌎𥳾箢筯莜𥮴𦱿篐萡箒箸𥴠㶭𥱥蒒篺簆簵𥳁籄粃𤢂粦晽𤕸糉糇糦籴糳糵糎"],["8ea1","繧䔝𦹄絝𦻖璍綉綫焵綳緒𤁗𦀩緤㴓緵𡟹緥𨍭縝𦄡𦅚繮纒䌫鑬縧罀罁罇礶𦋐駡羗𦍑羣𡙡𠁨䕜𣝦䔃𨌺翺𦒉者耈耝耨耯𪂇𦳃耻耼聡𢜔䦉𦘦𣷣𦛨朥肧𨩈脇脚墰𢛶汿𦒘𤾸擧𡒊舘𡡞橓𤩥𤪕䑺舩𠬍𦩒𣵾俹𡓽蓢荢𦬊𤦧𣔰𡝳𣷸芪椛芳䇛"],["8f40","蕋苐茚𠸖𡞴㛁𣅽𣕚艻苢茘𣺋𦶣𦬅𦮗𣗎㶿茝嗬莅䔋𦶥莬菁菓㑾𦻔橗蕚㒖𦹂𢻯葘𥯤葱㷓䓤檧葊𣲵祘蒨𦮖𦹷𦹃蓞萏莑䒠蒓蓤𥲑䉀𥳀䕃蔴嫲𦺙䔧蕳䔖枿蘖"],["8fa1","𨘥𨘻藁𧂈蘂𡖂𧃍䕫䕪蘨㙈𡢢号𧎚虾蝱𪃸蟮𢰧螱蟚蠏噡虬桖䘏衅衆𧗠𣶹𧗤衞袜䙛袴袵揁装睷𧜏覇覊覦覩覧覼𨨥觧𧤤𧪽誜瞓釾誐𧩙竩𧬺𣾏䜓𧬸煼謌謟𥐰𥕥謿譌譍誩𤩺讐讛誯𡛟䘕衏貛𧵔𧶏貫㜥𧵓賖𧶘𧶽贒贃𡤐賛灜贑𤳉㻐起"],["9040","趩𨀂𡀔𤦊㭼𨆼𧄌竧躭躶軃鋔輙輭𨍥𨐒辥錃𪊟𠩐辳䤪𨧞𨔽𣶻廸𣉢迹𪀔𨚼𨔁𢌥㦀𦻗逷𨔼𧪾遡𨕬𨘋邨𨜓郄𨛦邮都酧㫰醩釄粬𨤳𡺉鈎沟鉁鉢𥖹銹𨫆𣲛𨬌𥗛"],["90a1","𠴱錬鍫𨫡𨯫炏嫃𨫢𨫥䥥鉄𨯬𨰹𨯿鍳鑛躼閅閦鐦閠濶䊹𢙺𨛘𡉼𣸮䧟氜陻隖䅬隣𦻕懚隶磵𨫠隽双䦡𦲸𠉴𦐐𩂯𩃥𤫑𡤕𣌊霱虂霶䨏䔽䖅𤫩灵孁霛靜𩇕靗孊𩇫靟鐥僐𣂷𣂼鞉鞟鞱鞾韀韒韠𥑬韮琜𩐳響韵𩐝𧥺䫑頴頳顋顦㬎𧅵㵑𠘰𤅜"],["9140","𥜆飊颷飈飇䫿𦴧𡛓喰飡飦飬鍸餹𤨩䭲𩡗𩤅駵騌騻騐驘𥜥㛄𩂱𩯕髠髢𩬅髴䰎鬔鬭𨘀倴鬴𦦨㣃𣁽魐魀𩴾婅𡡣鮎𤉋鰂鯿鰌𩹨鷔𩾷𪆒𪆫𪃡𪄣𪇟鵾鶃𪄴鸎梈"],["91a1","鷄𢅛𪆓𪈠𡤻𪈳鴹𪂹𪊴麐麕麞麢䴴麪麯𤍤黁㭠㧥㴝伲㞾𨰫鼂鼈䮖鐤𦶢鼗鼖鼹嚟嚊齅馸𩂋韲葿齢齩竜龎爖䮾𤥵𤦻煷𤧸𤍈𤩑玞𨯚𡣺禟𨥾𨸶鍩鏳𨩄鋬鎁鏋𨥬𤒹爗㻫睲穃烐𤑳𤏸煾𡟯炣𡢾𣖙㻇𡢅𥐯𡟸㜢𡛻𡠹㛡𡝴𡣑𥽋㜣𡛀坛𤨥𡏾𡊨"],["9240","𡏆𡒶蔃𣚦蔃葕𤦔𧅥𣸱𥕜𣻻𧁒䓴𣛮𩦝𦼦柹㜳㰕㷧塬𡤢栐䁗𣜿𤃡𤂋𤄏𦰡哋嚞𦚱嚒𠿟𠮨𠸍鏆𨬓鎜仸儫㠙𤐶亼𠑥𠍿佋侊𥙑婨𠆫𠏋㦙𠌊𠐔㐵伩𠋀𨺳𠉵諚𠈌亘"],["92a1","働儍侢伃𤨎𣺊佂倮偬傁俌俥偘僼兙兛兝兞湶𣖕𣸹𣺿浲𡢄𣺉冨凃𠗠䓝𠒣𠒒𠒑赺𨪜𠜎剙劤𠡳勡鍮䙺熌𤎌𠰠𤦬𡃤槑𠸝瑹㻞璙琔瑖玘䮎𤪼𤂍叐㖄爏𤃉喴𠍅响𠯆圝鉝雴鍦埝垍坿㘾壋媙𨩆𡛺𡝯𡜐娬妸銏婾嫏娒𥥆𡧳𡡡𤊕㛵洅瑃娡𥺃"],["9340","媁𨯗𠐓鏠璌𡌃焅䥲鐈𨧻鎽㞠尞岞幞幈𡦖𡥼𣫮廍孏𡤃𡤄㜁𡢠㛝𡛾㛓脪𨩇𡶺𣑲𨦨弌弎𡤧𡞫婫𡜻孄蘔𧗽衠恾𢡠𢘫忛㺸𢖯𢖾𩂈𦽳懀𠀾𠁆𢘛憙憘恵𢲛𢴇𤛔𩅍"],["93a1","摱𤙥𢭪㨩𢬢𣑐𩣪𢹸挷𪑛撶挱揑𤧣𢵧护𢲡搻敫楲㯴𣂎𣊭𤦉𣊫唍𣋠𡣙𩐿曎𣊉𣆳㫠䆐𥖄𨬢𥖏𡛼𥕛𥐥磮𣄃𡠪𣈴㑤𣈏𣆂𤋉暎𦴤晫䮓昰𧡰𡷫晣𣋒𣋡昞𥡲㣑𣠺𣞼㮙𣞢𣏾瓐㮖枏𤘪梶栞㯄檾㡣𣟕𤒇樳橒櫉欅𡤒攑梘橌㯗橺歗𣿀𣲚鎠鋲𨯪𨫋"],["9440","銉𨀞𨧜鑧涥漋𤧬浧𣽿㶏渄𤀼娽渊塇洤硂焻𤌚𤉶烱牐犇犔𤞏𤜥兹𤪤𠗫瑺𣻸𣙟𤩊𤤗𥿡㼆㺱𤫟𨰣𣼵悧㻳瓌琼鎇琷䒟𦷪䕑疃㽣𤳙𤴆㽘畕癳𪗆㬙瑨𨫌𤦫𤦎㫻"],["94a1","㷍𤩎㻿𤧅𤣳釺圲鍂𨫣𡡤僟𥈡𥇧睸𣈲眎眏睻𤚗𣞁㩞𤣰琸璛㺿𤪺𤫇䃈𤪖𦆮錇𥖁砞碍碈磒珐祙𧝁𥛣䄎禛蒖禥樭𣻺稺秴䅮𡛦䄲鈵秱𠵌𤦌𠊙𣶺𡝮㖗啫㕰㚪𠇔𠰍竢婙𢛵𥪯𥪜娍𠉛磰娪𥯆竾䇹籝籭䈑𥮳𥺼𥺦糍𤧹𡞰粎籼粮檲緜縇緓罎𦉡"],["9540","𦅜𧭈綗𥺂䉪𦭵𠤖柖𠁎𣗏埄𦐒𦏸𤥢翝笧𠠬𥫩𥵃笌𥸎駦虅驣樜𣐿㧢𤧷𦖭騟𦖠蒀𧄧𦳑䓪脷䐂胆脉腂𦞴飃𦩂艢艥𦩑葓𦶧蘐𧈛媆䅿𡡀嬫𡢡嫤𡣘蚠蜨𣶏蠭𧐢娂"],["95a1","衮佅袇袿裦襥襍𥚃襔𧞅𧞄𨯵𨯙𨮜𨧹㺭蒣䛵䛏㟲訽訜𩑈彍鈫𤊄旔焩烄𡡅鵭貟賩𧷜妚矃姰䍮㛔踪躧𤰉輰轊䋴汘澻𢌡䢛潹溋𡟚鯩㚵𤤯邻邗啱䤆醻鐄𨩋䁢𨫼鐧𨰝𨰻蓥訫閙閧閗閖𨴴瑅㻂𤣿𤩂𤏪㻧𣈥随𨻧𨹦𨹥㻌𤧭𤩸𣿮琒瑫㻼靁𩂰"],["9640","桇䨝𩂓𥟟靝鍨𨦉𨰦𨬯𦎾銺嬑譩䤼珹𤈛鞛靱餸𠼦巁𨯅𤪲頟𩓚鋶𩗗釥䓀𨭐𤩧𨭤飜𨩅㼀鈪䤥萔餻饍𧬆㷽馛䭯馪驜𨭥𥣈檏騡嫾騯𩣱䮐𩥈馼䮽䮗鍽塲𡌂堢𤦸"],["96a1","𡓨硄𢜟𣶸棅㵽鑘㤧慐𢞁𢥫愇鱏鱓鱻鰵鰐魿鯏𩸭鮟𪇵𪃾鴡䲮𤄄鸘䲰鴌𪆴𪃭𪃳𩤯鶥蒽𦸒𦿟𦮂藼䔳𦶤𦺄𦷰萠藮𦸀𣟗𦁤秢𣖜𣙀䤭𤧞㵢鏛銾鍈𠊿碹鉷鑍俤㑀遤𥕝砽硔碶硋𡝗𣇉𤥁㚚佲濚濙瀞瀞吔𤆵垻壳垊鴖埗焴㒯𤆬燫𦱀𤾗嬨𡞵𨩉"],["9740","愌嫎娋䊼𤒈㜬䭻𨧼鎻鎸𡣖𠼝葲𦳀𡐓𤋺𢰦𤏁妔𣶷𦝁綨𦅛𦂤𤦹𤦋𨧺鋥珢㻩璴𨭣𡢟㻡𤪳櫘珳珻㻖𤨾𤪔𡟙𤩦𠎧𡐤𤧥瑈𤤖炥𤥶銄珦鍟𠓾錱𨫎𨨖鎆𨯧𥗕䤵𨪂煫"],["97a1","𤥃𠳿嚤𠘚𠯫𠲸唂秄𡟺緾𡛂𤩐𡡒䔮鐁㜊𨫀𤦭妰𡢿𡢃𧒄媡㛢𣵛㚰鉟婹𨪁𡡢鍴㳍𠪴䪖㦊僴㵩㵌𡎜煵䋻𨈘渏𩃤䓫浗𧹏灧沯㳖𣿭𣸭渂漌㵯𠏵畑㚼㓈䚀㻚䡱姄鉮䤾轁𨰜𦯀堒埈㛖𡑒烾𤍢𤩱𢿣𡊰𢎽梹楧𡎘𣓥𧯴𣛟𨪃𣟖𣏺𤲟樚𣚭𦲷萾䓟䓎"],["9840","𦴦𦵑𦲂𦿞漗𧄉茽𡜺菭𦲀𧁓𡟛妉媂𡞳婡婱𡤅𤇼㜭姯𡜼㛇熎鎐暚𤊥婮娫𤊓樫𣻹𧜶𤑛𤋊焝𤉙𨧡侰𦴨峂𤓎𧹍𤎽樌𤉖𡌄炦焳𤏩㶥泟勇𤩏繥姫崯㷳彜𤩝𡟟綤萦"],["98a1","咅𣫺𣌀𠈔坾𠣕𠘙㿥𡾞𪊶瀃𩅛嵰玏糓𨩙𩐠俈翧狍猐𧫴猸猹𥛶獁獈㺩𧬘遬燵𤣲珡臶㻊県㻑沢国琙琞琟㻢㻰㻴㻺瓓㼎㽓畂畭畲疍㽼痈痜㿀癍㿗癴㿜発𤽜熈嘣覀塩䀝睃䀹条䁅㗛瞘䁪䁯属瞾矋売砘点砜䂨砹硇硑硦葈𥔵礳栃礲䄃"],["9940","䄉禑禙辻稆込䅧窑䆲窼艹䇄竏竛䇏両筢筬筻簒簛䉠䉺类粜䊌粸䊔糭输烀𠳏総緔緐緽羮羴犟䎗耠耥笹耮耱联㷌垴炠肷胩䏭脌猪脎脒畠脔䐁㬹腖腙腚"],["99a1","䐓堺腼膄䐥膓䐭膥埯臁臤艔䒏芦艶苊苘苿䒰荗险榊萅烵葤惣蒈䔄蒾蓡蓸蔐蔸蕒䔻蕯蕰藠䕷虲蚒蚲蛯际螋䘆䘗袮裿褤襇覑𧥧訩訸誔誴豑賔賲贜䞘塟跃䟭仮踺嗘坔蹱嗵躰䠷軎転軤軭軲辷迁迊迌逳駄䢭飠鈓䤞鈨鉘鉫銱銮銿"],["9a40","鋣鋫鋳鋴鋽鍃鎄鎭䥅䥑麿鐗匁鐝鐭鐾䥪鑔鑹锭関䦧间阳䧥枠䨤靀䨵鞲韂噔䫤惨颹䬙飱塄餎餙冴餜餷饂饝饢䭰駅䮝騼鬏窃魩鮁鯝鯱鯴䱭鰠㝯𡯂鵉鰺"],["9aa1","黾噐鶓鶽鷀鷼银辶鹻麬麱麽黆铜黢黱黸竈齄𠂔𠊷𠎠椚铃妬𠓗塀铁㞹𠗕𠘕𠙶𡚺块煳𠫂𠫍𠮿呪吆𠯋咞𠯻𠰻𠱓𠱥𠱼惧𠲍噺𠲵𠳝𠳭𠵯𠶲𠷈楕鰯螥𠸄𠸎𠻗𠾐𠼭𠹳尠𠾼帋𡁜𡁏𡁶朞𡁻𡂈𡂖㙇𡂿𡃓𡄯𡄻卤蒭𡋣𡍵𡌶讁𡕷𡘙𡟃𡟇乸炻𡠭𡥪"],["9b40","𡨭𡩅𡰪𡱰𡲬𡻈拃𡻕𡼕熘桕𢁅槩㛈𢉼𢏗𢏺𢜪𢡱𢥏苽𢥧𢦓𢫕覥𢫨辠𢬎鞸𢬿顇骽𢱌"],["9b62","𢲈𢲷𥯨𢴈𢴒𢶷𢶕𢹂𢽴𢿌𣀳𣁦𣌟𣏞徱晈暿𧩹𣕧𣗳爁𤦺矗𣘚𣜖纇𠍆墵朎"],["9ba1","椘𣪧𧙗𥿢𣸑𣺹𧗾𢂚䣐䪸𤄙𨪚𤋮𤌍𤀻𤌴𤎖𤩅𠗊凒𠘑妟𡺨㮾𣳿𤐄𤓖垈𤙴㦛𤜯𨗨𩧉㝢𢇃譞𨭎駖𤠒𤣻𤨕爉𤫀𠱸奥𤺥𤾆𠝹軚𥀬劏圿煱𥊙𥐙𣽊𤪧喼𥑆𥑮𦭒釔㑳𥔿𧘲𥕞䜘𥕢𥕦𥟇𤤿𥡝偦㓻𣏌惞𥤃䝼𨥈𥪮𥮉𥰆𡶐垡煑澶𦄂𧰒遖𦆲𤾚譢𦐂𦑊"],["9c40","嵛𦯷輶𦒄𡤜諪𤧶𦒈𣿯𦔒䯀𦖿𦚵𢜛鑥𥟡憕娧晉侻嚹𤔡𦛼乪𤤴陖涏𦲽㘘襷𦞙𦡮𦐑𦡞營𦣇筂𩃀𠨑𦤦鄄𦤹穅鷰𦧺騦𦨭㙟𦑩𠀡禃𦨴𦭛崬𣔙菏𦮝䛐𦲤画补𦶮墶"],["9ca1","㜜𢖍𧁋𧇍㱔𧊀𧊅銁𢅺𧊋錰𧋦𤧐氹钟𧑐𠻸蠧裵𢤦𨑳𡞱溸𤨪𡠠㦤㚹尐秣䔿暶𩲭𩢤襃𧟌𧡘囖䃟𡘊㦡𣜯𨃨𡏅熭荦𧧝𩆨婧䲷𧂯𨦫𧧽𧨊𧬋𧵦𤅺筃祾𨀉澵𪋟樃𨌘厢𦸇鎿栶靝𨅯𨀣𦦵𡏭𣈯𨁈嶅𨰰𨂃圕頣𨥉嶫𤦈斾槕叒𤪥𣾁㰑朶𨂐𨃴𨄮𡾡𨅏"],["9d40","𨆉𨆯𨈚𨌆𨌯𨎊㗊𨑨𨚪䣺揦𨥖砈鉕𨦸䏲𨧧䏟𨧨𨭆𨯔姸𨰉輋𨿅𩃬筑𩄐𩄼㷷𩅞𤫊运犏嚋𩓧𩗩𩖰𩖸𩜲𩣑𩥉𩥪𩧃𩨨𩬎𩵚𩶛纟𩻸𩼣䲤镇𪊓熢𪋿䶑递𪗋䶜𠲜达嗁"],["9da1","辺𢒰边𤪓䔉繿潖檱仪㓤𨬬𧢝㜺躀𡟵𨀤𨭬𨮙𧨾𦚯㷫𧙕𣲷𥘵𥥖亚𥺁𦉘嚿𠹭踎孭𣺈𤲞揞拐𡟶𡡻攰嘭𥱊吚𥌑㷆𩶘䱽嘢嘞罉𥻘奵𣵀蝰东𠿪𠵉𣚺脗鵞贘瘻鱅癎瞹鍅吲腈苷嘥脲萘肽嗪祢噃吖𠺝㗎嘅嗱曱𨋢㘭甴嗰喺咗啲𠱁𠲖廐𥅈𠹶𢱢"],["9e40","𠺢麫絚嗞𡁵抝靭咔賍燶酶揼掹揾啩𢭃鱲𢺳冚㓟𠶧冧呍唞唓癦踭𦢊疱肶蠄螆裇膶萜𡃁䓬猄𤜆宐茋𦢓噻𢛴𧴯𤆣𧵳𦻐𧊶酰𡇙鈈𣳼𪚩𠺬𠻹牦𡲢䝎𤿂𧿹𠿫䃺"],["9ea1","鱝攟𢶠䣳𤟠𩵼𠿬𠸊恢𧖣𠿭"],["9ead","𦁈𡆇熣纎鵐业丄㕷嬍沲卧㚬㧜卽㚥𤘘墚𤭮舭呋垪𥪕𠥹"],["9ec5","㩒𢑥獴𩺬䴉鯭𣳾𩼰䱛𤾩𩖞𩿞葜𣶶𧊲𦞳𣜠挮紥𣻷𣸬㨪逈勌㹴㙺䗩𠒎癀嫰𠺶硺𧼮墧䂿噼鮋嵴癔𪐴麅䳡痹㟻愙𣃚𤏲"],["9ef5","噝𡊩垧𤥣𩸆刴𧂮㖭汊鵼"],["9f40","籖鬹埞𡝬屓擓𩓐𦌵𧅤蚭𠴨𦴢𤫢𠵱"],["9f4f","凾𡼏嶎霃𡷑麁遌笟鬂峑箣扨挵髿篏鬪籾鬮籂粆鰕篼鬉鼗鰛𤤾齚啳寃俽麘俲剠㸆勑坧偖妷帒韈鶫轜呩鞴饀鞺匬愰"],["9fa1","椬叚鰊鴂䰻陁榀傦畆𡝭駚剳"],["9fae","酙隁酜"],["9fb2","酑𨺗捿𦴣櫊嘑醎畺抅𠏼獏籰𥰡𣳽"],["9fc1","𤤙盖鮝个𠳔莾衂"],["9fc9","届槀僭坺刟巵从氱𠇲伹咜哚劚趂㗾弌㗳"],["9fdb","歒酼龥鮗頮颴骺麨麄煺笔"],["9fe7","毺蠘罸"],["9feb","嘠𪙊蹷齓"],["9ff0","跔蹏鸜踁抂𨍽踨蹵竓𤩷稾磘泪詧瘇"],["a040","𨩚鼦泎蟖痃𪊲硓咢贌狢獱謭猂瓱賫𤪻蘯徺袠䒷"],["a055","𡠻𦸅"],["a058","詾𢔛"],["a05b","惽癧髗鵄鍮鮏蟵"],["a063","蠏賷猬霡鮰㗖犲䰇籑饊𦅙慙䰄麖慽"],["a073","坟慯抦戹拎㩜懢厪𣏵捤栂㗒"],["a0a1","嵗𨯂迚𨸹"],["a0a6","僙𡵆礆匲阸𠼻䁥"],["a0ae","矾"],["a0b0","糂𥼚糚稭聦聣絍甅瓲覔舚朌聢𧒆聛瓰脃眤覉𦟌畓𦻑螩蟎臈螌詉貭譃眫瓸蓚㘵榲趦"],["a0d4","覩瑨涹蟁𤀑瓧㷛煶悤憜㳑煢恷"],["a0e2","罱𨬭牐惩䭾删㰘𣳇𥻗𧙖𥔱𡥄𡋾𩤃𦷜𧂭峁𦆭𨨏𣙷𠃮𦡆𤼎䕢嬟𦍌齐麦𦉫"],["a3c0","␀",31,"␡"],["c6a1","①",9,"⑴",9,"ⅰ",9,"丶丿亅亠冂冖冫勹匸卩厶夊宀巛⼳广廴彐彡攴无疒癶辵隶¨ˆヽヾゝゞ〃仝々〆〇ー[]✽ぁ",23],["c740","す",58,"ァアィイ"],["c7a1","ゥ",81,"А",5,"ЁЖ",4],["c840","Л",26,"ёж",25,"⇧↸↹㇏𠃌乚𠂊刂䒑"],["c8a1","龰冈龱𧘇"],["c8cd","¬¦'"㈱№℡゛゜⺀⺄⺆⺇⺈⺊⺌⺍⺕⺜⺝⺥⺧⺪⺬⺮⺶⺼⺾⻆⻊⻌⻍⻏⻖⻗⻞⻣"],["c8f5","ʃɐɛɔɵœøŋʊɪ"],["f9fe","■"],["fa40","𠕇鋛𠗟𣿅蕌䊵珯况㙉𤥂𨧤鍄𡧛苮𣳈砼杄拟𤤳𨦪𠊠𦮳𡌅侫𢓭倈𦴩𧪄𣘀𤪱𢔓倩𠍾徤𠎀𠍇滛𠐟偽儁㑺儎顬㝃萖𤦤𠒇兠𣎴兪𠯿𢃼𠋥𢔰𠖎𣈳𡦃宂蝽𠖳𣲙冲冸"],["faa1","鴴凉减凑㳜凓𤪦决凢卂凭菍椾𣜭彻刋刦刼劵剗劔効勅簕蕂勠蘍𦬓包𨫞啉滙𣾀𠥔𣿬匳卄𠯢泋𡜦栛珕恊㺪㣌𡛨燝䒢卭却𨚫卾卿𡖖𡘓矦厓𨪛厠厫厮玧𥝲㽙玜叁叅汉义埾叙㪫𠮏叠𣿫𢶣叶𠱷吓灹唫晗浛呭𦭓𠵴啝咏咤䞦𡜍𠻝㶴𠵍"],["fb40","𨦼𢚘啇䳭启琗喆喩嘅𡣗𤀺䕒𤐵暳𡂴嘷曍𣊊暤暭噍噏磱囱鞇叾圀囯园𨭦㘣𡉏坆𤆥汮炋坂㚱𦱾埦𡐖堃𡑔𤍣堦𤯵塜墪㕡壠壜𡈼壻寿坃𪅐𤉸鏓㖡够梦㛃湙"],["fba1","𡘾娤啓𡚒蔅姉𠵎𦲁𦴪𡟜姙𡟻𡞲𦶦浱𡠨𡛕姹𦹅媫婣㛦𤦩婷㜈媖瑥嫓𦾡𢕔㶅𡤑㜲𡚸広勐孶斈孼𧨎䀄䡝𠈄寕慠𡨴𥧌𠖥寳宝䴐尅𡭄尓珎尔𡲥𦬨屉䣝岅峩峯嶋𡷹𡸷崐崘嵆𡺤岺巗苼㠭𤤁𢁉𢅳芇㠶㯂帮檊幵幺𤒼𠳓厦亷廐厨𡝱帉廴𨒂"],["fc40","廹廻㢠廼栾鐛弍𠇁弢㫞䢮𡌺强𦢈𢏐彘𢑱彣鞽𦹮彲鍀𨨶徧嶶㵟𥉐𡽪𧃸𢙨釖𠊞𨨩怱暅𡡷㥣㷇㘹垐𢞴祱㹀悞悤悳𤦂𤦏𧩓璤僡媠慤萤慂慈𦻒憁凴𠙖憇宪𣾷"],["fca1","𢡟懓𨮝𩥝懐㤲𢦀𢣁怣慜攞掋𠄘担𡝰拕𢸍捬𤧟㨗搸揸𡎎𡟼撐澊𢸶頔𤂌𥜝擡擥鑻㩦携㩗敍漖𤨨𤨣斅敭敟𣁾斵𤥀䬷旑䃘𡠩无旣忟𣐀昘𣇷𣇸晄𣆤𣆥晋𠹵晧𥇦晳晴𡸽𣈱𨗴𣇈𥌓矅𢣷馤朂𤎜𤨡㬫槺𣟂杞杧杢𤇍𩃭柗䓩栢湐鈼栁𣏦𦶠桝"],["fd40","𣑯槡樋𨫟楳棃𣗍椁椀㴲㨁𣘼㮀枬楡𨩊䋼椶榘㮡𠏉荣傐槹𣙙𢄪橅𣜃檝㯳枱櫈𩆜㰍欝𠤣惞欵歴𢟍溵𣫛𠎵𡥘㝀吡𣭚毡𣻼毜氷𢒋𤣱𦭑汚舦汹𣶼䓅𣶽𤆤𤤌𤤀"],["fda1","𣳉㛥㳫𠴲鮃𣇹𢒑羏样𦴥𦶡𦷫涖浜湼漄𤥿𤂅𦹲蔳𦽴凇沜渝萮𨬡港𣸯瑓𣾂秌湏媑𣁋濸㜍澝𣸰滺𡒗𤀽䕕鏰潄潜㵎潴𩅰㴻澟𤅄濓𤂑𤅕𤀹𣿰𣾴𤄿凟𤅖𤅗𤅀𦇝灋灾炧炁烌烕烖烟䄄㷨熴熖𤉷焫煅媈煊煮岜𤍥煏鍢𤋁焬𤑚𤨧𤨢熺𨯨炽爎"],["fe40","鑂爕夑鑃爤鍁𥘅爮牀𤥴梽牕牗㹕𣁄栍漽犂猪猫𤠣𨠫䣭𨠄猨献珏玪𠰺𦨮珉瑉𤇢𡛧𤨤昣㛅𤦷𤦍𤧻珷琕椃𤨦琹𠗃㻗瑜𢢭瑠𨺲瑇珤瑶莹瑬㜰瑴鏱樬璂䥓𤪌"],["fea1","𤅟𤩹𨮏孆𨰃𡢞瓈𡦈甎瓩甞𨻙𡩋寗𨺬鎅畍畊畧畮𤾂㼄𤴓疎瑝疞疴瘂瘬癑癏癯癶𦏵皐臯㟸𦤑𦤎皡皥皷盌𦾟葢𥂝𥅽𡸜眞眦着撯𥈠睘𣊬瞯𨥤𨥨𡛁矴砉𡍶𤨒棊碯磇磓隥礮𥗠磗礴碱𧘌辸袄𨬫𦂃𢘜禆褀椂禀𥡗禝𧬹礼禩渪𧄦㺨秆𩄍秔"]] - -/***/ }), -/* 149 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var Buffer = __webpack_require__(3).Buffer, - Transform = __webpack_require__(1).Transform; - - -// == Exports ================================================================== -module.exports = function(iconv) { - - // Additional Public API. - iconv.encodeStream = function encodeStream(encoding, options) { - return new IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options); - } - - iconv.decodeStream = function decodeStream(encoding, options) { - return new IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options); - } - - iconv.supportsStreams = true; - - - // Not published yet. - iconv.IconvLiteEncoderStream = IconvLiteEncoderStream; - iconv.IconvLiteDecoderStream = IconvLiteDecoderStream; - iconv._collect = IconvLiteDecoderStream.prototype.collect; -}; - - -// == Encoder stream ======================================================= -function IconvLiteEncoderStream(conv, options) { - this.conv = conv; - options = options || {}; - options.decodeStrings = false; // We accept only strings, so we don't need to decode them. - Transform.call(this, options); -} - -IconvLiteEncoderStream.prototype = Object.create(Transform.prototype, { - constructor: { value: IconvLiteEncoderStream } -}); - -IconvLiteEncoderStream.prototype._transform = function(chunk, encoding, done) { - if (typeof chunk != 'string') - return done(new Error("Iconv encoding stream needs strings as its input.")); - try { - var res = this.conv.write(chunk); - if (res && res.length) this.push(res); - done(); - } - catch (e) { - done(e); - } -} - -IconvLiteEncoderStream.prototype._flush = function(done) { - try { - var res = this.conv.end(); - if (res && res.length) this.push(res); - done(); - } - catch (e) { - done(e); - } -} - -IconvLiteEncoderStream.prototype.collect = function(cb) { - var chunks = []; - this.on('error', cb); - this.on('data', function(chunk) { chunks.push(chunk); }); - this.on('end', function() { - cb(null, Buffer.concat(chunks)); - }); - return this; -} - - -// == Decoder stream ======================================================= -function IconvLiteDecoderStream(conv, options) { - this.conv = conv; - options = options || {}; - options.encoding = this.encoding = 'utf8'; // We output strings. - Transform.call(this, options); -} - -IconvLiteDecoderStream.prototype = Object.create(Transform.prototype, { - constructor: { value: IconvLiteDecoderStream } -}); - -IconvLiteDecoderStream.prototype._transform = function(chunk, encoding, done) { - if (!Buffer.isBuffer(chunk)) - return done(new Error("Iconv decoding stream needs buffers as its input.")); - try { - var res = this.conv.write(chunk); - if (res && res.length) this.push(res, this.encoding); - done(); - } - catch (e) { - done(e); - } -} - -IconvLiteDecoderStream.prototype._flush = function(done) { - try { - var res = this.conv.end(); - if (res && res.length) this.push(res, this.encoding); - done(); - } - catch (e) { - done(e); - } -} - -IconvLiteDecoderStream.prototype.collect = function(cb) { - var res = ''; - this.on('error', cb); - this.on('data', function(chunk) { res += chunk; }); - this.on('end', function() { - cb(null, res); - }); - return this; -} - - - -/***/ }), -/* 150 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var Buffer = __webpack_require__(3).Buffer; - -// == Extend Node primitives to use iconv-lite ================================= - -module.exports = function (iconv) { - var original = undefined; // Place to keep original methods. - - // Node authors rewrote Buffer internals to make it compatible with - // Uint8Array and we cannot patch key functions since then. - iconv.supportsNodeEncodingsExtension = !(new Buffer(0) instanceof Uint8Array); - - iconv.extendNodeEncodings = function extendNodeEncodings() { - if (original) return; - original = {}; - - if (!iconv.supportsNodeEncodingsExtension) { - console.error("ACTION NEEDED: require('iconv-lite').extendNodeEncodings() is not supported in your version of Node"); - console.error("See more info at https://github.com/ashtuchkin/iconv-lite/wiki/Node-v4-compatibility"); - return; - } - - var nodeNativeEncodings = { - 'hex': true, 'utf8': true, 'utf-8': true, 'ascii': true, 'binary': true, - 'base64': true, 'ucs2': true, 'ucs-2': true, 'utf16le': true, 'utf-16le': true, - }; - - Buffer.isNativeEncoding = function(enc) { - return enc && nodeNativeEncodings[enc.toLowerCase()]; - } - - // -- SlowBuffer ----------------------------------------------------------- - var SlowBuffer = __webpack_require__(3).SlowBuffer; - - original.SlowBufferToString = SlowBuffer.prototype.toString; - SlowBuffer.prototype.toString = function(encoding, start, end) { - encoding = String(encoding || 'utf8').toLowerCase(); - - // Use native conversion when possible - if (Buffer.isNativeEncoding(encoding)) - return original.SlowBufferToString.call(this, encoding, start, end); - - // Otherwise, use our decoding method. - if (typeof start == 'undefined') start = 0; - if (typeof end == 'undefined') end = this.length; - return iconv.decode(this.slice(start, end), encoding); - } - - original.SlowBufferWrite = SlowBuffer.prototype.write; - SlowBuffer.prototype.write = function(string, offset, length, encoding) { - // Support both (string, offset, length, encoding) - // and the legacy (string, encoding, offset, length) - if (isFinite(offset)) { - if (!isFinite(length)) { - encoding = length; - length = undefined; - } - } else { // legacy - var swap = encoding; - encoding = offset; - offset = length; - length = swap; - } - - offset = +offset || 0; - var remaining = this.length - offset; - if (!length) { - length = remaining; - } else { - length = +length; - if (length > remaining) { - length = remaining; - } - } - encoding = String(encoding || 'utf8').toLowerCase(); - - // Use native conversion when possible - if (Buffer.isNativeEncoding(encoding)) - return original.SlowBufferWrite.call(this, string, offset, length, encoding); - - if (string.length > 0 && (length < 0 || offset < 0)) - throw new RangeError('attempt to write beyond buffer bounds'); - - // Otherwise, use our encoding method. - var buf = iconv.encode(string, encoding); - if (buf.length < length) length = buf.length; - buf.copy(this, offset, 0, length); - return length; - } - - // -- Buffer --------------------------------------------------------------- - - original.BufferIsEncoding = Buffer.isEncoding; - Buffer.isEncoding = function(encoding) { - return Buffer.isNativeEncoding(encoding) || iconv.encodingExists(encoding); - } - - original.BufferByteLength = Buffer.byteLength; - Buffer.byteLength = SlowBuffer.byteLength = function(str, encoding) { - encoding = String(encoding || 'utf8').toLowerCase(); - - // Use native conversion when possible - if (Buffer.isNativeEncoding(encoding)) - return original.BufferByteLength.call(this, str, encoding); - - // Slow, I know, but we don't have a better way yet. - return iconv.encode(str, encoding).length; - } - - original.BufferToString = Buffer.prototype.toString; - Buffer.prototype.toString = function(encoding, start, end) { - encoding = String(encoding || 'utf8').toLowerCase(); - - // Use native conversion when possible - if (Buffer.isNativeEncoding(encoding)) - return original.BufferToString.call(this, encoding, start, end); - - // Otherwise, use our decoding method. - if (typeof start == 'undefined') start = 0; - if (typeof end == 'undefined') end = this.length; - return iconv.decode(this.slice(start, end), encoding); - } - - original.BufferWrite = Buffer.prototype.write; - Buffer.prototype.write = function(string, offset, length, encoding) { - var _offset = offset, _length = length, _encoding = encoding; - // Support both (string, offset, length, encoding) - // and the legacy (string, encoding, offset, length) - if (isFinite(offset)) { - if (!isFinite(length)) { - encoding = length; - length = undefined; - } - } else { // legacy - var swap = encoding; - encoding = offset; - offset = length; - length = swap; - } - - encoding = String(encoding || 'utf8').toLowerCase(); - - // Use native conversion when possible - if (Buffer.isNativeEncoding(encoding)) - return original.BufferWrite.call(this, string, _offset, _length, _encoding); - - offset = +offset || 0; - var remaining = this.length - offset; - if (!length) { - length = remaining; - } else { - length = +length; - if (length > remaining) { - length = remaining; - } - } - - if (string.length > 0 && (length < 0 || offset < 0)) - throw new RangeError('attempt to write beyond buffer bounds'); - - // Otherwise, use our encoding method. - var buf = iconv.encode(string, encoding); - if (buf.length < length) length = buf.length; - buf.copy(this, offset, 0, length); - return length; - - // TODO: Set _charsWritten. - } - - - // -- Readable ------------------------------------------------------------- - if (iconv.supportsStreams) { - var Readable = __webpack_require__(1).Readable; - - original.ReadableSetEncoding = Readable.prototype.setEncoding; - Readable.prototype.setEncoding = function setEncoding(enc, options) { - // Use our own decoder, it has the same interface. - // We cannot use original function as it doesn't handle BOM-s. - this._readableState.decoder = iconv.getDecoder(enc, options); - this._readableState.encoding = enc; - } - - Readable.prototype.collect = iconv._collect; - } - } - - // Remove iconv-lite Node primitive extensions. - iconv.undoExtendNodeEncodings = function undoExtendNodeEncodings() { - if (!iconv.supportsNodeEncodingsExtension) - return; - if (!original) - throw new Error("require('iconv-lite').undoExtendNodeEncodings(): Nothing to undo; extendNodeEncodings() is not called.") - - delete Buffer.isNativeEncoding; - - var SlowBuffer = __webpack_require__(3).SlowBuffer; - - SlowBuffer.prototype.toString = original.SlowBufferToString; - SlowBuffer.prototype.write = original.SlowBufferWrite; - - Buffer.isEncoding = original.BufferIsEncoding; - Buffer.byteLength = original.BufferByteLength; - Buffer.prototype.toString = original.BufferToString; - Buffer.prototype.write = original.BufferWrite; - - if (iconv.supportsStreams) { - var Readable = __webpack_require__(1).Readable; - - Readable.prototype.setEncoding = original.ReadableSetEncoding; - delete Readable.prototype.collect; - } - - original = undefined; - } -} - - -/***/ }), -/* 151 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * ee-first - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = first - -/** - * Get the first event in a set of event emitters and event pairs. - * - * @param {array} stuff - * @param {function} done - * @public - */ - -function first(stuff, done) { - if (!Array.isArray(stuff)) - throw new TypeError('arg must be an array of [ee, events...] arrays') - - var cleanups = [] - - for (var i = 0; i < stuff.length; i++) { - var arr = stuff[i] - - if (!Array.isArray(arr) || arr.length < 2) - throw new TypeError('each array member must be [ee, events...]') - - var ee = arr[0] - - for (var j = 1; j < arr.length; j++) { - var event = arr[j] - var fn = listener(event, callback) - - // listen to the event - ee.on(event, fn) - // push this listener to the list of cleanups - cleanups.push({ - ee: ee, - event: event, - fn: fn, - }) - } - } - - function callback() { - cleanup() - done.apply(null, arguments) - } - - function cleanup() { - var x - for (var i = 0; i < cleanups.length; i++) { - x = cleanups[i] - x.ee.removeListener(x.event, x.fn) - } - } - - function thunk(fn) { - done = fn - } - - thunk.cancel = cleanup - - return thunk -} - -/** - * Create the event listener. - * @private - */ - -function listener(event, done) { - return function onevent(arg1) { - var args = new Array(arguments.length) - var ee = this - var err = event === 'error' - ? arg1 - : null - - // copy args to prevent arguments escaping scope - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - - done(err, ee, event, args) - } -} - - -/***/ }), -/* 152 */ -/***/ (function(module, exports) { - -/*! - * media-typer - * Copyright(c) 2014 Douglas Christopher Wilson - * MIT Licensed - */ - -/** - * RegExp to match *( ";" parameter ) in RFC 2616 sec 3.7 - * - * parameter = token "=" ( token | quoted-string ) - * token = 1* - * separators = "(" | ")" | "<" | ">" | "@" - * | "," | ";" | ":" | "\" | <"> - * | "/" | "[" | "]" | "?" | "=" - * | "{" | "}" | SP | HT - * quoted-string = ( <"> *(qdtext | quoted-pair ) <"> ) - * qdtext = > - * quoted-pair = "\" CHAR - * CHAR = - * TEXT = - * LWS = [CRLF] 1*( SP | HT ) - * CRLF = CR LF - * CR = - * LF = - * SP = - * SHT = - * CTL = - * OCTET = - */ -var paramRegExp = /; *([!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) *= *("(?:[ !\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\u0020-\u007e])*"|[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+) */g; -var textRegExp = /^[\u0020-\u007e\u0080-\u00ff]+$/ -var tokenRegExp = /^[!#$%&'\*\+\-\.0-9A-Z\^_`a-z\|~]+$/ - -/** - * RegExp to match quoted-pair in RFC 2616 - * - * quoted-pair = "\" CHAR - * CHAR = - */ -var qescRegExp = /\\([\u0000-\u007f])/g; - -/** - * RegExp to match chars that must be quoted-pair in RFC 2616 - */ -var quoteRegExp = /([\\"])/g; - -/** - * RegExp to match type in RFC 6838 - * - * type-name = restricted-name - * subtype-name = restricted-name - * restricted-name = restricted-name-first *126restricted-name-chars - * restricted-name-first = ALPHA / DIGIT - * restricted-name-chars = ALPHA / DIGIT / "!" / "#" / - * "$" / "&" / "-" / "^" / "_" - * restricted-name-chars =/ "." ; Characters before first dot always - * ; specify a facet name - * restricted-name-chars =/ "+" ; Characters after last plus always - * ; specify a structured syntax suffix - * ALPHA = %x41-5A / %x61-7A ; A-Z / a-z - * DIGIT = %x30-39 ; 0-9 - */ -var subtypeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_.-]{0,126}$/ -var typeNameRegExp = /^[A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126}$/ -var typeRegExp = /^ *([A-Za-z0-9][A-Za-z0-9!#$&^_-]{0,126})\/([A-Za-z0-9][A-Za-z0-9!#$&^_.+-]{0,126}) *$/; - -/** - * Module exports. - */ - -exports.format = format -exports.parse = parse - -/** - * Format object to media type. - * - * @param {object} obj - * @return {string} - * @api public - */ - -function format(obj) { - if (!obj || typeof obj !== 'object') { - throw new TypeError('argument obj is required') - } - - var parameters = obj.parameters - var subtype = obj.subtype - var suffix = obj.suffix - var type = obj.type - - if (!type || !typeNameRegExp.test(type)) { - throw new TypeError('invalid type') - } - - if (!subtype || !subtypeNameRegExp.test(subtype)) { - throw new TypeError('invalid subtype') - } - - // format as type/subtype - var string = type + '/' + subtype - - // append +suffix - if (suffix) { - if (!typeNameRegExp.test(suffix)) { - throw new TypeError('invalid suffix') - } - - string += '+' + suffix - } - - // append parameters - if (parameters && typeof parameters === 'object') { - var param - var params = Object.keys(parameters).sort() - - for (var i = 0; i < params.length; i++) { - param = params[i] - - if (!tokenRegExp.test(param)) { - throw new TypeError('invalid parameter name') - } - - string += '; ' + param + '=' + qstring(parameters[param]) - } - } - - return string -} - -/** - * Parse media type to object. - * - * @param {string|object} string - * @return {Object} - * @api public - */ - -function parse(string) { - if (!string) { - throw new TypeError('argument string is required') - } - - // support req/res-like objects as argument - if (typeof string === 'object') { - string = getcontenttype(string) - } - - if (typeof string !== 'string') { - throw new TypeError('argument string is required to be a string') - } - - var index = string.indexOf(';') - var type = index !== -1 - ? string.substr(0, index) - : string - - var key - var match - var obj = splitType(type) - var params = {} - var value - - paramRegExp.lastIndex = index - - while (match = paramRegExp.exec(string)) { - if (match.index !== index) { - throw new TypeError('invalid parameter format') - } - - index += match[0].length - key = match[1].toLowerCase() - value = match[2] - - if (value[0] === '"') { - // remove quotes and escapes - value = value - .substr(1, value.length - 2) - .replace(qescRegExp, '$1') - } - - params[key] = value - } - - if (index !== -1 && index !== string.length) { - throw new TypeError('invalid parameter format') - } - - obj.parameters = params - - return obj -} - -/** - * Get content-type from req/res objects. - * - * @param {object} - * @return {Object} - * @api private - */ - -function getcontenttype(obj) { - if (typeof obj.getHeader === 'function') { - // res-like - return obj.getHeader('content-type') - } - - if (typeof obj.headers === 'object') { - // req-like - return obj.headers && obj.headers['content-type'] - } -} - -/** - * Quote a string if necessary. - * - * @param {string} val - * @return {string} - * @api private - */ - -function qstring(val) { - var str = String(val) - - // no need to quote tokens - if (tokenRegExp.test(str)) { - return str - } - - if (str.length > 0 && !textRegExp.test(str)) { - throw new TypeError('invalid parameter value') - } - - return '"' + str.replace(quoteRegExp, '\\$1') + '"' -} - -/** - * Simply "type/subtype+siffx" into parts. - * - * @param {string} string - * @return {Object} - * @api private - */ - -function splitType(string) { - var match = typeRegExp.exec(string.toLowerCase()) - - if (!match) { - throw new TypeError('invalid media type') - } - - var type = match[1] - var subtype = match[2] - var suffix - - // suffix after last + - var index = subtype.lastIndexOf('+') - if (index !== -1) { - suffix = subtype.substr(index + 1) - subtype = subtype.substr(0, index) - } - - var obj = { - type: type, - subtype: subtype, - suffix: suffix - } - - return obj -} - - -/***/ }), -/* 153 */ -/***/ (function(module, exports, __webpack_require__) { - -/*! - * mime-db - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = __webpack_require__(154) - - -/***/ }), -/* 154 */ -/***/ (function(module, exports) { - -module.exports = {"application/1d-interleaved-parityfec":{"source":"iana"},"application/3gpdash-qoe-report+xml":{"source":"iana"},"application/3gpp-ims+xml":{"source":"iana"},"application/a2l":{"source":"iana"},"application/activemessage":{"source":"iana"},"application/alto-costmap+json":{"source":"iana","compressible":true},"application/alto-costmapfilter+json":{"source":"iana","compressible":true},"application/alto-directory+json":{"source":"iana","compressible":true},"application/alto-endpointcost+json":{"source":"iana","compressible":true},"application/alto-endpointcostparams+json":{"source":"iana","compressible":true},"application/alto-endpointprop+json":{"source":"iana","compressible":true},"application/alto-endpointpropparams+json":{"source":"iana","compressible":true},"application/alto-error+json":{"source":"iana","compressible":true},"application/alto-networkmap+json":{"source":"iana","compressible":true},"application/alto-networkmapfilter+json":{"source":"iana","compressible":true},"application/aml":{"source":"iana"},"application/andrew-inset":{"source":"iana","extensions":["ez"]},"application/applefile":{"source":"iana"},"application/applixware":{"source":"apache","extensions":["aw"]},"application/atf":{"source":"iana"},"application/atfx":{"source":"iana"},"application/atom+xml":{"source":"iana","compressible":true,"extensions":["atom"]},"application/atomcat+xml":{"source":"iana","extensions":["atomcat"]},"application/atomdeleted+xml":{"source":"iana"},"application/atomicmail":{"source":"iana"},"application/atomsvc+xml":{"source":"iana","extensions":["atomsvc"]},"application/atxml":{"source":"iana"},"application/auth-policy+xml":{"source":"iana"},"application/bacnet-xdd+zip":{"source":"iana"},"application/batch-smtp":{"source":"iana"},"application/bdoc":{"compressible":false,"extensions":["bdoc"]},"application/beep+xml":{"source":"iana"},"application/calendar+json":{"source":"iana","compressible":true},"application/calendar+xml":{"source":"iana"},"application/call-completion":{"source":"iana"},"application/cals-1840":{"source":"iana"},"application/cbor":{"source":"iana"},"application/cccex":{"source":"iana"},"application/ccmp+xml":{"source":"iana"},"application/ccxml+xml":{"source":"iana","extensions":["ccxml"]},"application/cdfx+xml":{"source":"iana"},"application/cdmi-capability":{"source":"iana","extensions":["cdmia"]},"application/cdmi-container":{"source":"iana","extensions":["cdmic"]},"application/cdmi-domain":{"source":"iana","extensions":["cdmid"]},"application/cdmi-object":{"source":"iana","extensions":["cdmio"]},"application/cdmi-queue":{"source":"iana","extensions":["cdmiq"]},"application/cdni":{"source":"iana"},"application/cea":{"source":"iana"},"application/cea-2018+xml":{"source":"iana"},"application/cellml+xml":{"source":"iana"},"application/cfw":{"source":"iana"},"application/clue_info+xml":{"source":"iana"},"application/cms":{"source":"iana"},"application/cnrp+xml":{"source":"iana"},"application/coap-group+json":{"source":"iana","compressible":true},"application/coap-payload":{"source":"iana"},"application/commonground":{"source":"iana"},"application/conference-info+xml":{"source":"iana"},"application/cose":{"source":"iana"},"application/cose-key":{"source":"iana"},"application/cose-key-set":{"source":"iana"},"application/cpl+xml":{"source":"iana"},"application/csrattrs":{"source":"iana"},"application/csta+xml":{"source":"iana"},"application/cstadata+xml":{"source":"iana"},"application/csvm+json":{"source":"iana","compressible":true},"application/cu-seeme":{"source":"apache","extensions":["cu"]},"application/cybercash":{"source":"iana"},"application/dart":{"compressible":true},"application/dash+xml":{"source":"iana","extensions":["mpd"]},"application/dashdelta":{"source":"iana"},"application/davmount+xml":{"source":"iana","extensions":["davmount"]},"application/dca-rft":{"source":"iana"},"application/dcd":{"source":"iana"},"application/dec-dx":{"source":"iana"},"application/dialog-info+xml":{"source":"iana"},"application/dicom":{"source":"iana"},"application/dicom+json":{"source":"iana","compressible":true},"application/dicom+xml":{"source":"iana"},"application/dii":{"source":"iana"},"application/dit":{"source":"iana"},"application/dns":{"source":"iana"},"application/docbook+xml":{"source":"apache","extensions":["dbk"]},"application/dskpp+xml":{"source":"iana"},"application/dssc+der":{"source":"iana","extensions":["dssc"]},"application/dssc+xml":{"source":"iana","extensions":["xdssc"]},"application/dvcs":{"source":"iana"},"application/ecmascript":{"source":"iana","compressible":true,"extensions":["ecma"]},"application/edi-consent":{"source":"iana"},"application/edi-x12":{"source":"iana","compressible":false},"application/edifact":{"source":"iana","compressible":false},"application/efi":{"source":"iana"},"application/emergencycalldata.comment+xml":{"source":"iana"},"application/emergencycalldata.control+xml":{"source":"iana"},"application/emergencycalldata.deviceinfo+xml":{"source":"iana"},"application/emergencycalldata.ecall.msd":{"source":"iana"},"application/emergencycalldata.providerinfo+xml":{"source":"iana"},"application/emergencycalldata.serviceinfo+xml":{"source":"iana"},"application/emergencycalldata.subscriberinfo+xml":{"source":"iana"},"application/emergencycalldata.veds+xml":{"source":"iana"},"application/emma+xml":{"source":"iana","extensions":["emma"]},"application/emotionml+xml":{"source":"iana"},"application/encaprtp":{"source":"iana"},"application/epp+xml":{"source":"iana"},"application/epub+zip":{"source":"iana","extensions":["epub"]},"application/eshop":{"source":"iana"},"application/exi":{"source":"iana","extensions":["exi"]},"application/fastinfoset":{"source":"iana"},"application/fastsoap":{"source":"iana"},"application/fdt+xml":{"source":"iana"},"application/fhir+xml":{"source":"iana"},"application/fido.trusted-apps+json":{"compressible":true},"application/fits":{"source":"iana"},"application/font-sfnt":{"source":"iana"},"application/font-tdpfr":{"source":"iana","extensions":["pfr"]},"application/font-woff":{"source":"iana","compressible":false,"extensions":["woff"]},"application/framework-attributes+xml":{"source":"iana"},"application/geo+json":{"source":"iana","compressible":true,"extensions":["geojson"]},"application/geo+json-seq":{"source":"iana"},"application/geoxacml+xml":{"source":"iana"},"application/gml+xml":{"source":"iana","extensions":["gml"]},"application/gpx+xml":{"source":"apache","extensions":["gpx"]},"application/gxf":{"source":"apache","extensions":["gxf"]},"application/gzip":{"source":"iana","compressible":false,"extensions":["gz"]},"application/h224":{"source":"iana"},"application/held+xml":{"source":"iana"},"application/hjson":{"extensions":["hjson"]},"application/http":{"source":"iana"},"application/hyperstudio":{"source":"iana","extensions":["stk"]},"application/ibe-key-request+xml":{"source":"iana"},"application/ibe-pkg-reply+xml":{"source":"iana"},"application/ibe-pp-data":{"source":"iana"},"application/iges":{"source":"iana"},"application/im-iscomposing+xml":{"source":"iana"},"application/index":{"source":"iana"},"application/index.cmd":{"source":"iana"},"application/index.obj":{"source":"iana"},"application/index.response":{"source":"iana"},"application/index.vnd":{"source":"iana"},"application/inkml+xml":{"source":"iana","extensions":["ink","inkml"]},"application/iotp":{"source":"iana"},"application/ipfix":{"source":"iana","extensions":["ipfix"]},"application/ipp":{"source":"iana"},"application/isup":{"source":"iana"},"application/its+xml":{"source":"iana"},"application/java-archive":{"source":"apache","compressible":false,"extensions":["jar","war","ear"]},"application/java-serialized-object":{"source":"apache","compressible":false,"extensions":["ser"]},"application/java-vm":{"source":"apache","compressible":false,"extensions":["class"]},"application/javascript":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["js","mjs"]},"application/jf2feed+json":{"source":"iana","compressible":true},"application/jose":{"source":"iana"},"application/jose+json":{"source":"iana","compressible":true},"application/jrd+json":{"source":"iana","compressible":true},"application/json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["json","map"]},"application/json-patch+json":{"source":"iana","compressible":true},"application/json-seq":{"source":"iana"},"application/json5":{"extensions":["json5"]},"application/jsonml+json":{"source":"apache","compressible":true,"extensions":["jsonml"]},"application/jwk+json":{"source":"iana","compressible":true},"application/jwk-set+json":{"source":"iana","compressible":true},"application/jwt":{"source":"iana"},"application/kpml-request+xml":{"source":"iana"},"application/kpml-response+xml":{"source":"iana"},"application/ld+json":{"source":"iana","compressible":true,"extensions":["jsonld"]},"application/lgr+xml":{"source":"iana"},"application/link-format":{"source":"iana"},"application/load-control+xml":{"source":"iana"},"application/lost+xml":{"source":"iana","extensions":["lostxml"]},"application/lostsync+xml":{"source":"iana"},"application/lxf":{"source":"iana"},"application/mac-binhex40":{"source":"iana","extensions":["hqx"]},"application/mac-compactpro":{"source":"apache","extensions":["cpt"]},"application/macwriteii":{"source":"iana"},"application/mads+xml":{"source":"iana","extensions":["mads"]},"application/manifest+json":{"charset":"UTF-8","compressible":true,"extensions":["webmanifest"]},"application/marc":{"source":"iana","extensions":["mrc"]},"application/marcxml+xml":{"source":"iana","extensions":["mrcx"]},"application/mathematica":{"source":"iana","extensions":["ma","nb","mb"]},"application/mathml+xml":{"source":"iana","extensions":["mathml"]},"application/mathml-content+xml":{"source":"iana"},"application/mathml-presentation+xml":{"source":"iana"},"application/mbms-associated-procedure-description+xml":{"source":"iana"},"application/mbms-deregister+xml":{"source":"iana"},"application/mbms-envelope+xml":{"source":"iana"},"application/mbms-msk+xml":{"source":"iana"},"application/mbms-msk-response+xml":{"source":"iana"},"application/mbms-protection-description+xml":{"source":"iana"},"application/mbms-reception-report+xml":{"source":"iana"},"application/mbms-register+xml":{"source":"iana"},"application/mbms-register-response+xml":{"source":"iana"},"application/mbms-schedule+xml":{"source":"iana"},"application/mbms-user-service-description+xml":{"source":"iana"},"application/mbox":{"source":"iana","extensions":["mbox"]},"application/media-policy-dataset+xml":{"source":"iana"},"application/media_control+xml":{"source":"iana"},"application/mediaservercontrol+xml":{"source":"iana","extensions":["mscml"]},"application/merge-patch+json":{"source":"iana","compressible":true},"application/metalink+xml":{"source":"apache","extensions":["metalink"]},"application/metalink4+xml":{"source":"iana","extensions":["meta4"]},"application/mets+xml":{"source":"iana","extensions":["mets"]},"application/mf4":{"source":"iana"},"application/mikey":{"source":"iana"},"application/mmt-usd+xml":{"source":"iana"},"application/mods+xml":{"source":"iana","extensions":["mods"]},"application/moss-keys":{"source":"iana"},"application/moss-signature":{"source":"iana"},"application/mosskey-data":{"source":"iana"},"application/mosskey-request":{"source":"iana"},"application/mp21":{"source":"iana","extensions":["m21","mp21"]},"application/mp4":{"source":"iana","extensions":["mp4s","m4p"]},"application/mpeg4-generic":{"source":"iana"},"application/mpeg4-iod":{"source":"iana"},"application/mpeg4-iod-xmt":{"source":"iana"},"application/mrb-consumer+xml":{"source":"iana"},"application/mrb-publish+xml":{"source":"iana"},"application/msc-ivr+xml":{"source":"iana"},"application/msc-mixer+xml":{"source":"iana"},"application/msword":{"source":"iana","compressible":false,"extensions":["doc","dot"]},"application/mud+json":{"source":"iana","compressible":true},"application/mxf":{"source":"iana","extensions":["mxf"]},"application/n-quads":{"source":"iana"},"application/n-triples":{"source":"iana"},"application/nasdata":{"source":"iana"},"application/news-checkgroups":{"source":"iana"},"application/news-groupinfo":{"source":"iana"},"application/news-transmission":{"source":"iana"},"application/nlsml+xml":{"source":"iana"},"application/node":{"source":"iana"},"application/nss":{"source":"iana"},"application/ocsp-request":{"source":"iana"},"application/ocsp-response":{"source":"iana"},"application/octet-stream":{"source":"iana","compressible":false,"extensions":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]},"application/oda":{"source":"iana","extensions":["oda"]},"application/odx":{"source":"iana"},"application/oebps-package+xml":{"source":"iana","extensions":["opf"]},"application/ogg":{"source":"iana","compressible":false,"extensions":["ogx"]},"application/omdoc+xml":{"source":"apache","extensions":["omdoc"]},"application/onenote":{"source":"apache","extensions":["onetoc","onetoc2","onetmp","onepkg"]},"application/oxps":{"source":"iana","extensions":["oxps"]},"application/p2p-overlay+xml":{"source":"iana"},"application/parityfec":{"source":"iana"},"application/passport":{"source":"iana"},"application/patch-ops-error+xml":{"source":"iana","extensions":["xer"]},"application/pdf":{"source":"iana","compressible":false,"extensions":["pdf"]},"application/pdx":{"source":"iana"},"application/pgp-encrypted":{"source":"iana","compressible":false,"extensions":["pgp"]},"application/pgp-keys":{"source":"iana"},"application/pgp-signature":{"source":"iana","extensions":["asc","sig"]},"application/pics-rules":{"source":"apache","extensions":["prf"]},"application/pidf+xml":{"source":"iana"},"application/pidf-diff+xml":{"source":"iana"},"application/pkcs10":{"source":"iana","extensions":["p10"]},"application/pkcs12":{"source":"iana"},"application/pkcs7-mime":{"source":"iana","extensions":["p7m","p7c"]},"application/pkcs7-signature":{"source":"iana","extensions":["p7s"]},"application/pkcs8":{"source":"iana","extensions":["p8"]},"application/pkcs8-encrypted":{"source":"iana"},"application/pkix-attr-cert":{"source":"iana","extensions":["ac"]},"application/pkix-cert":{"source":"iana","extensions":["cer"]},"application/pkix-crl":{"source":"iana","extensions":["crl"]},"application/pkix-pkipath":{"source":"iana","extensions":["pkipath"]},"application/pkixcmp":{"source":"iana","extensions":["pki"]},"application/pls+xml":{"source":"iana","extensions":["pls"]},"application/poc-settings+xml":{"source":"iana"},"application/postscript":{"source":"iana","compressible":true,"extensions":["ai","eps","ps"]},"application/ppsp-tracker+json":{"source":"iana","compressible":true},"application/problem+json":{"source":"iana","compressible":true},"application/problem+xml":{"source":"iana"},"application/provenance+xml":{"source":"iana"},"application/prs.alvestrand.titrax-sheet":{"source":"iana"},"application/prs.cww":{"source":"iana","extensions":["cww"]},"application/prs.hpub+zip":{"source":"iana"},"application/prs.nprend":{"source":"iana"},"application/prs.plucker":{"source":"iana"},"application/prs.rdf-xml-crypt":{"source":"iana"},"application/prs.xsf+xml":{"source":"iana"},"application/pskc+xml":{"source":"iana","extensions":["pskcxml"]},"application/qsig":{"source":"iana"},"application/raml+yaml":{"compressible":true,"extensions":["raml"]},"application/raptorfec":{"source":"iana"},"application/rdap+json":{"source":"iana","compressible":true},"application/rdf+xml":{"source":"iana","compressible":true,"extensions":["rdf"]},"application/reginfo+xml":{"source":"iana","extensions":["rif"]},"application/relax-ng-compact-syntax":{"source":"iana","extensions":["rnc"]},"application/remote-printing":{"source":"iana"},"application/reputon+json":{"source":"iana","compressible":true},"application/resource-lists+xml":{"source":"iana","extensions":["rl"]},"application/resource-lists-diff+xml":{"source":"iana","extensions":["rld"]},"application/rfc+xml":{"source":"iana"},"application/riscos":{"source":"iana"},"application/rlmi+xml":{"source":"iana"},"application/rls-services+xml":{"source":"iana","extensions":["rs"]},"application/route-apd+xml":{"source":"iana"},"application/route-s-tsid+xml":{"source":"iana"},"application/route-usd+xml":{"source":"iana"},"application/rpki-ghostbusters":{"source":"iana","extensions":["gbr"]},"application/rpki-manifest":{"source":"iana","extensions":["mft"]},"application/rpki-publication":{"source":"iana"},"application/rpki-roa":{"source":"iana","extensions":["roa"]},"application/rpki-updown":{"source":"iana"},"application/rsd+xml":{"source":"apache","extensions":["rsd"]},"application/rss+xml":{"source":"apache","compressible":true,"extensions":["rss"]},"application/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"application/rtploopback":{"source":"iana"},"application/rtx":{"source":"iana"},"application/samlassertion+xml":{"source":"iana"},"application/samlmetadata+xml":{"source":"iana"},"application/sbml+xml":{"source":"iana","extensions":["sbml"]},"application/scaip+xml":{"source":"iana"},"application/scim+json":{"source":"iana","compressible":true},"application/scvp-cv-request":{"source":"iana","extensions":["scq"]},"application/scvp-cv-response":{"source":"iana","extensions":["scs"]},"application/scvp-vp-request":{"source":"iana","extensions":["spq"]},"application/scvp-vp-response":{"source":"iana","extensions":["spp"]},"application/sdp":{"source":"iana","extensions":["sdp"]},"application/sep+xml":{"source":"iana"},"application/sep-exi":{"source":"iana"},"application/session-info":{"source":"iana"},"application/set-payment":{"source":"iana"},"application/set-payment-initiation":{"source":"iana","extensions":["setpay"]},"application/set-registration":{"source":"iana"},"application/set-registration-initiation":{"source":"iana","extensions":["setreg"]},"application/sgml":{"source":"iana"},"application/sgml-open-catalog":{"source":"iana"},"application/shf+xml":{"source":"iana","extensions":["shf"]},"application/sieve":{"source":"iana"},"application/simple-filter+xml":{"source":"iana"},"application/simple-message-summary":{"source":"iana"},"application/simplesymbolcontainer":{"source":"iana"},"application/slate":{"source":"iana"},"application/smil":{"source":"iana"},"application/smil+xml":{"source":"iana","extensions":["smi","smil"]},"application/smpte336m":{"source":"iana"},"application/soap+fastinfoset":{"source":"iana"},"application/soap+xml":{"source":"iana","compressible":true},"application/sparql-query":{"source":"iana","extensions":["rq"]},"application/sparql-results+xml":{"source":"iana","extensions":["srx"]},"application/spirits-event+xml":{"source":"iana"},"application/sql":{"source":"iana"},"application/srgs":{"source":"iana","extensions":["gram"]},"application/srgs+xml":{"source":"iana","extensions":["grxml"]},"application/sru+xml":{"source":"iana","extensions":["sru"]},"application/ssdl+xml":{"source":"apache","extensions":["ssdl"]},"application/ssml+xml":{"source":"iana","extensions":["ssml"]},"application/tamp-apex-update":{"source":"iana"},"application/tamp-apex-update-confirm":{"source":"iana"},"application/tamp-community-update":{"source":"iana"},"application/tamp-community-update-confirm":{"source":"iana"},"application/tamp-error":{"source":"iana"},"application/tamp-sequence-adjust":{"source":"iana"},"application/tamp-sequence-adjust-confirm":{"source":"iana"},"application/tamp-status-query":{"source":"iana"},"application/tamp-status-response":{"source":"iana"},"application/tamp-update":{"source":"iana"},"application/tamp-update-confirm":{"source":"iana"},"application/tar":{"compressible":true},"application/tei+xml":{"source":"iana","extensions":["tei","teicorpus"]},"application/thraud+xml":{"source":"iana","extensions":["tfi"]},"application/timestamp-query":{"source":"iana"},"application/timestamp-reply":{"source":"iana"},"application/timestamped-data":{"source":"iana","extensions":["tsd"]},"application/tnauthlist":{"source":"iana"},"application/trig":{"source":"iana"},"application/ttml+xml":{"source":"iana"},"application/tve-trigger":{"source":"iana"},"application/ulpfec":{"source":"iana"},"application/urc-grpsheet+xml":{"source":"iana"},"application/urc-ressheet+xml":{"source":"iana"},"application/urc-targetdesc+xml":{"source":"iana"},"application/urc-uisocketdesc+xml":{"source":"iana"},"application/vcard+json":{"source":"iana","compressible":true},"application/vcard+xml":{"source":"iana"},"application/vemmi":{"source":"iana"},"application/vividence.scriptfile":{"source":"apache"},"application/vnd.1000minds.decision-model+xml":{"source":"iana"},"application/vnd.3gpp-prose+xml":{"source":"iana"},"application/vnd.3gpp-prose-pc3ch+xml":{"source":"iana"},"application/vnd.3gpp-v2x-local-service-information":{"source":"iana"},"application/vnd.3gpp.access-transfer-events+xml":{"source":"iana"},"application/vnd.3gpp.bsf+xml":{"source":"iana"},"application/vnd.3gpp.gmop+xml":{"source":"iana"},"application/vnd.3gpp.mcptt-affiliation-command+xml":{"source":"iana"},"application/vnd.3gpp.mcptt-floor-request+xml":{"source":"iana"},"application/vnd.3gpp.mcptt-info+xml":{"source":"iana"},"application/vnd.3gpp.mcptt-location-info+xml":{"source":"iana"},"application/vnd.3gpp.mcptt-mbms-usage-info+xml":{"source":"iana"},"application/vnd.3gpp.mcptt-signed+xml":{"source":"iana"},"application/vnd.3gpp.mid-call+xml":{"source":"iana"},"application/vnd.3gpp.pic-bw-large":{"source":"iana","extensions":["plb"]},"application/vnd.3gpp.pic-bw-small":{"source":"iana","extensions":["psb"]},"application/vnd.3gpp.pic-bw-var":{"source":"iana","extensions":["pvb"]},"application/vnd.3gpp.sms":{"source":"iana"},"application/vnd.3gpp.sms+xml":{"source":"iana"},"application/vnd.3gpp.srvcc-ext+xml":{"source":"iana"},"application/vnd.3gpp.srvcc-info+xml":{"source":"iana"},"application/vnd.3gpp.state-and-event-info+xml":{"source":"iana"},"application/vnd.3gpp.ussd+xml":{"source":"iana"},"application/vnd.3gpp2.bcmcsinfo+xml":{"source":"iana"},"application/vnd.3gpp2.sms":{"source":"iana"},"application/vnd.3gpp2.tcap":{"source":"iana","extensions":["tcap"]},"application/vnd.3lightssoftware.imagescal":{"source":"iana"},"application/vnd.3m.post-it-notes":{"source":"iana","extensions":["pwn"]},"application/vnd.accpac.simply.aso":{"source":"iana","extensions":["aso"]},"application/vnd.accpac.simply.imp":{"source":"iana","extensions":["imp"]},"application/vnd.acucobol":{"source":"iana","extensions":["acu"]},"application/vnd.acucorp":{"source":"iana","extensions":["atc","acutc"]},"application/vnd.adobe.air-application-installer-package+zip":{"source":"apache","extensions":["air"]},"application/vnd.adobe.flash.movie":{"source":"iana"},"application/vnd.adobe.formscentral.fcdt":{"source":"iana","extensions":["fcdt"]},"application/vnd.adobe.fxp":{"source":"iana","extensions":["fxp","fxpl"]},"application/vnd.adobe.partial-upload":{"source":"iana"},"application/vnd.adobe.xdp+xml":{"source":"iana","extensions":["xdp"]},"application/vnd.adobe.xfdf":{"source":"iana","extensions":["xfdf"]},"application/vnd.aether.imp":{"source":"iana"},"application/vnd.ah-barcode":{"source":"iana"},"application/vnd.ahead.space":{"source":"iana","extensions":["ahead"]},"application/vnd.airzip.filesecure.azf":{"source":"iana","extensions":["azf"]},"application/vnd.airzip.filesecure.azs":{"source":"iana","extensions":["azs"]},"application/vnd.amadeus+json":{"source":"iana","compressible":true},"application/vnd.amazon.ebook":{"source":"apache","extensions":["azw"]},"application/vnd.amazon.mobi8-ebook":{"source":"iana"},"application/vnd.americandynamics.acc":{"source":"iana","extensions":["acc"]},"application/vnd.amiga.ami":{"source":"iana","extensions":["ami"]},"application/vnd.amundsen.maze+xml":{"source":"iana"},"application/vnd.android.package-archive":{"source":"apache","compressible":false,"extensions":["apk"]},"application/vnd.anki":{"source":"iana"},"application/vnd.anser-web-certificate-issue-initiation":{"source":"iana","extensions":["cii"]},"application/vnd.anser-web-funds-transfer-initiation":{"source":"apache","extensions":["fti"]},"application/vnd.antix.game-component":{"source":"iana","extensions":["atx"]},"application/vnd.apache.thrift.binary":{"source":"iana"},"application/vnd.apache.thrift.compact":{"source":"iana"},"application/vnd.apache.thrift.json":{"source":"iana"},"application/vnd.api+json":{"source":"iana","compressible":true},"application/vnd.apothekende.reservation+json":{"source":"iana","compressible":true},"application/vnd.apple.installer+xml":{"source":"iana","extensions":["mpkg"]},"application/vnd.apple.mpegurl":{"source":"iana","extensions":["m3u8"]},"application/vnd.apple.pkpass":{"compressible":false,"extensions":["pkpass"]},"application/vnd.arastra.swi":{"source":"iana"},"application/vnd.aristanetworks.swi":{"source":"iana","extensions":["swi"]},"application/vnd.artsquare":{"source":"iana"},"application/vnd.astraea-software.iota":{"source":"iana","extensions":["iota"]},"application/vnd.audiograph":{"source":"iana","extensions":["aep"]},"application/vnd.autopackage":{"source":"iana"},"application/vnd.avalon+json":{"source":"iana","compressible":true},"application/vnd.avistar+xml":{"source":"iana"},"application/vnd.balsamiq.bmml+xml":{"source":"iana"},"application/vnd.balsamiq.bmpr":{"source":"iana"},"application/vnd.bbf.usp.msg":{"source":"iana"},"application/vnd.bbf.usp.msg+json":{"source":"iana","compressible":true},"application/vnd.bekitzur-stech+json":{"source":"iana","compressible":true},"application/vnd.bint.med-content":{"source":"iana"},"application/vnd.biopax.rdf+xml":{"source":"iana"},"application/vnd.blink-idb-value-wrapper":{"source":"iana"},"application/vnd.blueice.multipass":{"source":"iana","extensions":["mpm"]},"application/vnd.bluetooth.ep.oob":{"source":"iana"},"application/vnd.bluetooth.le.oob":{"source":"iana"},"application/vnd.bmi":{"source":"iana","extensions":["bmi"]},"application/vnd.businessobjects":{"source":"iana","extensions":["rep"]},"application/vnd.cab-jscript":{"source":"iana"},"application/vnd.canon-cpdl":{"source":"iana"},"application/vnd.canon-lips":{"source":"iana"},"application/vnd.capasystems-pg+json":{"source":"iana","compressible":true},"application/vnd.cendio.thinlinc.clientconf":{"source":"iana"},"application/vnd.century-systems.tcp_stream":{"source":"iana"},"application/vnd.chemdraw+xml":{"source":"iana","extensions":["cdxml"]},"application/vnd.chess-pgn":{"source":"iana"},"application/vnd.chipnuts.karaoke-mmd":{"source":"iana","extensions":["mmd"]},"application/vnd.cinderella":{"source":"iana","extensions":["cdy"]},"application/vnd.cirpack.isdn-ext":{"source":"iana"},"application/vnd.citationstyles.style+xml":{"source":"iana"},"application/vnd.claymore":{"source":"iana","extensions":["cla"]},"application/vnd.cloanto.rp9":{"source":"iana","extensions":["rp9"]},"application/vnd.clonk.c4group":{"source":"iana","extensions":["c4g","c4d","c4f","c4p","c4u"]},"application/vnd.cluetrust.cartomobile-config":{"source":"iana","extensions":["c11amc"]},"application/vnd.cluetrust.cartomobile-config-pkg":{"source":"iana","extensions":["c11amz"]},"application/vnd.coffeescript":{"source":"iana"},"application/vnd.collabio.xodocuments.document":{"source":"iana"},"application/vnd.collabio.xodocuments.document-template":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation-template":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet-template":{"source":"iana"},"application/vnd.collection+json":{"source":"iana","compressible":true},"application/vnd.collection.doc+json":{"source":"iana","compressible":true},"application/vnd.collection.next+json":{"source":"iana","compressible":true},"application/vnd.comicbook+zip":{"source":"iana"},"application/vnd.comicbook-rar":{"source":"iana"},"application/vnd.commerce-battelle":{"source":"iana"},"application/vnd.commonspace":{"source":"iana","extensions":["csp"]},"application/vnd.contact.cmsg":{"source":"iana","extensions":["cdbcmsg"]},"application/vnd.coreos.ignition+json":{"source":"iana","compressible":true},"application/vnd.cosmocaller":{"source":"iana","extensions":["cmc"]},"application/vnd.crick.clicker":{"source":"iana","extensions":["clkx"]},"application/vnd.crick.clicker.keyboard":{"source":"iana","extensions":["clkk"]},"application/vnd.crick.clicker.palette":{"source":"iana","extensions":["clkp"]},"application/vnd.crick.clicker.template":{"source":"iana","extensions":["clkt"]},"application/vnd.crick.clicker.wordbank":{"source":"iana","extensions":["clkw"]},"application/vnd.criticaltools.wbs+xml":{"source":"iana","extensions":["wbs"]},"application/vnd.ctc-posml":{"source":"iana","extensions":["pml"]},"application/vnd.ctct.ws+xml":{"source":"iana"},"application/vnd.cups-pdf":{"source":"iana"},"application/vnd.cups-postscript":{"source":"iana"},"application/vnd.cups-ppd":{"source":"iana","extensions":["ppd"]},"application/vnd.cups-raster":{"source":"iana"},"application/vnd.cups-raw":{"source":"iana"},"application/vnd.curl":{"source":"iana"},"application/vnd.curl.car":{"source":"apache","extensions":["car"]},"application/vnd.curl.pcurl":{"source":"apache","extensions":["pcurl"]},"application/vnd.cyan.dean.root+xml":{"source":"iana"},"application/vnd.cybank":{"source":"iana"},"application/vnd.d2l.coursepackage1p0+zip":{"source":"iana"},"application/vnd.dart":{"source":"iana","compressible":true,"extensions":["dart"]},"application/vnd.data-vision.rdz":{"source":"iana","extensions":["rdz"]},"application/vnd.datapackage+json":{"source":"iana","compressible":true},"application/vnd.dataresource+json":{"source":"iana","compressible":true},"application/vnd.debian.binary-package":{"source":"iana"},"application/vnd.dece.data":{"source":"iana","extensions":["uvf","uvvf","uvd","uvvd"]},"application/vnd.dece.ttml+xml":{"source":"iana","extensions":["uvt","uvvt"]},"application/vnd.dece.unspecified":{"source":"iana","extensions":["uvx","uvvx"]},"application/vnd.dece.zip":{"source":"iana","extensions":["uvz","uvvz"]},"application/vnd.denovo.fcselayout-link":{"source":"iana","extensions":["fe_launch"]},"application/vnd.desmume-movie":{"source":"iana"},"application/vnd.desmume.movie":{"source":"apache"},"application/vnd.dir-bi.plate-dl-nosuffix":{"source":"iana"},"application/vnd.dm.delegation+xml":{"source":"iana"},"application/vnd.dna":{"source":"iana","extensions":["dna"]},"application/vnd.document+json":{"source":"iana","compressible":true},"application/vnd.dolby.mlp":{"source":"apache","extensions":["mlp"]},"application/vnd.dolby.mobile.1":{"source":"iana"},"application/vnd.dolby.mobile.2":{"source":"iana"},"application/vnd.doremir.scorecloud-binary-document":{"source":"iana"},"application/vnd.dpgraph":{"source":"iana","extensions":["dpg"]},"application/vnd.dreamfactory":{"source":"iana","extensions":["dfac"]},"application/vnd.drive+json":{"source":"iana","compressible":true},"application/vnd.ds-keypoint":{"source":"apache","extensions":["kpxx"]},"application/vnd.dtg.local":{"source":"iana"},"application/vnd.dtg.local.flash":{"source":"iana"},"application/vnd.dtg.local.html":{"source":"iana"},"application/vnd.dvb.ait":{"source":"iana","extensions":["ait"]},"application/vnd.dvb.dvbj":{"source":"iana"},"application/vnd.dvb.esgcontainer":{"source":"iana"},"application/vnd.dvb.ipdcdftnotifaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess2":{"source":"iana"},"application/vnd.dvb.ipdcesgpdd":{"source":"iana"},"application/vnd.dvb.ipdcroaming":{"source":"iana"},"application/vnd.dvb.iptv.alfec-base":{"source":"iana"},"application/vnd.dvb.iptv.alfec-enhancement":{"source":"iana"},"application/vnd.dvb.notif-aggregate-root+xml":{"source":"iana"},"application/vnd.dvb.notif-container+xml":{"source":"iana"},"application/vnd.dvb.notif-generic+xml":{"source":"iana"},"application/vnd.dvb.notif-ia-msglist+xml":{"source":"iana"},"application/vnd.dvb.notif-ia-registration-request+xml":{"source":"iana"},"application/vnd.dvb.notif-ia-registration-response+xml":{"source":"iana"},"application/vnd.dvb.notif-init+xml":{"source":"iana"},"application/vnd.dvb.pfr":{"source":"iana"},"application/vnd.dvb.service":{"source":"iana","extensions":["svc"]},"application/vnd.dxr":{"source":"iana"},"application/vnd.dynageo":{"source":"iana","extensions":["geo"]},"application/vnd.dzr":{"source":"iana"},"application/vnd.easykaraoke.cdgdownload":{"source":"iana"},"application/vnd.ecdis-update":{"source":"iana"},"application/vnd.ecip.rlp":{"source":"iana"},"application/vnd.ecowin.chart":{"source":"iana","extensions":["mag"]},"application/vnd.ecowin.filerequest":{"source":"iana"},"application/vnd.ecowin.fileupdate":{"source":"iana"},"application/vnd.ecowin.series":{"source":"iana"},"application/vnd.ecowin.seriesrequest":{"source":"iana"},"application/vnd.ecowin.seriesupdate":{"source":"iana"},"application/vnd.efi.img":{"source":"iana"},"application/vnd.efi.iso":{"source":"iana"},"application/vnd.emclient.accessrequest+xml":{"source":"iana"},"application/vnd.enliven":{"source":"iana","extensions":["nml"]},"application/vnd.enphase.envoy":{"source":"iana"},"application/vnd.eprints.data+xml":{"source":"iana"},"application/vnd.epson.esf":{"source":"iana","extensions":["esf"]},"application/vnd.epson.msf":{"source":"iana","extensions":["msf"]},"application/vnd.epson.quickanime":{"source":"iana","extensions":["qam"]},"application/vnd.epson.salt":{"source":"iana","extensions":["slt"]},"application/vnd.epson.ssf":{"source":"iana","extensions":["ssf"]},"application/vnd.ericsson.quickcall":{"source":"iana"},"application/vnd.espass-espass+zip":{"source":"iana"},"application/vnd.eszigno3+xml":{"source":"iana","extensions":["es3","et3"]},"application/vnd.etsi.aoc+xml":{"source":"iana"},"application/vnd.etsi.asic-e+zip":{"source":"iana"},"application/vnd.etsi.asic-s+zip":{"source":"iana"},"application/vnd.etsi.cug+xml":{"source":"iana"},"application/vnd.etsi.iptvcommand+xml":{"source":"iana"},"application/vnd.etsi.iptvdiscovery+xml":{"source":"iana"},"application/vnd.etsi.iptvprofile+xml":{"source":"iana"},"application/vnd.etsi.iptvsad-bc+xml":{"source":"iana"},"application/vnd.etsi.iptvsad-cod+xml":{"source":"iana"},"application/vnd.etsi.iptvsad-npvr+xml":{"source":"iana"},"application/vnd.etsi.iptvservice+xml":{"source":"iana"},"application/vnd.etsi.iptvsync+xml":{"source":"iana"},"application/vnd.etsi.iptvueprofile+xml":{"source":"iana"},"application/vnd.etsi.mcid+xml":{"source":"iana"},"application/vnd.etsi.mheg5":{"source":"iana"},"application/vnd.etsi.overload-control-policy-dataset+xml":{"source":"iana"},"application/vnd.etsi.pstn+xml":{"source":"iana"},"application/vnd.etsi.sci+xml":{"source":"iana"},"application/vnd.etsi.simservs+xml":{"source":"iana"},"application/vnd.etsi.timestamp-token":{"source":"iana"},"application/vnd.etsi.tsl+xml":{"source":"iana"},"application/vnd.etsi.tsl.der":{"source":"iana"},"application/vnd.eudora.data":{"source":"iana"},"application/vnd.evolv.ecig.profile":{"source":"iana"},"application/vnd.evolv.ecig.settings":{"source":"iana"},"application/vnd.evolv.ecig.theme":{"source":"iana"},"application/vnd.ezpix-album":{"source":"iana","extensions":["ez2"]},"application/vnd.ezpix-package":{"source":"iana","extensions":["ez3"]},"application/vnd.f-secure.mobile":{"source":"iana"},"application/vnd.fastcopy-disk-image":{"source":"iana"},"application/vnd.fdf":{"source":"iana","extensions":["fdf"]},"application/vnd.fdsn.mseed":{"source":"iana","extensions":["mseed"]},"application/vnd.fdsn.seed":{"source":"iana","extensions":["seed","dataless"]},"application/vnd.ffsns":{"source":"iana"},"application/vnd.filmit.zfc":{"source":"iana"},"application/vnd.fints":{"source":"iana"},"application/vnd.firemonkeys.cloudcell":{"source":"iana"},"application/vnd.flographit":{"source":"iana","extensions":["gph"]},"application/vnd.fluxtime.clip":{"source":"iana","extensions":["ftc"]},"application/vnd.font-fontforge-sfd":{"source":"iana"},"application/vnd.framemaker":{"source":"iana","extensions":["fm","frame","maker","book"]},"application/vnd.frogans.fnc":{"source":"iana","extensions":["fnc"]},"application/vnd.frogans.ltf":{"source":"iana","extensions":["ltf"]},"application/vnd.fsc.weblaunch":{"source":"iana","extensions":["fsc"]},"application/vnd.fujitsu.oasys":{"source":"iana","extensions":["oas"]},"application/vnd.fujitsu.oasys2":{"source":"iana","extensions":["oa2"]},"application/vnd.fujitsu.oasys3":{"source":"iana","extensions":["oa3"]},"application/vnd.fujitsu.oasysgp":{"source":"iana","extensions":["fg5"]},"application/vnd.fujitsu.oasysprs":{"source":"iana","extensions":["bh2"]},"application/vnd.fujixerox.art-ex":{"source":"iana"},"application/vnd.fujixerox.art4":{"source":"iana"},"application/vnd.fujixerox.ddd":{"source":"iana","extensions":["ddd"]},"application/vnd.fujixerox.docuworks":{"source":"iana","extensions":["xdw"]},"application/vnd.fujixerox.docuworks.binder":{"source":"iana","extensions":["xbd"]},"application/vnd.fujixerox.docuworks.container":{"source":"iana"},"application/vnd.fujixerox.hbpl":{"source":"iana"},"application/vnd.fut-misnet":{"source":"iana"},"application/vnd.fuzzysheet":{"source":"iana","extensions":["fzs"]},"application/vnd.genomatix.tuxedo":{"source":"iana","extensions":["txd"]},"application/vnd.geo+json":{"source":"iana","compressible":true},"application/vnd.geocube+xml":{"source":"iana"},"application/vnd.geogebra.file":{"source":"iana","extensions":["ggb"]},"application/vnd.geogebra.tool":{"source":"iana","extensions":["ggt"]},"application/vnd.geometry-explorer":{"source":"iana","extensions":["gex","gre"]},"application/vnd.geonext":{"source":"iana","extensions":["gxt"]},"application/vnd.geoplan":{"source":"iana","extensions":["g2w"]},"application/vnd.geospace":{"source":"iana","extensions":["g3w"]},"application/vnd.gerber":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt-response":{"source":"iana"},"application/vnd.gmx":{"source":"iana","extensions":["gmx"]},"application/vnd.google-apps.document":{"compressible":false,"extensions":["gdoc"]},"application/vnd.google-apps.presentation":{"compressible":false,"extensions":["gslides"]},"application/vnd.google-apps.spreadsheet":{"compressible":false,"extensions":["gsheet"]},"application/vnd.google-earth.kml+xml":{"source":"iana","compressible":true,"extensions":["kml"]},"application/vnd.google-earth.kmz":{"source":"iana","compressible":false,"extensions":["kmz"]},"application/vnd.gov.sk.e-form+xml":{"source":"iana"},"application/vnd.gov.sk.e-form+zip":{"source":"iana"},"application/vnd.gov.sk.xmldatacontainer+xml":{"source":"iana"},"application/vnd.grafeq":{"source":"iana","extensions":["gqf","gqs"]},"application/vnd.gridmp":{"source":"iana"},"application/vnd.groove-account":{"source":"iana","extensions":["gac"]},"application/vnd.groove-help":{"source":"iana","extensions":["ghf"]},"application/vnd.groove-identity-message":{"source":"iana","extensions":["gim"]},"application/vnd.groove-injector":{"source":"iana","extensions":["grv"]},"application/vnd.groove-tool-message":{"source":"iana","extensions":["gtm"]},"application/vnd.groove-tool-template":{"source":"iana","extensions":["tpl"]},"application/vnd.groove-vcard":{"source":"iana","extensions":["vcg"]},"application/vnd.hal+json":{"source":"iana","compressible":true},"application/vnd.hal+xml":{"source":"iana","extensions":["hal"]},"application/vnd.handheld-entertainment+xml":{"source":"iana","extensions":["zmm"]},"application/vnd.hbci":{"source":"iana","extensions":["hbci"]},"application/vnd.hc+json":{"source":"iana","compressible":true},"application/vnd.hcl-bireports":{"source":"iana"},"application/vnd.hdt":{"source":"iana"},"application/vnd.heroku+json":{"source":"iana","compressible":true},"application/vnd.hhe.lesson-player":{"source":"iana","extensions":["les"]},"application/vnd.hp-hpgl":{"source":"iana","extensions":["hpgl"]},"application/vnd.hp-hpid":{"source":"iana","extensions":["hpid"]},"application/vnd.hp-hps":{"source":"iana","extensions":["hps"]},"application/vnd.hp-jlyt":{"source":"iana","extensions":["jlt"]},"application/vnd.hp-pcl":{"source":"iana","extensions":["pcl"]},"application/vnd.hp-pclxl":{"source":"iana","extensions":["pclxl"]},"application/vnd.httphone":{"source":"iana"},"application/vnd.hydrostatix.sof-data":{"source":"iana","extensions":["sfd-hdstx"]},"application/vnd.hyper-item+json":{"source":"iana","compressible":true},"application/vnd.hyperdrive+json":{"source":"iana","compressible":true},"application/vnd.hzn-3d-crossword":{"source":"iana"},"application/vnd.ibm.afplinedata":{"source":"iana"},"application/vnd.ibm.electronic-media":{"source":"iana"},"application/vnd.ibm.minipay":{"source":"iana","extensions":["mpy"]},"application/vnd.ibm.modcap":{"source":"iana","extensions":["afp","listafp","list3820"]},"application/vnd.ibm.rights-management":{"source":"iana","extensions":["irm"]},"application/vnd.ibm.secure-container":{"source":"iana","extensions":["sc"]},"application/vnd.iccprofile":{"source":"iana","extensions":["icc","icm"]},"application/vnd.ieee.1905":{"source":"iana"},"application/vnd.igloader":{"source":"iana","extensions":["igl"]},"application/vnd.imagemeter.folder+zip":{"source":"iana"},"application/vnd.imagemeter.image+zip":{"source":"iana"},"application/vnd.immervision-ivp":{"source":"iana","extensions":["ivp"]},"application/vnd.immervision-ivu":{"source":"iana","extensions":["ivu"]},"application/vnd.ims.imsccv1p1":{"source":"iana"},"application/vnd.ims.imsccv1p2":{"source":"iana"},"application/vnd.ims.imsccv1p3":{"source":"iana"},"application/vnd.ims.lis.v2.result+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolconsumerprofile+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy.id+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings.simple+json":{"source":"iana","compressible":true},"application/vnd.informedcontrol.rms+xml":{"source":"iana"},"application/vnd.informix-visionary":{"source":"iana"},"application/vnd.infotech.project":{"source":"iana"},"application/vnd.infotech.project+xml":{"source":"iana"},"application/vnd.innopath.wamp.notification":{"source":"iana"},"application/vnd.insors.igm":{"source":"iana","extensions":["igm"]},"application/vnd.intercon.formnet":{"source":"iana","extensions":["xpw","xpx"]},"application/vnd.intergeo":{"source":"iana","extensions":["i2g"]},"application/vnd.intertrust.digibox":{"source":"iana"},"application/vnd.intertrust.nncp":{"source":"iana"},"application/vnd.intu.qbo":{"source":"iana","extensions":["qbo"]},"application/vnd.intu.qfx":{"source":"iana","extensions":["qfx"]},"application/vnd.iptc.g2.catalogitem+xml":{"source":"iana"},"application/vnd.iptc.g2.conceptitem+xml":{"source":"iana"},"application/vnd.iptc.g2.knowledgeitem+xml":{"source":"iana"},"application/vnd.iptc.g2.newsitem+xml":{"source":"iana"},"application/vnd.iptc.g2.newsmessage+xml":{"source":"iana"},"application/vnd.iptc.g2.packageitem+xml":{"source":"iana"},"application/vnd.iptc.g2.planningitem+xml":{"source":"iana"},"application/vnd.ipunplugged.rcprofile":{"source":"iana","extensions":["rcprofile"]},"application/vnd.irepository.package+xml":{"source":"iana","extensions":["irp"]},"application/vnd.is-xpr":{"source":"iana","extensions":["xpr"]},"application/vnd.isac.fcs":{"source":"iana","extensions":["fcs"]},"application/vnd.jam":{"source":"iana","extensions":["jam"]},"application/vnd.japannet-directory-service":{"source":"iana"},"application/vnd.japannet-jpnstore-wakeup":{"source":"iana"},"application/vnd.japannet-payment-wakeup":{"source":"iana"},"application/vnd.japannet-registration":{"source":"iana"},"application/vnd.japannet-registration-wakeup":{"source":"iana"},"application/vnd.japannet-setstore-wakeup":{"source":"iana"},"application/vnd.japannet-verification":{"source":"iana"},"application/vnd.japannet-verification-wakeup":{"source":"iana"},"application/vnd.jcp.javame.midlet-rms":{"source":"iana","extensions":["rms"]},"application/vnd.jisp":{"source":"iana","extensions":["jisp"]},"application/vnd.joost.joda-archive":{"source":"iana","extensions":["joda"]},"application/vnd.jsk.isdn-ngn":{"source":"iana"},"application/vnd.kahootz":{"source":"iana","extensions":["ktz","ktr"]},"application/vnd.kde.karbon":{"source":"iana","extensions":["karbon"]},"application/vnd.kde.kchart":{"source":"iana","extensions":["chrt"]},"application/vnd.kde.kformula":{"source":"iana","extensions":["kfo"]},"application/vnd.kde.kivio":{"source":"iana","extensions":["flw"]},"application/vnd.kde.kontour":{"source":"iana","extensions":["kon"]},"application/vnd.kde.kpresenter":{"source":"iana","extensions":["kpr","kpt"]},"application/vnd.kde.kspread":{"source":"iana","extensions":["ksp"]},"application/vnd.kde.kword":{"source":"iana","extensions":["kwd","kwt"]},"application/vnd.kenameaapp":{"source":"iana","extensions":["htke"]},"application/vnd.kidspiration":{"source":"iana","extensions":["kia"]},"application/vnd.kinar":{"source":"iana","extensions":["kne","knp"]},"application/vnd.koan":{"source":"iana","extensions":["skp","skd","skt","skm"]},"application/vnd.kodak-descriptor":{"source":"iana","extensions":["sse"]},"application/vnd.las.las+json":{"source":"iana","compressible":true},"application/vnd.las.las+xml":{"source":"iana","extensions":["lasxml"]},"application/vnd.liberty-request+xml":{"source":"iana"},"application/vnd.llamagraphics.life-balance.desktop":{"source":"iana","extensions":["lbd"]},"application/vnd.llamagraphics.life-balance.exchange+xml":{"source":"iana","extensions":["lbe"]},"application/vnd.lotus-1-2-3":{"source":"iana","extensions":["123"]},"application/vnd.lotus-approach":{"source":"iana","extensions":["apr"]},"application/vnd.lotus-freelance":{"source":"iana","extensions":["pre"]},"application/vnd.lotus-notes":{"source":"iana","extensions":["nsf"]},"application/vnd.lotus-organizer":{"source":"iana","extensions":["org"]},"application/vnd.lotus-screencam":{"source":"iana","extensions":["scm"]},"application/vnd.lotus-wordpro":{"source":"iana","extensions":["lwp"]},"application/vnd.macports.portpkg":{"source":"iana","extensions":["portpkg"]},"application/vnd.mapbox-vector-tile":{"source":"iana"},"application/vnd.marlin.drm.actiontoken+xml":{"source":"iana"},"application/vnd.marlin.drm.conftoken+xml":{"source":"iana"},"application/vnd.marlin.drm.license+xml":{"source":"iana"},"application/vnd.marlin.drm.mdcf":{"source":"iana"},"application/vnd.mason+json":{"source":"iana","compressible":true},"application/vnd.maxmind.maxmind-db":{"source":"iana"},"application/vnd.mcd":{"source":"iana","extensions":["mcd"]},"application/vnd.medcalcdata":{"source":"iana","extensions":["mc1"]},"application/vnd.mediastation.cdkey":{"source":"iana","extensions":["cdkey"]},"application/vnd.meridian-slingshot":{"source":"iana"},"application/vnd.mfer":{"source":"iana","extensions":["mwf"]},"application/vnd.mfmp":{"source":"iana","extensions":["mfm"]},"application/vnd.micro+json":{"source":"iana","compressible":true},"application/vnd.micrografx.flo":{"source":"iana","extensions":["flo"]},"application/vnd.micrografx.igx":{"source":"iana","extensions":["igx"]},"application/vnd.microsoft.portable-executable":{"source":"iana"},"application/vnd.microsoft.windows.thumbnail-cache":{"source":"iana"},"application/vnd.miele+json":{"source":"iana","compressible":true},"application/vnd.mif":{"source":"iana","extensions":["mif"]},"application/vnd.minisoft-hp3000-save":{"source":"iana"},"application/vnd.mitsubishi.misty-guard.trustweb":{"source":"iana"},"application/vnd.mobius.daf":{"source":"iana","extensions":["daf"]},"application/vnd.mobius.dis":{"source":"iana","extensions":["dis"]},"application/vnd.mobius.mbk":{"source":"iana","extensions":["mbk"]},"application/vnd.mobius.mqy":{"source":"iana","extensions":["mqy"]},"application/vnd.mobius.msl":{"source":"iana","extensions":["msl"]},"application/vnd.mobius.plc":{"source":"iana","extensions":["plc"]},"application/vnd.mobius.txf":{"source":"iana","extensions":["txf"]},"application/vnd.mophun.application":{"source":"iana","extensions":["mpn"]},"application/vnd.mophun.certificate":{"source":"iana","extensions":["mpc"]},"application/vnd.motorola.flexsuite":{"source":"iana"},"application/vnd.motorola.flexsuite.adsi":{"source":"iana"},"application/vnd.motorola.flexsuite.fis":{"source":"iana"},"application/vnd.motorola.flexsuite.gotap":{"source":"iana"},"application/vnd.motorola.flexsuite.kmr":{"source":"iana"},"application/vnd.motorola.flexsuite.ttc":{"source":"iana"},"application/vnd.motorola.flexsuite.wem":{"source":"iana"},"application/vnd.motorola.iprm":{"source":"iana"},"application/vnd.mozilla.xul+xml":{"source":"iana","compressible":true,"extensions":["xul"]},"application/vnd.ms-3mfdocument":{"source":"iana"},"application/vnd.ms-artgalry":{"source":"iana","extensions":["cil"]},"application/vnd.ms-asf":{"source":"iana"},"application/vnd.ms-cab-compressed":{"source":"iana","extensions":["cab"]},"application/vnd.ms-color.iccprofile":{"source":"apache"},"application/vnd.ms-excel":{"source":"iana","compressible":false,"extensions":["xls","xlm","xla","xlc","xlt","xlw"]},"application/vnd.ms-excel.addin.macroenabled.12":{"source":"iana","extensions":["xlam"]},"application/vnd.ms-excel.sheet.binary.macroenabled.12":{"source":"iana","extensions":["xlsb"]},"application/vnd.ms-excel.sheet.macroenabled.12":{"source":"iana","extensions":["xlsm"]},"application/vnd.ms-excel.template.macroenabled.12":{"source":"iana","extensions":["xltm"]},"application/vnd.ms-fontobject":{"source":"iana","compressible":true,"extensions":["eot"]},"application/vnd.ms-htmlhelp":{"source":"iana","extensions":["chm"]},"application/vnd.ms-ims":{"source":"iana","extensions":["ims"]},"application/vnd.ms-lrm":{"source":"iana","extensions":["lrm"]},"application/vnd.ms-office.activex+xml":{"source":"iana"},"application/vnd.ms-officetheme":{"source":"iana","extensions":["thmx"]},"application/vnd.ms-opentype":{"source":"apache","compressible":true},"application/vnd.ms-outlook":{"compressible":false,"extensions":["msg"]},"application/vnd.ms-package.obfuscated-opentype":{"source":"apache"},"application/vnd.ms-pki.seccat":{"source":"apache","extensions":["cat"]},"application/vnd.ms-pki.stl":{"source":"apache","extensions":["stl"]},"application/vnd.ms-playready.initiator+xml":{"source":"iana"},"application/vnd.ms-powerpoint":{"source":"iana","compressible":false,"extensions":["ppt","pps","pot"]},"application/vnd.ms-powerpoint.addin.macroenabled.12":{"source":"iana","extensions":["ppam"]},"application/vnd.ms-powerpoint.presentation.macroenabled.12":{"source":"iana","extensions":["pptm"]},"application/vnd.ms-powerpoint.slide.macroenabled.12":{"source":"iana","extensions":["sldm"]},"application/vnd.ms-powerpoint.slideshow.macroenabled.12":{"source":"iana","extensions":["ppsm"]},"application/vnd.ms-powerpoint.template.macroenabled.12":{"source":"iana","extensions":["potm"]},"application/vnd.ms-printdevicecapabilities+xml":{"source":"iana"},"application/vnd.ms-printing.printticket+xml":{"source":"apache"},"application/vnd.ms-printschematicket+xml":{"source":"iana"},"application/vnd.ms-project":{"source":"iana","extensions":["mpp","mpt"]},"application/vnd.ms-tnef":{"source":"iana"},"application/vnd.ms-windows.devicepairing":{"source":"iana"},"application/vnd.ms-windows.nwprinting.oob":{"source":"iana"},"application/vnd.ms-windows.printerpairing":{"source":"iana"},"application/vnd.ms-windows.wsd.oob":{"source":"iana"},"application/vnd.ms-wmdrm.lic-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.lic-resp":{"source":"iana"},"application/vnd.ms-wmdrm.meter-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.meter-resp":{"source":"iana"},"application/vnd.ms-word.document.macroenabled.12":{"source":"iana","extensions":["docm"]},"application/vnd.ms-word.template.macroenabled.12":{"source":"iana","extensions":["dotm"]},"application/vnd.ms-works":{"source":"iana","extensions":["wps","wks","wcm","wdb"]},"application/vnd.ms-wpl":{"source":"iana","extensions":["wpl"]},"application/vnd.ms-xpsdocument":{"source":"iana","compressible":false,"extensions":["xps"]},"application/vnd.msa-disk-image":{"source":"iana"},"application/vnd.mseq":{"source":"iana","extensions":["mseq"]},"application/vnd.msign":{"source":"iana"},"application/vnd.multiad.creator":{"source":"iana"},"application/vnd.multiad.creator.cif":{"source":"iana"},"application/vnd.music-niff":{"source":"iana"},"application/vnd.musician":{"source":"iana","extensions":["mus"]},"application/vnd.muvee.style":{"source":"iana","extensions":["msty"]},"application/vnd.mynfc":{"source":"iana","extensions":["taglet"]},"application/vnd.ncd.control":{"source":"iana"},"application/vnd.ncd.reference":{"source":"iana"},"application/vnd.nearst.inv+json":{"source":"iana","compressible":true},"application/vnd.nervana":{"source":"iana"},"application/vnd.netfpx":{"source":"iana"},"application/vnd.neurolanguage.nlu":{"source":"iana","extensions":["nlu"]},"application/vnd.nintendo.nitro.rom":{"source":"iana"},"application/vnd.nintendo.snes.rom":{"source":"iana"},"application/vnd.nitf":{"source":"iana","extensions":["ntf","nitf"]},"application/vnd.noblenet-directory":{"source":"iana","extensions":["nnd"]},"application/vnd.noblenet-sealer":{"source":"iana","extensions":["nns"]},"application/vnd.noblenet-web":{"source":"iana","extensions":["nnw"]},"application/vnd.nokia.catalogs":{"source":"iana"},"application/vnd.nokia.conml+wbxml":{"source":"iana"},"application/vnd.nokia.conml+xml":{"source":"iana"},"application/vnd.nokia.iptv.config+xml":{"source":"iana"},"application/vnd.nokia.isds-radio-presets":{"source":"iana"},"application/vnd.nokia.landmark+wbxml":{"source":"iana"},"application/vnd.nokia.landmark+xml":{"source":"iana"},"application/vnd.nokia.landmarkcollection+xml":{"source":"iana"},"application/vnd.nokia.n-gage.ac+xml":{"source":"iana"},"application/vnd.nokia.n-gage.data":{"source":"iana","extensions":["ngdat"]},"application/vnd.nokia.n-gage.symbian.install":{"source":"iana","extensions":["n-gage"]},"application/vnd.nokia.ncd":{"source":"iana"},"application/vnd.nokia.pcd+wbxml":{"source":"iana"},"application/vnd.nokia.pcd+xml":{"source":"iana"},"application/vnd.nokia.radio-preset":{"source":"iana","extensions":["rpst"]},"application/vnd.nokia.radio-presets":{"source":"iana","extensions":["rpss"]},"application/vnd.novadigm.edm":{"source":"iana","extensions":["edm"]},"application/vnd.novadigm.edx":{"source":"iana","extensions":["edx"]},"application/vnd.novadigm.ext":{"source":"iana","extensions":["ext"]},"application/vnd.ntt-local.content-share":{"source":"iana"},"application/vnd.ntt-local.file-transfer":{"source":"iana"},"application/vnd.ntt-local.ogw_remote-access":{"source":"iana"},"application/vnd.ntt-local.sip-ta_remote":{"source":"iana"},"application/vnd.ntt-local.sip-ta_tcp_stream":{"source":"iana"},"application/vnd.oasis.opendocument.chart":{"source":"iana","extensions":["odc"]},"application/vnd.oasis.opendocument.chart-template":{"source":"iana","extensions":["otc"]},"application/vnd.oasis.opendocument.database":{"source":"iana","extensions":["odb"]},"application/vnd.oasis.opendocument.formula":{"source":"iana","extensions":["odf"]},"application/vnd.oasis.opendocument.formula-template":{"source":"iana","extensions":["odft"]},"application/vnd.oasis.opendocument.graphics":{"source":"iana","compressible":false,"extensions":["odg"]},"application/vnd.oasis.opendocument.graphics-template":{"source":"iana","extensions":["otg"]},"application/vnd.oasis.opendocument.image":{"source":"iana","extensions":["odi"]},"application/vnd.oasis.opendocument.image-template":{"source":"iana","extensions":["oti"]},"application/vnd.oasis.opendocument.presentation":{"source":"iana","compressible":false,"extensions":["odp"]},"application/vnd.oasis.opendocument.presentation-template":{"source":"iana","extensions":["otp"]},"application/vnd.oasis.opendocument.spreadsheet":{"source":"iana","compressible":false,"extensions":["ods"]},"application/vnd.oasis.opendocument.spreadsheet-template":{"source":"iana","extensions":["ots"]},"application/vnd.oasis.opendocument.text":{"source":"iana","compressible":false,"extensions":["odt"]},"application/vnd.oasis.opendocument.text-master":{"source":"iana","extensions":["odm"]},"application/vnd.oasis.opendocument.text-template":{"source":"iana","extensions":["ott"]},"application/vnd.oasis.opendocument.text-web":{"source":"iana","extensions":["oth"]},"application/vnd.obn":{"source":"iana"},"application/vnd.ocf+cbor":{"source":"iana"},"application/vnd.oftn.l10n+json":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessdownload+xml":{"source":"iana"},"application/vnd.oipf.contentaccessstreaming+xml":{"source":"iana"},"application/vnd.oipf.cspg-hexbinary":{"source":"iana"},"application/vnd.oipf.dae.svg+xml":{"source":"iana"},"application/vnd.oipf.dae.xhtml+xml":{"source":"iana"},"application/vnd.oipf.mippvcontrolmessage+xml":{"source":"iana"},"application/vnd.oipf.pae.gem":{"source":"iana"},"application/vnd.oipf.spdiscovery+xml":{"source":"iana"},"application/vnd.oipf.spdlist+xml":{"source":"iana"},"application/vnd.oipf.ueprofile+xml":{"source":"iana"},"application/vnd.oipf.userprofile+xml":{"source":"iana"},"application/vnd.olpc-sugar":{"source":"iana","extensions":["xo"]},"application/vnd.oma-scws-config":{"source":"iana"},"application/vnd.oma-scws-http-request":{"source":"iana"},"application/vnd.oma-scws-http-response":{"source":"iana"},"application/vnd.oma.bcast.associated-procedure-parameter+xml":{"source":"iana"},"application/vnd.oma.bcast.drm-trigger+xml":{"source":"iana"},"application/vnd.oma.bcast.imd+xml":{"source":"iana"},"application/vnd.oma.bcast.ltkm":{"source":"iana"},"application/vnd.oma.bcast.notification+xml":{"source":"iana"},"application/vnd.oma.bcast.provisioningtrigger":{"source":"iana"},"application/vnd.oma.bcast.sgboot":{"source":"iana"},"application/vnd.oma.bcast.sgdd+xml":{"source":"iana"},"application/vnd.oma.bcast.sgdu":{"source":"iana"},"application/vnd.oma.bcast.simple-symbol-container":{"source":"iana"},"application/vnd.oma.bcast.smartcard-trigger+xml":{"source":"iana"},"application/vnd.oma.bcast.sprov+xml":{"source":"iana"},"application/vnd.oma.bcast.stkm":{"source":"iana"},"application/vnd.oma.cab-address-book+xml":{"source":"iana"},"application/vnd.oma.cab-feature-handler+xml":{"source":"iana"},"application/vnd.oma.cab-pcc+xml":{"source":"iana"},"application/vnd.oma.cab-subs-invite+xml":{"source":"iana"},"application/vnd.oma.cab-user-prefs+xml":{"source":"iana"},"application/vnd.oma.dcd":{"source":"iana"},"application/vnd.oma.dcdc":{"source":"iana"},"application/vnd.oma.dd2+xml":{"source":"iana","extensions":["dd2"]},"application/vnd.oma.drm.risd+xml":{"source":"iana"},"application/vnd.oma.group-usage-list+xml":{"source":"iana"},"application/vnd.oma.lwm2m+json":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+tlv":{"source":"iana"},"application/vnd.oma.pal+xml":{"source":"iana"},"application/vnd.oma.poc.detailed-progress-report+xml":{"source":"iana"},"application/vnd.oma.poc.final-report+xml":{"source":"iana"},"application/vnd.oma.poc.groups+xml":{"source":"iana"},"application/vnd.oma.poc.invocation-descriptor+xml":{"source":"iana"},"application/vnd.oma.poc.optimized-progress-report+xml":{"source":"iana"},"application/vnd.oma.push":{"source":"iana"},"application/vnd.oma.scidm.messages+xml":{"source":"iana"},"application/vnd.oma.xcap-directory+xml":{"source":"iana"},"application/vnd.omads-email+xml":{"source":"iana"},"application/vnd.omads-file+xml":{"source":"iana"},"application/vnd.omads-folder+xml":{"source":"iana"},"application/vnd.omaloc-supl-init":{"source":"iana"},"application/vnd.onepager":{"source":"iana"},"application/vnd.onepagertamp":{"source":"iana"},"application/vnd.onepagertamx":{"source":"iana"},"application/vnd.onepagertat":{"source":"iana"},"application/vnd.onepagertatp":{"source":"iana"},"application/vnd.onepagertatx":{"source":"iana"},"application/vnd.openblox.game+xml":{"source":"iana"},"application/vnd.openblox.game-binary":{"source":"iana"},"application/vnd.openeye.oeb":{"source":"iana"},"application/vnd.openofficeorg.extension":{"source":"apache","extensions":["oxt"]},"application/vnd.openstreetmap.data+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.custom-properties+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.customxmlproperties+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.drawing+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.drawingml.chart+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.extended-properties+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.comments+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.presentation":{"source":"iana","compressible":false,"extensions":["pptx"]},"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.slide":{"source":"iana","extensions":["sldx"]},"application/vnd.openxmlformats-officedocument.presentationml.slide+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.slideshow":{"source":"iana","extensions":["ppsx"]},"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.tags+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.template":{"source":"iana","extensions":["potx"]},"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"source":"iana","compressible":false,"extensions":["xlsx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.template":{"source":"iana","extensions":["xltx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.theme+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.themeoverride+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.vmldrawing":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{"source":"iana","compressible":false,"extensions":["docx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.template":{"source":"iana","extensions":["dotx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml":{"source":"iana"},"application/vnd.openxmlformats-package.core-properties+xml":{"source":"iana"},"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml":{"source":"iana"},"application/vnd.openxmlformats-package.relationships+xml":{"source":"iana"},"application/vnd.oracle.resource+json":{"source":"iana","compressible":true},"application/vnd.orange.indata":{"source":"iana"},"application/vnd.osa.netdeploy":{"source":"iana"},"application/vnd.osgeo.mapguide.package":{"source":"iana","extensions":["mgp"]},"application/vnd.osgi.bundle":{"source":"iana"},"application/vnd.osgi.dp":{"source":"iana","extensions":["dp"]},"application/vnd.osgi.subsystem":{"source":"iana","extensions":["esa"]},"application/vnd.otps.ct-kip+xml":{"source":"iana"},"application/vnd.oxli.countgraph":{"source":"iana"},"application/vnd.pagerduty+json":{"source":"iana","compressible":true},"application/vnd.palm":{"source":"iana","extensions":["pdb","pqa","oprc"]},"application/vnd.panoply":{"source":"iana"},"application/vnd.paos+xml":{"source":"iana"},"application/vnd.paos.xml":{"source":"apache"},"application/vnd.patentdive":{"source":"iana"},"application/vnd.pawaafile":{"source":"iana","extensions":["paw"]},"application/vnd.pcos":{"source":"iana"},"application/vnd.pg.format":{"source":"iana","extensions":["str"]},"application/vnd.pg.osasli":{"source":"iana","extensions":["ei6"]},"application/vnd.piaccess.application-licence":{"source":"iana"},"application/vnd.picsel":{"source":"iana","extensions":["efif"]},"application/vnd.pmi.widget":{"source":"iana","extensions":["wg"]},"application/vnd.poc.group-advertisement+xml":{"source":"iana"},"application/vnd.pocketlearn":{"source":"iana","extensions":["plf"]},"application/vnd.powerbuilder6":{"source":"iana","extensions":["pbd"]},"application/vnd.powerbuilder6-s":{"source":"iana"},"application/vnd.powerbuilder7":{"source":"iana"},"application/vnd.powerbuilder7-s":{"source":"iana"},"application/vnd.powerbuilder75":{"source":"iana"},"application/vnd.powerbuilder75-s":{"source":"iana"},"application/vnd.preminet":{"source":"iana"},"application/vnd.previewsystems.box":{"source":"iana","extensions":["box"]},"application/vnd.proteus.magazine":{"source":"iana","extensions":["mgz"]},"application/vnd.publishare-delta-tree":{"source":"iana","extensions":["qps"]},"application/vnd.pvi.ptid1":{"source":"iana","extensions":["ptid"]},"application/vnd.pwg-multiplexed":{"source":"iana"},"application/vnd.pwg-xhtml-print+xml":{"source":"iana"},"application/vnd.qualcomm.brew-app-res":{"source":"iana"},"application/vnd.quarantainenet":{"source":"iana"},"application/vnd.quark.quarkxpress":{"source":"iana","extensions":["qxd","qxt","qwd","qwt","qxl","qxb"]},"application/vnd.quobject-quoxdocument":{"source":"iana"},"application/vnd.radisys.moml+xml":{"source":"iana"},"application/vnd.radisys.msml+xml":{"source":"iana"},"application/vnd.radisys.msml-audit+xml":{"source":"iana"},"application/vnd.radisys.msml-audit-conf+xml":{"source":"iana"},"application/vnd.radisys.msml-audit-conn+xml":{"source":"iana"},"application/vnd.radisys.msml-audit-dialog+xml":{"source":"iana"},"application/vnd.radisys.msml-audit-stream+xml":{"source":"iana"},"application/vnd.radisys.msml-conf+xml":{"source":"iana"},"application/vnd.radisys.msml-dialog+xml":{"source":"iana"},"application/vnd.radisys.msml-dialog-base+xml":{"source":"iana"},"application/vnd.radisys.msml-dialog-fax-detect+xml":{"source":"iana"},"application/vnd.radisys.msml-dialog-fax-sendrecv+xml":{"source":"iana"},"application/vnd.radisys.msml-dialog-group+xml":{"source":"iana"},"application/vnd.radisys.msml-dialog-speech+xml":{"source":"iana"},"application/vnd.radisys.msml-dialog-transform+xml":{"source":"iana"},"application/vnd.rainstor.data":{"source":"iana"},"application/vnd.rapid":{"source":"iana"},"application/vnd.rar":{"source":"iana"},"application/vnd.realvnc.bed":{"source":"iana","extensions":["bed"]},"application/vnd.recordare.musicxml":{"source":"iana","extensions":["mxl"]},"application/vnd.recordare.musicxml+xml":{"source":"iana","extensions":["musicxml"]},"application/vnd.renlearn.rlprint":{"source":"iana"},"application/vnd.restful+json":{"source":"iana","compressible":true},"application/vnd.rig.cryptonote":{"source":"iana","extensions":["cryptonote"]},"application/vnd.rim.cod":{"source":"apache","extensions":["cod"]},"application/vnd.rn-realmedia":{"source":"apache","extensions":["rm"]},"application/vnd.rn-realmedia-vbr":{"source":"apache","extensions":["rmvb"]},"application/vnd.route66.link66+xml":{"source":"iana","extensions":["link66"]},"application/vnd.rs-274x":{"source":"iana"},"application/vnd.ruckus.download":{"source":"iana"},"application/vnd.s3sms":{"source":"iana"},"application/vnd.sailingtracker.track":{"source":"iana","extensions":["st"]},"application/vnd.sbm.cid":{"source":"iana"},"application/vnd.sbm.mid2":{"source":"iana"},"application/vnd.scribus":{"source":"iana"},"application/vnd.sealed.3df":{"source":"iana"},"application/vnd.sealed.csf":{"source":"iana"},"application/vnd.sealed.doc":{"source":"iana"},"application/vnd.sealed.eml":{"source":"iana"},"application/vnd.sealed.mht":{"source":"iana"},"application/vnd.sealed.net":{"source":"iana"},"application/vnd.sealed.ppt":{"source":"iana"},"application/vnd.sealed.tiff":{"source":"iana"},"application/vnd.sealed.xls":{"source":"iana"},"application/vnd.sealedmedia.softseal.html":{"source":"iana"},"application/vnd.sealedmedia.softseal.pdf":{"source":"iana"},"application/vnd.seemail":{"source":"iana","extensions":["see"]},"application/vnd.sema":{"source":"iana","extensions":["sema"]},"application/vnd.semd":{"source":"iana","extensions":["semd"]},"application/vnd.semf":{"source":"iana","extensions":["semf"]},"application/vnd.shana.informed.formdata":{"source":"iana","extensions":["ifm"]},"application/vnd.shana.informed.formtemplate":{"source":"iana","extensions":["itp"]},"application/vnd.shana.informed.interchange":{"source":"iana","extensions":["iif"]},"application/vnd.shana.informed.package":{"source":"iana","extensions":["ipk"]},"application/vnd.sigrok.session":{"source":"iana"},"application/vnd.simtech-mindmapper":{"source":"iana","extensions":["twd","twds"]},"application/vnd.siren+json":{"source":"iana","compressible":true},"application/vnd.smaf":{"source":"iana","extensions":["mmf"]},"application/vnd.smart.notebook":{"source":"iana"},"application/vnd.smart.teacher":{"source":"iana","extensions":["teacher"]},"application/vnd.software602.filler.form+xml":{"source":"iana"},"application/vnd.software602.filler.form-xml-zip":{"source":"iana"},"application/vnd.solent.sdkm+xml":{"source":"iana","extensions":["sdkm","sdkd"]},"application/vnd.spotfire.dxp":{"source":"iana","extensions":["dxp"]},"application/vnd.spotfire.sfs":{"source":"iana","extensions":["sfs"]},"application/vnd.sqlite3":{"source":"iana"},"application/vnd.sss-cod":{"source":"iana"},"application/vnd.sss-dtf":{"source":"iana"},"application/vnd.sss-ntf":{"source":"iana"},"application/vnd.stardivision.calc":{"source":"apache","extensions":["sdc"]},"application/vnd.stardivision.draw":{"source":"apache","extensions":["sda"]},"application/vnd.stardivision.impress":{"source":"apache","extensions":["sdd"]},"application/vnd.stardivision.math":{"source":"apache","extensions":["smf"]},"application/vnd.stardivision.writer":{"source":"apache","extensions":["sdw","vor"]},"application/vnd.stardivision.writer-global":{"source":"apache","extensions":["sgl"]},"application/vnd.stepmania.package":{"source":"iana","extensions":["smzip"]},"application/vnd.stepmania.stepchart":{"source":"iana","extensions":["sm"]},"application/vnd.street-stream":{"source":"iana"},"application/vnd.sun.wadl+xml":{"source":"iana","compressible":true,"extensions":["wadl"]},"application/vnd.sun.xml.calc":{"source":"apache","extensions":["sxc"]},"application/vnd.sun.xml.calc.template":{"source":"apache","extensions":["stc"]},"application/vnd.sun.xml.draw":{"source":"apache","extensions":["sxd"]},"application/vnd.sun.xml.draw.template":{"source":"apache","extensions":["std"]},"application/vnd.sun.xml.impress":{"source":"apache","extensions":["sxi"]},"application/vnd.sun.xml.impress.template":{"source":"apache","extensions":["sti"]},"application/vnd.sun.xml.math":{"source":"apache","extensions":["sxm"]},"application/vnd.sun.xml.writer":{"source":"apache","extensions":["sxw"]},"application/vnd.sun.xml.writer.global":{"source":"apache","extensions":["sxg"]},"application/vnd.sun.xml.writer.template":{"source":"apache","extensions":["stw"]},"application/vnd.sus-calendar":{"source":"iana","extensions":["sus","susp"]},"application/vnd.svd":{"source":"iana","extensions":["svd"]},"application/vnd.swiftview-ics":{"source":"iana"},"application/vnd.symbian.install":{"source":"apache","extensions":["sis","sisx"]},"application/vnd.syncml+xml":{"source":"iana","extensions":["xsm"]},"application/vnd.syncml.dm+wbxml":{"source":"iana","extensions":["bdm"]},"application/vnd.syncml.dm+xml":{"source":"iana","extensions":["xdm"]},"application/vnd.syncml.dm.notification":{"source":"iana"},"application/vnd.syncml.dmddf+wbxml":{"source":"iana"},"application/vnd.syncml.dmddf+xml":{"source":"iana"},"application/vnd.syncml.dmtnds+wbxml":{"source":"iana"},"application/vnd.syncml.dmtnds+xml":{"source":"iana"},"application/vnd.syncml.ds.notification":{"source":"iana"},"application/vnd.tableschema+json":{"source":"iana","compressible":true},"application/vnd.tao.intent-module-archive":{"source":"iana","extensions":["tao"]},"application/vnd.tcpdump.pcap":{"source":"iana","extensions":["pcap","cap","dmp"]},"application/vnd.tmd.mediaflex.api+xml":{"source":"iana"},"application/vnd.tml":{"source":"iana"},"application/vnd.tmobile-livetv":{"source":"iana","extensions":["tmo"]},"application/vnd.tri.onesource":{"source":"iana"},"application/vnd.trid.tpt":{"source":"iana","extensions":["tpt"]},"application/vnd.triscape.mxs":{"source":"iana","extensions":["mxs"]},"application/vnd.trueapp":{"source":"iana","extensions":["tra"]},"application/vnd.truedoc":{"source":"iana"},"application/vnd.ubisoft.webplayer":{"source":"iana"},"application/vnd.ufdl":{"source":"iana","extensions":["ufd","ufdl"]},"application/vnd.uiq.theme":{"source":"iana","extensions":["utz"]},"application/vnd.umajin":{"source":"iana","extensions":["umj"]},"application/vnd.unity":{"source":"iana","extensions":["unityweb"]},"application/vnd.uoml+xml":{"source":"iana","extensions":["uoml"]},"application/vnd.uplanet.alert":{"source":"iana"},"application/vnd.uplanet.alert-wbxml":{"source":"iana"},"application/vnd.uplanet.bearer-choice":{"source":"iana"},"application/vnd.uplanet.bearer-choice-wbxml":{"source":"iana"},"application/vnd.uplanet.cacheop":{"source":"iana"},"application/vnd.uplanet.cacheop-wbxml":{"source":"iana"},"application/vnd.uplanet.channel":{"source":"iana"},"application/vnd.uplanet.channel-wbxml":{"source":"iana"},"application/vnd.uplanet.list":{"source":"iana"},"application/vnd.uplanet.list-wbxml":{"source":"iana"},"application/vnd.uplanet.listcmd":{"source":"iana"},"application/vnd.uplanet.listcmd-wbxml":{"source":"iana"},"application/vnd.uplanet.signal":{"source":"iana"},"application/vnd.uri-map":{"source":"iana"},"application/vnd.valve.source.material":{"source":"iana"},"application/vnd.vcx":{"source":"iana","extensions":["vcx"]},"application/vnd.vd-study":{"source":"iana"},"application/vnd.vectorworks":{"source":"iana"},"application/vnd.vel+json":{"source":"iana","compressible":true},"application/vnd.verimatrix.vcas":{"source":"iana"},"application/vnd.vidsoft.vidconference":{"source":"iana"},"application/vnd.visio":{"source":"iana","extensions":["vsd","vst","vss","vsw"]},"application/vnd.visionary":{"source":"iana","extensions":["vis"]},"application/vnd.vividence.scriptfile":{"source":"iana"},"application/vnd.vsf":{"source":"iana","extensions":["vsf"]},"application/vnd.wap.sic":{"source":"iana"},"application/vnd.wap.slc":{"source":"iana"},"application/vnd.wap.wbxml":{"source":"iana","extensions":["wbxml"]},"application/vnd.wap.wmlc":{"source":"iana","extensions":["wmlc"]},"application/vnd.wap.wmlscriptc":{"source":"iana","extensions":["wmlsc"]},"application/vnd.webturbo":{"source":"iana","extensions":["wtb"]},"application/vnd.wfa.p2p":{"source":"iana"},"application/vnd.wfa.wsc":{"source":"iana"},"application/vnd.windows.devicepairing":{"source":"iana"},"application/vnd.wmc":{"source":"iana"},"application/vnd.wmf.bootstrap":{"source":"iana"},"application/vnd.wolfram.mathematica":{"source":"iana"},"application/vnd.wolfram.mathematica.package":{"source":"iana"},"application/vnd.wolfram.player":{"source":"iana","extensions":["nbp"]},"application/vnd.wordperfect":{"source":"iana","extensions":["wpd"]},"application/vnd.wqd":{"source":"iana","extensions":["wqd"]},"application/vnd.wrq-hp3000-labelled":{"source":"iana"},"application/vnd.wt.stf":{"source":"iana","extensions":["stf"]},"application/vnd.wv.csp+wbxml":{"source":"iana"},"application/vnd.wv.csp+xml":{"source":"iana"},"application/vnd.wv.ssp+xml":{"source":"iana"},"application/vnd.xacml+json":{"source":"iana","compressible":true},"application/vnd.xara":{"source":"iana","extensions":["xar"]},"application/vnd.xfdl":{"source":"iana","extensions":["xfdl"]},"application/vnd.xfdl.webform":{"source":"iana"},"application/vnd.xmi+xml":{"source":"iana"},"application/vnd.xmpie.cpkg":{"source":"iana"},"application/vnd.xmpie.dpkg":{"source":"iana"},"application/vnd.xmpie.plan":{"source":"iana"},"application/vnd.xmpie.ppkg":{"source":"iana"},"application/vnd.xmpie.xlim":{"source":"iana"},"application/vnd.yamaha.hv-dic":{"source":"iana","extensions":["hvd"]},"application/vnd.yamaha.hv-script":{"source":"iana","extensions":["hvs"]},"application/vnd.yamaha.hv-voice":{"source":"iana","extensions":["hvp"]},"application/vnd.yamaha.openscoreformat":{"source":"iana","extensions":["osf"]},"application/vnd.yamaha.openscoreformat.osfpvg+xml":{"source":"iana","extensions":["osfpvg"]},"application/vnd.yamaha.remote-setup":{"source":"iana"},"application/vnd.yamaha.smaf-audio":{"source":"iana","extensions":["saf"]},"application/vnd.yamaha.smaf-phrase":{"source":"iana","extensions":["spf"]},"application/vnd.yamaha.through-ngn":{"source":"iana"},"application/vnd.yamaha.tunnel-udpencap":{"source":"iana"},"application/vnd.yaoweme":{"source":"iana"},"application/vnd.yellowriver-custom-menu":{"source":"iana","extensions":["cmp"]},"application/vnd.youtube.yt":{"source":"iana"},"application/vnd.zul":{"source":"iana","extensions":["zir","zirz"]},"application/vnd.zzazz.deck+xml":{"source":"iana","extensions":["zaz"]},"application/voicexml+xml":{"source":"iana","extensions":["vxml"]},"application/voucher-cms+json":{"source":"iana","compressible":true},"application/vq-rtcpxr":{"source":"iana"},"application/wasm":{"compressible":true,"extensions":["wasm"]},"application/watcherinfo+xml":{"source":"iana"},"application/webpush-options+json":{"source":"iana","compressible":true},"application/whoispp-query":{"source":"iana"},"application/whoispp-response":{"source":"iana"},"application/widget":{"source":"iana","extensions":["wgt"]},"application/winhlp":{"source":"apache","extensions":["hlp"]},"application/wita":{"source":"iana"},"application/wordperfect5.1":{"source":"iana"},"application/wsdl+xml":{"source":"iana","extensions":["wsdl"]},"application/wspolicy+xml":{"source":"iana","extensions":["wspolicy"]},"application/x-7z-compressed":{"source":"apache","compressible":false,"extensions":["7z"]},"application/x-abiword":{"source":"apache","extensions":["abw"]},"application/x-ace-compressed":{"source":"apache","extensions":["ace"]},"application/x-amf":{"source":"apache"},"application/x-apple-diskimage":{"source":"apache","extensions":["dmg"]},"application/x-arj":{"compressible":false,"extensions":["arj"]},"application/x-authorware-bin":{"source":"apache","extensions":["aab","x32","u32","vox"]},"application/x-authorware-map":{"source":"apache","extensions":["aam"]},"application/x-authorware-seg":{"source":"apache","extensions":["aas"]},"application/x-bcpio":{"source":"apache","extensions":["bcpio"]},"application/x-bdoc":{"compressible":false,"extensions":["bdoc"]},"application/x-bittorrent":{"source":"apache","extensions":["torrent"]},"application/x-blorb":{"source":"apache","extensions":["blb","blorb"]},"application/x-bzip":{"source":"apache","compressible":false,"extensions":["bz"]},"application/x-bzip2":{"source":"apache","compressible":false,"extensions":["bz2","boz"]},"application/x-cbr":{"source":"apache","extensions":["cbr","cba","cbt","cbz","cb7"]},"application/x-cdlink":{"source":"apache","extensions":["vcd"]},"application/x-cfs-compressed":{"source":"apache","extensions":["cfs"]},"application/x-chat":{"source":"apache","extensions":["chat"]},"application/x-chess-pgn":{"source":"apache","extensions":["pgn"]},"application/x-chrome-extension":{"extensions":["crx"]},"application/x-cocoa":{"source":"nginx","extensions":["cco"]},"application/x-compress":{"source":"apache"},"application/x-conference":{"source":"apache","extensions":["nsc"]},"application/x-cpio":{"source":"apache","extensions":["cpio"]},"application/x-csh":{"source":"apache","extensions":["csh"]},"application/x-deb":{"compressible":false},"application/x-debian-package":{"source":"apache","extensions":["deb","udeb"]},"application/x-dgc-compressed":{"source":"apache","extensions":["dgc"]},"application/x-director":{"source":"apache","extensions":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]},"application/x-doom":{"source":"apache","extensions":["wad"]},"application/x-dtbncx+xml":{"source":"apache","extensions":["ncx"]},"application/x-dtbook+xml":{"source":"apache","extensions":["dtb"]},"application/x-dtbresource+xml":{"source":"apache","extensions":["res"]},"application/x-dvi":{"source":"apache","compressible":false,"extensions":["dvi"]},"application/x-envoy":{"source":"apache","extensions":["evy"]},"application/x-eva":{"source":"apache","extensions":["eva"]},"application/x-font-bdf":{"source":"apache","extensions":["bdf"]},"application/x-font-dos":{"source":"apache"},"application/x-font-framemaker":{"source":"apache"},"application/x-font-ghostscript":{"source":"apache","extensions":["gsf"]},"application/x-font-libgrx":{"source":"apache"},"application/x-font-linux-psf":{"source":"apache","extensions":["psf"]},"application/x-font-pcf":{"source":"apache","extensions":["pcf"]},"application/x-font-snf":{"source":"apache","extensions":["snf"]},"application/x-font-speedo":{"source":"apache"},"application/x-font-sunos-news":{"source":"apache"},"application/x-font-type1":{"source":"apache","extensions":["pfa","pfb","pfm","afm"]},"application/x-font-vfont":{"source":"apache"},"application/x-freearc":{"source":"apache","extensions":["arc"]},"application/x-futuresplash":{"source":"apache","extensions":["spl"]},"application/x-gca-compressed":{"source":"apache","extensions":["gca"]},"application/x-glulx":{"source":"apache","extensions":["ulx"]},"application/x-gnumeric":{"source":"apache","extensions":["gnumeric"]},"application/x-gramps-xml":{"source":"apache","extensions":["gramps"]},"application/x-gtar":{"source":"apache","extensions":["gtar"]},"application/x-gzip":{"source":"apache"},"application/x-hdf":{"source":"apache","extensions":["hdf"]},"application/x-httpd-php":{"compressible":true,"extensions":["php"]},"application/x-install-instructions":{"source":"apache","extensions":["install"]},"application/x-iso9660-image":{"source":"apache","extensions":["iso"]},"application/x-java-archive-diff":{"source":"nginx","extensions":["jardiff"]},"application/x-java-jnlp-file":{"source":"apache","compressible":false,"extensions":["jnlp"]},"application/x-javascript":{"compressible":true},"application/x-latex":{"source":"apache","compressible":false,"extensions":["latex"]},"application/x-lua-bytecode":{"extensions":["luac"]},"application/x-lzh-compressed":{"source":"apache","extensions":["lzh","lha"]},"application/x-makeself":{"source":"nginx","extensions":["run"]},"application/x-mie":{"source":"apache","extensions":["mie"]},"application/x-mobipocket-ebook":{"source":"apache","extensions":["prc","mobi"]},"application/x-mpegurl":{"compressible":false},"application/x-ms-application":{"source":"apache","extensions":["application"]},"application/x-ms-shortcut":{"source":"apache","extensions":["lnk"]},"application/x-ms-wmd":{"source":"apache","extensions":["wmd"]},"application/x-ms-wmz":{"source":"apache","extensions":["wmz"]},"application/x-ms-xbap":{"source":"apache","extensions":["xbap"]},"application/x-msaccess":{"source":"apache","extensions":["mdb"]},"application/x-msbinder":{"source":"apache","extensions":["obd"]},"application/x-mscardfile":{"source":"apache","extensions":["crd"]},"application/x-msclip":{"source":"apache","extensions":["clp"]},"application/x-msdos-program":{"extensions":["exe"]},"application/x-msdownload":{"source":"apache","extensions":["exe","dll","com","bat","msi"]},"application/x-msmediaview":{"source":"apache","extensions":["mvb","m13","m14"]},"application/x-msmetafile":{"source":"apache","extensions":["wmf","wmz","emf","emz"]},"application/x-msmoney":{"source":"apache","extensions":["mny"]},"application/x-mspublisher":{"source":"apache","extensions":["pub"]},"application/x-msschedule":{"source":"apache","extensions":["scd"]},"application/x-msterminal":{"source":"apache","extensions":["trm"]},"application/x-mswrite":{"source":"apache","extensions":["wri"]},"application/x-netcdf":{"source":"apache","extensions":["nc","cdf"]},"application/x-ns-proxy-autoconfig":{"compressible":true,"extensions":["pac"]},"application/x-nzb":{"source":"apache","extensions":["nzb"]},"application/x-perl":{"source":"nginx","extensions":["pl","pm"]},"application/x-pilot":{"source":"nginx","extensions":["prc","pdb"]},"application/x-pkcs12":{"source":"apache","compressible":false,"extensions":["p12","pfx"]},"application/x-pkcs7-certificates":{"source":"apache","extensions":["p7b","spc"]},"application/x-pkcs7-certreqresp":{"source":"apache","extensions":["p7r"]},"application/x-rar-compressed":{"source":"apache","compressible":false,"extensions":["rar"]},"application/x-redhat-package-manager":{"source":"nginx","extensions":["rpm"]},"application/x-research-info-systems":{"source":"apache","extensions":["ris"]},"application/x-sea":{"source":"nginx","extensions":["sea"]},"application/x-sh":{"source":"apache","compressible":true,"extensions":["sh"]},"application/x-shar":{"source":"apache","extensions":["shar"]},"application/x-shockwave-flash":{"source":"apache","compressible":false,"extensions":["swf"]},"application/x-silverlight-app":{"source":"apache","extensions":["xap"]},"application/x-sql":{"source":"apache","extensions":["sql"]},"application/x-stuffit":{"source":"apache","compressible":false,"extensions":["sit"]},"application/x-stuffitx":{"source":"apache","extensions":["sitx"]},"application/x-subrip":{"source":"apache","extensions":["srt"]},"application/x-sv4cpio":{"source":"apache","extensions":["sv4cpio"]},"application/x-sv4crc":{"source":"apache","extensions":["sv4crc"]},"application/x-t3vm-image":{"source":"apache","extensions":["t3"]},"application/x-tads":{"source":"apache","extensions":["gam"]},"application/x-tar":{"source":"apache","compressible":true,"extensions":["tar"]},"application/x-tcl":{"source":"apache","extensions":["tcl","tk"]},"application/x-tex":{"source":"apache","extensions":["tex"]},"application/x-tex-tfm":{"source":"apache","extensions":["tfm"]},"application/x-texinfo":{"source":"apache","extensions":["texinfo","texi"]},"application/x-tgif":{"source":"apache","extensions":["obj"]},"application/x-ustar":{"source":"apache","extensions":["ustar"]},"application/x-virtualbox-hdd":{"compressible":true,"extensions":["hdd"]},"application/x-virtualbox-ova":{"compressible":true,"extensions":["ova"]},"application/x-virtualbox-ovf":{"compressible":true,"extensions":["ovf"]},"application/x-virtualbox-vbox":{"compressible":true,"extensions":["vbox"]},"application/x-virtualbox-vbox-extpack":{"compressible":false,"extensions":["vbox-extpack"]},"application/x-virtualbox-vdi":{"compressible":true,"extensions":["vdi"]},"application/x-virtualbox-vhd":{"compressible":true,"extensions":["vhd"]},"application/x-virtualbox-vmdk":{"compressible":true,"extensions":["vmdk"]},"application/x-wais-source":{"source":"apache","extensions":["src"]},"application/x-web-app-manifest+json":{"compressible":true,"extensions":["webapp"]},"application/x-www-form-urlencoded":{"source":"iana","compressible":true},"application/x-x509-ca-cert":{"source":"apache","extensions":["der","crt","pem"]},"application/x-xfig":{"source":"apache","extensions":["fig"]},"application/x-xliff+xml":{"source":"apache","extensions":["xlf"]},"application/x-xpinstall":{"source":"apache","compressible":false,"extensions":["xpi"]},"application/x-xz":{"source":"apache","extensions":["xz"]},"application/x-zmachine":{"source":"apache","extensions":["z1","z2","z3","z4","z5","z6","z7","z8"]},"application/x400-bp":{"source":"iana"},"application/xacml+xml":{"source":"iana"},"application/xaml+xml":{"source":"apache","extensions":["xaml"]},"application/xcap-att+xml":{"source":"iana"},"application/xcap-caps+xml":{"source":"iana"},"application/xcap-diff+xml":{"source":"iana","extensions":["xdf"]},"application/xcap-el+xml":{"source":"iana"},"application/xcap-error+xml":{"source":"iana"},"application/xcap-ns+xml":{"source":"iana"},"application/xcon-conference-info+xml":{"source":"iana"},"application/xcon-conference-info-diff+xml":{"source":"iana"},"application/xenc+xml":{"source":"iana","extensions":["xenc"]},"application/xhtml+xml":{"source":"iana","compressible":true,"extensions":["xhtml","xht"]},"application/xhtml-voice+xml":{"source":"apache"},"application/xml":{"source":"iana","compressible":true,"extensions":["xml","xsl","xsd","rng"]},"application/xml-dtd":{"source":"iana","compressible":true,"extensions":["dtd"]},"application/xml-external-parsed-entity":{"source":"iana"},"application/xml-patch+xml":{"source":"iana"},"application/xmpp+xml":{"source":"iana"},"application/xop+xml":{"source":"iana","compressible":true,"extensions":["xop"]},"application/xproc+xml":{"source":"apache","extensions":["xpl"]},"application/xslt+xml":{"source":"iana","extensions":["xslt"]},"application/xspf+xml":{"source":"apache","extensions":["xspf"]},"application/xv+xml":{"source":"iana","extensions":["mxml","xhvml","xvml","xvm"]},"application/yang":{"source":"iana","extensions":["yang"]},"application/yang-data+json":{"source":"iana","compressible":true},"application/yang-data+xml":{"source":"iana"},"application/yang-patch+json":{"source":"iana","compressible":true},"application/yang-patch+xml":{"source":"iana"},"application/yin+xml":{"source":"iana","extensions":["yin"]},"application/zip":{"source":"iana","compressible":false,"extensions":["zip"]},"application/zlib":{"source":"iana"},"audio/1d-interleaved-parityfec":{"source":"iana"},"audio/32kadpcm":{"source":"iana"},"audio/3gpp":{"source":"iana","compressible":false,"extensions":["3gpp"]},"audio/3gpp2":{"source":"iana"},"audio/ac3":{"source":"iana"},"audio/adpcm":{"source":"apache","extensions":["adp"]},"audio/amr":{"source":"iana"},"audio/amr-wb":{"source":"iana"},"audio/amr-wb+":{"source":"iana"},"audio/aptx":{"source":"iana"},"audio/asc":{"source":"iana"},"audio/atrac-advanced-lossless":{"source":"iana"},"audio/atrac-x":{"source":"iana"},"audio/atrac3":{"source":"iana"},"audio/basic":{"source":"iana","compressible":false,"extensions":["au","snd"]},"audio/bv16":{"source":"iana"},"audio/bv32":{"source":"iana"},"audio/clearmode":{"source":"iana"},"audio/cn":{"source":"iana"},"audio/dat12":{"source":"iana"},"audio/dls":{"source":"iana"},"audio/dsr-es201108":{"source":"iana"},"audio/dsr-es202050":{"source":"iana"},"audio/dsr-es202211":{"source":"iana"},"audio/dsr-es202212":{"source":"iana"},"audio/dv":{"source":"iana"},"audio/dvi4":{"source":"iana"},"audio/eac3":{"source":"iana"},"audio/encaprtp":{"source":"iana"},"audio/evrc":{"source":"iana"},"audio/evrc-qcp":{"source":"iana"},"audio/evrc0":{"source":"iana"},"audio/evrc1":{"source":"iana"},"audio/evrcb":{"source":"iana"},"audio/evrcb0":{"source":"iana"},"audio/evrcb1":{"source":"iana"},"audio/evrcnw":{"source":"iana"},"audio/evrcnw0":{"source":"iana"},"audio/evrcnw1":{"source":"iana"},"audio/evrcwb":{"source":"iana"},"audio/evrcwb0":{"source":"iana"},"audio/evrcwb1":{"source":"iana"},"audio/evs":{"source":"iana"},"audio/fwdred":{"source":"iana"},"audio/g711-0":{"source":"iana"},"audio/g719":{"source":"iana"},"audio/g722":{"source":"iana"},"audio/g7221":{"source":"iana"},"audio/g723":{"source":"iana"},"audio/g726-16":{"source":"iana"},"audio/g726-24":{"source":"iana"},"audio/g726-32":{"source":"iana"},"audio/g726-40":{"source":"iana"},"audio/g728":{"source":"iana"},"audio/g729":{"source":"iana"},"audio/g7291":{"source":"iana"},"audio/g729d":{"source":"iana"},"audio/g729e":{"source":"iana"},"audio/gsm":{"source":"iana"},"audio/gsm-efr":{"source":"iana"},"audio/gsm-hr-08":{"source":"iana"},"audio/ilbc":{"source":"iana"},"audio/ip-mr_v2.5":{"source":"iana"},"audio/isac":{"source":"apache"},"audio/l16":{"source":"iana"},"audio/l20":{"source":"iana"},"audio/l24":{"source":"iana","compressible":false},"audio/l8":{"source":"iana"},"audio/lpc":{"source":"iana"},"audio/melp":{"source":"iana"},"audio/melp1200":{"source":"iana"},"audio/melp2400":{"source":"iana"},"audio/melp600":{"source":"iana"},"audio/midi":{"source":"apache","extensions":["mid","midi","kar","rmi"]},"audio/mobile-xmf":{"source":"iana"},"audio/mp3":{"compressible":false,"extensions":["mp3"]},"audio/mp4":{"source":"iana","compressible":false,"extensions":["m4a","mp4a"]},"audio/mp4a-latm":{"source":"iana"},"audio/mpa":{"source":"iana"},"audio/mpa-robust":{"source":"iana"},"audio/mpeg":{"source":"iana","compressible":false,"extensions":["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/mpeg4-generic":{"source":"iana"},"audio/musepack":{"source":"apache"},"audio/ogg":{"source":"iana","compressible":false,"extensions":["oga","ogg","spx"]},"audio/opus":{"source":"iana"},"audio/parityfec":{"source":"iana"},"audio/pcma":{"source":"iana"},"audio/pcma-wb":{"source":"iana"},"audio/pcmu":{"source":"iana"},"audio/pcmu-wb":{"source":"iana"},"audio/prs.sid":{"source":"iana"},"audio/qcelp":{"source":"iana"},"audio/raptorfec":{"source":"iana"},"audio/red":{"source":"iana"},"audio/rtp-enc-aescm128":{"source":"iana"},"audio/rtp-midi":{"source":"iana"},"audio/rtploopback":{"source":"iana"},"audio/rtx":{"source":"iana"},"audio/s3m":{"source":"apache","extensions":["s3m"]},"audio/silk":{"source":"apache","extensions":["sil"]},"audio/smv":{"source":"iana"},"audio/smv-qcp":{"source":"iana"},"audio/smv0":{"source":"iana"},"audio/sp-midi":{"source":"iana"},"audio/speex":{"source":"iana"},"audio/t140c":{"source":"iana"},"audio/t38":{"source":"iana"},"audio/telephone-event":{"source":"iana"},"audio/tone":{"source":"iana"},"audio/uemclip":{"source":"iana"},"audio/ulpfec":{"source":"iana"},"audio/vdvi":{"source":"iana"},"audio/vmr-wb":{"source":"iana"},"audio/vnd.3gpp.iufp":{"source":"iana"},"audio/vnd.4sb":{"source":"iana"},"audio/vnd.audiokoz":{"source":"iana"},"audio/vnd.celp":{"source":"iana"},"audio/vnd.cisco.nse":{"source":"iana"},"audio/vnd.cmles.radio-events":{"source":"iana"},"audio/vnd.cns.anp1":{"source":"iana"},"audio/vnd.cns.inf1":{"source":"iana"},"audio/vnd.dece.audio":{"source":"iana","extensions":["uva","uvva"]},"audio/vnd.digital-winds":{"source":"iana","extensions":["eol"]},"audio/vnd.dlna.adts":{"source":"iana"},"audio/vnd.dolby.heaac.1":{"source":"iana"},"audio/vnd.dolby.heaac.2":{"source":"iana"},"audio/vnd.dolby.mlp":{"source":"iana"},"audio/vnd.dolby.mps":{"source":"iana"},"audio/vnd.dolby.pl2":{"source":"iana"},"audio/vnd.dolby.pl2x":{"source":"iana"},"audio/vnd.dolby.pl2z":{"source":"iana"},"audio/vnd.dolby.pulse.1":{"source":"iana"},"audio/vnd.dra":{"source":"iana","extensions":["dra"]},"audio/vnd.dts":{"source":"iana","extensions":["dts"]},"audio/vnd.dts.hd":{"source":"iana","extensions":["dtshd"]},"audio/vnd.dvb.file":{"source":"iana"},"audio/vnd.everad.plj":{"source":"iana"},"audio/vnd.hns.audio":{"source":"iana"},"audio/vnd.lucent.voice":{"source":"iana","extensions":["lvp"]},"audio/vnd.ms-playready.media.pya":{"source":"iana","extensions":["pya"]},"audio/vnd.nokia.mobile-xmf":{"source":"iana"},"audio/vnd.nortel.vbk":{"source":"iana"},"audio/vnd.nuera.ecelp4800":{"source":"iana","extensions":["ecelp4800"]},"audio/vnd.nuera.ecelp7470":{"source":"iana","extensions":["ecelp7470"]},"audio/vnd.nuera.ecelp9600":{"source":"iana","extensions":["ecelp9600"]},"audio/vnd.octel.sbc":{"source":"iana"},"audio/vnd.presonus.multitrack":{"source":"iana"},"audio/vnd.qcelp":{"source":"iana"},"audio/vnd.rhetorex.32kadpcm":{"source":"iana"},"audio/vnd.rip":{"source":"iana","extensions":["rip"]},"audio/vnd.rn-realaudio":{"compressible":false},"audio/vnd.sealedmedia.softseal.mpeg":{"source":"iana"},"audio/vnd.vmx.cvsd":{"source":"iana"},"audio/vnd.wave":{"compressible":false},"audio/vorbis":{"source":"iana","compressible":false},"audio/vorbis-config":{"source":"iana"},"audio/wav":{"compressible":false,"extensions":["wav"]},"audio/wave":{"compressible":false,"extensions":["wav"]},"audio/webm":{"source":"apache","compressible":false,"extensions":["weba"]},"audio/x-aac":{"source":"apache","compressible":false,"extensions":["aac"]},"audio/x-aiff":{"source":"apache","extensions":["aif","aiff","aifc"]},"audio/x-caf":{"source":"apache","compressible":false,"extensions":["caf"]},"audio/x-flac":{"source":"apache","extensions":["flac"]},"audio/x-m4a":{"source":"nginx","extensions":["m4a"]},"audio/x-matroska":{"source":"apache","extensions":["mka"]},"audio/x-mpegurl":{"source":"apache","extensions":["m3u"]},"audio/x-ms-wax":{"source":"apache","extensions":["wax"]},"audio/x-ms-wma":{"source":"apache","extensions":["wma"]},"audio/x-pn-realaudio":{"source":"apache","extensions":["ram","ra"]},"audio/x-pn-realaudio-plugin":{"source":"apache","extensions":["rmp"]},"audio/x-realaudio":{"source":"nginx","extensions":["ra"]},"audio/x-tta":{"source":"apache"},"audio/x-wav":{"source":"apache","extensions":["wav"]},"audio/xm":{"source":"apache","extensions":["xm"]},"chemical/x-cdx":{"source":"apache","extensions":["cdx"]},"chemical/x-cif":{"source":"apache","extensions":["cif"]},"chemical/x-cmdf":{"source":"apache","extensions":["cmdf"]},"chemical/x-cml":{"source":"apache","extensions":["cml"]},"chemical/x-csml":{"source":"apache","extensions":["csml"]},"chemical/x-pdb":{"source":"apache"},"chemical/x-xyz":{"source":"apache","extensions":["xyz"]},"font/collection":{"source":"iana","extensions":["ttc"]},"font/otf":{"source":"iana","compressible":true,"extensions":["otf"]},"font/sfnt":{"source":"iana"},"font/ttf":{"source":"iana","extensions":["ttf"]},"font/woff":{"source":"iana","extensions":["woff"]},"font/woff2":{"source":"iana","extensions":["woff2"]},"image/aces":{"source":"iana"},"image/apng":{"compressible":false,"extensions":["apng"]},"image/bmp":{"source":"iana","compressible":true,"extensions":["bmp"]},"image/cgm":{"source":"iana","extensions":["cgm"]},"image/dicom-rle":{"source":"iana"},"image/emf":{"source":"iana"},"image/fits":{"source":"iana"},"image/g3fax":{"source":"iana","extensions":["g3"]},"image/gif":{"source":"iana","compressible":false,"extensions":["gif"]},"image/ief":{"source":"iana","extensions":["ief"]},"image/jls":{"source":"iana"},"image/jp2":{"source":"iana","compressible":false,"extensions":["jp2","jpg2"]},"image/jpeg":{"source":"iana","compressible":false,"extensions":["jpeg","jpg","jpe"]},"image/jpm":{"source":"iana","compressible":false,"extensions":["jpm"]},"image/jpx":{"source":"iana","compressible":false,"extensions":["jpx","jpf"]},"image/ktx":{"source":"iana","extensions":["ktx"]},"image/naplps":{"source":"iana"},"image/pjpeg":{"compressible":false},"image/png":{"source":"iana","compressible":false,"extensions":["png"]},"image/prs.btif":{"source":"iana","extensions":["btif"]},"image/prs.pti":{"source":"iana"},"image/pwg-raster":{"source":"iana"},"image/sgi":{"source":"apache","extensions":["sgi"]},"image/svg+xml":{"source":"iana","compressible":true,"extensions":["svg","svgz"]},"image/t38":{"source":"iana"},"image/tiff":{"source":"iana","compressible":false,"extensions":["tiff","tif"]},"image/tiff-fx":{"source":"iana"},"image/vnd.adobe.photoshop":{"source":"iana","compressible":true,"extensions":["psd"]},"image/vnd.airzip.accelerator.azv":{"source":"iana"},"image/vnd.cns.inf2":{"source":"iana"},"image/vnd.dece.graphic":{"source":"iana","extensions":["uvi","uvvi","uvg","uvvg"]},"image/vnd.djvu":{"source":"iana","extensions":["djvu","djv"]},"image/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"image/vnd.dwg":{"source":"iana","extensions":["dwg"]},"image/vnd.dxf":{"source":"iana","extensions":["dxf"]},"image/vnd.fastbidsheet":{"source":"iana","extensions":["fbs"]},"image/vnd.fpx":{"source":"iana","extensions":["fpx"]},"image/vnd.fst":{"source":"iana","extensions":["fst"]},"image/vnd.fujixerox.edmics-mmr":{"source":"iana","extensions":["mmr"]},"image/vnd.fujixerox.edmics-rlc":{"source":"iana","extensions":["rlc"]},"image/vnd.globalgraphics.pgb":{"source":"iana"},"image/vnd.microsoft.icon":{"source":"iana"},"image/vnd.mix":{"source":"iana"},"image/vnd.mozilla.apng":{"source":"iana"},"image/vnd.ms-modi":{"source":"iana","extensions":["mdi"]},"image/vnd.ms-photo":{"source":"apache","extensions":["wdp"]},"image/vnd.net-fpx":{"source":"iana","extensions":["npx"]},"image/vnd.radiance":{"source":"iana"},"image/vnd.sealed.png":{"source":"iana"},"image/vnd.sealedmedia.softseal.gif":{"source":"iana"},"image/vnd.sealedmedia.softseal.jpg":{"source":"iana"},"image/vnd.svf":{"source":"iana"},"image/vnd.tencent.tap":{"source":"iana"},"image/vnd.valve.source.texture":{"source":"iana"},"image/vnd.wap.wbmp":{"source":"iana","extensions":["wbmp"]},"image/vnd.xiff":{"source":"iana","extensions":["xif"]},"image/vnd.zbrush.pcx":{"source":"iana"},"image/webp":{"source":"apache","extensions":["webp"]},"image/wmf":{"source":"iana"},"image/x-3ds":{"source":"apache","extensions":["3ds"]},"image/x-cmu-raster":{"source":"apache","extensions":["ras"]},"image/x-cmx":{"source":"apache","extensions":["cmx"]},"image/x-freehand":{"source":"apache","extensions":["fh","fhc","fh4","fh5","fh7"]},"image/x-icon":{"source":"apache","compressible":true,"extensions":["ico"]},"image/x-jng":{"source":"nginx","extensions":["jng"]},"image/x-mrsid-image":{"source":"apache","extensions":["sid"]},"image/x-ms-bmp":{"source":"nginx","compressible":true,"extensions":["bmp"]},"image/x-pcx":{"source":"apache","extensions":["pcx"]},"image/x-pict":{"source":"apache","extensions":["pic","pct"]},"image/x-portable-anymap":{"source":"apache","extensions":["pnm"]},"image/x-portable-bitmap":{"source":"apache","extensions":["pbm"]},"image/x-portable-graymap":{"source":"apache","extensions":["pgm"]},"image/x-portable-pixmap":{"source":"apache","extensions":["ppm"]},"image/x-rgb":{"source":"apache","extensions":["rgb"]},"image/x-tga":{"source":"apache","extensions":["tga"]},"image/x-xbitmap":{"source":"apache","extensions":["xbm"]},"image/x-xcf":{"compressible":false},"image/x-xpixmap":{"source":"apache","extensions":["xpm"]},"image/x-xwindowdump":{"source":"apache","extensions":["xwd"]},"message/cpim":{"source":"iana"},"message/delivery-status":{"source":"iana"},"message/disposition-notification":{"source":"iana","extensions":["disposition-notification"]},"message/external-body":{"source":"iana"},"message/feedback-report":{"source":"iana"},"message/global":{"source":"iana","extensions":["u8msg"]},"message/global-delivery-status":{"source":"iana","extensions":["u8dsn"]},"message/global-disposition-notification":{"source":"iana","extensions":["u8mdn"]},"message/global-headers":{"source":"iana","extensions":["u8hdr"]},"message/http":{"source":"iana","compressible":false},"message/imdn+xml":{"source":"iana","compressible":true},"message/news":{"source":"iana"},"message/partial":{"source":"iana","compressible":false},"message/rfc822":{"source":"iana","compressible":true,"extensions":["eml","mime"]},"message/s-http":{"source":"iana"},"message/sip":{"source":"iana"},"message/sipfrag":{"source":"iana"},"message/tracking-status":{"source":"iana"},"message/vnd.si.simp":{"source":"iana"},"message/vnd.wfa.wsc":{"source":"iana","extensions":["wsc"]},"model/3mf":{"source":"iana"},"model/gltf+json":{"source":"iana","compressible":true,"extensions":["gltf"]},"model/gltf-binary":{"source":"iana","compressible":true,"extensions":["glb"]},"model/iges":{"source":"iana","compressible":false,"extensions":["igs","iges"]},"model/mesh":{"source":"iana","compressible":false,"extensions":["msh","mesh","silo"]},"model/vnd.collada+xml":{"source":"iana","extensions":["dae"]},"model/vnd.dwf":{"source":"iana","extensions":["dwf"]},"model/vnd.flatland.3dml":{"source":"iana"},"model/vnd.gdl":{"source":"iana","extensions":["gdl"]},"model/vnd.gs-gdl":{"source":"apache"},"model/vnd.gs.gdl":{"source":"iana"},"model/vnd.gtw":{"source":"iana","extensions":["gtw"]},"model/vnd.moml+xml":{"source":"iana"},"model/vnd.mts":{"source":"iana","extensions":["mts"]},"model/vnd.opengex":{"source":"iana"},"model/vnd.parasolid.transmit.binary":{"source":"iana"},"model/vnd.parasolid.transmit.text":{"source":"iana"},"model/vnd.rosette.annotated-data-model":{"source":"iana"},"model/vnd.valve.source.compiled-map":{"source":"iana"},"model/vnd.vtu":{"source":"iana","extensions":["vtu"]},"model/vrml":{"source":"iana","compressible":false,"extensions":["wrl","vrml"]},"model/x3d+binary":{"source":"apache","compressible":false,"extensions":["x3db","x3dbz"]},"model/x3d+fastinfoset":{"source":"iana"},"model/x3d+vrml":{"source":"apache","compressible":false,"extensions":["x3dv","x3dvz"]},"model/x3d+xml":{"source":"iana","compressible":true,"extensions":["x3d","x3dz"]},"model/x3d-vrml":{"source":"iana"},"multipart/alternative":{"source":"iana","compressible":false},"multipart/appledouble":{"source":"iana"},"multipart/byteranges":{"source":"iana"},"multipart/digest":{"source":"iana"},"multipart/encrypted":{"source":"iana","compressible":false},"multipart/form-data":{"source":"iana","compressible":false},"multipart/header-set":{"source":"iana"},"multipart/mixed":{"source":"iana","compressible":false},"multipart/multilingual":{"source":"iana"},"multipart/parallel":{"source":"iana"},"multipart/related":{"source":"iana","compressible":false},"multipart/report":{"source":"iana"},"multipart/signed":{"source":"iana","compressible":false},"multipart/vnd.bint.med-plus":{"source":"iana"},"multipart/voice-message":{"source":"iana"},"multipart/x-mixed-replace":{"source":"iana"},"text/1d-interleaved-parityfec":{"source":"iana"},"text/cache-manifest":{"source":"iana","compressible":true,"extensions":["appcache","manifest"]},"text/calendar":{"source":"iana","extensions":["ics","ifb"]},"text/calender":{"compressible":true},"text/cmd":{"compressible":true},"text/coffeescript":{"extensions":["coffee","litcoffee"]},"text/css":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["css"]},"text/csv":{"source":"iana","compressible":true,"extensions":["csv"]},"text/csv-schema":{"source":"iana"},"text/directory":{"source":"iana"},"text/dns":{"source":"iana"},"text/ecmascript":{"source":"iana"},"text/encaprtp":{"source":"iana"},"text/enriched":{"source":"iana"},"text/fwdred":{"source":"iana"},"text/grammar-ref-list":{"source":"iana"},"text/html":{"source":"iana","compressible":true,"extensions":["html","htm","shtml"]},"text/jade":{"extensions":["jade"]},"text/javascript":{"source":"iana","compressible":true},"text/jcr-cnd":{"source":"iana"},"text/jsx":{"compressible":true,"extensions":["jsx"]},"text/less":{"extensions":["less"]},"text/markdown":{"source":"iana","compressible":true,"extensions":["markdown","md"]},"text/mathml":{"source":"nginx","extensions":["mml"]},"text/mizar":{"source":"iana"},"text/n3":{"source":"iana","compressible":true,"extensions":["n3"]},"text/parameters":{"source":"iana"},"text/parityfec":{"source":"iana"},"text/plain":{"source":"iana","compressible":true,"extensions":["txt","text","conf","def","list","log","in","ini"]},"text/provenance-notation":{"source":"iana"},"text/prs.fallenstein.rst":{"source":"iana"},"text/prs.lines.tag":{"source":"iana","extensions":["dsc"]},"text/prs.prop.logic":{"source":"iana"},"text/raptorfec":{"source":"iana"},"text/red":{"source":"iana"},"text/rfc822-headers":{"source":"iana"},"text/richtext":{"source":"iana","compressible":true,"extensions":["rtx"]},"text/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"text/rtp-enc-aescm128":{"source":"iana"},"text/rtploopback":{"source":"iana"},"text/rtx":{"source":"iana"},"text/sgml":{"source":"iana","extensions":["sgml","sgm"]},"text/shex":{"extensions":["shex"]},"text/slim":{"extensions":["slim","slm"]},"text/strings":{"source":"iana"},"text/stylus":{"extensions":["stylus","styl"]},"text/t140":{"source":"iana"},"text/tab-separated-values":{"source":"iana","compressible":true,"extensions":["tsv"]},"text/troff":{"source":"iana","extensions":["t","tr","roff","man","me","ms"]},"text/turtle":{"source":"iana","extensions":["ttl"]},"text/ulpfec":{"source":"iana"},"text/uri-list":{"source":"iana","compressible":true,"extensions":["uri","uris","urls"]},"text/vcard":{"source":"iana","compressible":true,"extensions":["vcard"]},"text/vnd.a":{"source":"iana"},"text/vnd.abc":{"source":"iana"},"text/vnd.ascii-art":{"source":"iana"},"text/vnd.curl":{"source":"iana","extensions":["curl"]},"text/vnd.curl.dcurl":{"source":"apache","extensions":["dcurl"]},"text/vnd.curl.mcurl":{"source":"apache","extensions":["mcurl"]},"text/vnd.curl.scurl":{"source":"apache","extensions":["scurl"]},"text/vnd.debian.copyright":{"source":"iana"},"text/vnd.dmclientscript":{"source":"iana"},"text/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"text/vnd.esmertec.theme-descriptor":{"source":"iana"},"text/vnd.fly":{"source":"iana","extensions":["fly"]},"text/vnd.fmi.flexstor":{"source":"iana","extensions":["flx"]},"text/vnd.graphviz":{"source":"iana","extensions":["gv"]},"text/vnd.in3d.3dml":{"source":"iana","extensions":["3dml"]},"text/vnd.in3d.spot":{"source":"iana","extensions":["spot"]},"text/vnd.iptc.newsml":{"source":"iana"},"text/vnd.iptc.nitf":{"source":"iana"},"text/vnd.latex-z":{"source":"iana"},"text/vnd.motorola.reflex":{"source":"iana"},"text/vnd.ms-mediapackage":{"source":"iana"},"text/vnd.net2phone.commcenter.command":{"source":"iana"},"text/vnd.radisys.msml-basic-layout":{"source":"iana"},"text/vnd.si.uricatalogue":{"source":"iana"},"text/vnd.sun.j2me.app-descriptor":{"source":"iana","extensions":["jad"]},"text/vnd.trolltech.linguist":{"source":"iana"},"text/vnd.wap.si":{"source":"iana"},"text/vnd.wap.sl":{"source":"iana"},"text/vnd.wap.wml":{"source":"iana","extensions":["wml"]},"text/vnd.wap.wmlscript":{"source":"iana","extensions":["wmls"]},"text/vtt":{"charset":"UTF-8","compressible":true,"extensions":["vtt"]},"text/x-asm":{"source":"apache","extensions":["s","asm"]},"text/x-c":{"source":"apache","extensions":["c","cc","cxx","cpp","h","hh","dic"]},"text/x-component":{"source":"nginx","extensions":["htc"]},"text/x-fortran":{"source":"apache","extensions":["f","for","f77","f90"]},"text/x-gwt-rpc":{"compressible":true},"text/x-handlebars-template":{"extensions":["hbs"]},"text/x-java-source":{"source":"apache","extensions":["java"]},"text/x-jquery-tmpl":{"compressible":true},"text/x-lua":{"extensions":["lua"]},"text/x-markdown":{"compressible":true,"extensions":["mkd"]},"text/x-nfo":{"source":"apache","extensions":["nfo"]},"text/x-opml":{"source":"apache","extensions":["opml"]},"text/x-org":{"compressible":true,"extensions":["org"]},"text/x-pascal":{"source":"apache","extensions":["p","pas"]},"text/x-processing":{"compressible":true,"extensions":["pde"]},"text/x-sass":{"extensions":["sass"]},"text/x-scss":{"extensions":["scss"]},"text/x-setext":{"source":"apache","extensions":["etx"]},"text/x-sfv":{"source":"apache","extensions":["sfv"]},"text/x-suse-ymp":{"compressible":true,"extensions":["ymp"]},"text/x-uuencode":{"source":"apache","extensions":["uu"]},"text/x-vcalendar":{"source":"apache","extensions":["vcs"]},"text/x-vcard":{"source":"apache","extensions":["vcf"]},"text/xml":{"source":"iana","compressible":true,"extensions":["xml"]},"text/xml-external-parsed-entity":{"source":"iana"},"text/yaml":{"extensions":["yaml","yml"]},"video/1d-interleaved-parityfec":{"source":"iana"},"video/3gpp":{"source":"iana","extensions":["3gp","3gpp"]},"video/3gpp-tt":{"source":"iana"},"video/3gpp2":{"source":"iana","extensions":["3g2"]},"video/bmpeg":{"source":"iana"},"video/bt656":{"source":"iana"},"video/celb":{"source":"iana"},"video/dv":{"source":"iana"},"video/encaprtp":{"source":"iana"},"video/h261":{"source":"iana","extensions":["h261"]},"video/h263":{"source":"iana","extensions":["h263"]},"video/h263-1998":{"source":"iana"},"video/h263-2000":{"source":"iana"},"video/h264":{"source":"iana","extensions":["h264"]},"video/h264-rcdo":{"source":"iana"},"video/h264-svc":{"source":"iana"},"video/h265":{"source":"iana"},"video/iso.segment":{"source":"iana"},"video/jpeg":{"source":"iana","extensions":["jpgv"]},"video/jpeg2000":{"source":"iana"},"video/jpm":{"source":"apache","extensions":["jpm","jpgm"]},"video/mj2":{"source":"iana","extensions":["mj2","mjp2"]},"video/mp1s":{"source":"iana"},"video/mp2p":{"source":"iana"},"video/mp2t":{"source":"iana","extensions":["ts"]},"video/mp4":{"source":"iana","compressible":false,"extensions":["mp4","mp4v","mpg4"]},"video/mp4v-es":{"source":"iana"},"video/mpeg":{"source":"iana","compressible":false,"extensions":["mpeg","mpg","mpe","m1v","m2v"]},"video/mpeg4-generic":{"source":"iana"},"video/mpv":{"source":"iana"},"video/nv":{"source":"iana"},"video/ogg":{"source":"iana","compressible":false,"extensions":["ogv"]},"video/parityfec":{"source":"iana"},"video/pointer":{"source":"iana"},"video/quicktime":{"source":"iana","compressible":false,"extensions":["qt","mov"]},"video/raptorfec":{"source":"iana"},"video/raw":{"source":"iana"},"video/rtp-enc-aescm128":{"source":"iana"},"video/rtploopback":{"source":"iana"},"video/rtx":{"source":"iana"},"video/smpte291":{"source":"iana"},"video/smpte292m":{"source":"iana"},"video/ulpfec":{"source":"iana"},"video/vc1":{"source":"iana"},"video/vnd.cctv":{"source":"iana"},"video/vnd.dece.hd":{"source":"iana","extensions":["uvh","uvvh"]},"video/vnd.dece.mobile":{"source":"iana","extensions":["uvm","uvvm"]},"video/vnd.dece.mp4":{"source":"iana"},"video/vnd.dece.pd":{"source":"iana","extensions":["uvp","uvvp"]},"video/vnd.dece.sd":{"source":"iana","extensions":["uvs","uvvs"]},"video/vnd.dece.video":{"source":"iana","extensions":["uvv","uvvv"]},"video/vnd.directv.mpeg":{"source":"iana"},"video/vnd.directv.mpeg-tts":{"source":"iana"},"video/vnd.dlna.mpeg-tts":{"source":"iana"},"video/vnd.dvb.file":{"source":"iana","extensions":["dvb"]},"video/vnd.fvt":{"source":"iana","extensions":["fvt"]},"video/vnd.hns.video":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.ttsavc":{"source":"iana"},"video/vnd.iptvforum.ttsmpeg2":{"source":"iana"},"video/vnd.motorola.video":{"source":"iana"},"video/vnd.motorola.videop":{"source":"iana"},"video/vnd.mpegurl":{"source":"iana","extensions":["mxu","m4u"]},"video/vnd.ms-playready.media.pyv":{"source":"iana","extensions":["pyv"]},"video/vnd.nokia.interleaved-multimedia":{"source":"iana"},"video/vnd.nokia.mp4vr":{"source":"iana"},"video/vnd.nokia.videovoip":{"source":"iana"},"video/vnd.objectvideo":{"source":"iana"},"video/vnd.radgamettools.bink":{"source":"iana"},"video/vnd.radgamettools.smacker":{"source":"iana"},"video/vnd.sealed.mpeg1":{"source":"iana"},"video/vnd.sealed.mpeg4":{"source":"iana"},"video/vnd.sealed.swf":{"source":"iana"},"video/vnd.sealedmedia.softseal.mov":{"source":"iana"},"video/vnd.uvvu.mp4":{"source":"iana","extensions":["uvu","uvvu"]},"video/vnd.vivo":{"source":"iana","extensions":["viv"]},"video/vp8":{"source":"iana"},"video/webm":{"source":"apache","compressible":false,"extensions":["webm"]},"video/x-f4v":{"source":"apache","extensions":["f4v"]},"video/x-fli":{"source":"apache","extensions":["fli"]},"video/x-flv":{"source":"apache","compressible":false,"extensions":["flv"]},"video/x-m4v":{"source":"apache","extensions":["m4v"]},"video/x-matroska":{"source":"apache","compressible":false,"extensions":["mkv","mk3d","mks"]},"video/x-mng":{"source":"apache","extensions":["mng"]},"video/x-ms-asf":{"source":"apache","extensions":["asf","asx"]},"video/x-ms-vob":{"source":"apache","extensions":["vob"]},"video/x-ms-wm":{"source":"apache","extensions":["wm"]},"video/x-ms-wmv":{"source":"apache","compressible":false,"extensions":["wmv"]},"video/x-ms-wmx":{"source":"apache","extensions":["wmx"]},"video/x-ms-wvx":{"source":"apache","extensions":["wvx"]},"video/x-msvideo":{"source":"apache","extensions":["avi"]},"video/x-sgi-movie":{"source":"apache","extensions":["movie"]},"video/x-smv":{"source":"apache","extensions":["smv"]},"x-conference/x-cooltalk":{"source":"apache","extensions":["ice"]},"x-shader/x-fragment":{"compressible":true},"x-shader/x-vertex":{"compressible":true}} - -/***/ }), -/* 155 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * body-parser - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - */ - -var bytes = __webpack_require__(20) -var debug = __webpack_require__(5)('body-parser:raw') -var read = __webpack_require__(36) -var typeis = __webpack_require__(22) - -/** - * Module exports. - */ - -module.exports = raw - -/** - * Create a middleware to parse raw bodies. - * - * @param {object} [options] - * @return {function} - * @api public - */ - -function raw (options) { - var opts = options || {} - - var inflate = opts.inflate !== false - var limit = typeof opts.limit !== 'number' - ? bytes.parse(opts.limit || '100kb') - : opts.limit - var type = opts.type || 'application/octet-stream' - var verify = opts.verify || false - - if (verify !== false && typeof verify !== 'function') { - throw new TypeError('option verify must be function') - } - - // create the appropriate type checking function - var shouldParse = typeof type !== 'function' - ? typeChecker(type) - : type - - function parse (buf) { - return buf - } - - return function rawParser (req, res, next) { - if (req._body) { - debug('body already parsed') - next() - return - } - - req.body = req.body || {} - - // skip requests without bodies - if (!typeis.hasBody(req)) { - debug('skip empty body') - next() - return - } - - debug('content-type %j', req.headers['content-type']) - - // determine if request should be parsed - if (!shouldParse(req)) { - debug('skip parsing') - next() - return - } - - // read - read(req, res, next, parse, debug, { - encoding: null, - inflate: inflate, - limit: limit, - verify: verify - }) - } -} - -/** - * Get the simple type checker. - * - * @param {string} type - * @return {function} - */ - -function typeChecker (type) { - return function checkType (req) { - return Boolean(typeis(req, type)) - } -} - - -/***/ }), -/* 156 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * body-parser - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - */ - -var bytes = __webpack_require__(20) -var contentType = __webpack_require__(33) -var debug = __webpack_require__(5)('body-parser:text') -var read = __webpack_require__(36) -var typeis = __webpack_require__(22) - -/** - * Module exports. - */ - -module.exports = text - -/** - * Create a middleware to parse text bodies. - * - * @param {object} [options] - * @return {function} - * @api public - */ - -function text (options) { - var opts = options || {} - - var defaultCharset = opts.defaultCharset || 'utf-8' - var inflate = opts.inflate !== false - var limit = typeof opts.limit !== 'number' - ? bytes.parse(opts.limit || '100kb') - : opts.limit - var type = opts.type || 'text/plain' - var verify = opts.verify || false - - if (verify !== false && typeof verify !== 'function') { - throw new TypeError('option verify must be function') - } - - // create the appropriate type checking function - var shouldParse = typeof type !== 'function' - ? typeChecker(type) - : type - - function parse (buf) { - return buf - } - - return function textParser (req, res, next) { - if (req._body) { - debug('body already parsed') - next() - return - } - - req.body = req.body || {} - - // skip requests without bodies - if (!typeis.hasBody(req)) { - debug('skip empty body') - next() - return - } - - debug('content-type %j', req.headers['content-type']) - - // determine if request should be parsed - if (!shouldParse(req)) { - debug('skip parsing') - next() - return - } - - // get charset - var charset = getCharset(req) || defaultCharset - - // read - read(req, res, next, parse, debug, { - encoding: charset, - inflate: inflate, - limit: limit, - verify: verify - }) - } -} - -/** - * Get the charset of a request. - * - * @param {object} req - * @api private - */ - -function getCharset (req) { - try { - return (contentType.parse(req).parameters.charset || '').toLowerCase() - } catch (e) { - return undefined - } -} - -/** - * Get the simple type checker. - * - * @param {string} type - * @return {function} - */ - -function typeChecker (type) { - return function checkType (req) { - return Boolean(typeis(req, type)) - } -} - - -/***/ }), -/* 157 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * body-parser - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var bytes = __webpack_require__(20) -var contentType = __webpack_require__(33) -var createError = __webpack_require__(34) -var debug = __webpack_require__(5)('body-parser:urlencoded') -var deprecate = __webpack_require__(7)('body-parser') -var read = __webpack_require__(36) -var typeis = __webpack_require__(22) - -/** - * Module exports. - */ - -module.exports = urlencoded - -/** - * Cache of parser modules. - */ - -var parsers = Object.create(null) - -/** - * Create a middleware to parse urlencoded bodies. - * - * @param {object} [options] - * @return {function} - * @public - */ - -function urlencoded (options) { - var opts = options || {} - - // notice because option default will flip in next major - if (opts.extended === undefined) { - deprecate('undefined extended: provide extended option') - } - - var extended = opts.extended !== false - var inflate = opts.inflate !== false - var limit = typeof opts.limit !== 'number' - ? bytes.parse(opts.limit || '100kb') - : opts.limit - var type = opts.type || 'application/x-www-form-urlencoded' - var verify = opts.verify || false - - if (verify !== false && typeof verify !== 'function') { - throw new TypeError('option verify must be function') - } - - // create the appropriate query parser - var queryparse = extended - ? extendedparser(opts) - : simpleparser(opts) - - // create the appropriate type checking function - var shouldParse = typeof type !== 'function' - ? typeChecker(type) - : type - - function parse (body) { - return body.length - ? queryparse(body) - : {} - } - - return function urlencodedParser (req, res, next) { - if (req._body) { - debug('body already parsed') - next() - return - } - - req.body = req.body || {} - - // skip requests without bodies - if (!typeis.hasBody(req)) { - debug('skip empty body') - next() - return - } - - debug('content-type %j', req.headers['content-type']) - - // determine if request should be parsed - if (!shouldParse(req)) { - debug('skip parsing') - next() - return - } - - // assert charset - var charset = getCharset(req) || 'utf-8' - if (charset !== 'utf-8') { - debug('invalid charset') - next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', { - charset: charset, - type: 'charset.unsupported' - })) - return - } - - // read - read(req, res, next, parse, debug, { - debug: debug, - encoding: charset, - inflate: inflate, - limit: limit, - verify: verify - }) - } -} - -/** - * Get the extended query parser. - * - * @param {object} options - */ - -function extendedparser (options) { - var parameterLimit = options.parameterLimit !== undefined - ? options.parameterLimit - : 1000 - var parse = parser('qs') - - if (isNaN(parameterLimit) || parameterLimit < 1) { - throw new TypeError('option parameterLimit must be a positive number') - } - - if (isFinite(parameterLimit)) { - parameterLimit = parameterLimit | 0 - } - - return function queryparse (body) { - var paramCount = parameterCount(body, parameterLimit) - - if (paramCount === undefined) { - debug('too many parameters') - throw createError(413, 'too many parameters', { - type: 'parameters.too.many' - }) - } - - var arrayLimit = Math.max(100, paramCount) - - debug('parse extended urlencoding') - return parse(body, { - allowPrototypes: true, - arrayLimit: arrayLimit, - depth: Infinity, - parameterLimit: parameterLimit - }) - } -} - -/** - * Get the charset of a request. - * - * @param {object} req - * @api private - */ - -function getCharset (req) { - try { - return (contentType.parse(req).parameters.charset || '').toLowerCase() - } catch (e) { - return undefined - } -} - -/** - * Count the number of parameters, stopping once limit reached - * - * @param {string} body - * @param {number} limit - * @api private - */ - -function parameterCount (body, limit) { - var count = 0 - var index = 0 - - while ((index = body.indexOf('&', index)) !== -1) { - count++ - index++ - - if (count === limit) { - return undefined - } - } - - return count -} - -/** - * Get parser for module name dynamically. - * - * @param {string} name - * @return {function} - * @api private - */ - -function parser (name) { - var mod = parsers[name] - - if (mod !== undefined) { - return mod.parse - } - - // this uses a switch for static require analysis - switch (name) { - case 'qs': - mod = __webpack_require__(50) - break - case 'querystring': - mod = __webpack_require__(88) - break - } - - // store to prevent invoking require() - parsers[name] = mod - - return mod.parse -} - -/** - * Get the simple query parser. - * - * @param {object} options - */ - -function simpleparser (options) { - var parameterLimit = options.parameterLimit !== undefined - ? options.parameterLimit - : 1000 - var parse = parser('querystring') - - if (isNaN(parameterLimit) || parameterLimit < 1) { - throw new TypeError('option parameterLimit must be a positive number') - } - - if (isFinite(parameterLimit)) { - parameterLimit = parameterLimit | 0 - } - - return function queryparse (body) { - var paramCount = parameterCount(body, parameterLimit) - - if (paramCount === undefined) { - debug('too many parameters') - throw createError(413, 'too many parameters', { - type: 'parameters.too.many' - }) - } - - debug('parse urlencoding') - return parse(body, undefined, undefined, {maxKeys: parameterLimit}) - } -} - -/** - * Get the simple type checker. - * - * @param {string} type - * @return {function} - */ - -function typeChecker (type) { - return function checkType (req) { - return Boolean(typeis(req, type)) - } -} - - -/***/ }), -/* 158 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var utils = __webpack_require__(86); -var formats = __webpack_require__(87); - -var arrayPrefixGenerators = { - brackets: function brackets(prefix) { // eslint-disable-line func-name-matching - return prefix + '[]'; - }, - indices: function indices(prefix, key) { // eslint-disable-line func-name-matching - return prefix + '[' + key + ']'; - }, - repeat: function repeat(prefix) { // eslint-disable-line func-name-matching - return prefix; - } -}; - -var toISO = Date.prototype.toISOString; - -var defaults = { - delimiter: '&', - encode: true, - encoder: utils.encode, - encodeValuesOnly: false, - serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching - return toISO.call(date); - }, - skipNulls: false, - strictNullHandling: false -}; - -var stringify = function stringify( // eslint-disable-line func-name-matching - object, - prefix, - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter, - encodeValuesOnly -) { - var obj = object; - if (typeof filter === 'function') { - obj = filter(prefix, obj); - } else if (obj instanceof Date) { - obj = serializeDate(obj); - } else if (obj === null) { - if (strictNullHandling) { - return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix; - } - - obj = ''; - } - - if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) { - if (encoder) { - var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder); - return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))]; - } - return [formatter(prefix) + '=' + formatter(String(obj))]; - } - - var values = []; - - if (typeof obj === 'undefined') { - return values; - } - - var objKeys; - if (Array.isArray(filter)) { - objKeys = filter; - } else { - var keys = Object.keys(obj); - objKeys = sort ? keys.sort(sort) : keys; - } - - for (var i = 0; i < objKeys.length; ++i) { - var key = objKeys[i]; - - if (skipNulls && obj[key] === null) { - continue; - } - - if (Array.isArray(obj)) { - values = values.concat(stringify( - obj[key], - generateArrayPrefix(prefix, key), - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter, - encodeValuesOnly - )); - } else { - values = values.concat(stringify( - obj[key], - prefix + (allowDots ? '.' + key : '[' + key + ']'), - generateArrayPrefix, - strictNullHandling, - skipNulls, - encoder, - filter, - sort, - allowDots, - serializeDate, - formatter, - encodeValuesOnly - )); - } - } - - return values; -}; - -module.exports = function (object, opts) { - var obj = object; - var options = opts ? utils.assign({}, opts) : {}; - - if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') { - throw new TypeError('Encoder has to be a function.'); - } - - var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter; - var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; - var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls; - var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode; - var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder; - var sort = typeof options.sort === 'function' ? options.sort : null; - var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots; - var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate; - var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly; - if (typeof options.format === 'undefined') { - options.format = formats['default']; - } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) { - throw new TypeError('Unknown format option provided.'); - } - var formatter = formats.formatters[options.format]; - var objKeys; - var filter; - - if (typeof options.filter === 'function') { - filter = options.filter; - obj = filter('', obj); - } else if (Array.isArray(options.filter)) { - filter = options.filter; - objKeys = filter; - } - - var keys = []; - - if (typeof obj !== 'object' || obj === null) { - return ''; - } - - var arrayFormat; - if (options.arrayFormat in arrayPrefixGenerators) { - arrayFormat = options.arrayFormat; - } else if ('indices' in options) { - arrayFormat = options.indices ? 'indices' : 'repeat'; - } else { - arrayFormat = 'indices'; - } - - var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; - - if (!objKeys) { - objKeys = Object.keys(obj); - } - - if (sort) { - objKeys.sort(sort); - } - - for (var i = 0; i < objKeys.length; ++i) { - var key = objKeys[i]; - - if (skipNulls && obj[key] === null) { - continue; - } - - keys = keys.concat(stringify( - obj[key], - key, - generateArrayPrefix, - strictNullHandling, - skipNulls, - encode ? encoder : null, - filter, - sort, - allowDots, - serializeDate, - formatter, - encodeValuesOnly - )); - } - - var joined = keys.join(delimiter); - var prefix = options.addQueryPrefix === true ? '?' : ''; - - return joined.length > 0 ? prefix + joined : ''; -}; - - -/***/ }), -/* 159 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var utils = __webpack_require__(86); - -var has = Object.prototype.hasOwnProperty; - -var defaults = { - allowDots: false, - allowPrototypes: false, - arrayLimit: 20, - decoder: utils.decode, - delimiter: '&', - depth: 5, - parameterLimit: 1000, - plainObjects: false, - strictNullHandling: false -}; - -var parseValues = function parseQueryStringValues(str, options) { - var obj = {}; - var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; - var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; - var parts = cleanStr.split(options.delimiter, limit); - - for (var i = 0; i < parts.length; ++i) { - var part = parts[i]; - - var bracketEqualsPos = part.indexOf(']='); - var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; - - var key, val; - if (pos === -1) { - key = options.decoder(part, defaults.decoder); - val = options.strictNullHandling ? null : ''; - } else { - key = options.decoder(part.slice(0, pos), defaults.decoder); - val = options.decoder(part.slice(pos + 1), defaults.decoder); - } - if (has.call(obj, key)) { - obj[key] = [].concat(obj[key]).concat(val); - } else { - obj[key] = val; - } - } - - return obj; -}; - -var parseObject = function (chain, val, options) { - var leaf = val; - - for (var i = chain.length - 1; i >= 0; --i) { - var obj; - var root = chain[i]; - - if (root === '[]') { - obj = []; - obj = obj.concat(leaf); - } else { - obj = options.plainObjects ? Object.create(null) : {}; - var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; - var index = parseInt(cleanRoot, 10); - if ( - !isNaN(index) - && root !== cleanRoot - && String(index) === cleanRoot - && index >= 0 - && (options.parseArrays && index <= options.arrayLimit) - ) { - obj = []; - obj[index] = leaf; - } else { - obj[cleanRoot] = leaf; - } - } - - leaf = obj; - } - - return leaf; -}; - -var parseKeys = function parseQueryStringKeys(givenKey, val, options) { - if (!givenKey) { - return; - } - - // Transform dot notation to bracket notation - var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; - - // The regex chunks - - var brackets = /(\[[^[\]]*])/; - var child = /(\[[^[\]]*])/g; - - // Get the parent - - var segment = brackets.exec(key); - var parent = segment ? key.slice(0, segment.index) : key; - - // Stash the parent if it exists - - var keys = []; - if (parent) { - // If we aren't using plain objects, optionally prefix keys - // that would overwrite object prototype properties - if (!options.plainObjects && has.call(Object.prototype, parent)) { - if (!options.allowPrototypes) { - return; - } - } - - keys.push(parent); - } - - // Loop through children appending to the array until we hit depth - - var i = 0; - while ((segment = child.exec(key)) !== null && i < options.depth) { - i += 1; - if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { - if (!options.allowPrototypes) { - return; - } - } - keys.push(segment[1]); - } - - // If there's a remainder, just add whatever is left - - if (segment) { - keys.push('[' + key.slice(segment.index) + ']'); - } - - return parseObject(keys, val, options); -}; - -module.exports = function (str, opts) { - var options = opts ? utils.assign({}, opts) : {}; - - if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') { - throw new TypeError('Decoder has to be a function.'); - } - - options.ignoreQueryPrefix = options.ignoreQueryPrefix === true; - options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter; - options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth; - options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit; - options.parseArrays = options.parseArrays !== false; - options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder; - options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots; - options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects; - options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes; - options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit; - options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling; - - if (str === '' || str === null || typeof str === 'undefined') { - return options.plainObjects ? Object.create(null) : {}; - } - - var tempObj = typeof str === 'string' ? parseValues(str, options) : str; - var obj = options.plainObjects ? Object.create(null) : {}; - - // Iterate over the keys and setup the new object - - var keys = Object.keys(tempObj); - for (var i = 0; i < keys.length; ++i) { - var key = keys[i]; - var newObj = parseKeys(key, tempObj[key], options); - obj = utils.merge(obj, newObj, options); - } - - return utils.compact(obj); -}; - - -/***/ }), -/* 160 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * merge-descriptors - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = merge - -/** - * Module variables. - * @private - */ - -var hasOwnProperty = Object.prototype.hasOwnProperty - -/** - * Merge the property descriptors of `src` into `dest` - * - * @param {object} dest Object to add descriptors to - * @param {object} src Object to clone descriptors from - * @param {boolean} [redefine=true] Redefine `dest` properties with `src` properties - * @returns {object} Reference to dest - * @public - */ - -function merge(dest, src, redefine) { - if (!dest) { - throw new TypeError('argument dest is required') - } - - if (!src) { - throw new TypeError('argument src is required') - } - - if (redefine === undefined) { - // Default to true - redefine = true - } - - Object.getOwnPropertyNames(src).forEach(function forEachOwnPropertyName(name) { - if (!redefine && hasOwnProperty.call(dest, name)) { - // Skip desriptor - return - } - - // Copy descriptor - var descriptor = Object.getOwnPropertyDescriptor(src, name) - Object.defineProperty(dest, name, descriptor) - }) - - return dest -} - - -/***/ }), -/* 161 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var finalhandler = __webpack_require__(162); -var Router = __webpack_require__(89); -var methods = __webpack_require__(51); -var middleware = __webpack_require__(164); -var query = __webpack_require__(92); -var debug = __webpack_require__(5)('express:application'); -var View = __webpack_require__(165); -var http = __webpack_require__(17); -var compileETag = __webpack_require__(12).compileETag; -var compileQueryParser = __webpack_require__(12).compileQueryParser; -var compileTrust = __webpack_require__(12).compileTrust; -var deprecate = __webpack_require__(7)('express'); -var flatten = __webpack_require__(41); -var merge = __webpack_require__(42); -var resolve = __webpack_require__(0).resolve; -var setPrototypeOf = __webpack_require__(35) -var slice = Array.prototype.slice; - -/** - * Application prototype. - */ - -var app = exports = module.exports = {}; - -/** - * Variable for trust proxy inheritance back-compat - * @private - */ - -var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default'; - -/** - * Initialize the server. - * - * - setup default configuration - * - setup default middleware - * - setup route reflection methods - * - * @private - */ - -app.init = function init() { - this.cache = {}; - this.engines = {}; - this.settings = {}; - - this.defaultConfiguration(); -}; - -/** - * Initialize application configuration. - * @private - */ - -app.defaultConfiguration = function defaultConfiguration() { - var env = "development" || 'development'; - - // default settings - this.enable('x-powered-by'); - this.set('etag', 'weak'); - this.set('env', env); - this.set('query parser', 'extended'); - this.set('subdomain offset', 2); - this.set('trust proxy', false); - - // trust proxy inherit back-compat - Object.defineProperty(this.settings, trustProxyDefaultSymbol, { - configurable: true, - value: true - }); - - debug('booting in %s mode', env); - - this.on('mount', function onmount(parent) { - // inherit trust proxy - if (this.settings[trustProxyDefaultSymbol] === true - && typeof parent.settings['trust proxy fn'] === 'function') { - delete this.settings['trust proxy']; - delete this.settings['trust proxy fn']; - } - - // inherit protos - setPrototypeOf(this.request, parent.request) - setPrototypeOf(this.response, parent.response) - setPrototypeOf(this.engines, parent.engines) - setPrototypeOf(this.settings, parent.settings) - }); - - // setup locals - this.locals = Object.create(null); - - // top-most app is mounted at / - this.mountpath = '/'; - - // default locals - this.locals.settings = this.settings; - - // default configuration - this.set('view', View); - this.set('views', resolve('views')); - this.set('jsonp callback name', 'callback'); - - if (env === 'production') { - this.enable('view cache'); - } - - Object.defineProperty(this, 'router', { - get: function() { - throw new Error('\'app.router\' is deprecated!\nPlease see the 3.x to 4.x migration guide for details on how to update your app.'); - } - }); -}; - -/** - * lazily adds the base router if it has not yet been added. - * - * We cannot add the base router in the defaultConfiguration because - * it reads app settings which might be set after that has run. - * - * @private - */ -app.lazyrouter = function lazyrouter() { - if (!this._router) { - this._router = new Router({ - caseSensitive: this.enabled('case sensitive routing'), - strict: this.enabled('strict routing') - }); - - this._router.use(query(this.get('query parser fn'))); - this._router.use(middleware.init(this)); - } -}; - -/** - * Dispatch a req, res pair into the application. Starts pipeline processing. - * - * If no callback is provided, then default error handlers will respond - * in the event of an error bubbling through the stack. - * - * @private - */ - -app.handle = function handle(req, res, callback) { - var router = this._router; - - // final handler - var done = callback || finalhandler(req, res, { - env: this.get('env'), - onerror: logerror.bind(this) - }); - - // no routes - if (!router) { - debug('no routes defined on app'); - done(); - return; - } - - router.handle(req, res, done); -}; - -/** - * Proxy `Router#use()` to add middleware to the app router. - * See Router#use() documentation for details. - * - * If the _fn_ parameter is an express app, then it will be - * mounted at the _route_ specified. - * - * @public - */ - -app.use = function use(fn) { - var offset = 0; - var path = '/'; - - // default path to '/' - // disambiguate app.use([fn]) - if (typeof fn !== 'function') { - var arg = fn; - - while (Array.isArray(arg) && arg.length !== 0) { - arg = arg[0]; - } - - // first arg is the path - if (typeof arg !== 'function') { - offset = 1; - path = fn; - } - } - - var fns = flatten(slice.call(arguments, offset)); - - if (fns.length === 0) { - throw new TypeError('app.use() requires a middleware function') - } - - // setup router - this.lazyrouter(); - var router = this._router; - - fns.forEach(function (fn) { - // non-express app - if (!fn || !fn.handle || !fn.set) { - return router.use(path, fn); - } - - debug('.use app under %s', path); - fn.mountpath = path; - fn.parent = this; - - // restore .app property on req and res - router.use(path, function mounted_app(req, res, next) { - var orig = req.app; - fn.handle(req, res, function (err) { - setPrototypeOf(req, orig.request) - setPrototypeOf(res, orig.response) - next(err); - }); - }); - - // mounted an app - fn.emit('mount', this); - }, this); - - return this; -}; - -/** - * Proxy to the app `Router#route()` - * Returns a new `Route` instance for the _path_. - * - * Routes are isolated middleware stacks for specific paths. - * See the Route api docs for details. - * - * @public - */ - -app.route = function route(path) { - this.lazyrouter(); - return this._router.route(path); -}; - -/** - * Register the given template engine callback `fn` - * as `ext`. - * - * By default will `require()` the engine based on the - * file extension. For example if you try to render - * a "foo.ejs" file Express will invoke the following internally: - * - * app.engine('ejs', require('ejs').__express); - * - * For engines that do not provide `.__express` out of the box, - * or if you wish to "map" a different extension to the template engine - * you may use this method. For example mapping the EJS template engine to - * ".html" files: - * - * app.engine('html', require('ejs').renderFile); - * - * In this case EJS provides a `.renderFile()` method with - * the same signature that Express expects: `(path, options, callback)`, - * though note that it aliases this method as `ejs.__express` internally - * so if you're using ".ejs" extensions you dont need to do anything. - * - * Some template engines do not follow this convention, the - * [Consolidate.js](https://github.com/tj/consolidate.js) - * library was created to map all of node's popular template - * engines to follow this convention, thus allowing them to - * work seamlessly within Express. - * - * @param {String} ext - * @param {Function} fn - * @return {app} for chaining - * @public - */ - -app.engine = function engine(ext, fn) { - if (typeof fn !== 'function') { - throw new Error('callback function required'); - } - - // get file extension - var extension = ext[0] !== '.' - ? '.' + ext - : ext; - - // store engine - this.engines[extension] = fn; - - return this; -}; - -/** - * Proxy to `Router#param()` with one added api feature. The _name_ parameter - * can be an array of names. - * - * See the Router#param() docs for more details. - * - * @param {String|Array} name - * @param {Function} fn - * @return {app} for chaining - * @public - */ - -app.param = function param(name, fn) { - this.lazyrouter(); - - if (Array.isArray(name)) { - for (var i = 0; i < name.length; i++) { - this.param(name[i], fn); - } - - return this; - } - - this._router.param(name, fn); - - return this; -}; - -/** - * Assign `setting` to `val`, or return `setting`'s value. - * - * app.set('foo', 'bar'); - * app.set('foo'); - * // => "bar" - * - * Mounted servers inherit their parent server's settings. - * - * @param {String} setting - * @param {*} [val] - * @return {Server} for chaining - * @public - */ - -app.set = function set(setting, val) { - if (arguments.length === 1) { - // app.get(setting) - return this.settings[setting]; - } - - debug('set "%s" to %o', setting, val); - - // set value - this.settings[setting] = val; - - // trigger matched settings - switch (setting) { - case 'etag': - this.set('etag fn', compileETag(val)); - break; - case 'query parser': - this.set('query parser fn', compileQueryParser(val)); - break; - case 'trust proxy': - this.set('trust proxy fn', compileTrust(val)); - - // trust proxy inherit back-compat - Object.defineProperty(this.settings, trustProxyDefaultSymbol, { - configurable: true, - value: false - }); - - break; - } - - return this; -}; - -/** - * Return the app's absolute pathname - * based on the parent(s) that have - * mounted it. - * - * For example if the application was - * mounted as "/admin", which itself - * was mounted as "/blog" then the - * return value would be "/blog/admin". - * - * @return {String} - * @private - */ - -app.path = function path() { - return this.parent - ? this.parent.path() + this.mountpath - : ''; -}; - -/** - * Check if `setting` is enabled (truthy). - * - * app.enabled('foo') - * // => false - * - * app.enable('foo') - * app.enabled('foo') - * // => true - * - * @param {String} setting - * @return {Boolean} - * @public - */ - -app.enabled = function enabled(setting) { - return Boolean(this.set(setting)); -}; - -/** - * Check if `setting` is disabled. - * - * app.disabled('foo') - * // => true - * - * app.enable('foo') - * app.disabled('foo') - * // => false - * - * @param {String} setting - * @return {Boolean} - * @public - */ - -app.disabled = function disabled(setting) { - return !this.set(setting); -}; - -/** - * Enable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @public - */ - -app.enable = function enable(setting) { - return this.set(setting, true); -}; - -/** - * Disable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @public - */ - -app.disable = function disable(setting) { - return this.set(setting, false); -}; - -/** - * Delegate `.VERB(...)` calls to `router.VERB(...)`. - */ - -methods.forEach(function(method){ - app[method] = function(path){ - if (method === 'get' && arguments.length === 1) { - // app.get(setting) - return this.set(path); - } - - this.lazyrouter(); - - var route = this._router.route(path); - route[method].apply(route, slice.call(arguments, 1)); - return this; - }; -}); - -/** - * Special-cased "all" method, applying the given route `path`, - * middleware, and callback to _every_ HTTP method. - * - * @param {String} path - * @param {Function} ... - * @return {app} for chaining - * @public - */ - -app.all = function all(path) { - this.lazyrouter(); - - var route = this._router.route(path); - var args = slice.call(arguments, 1); - - for (var i = 0; i < methods.length; i++) { - route[methods[i]].apply(route, args); - } - - return this; -}; - -// del -> delete alias - -app.del = deprecate.function(app.delete, 'app.del: Use app.delete instead'); - -/** - * Render the given view `name` name with `options` - * and a callback accepting an error and the - * rendered template string. - * - * Example: - * - * app.render('email', { name: 'Tobi' }, function(err, html){ - * // ... - * }) - * - * @param {String} name - * @param {Object|Function} options or fn - * @param {Function} callback - * @public - */ - -app.render = function render(name, options, callback) { - var cache = this.cache; - var done = callback; - var engines = this.engines; - var opts = options; - var renderOptions = {}; - var view; - - // support callback function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - // merge app.locals - merge(renderOptions, this.locals); - - // merge options._locals - if (opts._locals) { - merge(renderOptions, opts._locals); - } - - // merge options - merge(renderOptions, opts); - - // set .cache unless explicitly provided - if (renderOptions.cache == null) { - renderOptions.cache = this.enabled('view cache'); - } - - // primed cache - if (renderOptions.cache) { - view = cache[name]; - } - - // view - if (!view) { - var View = this.get('view'); - - view = new View(name, { - defaultEngine: this.get('view engine'), - root: this.get('views'), - engines: engines - }); - - if (!view.path) { - var dirs = Array.isArray(view.root) && view.root.length > 1 - ? 'directories "' + view.root.slice(0, -1).join('", "') + '" or "' + view.root[view.root.length - 1] + '"' - : 'directory "' + view.root + '"' - var err = new Error('Failed to lookup view "' + name + '" in views ' + dirs); - err.view = view; - return done(err); - } - - // prime the cache - if (renderOptions.cache) { - cache[name] = view; - } - } - - // render - tryRender(view, renderOptions, done); -}; - -/** - * Listen for connections. - * - * A node `http.Server` is returned, with this - * application (which is a `Function`) as its - * callback. If you wish to create both an HTTP - * and HTTPS server you may do so with the "http" - * and "https" modules as shown here: - * - * var http = require('http') - * , https = require('https') - * , express = require('express') - * , app = express(); - * - * http.createServer(app).listen(80); - * https.createServer({ ... }, app).listen(443); - * - * @return {http.Server} - * @public - */ - -app.listen = function listen() { - var server = http.createServer(this); - return server.listen.apply(server, arguments); -}; - -/** - * Log error using console.error. - * - * @param {Error} err - * @private - */ - -function logerror(err) { - /* istanbul ignore next */ - if (this.get('env') !== 'test') console.error(err.stack || err.toString()); -} - -/** - * Try rendering a view. - * @private - */ - -function tryRender(view, options, callback) { - try { - view.render(options, callback); - } catch (err) { - callback(err); - } -} - - -/***/ }), -/* 162 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * finalhandler - * Copyright(c) 2014-2017 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var debug = __webpack_require__(5)('finalhandler') -var encodeUrl = __webpack_require__(38) -var escapeHtml = __webpack_require__(39) -var onFinished = __webpack_require__(37) -var parseUrl = __webpack_require__(23) -var statuses = __webpack_require__(21) -var unpipe = __webpack_require__(83) - -/** - * Module variables. - * @private - */ - -var DOUBLE_SPACE_REGEXP = /\x20{2}/g -var NEWLINE_REGEXP = /\n/g - -/* istanbul ignore next */ -var defer = typeof setImmediate === 'function' - ? setImmediate - : function (fn) { process.nextTick(fn.bind.apply(fn, arguments)) } -var isFinished = onFinished.isFinished - -/** - * Create a minimal HTML document. - * - * @param {string} message - * @private - */ - -function createHtmlDocument (message) { - var body = escapeHtml(message) - .replace(NEWLINE_REGEXP, '
') - .replace(DOUBLE_SPACE_REGEXP, '  ') - - return '\n' + - '\n' + - '\n' + - '\n' + - 'Error\n' + - '\n' + - '\n' + - '
' + body + '
\n' + - '\n' + - '\n' -} - -/** - * Module exports. - * @public - */ - -module.exports = finalhandler - -/** - * Create a function to handle the final response. - * - * @param {Request} req - * @param {Response} res - * @param {Object} [options] - * @return {Function} - * @public - */ - -function finalhandler (req, res, options) { - var opts = options || {} - - // get environment - var env = opts.env || "development" || 'development' - - // get error callback - var onerror = opts.onerror - - return function (err) { - var headers - var msg - var status - - // ignore 404 on in-flight response - if (!err && headersSent(res)) { - debug('cannot 404 after headers sent') - return - } - - // unhandled error - if (err) { - // respect status code from error - status = getErrorStatusCode(err) - - if (status === undefined) { - // fallback to status code on response - status = getResponseStatusCode(res) - } else { - // respect headers from error - headers = getErrorHeaders(err) - } - - // get error message - msg = getErrorMessage(err, status, env) - } else { - // not found - status = 404 - msg = 'Cannot ' + req.method + ' ' + encodeUrl(getResourceName(req)) - } - - debug('default %s', status) - - // schedule onerror callback - if (err && onerror) { - defer(onerror, err, req, res) - } - - // cannot actually respond - if (headersSent(res)) { - debug('cannot %d after headers sent', status) - req.socket.destroy() - return - } - - // send response - send(req, res, status, headers, msg) - } -} - -/** - * Get headers from Error object. - * - * @param {Error} err - * @return {object} - * @private - */ - -function getErrorHeaders (err) { - if (!err.headers || typeof err.headers !== 'object') { - return undefined - } - - var headers = Object.create(null) - var keys = Object.keys(err.headers) - - for (var i = 0; i < keys.length; i++) { - var key = keys[i] - headers[key] = err.headers[key] - } - - return headers -} - -/** - * Get message from Error object, fallback to status message. - * - * @param {Error} err - * @param {number} status - * @param {string} env - * @return {string} - * @private - */ - -function getErrorMessage (err, status, env) { - var msg - - if (env !== 'production') { - // use err.stack, which typically includes err.message - msg = err.stack - - // fallback to err.toString() when possible - if (!msg && typeof err.toString === 'function') { - msg = err.toString() - } - } - - return msg || statuses[status] -} - -/** - * Get status code from Error object. - * - * @param {Error} err - * @return {number} - * @private - */ - -function getErrorStatusCode (err) { - // check err.status - if (typeof err.status === 'number' && err.status >= 400 && err.status < 600) { - return err.status - } - - // check err.statusCode - if (typeof err.statusCode === 'number' && err.statusCode >= 400 && err.statusCode < 600) { - return err.statusCode - } - - return undefined -} - -/** - * Get resource name for the request. - * - * This is typically just the original pathname of the request - * but will fallback to "resource" is that cannot be determined. - * - * @param {IncomingMessage} req - * @return {string} - * @private - */ - -function getResourceName (req) { - try { - return parseUrl.original(req).pathname - } catch (e) { - return 'resource' - } -} - -/** - * Get status code from response. - * - * @param {OutgoingMessage} res - * @return {number} - * @private - */ - -function getResponseStatusCode (res) { - var status = res.statusCode - - // default status code to 500 if outside valid range - if (typeof status !== 'number' || status < 400 || status > 599) { - status = 500 - } - - return status -} - -/** - * Determine if the response headers have been sent. - * - * @param {object} res - * @returns {boolean} - * @private - */ - -function headersSent (res) { - return typeof res.headersSent !== 'boolean' - ? Boolean(res._header) - : res.headersSent -} - -/** - * Send response. - * - * @param {IncomingMessage} req - * @param {OutgoingMessage} res - * @param {number} status - * @param {object} headers - * @param {string} message - * @private - */ - -function send (req, res, status, headers, message) { - function write () { - // response body - var body = createHtmlDocument(message) - - // response status - res.statusCode = status - res.statusMessage = statuses[status] - - // response headers - setHeaders(res, headers) - - // security headers - res.setHeader('Content-Security-Policy', "default-src 'self'") - res.setHeader('X-Content-Type-Options', 'nosniff') - - // standard headers - res.setHeader('Content-Type', 'text/html; charset=utf-8') - res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8')) - - if (req.method === 'HEAD') { - res.end() - return - } - - res.end(body, 'utf8') - } - - if (isFinished(req)) { - write() - return - } - - // unpipe everything from the request - unpipe(req) - - // flush the request - onFinished(req, write) - req.resume() -} - -/** - * Set response headers from an object. - * - * @param {OutgoingMessage} res - * @param {object} headers - * @private - */ - -function setHeaders (res, headers) { - if (!headers) { - return - } - - var keys = Object.keys(headers) - for (var i = 0; i < keys.length; i++) { - var key = keys[i] - res.setHeader(key, headers[key]) - } -} - - -/***/ }), -/* 163 */ -/***/ (function(module, exports) { - -/** - * Expose `pathtoRegexp`. - */ - -module.exports = pathtoRegexp; - -/** - * Match matching groups in a regular expression. - */ -var MATCHING_GROUP_REGEXP = /\((?!\?)/g; - -/** - * Normalize the given path string, - * returning a regular expression. - * - * An empty array should be passed, - * which will contain the placeholder - * key names. For example "/user/:id" will - * then contain ["id"]. - * - * @param {String|RegExp|Array} path - * @param {Array} keys - * @param {Object} options - * @return {RegExp} - * @api private - */ - -function pathtoRegexp(path, keys, options) { - options = options || {}; - keys = keys || []; - var strict = options.strict; - var end = options.end !== false; - var flags = options.sensitive ? '' : 'i'; - var extraOffset = 0; - var keysOffset = keys.length; - var i = 0; - var name = 0; - var m; - - if (path instanceof RegExp) { - while (m = MATCHING_GROUP_REGEXP.exec(path.source)) { - keys.push({ - name: name++, - optional: false, - offset: m.index - }); - } - - return path; - } - - if (Array.isArray(path)) { - // Map array parts into regexps and return their source. We also pass - // the same keys and options instance into every generation to get - // consistent matching groups before we join the sources together. - path = path.map(function (value) { - return pathtoRegexp(value, keys, options).source; - }); - - return new RegExp('(?:' + path.join('|') + ')', flags); - } - - path = ('^' + path + (strict ? '' : path[path.length - 1] === '/' ? '?' : '/?')) - .replace(/\/\(/g, '/(?:') - .replace(/([\/\.])/g, '\\$1') - .replace(/(\\\/)?(\\\.)?:(\w+)(\(.*?\))?(\*)?(\?)?/g, function (match, slash, format, key, capture, star, optional, offset) { - slash = slash || ''; - format = format || ''; - capture = capture || '([^\\/' + format + ']+?)'; - optional = optional || ''; - - keys.push({ - name: key, - optional: !!optional, - offset: offset + extraOffset - }); - - var result = '' - + (optional ? '' : slash) - + '(?:' - + format + (optional ? slash : '') + capture - + (star ? '((?:[\\/' + format + '].+?)?)' : '') - + ')' - + optional; - - extraOffset += result.length - match.length; - - return result; - }) - .replace(/\*/g, function (star, index) { - var len = keys.length - - while (len-- > keysOffset && keys[len].offset > index) { - keys[len].offset += 3; // Replacement length minus asterisk length. - } - - return '(.*)'; - }); - - // This is a workaround for handling unnamed matching groups. - while (m = MATCHING_GROUP_REGEXP.exec(path)) { - var escapeCount = 0; - var index = m.index; - - while (path.charAt(--index) === '\\') { - escapeCount++; - } - - // It's possible to escape the bracket. - if (escapeCount % 2 === 1) { - continue; - } - - if (keysOffset + i === keys.length || keys[keysOffset + i].offset > m.index) { - keys.splice(keysOffset + i, 0, { - name: name++, // Unnamed matching groups must be consistently linear. - optional: false, - offset: m.index - }); - } - - i++; - } - - // If the path is non-ending, match until the end or a slash. - path += (end ? '$' : (path[path.length - 1] === '/' ? '' : '(?=\\/|$)')); - - return new RegExp(path, flags); -}; - - -/***/ }), -/* 164 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var setPrototypeOf = __webpack_require__(35) - -/** - * Initialization middleware, exposing the - * request and response to each other, as well - * as defaulting the X-Powered-By header field. - * - * @param {Function} app - * @return {Function} - * @api private - */ - -exports.init = function(app){ - return function expressInit(req, res, next){ - if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express'); - req.res = res; - res.req = req; - req.next = next; - - setPrototypeOf(req, app.request) - setPrototypeOf(res, app.response) - - res.locals = res.locals || Object.create(null); - - next(); - }; -}; - - - -/***/ }), -/* 165 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var debug = __webpack_require__(5)('express:view'); -var path = __webpack_require__(0); -var fs = __webpack_require__(8); - -/** - * Module variables. - * @private - */ - -var dirname = path.dirname; -var basename = path.basename; -var extname = path.extname; -var join = path.join; -var resolve = path.resolve; - -/** - * Module exports. - * @public - */ - -module.exports = View; - -/** - * Initialize a new `View` with the given `name`. - * - * Options: - * - * - `defaultEngine` the default template engine name - * - `engines` template engine require() cache - * - `root` root path for view lookup - * - * @param {string} name - * @param {object} options - * @public - */ - -function View(name, options) { - var opts = options || {}; - - this.defaultEngine = opts.defaultEngine; - this.ext = extname(name); - this.name = name; - this.root = opts.root; - - if (!this.ext && !this.defaultEngine) { - throw new Error('No default engine was specified and no extension was provided.'); - } - - var fileName = name; - - if (!this.ext) { - // get extension from default engine name - this.ext = this.defaultEngine[0] !== '.' - ? '.' + this.defaultEngine - : this.defaultEngine; - - fileName += this.ext; - } - - if (!opts.engines[this.ext]) { - // load engine - var mod = this.ext.substr(1) - debug('require "%s"', mod) - - // default engine export - var fn = !(function webpackMissingModule() { var e = new Error("Cannot find module \".\""); e.code = 'MODULE_NOT_FOUND'; throw e; }()).__express - - if (typeof fn !== 'function') { - throw new Error('Module "' + mod + '" does not provide a view engine.') - } - - opts.engines[this.ext] = fn - } - - // store loaded engine - this.engine = opts.engines[this.ext]; - - // lookup path - this.path = this.lookup(fileName); -} - -/** - * Lookup view by the given `name` - * - * @param {string} name - * @private - */ - -View.prototype.lookup = function lookup(name) { - var path; - var roots = [].concat(this.root); - - debug('lookup "%s"', name); - - for (var i = 0; i < roots.length && !path; i++) { - var root = roots[i]; - - // resolve the path - var loc = resolve(root, name); - var dir = dirname(loc); - var file = basename(loc); - - // resolve the file - path = this.resolve(dir, file); - } - - return path; -}; - -/** - * Render with the given options. - * - * @param {object} options - * @param {function} callback - * @private - */ - -View.prototype.render = function render(options, callback) { - debug('render "%s"', this.path); - this.engine(this.path, options, callback); -}; - -/** - * Resolve the file within the given directory. - * - * @param {string} dir - * @param {string} file - * @private - */ - -View.prototype.resolve = function resolve(dir, file) { - var ext = this.ext; - - // . - var path = join(dir, file); - var stat = tryStat(path); - - if (stat && stat.isFile()) { - return path; - } - - // /index. - path = join(dir, basename(file, ext), 'index' + ext); - stat = tryStat(path); - - if (stat && stat.isFile()) { - return path; - } -}; - -/** - * Return a stat, maybe. - * - * @param {string} path - * @return {fs.Stats} - * @private - */ - -function tryStat(path) { - debug('stat "%s"', path); - - try { - return fs.statSync(path); - } catch (e) { - return undefined; - } -} - - -/***/ }), -/* 166 */ -/***/ (function(module, exports) { - -function webpackEmptyContext(req) { - throw new Error("Cannot find module '" + req + "'."); -} -webpackEmptyContext.keys = function() { return []; }; -webpackEmptyContext.resolve = webpackEmptyContext; -module.exports = webpackEmptyContext; -webpackEmptyContext.id = 166; - -/***/ }), -/* 167 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * destroy - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var ReadStream = __webpack_require__(8).ReadStream -var Stream = __webpack_require__(1) - -/** - * Module exports. - * @public - */ - -module.exports = destroy - -/** - * Destroy a stream. - * - * @param {object} stream - * @public - */ - -function destroy(stream) { - if (stream instanceof ReadStream) { - return destroyReadStream(stream) - } - - if (!(stream instanceof Stream)) { - return stream - } - - if (typeof stream.destroy === 'function') { - stream.destroy() - } - - return stream -} - -/** - * Destroy a ReadStream. - * - * @param {object} stream - * @private - */ - -function destroyReadStream(stream) { - stream.destroy() - - if (typeof stream.close === 'function') { - // node.js core bug work-around - stream.on('open', onOpenClose) - } - - return stream -} - -/** - * On open handler to close stream. - * @private - */ - -function onOpenClose() { - if (typeof this.fd === 'number') { - // actually close down the fd - this.close() - } -} - - -/***/ }), -/* 168 */ -/***/ (function(module, exports, __webpack_require__) { - -var path = __webpack_require__(0); -var fs = __webpack_require__(8); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - for (var i = 0; i < exts.length; i++) { - if (process.env.DEBUG_MIME && this.types[exts[i]]) { - console.warn((this._loading || "define()").replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' + - this.types[exts[i]] + ' to ' + type); - } - - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - this._loading = file; - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); - - this._loading = null; -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/^.*[\.\/\\]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase(); - return this.extensions[type]; -}; - -// Default instance -var mime = new Mime(); - -// Define built-in types -mime.define(__webpack_require__(169)); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\/|^application\/(javascript|json)/).test(mimeType) ? 'UTF-8' : fallback; - } -}; - -module.exports = mime; - - -/***/ }), -/* 169 */ -/***/ (function(module, exports) { - -module.exports = {"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomsvc+xml":["atomsvc"],"application/bdoc":["bdoc"],"application/ccxml+xml":["ccxml"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/font-tdpfr":["pfr"],"application/font-woff":["woff"],"application/font-woff2":["woff2"],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/prs.cww":["cww"],"application/pskc+xml":["pskcxml"],"application/rdf+xml":["rdf"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/voicexml+xml":["vxml"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":["dmg"],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":["bdoc"],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["deb","udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-otf":["otf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-ttf":["ttf","ttc"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":["iso"],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":["exe"],"application/x-msdownload":["exe","dll","com","bat","msi"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["wmf","wmz","emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":["prc","pdb"],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"application/xaml+xml":["xaml"],"application/xcap-diff+xml":["xdf"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":["3gpp"],"audio/adpcm":["adp"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mp3":["mp3"],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/wav":["wav"],"audio/wave":["wav"],"audio/webm":["weba"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":["m4a"],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":["ra"],"audio/x-wav":["wav"],"audio/xm":["xm"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"font/otf":["otf"],"image/apng":["apng"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/g3fax":["g3"],"image/gif":["gif"],"image/ief":["ief"],"image/jpeg":["jpeg","jpg","jpe"],"image/ktx":["ktx"],"image/png":["png"],"image/prs.btif":["btif"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/tiff":["tiff","tif"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":["sub"],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/webp":["webp"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":["bmp"],"image/x-pcx":["pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/rfc822":["eml","mime"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.vtu":["vtu"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["x3db","x3dbz"],"model/x3d+vrml":["x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/hjson":["hjson"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/prs.lines.tag":["dsc"],"text/richtext":["rtx"],"text/rtf":["rtf"],"text/sgml":["sgml","sgm"],"text/slim":["slim","slm"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/vtt":["vtt"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":["org"],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"text/xml":["xml"],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/jpeg":["jpgv"],"video/jpm":["jpm","jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/webm":["webm"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]} - -/***/ }), -/* 170 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * forwarded - * Copyright(c) 2014-2017 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = forwarded - -/** - * Get all addresses in the request, using the `X-Forwarded-For` header. - * - * @param {object} req - * @return {array} - * @public - */ - -function forwarded (req) { - if (!req) { - throw new TypeError('argument req is required') - } - - // simple header parsing - var proxyAddrs = parse(req.headers['x-forwarded-for'] || '') - var socketAddr = req.connection.remoteAddress - var addrs = [socketAddr].concat(proxyAddrs) - - // return all addresses - return addrs -} - -/** - * Parse the X-Forwarded-For header. - * - * @param {string} header - * @private - */ - -function parse (header) { - var end = header.length - var list = [] - var start = header.length - - // gather addresses, backwards - for (var i = header.length - 1; i >= 0; i--) { - switch (header.charCodeAt(i)) { - case 0x20: /* */ - if (start === end) { - start = end = i - } - break - case 0x2c: /* , */ - if (start !== end) { - list.push(header.substring(start, end)) - } - start = end = i - break - default: - start = i - break - } - } - - // final address - if (start !== end) { - list.push(header.substring(start, end)) - } - - return list -} - - -/***/ }), -/* 171 */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(module) {(function() { - var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex; - - ipaddr = {}; - - root = this; - - if ((typeof module !== "undefined" && module !== null) && module.exports) { - module.exports = ipaddr; - } else { - root['ipaddr'] = ipaddr; - } - - matchCIDR = function(first, second, partSize, cidrBits) { - var part, shift; - if (first.length !== second.length) { - throw new Error("ipaddr: cannot match CIDR for objects with different lengths"); - } - part = 0; - while (cidrBits > 0) { - shift = partSize - cidrBits; - if (shift < 0) { - shift = 0; - } - if (first[part] >> shift !== second[part] >> shift) { - return false; - } - cidrBits -= partSize; - part += 1; - } - return true; - }; - - ipaddr.subnetMatch = function(address, rangeList, defaultName) { - var k, len, rangeName, rangeSubnets, subnet; - if (defaultName == null) { - defaultName = 'unicast'; - } - for (rangeName in rangeList) { - rangeSubnets = rangeList[rangeName]; - if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) { - rangeSubnets = [rangeSubnets]; - } - for (k = 0, len = rangeSubnets.length; k < len; k++) { - subnet = rangeSubnets[k]; - if (address.kind() === subnet[0].kind()) { - if (address.match.apply(address, subnet)) { - return rangeName; - } - } - } - } - return defaultName; - }; - - ipaddr.IPv4 = (function() { - function IPv4(octets) { - var k, len, octet; - if (octets.length !== 4) { - throw new Error("ipaddr: ipv4 octet count should be 4"); - } - for (k = 0, len = octets.length; k < len; k++) { - octet = octets[k]; - if (!((0 <= octet && octet <= 255))) { - throw new Error("ipaddr: ipv4 octet should fit in 8 bits"); - } - } - this.octets = octets; - } - - IPv4.prototype.kind = function() { - return 'ipv4'; - }; - - IPv4.prototype.toString = function() { - return this.octets.join("."); - }; - - IPv4.prototype.toNormalizedString = function() { - return this.toString(); - }; - - IPv4.prototype.toByteArray = function() { - return this.octets.slice(0); - }; - - IPv4.prototype.match = function(other, cidrRange) { - var ref; - if (cidrRange === void 0) { - ref = other, other = ref[0], cidrRange = ref[1]; - } - if (other.kind() !== 'ipv4') { - throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one"); - } - return matchCIDR(this.octets, other.octets, 8, cidrRange); - }; - - IPv4.prototype.SpecialRanges = { - unspecified: [[new IPv4([0, 0, 0, 0]), 8]], - broadcast: [[new IPv4([255, 255, 255, 255]), 32]], - multicast: [[new IPv4([224, 0, 0, 0]), 4]], - linkLocal: [[new IPv4([169, 254, 0, 0]), 16]], - loopback: [[new IPv4([127, 0, 0, 0]), 8]], - carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]], - "private": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]], - reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]] - }; - - IPv4.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv4.prototype.toIPv4MappedAddress = function() { - return ipaddr.IPv6.parse("::ffff:" + (this.toString())); - }; - - IPv4.prototype.prefixLengthFromSubnetMask = function() { - var cidr, i, k, octet, stop, zeros, zerotable; - zerotable = { - 0: 8, - 128: 7, - 192: 6, - 224: 5, - 240: 4, - 248: 3, - 252: 2, - 254: 1, - 255: 0 - }; - cidr = 0; - stop = false; - for (i = k = 3; k >= 0; i = k += -1) { - octet = this.octets[i]; - if (octet in zerotable) { - zeros = zerotable[octet]; - if (stop && zeros !== 0) { - return null; - } - if (zeros !== 8) { - stop = true; - } - cidr += zeros; - } else { - return null; - } - } - return 32 - cidr; - }; - - return IPv4; - - })(); - - ipv4Part = "(0?\\d+|0x[a-f0-9]+)"; - - ipv4Regexes = { - fourOctet: new RegExp("^" + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "$", 'i'), - longValue: new RegExp("^" + ipv4Part + "$", 'i') - }; - - ipaddr.IPv4.parser = function(string) { - var match, parseIntAuto, part, shift, value; - parseIntAuto = function(string) { - if (string[0] === "0" && string[1] !== "x") { - return parseInt(string, 8); - } else { - return parseInt(string); - } - }; - if (match = string.match(ipv4Regexes.fourOctet)) { - return (function() { - var k, len, ref, results; - ref = match.slice(1, 6); - results = []; - for (k = 0, len = ref.length; k < len; k++) { - part = ref[k]; - results.push(parseIntAuto(part)); - } - return results; - })(); - } else if (match = string.match(ipv4Regexes.longValue)) { - value = parseIntAuto(match[1]); - if (value > 0xffffffff || value < 0) { - throw new Error("ipaddr: address outside defined range"); - } - return ((function() { - var k, results; - results = []; - for (shift = k = 0; k <= 24; shift = k += 8) { - results.push((value >> shift) & 0xff); - } - return results; - })()).reverse(); - } else { - return null; - } - }; - - ipaddr.IPv6 = (function() { - function IPv6(parts, zoneId) { - var i, k, l, len, part, ref; - if (parts.length === 16) { - this.parts = []; - for (i = k = 0; k <= 14; i = k += 2) { - this.parts.push((parts[i] << 8) | parts[i + 1]); - } - } else if (parts.length === 8) { - this.parts = parts; - } else { - throw new Error("ipaddr: ipv6 part count should be 8 or 16"); - } - ref = this.parts; - for (l = 0, len = ref.length; l < len; l++) { - part = ref[l]; - if (!((0 <= part && part <= 0xffff))) { - throw new Error("ipaddr: ipv6 part should fit in 16 bits"); - } - } - if (zoneId) { - this.zoneId = zoneId; - } - } - - IPv6.prototype.kind = function() { - return 'ipv6'; - }; - - IPv6.prototype.toString = function() { - return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::'); - }; - - IPv6.prototype.toByteArray = function() { - var bytes, k, len, part, ref; - bytes = []; - ref = this.parts; - for (k = 0, len = ref.length; k < len; k++) { - part = ref[k]; - bytes.push(part >> 8); - bytes.push(part & 0xff); - } - return bytes; - }; - - IPv6.prototype.toNormalizedString = function() { - var addr, part, suffix; - addr = ((function() { - var k, len, ref, results; - ref = this.parts; - results = []; - for (k = 0, len = ref.length; k < len; k++) { - part = ref[k]; - results.push(part.toString(16)); - } - return results; - }).call(this)).join(":"); - suffix = ''; - if (this.zoneId) { - suffix = '%' + this.zoneId; - } - return addr + suffix; - }; - - IPv6.prototype.match = function(other, cidrRange) { - var ref; - if (cidrRange === void 0) { - ref = other, other = ref[0], cidrRange = ref[1]; - } - if (other.kind() !== 'ipv6') { - throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one"); - } - return matchCIDR(this.parts, other.parts, 16, cidrRange); - }; - - IPv6.prototype.SpecialRanges = { - unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128], - linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10], - multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8], - loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128], - uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7], - ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96], - rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96], - rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96], - '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16], - teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32], - reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]] - }; - - IPv6.prototype.range = function() { - return ipaddr.subnetMatch(this, this.SpecialRanges); - }; - - IPv6.prototype.isIPv4MappedAddress = function() { - return this.range() === 'ipv4Mapped'; - }; - - IPv6.prototype.toIPv4Address = function() { - var high, low, ref; - if (!this.isIPv4MappedAddress()) { - throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4"); - } - ref = this.parts.slice(-2), high = ref[0], low = ref[1]; - return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]); - }; - - IPv6.prototype.prefixLengthFromSubnetMask = function() { - var cidr, i, k, part, stop, zeros, zerotable; - zerotable = { - 0: 16, - 32768: 15, - 49152: 14, - 57344: 13, - 61440: 12, - 63488: 11, - 64512: 10, - 65024: 9, - 65280: 8, - 65408: 7, - 65472: 6, - 65504: 5, - 65520: 4, - 65528: 3, - 65532: 2, - 65534: 1, - 65535: 0 - }; - cidr = 0; - stop = false; - for (i = k = 7; k >= 0; i = k += -1) { - part = this.parts[i]; - if (part in zerotable) { - zeros = zerotable[part]; - if (stop && zeros !== 0) { - return null; - } - if (zeros !== 16) { - stop = true; - } - cidr += zeros; - } else { - return null; - } - } - return 128 - cidr; - }; - - return IPv6; - - })(); - - ipv6Part = "(?:[0-9a-f]+::?)+"; - - zoneIndex = "%[0-9a-z]{1,}"; - - ipv6Regexes = { - zoneIndex: new RegExp(zoneIndex, 'i'), - "native": new RegExp("^(::)?(" + ipv6Part + ")?([0-9a-f]+)?(::)?(" + zoneIndex + ")?$", 'i'), - transitional: new RegExp(("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)") + (ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part + "\\." + ipv4Part) + ("(" + zoneIndex + ")?$"), 'i') - }; - - expandIPv6 = function(string, parts) { - var colonCount, lastColon, part, replacement, replacementCount, zoneId; - if (string.indexOf('::') !== string.lastIndexOf('::')) { - return null; - } - zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0]; - if (zoneId) { - zoneId = zoneId.substring(1); - string = string.replace(/%.+$/, ''); - } - colonCount = 0; - lastColon = -1; - while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) { - colonCount++; - } - if (string.substr(0, 2) === '::') { - colonCount--; - } - if (string.substr(-2, 2) === '::') { - colonCount--; - } - if (colonCount > parts) { - return null; - } - replacementCount = parts - colonCount; - replacement = ':'; - while (replacementCount--) { - replacement += '0:'; - } - string = string.replace('::', replacement); - if (string[0] === ':') { - string = string.slice(1); - } - if (string[string.length - 1] === ':') { - string = string.slice(0, -1); - } - parts = (function() { - var k, len, ref, results; - ref = string.split(":"); - results = []; - for (k = 0, len = ref.length; k < len; k++) { - part = ref[k]; - results.push(parseInt(part, 16)); - } - return results; - })(); - return { - parts: parts, - zoneId: zoneId - }; - }; - - ipaddr.IPv6.parser = function(string) { - var addr, k, len, match, octet, octets, zoneId; - if (ipv6Regexes['native'].test(string)) { - return expandIPv6(string, 8); - } else if (match = string.match(ipv6Regexes['transitional'])) { - zoneId = match[6] || ''; - addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6); - if (addr.parts) { - octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])]; - for (k = 0, len = octets.length; k < len; k++) { - octet = octets[k]; - if (!((0 <= octet && octet <= 255))) { - return null; - } - } - addr.parts.push(octets[0] << 8 | octets[1]); - addr.parts.push(octets[2] << 8 | octets[3]); - return { - parts: addr.parts, - zoneId: addr.zoneId - }; - } - } - return null; - }; - - ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) { - return this.parser(string) !== null; - }; - - ipaddr.IPv4.isValid = function(string) { - var e; - try { - new this(this.parser(string)); - return true; - } catch (error1) { - e = error1; - return false; - } - }; - - ipaddr.IPv4.isValidFourPartDecimal = function(string) { - if (ipaddr.IPv4.isValid(string) && string.match(/^\d+(\.\d+){3}$/)) { - return true; - } else { - return false; - } - }; - - ipaddr.IPv6.isValid = function(string) { - var addr, e; - if (typeof string === "string" && string.indexOf(":") === -1) { - return false; - } - try { - addr = this.parser(string); - new this(addr.parts, addr.zoneId); - return true; - } catch (error1) { - e = error1; - return false; - } - }; - - ipaddr.IPv4.parse = function(string) { - var parts; - parts = this.parser(string); - if (parts === null) { - throw new Error("ipaddr: string is not formatted like ip address"); - } - return new this(parts); - }; - - ipaddr.IPv6.parse = function(string) { - var addr; - addr = this.parser(string); - if (addr.parts === null) { - throw new Error("ipaddr: string is not formatted like ip address"); - } - return new this(addr.parts, addr.zoneId); - }; - - ipaddr.IPv4.parseCIDR = function(string) { - var maskLength, match; - if (match = string.match(/^(.+)\/(\d+)$/)) { - maskLength = parseInt(match[2]); - if (maskLength >= 0 && maskLength <= 32) { - return [this.parse(match[1]), maskLength]; - } - } - throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range"); - }; - - ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) { - var filledOctetCount, j, octets; - prefix = parseInt(prefix); - if (prefix < 0 || prefix > 32) { - throw new Error('ipaddr: invalid IPv4 prefix length'); - } - octets = [0, 0, 0, 0]; - j = 0; - filledOctetCount = Math.floor(prefix / 8); - while (j < filledOctetCount) { - octets[j] = 255; - j++; - } - if (filledOctetCount < 4) { - octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8); - } - return new this(octets); - }; - - ipaddr.IPv4.broadcastAddressFromCIDR = function(string) { - var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets; - try { - cidr = this.parseCIDR(string); - ipInterfaceOctets = cidr[0].toByteArray(); - subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray(); - octets = []; - i = 0; - while (i < 4) { - octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255); - i++; - } - return new this(octets); - } catch (error1) { - error = error1; - throw new Error('ipaddr: the address does not have IPv4 CIDR format'); - } - }; - - ipaddr.IPv4.networkAddressFromCIDR = function(string) { - var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets; - try { - cidr = this.parseCIDR(string); - ipInterfaceOctets = cidr[0].toByteArray(); - subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray(); - octets = []; - i = 0; - while (i < 4) { - octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10)); - i++; - } - return new this(octets); - } catch (error1) { - error = error1; - throw new Error('ipaddr: the address does not have IPv4 CIDR format'); - } - }; - - ipaddr.IPv6.parseCIDR = function(string) { - var maskLength, match; - if (match = string.match(/^(.+)\/(\d+)$/)) { - maskLength = parseInt(match[2]); - if (maskLength >= 0 && maskLength <= 128) { - return [this.parse(match[1]), maskLength]; - } - } - throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range"); - }; - - ipaddr.isValid = function(string) { - return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string); - }; - - ipaddr.parse = function(string) { - if (ipaddr.IPv6.isValid(string)) { - return ipaddr.IPv6.parse(string); - } else if (ipaddr.IPv4.isValid(string)) { - return ipaddr.IPv4.parse(string); - } else { - throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format"); - } - }; - - ipaddr.parseCIDR = function(string) { - var e; - try { - return ipaddr.IPv6.parseCIDR(string); - } catch (error1) { - e = error1; - try { - return ipaddr.IPv4.parseCIDR(string); - } catch (error1) { - e = error1; - throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format"); - } - } - }; - - ipaddr.fromByteArray = function(bytes) { - var length; - length = bytes.length; - if (length === 4) { - return new ipaddr.IPv4(bytes); - } else if (length === 16) { - return new ipaddr.IPv6(bytes); - } else { - throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address"); - } - }; - - ipaddr.process = function(string) { - var addr; - addr = this.parse(string); - if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) { - return addr.toIPv4Address(); - } else { - return addr; - } - }; - -}).call(this); - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(172)(module))) - -/***/ }), -/* 172 */ -/***/ (function(module, exports) { - -module.exports = function(module) { - if(!module.webpackPolyfill) { - module.deprecate = function() {}; - module.paths = []; - // module.parent = undefined by default - if(!module.children) module.children = []; - Object.defineProperty(module, "loaded", { - enumerable: true, - get: function() { - return module.l; - } - }); - Object.defineProperty(module, "id", { - enumerable: true, - get: function() { - return module.i; - } - }); - module.webpackPolyfill = 1; - } - return module; -}; - - -/***/ }), -/* 173 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2013 Roman Shtylman - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var accepts = __webpack_require__(174); -var deprecate = __webpack_require__(7)('express'); -var isIP = __webpack_require__(77).isIP; -var typeis = __webpack_require__(22); -var http = __webpack_require__(17); -var fresh = __webpack_require__(96); -var parseRange = __webpack_require__(97); -var parse = __webpack_require__(23); -var proxyaddr = __webpack_require__(98); - -/** - * Request prototype. - * @public - */ - -var req = Object.create(http.IncomingMessage.prototype) - -/** - * Module exports. - * @public - */ - -module.exports = req - -/** - * Return request header. - * - * The `Referrer` header field is special-cased, - * both `Referrer` and `Referer` are interchangeable. - * - * Examples: - * - * req.get('Content-Type'); - * // => "text/plain" - * - * req.get('content-type'); - * // => "text/plain" - * - * req.get('Something'); - * // => undefined - * - * Aliased as `req.header()`. - * - * @param {String} name - * @return {String} - * @public - */ - -req.get = -req.header = function header(name) { - if (!name) { - throw new TypeError('name argument is required to req.get'); - } - - if (typeof name !== 'string') { - throw new TypeError('name must be a string to req.get'); - } - - var lc = name.toLowerCase(); - - switch (lc) { - case 'referer': - case 'referrer': - return this.headers.referrer - || this.headers.referer; - default: - return this.headers[lc]; - } -}; - -/** - * To do: update docs. - * - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single MIME type string - * such as "application/json", an extension name - * such as "json", a comma-delimited list such as "json, html, text/plain", - * an argument list such as `"json", "html", "text/plain"`, - * or an array `["json", "html", "text/plain"]`. When a list - * or array is given, the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * req.accepts('html'); - * // => "html" - * - * // Accept: text/*, application/json - * req.accepts('html'); - * // => "html" - * req.accepts('text/html'); - * // => "text/html" - * req.accepts('json, text'); - * // => "json" - * req.accepts('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * req.accepts('image/png'); - * req.accepts('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * req.accepts(['html', 'json']); - * req.accepts('html', 'json'); - * req.accepts('html, json'); - * // => "json" - * - * @param {String|Array} type(s) - * @return {String|Array|Boolean} - * @public - */ - -req.accepts = function(){ - var accept = accepts(this); - return accept.types.apply(accept, arguments); -}; - -/** - * Check if the given `encoding`s are accepted. - * - * @param {String} ...encoding - * @return {String|Array} - * @public - */ - -req.acceptsEncodings = function(){ - var accept = accepts(this); - return accept.encodings.apply(accept, arguments); -}; - -req.acceptsEncoding = deprecate.function(req.acceptsEncodings, - 'req.acceptsEncoding: Use acceptsEncodings instead'); - -/** - * Check if the given `charset`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...charset - * @return {String|Array} - * @public - */ - -req.acceptsCharsets = function(){ - var accept = accepts(this); - return accept.charsets.apply(accept, arguments); -}; - -req.acceptsCharset = deprecate.function(req.acceptsCharsets, - 'req.acceptsCharset: Use acceptsCharsets instead'); - -/** - * Check if the given `lang`s are acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} ...lang - * @return {String|Array} - * @public - */ - -req.acceptsLanguages = function(){ - var accept = accepts(this); - return accept.languages.apply(accept, arguments); -}; - -req.acceptsLanguage = deprecate.function(req.acceptsLanguages, - 'req.acceptsLanguage: Use acceptsLanguages instead'); - -/** - * Parse Range header field, capping to the given `size`. - * - * Unspecified ranges such as "0-" require knowledge of your resource length. In - * the case of a byte range this is of course the total number of bytes. If the - * Range header field is not given `undefined` is returned, `-1` when unsatisfiable, - * and `-2` when syntactically invalid. - * - * When ranges are returned, the array has a "type" property which is the type of - * range that is required (most commonly, "bytes"). Each array element is an object - * with a "start" and "end" property for the portion of the range. - * - * The "combine" option can be set to `true` and overlapping & adjacent ranges - * will be combined into a single range. - * - * NOTE: remember that ranges are inclusive, so for example "Range: users=0-3" - * should respond with 4 users when available, not 3. - * - * @param {number} size - * @param {object} [options] - * @param {boolean} [options.combine=false] - * @return {number|array} - * @public - */ - -req.range = function range(size, options) { - var range = this.get('Range'); - if (!range) return; - return parseRange(size, range, options); -}; - -/** - * Return the value of param `name` when present or `defaultValue`. - * - * - Checks route placeholders, ex: _/user/:id_ - * - Checks body params, ex: id=12, {"id":12} - * - Checks query string params, ex: ?id=12 - * - * To utilize request bodies, `req.body` - * should be an object. This can be done by using - * the `bodyParser()` middleware. - * - * @param {String} name - * @param {Mixed} [defaultValue] - * @return {String} - * @public - */ - -req.param = function param(name, defaultValue) { - var params = this.params || {}; - var body = this.body || {}; - var query = this.query || {}; - - var args = arguments.length === 1 - ? 'name' - : 'name, default'; - deprecate('req.param(' + args + '): Use req.params, req.body, or req.query instead'); - - if (null != params[name] && params.hasOwnProperty(name)) return params[name]; - if (null != body[name]) return body[name]; - if (null != query[name]) return query[name]; - - return defaultValue; -}; - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains the give mime `type`. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * req.is('html'); - * req.is('text/html'); - * req.is('text/*'); - * // => true - * - * // When Content-Type is application/json - * req.is('json'); - * req.is('application/json'); - * req.is('application/*'); - * // => true - * - * req.is('html'); - * // => false - * - * @param {String|Array} types... - * @return {String|false|null} - * @public - */ - -req.is = function is(types) { - var arr = types; - - // support flattened arguments - if (!Array.isArray(types)) { - arr = new Array(arguments.length); - for (var i = 0; i < arr.length; i++) { - arr[i] = arguments[i]; - } - } - - return typeis(this, arr); -}; - -/** - * Return the protocol string "http" or "https" - * when requested with TLS. When the "trust proxy" - * setting trusts the socket address, the - * "X-Forwarded-Proto" header field will be trusted - * and used if present. - * - * If you're running behind a reverse proxy that - * supplies https for you this may be enabled. - * - * @return {String} - * @public - */ - -defineGetter(req, 'protocol', function protocol(){ - var proto = this.connection.encrypted - ? 'https' - : 'http'; - var trust = this.app.get('trust proxy fn'); - - if (!trust(this.connection.remoteAddress, 0)) { - return proto; - } - - // Note: X-Forwarded-Proto is normally only ever a - // single value, but this is to be safe. - var header = this.get('X-Forwarded-Proto') || proto - var index = header.indexOf(',') - - return index !== -1 - ? header.substring(0, index).trim() - : header.trim() -}); - -/** - * Short-hand for: - * - * req.protocol === 'https' - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'secure', function secure(){ - return this.protocol === 'https'; -}); - -/** - * Return the remote address from the trusted proxy. - * - * The is the remote address on the socket unless - * "trust proxy" is set. - * - * @return {String} - * @public - */ - -defineGetter(req, 'ip', function ip(){ - var trust = this.app.get('trust proxy fn'); - return proxyaddr(this, trust); -}); - -/** - * When "trust proxy" is set, trusted proxy addresses + client. - * - * For example if the value were "client, proxy1, proxy2" - * you would receive the array `["client", "proxy1", "proxy2"]` - * where "proxy2" is the furthest down-stream and "proxy1" and - * "proxy2" were trusted. - * - * @return {Array} - * @public - */ - -defineGetter(req, 'ips', function ips() { - var trust = this.app.get('trust proxy fn'); - var addrs = proxyaddr.all(this, trust); - - // reverse the order (to farthest -> closest) - // and remove socket address - addrs.reverse().pop() - - return addrs -}); - -/** - * Return subdomains as an array. - * - * Subdomains are the dot-separated parts of the host before the main domain of - * the app. By default, the domain of the app is assumed to be the last two - * parts of the host. This can be changed by setting "subdomain offset". - * - * For example, if the domain is "tobi.ferrets.example.com": - * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. - * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. - * - * @return {Array} - * @public - */ - -defineGetter(req, 'subdomains', function subdomains() { - var hostname = this.hostname; - - if (!hostname) return []; - - var offset = this.app.get('subdomain offset'); - var subdomains = !isIP(hostname) - ? hostname.split('.').reverse() - : [hostname]; - - return subdomains.slice(offset); -}); - -/** - * Short-hand for `url.parse(req.url).pathname`. - * - * @return {String} - * @public - */ - -defineGetter(req, 'path', function path() { - return parse(this).pathname; -}); - -/** - * Parse the "Host" header field to a hostname. - * - * When the "trust proxy" setting trusts the socket - * address, the "X-Forwarded-Host" header field will - * be trusted. - * - * @return {String} - * @public - */ - -defineGetter(req, 'hostname', function hostname(){ - var trust = this.app.get('trust proxy fn'); - var host = this.get('X-Forwarded-Host'); - - if (!host || !trust(this.connection.remoteAddress, 0)) { - host = this.get('Host'); - } - - if (!host) return; - - // IPv6 literal support - var offset = host[0] === '[' - ? host.indexOf(']') + 1 - : 0; - var index = host.indexOf(':', offset); - - return index !== -1 - ? host.substring(0, index) - : host; -}); - -// TODO: change req.host to return host in next major - -defineGetter(req, 'host', deprecate.function(function host(){ - return this.hostname; -}, 'req.host: Use req.hostname instead')); - -/** - * Check if the request is fresh, aka - * Last-Modified and/or the ETag - * still match. - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'fresh', function(){ - var method = this.method; - var res = this.res - var status = res.statusCode - - // GET or HEAD for weak freshness validation only - if ('GET' !== method && 'HEAD' !== method) return false; - - // 2xx or 304 as per rfc2616 14.26 - if ((status >= 200 && status < 300) || 304 === status) { - return fresh(this.headers, { - 'etag': res.get('ETag'), - 'last-modified': res.get('Last-Modified') - }) - } - - return false; -}); - -/** - * Check if the request is stale, aka - * "Last-Modified" and / or the "ETag" for the - * resource has changed. - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'stale', function stale(){ - return !this.fresh; -}); - -/** - * Check if the request was an _XMLHttpRequest_. - * - * @return {Boolean} - * @public - */ - -defineGetter(req, 'xhr', function xhr(){ - var val = this.get('X-Requested-With') || ''; - return val.toLowerCase() === 'xmlhttprequest'; -}); - -/** - * Helper function for creating a getter on an object. - * - * @param {Object} obj - * @param {String} name - * @param {Function} getter - * @private - */ -function defineGetter(obj, name, getter) { - Object.defineProperty(obj, name, { - configurable: true, - enumerable: true, - get: getter - }); -} - - -/***/ }), -/* 174 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * accepts - * Copyright(c) 2014 Jonathan Ong - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var Negotiator = __webpack_require__(175) -var mime = __webpack_require__(85) - -/** - * Module exports. - * @public - */ - -module.exports = Accepts - -/** - * Create a new Accepts object for the given req. - * - * @param {object} req - * @public - */ - -function Accepts (req) { - if (!(this instanceof Accepts)) { - return new Accepts(req) - } - - this.headers = req.headers - this.negotiator = new Negotiator(req) -} - -/** - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single mime type string - * such as "application/json", the extension name - * such as "json" or an array `["json", "html", "text/plain"]`. When a list - * or array is given the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * this.types('html'); - * // => "html" - * - * // Accept: text/*, application/json - * this.types('html'); - * // => "html" - * this.types('text/html'); - * // => "text/html" - * this.types('json', 'text'); - * // => "json" - * this.types('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * this.types('image/png'); - * this.types('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * this.types(['html', 'json']); - * this.types('html', 'json'); - * // => "json" - * - * @param {String|Array} types... - * @return {String|Array|Boolean} - * @public - */ - -Accepts.prototype.type = -Accepts.prototype.types = function (types_) { - var types = types_ - - // support flattened arguments - if (types && !Array.isArray(types)) { - types = new Array(arguments.length) - for (var i = 0; i < types.length; i++) { - types[i] = arguments[i] - } - } - - // no types, return all requested types - if (!types || types.length === 0) { - return this.negotiator.mediaTypes() - } - - // no accept header, return first given type - if (!this.headers.accept) { - return types[0] - } - - var mimes = types.map(extToMime) - var accepts = this.negotiator.mediaTypes(mimes.filter(validMime)) - var first = accepts[0] - - return first - ? types[mimes.indexOf(first)] - : false -} - -/** - * Return accepted encodings or best fit based on `encodings`. - * - * Given `Accept-Encoding: gzip, deflate` - * an array sorted by quality is returned: - * - * ['gzip', 'deflate'] - * - * @param {String|Array} encodings... - * @return {String|Array} - * @public - */ - -Accepts.prototype.encoding = -Accepts.prototype.encodings = function (encodings_) { - var encodings = encodings_ - - // support flattened arguments - if (encodings && !Array.isArray(encodings)) { - encodings = new Array(arguments.length) - for (var i = 0; i < encodings.length; i++) { - encodings[i] = arguments[i] - } - } - - // no encodings, return all requested encodings - if (!encodings || encodings.length === 0) { - return this.negotiator.encodings() - } - - return this.negotiator.encodings(encodings)[0] || false -} - -/** - * Return accepted charsets or best fit based on `charsets`. - * - * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5` - * an array sorted by quality is returned: - * - * ['utf-8', 'utf-7', 'iso-8859-1'] - * - * @param {String|Array} charsets... - * @return {String|Array} - * @public - */ - -Accepts.prototype.charset = -Accepts.prototype.charsets = function (charsets_) { - var charsets = charsets_ - - // support flattened arguments - if (charsets && !Array.isArray(charsets)) { - charsets = new Array(arguments.length) - for (var i = 0; i < charsets.length; i++) { - charsets[i] = arguments[i] - } - } - - // no charsets, return all requested charsets - if (!charsets || charsets.length === 0) { - return this.negotiator.charsets() - } - - return this.negotiator.charsets(charsets)[0] || false -} - -/** - * Return accepted languages or best fit based on `langs`. - * - * Given `Accept-Language: en;q=0.8, es, pt` - * an array sorted by quality is returned: - * - * ['es', 'pt', 'en'] - * - * @param {String|Array} langs... - * @return {Array|String} - * @public - */ - -Accepts.prototype.lang = -Accepts.prototype.langs = -Accepts.prototype.language = -Accepts.prototype.languages = function (languages_) { - var languages = languages_ - - // support flattened arguments - if (languages && !Array.isArray(languages)) { - languages = new Array(arguments.length) - for (var i = 0; i < languages.length; i++) { - languages[i] = arguments[i] - } - } - - // no languages, return all requested languages - if (!languages || languages.length === 0) { - return this.negotiator.languages() - } - - return this.negotiator.languages(languages)[0] || false -} - -/** - * Convert extnames to mime. - * - * @param {String} type - * @return {String} - * @private - */ - -function extToMime (type) { - return type.indexOf('/') === -1 - ? mime.lookup(type) - : type -} - -/** - * Check if mime is valid. - * - * @param {String} type - * @return {String} - * @private - */ - -function validMime (type) { - return typeof type === 'string' -} - - -/***/ }), -/* 175 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * negotiator - * Copyright(c) 2012 Federico Romero - * Copyright(c) 2012-2014 Isaac Z. Schlueter - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Cached loaded submodules. - * @private - */ - -var modules = Object.create(null); - -/** - * Module exports. - * @public - */ - -module.exports = Negotiator; -module.exports.Negotiator = Negotiator; - -/** - * Create a Negotiator instance from a request. - * @param {object} request - * @public - */ - -function Negotiator(request) { - if (!(this instanceof Negotiator)) { - return new Negotiator(request); - } - - this.request = request; -} - -Negotiator.prototype.charset = function charset(available) { - var set = this.charsets(available); - return set && set[0]; -}; - -Negotiator.prototype.charsets = function charsets(available) { - var preferredCharsets = loadModule('charset').preferredCharsets; - return preferredCharsets(this.request.headers['accept-charset'], available); -}; - -Negotiator.prototype.encoding = function encoding(available) { - var set = this.encodings(available); - return set && set[0]; -}; - -Negotiator.prototype.encodings = function encodings(available) { - var preferredEncodings = loadModule('encoding').preferredEncodings; - return preferredEncodings(this.request.headers['accept-encoding'], available); -}; - -Negotiator.prototype.language = function language(available) { - var set = this.languages(available); - return set && set[0]; -}; - -Negotiator.prototype.languages = function languages(available) { - var preferredLanguages = loadModule('language').preferredLanguages; - return preferredLanguages(this.request.headers['accept-language'], available); -}; - -Negotiator.prototype.mediaType = function mediaType(available) { - var set = this.mediaTypes(available); - return set && set[0]; -}; - -Negotiator.prototype.mediaTypes = function mediaTypes(available) { - var preferredMediaTypes = loadModule('mediaType').preferredMediaTypes; - return preferredMediaTypes(this.request.headers.accept, available); -}; - -// Backwards compatibility -Negotiator.prototype.preferredCharset = Negotiator.prototype.charset; -Negotiator.prototype.preferredCharsets = Negotiator.prototype.charsets; -Negotiator.prototype.preferredEncoding = Negotiator.prototype.encoding; -Negotiator.prototype.preferredEncodings = Negotiator.prototype.encodings; -Negotiator.prototype.preferredLanguage = Negotiator.prototype.language; -Negotiator.prototype.preferredLanguages = Negotiator.prototype.languages; -Negotiator.prototype.preferredMediaType = Negotiator.prototype.mediaType; -Negotiator.prototype.preferredMediaTypes = Negotiator.prototype.mediaTypes; - -/** - * Load the given module. - * @private - */ - -function loadModule(moduleName) { - var module = modules[moduleName]; - - if (module !== undefined) { - return module; - } - - // This uses a switch for static require analysis - switch (moduleName) { - case 'charset': - module = __webpack_require__(176); - break; - case 'encoding': - module = __webpack_require__(177); - break; - case 'language': - module = __webpack_require__(178); - break; - case 'mediaType': - module = __webpack_require__(179); - break; - default: - throw new Error('Cannot find module \'' + moduleName + '\''); - } - - // Store to prevent invoking require() - modules[moduleName] = module; - - return module; -} - - -/***/ }), -/* 176 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * negotiator - * Copyright(c) 2012 Isaac Z. Schlueter - * Copyright(c) 2014 Federico Romero - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = preferredCharsets; -module.exports.preferredCharsets = preferredCharsets; - -/** - * Module variables. - * @private - */ - -var simpleCharsetRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/; - -/** - * Parse the Accept-Charset header. - * @private - */ - -function parseAcceptCharset(accept) { - var accepts = accept.split(','); - - for (var i = 0, j = 0; i < accepts.length; i++) { - var charset = parseCharset(accepts[i].trim(), i); - - if (charset) { - accepts[j++] = charset; - } - } - - // trim accepts - accepts.length = j; - - return accepts; -} - -/** - * Parse a charset from the Accept-Charset header. - * @private - */ - -function parseCharset(str, i) { - var match = simpleCharsetRegExp.exec(str); - if (!match) return null; - - var charset = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - charset: charset, - q: q, - i: i - }; -} - -/** - * Get the priority of a charset. - * @private - */ - -function getCharsetPriority(charset, accepted, index) { - var priority = {o: -1, q: 0, s: 0}; - - for (var i = 0; i < accepted.length; i++) { - var spec = specify(charset, accepted[i], index); - - if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { - priority = spec; - } - } - - return priority; -} - -/** - * Get the specificity of the charset. - * @private - */ - -function specify(charset, spec, index) { - var s = 0; - if(spec.charset.toLowerCase() === charset.toLowerCase()){ - s |= 1; - } else if (spec.charset !== '*' ) { - return null - } - - return { - i: index, - o: spec.i, - q: spec.q, - s: s - } -} - -/** - * Get the preferred charsets from an Accept-Charset header. - * @public - */ - -function preferredCharsets(accept, provided) { - // RFC 2616 sec 14.2: no header = * - var accepts = parseAcceptCharset(accept === undefined ? '*' : accept || ''); - - if (!provided) { - // sorted list of all charsets - return accepts - .filter(isQuality) - .sort(compareSpecs) - .map(getFullCharset); - } - - var priorities = provided.map(function getPriority(type, index) { - return getCharsetPriority(type, accepts, index); - }); - - // sorted list of accepted charsets - return priorities.filter(isQuality).sort(compareSpecs).map(function getCharset(priority) { - return provided[priorities.indexOf(priority)]; - }); -} - -/** - * Compare two specs. - * @private - */ - -function compareSpecs(a, b) { - return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; -} - -/** - * Get full charset string. - * @private - */ - -function getFullCharset(spec) { - return spec.charset; -} - -/** - * Check if a spec has any quality. - * @private - */ - -function isQuality(spec) { - return spec.q > 0; -} - - -/***/ }), -/* 177 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * negotiator - * Copyright(c) 2012 Isaac Z. Schlueter - * Copyright(c) 2014 Federico Romero - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = preferredEncodings; -module.exports.preferredEncodings = preferredEncodings; - -/** - * Module variables. - * @private - */ - -var simpleEncodingRegExp = /^\s*([^\s;]+)\s*(?:;(.*))?$/; - -/** - * Parse the Accept-Encoding header. - * @private - */ - -function parseAcceptEncoding(accept) { - var accepts = accept.split(','); - var hasIdentity = false; - var minQuality = 1; - - for (var i = 0, j = 0; i < accepts.length; i++) { - var encoding = parseEncoding(accepts[i].trim(), i); - - if (encoding) { - accepts[j++] = encoding; - hasIdentity = hasIdentity || specify('identity', encoding); - minQuality = Math.min(minQuality, encoding.q || 1); - } - } - - if (!hasIdentity) { - /* - * If identity doesn't explicitly appear in the accept-encoding header, - * it's added to the list of acceptable encoding with the lowest q - */ - accepts[j++] = { - encoding: 'identity', - q: minQuality, - i: i - }; - } - - // trim accepts - accepts.length = j; - - return accepts; -} - -/** - * Parse an encoding from the Accept-Encoding header. - * @private - */ - -function parseEncoding(str, i) { - var match = simpleEncodingRegExp.exec(str); - if (!match) return null; - - var encoding = match[1]; - var q = 1; - if (match[2]) { - var params = match[2].split(';'); - for (var i = 0; i < params.length; i ++) { - var p = params[i].trim().split('='); - if (p[0] === 'q') { - q = parseFloat(p[1]); - break; - } - } - } - - return { - encoding: encoding, - q: q, - i: i - }; -} - -/** - * Get the priority of an encoding. - * @private - */ - -function getEncodingPriority(encoding, accepted, index) { - var priority = {o: -1, q: 0, s: 0}; - - for (var i = 0; i < accepted.length; i++) { - var spec = specify(encoding, accepted[i], index); - - if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { - priority = spec; - } - } - - return priority; -} - -/** - * Get the specificity of the encoding. - * @private - */ - -function specify(encoding, spec, index) { - var s = 0; - if(spec.encoding.toLowerCase() === encoding.toLowerCase()){ - s |= 1; - } else if (spec.encoding !== '*' ) { - return null - } - - return { - i: index, - o: spec.i, - q: spec.q, - s: s - } -}; - -/** - * Get the preferred encodings from an Accept-Encoding header. - * @public - */ - -function preferredEncodings(accept, provided) { - var accepts = parseAcceptEncoding(accept || ''); - - if (!provided) { - // sorted list of all encodings - return accepts - .filter(isQuality) - .sort(compareSpecs) - .map(getFullEncoding); - } - - var priorities = provided.map(function getPriority(type, index) { - return getEncodingPriority(type, accepts, index); - }); - - // sorted list of accepted encodings - return priorities.filter(isQuality).sort(compareSpecs).map(function getEncoding(priority) { - return provided[priorities.indexOf(priority)]; - }); -} - -/** - * Compare two specs. - * @private - */ - -function compareSpecs(a, b) { - return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; -} - -/** - * Get full encoding string. - * @private - */ - -function getFullEncoding(spec) { - return spec.encoding; -} - -/** - * Check if a spec has any quality. - * @private - */ - -function isQuality(spec) { - return spec.q > 0; -} - - -/***/ }), -/* 178 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * negotiator - * Copyright(c) 2012 Isaac Z. Schlueter - * Copyright(c) 2014 Federico Romero - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = preferredLanguages; -module.exports.preferredLanguages = preferredLanguages; - -/** - * Module variables. - * @private - */ - -var simpleLanguageRegExp = /^\s*([^\s\-;]+)(?:-([^\s;]+))?\s*(?:;(.*))?$/; - -/** - * Parse the Accept-Language header. - * @private - */ - -function parseAcceptLanguage(accept) { - var accepts = accept.split(','); - - for (var i = 0, j = 0; i < accepts.length; i++) { - var langauge = parseLanguage(accepts[i].trim(), i); - - if (langauge) { - accepts[j++] = langauge; - } - } - - // trim accepts - accepts.length = j; - - return accepts; -} - -/** - * Parse a language from the Accept-Language header. - * @private - */ - -function parseLanguage(str, i) { - var match = simpleLanguageRegExp.exec(str); - if (!match) return null; - - var prefix = match[1], - suffix = match[2], - full = prefix; - - if (suffix) full += "-" + suffix; - - var q = 1; - if (match[3]) { - var params = match[3].split(';') - for (var i = 0; i < params.length; i ++) { - var p = params[i].split('='); - if (p[0] === 'q') q = parseFloat(p[1]); - } - } - - return { - prefix: prefix, - suffix: suffix, - q: q, - i: i, - full: full - }; -} - -/** - * Get the priority of a language. - * @private - */ - -function getLanguagePriority(language, accepted, index) { - var priority = {o: -1, q: 0, s: 0}; - - for (var i = 0; i < accepted.length; i++) { - var spec = specify(language, accepted[i], index); - - if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { - priority = spec; - } - } - - return priority; -} - -/** - * Get the specificity of the language. - * @private - */ - -function specify(language, spec, index) { - var p = parseLanguage(language) - if (!p) return null; - var s = 0; - if(spec.full.toLowerCase() === p.full.toLowerCase()){ - s |= 4; - } else if (spec.prefix.toLowerCase() === p.full.toLowerCase()) { - s |= 2; - } else if (spec.full.toLowerCase() === p.prefix.toLowerCase()) { - s |= 1; - } else if (spec.full !== '*' ) { - return null - } - - return { - i: index, - o: spec.i, - q: spec.q, - s: s - } -}; - -/** - * Get the preferred languages from an Accept-Language header. - * @public - */ - -function preferredLanguages(accept, provided) { - // RFC 2616 sec 14.4: no header = * - var accepts = parseAcceptLanguage(accept === undefined ? '*' : accept || ''); - - if (!provided) { - // sorted list of all languages - return accepts - .filter(isQuality) - .sort(compareSpecs) - .map(getFullLanguage); - } - - var priorities = provided.map(function getPriority(type, index) { - return getLanguagePriority(type, accepts, index); - }); - - // sorted list of accepted languages - return priorities.filter(isQuality).sort(compareSpecs).map(function getLanguage(priority) { - return provided[priorities.indexOf(priority)]; - }); -} - -/** - * Compare two specs. - * @private - */ - -function compareSpecs(a, b) { - return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; -} - -/** - * Get full language string. - * @private - */ - -function getFullLanguage(spec) { - return spec.full; -} - -/** - * Check if a spec has any quality. - * @private - */ - -function isQuality(spec) { - return spec.q > 0; -} - - -/***/ }), -/* 179 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * negotiator - * Copyright(c) 2012 Isaac Z. Schlueter - * Copyright(c) 2014 Federico Romero - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -module.exports = preferredMediaTypes; -module.exports.preferredMediaTypes = preferredMediaTypes; - -/** - * Module variables. - * @private - */ - -var simpleMediaTypeRegExp = /^\s*([^\s\/;]+)\/([^;\s]+)\s*(?:;(.*))?$/; - -/** - * Parse the Accept header. - * @private - */ - -function parseAccept(accept) { - var accepts = splitMediaTypes(accept); - - for (var i = 0, j = 0; i < accepts.length; i++) { - var mediaType = parseMediaType(accepts[i].trim(), i); - - if (mediaType) { - accepts[j++] = mediaType; - } - } - - // trim accepts - accepts.length = j; - - return accepts; -} - -/** - * Parse a media type from the Accept header. - * @private - */ - -function parseMediaType(str, i) { - var match = simpleMediaTypeRegExp.exec(str); - if (!match) return null; - - var params = Object.create(null); - var q = 1; - var subtype = match[2]; - var type = match[1]; - - if (match[3]) { - var kvps = splitParameters(match[3]).map(splitKeyValuePair); - - for (var j = 0; j < kvps.length; j++) { - var pair = kvps[j]; - var key = pair[0].toLowerCase(); - var val = pair[1]; - - // get the value, unwrapping quotes - var value = val && val[0] === '"' && val[val.length - 1] === '"' - ? val.substr(1, val.length - 2) - : val; - - if (key === 'q') { - q = parseFloat(value); - break; - } - - // store parameter - params[key] = value; - } - } - - return { - type: type, - subtype: subtype, - params: params, - q: q, - i: i - }; -} - -/** - * Get the priority of a media type. - * @private - */ - -function getMediaTypePriority(type, accepted, index) { - var priority = {o: -1, q: 0, s: 0}; - - for (var i = 0; i < accepted.length; i++) { - var spec = specify(type, accepted[i], index); - - if (spec && (priority.s - spec.s || priority.q - spec.q || priority.o - spec.o) < 0) { - priority = spec; - } - } - - return priority; -} - -/** - * Get the specificity of the media type. - * @private - */ - -function specify(type, spec, index) { - var p = parseMediaType(type); - var s = 0; - - if (!p) { - return null; - } - - if(spec.type.toLowerCase() == p.type.toLowerCase()) { - s |= 4 - } else if(spec.type != '*') { - return null; - } - - if(spec.subtype.toLowerCase() == p.subtype.toLowerCase()) { - s |= 2 - } else if(spec.subtype != '*') { - return null; - } - - var keys = Object.keys(spec.params); - if (keys.length > 0) { - if (keys.every(function (k) { - return spec.params[k] == '*' || (spec.params[k] || '').toLowerCase() == (p.params[k] || '').toLowerCase(); - })) { - s |= 1 - } else { - return null - } - } - - return { - i: index, - o: spec.i, - q: spec.q, - s: s, - } -} - -/** - * Get the preferred media types from an Accept header. - * @public - */ - -function preferredMediaTypes(accept, provided) { - // RFC 2616 sec 14.2: no header = */* - var accepts = parseAccept(accept === undefined ? '*/*' : accept || ''); - - if (!provided) { - // sorted list of all types - return accepts - .filter(isQuality) - .sort(compareSpecs) - .map(getFullType); - } - - var priorities = provided.map(function getPriority(type, index) { - return getMediaTypePriority(type, accepts, index); - }); - - // sorted list of accepted types - return priorities.filter(isQuality).sort(compareSpecs).map(function getType(priority) { - return provided[priorities.indexOf(priority)]; - }); -} - -/** - * Compare two specs. - * @private - */ - -function compareSpecs(a, b) { - return (b.q - a.q) || (b.s - a.s) || (a.o - b.o) || (a.i - b.i) || 0; -} - -/** - * Get full type string. - * @private - */ - -function getFullType(spec) { - return spec.type + '/' + spec.subtype; -} - -/** - * Check if a spec has any quality. - * @private - */ - -function isQuality(spec) { - return spec.q > 0; -} - -/** - * Count the number of quotes in a string. - * @private - */ - -function quoteCount(string) { - var count = 0; - var index = 0; - - while ((index = string.indexOf('"', index)) !== -1) { - count++; - index++; - } - - return count; -} - -/** - * Split a key value pair. - * @private - */ - -function splitKeyValuePair(str) { - var index = str.indexOf('='); - var key; - var val; - - if (index === -1) { - key = str; - } else { - key = str.substr(0, index); - val = str.substr(index + 1); - } - - return [key, val]; -} - -/** - * Split an Accept header into media types. - * @private - */ - -function splitMediaTypes(accept) { - var accepts = accept.split(','); - - for (var i = 1, j = 0; i < accepts.length; i++) { - if (quoteCount(accepts[j]) % 2 == 0) { - accepts[++j] = accepts[i]; - } else { - accepts[j] += ',' + accepts[i]; - } - } - - // trim accepts - accepts.length = j + 1; - - return accepts; -} - -/** - * Split a string of parameters. - * @private - */ - -function splitParameters(str) { - var parameters = str.split(';'); - - for (var i = 1, j = 0; i < parameters.length; i++) { - if (quoteCount(parameters[j]) % 2 == 0) { - parameters[++j] = parameters[i]; - } else { - parameters[j] += ';' + parameters[i]; - } - } - - // trim parameters - parameters.length = j + 1; - - for (var i = 0; i < parameters.length; i++) { - parameters[i] = parameters[i].trim(); - } - - return parameters; -} - - -/***/ }), -/* 180 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * express - * Copyright(c) 2009-2013 TJ Holowaychuk - * Copyright(c) 2014-2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var Buffer = __webpack_require__(93).Buffer -var contentDisposition = __webpack_require__(94); -var deprecate = __webpack_require__(7)('express'); -var encodeUrl = __webpack_require__(38); -var escapeHtml = __webpack_require__(39); -var http = __webpack_require__(17); -var isAbsolute = __webpack_require__(12).isAbsolute; -var onFinished = __webpack_require__(37); -var path = __webpack_require__(0); -var statuses = __webpack_require__(21) -var merge = __webpack_require__(42); -var sign = __webpack_require__(181).sign; -var normalizeType = __webpack_require__(12).normalizeType; -var normalizeTypes = __webpack_require__(12).normalizeTypes; -var setCharset = __webpack_require__(12).setCharset; -var cookie = __webpack_require__(182); -var send = __webpack_require__(52); -var extname = path.extname; -var mime = send.mime; -var resolve = path.resolve; -var vary = __webpack_require__(183); - -/** - * Response prototype. - * @public - */ - -var res = Object.create(http.ServerResponse.prototype) - -/** - * Module exports. - * @public - */ - -module.exports = res - -/** - * Module variables. - * @private - */ - -var charsetRegExp = /;\s*charset\s*=/; - -/** - * Set status `code`. - * - * @param {Number} code - * @return {ServerResponse} - * @public - */ - -res.status = function status(code) { - this.statusCode = code; - return this; -}; - -/** - * Set Link header field with the given `links`. - * - * Examples: - * - * res.links({ - * next: 'http://api.example.com/users?page=2', - * last: 'http://api.example.com/users?page=5' - * }); - * - * @param {Object} links - * @return {ServerResponse} - * @public - */ - -res.links = function(links){ - var link = this.get('Link') || ''; - if (link) link += ', '; - return this.set('Link', link + Object.keys(links).map(function(rel){ - return '<' + links[rel] + '>; rel="' + rel + '"'; - }).join(', ')); -}; - -/** - * Send a response. - * - * Examples: - * - * res.send(Buffer.from('wahoo')); - * res.send({ some: 'json' }); - * res.send('

some html

'); - * - * @param {string|number|boolean|object|Buffer} body - * @public - */ - -res.send = function send(body) { - var chunk = body; - var encoding; - var req = this.req; - var type; - - // settings - var app = this.app; - - // allow status / body - if (arguments.length === 2) { - // res.send(body, status) backwards compat - if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') { - deprecate('res.send(body, status): Use res.status(status).send(body) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.send(status, body): Use res.status(status).send(body) instead'); - this.statusCode = arguments[0]; - chunk = arguments[1]; - } - } - - // disambiguate res.send(status) and res.send(status, num) - if (typeof chunk === 'number' && arguments.length === 1) { - // res.send(status) will set status message as text string - if (!this.get('Content-Type')) { - this.type('txt'); - } - - deprecate('res.send(status): Use res.sendStatus(status) instead'); - this.statusCode = chunk; - chunk = statuses[chunk] - } - - switch (typeof chunk) { - // string defaulting to html - case 'string': - if (!this.get('Content-Type')) { - this.type('html'); - } - break; - case 'boolean': - case 'number': - case 'object': - if (chunk === null) { - chunk = ''; - } else if (Buffer.isBuffer(chunk)) { - if (!this.get('Content-Type')) { - this.type('bin'); - } - } else { - return this.json(chunk); - } - break; - } - - // write strings in utf-8 - if (typeof chunk === 'string') { - encoding = 'utf8'; - type = this.get('Content-Type'); - - // reflect this in content-type - if (typeof type === 'string') { - this.set('Content-Type', setCharset(type, 'utf-8')); - } - } - - // determine if ETag should be generated - var etagFn = app.get('etag fn') - var generateETag = !this.get('ETag') && typeof etagFn === 'function' - - // populate Content-Length - var len - if (chunk !== undefined) { - if (Buffer.isBuffer(chunk)) { - // get length of Buffer - len = chunk.length - } else if (!generateETag && chunk.length < 1000) { - // just calculate length when no ETag + small chunk - len = Buffer.byteLength(chunk, encoding) - } else { - // convert chunk to Buffer and calculate - chunk = Buffer.from(chunk, encoding) - encoding = undefined; - len = chunk.length - } - - this.set('Content-Length', len); - } - - // populate ETag - var etag; - if (generateETag && len !== undefined) { - if ((etag = etagFn(chunk, encoding))) { - this.set('ETag', etag); - } - } - - // freshness - if (req.fresh) this.statusCode = 304; - - // strip irrelevant headers - if (204 === this.statusCode || 304 === this.statusCode) { - this.removeHeader('Content-Type'); - this.removeHeader('Content-Length'); - this.removeHeader('Transfer-Encoding'); - chunk = ''; - } - - if (req.method === 'HEAD') { - // skip body for HEAD - this.end(); - } else { - // respond - this.end(chunk, encoding); - } - - return this; -}; - -/** - * Send JSON response. - * - * Examples: - * - * res.json(null); - * res.json({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @public - */ - -res.json = function json(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.json(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.json(status, obj): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var escape = app.get('json escape') - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = stringify(val, replacer, spaces, escape) - - // content-type - if (!this.get('Content-Type')) { - this.set('Content-Type', 'application/json'); - } - - return this.send(body); -}; - -/** - * Send JSON response with JSONP callback support. - * - * Examples: - * - * res.jsonp(null); - * res.jsonp({ user: 'tj' }); - * - * @param {string|number|boolean|object} obj - * @public - */ - -res.jsonp = function jsonp(obj) { - var val = obj; - - // allow status / body - if (arguments.length === 2) { - // res.json(body, status) backwards compat - if (typeof arguments[1] === 'number') { - deprecate('res.jsonp(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; - } else { - deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; - } - } - - // settings - var app = this.app; - var escape = app.get('json escape') - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = stringify(val, replacer, spaces, escape) - var callback = this.req.query[app.get('jsonp callback name')]; - - // content-type - if (!this.get('Content-Type')) { - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'application/json'); - } - - // fixup callback - if (Array.isArray(callback)) { - callback = callback[0]; - } - - // jsonp - if (typeof callback === 'string' && callback.length !== 0) { - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'text/javascript'); - - // restrict callback charset - callback = callback.replace(/[^\[\]\w$.]/g, ''); - - // replace chars not allowed in JavaScript that are in JSON - body = body - .replace(/\u2028/g, '\\u2028') - .replace(/\u2029/g, '\\u2029'); - - // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse" - // the typeof check is just to reduce client error noise - body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');'; - } - - return this.send(body); -}; - -/** - * Send given HTTP status code. - * - * Sets the response status to `statusCode` and the body of the - * response to the standard description from node's http.STATUS_CODES - * or the statusCode number if no description. - * - * Examples: - * - * res.sendStatus(200); - * - * @param {number} statusCode - * @public - */ - -res.sendStatus = function sendStatus(statusCode) { - var body = statuses[statusCode] || String(statusCode) - - this.statusCode = statusCode; - this.type('txt'); - - return this.send(body); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `callback(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.sentHeader` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 (can be string converted by `ms`) - * - `root` root directory for relative filenames - * - `headers` object of headers to serve with file - * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them - * - * Other options are passed along to `send`. - * - * Examples: - * - * The following example illustrates how `res.sendFile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendFile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendFile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @public - */ - -res.sendFile = function sendFile(path, options, callback) { - var done = callback; - var req = this.req; - var res = this; - var next = req.next; - var opts = options || {}; - - if (!path) { - throw new TypeError('path argument is required to res.sendFile'); - } - - // support function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - if (!opts.root && !isAbsolute(path)) { - throw new TypeError('path must be absolute or specify root to res.sendFile'); - } - - // create file stream - var pathname = encodeURI(path); - var file = send(req, pathname, opts); - - // transfer - sendfile(res, file, opts, function (err) { - if (done) return done(err); - if (err && err.code === 'EISDIR') return next(); - - // next() all but write errors - if (err && err.code !== 'ECONNABORTED' && err.syscall !== 'write') { - next(err); - } - }); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `callback(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.sentHeader` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 (can be string converted by `ms`) - * - `root` root directory for relative filenames - * - `headers` object of headers to serve with file - * - `dotfiles` serve dotfiles, defaulting to false; can be `"allow"` to send them - * - * Other options are passed along to `send`. - * - * Examples: - * - * The following example illustrates how `res.sendfile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendfile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendfile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @public - */ - -res.sendfile = function (path, options, callback) { - var done = callback; - var req = this.req; - var res = this; - var next = req.next; - var opts = options || {}; - - // support function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - // create file stream - var file = send(req, path, opts); - - // transfer - sendfile(res, file, opts, function (err) { - if (done) return done(err); - if (err && err.code === 'EISDIR') return next(); - - // next() all but write errors - if (err && err.code !== 'ECONNABORT' && err.syscall !== 'write') { - next(err); - } - }); -}; - -res.sendfile = deprecate.function(res.sendfile, - 'res.sendfile: Use res.sendFile instead'); - -/** - * Transfer the file at the given `path` as an attachment. - * - * Optionally providing an alternate attachment `filename`, - * and optional callback `callback(err)`. The callback is invoked - * when the data transfer is complete, or when an error has - * ocurred. Be sure to check `res.headersSent` if you plan to respond. - * - * Optionally providing an `options` object to use with `res.sendFile()`. - * This function will set the `Content-Disposition` header, overriding - * any `Content-Disposition` header passed as header options in order - * to set the attachment and filename. - * - * This method uses `res.sendFile()`. - * - * @public - */ - -res.download = function download (path, filename, options, callback) { - var done = callback; - var name = filename; - var opts = options || null - - // support function as second or third arg - if (typeof filename === 'function') { - done = filename; - name = null; - opts = null - } else if (typeof options === 'function') { - done = options - opts = null - } - - // set Content-Disposition when file is sent - var headers = { - 'Content-Disposition': contentDisposition(name || path) - }; - - // merge user-provided headers - if (opts && opts.headers) { - var keys = Object.keys(opts.headers) - for (var i = 0; i < keys.length; i++) { - var key = keys[i] - if (key.toLowerCase() !== 'content-disposition') { - headers[key] = opts.headers[key] - } - } - } - - // merge user-provided options - opts = Object.create(opts) - opts.headers = headers - - // Resolve the full path for sendFile - var fullPath = resolve(path); - - // send file - return this.sendFile(fullPath, opts, done) -}; - -/** - * Set _Content-Type_ response header with `type` through `mime.lookup()` - * when it does not contain "/", or set the Content-Type to `type` otherwise. - * - * Examples: - * - * res.type('.html'); - * res.type('html'); - * res.type('json'); - * res.type('application/json'); - * res.type('png'); - * - * @param {String} type - * @return {ServerResponse} for chaining - * @public - */ - -res.contentType = -res.type = function contentType(type) { - var ct = type.indexOf('/') === -1 - ? mime.lookup(type) - : type; - - return this.set('Content-Type', ct); -}; - -/** - * Respond to the Acceptable formats using an `obj` - * of mime-type callbacks. - * - * This method uses `req.accepted`, an array of - * acceptable types ordered by their quality values. - * When "Accept" is not present the _first_ callback - * is invoked, otherwise the first match is used. When - * no match is performed the server responds with - * 406 "Not Acceptable". - * - * Content-Type is set for you, however if you choose - * you may alter this within the callback using `res.type()` - * or `res.set('Content-Type', ...)`. - * - * res.format({ - * 'text/plain': function(){ - * res.send('hey'); - * }, - * - * 'text/html': function(){ - * res.send('

hey

'); - * }, - * - * 'appliation/json': function(){ - * res.send({ message: 'hey' }); - * } - * }); - * - * In addition to canonicalized MIME types you may - * also use extnames mapped to these types: - * - * res.format({ - * text: function(){ - * res.send('hey'); - * }, - * - * html: function(){ - * res.send('

hey

'); - * }, - * - * json: function(){ - * res.send({ message: 'hey' }); - * } - * }); - * - * By default Express passes an `Error` - * with a `.status` of 406 to `next(err)` - * if a match is not made. If you provide - * a `.default` callback it will be invoked - * instead. - * - * @param {Object} obj - * @return {ServerResponse} for chaining - * @public - */ - -res.format = function(obj){ - var req = this.req; - var next = req.next; - - var fn = obj.default; - if (fn) delete obj.default; - var keys = Object.keys(obj); - - var key = keys.length > 0 - ? req.accepts(keys) - : false; - - this.vary("Accept"); - - if (key) { - this.set('Content-Type', normalizeType(key).value); - obj[key](req, this, next); - } else if (fn) { - fn(); - } else { - var err = new Error('Not Acceptable'); - err.status = err.statusCode = 406; - err.types = normalizeTypes(keys).map(function(o){ return o.value }); - next(err); - } - - return this; -}; - -/** - * Set _Content-Disposition_ header to _attachment_ with optional `filename`. - * - * @param {String} filename - * @return {ServerResponse} - * @public - */ - -res.attachment = function attachment(filename) { - if (filename) { - this.type(extname(filename)); - } - - this.set('Content-Disposition', contentDisposition(filename)); - - return this; -}; - -/** - * Append additional header `field` with value `val`. - * - * Example: - * - * res.append('Link', ['', '']); - * res.append('Set-Cookie', 'foo=bar; Path=/; HttpOnly'); - * res.append('Warning', '199 Miscellaneous warning'); - * - * @param {String} field - * @param {String|Array} val - * @return {ServerResponse} for chaining - * @public - */ - -res.append = function append(field, val) { - var prev = this.get(field); - var value = val; - - if (prev) { - // concat the new and prev vals - value = Array.isArray(prev) ? prev.concat(val) - : Array.isArray(val) ? [prev].concat(val) - : [prev, val]; - } - - return this.set(field, value); -}; - -/** - * Set header `field` to `val`, or pass - * an object of header fields. - * - * Examples: - * - * res.set('Foo', ['bar', 'baz']); - * res.set('Accept', 'application/json'); - * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' }); - * - * Aliased as `res.header()`. - * - * @param {String|Object} field - * @param {String|Array} val - * @return {ServerResponse} for chaining - * @public - */ - -res.set = -res.header = function header(field, val) { - if (arguments.length === 2) { - var value = Array.isArray(val) - ? val.map(String) - : String(val); - - // add charset to content-type - if (field.toLowerCase() === 'content-type') { - if (Array.isArray(value)) { - throw new TypeError('Content-Type cannot be set to an Array'); - } - if (!charsetRegExp.test(value)) { - var charset = mime.charsets.lookup(value.split(';')[0]); - if (charset) value += '; charset=' + charset.toLowerCase(); - } - } - - this.setHeader(field, value); - } else { - for (var key in field) { - this.set(key, field[key]); - } - } - return this; -}; - -/** - * Get value for header `field`. - * - * @param {String} field - * @return {String} - * @public - */ - -res.get = function(field){ - return this.getHeader(field); -}; - -/** - * Clear cookie `name`. - * - * @param {String} name - * @param {Object} [options] - * @return {ServerResponse} for chaining - * @public - */ - -res.clearCookie = function clearCookie(name, options) { - var opts = merge({ expires: new Date(1), path: '/' }, options); - - return this.cookie(name, '', opts); -}; - -/** - * Set cookie `name` to `value`, with the given `options`. - * - * Options: - * - * - `maxAge` max-age in milliseconds, converted to `expires` - * - `signed` sign the cookie - * - `path` defaults to "/" - * - * Examples: - * - * // "Remember Me" for 15 minutes - * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); - * - * // save as above - * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }) - * - * @param {String} name - * @param {String|Object} value - * @param {Object} [options] - * @return {ServerResponse} for chaining - * @public - */ - -res.cookie = function (name, value, options) { - var opts = merge({}, options); - var secret = this.req.secret; - var signed = opts.signed; - - if (signed && !secret) { - throw new Error('cookieParser("secret") required for signed cookies'); - } - - var val = typeof value === 'object' - ? 'j:' + JSON.stringify(value) - : String(value); - - if (signed) { - val = 's:' + sign(val, secret); - } - - if ('maxAge' in opts) { - opts.expires = new Date(Date.now() + opts.maxAge); - opts.maxAge /= 1000; - } - - if (opts.path == null) { - opts.path = '/'; - } - - this.append('Set-Cookie', cookie.serialize(name, String(val), opts)); - - return this; -}; - -/** - * Set the location header to `url`. - * - * The given `url` can also be "back", which redirects - * to the _Referrer_ or _Referer_ headers or "/". - * - * Examples: - * - * res.location('/foo/bar').; - * res.location('http://example.com'); - * res.location('../login'); - * - * @param {String} url - * @return {ServerResponse} for chaining - * @public - */ - -res.location = function location(url) { - var loc = url; - - // "back" is an alias for the referrer - if (url === 'back') { - loc = this.req.get('Referrer') || '/'; - } - - // set location - return this.set('Location', encodeUrl(loc)); -}; - -/** - * Redirect to the given `url` with optional response `status` - * defaulting to 302. - * - * The resulting `url` is determined by `res.location()`, so - * it will play nicely with mounted apps, relative paths, - * `"back"` etc. - * - * Examples: - * - * res.redirect('/foo/bar'); - * res.redirect('http://example.com'); - * res.redirect(301, 'http://example.com'); - * res.redirect('../login'); // /blog/post/1 -> /blog/login - * - * @public - */ - -res.redirect = function redirect(url) { - var address = url; - var body; - var status = 302; - - // allow status / url - if (arguments.length === 2) { - if (typeof arguments[0] === 'number') { - status = arguments[0]; - address = arguments[1]; - } else { - deprecate('res.redirect(url, status): Use res.redirect(status, url) instead'); - status = arguments[1]; - } - } - - // Set location header - address = this.location(address).get('Location'); - - // Support text/{plain,html} by default - this.format({ - text: function(){ - body = statuses[status] + '. Redirecting to ' + address - }, - - html: function(){ - var u = escapeHtml(address); - body = '

' + statuses[status] + '. Redirecting to ' + u + '

' - }, - - default: function(){ - body = ''; - } - }); - - // Respond - this.statusCode = status; - this.set('Content-Length', Buffer.byteLength(body)); - - if (this.req.method === 'HEAD') { - this.end(); - } else { - this.end(body); - } -}; - -/** - * Add `field` to Vary. If already present in the Vary set, then - * this call is simply ignored. - * - * @param {Array|String} field - * @return {ServerResponse} for chaining - * @public - */ - -res.vary = function(field){ - // checks for back-compat - if (!field || (Array.isArray(field) && !field.length)) { - deprecate('res.vary(): Provide a field name'); - return this; - } - - vary(this, field); - - return this; -}; - -/** - * Render `view` with the given `options` and optional callback `fn`. - * When a callback function is given a response will _not_ be made - * automatically, otherwise a response of _200_ and _text/html_ is given. - * - * Options: - * - * - `cache` boolean hinting to the engine it should cache - * - `filename` filename of the view being rendered - * - * @public - */ - -res.render = function render(view, options, callback) { - var app = this.req.app; - var done = callback; - var opts = options || {}; - var req = this.req; - var self = this; - - // support callback function as second arg - if (typeof options === 'function') { - done = options; - opts = {}; - } - - // merge res.locals - opts._locals = self.locals; - - // default callback to respond - done = done || function (err, str) { - if (err) return req.next(err); - self.send(str); - }; - - // render - app.render(view, opts, done); -}; - -// pipe the send file stream -function sendfile(res, file, options, callback) { - var done = false; - var streaming; - - // request aborted - function onaborted() { - if (done) return; - done = true; - - var err = new Error('Request aborted'); - err.code = 'ECONNABORTED'; - callback(err); - } - - // directory - function ondirectory() { - if (done) return; - done = true; - - var err = new Error('EISDIR, read'); - err.code = 'EISDIR'; - callback(err); - } - - // errors - function onerror(err) { - if (done) return; - done = true; - callback(err); - } - - // ended - function onend() { - if (done) return; - done = true; - callback(); - } - - // file - function onfile() { - streaming = false; - } - - // finished - function onfinish(err) { - if (err && err.code === 'ECONNRESET') return onaborted(); - if (err) return onerror(err); - if (done) return; - - setImmediate(function () { - if (streaming !== false && !done) { - onaborted(); - return; - } - - if (done) return; - done = true; - callback(); - }); - } - - // streaming - function onstream() { - streaming = true; - } - - file.on('directory', ondirectory); - file.on('end', onend); - file.on('error', onerror); - file.on('file', onfile); - file.on('stream', onstream); - onFinished(res, onfinish); - - if (options.headers) { - // set headers on successful transfer - file.on('headers', function headers(res) { - var obj = options.headers; - var keys = Object.keys(obj); - - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - res.setHeader(k, obj[k]); - } - }); - } - - // pipe - file.pipe(res); -} - -/** - * Stringify JSON, like JSON.stringify, but v8 optimized, with the - * ability to escape characters that can trigger HTML sniffing. - * - * @param {*} value - * @param {function} replaces - * @param {number} spaces - * @param {boolean} escape - * @returns {string} - * @private - */ - -function stringify (value, replacer, spaces, escape) { - // v8 checks arguments.length for optimizing simple call - // https://bugs.chromium.org/p/v8/issues/detail?id=4730 - var json = replacer || spaces - ? JSON.stringify(value, replacer, spaces) - : JSON.stringify(value); - - if (escape) { - json = json.replace(/[<>&]/g, function (c) { - switch (c.charCodeAt(0)) { - case 0x3c: - return '\\u003c' - case 0x3e: - return '\\u003e' - case 0x26: - return '\\u0026' - default: - return c - } - }) - } - - return json -} - - -/***/ }), -/* 181 */ -/***/ (function(module, exports, __webpack_require__) { - -/** - * Module dependencies. - */ - -var crypto = __webpack_require__(43); - -/** - * Sign the given `val` with `secret`. - * - * @param {String} val - * @param {String} secret - * @return {String} - * @api private - */ - -exports.sign = function(val, secret){ - if ('string' != typeof val) throw new TypeError("Cookie value must be provided as a string."); - if ('string' != typeof secret) throw new TypeError("Secret string must be provided."); - return val + '.' + crypto - .createHmac('sha256', secret) - .update(val) - .digest('base64') - .replace(/\=+$/, ''); -}; - -/** - * Unsign and decode the given `val` with `secret`, - * returning `false` if the signature is invalid. - * - * @param {String} val - * @param {String} secret - * @return {String|Boolean} - * @api private - */ - -exports.unsign = function(val, secret){ - if ('string' != typeof val) throw new TypeError("Signed cookie string must be provided."); - if ('string' != typeof secret) throw new TypeError("Secret string must be provided."); - var str = val.slice(0, val.lastIndexOf('.')) - , mac = exports.sign(str, secret); - - return sha1(mac) == sha1(val) ? str : false; -}; - -/** - * Private - */ - -function sha1(str){ - return crypto.createHash('sha1').update(str).digest('hex'); -} - - -/***/ }), -/* 182 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * cookie - * Copyright(c) 2012-2014 Roman Shtylman - * Copyright(c) 2015 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - * @public - */ - -exports.parse = parse; -exports.serialize = serialize; - -/** - * Module variables. - * @private - */ - -var decode = decodeURIComponent; -var encode = encodeURIComponent; -var pairSplitRegExp = /; */; - -/** - * RegExp to match field-content in RFC 7230 sec 3.2 - * - * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] - * field-vchar = VCHAR / obs-text - * obs-text = %x80-FF - */ - -var fieldContentRegExp = /^[\u0009\u0020-\u007e\u0080-\u00ff]+$/; - -/** - * Parse a cookie header. - * - * Parse the given cookie header string into an object - * The object has the various cookies as keys(names) => values - * - * @param {string} str - * @param {object} [options] - * @return {object} - * @public - */ - -function parse(str, options) { - if (typeof str !== 'string') { - throw new TypeError('argument str must be a string'); - } - - var obj = {} - var opt = options || {}; - var pairs = str.split(pairSplitRegExp); - var dec = opt.decode || decode; - - for (var i = 0; i < pairs.length; i++) { - var pair = pairs[i]; - var eq_idx = pair.indexOf('='); - - // skip things that don't look like key=value - if (eq_idx < 0) { - continue; - } - - var key = pair.substr(0, eq_idx).trim() - var val = pair.substr(++eq_idx, pair.length).trim(); - - // quoted values - if ('"' == val[0]) { - val = val.slice(1, -1); - } - - // only assign once - if (undefined == obj[key]) { - obj[key] = tryDecode(val, dec); - } - } - - return obj; -} - -/** - * Serialize data into a cookie header. - * - * Serialize the a name value pair into a cookie string suitable for - * http headers. An optional options object specified cookie parameters. - * - * serialize('foo', 'bar', { httpOnly: true }) - * => "foo=bar; httpOnly" - * - * @param {string} name - * @param {string} val - * @param {object} [options] - * @return {string} - * @public - */ - -function serialize(name, val, options) { - var opt = options || {}; - var enc = opt.encode || encode; - - if (typeof enc !== 'function') { - throw new TypeError('option encode is invalid'); - } - - if (!fieldContentRegExp.test(name)) { - throw new TypeError('argument name is invalid'); - } - - var value = enc(val); - - if (value && !fieldContentRegExp.test(value)) { - throw new TypeError('argument val is invalid'); - } - - var str = name + '=' + value; - - if (null != opt.maxAge) { - var maxAge = opt.maxAge - 0; - if (isNaN(maxAge)) throw new Error('maxAge should be a Number'); - str += '; Max-Age=' + Math.floor(maxAge); - } - - if (opt.domain) { - if (!fieldContentRegExp.test(opt.domain)) { - throw new TypeError('option domain is invalid'); - } - - str += '; Domain=' + opt.domain; - } - - if (opt.path) { - if (!fieldContentRegExp.test(opt.path)) { - throw new TypeError('option path is invalid'); - } - - str += '; Path=' + opt.path; - } - - if (opt.expires) { - if (typeof opt.expires.toUTCString !== 'function') { - throw new TypeError('option expires is invalid'); - } - - str += '; Expires=' + opt.expires.toUTCString(); - } - - if (opt.httpOnly) { - str += '; HttpOnly'; - } - - if (opt.secure) { - str += '; Secure'; - } - - if (opt.sameSite) { - var sameSite = typeof opt.sameSite === 'string' - ? opt.sameSite.toLowerCase() : opt.sameSite; - - switch (sameSite) { - case true: - str += '; SameSite=Strict'; - break; - case 'lax': - str += '; SameSite=Lax'; - break; - case 'strict': - str += '; SameSite=Strict'; - break; - default: - throw new TypeError('option sameSite is invalid'); - } - } - - return str; -} - -/** - * Try decoding a string using a decoding function. - * - * @param {string} str - * @param {function} decode - * @private - */ - -function tryDecode(str, decode) { - try { - return decode(str); - } catch (e) { - return str; - } -} - - -/***/ }), -/* 183 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * vary - * Copyright(c) 2014-2017 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module exports. - */ - -module.exports = vary -module.exports.append = append - -/** - * RegExp to match field-name in RFC 7230 sec 3.2 - * - * field-name = token - * token = 1*tchar - * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" - * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" - * / DIGIT / ALPHA - * ; any VCHAR, except delimiters - */ - -var FIELD_NAME_REGEXP = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/ - -/** - * Append a field to a vary header. - * - * @param {String} header - * @param {String|Array} field - * @return {String} - * @public - */ - -function append (header, field) { - if (typeof header !== 'string') { - throw new TypeError('header argument is required') - } - - if (!field) { - throw new TypeError('field argument is required') - } - - // get fields array - var fields = !Array.isArray(field) - ? parse(String(field)) - : field - - // assert on invalid field names - for (var j = 0; j < fields.length; j++) { - if (!FIELD_NAME_REGEXP.test(fields[j])) { - throw new TypeError('field argument contains an invalid header name') - } - } - - // existing, unspecified vary - if (header === '*') { - return header - } - - // enumerate current values - var val = header - var vals = parse(header.toLowerCase()) - - // unspecified vary - if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) { - return '*' - } - - for (var i = 0; i < fields.length; i++) { - var fld = fields[i].toLowerCase() - - // append value (case-preserving) - if (vals.indexOf(fld) === -1) { - vals.push(fld) - val = val - ? val + ', ' + fields[i] - : fields[i] - } - } - - return val -} - -/** - * Parse a vary header into an array. - * - * @param {String} header - * @return {Array} - * @private - */ - -function parse (header) { - var end = 0 - var list = [] - var start = 0 - - // gather tokens - for (var i = 0, len = header.length; i < len; i++) { - switch (header.charCodeAt(i)) { - case 0x20: /* */ - if (start === end) { - start = end = i + 1 - } - break - case 0x2c: /* , */ - list.push(header.substring(start, end)) - start = end = i + 1 - break - default: - end = i + 1 - break - } - } - - // final token - list.push(header.substring(start, end)) - - return list -} - -/** - * Mark that a request is varied on a header field. - * - * @param {Object} res - * @param {String|Array} field - * @public - */ - -function vary (res, field) { - if (!res || !res.getHeader || !res.setHeader) { - // quack quack - throw new TypeError('res argument is required') - } - - // get existing header - var val = res.getHeader('Vary') || '' - var header = Array.isArray(val) - ? val.join(', ') - : String(val) - - // set new header - if ((val = append(header, field))) { - res.setHeader('Vary', val) - } -} - - -/***/ }), -/* 184 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/*! - * serve-static - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * Copyright(c) 2014-2016 Douglas Christopher Wilson - * MIT Licensed - */ - - - -/** - * Module dependencies. - * @private - */ - -var encodeUrl = __webpack_require__(38) -var escapeHtml = __webpack_require__(39) -var parseUrl = __webpack_require__(23) -var resolve = __webpack_require__(0).resolve -var send = __webpack_require__(52) -var url = __webpack_require__(40) - -/** - * Module exports. - * @public - */ - -module.exports = serveStatic -module.exports.mime = send.mime - -/** - * @param {string} root - * @param {object} [options] - * @return {function} - * @public - */ - -function serveStatic (root, options) { - if (!root) { - throw new TypeError('root path required') - } - - if (typeof root !== 'string') { - throw new TypeError('root path must be a string') - } - - // copy options object - var opts = Object.create(options || null) - - // fall-though - var fallthrough = opts.fallthrough !== false - - // default redirect - var redirect = opts.redirect !== false - - // headers listener - var setHeaders = opts.setHeaders - - if (setHeaders && typeof setHeaders !== 'function') { - throw new TypeError('option setHeaders must be function') - } - - // setup options for send - opts.maxage = opts.maxage || opts.maxAge || 0 - opts.root = resolve(root) - - // construct directory listener - var onDirectory = redirect - ? createRedirectDirectoryListener() - : createNotFoundDirectoryListener() - - return function serveStatic (req, res, next) { - if (req.method !== 'GET' && req.method !== 'HEAD') { - if (fallthrough) { - return next() - } - - // method not allowed - res.statusCode = 405 - res.setHeader('Allow', 'GET, HEAD') - res.setHeader('Content-Length', '0') - res.end() - return - } - - var forwardError = !fallthrough - var originalUrl = parseUrl.original(req) - var path = parseUrl(req).pathname - - // make sure redirect occurs at mount - if (path === '/' && originalUrl.pathname.substr(-1) !== '/') { - path = '' - } - - // create send stream - var stream = send(req, path, opts) - - // add directory handler - stream.on('directory', onDirectory) - - // add headers listener - if (setHeaders) { - stream.on('headers', setHeaders) - } - - // add file listener for fallthrough - if (fallthrough) { - stream.on('file', function onFile () { - // once file is determined, always forward error - forwardError = true - }) - } - - // forward errors - stream.on('error', function error (err) { - if (forwardError || !(err.statusCode < 500)) { - next(err) - return - } - - next() - }) - - // pipe - stream.pipe(res) - } -} - -/** - * Collapse all leading slashes into a single slash - * @private - */ -function collapseLeadingSlashes (str) { - for (var i = 0; i < str.length; i++) { - if (str.charCodeAt(i) !== 0x2f /* / */) { - break - } - } - - return i > 1 - ? '/' + str.substr(i) - : str -} - - /** - * Create a minimal HTML document. - * - * @param {string} title - * @param {string} body - * @private - */ - -function createHtmlDocument (title, body) { - return '\n' + - '\n' + - '\n' + - '\n' + - '' + title + '\n' + - '\n' + - '\n' + - '
' + body + '
\n' + - '\n' + - '\n' -} - -/** - * Create a directory listener that just 404s. - * @private - */ - -function createNotFoundDirectoryListener () { - return function notFound () { - this.error(404) - } -} - -/** - * Create a directory listener that performs a redirect. - * @private - */ - -function createRedirectDirectoryListener () { - return function redirect (res) { - if (this.hasTrailingSlash()) { - this.error(404) - return - } - - // get original URL - var originalUrl = parseUrl.original(this.req) - - // append trailing slash - originalUrl.path = null - originalUrl.pathname = collapseLeadingSlashes(originalUrl.pathname + '/') - - // reformat the URL - var loc = encodeUrl(url.format(originalUrl)) - var doc = createHtmlDocument('Redirecting', 'Redirecting to ' + - escapeHtml(loc) + '') - - // send redirect response - res.statusCode = 301 - res.setHeader('Content-Type', 'text/html; charset=UTF-8') - res.setHeader('Content-Length', Buffer.byteLength(doc)) - res.setHeader('Content-Security-Policy', "default-src 'self'") - res.setHeader('X-Content-Type-Options', 'nosniff') - res.setHeader('Location', loc) - res.end(doc) - } -} - - -/***/ }), -/* 185 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _stringify = __webpack_require__(18); - -var _stringify2 = _interopRequireDefault(_stringify); - -var _regenerator = __webpack_require__(24); - -var _regenerator2 = _interopRequireDefault(_regenerator); - -var _promise = __webpack_require__(25); - -var _promise2 = _interopRequireDefault(_promise); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) { - return new (P || (P = _promise2.default))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : new P(function (resolve) { - resolve(result.value); - }).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -var express = __webpack_require__(32); -var anomalyType_1 = __webpack_require__(19); -var analytics_1 = __webpack_require__(68); -var metrics_1 = __webpack_require__(114); -function sendAnomalyTypeStatus(req, res) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_regenerator2.default.mark(function _callee() { - var id, name, anomaly; - return _regenerator2.default.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - id = req.query.id; - name = req.query.name; - _context.prev = 2; - anomaly = void 0; - - if (id !== undefined) { - anomaly = anomalyType_1.loadAnomalyById(id); - } else { - anomaly = anomalyType_1.loadAnomalyByName(name); - } - - if (!(anomaly === null)) { - _context.next = 8; - break; - } - - res.status(404).send({ - code: 404, - message: 'Not found' - }); - return _context.abrupt("return"); - - case 8: - if (!(anomaly.status === undefined)) { - _context.next = 10; - break; - } - - throw new Error('No status for ' + name); - - case 10: - res.status(200).send({ status: anomaly.status, errorMessage: anomaly.error }); - _context.next = 17; - break; - - case 13: - _context.prev = 13; - _context.t0 = _context["catch"](2); - - console.error(_context.t0); - // TODO: better send 404 when we know than isn`t found - res.status(500).send({ error: 'Can`t return anything' }); - - case 17: - case "end": - return _context.stop(); - } - } - }, _callee, this, [[2, 13]]); - })); -} -function getAnomaly(req, res) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_regenerator2.default.mark(function _callee2() { - var id, name, anomaly, payload; - return _regenerator2.default.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - _context2.prev = 0; - id = req.query.id; - name = req.query.name; - anomaly = void 0; - - if (id !== undefined) { - anomaly = anomalyType_1.loadAnomalyById(id); - } else { - anomaly = anomalyType_1.loadAnomalyByName(name.toLowerCase()); - } - - if (!(anomaly === null)) { - _context2.next = 8; - break; - } - - res.status(404).send({ - code: 404, - message: 'Not found' - }); - return _context2.abrupt("return"); - - case 8: - payload = (0, _stringify2.default)({ - name: anomaly.name, - metric: anomaly.metric, - status: anomaly.status - }); - - res.status(200).send(payload); - _context2.next = 16; - break; - - case 12: - _context2.prev = 12; - _context2.t0 = _context2["catch"](0); - - console.error(_context2.t0); - // TODO: better send 404 when we know than isn`t found - res.status(500).send('Can`t get anything'); - - case 16: - case "end": - return _context2.stop(); - } - } - }, _callee2, this, [[0, 12]]); - })); -} -function createAnomaly(req, res) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_regenerator2.default.mark(function _callee3() { - var metric, anomaly, anomalyId, payload; - return _regenerator2.default.wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - try { - metric = { - datasource: req.body.metric.datasource, - targets: metrics_1.saveTargets(req.body.metric.targets) - }; - anomaly = { - name: req.body.name, - panelUrl: req.body.panelUrl, - metric: metric, - datasource: req.body.datasource, - status: 'learning', - last_prediction_time: 0, - next_id: 0 - }; - anomalyId = anomalyType_1.insertAnomaly(anomaly); - - if (anomalyId === null) { - res.status(403).send({ - code: 403, - message: 'Already exists' - }); - } - payload = (0, _stringify2.default)({ anomaly_id: anomalyId }); - - res.status(200).send(payload); - analytics_1.runLearning(anomalyId); - } catch (e) { - res.status(500).send({ - code: 500, - message: 'Internal error' - }); - } - - case 1: - case "end": - return _context3.stop(); - } - } - }, _callee3, this); - })); -} -function deleteAnomaly(req, res) { - try { - var id = req.query.id; - var name = req.query.name; - if (id !== undefined) { - anomalyType_1.removeAnomaly(id); - } else { - anomalyType_1.removeAnomaly(name.toLowerCase()); - } - res.status(200).send({ - code: 200, - message: 'Success' - }); - } catch (e) { - res.status(500).send({ - code: 500, - message: 'Internal error' - }); - } -} -exports.router = express.Router(); -exports.router.get('/status', sendAnomalyTypeStatus); -exports.router.get('/', getAnomaly); -exports.router.post('/', createAnomaly); -exports.router.delete('/', deleteAnomaly); - -/***/ }), -/* 186 */ -/***/ (function(module, exports, __webpack_require__) { - -var core = __webpack_require__(6); -var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify }); -module.exports = function stringify(it) { // eslint-disable-line no-unused-vars - return $JSON.stringify.apply($JSON, arguments); -}; - - -/***/ }), -/* 187 */ -/***/ (function(module, exports, __webpack_require__) { - -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -// This method of obtaining a reference to the global object needs to be -// kept identical to the way it is obtained in runtime.js -var g = (function() { return this })() || Function("return this")(); - -// Use `getOwnPropertyNames` because not all browsers support calling -// `hasOwnProperty` on the global `self` object in a worker. See #183. -var hadRuntime = g.regeneratorRuntime && - Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0; - -// Save the old regeneratorRuntime in case it needs to be restored later. -var oldRuntime = hadRuntime && g.regeneratorRuntime; - -// Force reevalutation of runtime.js. -g.regeneratorRuntime = undefined; - -module.exports = __webpack_require__(188); - -if (hadRuntime) { - // Restore the original runtime. - g.regeneratorRuntime = oldRuntime; -} else { - // Remove the global property added by runtime.js. - try { - delete g.regeneratorRuntime; - } catch(e) { - g.regeneratorRuntime = undefined; - } -} - - -/***/ }), -/* 188 */ -/***/ (function(module, exports) { - -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -!(function(global) { - "use strict"; - - var Op = Object.prototype; - var hasOwn = Op.hasOwnProperty; - var undefined; // More compressible than void 0. - var $Symbol = typeof Symbol === "function" ? Symbol : {}; - var iteratorSymbol = $Symbol.iterator || "@@iterator"; - var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; - var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; - - var inModule = typeof module === "object"; - var runtime = global.regeneratorRuntime; - if (runtime) { - if (inModule) { - // If regeneratorRuntime is defined globally and we're in a module, - // make the exports object identical to regeneratorRuntime. - module.exports = runtime; - } - // Don't bother evaluating the rest of this file if the runtime was - // already defined globally. - return; - } - - // Define the runtime globally (as expected by generated code) as either - // module.exports (if we're in a module) or a new, empty object. - runtime = global.regeneratorRuntime = inModule ? module.exports : {}; - - function wrap(innerFn, outerFn, self, tryLocsList) { - // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. - var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; - var generator = Object.create(protoGenerator.prototype); - var context = new Context(tryLocsList || []); - - // The ._invoke method unifies the implementations of the .next, - // .throw, and .return methods. - generator._invoke = makeInvokeMethod(innerFn, self, context); - - return generator; - } - runtime.wrap = wrap; - - // Try/catch helper to minimize deoptimizations. Returns a completion - // record like context.tryEntries[i].completion. This interface could - // have been (and was previously) designed to take a closure to be - // invoked without arguments, but in all the cases we care about we - // already have an existing method we want to call, so there's no need - // to create a new function object. We can even get away with assuming - // the method takes exactly one argument, since that happens to be true - // in every case, so we don't have to touch the arguments object. The - // only additional allocation required is the completion record, which - // has a stable shape and so hopefully should be cheap to allocate. - function tryCatch(fn, obj, arg) { - try { - return { type: "normal", arg: fn.call(obj, arg) }; - } catch (err) { - return { type: "throw", arg: err }; - } - } - - var GenStateSuspendedStart = "suspendedStart"; - var GenStateSuspendedYield = "suspendedYield"; - var GenStateExecuting = "executing"; - var GenStateCompleted = "completed"; - - // Returning this object from the innerFn has the same effect as - // breaking out of the dispatch switch statement. - var ContinueSentinel = {}; - - // Dummy constructor functions that we use as the .constructor and - // .constructor.prototype properties for functions that return Generator - // objects. For full spec compliance, you may wish to configure your - // minifier not to mangle the names of these two functions. - function Generator() {} - function GeneratorFunction() {} - function GeneratorFunctionPrototype() {} - - // This is a polyfill for %IteratorPrototype% for environments that - // don't natively support it. - var IteratorPrototype = {}; - IteratorPrototype[iteratorSymbol] = function () { - return this; - }; - - var getProto = Object.getPrototypeOf; - var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); - if (NativeIteratorPrototype && - NativeIteratorPrototype !== Op && - hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { - // This environment has a native %IteratorPrototype%; use it instead - // of the polyfill. - IteratorPrototype = NativeIteratorPrototype; - } - - var Gp = GeneratorFunctionPrototype.prototype = - Generator.prototype = Object.create(IteratorPrototype); - GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; - GeneratorFunctionPrototype.constructor = GeneratorFunction; - GeneratorFunctionPrototype[toStringTagSymbol] = - GeneratorFunction.displayName = "GeneratorFunction"; - - // Helper for defining the .next, .throw, and .return methods of the - // Iterator interface in terms of a single ._invoke method. - function defineIteratorMethods(prototype) { - ["next", "throw", "return"].forEach(function(method) { - prototype[method] = function(arg) { - return this._invoke(method, arg); - }; - }); - } - - runtime.isGeneratorFunction = function(genFun) { - var ctor = typeof genFun === "function" && genFun.constructor; - return ctor - ? ctor === GeneratorFunction || - // For the native GeneratorFunction constructor, the best we can - // do is to check its .name property. - (ctor.displayName || ctor.name) === "GeneratorFunction" - : false; - }; - - runtime.mark = function(genFun) { - if (Object.setPrototypeOf) { - Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); - } else { - genFun.__proto__ = GeneratorFunctionPrototype; - if (!(toStringTagSymbol in genFun)) { - genFun[toStringTagSymbol] = "GeneratorFunction"; - } - } - genFun.prototype = Object.create(Gp); - return genFun; - }; - - // Within the body of any async function, `await x` is transformed to - // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test - // `hasOwn.call(value, "__await")` to determine if the yielded value is - // meant to be awaited. - runtime.awrap = function(arg) { - return { __await: arg }; - }; - - function AsyncIterator(generator) { - function invoke(method, arg, resolve, reject) { - var record = tryCatch(generator[method], generator, arg); - if (record.type === "throw") { - reject(record.arg); - } else { - var result = record.arg; - var value = result.value; - if (value && - typeof value === "object" && - hasOwn.call(value, "__await")) { - return Promise.resolve(value.__await).then(function(value) { - invoke("next", value, resolve, reject); - }, function(err) { - invoke("throw", err, resolve, reject); - }); - } - - return Promise.resolve(value).then(function(unwrapped) { - // When a yielded Promise is resolved, its final value becomes - // the .value of the Promise<{value,done}> result for the - // current iteration. If the Promise is rejected, however, the - // result for this iteration will be rejected with the same - // reason. Note that rejections of yielded Promises are not - // thrown back into the generator function, as is the case - // when an awaited Promise is rejected. This difference in - // behavior between yield and await is important, because it - // allows the consumer to decide what to do with the yielded - // rejection (swallow it and continue, manually .throw it back - // into the generator, abandon iteration, whatever). With - // await, by contrast, there is no opportunity to examine the - // rejection reason outside the generator function, so the - // only option is to throw it from the await expression, and - // let the generator function handle the exception. - result.value = unwrapped; - resolve(result); - }, reject); - } - } - - var previousPromise; - - function enqueue(method, arg) { - function callInvokeWithMethodAndArg() { - return new Promise(function(resolve, reject) { - invoke(method, arg, resolve, reject); - }); - } - - return previousPromise = - // If enqueue has been called before, then we want to wait until - // all previous Promises have been resolved before calling invoke, - // so that results are always delivered in the correct order. If - // enqueue has not been called before, then it is important to - // call invoke immediately, without waiting on a callback to fire, - // so that the async generator function has the opportunity to do - // any necessary setup in a predictable way. This predictability - // is why the Promise constructor synchronously invokes its - // executor callback, and why async functions synchronously - // execute code before the first await. Since we implement simple - // async functions in terms of async generators, it is especially - // important to get this right, even though it requires care. - previousPromise ? previousPromise.then( - callInvokeWithMethodAndArg, - // Avoid propagating failures to Promises returned by later - // invocations of the iterator. - callInvokeWithMethodAndArg - ) : callInvokeWithMethodAndArg(); - } - - // Define the unified helper method that is used to implement .next, - // .throw, and .return (see defineIteratorMethods). - this._invoke = enqueue; - } - - defineIteratorMethods(AsyncIterator.prototype); - AsyncIterator.prototype[asyncIteratorSymbol] = function () { - return this; - }; - runtime.AsyncIterator = AsyncIterator; - - // Note that simple async functions are implemented on top of - // AsyncIterator objects; they just return a Promise for the value of - // the final result produced by the iterator. - runtime.async = function(innerFn, outerFn, self, tryLocsList) { - var iter = new AsyncIterator( - wrap(innerFn, outerFn, self, tryLocsList) - ); - - return runtime.isGeneratorFunction(outerFn) - ? iter // If outerFn is a generator, return the full iterator. - : iter.next().then(function(result) { - return result.done ? result.value : iter.next(); - }); - }; - - function makeInvokeMethod(innerFn, self, context) { - var state = GenStateSuspendedStart; - - return function invoke(method, arg) { - if (state === GenStateExecuting) { - throw new Error("Generator is already running"); - } - - if (state === GenStateCompleted) { - if (method === "throw") { - throw arg; - } - - // Be forgiving, per 25.3.3.3.3 of the spec: - // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume - return doneResult(); - } - - context.method = method; - context.arg = arg; - - while (true) { - var delegate = context.delegate; - if (delegate) { - var delegateResult = maybeInvokeDelegate(delegate, context); - if (delegateResult) { - if (delegateResult === ContinueSentinel) continue; - return delegateResult; - } - } - - if (context.method === "next") { - // Setting context._sent for legacy support of Babel's - // function.sent implementation. - context.sent = context._sent = context.arg; - - } else if (context.method === "throw") { - if (state === GenStateSuspendedStart) { - state = GenStateCompleted; - throw context.arg; - } - - context.dispatchException(context.arg); - - } else if (context.method === "return") { - context.abrupt("return", context.arg); - } - - state = GenStateExecuting; - - var record = tryCatch(innerFn, self, context); - if (record.type === "normal") { - // If an exception is thrown from innerFn, we leave state === - // GenStateExecuting and loop back for another invocation. - state = context.done - ? GenStateCompleted - : GenStateSuspendedYield; - - if (record.arg === ContinueSentinel) { - continue; - } - - return { - value: record.arg, - done: context.done - }; - - } else if (record.type === "throw") { - state = GenStateCompleted; - // Dispatch the exception by looping back around to the - // context.dispatchException(context.arg) call above. - context.method = "throw"; - context.arg = record.arg; - } - } - }; - } - - // Call delegate.iterator[context.method](context.arg) and handle the - // result, either by returning a { value, done } result from the - // delegate iterator, or by modifying context.method and context.arg, - // setting context.delegate to null, and returning the ContinueSentinel. - function maybeInvokeDelegate(delegate, context) { - var method = delegate.iterator[context.method]; - if (method === undefined) { - // A .throw or .return when the delegate iterator has no .throw - // method always terminates the yield* loop. - context.delegate = null; - - if (context.method === "throw") { - if (delegate.iterator.return) { - // If the delegate iterator has a return method, give it a - // chance to clean up. - context.method = "return"; - context.arg = undefined; - maybeInvokeDelegate(delegate, context); - - if (context.method === "throw") { - // If maybeInvokeDelegate(context) changed context.method from - // "return" to "throw", let that override the TypeError below. - return ContinueSentinel; - } - } - - context.method = "throw"; - context.arg = new TypeError( - "The iterator does not provide a 'throw' method"); - } - - return ContinueSentinel; - } - - var record = tryCatch(method, delegate.iterator, context.arg); - - if (record.type === "throw") { - context.method = "throw"; - context.arg = record.arg; - context.delegate = null; - return ContinueSentinel; - } - - var info = record.arg; - - if (! info) { - context.method = "throw"; - context.arg = new TypeError("iterator result is not an object"); - context.delegate = null; - return ContinueSentinel; - } - - if (info.done) { - // Assign the result of the finished delegate to the temporary - // variable specified by delegate.resultName (see delegateYield). - context[delegate.resultName] = info.value; - - // Resume execution at the desired location (see delegateYield). - context.next = delegate.nextLoc; - - // If context.method was "throw" but the delegate handled the - // exception, let the outer generator proceed normally. If - // context.method was "next", forget context.arg since it has been - // "consumed" by the delegate iterator. If context.method was - // "return", allow the original .return call to continue in the - // outer generator. - if (context.method !== "return") { - context.method = "next"; - context.arg = undefined; - } - - } else { - // Re-yield the result returned by the delegate method. - return info; - } - - // The delegate iterator is finished, so forget it and continue with - // the outer generator. - context.delegate = null; - return ContinueSentinel; - } - - // Define Generator.prototype.{next,throw,return} in terms of the - // unified ._invoke helper method. - defineIteratorMethods(Gp); - - Gp[toStringTagSymbol] = "Generator"; - - // A Generator should always return itself as the iterator object when the - // @@iterator function is called on it. Some browsers' implementations of the - // iterator prototype chain incorrectly implement this, causing the Generator - // object to not be returned from this call. This ensures that doesn't happen. - // See https://github.com/facebook/regenerator/issues/274 for more details. - Gp[iteratorSymbol] = function() { - return this; - }; - - Gp.toString = function() { - return "[object Generator]"; - }; - - function pushTryEntry(locs) { - var entry = { tryLoc: locs[0] }; - - if (1 in locs) { - entry.catchLoc = locs[1]; - } - - if (2 in locs) { - entry.finallyLoc = locs[2]; - entry.afterLoc = locs[3]; - } - - this.tryEntries.push(entry); - } - - function resetTryEntry(entry) { - var record = entry.completion || {}; - record.type = "normal"; - delete record.arg; - entry.completion = record; - } - - function Context(tryLocsList) { - // The root entry object (effectively a try statement without a catch - // or a finally block) gives us a place to store values thrown from - // locations where there is no enclosing try statement. - this.tryEntries = [{ tryLoc: "root" }]; - tryLocsList.forEach(pushTryEntry, this); - this.reset(true); - } - - runtime.keys = function(object) { - var keys = []; - for (var key in object) { - keys.push(key); - } - keys.reverse(); - - // Rather than returning an object with a next method, we keep - // things simple and return the next function itself. - return function next() { - while (keys.length) { - var key = keys.pop(); - if (key in object) { - next.value = key; - next.done = false; - return next; - } - } - - // To avoid creating an additional object, we just hang the .value - // and .done properties off the next function object itself. This - // also ensures that the minifier will not anonymize the function. - next.done = true; - return next; - }; - }; - - function values(iterable) { - if (iterable) { - var iteratorMethod = iterable[iteratorSymbol]; - if (iteratorMethod) { - return iteratorMethod.call(iterable); - } - - if (typeof iterable.next === "function") { - return iterable; - } - - if (!isNaN(iterable.length)) { - var i = -1, next = function next() { - while (++i < iterable.length) { - if (hasOwn.call(iterable, i)) { - next.value = iterable[i]; - next.done = false; - return next; - } - } - - next.value = undefined; - next.done = true; - - return next; - }; - - return next.next = next; - } - } - - // Return an iterator with no values. - return { next: doneResult }; - } - runtime.values = values; - - function doneResult() { - return { value: undefined, done: true }; - } - - Context.prototype = { - constructor: Context, - - reset: function(skipTempReset) { - this.prev = 0; - this.next = 0; - // Resetting context._sent for legacy support of Babel's - // function.sent implementation. - this.sent = this._sent = undefined; - this.done = false; - this.delegate = null; - - this.method = "next"; - this.arg = undefined; - - this.tryEntries.forEach(resetTryEntry); - - if (!skipTempReset) { - for (var name in this) { - // Not sure about the optimal order of these conditions: - if (name.charAt(0) === "t" && - hasOwn.call(this, name) && - !isNaN(+name.slice(1))) { - this[name] = undefined; - } - } - } - }, - - stop: function() { - this.done = true; - - var rootEntry = this.tryEntries[0]; - var rootRecord = rootEntry.completion; - if (rootRecord.type === "throw") { - throw rootRecord.arg; - } - - return this.rval; - }, - - dispatchException: function(exception) { - if (this.done) { - throw exception; - } - - var context = this; - function handle(loc, caught) { - record.type = "throw"; - record.arg = exception; - context.next = loc; - - if (caught) { - // If the dispatched exception was caught by a catch block, - // then let that catch block handle the exception normally. - context.method = "next"; - context.arg = undefined; - } - - return !! caught; - } - - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - var record = entry.completion; - - if (entry.tryLoc === "root") { - // Exception thrown outside of any try block that could handle - // it, so set the completion value of the entire function to - // throw the exception. - return handle("end"); - } - - if (entry.tryLoc <= this.prev) { - var hasCatch = hasOwn.call(entry, "catchLoc"); - var hasFinally = hasOwn.call(entry, "finallyLoc"); - - if (hasCatch && hasFinally) { - if (this.prev < entry.catchLoc) { - return handle(entry.catchLoc, true); - } else if (this.prev < entry.finallyLoc) { - return handle(entry.finallyLoc); - } - - } else if (hasCatch) { - if (this.prev < entry.catchLoc) { - return handle(entry.catchLoc, true); - } - - } else if (hasFinally) { - if (this.prev < entry.finallyLoc) { - return handle(entry.finallyLoc); - } - - } else { - throw new Error("try statement without catch or finally"); - } - } - } - }, - - abrupt: function(type, arg) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.tryLoc <= this.prev && - hasOwn.call(entry, "finallyLoc") && - this.prev < entry.finallyLoc) { - var finallyEntry = entry; - break; - } - } - - if (finallyEntry && - (type === "break" || - type === "continue") && - finallyEntry.tryLoc <= arg && - arg <= finallyEntry.finallyLoc) { - // Ignore the finally entry if control is not jumping to a - // location outside the try/catch block. - finallyEntry = null; - } - - var record = finallyEntry ? finallyEntry.completion : {}; - record.type = type; - record.arg = arg; - - if (finallyEntry) { - this.method = "next"; - this.next = finallyEntry.finallyLoc; - return ContinueSentinel; - } - - return this.complete(record); - }, - - complete: function(record, afterLoc) { - if (record.type === "throw") { - throw record.arg; - } - - if (record.type === "break" || - record.type === "continue") { - this.next = record.arg; - } else if (record.type === "return") { - this.rval = this.arg = record.arg; - this.method = "return"; - this.next = "end"; - } else if (record.type === "normal" && afterLoc) { - this.next = afterLoc; - } - - return ContinueSentinel; - }, - - finish: function(finallyLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.finallyLoc === finallyLoc) { - this.complete(entry.completion, entry.afterLoc); - resetTryEntry(entry); - return ContinueSentinel; - } - } - }, - - "catch": function(tryLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.tryLoc === tryLoc) { - var record = entry.completion; - if (record.type === "throw") { - var thrown = record.arg; - resetTryEntry(entry); - } - return thrown; - } - } - - // The context.catch method must only be called with a location - // argument that corresponds to a known catch block. - throw new Error("illegal catch attempt"); - }, - - delegateYield: function(iterable, resultName, nextLoc) { - this.delegate = { - iterator: values(iterable), - resultName: resultName, - nextLoc: nextLoc - }; - - if (this.method === "next") { - // Deliberately forget the last sent value so that we don't - // accidentally pass it on to the delegate. - this.arg = undefined; - } - - return ContinueSentinel; - } - }; -})( - // In sloppy mode, unbound `this` refers to the global object, fallback to - // Function constructor if we're in global strict mode. That is sadly a form - // of indirect eval which violates Content Security Policy. - (function() { return this })() || Function("return this")() -); - - -/***/ }), -/* 189 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(99); -__webpack_require__(53); -__webpack_require__(63); -__webpack_require__(203); -__webpack_require__(210); -__webpack_require__(211); -module.exports = __webpack_require__(6).Promise; - - -/***/ }), -/* 190 */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(54); -var defined = __webpack_require__(55); -// true -> String#at -// false -> String#codePointAt -module.exports = function (TO_STRING) { - return function (that, pos) { - var s = String(defined(that)); - var i = toInteger(pos); - var l = s.length; - var a, b; - if (i < 0 || i >= l) return TO_STRING ? '' : undefined; - a = s.charCodeAt(i); - return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff - ? TO_STRING ? s.charAt(i) : a - : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; - }; -}; - - -/***/ }), -/* 191 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = !__webpack_require__(16) && !__webpack_require__(44)(function () { - return Object.defineProperty(__webpack_require__(58)('div'), 'a', { get: function () { return 7; } }).a != 7; -}); - - -/***/ }), -/* 192 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.1 ToPrimitive(input [, PreferredType]) -var isObject = __webpack_require__(9); -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -module.exports = function (it, S) { - if (!isObject(it)) return it; - var fn, val; - if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; - if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val; - if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; - throw TypeError("Can't convert object to primitive value"); -}; - - -/***/ }), -/* 193 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(14); - - -/***/ }), -/* 194 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var create = __webpack_require__(101); -var descriptor = __webpack_require__(100); -var setToStringTag = __webpack_require__(45); -var IteratorPrototype = {}; - -// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() -__webpack_require__(14)(IteratorPrototype, __webpack_require__(4)('iterator'), function () { return this; }); - -module.exports = function (Constructor, NAME, next) { - Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); - setToStringTag(Constructor, NAME + ' Iterator'); -}; - - -/***/ }), -/* 195 */ -/***/ (function(module, exports, __webpack_require__) { - -var dP = __webpack_require__(15); -var anObject = __webpack_require__(11); -var getKeys = __webpack_require__(196); - -module.exports = __webpack_require__(16) ? Object.defineProperties : function defineProperties(O, Properties) { - anObject(O); - var keys = getKeys(Properties); - var length = keys.length; - var i = 0; - var P; - while (length > i) dP.f(O, P = keys[i++], Properties[P]); - return O; -}; - - -/***/ }), -/* 196 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.14 / 15.2.3.14 Object.keys(O) -var $keys = __webpack_require__(197); -var enumBugKeys = __webpack_require__(104); - -module.exports = Object.keys || function keys(O) { - return $keys(O, enumBugKeys); -}; - - -/***/ }), -/* 197 */ -/***/ (function(module, exports, __webpack_require__) { - -var has = __webpack_require__(27); -var toIObject = __webpack_require__(59); -var arrayIndexOf = __webpack_require__(198)(false); -var IE_PROTO = __webpack_require__(61)('IE_PROTO'); - -module.exports = function (object, names) { - var O = toIObject(object); - var i = 0; - var result = []; - var key; - for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while (names.length > i) if (has(O, key = names[i++])) { - ~arrayIndexOf(result, key) || result.push(key); - } - return result; -}; - - -/***/ }), -/* 198 */ -/***/ (function(module, exports, __webpack_require__) { - -// false -> Array#indexOf -// true -> Array#includes -var toIObject = __webpack_require__(59); -var toLength = __webpack_require__(60); -var toAbsoluteIndex = __webpack_require__(199); -module.exports = function (IS_INCLUDES) { - return function ($this, el, fromIndex) { - var O = toIObject($this); - var length = toLength(O.length); - var index = toAbsoluteIndex(fromIndex, length); - var value; - // Array#includes uses SameValueZero equality algorithm - // eslint-disable-next-line no-self-compare - if (IS_INCLUDES && el != el) while (length > index) { - value = O[index++]; - // eslint-disable-next-line no-self-compare - if (value != value) return true; - // Array#indexOf ignores holes, Array#includes - not - } else for (;length > index; index++) if (IS_INCLUDES || index in O) { - if (O[index] === el) return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; - - -/***/ }), -/* 199 */ -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__(54); -var max = Math.max; -var min = Math.min; -module.exports = function (index, length) { - index = toInteger(index); - return index < 0 ? max(index + length, 0) : min(index, length); -}; - - -/***/ }), -/* 200 */ -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) -var has = __webpack_require__(27); -var toObject = __webpack_require__(106); -var IE_PROTO = __webpack_require__(61)('IE_PROTO'); -var ObjectProto = Object.prototype; - -module.exports = Object.getPrototypeOf || function (O) { - O = toObject(O); - if (has(O, IE_PROTO)) return O[IE_PROTO]; - if (typeof O.constructor == 'function' && O instanceof O.constructor) { - return O.constructor.prototype; - } return O instanceof Object ? ObjectProto : null; -}; - - -/***/ }), -/* 201 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var addToUnscopables = __webpack_require__(202); -var step = __webpack_require__(107); -var Iterators = __webpack_require__(28); -var toIObject = __webpack_require__(59); - -// 22.1.3.4 Array.prototype.entries() -// 22.1.3.13 Array.prototype.keys() -// 22.1.3.29 Array.prototype.values() -// 22.1.3.30 Array.prototype[@@iterator]() -module.exports = __webpack_require__(56)(Array, 'Array', function (iterated, kind) { - this._t = toIObject(iterated); // target - this._i = 0; // next index - this._k = kind; // kind -// 22.1.5.2.1 %ArrayIteratorPrototype%.next() -}, function () { - var O = this._t; - var kind = this._k; - var index = this._i++; - if (!O || index >= O.length) { - this._t = undefined; - return step(1); - } - if (kind == 'keys') return step(0, index); - if (kind == 'values') return step(0, O[index]); - return step(0, [index, O[index]]); -}, 'values'); - -// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) -Iterators.Arguments = Iterators.Array; - -addToUnscopables('keys'); -addToUnscopables('values'); -addToUnscopables('entries'); - - -/***/ }), -/* 202 */ -/***/ (function(module, exports) { - -module.exports = function () { /* empty */ }; - - -/***/ }), -/* 203 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var LIBRARY = __webpack_require__(57); -var global = __webpack_require__(2); -var ctx = __webpack_require__(13); -var classof = __webpack_require__(64); -var $export = __webpack_require__(10); -var isObject = __webpack_require__(9); -var aFunction = __webpack_require__(26); -var anInstance = __webpack_require__(65); -var forOf = __webpack_require__(30); -var speciesConstructor = __webpack_require__(109); -var task = __webpack_require__(110).set; -var microtask = __webpack_require__(207)(); -var newPromiseCapabilityModule = __webpack_require__(66); -var perform = __webpack_require__(111); -var userAgent = __webpack_require__(208); -var promiseResolve = __webpack_require__(112); -var PROMISE = 'Promise'; -var TypeError = global.TypeError; -var process = global.process; -var versions = process && process.versions; -var v8 = versions && versions.v8 || ''; -var $Promise = global[PROMISE]; -var isNode = classof(process) == 'process'; -var empty = function () { /* empty */ }; -var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper; -var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f; - -var USE_NATIVE = !!function () { - try { - // correct subclassing with @@species support - var promise = $Promise.resolve(1); - var FakePromise = (promise.constructor = {})[__webpack_require__(4)('species')] = function (exec) { - exec(empty, empty); - }; - // unhandled rejections tracking support, NodeJS Promise without it fails @@species test - return (isNode || typeof PromiseRejectionEvent == 'function') - && promise.then(empty) instanceof FakePromise - // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables - // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 - // we can't detect it synchronously, so just check versions - && v8.indexOf('6.6') !== 0 - && userAgent.indexOf('Chrome/66') === -1; - } catch (e) { /* empty */ } -}(); - -// helpers -var isThenable = function (it) { - var then; - return isObject(it) && typeof (then = it.then) == 'function' ? then : false; -}; -var notify = function (promise, isReject) { - if (promise._n) return; - promise._n = true; - var chain = promise._c; - microtask(function () { - var value = promise._v; - var ok = promise._s == 1; - var i = 0; - var run = function (reaction) { - var handler = ok ? reaction.ok : reaction.fail; - var resolve = reaction.resolve; - var reject = reaction.reject; - var domain = reaction.domain; - var result, then, exited; - try { - if (handler) { - if (!ok) { - if (promise._h == 2) onHandleUnhandled(promise); - promise._h = 1; - } - if (handler === true) result = value; - else { - if (domain) domain.enter(); - result = handler(value); // may throw - if (domain) { - domain.exit(); - exited = true; - } - } - if (result === reaction.promise) { - reject(TypeError('Promise-chain cycle')); - } else if (then = isThenable(result)) { - then.call(result, resolve, reject); - } else resolve(result); - } else reject(value); - } catch (e) { - if (domain && !exited) domain.exit(); - reject(e); - } - }; - while (chain.length > i) run(chain[i++]); // variable length - can't use forEach - promise._c = []; - promise._n = false; - if (isReject && !promise._h) onUnhandled(promise); - }); -}; -var onUnhandled = function (promise) { - task.call(global, function () { - var value = promise._v; - var unhandled = isUnhandled(promise); - var result, handler, console; - if (unhandled) { - result = perform(function () { - if (isNode) { - process.emit('unhandledRejection', value, promise); - } else if (handler = global.onunhandledrejection) { - handler({ promise: promise, reason: value }); - } else if ((console = global.console) && console.error) { - console.error('Unhandled promise rejection', value); - } - }); - // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should - promise._h = isNode || isUnhandled(promise) ? 2 : 1; - } promise._a = undefined; - if (unhandled && result.e) throw result.v; - }); -}; -var isUnhandled = function (promise) { - return promise._h !== 1 && (promise._a || promise._c).length === 0; -}; -var onHandleUnhandled = function (promise) { - task.call(global, function () { - var handler; - if (isNode) { - process.emit('rejectionHandled', promise); - } else if (handler = global.onrejectionhandled) { - handler({ promise: promise, reason: promise._v }); - } - }); -}; -var $reject = function (value) { - var promise = this; - if (promise._d) return; - promise._d = true; - promise = promise._w || promise; // unwrap - promise._v = value; - promise._s = 2; - if (!promise._a) promise._a = promise._c.slice(); - notify(promise, true); -}; -var $resolve = function (value) { - var promise = this; - var then; - if (promise._d) return; - promise._d = true; - promise = promise._w || promise; // unwrap - try { - if (promise === value) throw TypeError("Promise can't be resolved itself"); - if (then = isThenable(value)) { - microtask(function () { - var wrapper = { _w: promise, _d: false }; // wrap - try { - then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); - } catch (e) { - $reject.call(wrapper, e); - } - }); - } else { - promise._v = value; - promise._s = 1; - notify(promise, false); - } - } catch (e) { - $reject.call({ _w: promise, _d: false }, e); // wrap - } -}; - -// constructor polyfill -if (!USE_NATIVE) { - // 25.4.3.1 Promise(executor) - $Promise = function Promise(executor) { - anInstance(this, $Promise, PROMISE, '_h'); - aFunction(executor); - Internal.call(this); - try { - executor(ctx($resolve, this, 1), ctx($reject, this, 1)); - } catch (err) { - $reject.call(this, err); - } - }; - // eslint-disable-next-line no-unused-vars - Internal = function Promise(executor) { - this._c = []; // <- awaiting reactions - this._a = undefined; // <- checked in isUnhandled reactions - this._s = 0; // <- state - this._d = false; // <- done - this._v = undefined; // <- value - this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled - this._n = false; // <- notify - }; - Internal.prototype = __webpack_require__(67)($Promise.prototype, { - // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) - then: function then(onFulfilled, onRejected) { - var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); - reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; - reaction.fail = typeof onRejected == 'function' && onRejected; - reaction.domain = isNode ? process.domain : undefined; - this._c.push(reaction); - if (this._a) this._a.push(reaction); - if (this._s) notify(this, false); - return reaction.promise; - }, - // 25.4.5.1 Promise.prototype.catch(onRejected) - 'catch': function (onRejected) { - return this.then(undefined, onRejected); - } - }); - OwnPromiseCapability = function () { - var promise = new Internal(); - this.promise = promise; - this.resolve = ctx($resolve, promise, 1); - this.reject = ctx($reject, promise, 1); - }; - newPromiseCapabilityModule.f = newPromiseCapability = function (C) { - return C === $Promise || C === Wrapper - ? new OwnPromiseCapability(C) - : newGenericPromiseCapability(C); - }; -} - -$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise }); -__webpack_require__(45)($Promise, PROMISE); -__webpack_require__(113)(PROMISE); -Wrapper = __webpack_require__(6)[PROMISE]; - -// statics -$export($export.S + $export.F * !USE_NATIVE, PROMISE, { - // 25.4.4.5 Promise.reject(r) - reject: function reject(r) { - var capability = newPromiseCapability(this); - var $$reject = capability.reject; - $$reject(r); - return capability.promise; - } -}); -$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { - // 25.4.4.6 Promise.resolve(x) - resolve: function resolve(x) { - return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x); - } -}); -$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(209)(function (iter) { - $Promise.all(iter)['catch'](empty); -})), PROMISE, { - // 25.4.4.1 Promise.all(iterable) - all: function all(iterable) { - var C = this; - var capability = newPromiseCapability(C); - var resolve = capability.resolve; - var reject = capability.reject; - var result = perform(function () { - var values = []; - var index = 0; - var remaining = 1; - forOf(iterable, false, function (promise) { - var $index = index++; - var alreadyCalled = false; - values.push(undefined); - remaining++; - C.resolve(promise).then(function (value) { - if (alreadyCalled) return; - alreadyCalled = true; - values[$index] = value; - --remaining || resolve(values); - }, reject); - }); - --remaining || resolve(values); - }); - if (result.e) reject(result.v); - return capability.promise; - }, - // 25.4.4.4 Promise.race(iterable) - race: function race(iterable) { - var C = this; - var capability = newPromiseCapability(C); - var reject = capability.reject; - var result = perform(function () { - forOf(iterable, false, function (promise) { - C.resolve(promise).then(capability.resolve, reject); - }); - }); - if (result.e) reject(result.v); - return capability.promise; - } -}); - - -/***/ }), -/* 204 */ -/***/ (function(module, exports, __webpack_require__) { - -// call something on iterator step with safe closing on error -var anObject = __webpack_require__(11); -module.exports = function (iterator, fn, value, entries) { - try { - return entries ? fn(anObject(value)[0], value[1]) : fn(value); - // 7.4.6 IteratorClose(iterator, completion) - } catch (e) { - var ret = iterator['return']; - if (ret !== undefined) anObject(ret.call(iterator)); - throw e; - } -}; - - -/***/ }), -/* 205 */ -/***/ (function(module, exports, __webpack_require__) { - -// check on default Array iterator -var Iterators = __webpack_require__(28); -var ITERATOR = __webpack_require__(4)('iterator'); -var ArrayProto = Array.prototype; - -module.exports = function (it) { - return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); -}; - - -/***/ }), -/* 206 */ -/***/ (function(module, exports) { - -// fast apply, http://jsperf.lnkit.com/fast-apply/5 -module.exports = function (fn, args, that) { - var un = that === undefined; - switch (args.length) { - case 0: return un ? fn() - : fn.call(that); - case 1: return un ? fn(args[0]) - : fn.call(that, args[0]); - case 2: return un ? fn(args[0], args[1]) - : fn.call(that, args[0], args[1]); - case 3: return un ? fn(args[0], args[1], args[2]) - : fn.call(that, args[0], args[1], args[2]); - case 4: return un ? fn(args[0], args[1], args[2], args[3]) - : fn.call(that, args[0], args[1], args[2], args[3]); - } return fn.apply(that, args); -}; - - -/***/ }), -/* 207 */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(2); -var macrotask = __webpack_require__(110).set; -var Observer = global.MutationObserver || global.WebKitMutationObserver; -var process = global.process; -var Promise = global.Promise; -var isNode = __webpack_require__(29)(process) == 'process'; - -module.exports = function () { - var head, last, notify; - - var flush = function () { - var parent, fn; - if (isNode && (parent = process.domain)) parent.exit(); - while (head) { - fn = head.fn; - head = head.next; - try { - fn(); - } catch (e) { - if (head) notify(); - else last = undefined; - throw e; - } - } last = undefined; - if (parent) parent.enter(); - }; - - // Node.js - if (isNode) { - notify = function () { - process.nextTick(flush); - }; - // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339 - } else if (Observer && !(global.navigator && global.navigator.standalone)) { - var toggle = true; - var node = document.createTextNode(''); - new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new - notify = function () { - node.data = toggle = !toggle; - }; - // environments with maybe non-completely correct, but existent Promise - } else if (Promise && Promise.resolve) { - // Promise.resolve without an argument throws an error in LG WebOS 2 - var promise = Promise.resolve(undefined); - notify = function () { - promise.then(flush); - }; - // for other environments - macrotask based on: - // - setImmediate - // - MessageChannel - // - window.postMessag - // - onreadystatechange - // - setTimeout - } else { - notify = function () { - // strange IE + webpack dev server bug - use .call(global) - macrotask.call(global, flush); - }; - } - - return function (fn) { - var task = { fn: fn, next: undefined }; - if (last) last.next = task; - if (!head) { - head = task; - notify(); - } last = task; - }; -}; - - -/***/ }), -/* 208 */ -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__(2); -var navigator = global.navigator; - -module.exports = navigator && navigator.userAgent || ''; - - -/***/ }), -/* 209 */ -/***/ (function(module, exports, __webpack_require__) { - -var ITERATOR = __webpack_require__(4)('iterator'); -var SAFE_CLOSING = false; - -try { - var riter = [7][ITERATOR](); - riter['return'] = function () { SAFE_CLOSING = true; }; - // eslint-disable-next-line no-throw-literal - Array.from(riter, function () { throw 2; }); -} catch (e) { /* empty */ } - -module.exports = function (exec, skipClosing) { - if (!skipClosing && !SAFE_CLOSING) return false; - var safe = false; - try { - var arr = [7]; - var iter = arr[ITERATOR](); - iter.next = function () { return { done: safe = true }; }; - arr[ITERATOR] = function () { return iter; }; - exec(arr); - } catch (e) { /* empty */ } - return safe; -}; - - -/***/ }), -/* 210 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -// https://github.com/tc39/proposal-promise-finally - -var $export = __webpack_require__(10); -var core = __webpack_require__(6); -var global = __webpack_require__(2); -var speciesConstructor = __webpack_require__(109); -var promiseResolve = __webpack_require__(112); - -$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) { - var C = speciesConstructor(this, core.Promise || global.Promise); - var isFunction = typeof onFinally == 'function'; - return this.then( - isFunction ? function (x) { - return promiseResolve(C, onFinally()).then(function () { return x; }); - } : onFinally, - isFunction ? function (e) { - return promiseResolve(C, onFinally()).then(function () { throw e; }); - } : onFinally - ); -} }); - - -/***/ }), -/* 211 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// https://github.com/tc39/proposal-promise-try -var $export = __webpack_require__(10); -var newPromiseCapability = __webpack_require__(66); -var perform = __webpack_require__(111); - -$export($export.S, 'Promise', { 'try': function (callbackfn) { - var promiseCapability = newPromiseCapability.f(this); - var result = perform(callbackfn); - (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v); - return promiseCapability.promise; -} }); - - -/***/ }), -/* 212 */ -/***/ (function(module, exports) { - -module.exports = require("child_process"); - -/***/ }), -/* 213 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(63); -__webpack_require__(53); -module.exports = __webpack_require__(214); - - -/***/ }), -/* 214 */ -/***/ (function(module, exports, __webpack_require__) { - -var anObject = __webpack_require__(11); -var get = __webpack_require__(108); -module.exports = __webpack_require__(6).getIterator = function (it) { - var iterFn = get(it); - if (typeof iterFn != 'function') throw TypeError(it + ' is not iterable!'); - return anObject(iterFn.call(it)); -}; - - -/***/ }), -/* 215 */ -/***/ (function(module, exports, __webpack_require__) { - -//filter will reemit the data if cb(err,pass) pass is truthy - -// reduce is more tricky -// maybe we want to group the reductions or emit progress updates occasionally -// the most basic reduce just emits one 'data' event after it has recieved 'end' - -var Stream = __webpack_require__(1).Stream - , es = exports - , through = __webpack_require__(71) - , from = __webpack_require__(216) - , duplex = __webpack_require__(115) - , map = __webpack_require__(217) - , pause = __webpack_require__(218) - , split = __webpack_require__(219) - , pipeline = __webpack_require__(220) - , immediately = global.setImmediate || process.nextTick; - -es.Stream = Stream //re-export Stream from core -es.through = through -es.from = from -es.duplex = duplex -es.map = map -es.pause = pause -es.split = split -es.pipeline = es.connect = es.pipe = pipeline -// merge / concat -// -// combine multiple streams into a single stream. -// will emit end only once - -es.concat = //actually this should be called concat -es.merge = function (/*streams...*/) { - var toMerge = [].slice.call(arguments) - if (toMerge.length === 1 && (toMerge[0] instanceof Array)) { - toMerge = toMerge[0] //handle array as arguments object - } - var stream = new Stream() - stream.setMaxListeners(0) // allow adding more than 11 streams - var endCount = 0 - stream.writable = stream.readable = true - - if (toMerge.length) { - toMerge.forEach(function (e) { - e.pipe(stream, {end: false}) - var ended = false - e.on('end', function () { - if(ended) return - ended = true - endCount ++ - if(endCount == toMerge.length) - stream.emit('end') - }) - }) - } else { - process.nextTick(function () { - stream.emit('end') - }) - } - - stream.write = function (data) { - this.emit('data', data) - } - stream.destroy = function () { - toMerge.forEach(function (e) { - if(e.destroy) e.destroy() - }) - } - return stream -} - - -// writable stream, collects all events into an array -// and calls back when 'end' occurs -// mainly I'm using this to test the other functions - -es.writeArray = function (done) { - if ('function' !== typeof done) - throw new Error('function writeArray (done): done must be function') - - var a = new Stream () - , array = [], isDone = false - a.write = function (l) { - array.push(l) - } - a.end = function () { - isDone = true - done(null, array) - } - a.writable = true - a.readable = false - a.destroy = function () { - a.writable = a.readable = false - if(isDone) return - done(new Error('destroyed before end'), array) - } - return a -} - -//return a Stream that reads the properties of an object -//respecting pause() and resume() - -es.readArray = function (array) { - var stream = new Stream() - , i = 0 - , paused = false - , ended = false - - stream.readable = true - stream.writable = false - - if(!Array.isArray(array)) - throw new Error('event-stream.read expects an array') - - stream.resume = function () { - if(ended) return - paused = false - var l = array.length - while(i < l && !paused && !ended) { - stream.emit('data', array[i++]) - } - if(i == l && !ended) - ended = true, stream.readable = false, stream.emit('end') - } - process.nextTick(stream.resume) - stream.pause = function () { - paused = true - } - stream.destroy = function () { - ended = true - stream.emit('close') - } - return stream -} - -// -// readable (asyncFunction) -// return a stream that calls an async function while the stream is not paused. -// -// the function must take: (count, callback) {... -// - -es.readable = -function (func, continueOnError) { - var stream = new Stream() - , i = 0 - , paused = false - , ended = false - , reading = false - - stream.readable = true - stream.writable = false - - if('function' !== typeof func) - throw new Error('event-stream.readable expects async function') - - stream.on('end', function () { ended = true }) - - function get (err, data) { - - if(err) { - stream.emit('error', err) - if(!continueOnError) stream.emit('end') - } else if (arguments.length > 1) - stream.emit('data', data) - - immediately(function () { - if(ended || paused || reading) return - try { - reading = true - func.call(stream, i++, function () { - reading = false - get.apply(null, arguments) - }) - } catch (err) { - stream.emit('error', err) - } - }) - } - stream.resume = function () { - paused = false - get() - } - process.nextTick(get) - stream.pause = function () { - paused = true - } - stream.destroy = function () { - stream.emit('end') - stream.emit('close') - ended = true - } - return stream -} - - -// -// map sync -// - -es.mapSync = function (sync) { - return es.through(function write(data) { - var mappedData - try { - mappedData = sync(data) - } catch (err) { - return this.emit('error', err) - } - if (mappedData !== undefined) - this.emit('data', mappedData) - }) -} - -// -// log just print out what is coming through the stream, for debugging -// - -es.log = function (name) { - return es.through(function (data) { - var args = [].slice.call(arguments) - if(name) console.error(name, data) - else console.error(data) - this.emit('data', data) - }) -} - - -// -// child -- pipe through a child process -// - -es.child = function (child) { - - return es.duplex(child.stdin, child.stdout) - -} - -// -// parse -// -// must be used after es.split() to ensure that each chunk represents a line -// source.pipe(es.split()).pipe(es.parse()) - -es.parse = function (options) { - var emitError = !!(options ? options.error : false) - return es.through(function (data) { - var obj - try { - if(data) //ignore empty lines - obj = JSON.parse(data.toString()) - } catch (err) { - if (emitError) - return this.emit('error', err) - return console.error(err, 'attempting to parse:', data) - } - //ignore lines that where only whitespace. - if(obj !== undefined) - this.emit('data', obj) - }) -} -// -// stringify -// - -es.stringify = function () { - var Buffer = __webpack_require__(3).Buffer - return es.mapSync(function (e){ - return JSON.stringify(Buffer.isBuffer(e) ? e.toString() : e) + '\n' - }) -} - -// -// replace a string within a stream. -// -// warn: just concatenates the string and then does str.split().join(). -// probably not optimal. -// for smallish responses, who cares? -// I need this for shadow-npm so it's only relatively small json files. - -es.replace = function (from, to) { - return es.pipeline(es.split(from), es.join(to)) -} - -// -// join chunks with a joiner. just like Array#join -// also accepts a callback that is passed the chunks appended together -// this is still supported for legacy reasons. -// - -es.join = function (str) { - - //legacy api - if('function' === typeof str) - return es.wait(str) - - var first = true - return es.through(function (data) { - if(!first) - this.emit('data', str) - first = false - this.emit('data', data) - return true - }) -} - - -// -// wait. callback when 'end' is emitted, with all chunks appended as string. -// - -es.wait = function (callback) { - var arr = [] - return es.through(function (data) { arr.push(data) }, - function () { - var body = Buffer.isBuffer(arr[0]) ? Buffer.concat(arr) - : arr.join('') - this.emit('data', body) - this.emit('end') - if(callback) callback(null, body) - }) -} - -es.pipeable = function () { - throw new Error('[EVENT-STREAM] es.pipeable is deprecated') -} - - -/***/ }), -/* 216 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - - -var Stream = __webpack_require__(1) - -// from -// -// a stream that reads from an source. -// source may be an array, or a function. -// from handles pause behaviour for you. - -module.exports = -function from (source) { - if(Array.isArray(source)) { - var source_index = 0, source_len = source.length; - return from (function (i) { - if(source_index < source_len) - this.emit('data', source[source_index++]) - else - this.emit('end') - return true - }) - } - var s = new Stream(), i = 0 - s.ended = false - s.started = false - s.readable = true - s.writable = false - s.paused = false - s.ended = false - s.pause = function () { - s.started = true - s.paused = true - } - function next () { - s.started = true - if(s.ended) return - while(!s.ended && !s.paused && source.call(s, i++, function () { - if(!s.ended && !s.paused) - process.nextTick(next); - })) - ; - } - s.resume = function () { - s.started = true - s.paused = false - next() - } - s.on('end', function () { - s.ended = true - s.readable = false - process.nextTick(s.destroy) - }) - s.destroy = function () { - s.ended = true - s.emit('close') - } - /* - by default, the stream will start emitting at nextTick - if you want, you can pause it, after pipeing. - you can also resume before next tick, and that will also - work. - */ - process.nextTick(function () { - if(!s.started) s.resume() - }) - return s -} - - -/***/ }), -/* 217 */ -/***/ (function(module, exports, __webpack_require__) { - -//filter will reemit the data if cb(err,pass) pass is truthy - -// reduce is more tricky -// maybe we want to group the reductions or emit progress updates occasionally -// the most basic reduce just emits one 'data' event after it has recieved 'end' - - -var Stream = __webpack_require__(1).Stream - - -//create an event stream and apply function to each .write -//emitting each response as data -//unless it's an empty callback - -module.exports = function (mapper, opts) { - - var stream = new Stream() - , self = this - , inputs = 0 - , outputs = 0 - , ended = false - , paused = false - , destroyed = false - , lastWritten = 0 - , inNext = false - - this.opts = opts || {}; - var errorEventName = this.opts.failures ? 'failure' : 'error'; - - // Items that are not ready to be written yet (because they would come out of - // order) get stuck in a queue for later. - var writeQueue = {} - - stream.writable = true - stream.readable = true - - function queueData (data, number) { - var nextToWrite = lastWritten + 1 - - if (number === nextToWrite) { - // If it's next, and its not undefined write it - if (data !== undefined) { - stream.emit.apply(stream, ['data', data]) - } - lastWritten ++ - nextToWrite ++ - } else { - // Otherwise queue it for later. - writeQueue[number] = data - } - - // If the next value is in the queue, write it - if (writeQueue.hasOwnProperty(nextToWrite)) { - var dataToWrite = writeQueue[nextToWrite] - delete writeQueue[nextToWrite] - return queueData(dataToWrite, nextToWrite) - } - - outputs ++ - if(inputs === outputs) { - if(paused) paused = false, stream.emit('drain') //written all the incoming events - if(ended) end() - } - } - - function next (err, data, number) { - if(destroyed) return - inNext = true - - if (!err || self.opts.failures) { - queueData(data, number) - } - - if (err) { - stream.emit.apply(stream, [ errorEventName, err ]); - } - - inNext = false; - } - - // Wrap the mapper function by calling its callback with the order number of - // the item in the stream. - function wrappedMapper (input, number, callback) { - return mapper.call(null, input, function(err, data){ - callback(err, data, number) - }) - } - - stream.write = function (data) { - if(ended) throw new Error('map stream is not writable') - inNext = false - inputs ++ - - try { - //catch sync errors and handle them like async errors - var written = wrappedMapper(data, inputs, next) - paused = (written === false) - return !paused - } catch (err) { - //if the callback has been called syncronously, and the error - //has occured in an listener, throw it again. - if(inNext) - throw err - next(err) - return !paused - } - } - - function end (data) { - //if end was called with args, write it, - ended = true //write will emit 'end' if ended is true - stream.writable = false - if(data !== undefined) { - return queueData(data, inputs) - } else if (inputs == outputs) { //wait for processing - stream.readable = false, stream.emit('end'), stream.destroy() - } - } - - stream.end = function (data) { - if(ended) return - end() - } - - stream.destroy = function () { - ended = destroyed = true - stream.writable = stream.readable = paused = false - process.nextTick(function () { - stream.emit('close') - }) - } - stream.pause = function () { - paused = true - } - - stream.resume = function () { - paused = false - } - - return stream -} - - - - - - -/***/ }), -/* 218 */ -/***/ (function(module, exports, __webpack_require__) { - -//through@2 handles this by default! -module.exports = __webpack_require__(71) - - - -/***/ }), -/* 219 */ -/***/ (function(module, exports, __webpack_require__) { - -//filter will reemit the data if cb(err,pass) pass is truthy - -// reduce is more tricky -// maybe we want to group the reductions or emit progress updates occasionally -// the most basic reduce just emits one 'data' event after it has recieved 'end' - - -var through = __webpack_require__(71) -var Decoder = __webpack_require__(80).StringDecoder - -module.exports = split - -//TODO pass in a function to map across the lines. - -function split (matcher, mapper, options) { - var decoder = new Decoder() - var soFar = '' - var maxLength = options && options.maxLength; - if('function' === typeof matcher) - mapper = matcher, matcher = null - if (!matcher) - matcher = /\r?\n/ - - function emit(stream, piece) { - if(mapper) { - try { - piece = mapper(piece) - } - catch (err) { - return stream.emit('error', err) - } - if('undefined' !== typeof piece) - stream.queue(piece) - } - else - stream.queue(piece) - } - - function next (stream, buffer) { - var pieces = ((soFar != null ? soFar : '') + buffer).split(matcher) - soFar = pieces.pop() - - if (maxLength && soFar.length > maxLength) - stream.emit('error', new Error('maximum buffer reached')) - - for (var i = 0; i < pieces.length; i++) { - var piece = pieces[i] - emit(stream, piece) - } - } - - return through(function (b) { - next(this, decoder.write(b)) - }, - function () { - if(decoder.end) - next(this, decoder.end()) - if(soFar != null) - emit(this, soFar) - this.queue(null) - }) -} - - - -/***/ }), -/* 220 */ -/***/ (function(module, exports, __webpack_require__) { - -var duplexer = __webpack_require__(115) - -module.exports = function () { - - var streams = [].slice.call(arguments) - , first = streams[0] - , last = streams[streams.length - 1] - , thepipe = duplexer(first, last) - - if(streams.length == 1) - return streams[0] - else if (!streams.length) - throw new Error('connect called with empty args') - - //pipe all the streams together - - function recurse (streams) { - if(streams.length < 2) - return - streams[0].pipe(streams[1]) - recurse(streams.slice(1)) - } - - recurse(streams) - - function onerror () { - var args = [].slice.call(arguments) - args.unshift('error') - thepipe.emit.apply(thepipe, args) - } - - //es.duplex already reemits the error from the first and last stream. - //add a listener for the inner streams in the pipeline. - for(var i = 1; i < streams.length - 1; i ++) - streams[i].on('error', onerror) - - return thepipe -} - - - -/***/ }), -/* 221 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _regenerator = __webpack_require__(24); - -var _regenerator2 = _interopRequireDefault(_regenerator); - -var _stringify = __webpack_require__(18); - -var _stringify2 = _interopRequireDefault(_stringify); - -var _promise = __webpack_require__(25); - -var _promise2 = _interopRequireDefault(_promise); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) { - return new (P || (P = _promise2.default))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : new P(function (resolve) { - resolve(result.value); - }).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -var express = __webpack_require__(32); -var segments_1 = __webpack_require__(70); -var analytics_1 = __webpack_require__(68); -var anomalyType_1 = __webpack_require__(19); -function sendSegments(req, res) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_regenerator2.default.mark(function _callee() { - var anomalyId, anomaly, lastSegmentId, timeFrom, timeTo, segments, payload; - return _regenerator2.default.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - try { - anomalyId = req.query.anomaly_id; - anomaly = anomalyType_1.loadAnomalyById(anomalyId); - - if (anomaly === null) { - anomalyId = anomalyType_1.getAnomalyIdByName(anomalyId); - } - lastSegmentId = req.query.last_segment; - timeFrom = req.query.from; - timeTo = req.query.to; - segments = segments_1.getLabeledSegments(anomalyId); - // Id filtering - - if (lastSegmentId !== undefined) { - segments = segments.filter(function (el) { - return el.id > lastSegmentId; - }); - } - // Time filtering - if (timeFrom !== undefined) { - segments = segments.filter(function (el) { - return el.finish > timeFrom; - }); - } - if (timeTo !== undefined) { - segments = segments.filter(function (el) { - return el.start < timeTo; - }); - } - payload = (0, _stringify2.default)({ - segments: segments - }); - - res.status(200).send(payload); - } catch (e) { - res.status(500).send({ - code: 500, - message: 'Internal error' - }); - } - - case 1: - case "end": - return _context.stop(); - } - } - }, _callee, this); - })); -} -function updateSegments(req, res) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_regenerator2.default.mark(function _callee2() { - var segmentsUpdate, anomalyId, anomalyName, addedIds, payload; - return _regenerator2.default.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - try { - segmentsUpdate = req.body; - anomalyId = segmentsUpdate.anomaly_id; - anomalyName = segmentsUpdate.name; - - if (anomalyId === undefined) { - anomalyId = anomalyType_1.getAnomalyIdByName(anomalyName.toLowerCase()); - } - addedIds = segments_1.insertSegments(anomalyId, segmentsUpdate.added_segments, true); - - segments_1.removeSegments(anomalyId, segmentsUpdate.removed_segments); - payload = (0, _stringify2.default)({ added_ids: addedIds }); - - res.status(200).send(payload); - analytics_1.runLearning(anomalyId); - } catch (e) { - res.status(500).send({ - code: 500, - message: 'Internal error' - }); - } - - case 1: - case "end": - return _context2.stop(); - } - } - }, _callee2, this); - })); -} -exports.router = express.Router(); -exports.router.get('/', sendSegments); -exports.router.patch('/', updateSegments); - -/***/ }), -/* 222 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { value: true }); -var express = __webpack_require__(32); -var anomalyType_1 = __webpack_require__(19); -var alerts_1 = __webpack_require__(223); -function getAlert(req, res) { - try { - var anomalyId = req.query.anomaly_id; - var anomaly = anomalyType_1.loadAnomalyById(anomalyId); - if (anomaly == null) { - anomalyId = anomalyType_1.getAnomalyIdByName(anomalyId.toLowerCase()); - } - var alertsAnomalies = alerts_1.getAlertsAnomalies(); - var pos = alertsAnomalies.indexOf(anomalyId); - var enable = pos !== -1; - res.status(200).send({ - enable: enable - }); - } catch (e) { - res.status(500).send({ - code: 500, - message: 'Internal error' - }); - } -} -function changeAlert(req, res) { - try { - var anomalyId = req.body.anomaly_id; - var enable = req.body.enable; - var anomaly = anomalyType_1.loadAnomalyById(anomalyId); - if (anomaly == null) { - anomalyId = anomalyType_1.getAnomalyIdByName(anomalyId.toLowerCase()); - } - var alertsAnomalies = alerts_1.getAlertsAnomalies(); - var pos = alertsAnomalies.indexOf(anomalyId); - if (enable && pos == -1) { - alertsAnomalies.push(anomalyId); - alerts_1.saveAlertsAnomalies(alertsAnomalies); - } else if (!enable && pos > -1) { - alertsAnomalies.splice(pos, 1); - alerts_1.saveAlertsAnomalies(alertsAnomalies); - } - res.status(200).send({ - status: 'Ok' - }); - } catch (e) { - res.status(500).send({ - code: 500, - message: 'Internal error' - }); - } -} -exports.router = express.Router(); -exports.router.get('/', getAlert); -exports.router.post('/', changeAlert); - -/***/ }), -/* 223 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _set = __webpack_require__(224); - -var _set2 = _interopRequireDefault(_set); - -var _regenerator = __webpack_require__(24); - -var _regenerator2 = _interopRequireDefault(_regenerator); - -var _getIterator2 = __webpack_require__(69); - -var _getIterator3 = _interopRequireDefault(_getIterator2); - -var _promise = __webpack_require__(25); - -var _promise2 = _interopRequireDefault(_promise); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) { - return new (P || (P = _promise2.default))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : new P(function (resolve) { - resolve(result.value); - }).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -var json_1 = __webpack_require__(46); -var path = __webpack_require__(0); -var fs = __webpack_require__(8); -var config_1 = __webpack_require__(31); -var analytics_1 = __webpack_require__(68); -var notification_1 = __webpack_require__(240); -var segments_1 = __webpack_require__(70); -function getAlertsAnomalies() { - var filename = path.join(config_1.ANOMALIES_PATH, "alerts_anomalies.json"); - if (!fs.existsSync(filename)) { - saveAlertsAnomalies([]); - } - return json_1.getJsonDataSync(path.join(config_1.ANOMALIES_PATH, "alerts_anomalies.json")); -} -exports.getAlertsAnomalies = getAlertsAnomalies; -function saveAlertsAnomalies(anomalies) { - return json_1.writeJsonDataSync(path.join(config_1.ANOMALIES_PATH, "alerts_anomalies.json"), anomalies); -} -exports.saveAlertsAnomalies = saveAlertsAnomalies; -function processAlerts(anomalyId) { - var segments = segments_1.getLabeledSegments(anomalyId); - var currentTime = new Date().getTime(); - var activeAlert = false; - var newActiveAlert = false; - if (segments.length > 0) { - var lastSegment = segments[segments.length - 1]; - if (lastSegment.finish >= currentTime - alertTimeout) { - newActiveAlert = true; - } - } - console.log(activeAlert); - newActiveAlert = true; - if (!activeAlert && newActiveAlert) { - activeAlerts.add(anomalyId); - notification_1.sendNotification(anomalyId, true); - } else if (activeAlert && !newActiveAlert) { - activeAlerts.delete(anomalyId); - notification_1.sendNotification(anomalyId, false); - } -} -function alertsTick() { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_regenerator2.default.mark(function _callee() { - var alertsAnomalies, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, anomalyId; - - return _regenerator2.default.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - alertsAnomalies = getAlertsAnomalies(); - _iteratorNormalCompletion = true; - _didIteratorError = false; - _iteratorError = undefined; - _context.prev = 4; - _iterator = (0, _getIterator3.default)(alertsAnomalies); - - case 6: - if (_iteratorNormalCompletion = (_step = _iterator.next()).done) { - _context.next = 20; - break; - } - - anomalyId = _step.value; - _context.prev = 8; - _context.next = 11; - return analytics_1.runPredict(anomalyId); - - case 11: - processAlerts(anomalyId); - _context.next = 17; - break; - - case 14: - _context.prev = 14; - _context.t0 = _context["catch"](8); - - console.error(_context.t0); - - case 17: - _iteratorNormalCompletion = true; - _context.next = 6; - break; - - case 20: - _context.next = 26; - break; - - case 22: - _context.prev = 22; - _context.t1 = _context["catch"](4); - _didIteratorError = true; - _iteratorError = _context.t1; - - case 26: - _context.prev = 26; - _context.prev = 27; - - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - - case 29: - _context.prev = 29; - - if (!_didIteratorError) { - _context.next = 32; - break; - } - - throw _iteratorError; - - case 32: - return _context.finish(29); - - case 33: - return _context.finish(26); - - case 34: - setTimeout(alertsTick, 5000); - - case 35: - case "end": - return _context.stop(); - } - } - }, _callee, this, [[4, 22, 26, 34], [8, 14], [27,, 29, 33]]); - })); -} -var alertTimeout = 60000; // ms -var activeAlerts = new _set2.default(); -setTimeout(alertsTick, 5000); - -/***/ }), -/* 224 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__(225), __esModule: true }; - -/***/ }), -/* 225 */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__(99); -__webpack_require__(53); -__webpack_require__(63); -__webpack_require__(226); -__webpack_require__(233); -__webpack_require__(236); -__webpack_require__(238); -module.exports = __webpack_require__(6).Set; - - -/***/ }), -/* 226 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var strong = __webpack_require__(227); -var validate = __webpack_require__(117); -var SET = 'Set'; - -// 23.2 Set Objects -module.exports = __webpack_require__(228)(SET, function (get) { - return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); }; -}, { - // 23.2.3.1 Set.prototype.add(value) - add: function add(value) { - return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value); - } -}, strong); - - -/***/ }), -/* 227 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var dP = __webpack_require__(15).f; -var create = __webpack_require__(101); -var redefineAll = __webpack_require__(67); -var ctx = __webpack_require__(13); -var anInstance = __webpack_require__(65); -var forOf = __webpack_require__(30); -var $iterDefine = __webpack_require__(56); -var step = __webpack_require__(107); -var setSpecies = __webpack_require__(113); -var DESCRIPTORS = __webpack_require__(16); -var fastKey = __webpack_require__(116).fastKey; -var validate = __webpack_require__(117); -var SIZE = DESCRIPTORS ? '_s' : 'size'; - -var getEntry = function (that, key) { - // fast case - var index = fastKey(key); - var entry; - if (index !== 'F') return that._i[index]; - // frozen object case - for (entry = that._f; entry; entry = entry.n) { - if (entry.k == key) return entry; - } -}; - -module.exports = { - getConstructor: function (wrapper, NAME, IS_MAP, ADDER) { - var C = wrapper(function (that, iterable) { - anInstance(that, C, NAME, '_i'); - that._t = NAME; // collection type - that._i = create(null); // index - that._f = undefined; // first entry - that._l = undefined; // last entry - that[SIZE] = 0; // size - if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); - }); - redefineAll(C.prototype, { - // 23.1.3.1 Map.prototype.clear() - // 23.2.3.2 Set.prototype.clear() - clear: function clear() { - for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) { - entry.r = true; - if (entry.p) entry.p = entry.p.n = undefined; - delete data[entry.i]; - } - that._f = that._l = undefined; - that[SIZE] = 0; - }, - // 23.1.3.3 Map.prototype.delete(key) - // 23.2.3.4 Set.prototype.delete(value) - 'delete': function (key) { - var that = validate(this, NAME); - var entry = getEntry(that, key); - if (entry) { - var next = entry.n; - var prev = entry.p; - delete that._i[entry.i]; - entry.r = true; - if (prev) prev.n = next; - if (next) next.p = prev; - if (that._f == entry) that._f = next; - if (that._l == entry) that._l = prev; - that[SIZE]--; - } return !!entry; - }, - // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) - // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) - forEach: function forEach(callbackfn /* , that = undefined */) { - validate(this, NAME); - var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3); - var entry; - while (entry = entry ? entry.n : this._f) { - f(entry.v, entry.k, this); - // revert to the last existing entry - while (entry && entry.r) entry = entry.p; - } - }, - // 23.1.3.7 Map.prototype.has(key) - // 23.2.3.7 Set.prototype.has(value) - has: function has(key) { - return !!getEntry(validate(this, NAME), key); - } - }); - if (DESCRIPTORS) dP(C.prototype, 'size', { - get: function () { - return validate(this, NAME)[SIZE]; - } - }); - return C; - }, - def: function (that, key, value) { - var entry = getEntry(that, key); - var prev, index; - // change existing entry - if (entry) { - entry.v = value; - // create new entry - } else { - that._l = entry = { - i: index = fastKey(key, true), // <- index - k: key, // <- key - v: value, // <- value - p: prev = that._l, // <- previous entry - n: undefined, // <- next entry - r: false // <- removed - }; - if (!that._f) that._f = entry; - if (prev) prev.n = entry; - that[SIZE]++; - // add to index - if (index !== 'F') that._i[index] = entry; - } return that; - }, - getEntry: getEntry, - setStrong: function (C, NAME, IS_MAP) { - // add .keys, .values, .entries, [@@iterator] - // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 - $iterDefine(C, NAME, function (iterated, kind) { - this._t = validate(iterated, NAME); // target - this._k = kind; // kind - this._l = undefined; // previous - }, function () { - var that = this; - var kind = that._k; - var entry = that._l; - // revert to the last existing entry - while (entry && entry.r) entry = entry.p; - // get next entry - if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) { - // or finish the iteration - that._t = undefined; - return step(1); - } - // return step by kind - if (kind == 'keys') return step(0, entry.k); - if (kind == 'values') return step(0, entry.v); - return step(0, [entry.k, entry.v]); - }, IS_MAP ? 'entries' : 'values', !IS_MAP, true); - - // add [@@species], 23.1.2.2, 23.2.2.2 - setSpecies(NAME); - } -}; - - -/***/ }), -/* 228 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var global = __webpack_require__(2); -var $export = __webpack_require__(10); -var meta = __webpack_require__(116); -var fails = __webpack_require__(44); -var hide = __webpack_require__(14); -var redefineAll = __webpack_require__(67); -var forOf = __webpack_require__(30); -var anInstance = __webpack_require__(65); -var isObject = __webpack_require__(9); -var setToStringTag = __webpack_require__(45); -var dP = __webpack_require__(15).f; -var each = __webpack_require__(229)(0); -var DESCRIPTORS = __webpack_require__(16); - -module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { - var Base = global[NAME]; - var C = Base; - var ADDER = IS_MAP ? 'set' : 'add'; - var proto = C && C.prototype; - var O = {}; - if (!DESCRIPTORS || typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () { - new C().entries().next(); - }))) { - // create collection constructor - C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); - redefineAll(C.prototype, methods); - meta.NEED = true; - } else { - C = wrapper(function (target, iterable) { - anInstance(target, C, NAME, '_c'); - target._c = new Base(); - if (iterable != undefined) forOf(iterable, IS_MAP, target[ADDER], target); - }); - each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','), function (KEY) { - var IS_ADDER = KEY == 'add' || KEY == 'set'; - if (KEY in proto && !(IS_WEAK && KEY == 'clear')) hide(C.prototype, KEY, function (a, b) { - anInstance(this, C, KEY); - if (!IS_ADDER && IS_WEAK && !isObject(a)) return KEY == 'get' ? undefined : false; - var result = this._c[KEY](a === 0 ? 0 : a, b); - return IS_ADDER ? this : result; - }); - }); - IS_WEAK || dP(C.prototype, 'size', { - get: function () { - return this._c.size; - } - }); - } - - setToStringTag(C, NAME); - - O[NAME] = C; - $export($export.G + $export.W + $export.F, O); - - if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP); - - return C; -}; - - -/***/ }), -/* 229 */ -/***/ (function(module, exports, __webpack_require__) { - -// 0 -> Array#forEach -// 1 -> Array#map -// 2 -> Array#filter -// 3 -> Array#some -// 4 -> Array#every -// 5 -> Array#find -// 6 -> Array#findIndex -var ctx = __webpack_require__(13); -var IObject = __webpack_require__(102); -var toObject = __webpack_require__(106); -var toLength = __webpack_require__(60); -var asc = __webpack_require__(230); -module.exports = function (TYPE, $create) { - var IS_MAP = TYPE == 1; - var IS_FILTER = TYPE == 2; - var IS_SOME = TYPE == 3; - var IS_EVERY = TYPE == 4; - var IS_FIND_INDEX = TYPE == 6; - var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; - var create = $create || asc; - return function ($this, callbackfn, that) { - var O = toObject($this); - var self = IObject(O); - var f = ctx(callbackfn, that, 3); - var length = toLength(self.length); - var index = 0; - var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; - var val, res; - for (;length > index; index++) if (NO_HOLES || index in self) { - val = self[index]; - res = f(val, index, O); - if (TYPE) { - if (IS_MAP) result[index] = res; // map - else if (res) switch (TYPE) { - case 3: return true; // some - case 5: return val; // find - case 6: return index; // findIndex - case 2: result.push(val); // filter - } else if (IS_EVERY) return false; // every - } - } - return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; - }; -}; - - -/***/ }), -/* 230 */ -/***/ (function(module, exports, __webpack_require__) { - -// 9.4.2.3 ArraySpeciesCreate(originalArray, length) -var speciesConstructor = __webpack_require__(231); - -module.exports = function (original, length) { - return new (speciesConstructor(original))(length); -}; - - -/***/ }), -/* 231 */ -/***/ (function(module, exports, __webpack_require__) { - -var isObject = __webpack_require__(9); -var isArray = __webpack_require__(232); -var SPECIES = __webpack_require__(4)('species'); - -module.exports = function (original) { - var C; - if (isArray(original)) { - C = original.constructor; - // cross-realm fallback - if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; - if (isObject(C)) { - C = C[SPECIES]; - if (C === null) C = undefined; - } - } return C === undefined ? Array : C; -}; - - -/***/ }), -/* 232 */ -/***/ (function(module, exports, __webpack_require__) { - -// 7.2.2 IsArray(argument) -var cof = __webpack_require__(29); -module.exports = Array.isArray || function isArray(arg) { - return cof(arg) == 'Array'; -}; - - -/***/ }), -/* 233 */ -/***/ (function(module, exports, __webpack_require__) { - -// https://github.com/DavidBruant/Map-Set.prototype.toJSON -var $export = __webpack_require__(10); - -$export($export.P + $export.R, 'Set', { toJSON: __webpack_require__(234)('Set') }); - - -/***/ }), -/* 234 */ -/***/ (function(module, exports, __webpack_require__) { - -// https://github.com/DavidBruant/Map-Set.prototype.toJSON -var classof = __webpack_require__(64); -var from = __webpack_require__(235); -module.exports = function (NAME) { - return function toJSON() { - if (classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic"); - return from(this); - }; -}; - - -/***/ }), -/* 235 */ -/***/ (function(module, exports, __webpack_require__) { - -var forOf = __webpack_require__(30); - -module.exports = function (iter, ITERATOR) { - var result = []; - forOf(iter, false, result.push, result, ITERATOR); - return result; -}; - - -/***/ }), -/* 236 */ -/***/ (function(module, exports, __webpack_require__) { - -// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of -__webpack_require__(237)('Set'); - - -/***/ }), -/* 237 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// https://tc39.github.io/proposal-setmap-offrom/ -var $export = __webpack_require__(10); - -module.exports = function (COLLECTION) { - $export($export.S, COLLECTION, { of: function of() { - var length = arguments.length; - var A = new Array(length); - while (length--) A[length] = arguments[length]; - return new this(A); - } }); -}; - - -/***/ }), -/* 238 */ -/***/ (function(module, exports, __webpack_require__) { - -// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from -__webpack_require__(239)('Set'); - - -/***/ }), -/* 239 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// https://tc39.github.io/proposal-setmap-offrom/ -var $export = __webpack_require__(10); -var aFunction = __webpack_require__(26); -var ctx = __webpack_require__(13); -var forOf = __webpack_require__(30); - -module.exports = function (COLLECTION) { - $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) { - var mapFn = arguments[1]; - var mapping, A, n, cb; - aFunction(this); - mapping = mapFn !== undefined; - if (mapping) aFunction(mapFn); - if (source == undefined) return new this(); - A = []; - if (mapping) { - n = 0; - cb = ctx(mapFn, arguments[2], 2); - forOf(source, false, function (nextItem) { - A.push(cb(nextItem, n++)); - }); - } else { - forOf(source, false, A.push, A); - } - return new this(A); - } }); -}; - - -/***/ }), -/* 240 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _stringify = __webpack_require__(18); - -var _stringify2 = _interopRequireDefault(_stringify); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -Object.defineProperty(exports, "__esModule", { value: true }); -var node_fetch_1 = __webpack_require__(241); -var anomalyType_1 = __webpack_require__(19); -function sendNotification(anomalyId, active) { - var anomalyName = anomalyType_1.loadAnomalyById(anomalyId).name; - console.log('Notification ' + anomalyName); - var notification = { - anomaly: anomalyName, - status: '' - }; - if (active) { - notification.status = 'alert'; - } else { - notification.status = 'OK'; - } - if (process.env.ALERT_ENDPOINT !== undefined) { - node_fetch_1.default(process.env.ALERT_ENDPOINT, { - method: 'POST', - body: (0, _stringify2.default)(notification) - }).then(function (data) { - return console.log(data); - }).catch(function (err) { - return console.error("Can't send alert to " + process.env.ALERT_ENDPOINT + ". Error: " + err); - }); - } else { - console.error("Can't send alert, env ALERT_ENDPOINT is undefined"); - } -} -exports.sendNotification = sendNotification; - -/***/ }), -/* 241 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Headers", function() { return Headers; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Request", function() { return Request; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Response", function() { return Response; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FetchError", function() { return FetchError; }); -// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js -// (MIT licensed) - -const BUFFER = Symbol('buffer'); -const TYPE = Symbol('type'); - -class Blob { - constructor() { - this[TYPE] = ''; - - const blobParts = arguments[0]; - const options = arguments[1]; - - const buffers = []; - - if (blobParts) { - const a = blobParts; - const length = Number(a.length); - for (let i = 0; i < length; i++) { - const element = a[i]; - let buffer; - if (element instanceof Buffer) { - buffer = element; - } else if (ArrayBuffer.isView(element)) { - buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength); - } else if (element instanceof ArrayBuffer) { - buffer = Buffer.from(element); - } else if (element instanceof Blob) { - buffer = element[BUFFER]; - } else { - buffer = Buffer.from(typeof element === 'string' ? element : String(element)); - } - buffers.push(buffer); - } - } - - this[BUFFER] = Buffer.concat(buffers); - - let type = options && options.type !== undefined && String(options.type).toLowerCase(); - if (type && !/[^\u0020-\u007E]/.test(type)) { - this[TYPE] = type; - } - } - get size() { - return this[BUFFER].length; - } - get type() { - return this[TYPE]; - } - slice() { - const size = this.size; - - const start = arguments[0]; - const end = arguments[1]; - let relativeStart, relativeEnd; - if (start === undefined) { - relativeStart = 0; - } else if (start < 0) { - relativeStart = Math.max(size + start, 0); - } else { - relativeStart = Math.min(start, size); - } - if (end === undefined) { - relativeEnd = size; - } else if (end < 0) { - relativeEnd = Math.max(size + end, 0); - } else { - relativeEnd = Math.min(end, size); - } - const span = Math.max(relativeEnd - relativeStart, 0); - - const buffer = this[BUFFER]; - const slicedBuffer = buffer.slice(relativeStart, relativeStart + span); - const blob = new Blob([], { type: arguments[2] }); - blob[BUFFER] = slicedBuffer; - return blob; - } -} - -Object.defineProperties(Blob.prototype, { - size: { enumerable: true }, - type: { enumerable: true }, - slice: { enumerable: true } -}); - -Object.defineProperty(Blob.prototype, Symbol.toStringTag, { - value: 'Blob', - writable: false, - enumerable: false, - configurable: true -}); - -/** - * fetch-error.js - * - * FetchError interface for operational errors - */ - -/** - * Create FetchError instance - * - * @param String message Error message for human - * @param String type Error type for machine - * @param String systemError For Node.js system error - * @return FetchError - */ -function FetchError(message, type, systemError) { - Error.call(this, message); - - this.message = message; - this.type = type; - - // when err.type is `system`, err.code contains system error code - if (systemError) { - this.code = this.errno = systemError.code; - } - - // hide custom error implementation details from end-users - Error.captureStackTrace(this, this.constructor); -} - -FetchError.prototype = Object.create(Error.prototype); -FetchError.prototype.constructor = FetchError; -FetchError.prototype.name = 'FetchError'; - -/** - * body.js - * - * Body interface provides common methods for Request and Response - */ - -const Stream = __webpack_require__(1); - -var _require = __webpack_require__(1); - -const PassThrough = _require.PassThrough; - - -let convert; -try { - convert = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module \"encoding\""); e.code = 'MODULE_NOT_FOUND'; throw e; }())).convert; -} catch (e) {} - -const INTERNALS = Symbol('Body internals'); - -/** - * Body mixin - * - * Ref: https://fetch.spec.whatwg.org/#body - * - * @param Stream body Readable stream - * @param Object opts Response options - * @return Void - */ -function Body(body) { - var _this = this; - - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$size = _ref.size; - - let size = _ref$size === undefined ? 0 : _ref$size; - var _ref$timeout = _ref.timeout; - let timeout = _ref$timeout === undefined ? 0 : _ref$timeout; - - if (body == null) { - // body is undefined or null - body = null; - } else if (typeof body === 'string') { - // body is string - } else if (isURLSearchParams(body)) { - // body is a URLSearchParams - } else if (body instanceof Blob) { - // body is blob - } else if (Buffer.isBuffer(body)) { - // body is buffer - } else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') { - // body is array buffer - } else if (body instanceof Stream) { - // body is stream - } else { - // none of the above - // coerce to string - body = String(body); - } - this[INTERNALS] = { - body, - disturbed: false, - error: null - }; - this.size = size; - this.timeout = timeout; - - if (body instanceof Stream) { - body.on('error', function (err) { - _this[INTERNALS].error = new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err); - }); - } -} - -Body.prototype = { - get body() { - return this[INTERNALS].body; - }, - - get bodyUsed() { - return this[INTERNALS].disturbed; - }, - - /** - * Decode response as ArrayBuffer - * - * @return Promise - */ - arrayBuffer() { - return consumeBody.call(this).then(function (buf) { - return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); - }); - }, - - /** - * Return raw response as Blob - * - * @return Promise - */ - blob() { - let ct = this.headers && this.headers.get('content-type') || ''; - return consumeBody.call(this).then(function (buf) { - return Object.assign( - // Prevent copying - new Blob([], { - type: ct.toLowerCase() - }), { - [BUFFER]: buf - }); - }); - }, - - /** - * Decode response as json - * - * @return Promise - */ - json() { - var _this2 = this; - - return consumeBody.call(this).then(function (buffer) { - try { - return JSON.parse(buffer.toString()); - } catch (err) { - return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json')); - } - }); - }, - - /** - * Decode response as text - * - * @return Promise - */ - text() { - return consumeBody.call(this).then(function (buffer) { - return buffer.toString(); - }); - }, - - /** - * Decode response as buffer (non-spec api) - * - * @return Promise - */ - buffer() { - return consumeBody.call(this); - }, - - /** - * Decode response as text, while automatically detecting the encoding and - * trying to decode to UTF-8 (non-spec api) - * - * @return Promise - */ - textConverted() { - var _this3 = this; - - return consumeBody.call(this).then(function (buffer) { - return convertBody(buffer, _this3.headers); - }); - } - -}; - -// In browsers, all properties are enumerable. -Object.defineProperties(Body.prototype, { - body: { enumerable: true }, - bodyUsed: { enumerable: true }, - arrayBuffer: { enumerable: true }, - blob: { enumerable: true }, - json: { enumerable: true }, - text: { enumerable: true } -}); - -Body.mixIn = function (proto) { - for (const name of Object.getOwnPropertyNames(Body.prototype)) { - // istanbul ignore else: future proof - if (!(name in proto)) { - const desc = Object.getOwnPropertyDescriptor(Body.prototype, name); - Object.defineProperty(proto, name, desc); - } - } -}; - -/** - * Consume and convert an entire Body to a Buffer. - * - * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body - * - * @return Promise - */ -function consumeBody() { - var _this4 = this; - - if (this[INTERNALS].disturbed) { - return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`)); - } - - this[INTERNALS].disturbed = true; - - if (this[INTERNALS].error) { - return Body.Promise.reject(this[INTERNALS].error); - } - - // body is null - if (this.body === null) { - return Body.Promise.resolve(Buffer.alloc(0)); - } - - // body is string - if (typeof this.body === 'string') { - return Body.Promise.resolve(Buffer.from(this.body)); - } - - // body is blob - if (this.body instanceof Blob) { - return Body.Promise.resolve(this.body[BUFFER]); - } - - // body is buffer - if (Buffer.isBuffer(this.body)) { - return Body.Promise.resolve(this.body); - } - - // body is buffer - if (Object.prototype.toString.call(this.body) === '[object ArrayBuffer]') { - return Body.Promise.resolve(Buffer.from(this.body)); - } - - // istanbul ignore if: should never happen - if (!(this.body instanceof Stream)) { - return Body.Promise.resolve(Buffer.alloc(0)); - } - - // body is stream - // get ready to actually consume the body - let accum = []; - let accumBytes = 0; - let abort = false; - - return new Body.Promise(function (resolve, reject) { - let resTimeout; - - // allow timeout on slow response body - if (_this4.timeout) { - resTimeout = setTimeout(function () { - abort = true; - reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout')); - }, _this4.timeout); - } - - // handle stream error, such as incorrect content-encoding - _this4.body.on('error', function (err) { - reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err)); - }); - - _this4.body.on('data', function (chunk) { - if (abort || chunk === null) { - return; - } - - if (_this4.size && accumBytes + chunk.length > _this4.size) { - abort = true; - reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size')); - return; - } - - accumBytes += chunk.length; - accum.push(chunk); - }); - - _this4.body.on('end', function () { - if (abort) { - return; - } - - clearTimeout(resTimeout); - - try { - resolve(Buffer.concat(accum)); - } catch (err) { - // handle streams that have accumulated too much data (issue #414) - reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err)); - } - }); - }); -} - -/** - * Detect buffer encoding and convert to target encoding - * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding - * - * @param Buffer buffer Incoming buffer - * @param String encoding Target encoding - * @return String - */ -function convertBody(buffer, headers) { - if (typeof convert !== 'function') { - throw new Error('The package `encoding` must be installed to use the textConverted() function'); - } - - const ct = headers.get('content-type'); - let charset = 'utf-8'; - let res, str; - - // header - if (ct) { - res = /charset=([^;]*)/i.exec(ct); - } - - // no charset in content type, peek at response body for at most 1024 bytes - str = buffer.slice(0, 1024).toString(); - - // html5 - if (!res && str) { - res = / 0 && arguments[0] !== undefined ? arguments[0] : undefined; - - this[MAP] = Object.create(null); - - if (init instanceof Headers) { - const rawHeaders = init.raw(); - const headerNames = Object.keys(rawHeaders); - - for (const headerName of headerNames) { - for (const value of rawHeaders[headerName]) { - this.append(headerName, value); - } - } - - return; - } - - // We don't worry about converting prop to ByteString here as append() - // will handle it. - if (init == null) { - // no op - } else if (typeof init === 'object') { - const method = init[Symbol.iterator]; - if (method != null) { - if (typeof method !== 'function') { - throw new TypeError('Header pairs must be iterable'); - } - - // sequence> - // Note: per spec we have to first exhaust the lists then process them - const pairs = []; - for (const pair of init) { - if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') { - throw new TypeError('Each header pair must be iterable'); - } - pairs.push(Array.from(pair)); - } - - for (const pair of pairs) { - if (pair.length !== 2) { - throw new TypeError('Each header pair must be a name/value tuple'); - } - this.append(pair[0], pair[1]); - } - } else { - // record - for (const key of Object.keys(init)) { - const value = init[key]; - this.append(key, value); - } - } - } else { - throw new TypeError('Provided initializer must be an object'); - } - } - - /** - * Return combined header value given name - * - * @param String name Header name - * @return Mixed - */ - get(name) { - name = `${name}`; - validateName(name); - const key = find(this[MAP], name); - if (key === undefined) { - return null; - } - - return this[MAP][key].join(', '); - } - - /** - * Iterate over all headers - * - * @param Function callback Executed for each item with parameters (value, name, thisArg) - * @param Boolean thisArg `this` context for callback function - * @return Void - */ - forEach(callback) { - let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; - - let pairs = getHeaders(this); - let i = 0; - while (i < pairs.length) { - var _pairs$i = pairs[i]; - const name = _pairs$i[0], - value = _pairs$i[1]; - - callback.call(thisArg, value, name, this); - pairs = getHeaders(this); - i++; - } - } - - /** - * Overwrite header values given name - * - * @param String name Header name - * @param String value Header value - * @return Void - */ - set(name, value) { - name = `${name}`; - value = `${value}`; - validateName(name); - validateValue(value); - const key = find(this[MAP], name); - this[MAP][key !== undefined ? key : name] = [value]; - } - - /** - * Append a value onto existing header - * - * @param String name Header name - * @param String value Header value - * @return Void - */ - append(name, value) { - name = `${name}`; - value = `${value}`; - validateName(name); - validateValue(value); - const key = find(this[MAP], name); - if (key !== undefined) { - this[MAP][key].push(value); - } else { - this[MAP][name] = [value]; - } - } - - /** - * Check for header name existence - * - * @param String name Header name - * @return Boolean - */ - has(name) { - name = `${name}`; - validateName(name); - return find(this[MAP], name) !== undefined; - } - - /** - * Delete all header values given name - * - * @param String name Header name - * @return Void - */ - delete(name) { - name = `${name}`; - validateName(name); - const key = find(this[MAP], name); - if (key !== undefined) { - delete this[MAP][key]; - } - } - - /** - * Return raw headers (non-spec api) - * - * @return Object - */ - raw() { - return this[MAP]; - } - - /** - * Get an iterator on keys. - * - * @return Iterator - */ - keys() { - return createHeadersIterator(this, 'key'); - } - - /** - * Get an iterator on values. - * - * @return Iterator - */ - values() { - return createHeadersIterator(this, 'value'); - } - - /** - * Get an iterator on entries. - * - * This is the default iterator of the Headers object. - * - * @return Iterator - */ - [Symbol.iterator]() { - return createHeadersIterator(this, 'key+value'); - } -} -Headers.prototype.entries = Headers.prototype[Symbol.iterator]; - -Object.defineProperty(Headers.prototype, Symbol.toStringTag, { - value: 'Headers', - writable: false, - enumerable: false, - configurable: true -}); - -Object.defineProperties(Headers.prototype, { - get: { enumerable: true }, - forEach: { enumerable: true }, - set: { enumerable: true }, - append: { enumerable: true }, - has: { enumerable: true }, - delete: { enumerable: true }, - keys: { enumerable: true }, - values: { enumerable: true }, - entries: { enumerable: true } -}); - -function getHeaders(headers) { - let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value'; - - const keys = Object.keys(headers[MAP]).sort(); - return keys.map(kind === 'key' ? function (k) { - return k.toLowerCase(); - } : kind === 'value' ? function (k) { - return headers[MAP][k].join(', '); - } : function (k) { - return [k.toLowerCase(), headers[MAP][k].join(', ')]; - }); -} - -const INTERNAL = Symbol('internal'); - -function createHeadersIterator(target, kind) { - const iterator = Object.create(HeadersIteratorPrototype); - iterator[INTERNAL] = { - target, - kind, - index: 0 - }; - return iterator; -} - -const HeadersIteratorPrototype = Object.setPrototypeOf({ - next() { - // istanbul ignore if - if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) { - throw new TypeError('Value of `this` is not a HeadersIterator'); - } - - var _INTERNAL = this[INTERNAL]; - const target = _INTERNAL.target, - kind = _INTERNAL.kind, - index = _INTERNAL.index; - - const values = getHeaders(target, kind); - const len = values.length; - if (index >= len) { - return { - value: undefined, - done: true - }; - } - - this[INTERNAL].index = index + 1; - - return { - value: values[index], - done: false - }; - } -}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))); - -Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, { - value: 'HeadersIterator', - writable: false, - enumerable: false, - configurable: true -}); - -/** - * Export the Headers object in a form that Node.js can consume. - * - * @param Headers headers - * @return Object - */ -function exportNodeCompatibleHeaders(headers) { - const obj = Object.assign({ __proto__: null }, headers[MAP]); - - // http.request() only supports string as Host header. This hack makes - // specifying custom Host header possible. - const hostHeaderKey = find(headers[MAP], 'Host'); - if (hostHeaderKey !== undefined) { - obj[hostHeaderKey] = obj[hostHeaderKey][0]; - } - - return obj; -} - -/** - * Create a Headers object from an object of headers, ignoring those that do - * not conform to HTTP grammar productions. - * - * @param Object obj Object of headers - * @return Headers - */ -function createHeadersLenient(obj) { - const headers = new Headers(); - for (const name of Object.keys(obj)) { - if (invalidTokenRegex.test(name)) { - continue; - } - if (Array.isArray(obj[name])) { - for (const val of obj[name]) { - if (invalidHeaderCharRegex.test(val)) { - continue; - } - if (headers[MAP][name] === undefined) { - headers[MAP][name] = [val]; - } else { - headers[MAP][name].push(val); - } - } - } else if (!invalidHeaderCharRegex.test(obj[name])) { - headers[MAP][name] = [obj[name]]; - } - } - return headers; -} - -/** - * response.js - * - * Response class provides content decoding - */ - -var _require$1 = __webpack_require__(17); - -const STATUS_CODES = _require$1.STATUS_CODES; - - -const INTERNALS$1 = Symbol('Response internals'); - -/** - * Response class - * - * @param Stream body Readable stream - * @param Object opts Response options - * @return Void - */ -class Response { - constructor() { - let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; - let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - Body.call(this, body, opts); - - const status = opts.status || 200; - - this[INTERNALS$1] = { - url: opts.url, - status, - statusText: opts.statusText || STATUS_CODES[status], - headers: new Headers(opts.headers) - }; - } - - get url() { - return this[INTERNALS$1].url; - } - - get status() { - return this[INTERNALS$1].status; - } - - /** - * Convenience property representing if the request ended normally - */ - get ok() { - return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300; - } - - get statusText() { - return this[INTERNALS$1].statusText; - } - - get headers() { - return this[INTERNALS$1].headers; - } - - /** - * Clone this response - * - * @return Response - */ - clone() { - return new Response(clone(this), { - url: this.url, - status: this.status, - statusText: this.statusText, - headers: this.headers, - ok: this.ok - }); - } -} - -Body.mixIn(Response.prototype); - -Object.defineProperties(Response.prototype, { - url: { enumerable: true }, - status: { enumerable: true }, - ok: { enumerable: true }, - statusText: { enumerable: true }, - headers: { enumerable: true }, - clone: { enumerable: true } -}); - -Object.defineProperty(Response.prototype, Symbol.toStringTag, { - value: 'Response', - writable: false, - enumerable: false, - configurable: true -}); - -/** - * request.js - * - * Request class contains server only options - * - * All spec algorithm step numbers are based on https://fetch.spec.whatwg.org/commit-snapshots/ae716822cb3a61843226cd090eefc6589446c1d2/. - */ - -var _require$2 = __webpack_require__(40); - -const format_url = _require$2.format; -const parse_url = _require$2.parse; - - -const INTERNALS$2 = Symbol('Request internals'); - -/** - * Check if a value is an instance of Request. - * - * @param Mixed input - * @return Boolean - */ -function isRequest(input) { - return typeof input === 'object' && typeof input[INTERNALS$2] === 'object'; -} - -/** - * Request class - * - * @param Mixed input Url or Request instance - * @param Object init Custom options - * @return Void - */ -class Request { - constructor(input) { - let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - let parsedURL; - - // normalize input - if (!isRequest(input)) { - if (input && input.href) { - // in order to support Node.js' Url objects; though WHATWG's URL objects - // will fall into this branch also (since their `toString()` will return - // `href` property anyway) - parsedURL = parse_url(input.href); - } else { - // coerce input to a string before attempting to parse - parsedURL = parse_url(`${input}`); - } - input = {}; - } else { - parsedURL = parse_url(input.url); - } - - let method = init.method || input.method || 'GET'; - method = method.toUpperCase(); - - if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) { - throw new TypeError('Request with GET/HEAD method cannot have body'); - } - - let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null; - - Body.call(this, inputBody, { - timeout: init.timeout || input.timeout || 0, - size: init.size || input.size || 0 - }); - - const headers = new Headers(init.headers || input.headers || {}); - - if (init.body != null) { - const contentType = extractContentType(this); - if (contentType !== null && !headers.has('Content-Type')) { - headers.append('Content-Type', contentType); - } - } - - this[INTERNALS$2] = { - method, - redirect: init.redirect || input.redirect || 'follow', - headers, - parsedURL - }; - - // node-fetch-only options - this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20; - this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true; - this.counter = init.counter || input.counter || 0; - this.agent = init.agent || input.agent; - } - - get method() { - return this[INTERNALS$2].method; - } - - get url() { - return format_url(this[INTERNALS$2].parsedURL); - } - - get headers() { - return this[INTERNALS$2].headers; - } - - get redirect() { - return this[INTERNALS$2].redirect; - } - - /** - * Clone this request - * - * @return Request - */ - clone() { - return new Request(this); - } -} - -Body.mixIn(Request.prototype); - -Object.defineProperty(Request.prototype, Symbol.toStringTag, { - value: 'Request', - writable: false, - enumerable: false, - configurable: true -}); - -Object.defineProperties(Request.prototype, { - method: { enumerable: true }, - url: { enumerable: true }, - headers: { enumerable: true }, - redirect: { enumerable: true }, - clone: { enumerable: true } -}); - -/** - * Convert a Request to Node.js http request options. - * - * @param Request A Request instance - * @return Object The options object to be passed to http.request - */ -function getNodeRequestOptions(request) { - const parsedURL = request[INTERNALS$2].parsedURL; - const headers = new Headers(request[INTERNALS$2].headers); - - // fetch step 1.3 - if (!headers.has('Accept')) { - headers.set('Accept', '*/*'); - } - - // Basic fetch - if (!parsedURL.protocol || !parsedURL.hostname) { - throw new TypeError('Only absolute URLs are supported'); - } - - if (!/^https?:$/.test(parsedURL.protocol)) { - throw new TypeError('Only HTTP(S) protocols are supported'); - } - - // HTTP-network-or-cache fetch steps 2.4-2.7 - let contentLengthValue = null; - if (request.body == null && /^(POST|PUT)$/i.test(request.method)) { - contentLengthValue = '0'; - } - if (request.body != null) { - const totalBytes = getTotalBytes(request); - if (typeof totalBytes === 'number') { - contentLengthValue = String(totalBytes); - } - } - if (contentLengthValue) { - headers.set('Content-Length', contentLengthValue); - } - - // HTTP-network-or-cache fetch step 2.11 - if (!headers.has('User-Agent')) { - headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)'); - } - - // HTTP-network-or-cache fetch step 2.15 - if (request.compress) { - headers.set('Accept-Encoding', 'gzip,deflate'); - } - if (!headers.has('Connection') && !request.agent) { - headers.set('Connection', 'close'); - } - - // HTTP-network fetch step 4.2 - // chunked encoding is handled by Node.js - - return Object.assign({}, parsedURL, { - method: request.method, - headers: exportNodeCompatibleHeaders(headers), - agent: request.agent - }); -} - -/** - * index.js - * - * a request API compatible with window.fetch - * - * All spec algorithm step numbers are based on https://fetch.spec.whatwg.org/commit-snapshots/ae716822cb3a61843226cd090eefc6589446c1d2/. - */ - -const http = __webpack_require__(17); -const https = __webpack_require__(242); - -var _require$3 = __webpack_require__(1); - -const PassThrough$1 = _require$3.PassThrough; - -var _require2 = __webpack_require__(40); - -const resolve_url = _require2.resolve; - -const zlib = __webpack_require__(84); - -/** - * Fetch function - * - * @param Mixed url Absolute url or Request instance - * @param Object opts Fetch options - * @return Promise - */ -function fetch(url, opts) { - - // allow custom promise - if (!fetch.Promise) { - throw new Error('native promise missing, set fetch.Promise to your favorite alternative'); - } - - Body.Promise = fetch.Promise; - - // wrap http.request into fetch - return new fetch.Promise(function (resolve, reject) { - // build request object - const request = new Request(url, opts); - const options = getNodeRequestOptions(request); - - const send = (options.protocol === 'https:' ? https : http).request; - - // send request - const req = send(options); - let reqTimeout; - - function finalize() { - req.abort(); - clearTimeout(reqTimeout); - } - - if (request.timeout) { - req.once('socket', function (socket) { - reqTimeout = setTimeout(function () { - reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout')); - finalize(); - }, request.timeout); - }); - } - - req.on('error', function (err) { - reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err)); - finalize(); - }); - - req.on('response', function (res) { - clearTimeout(reqTimeout); - - const headers = createHeadersLenient(res.headers); - - // HTTP fetch step 5 - if (fetch.isRedirect(res.statusCode)) { - // HTTP fetch step 5.2 - const location = headers.get('Location'); - - // HTTP fetch step 5.3 - const locationURL = location === null ? null : resolve_url(request.url, location); - - // HTTP fetch step 5.5 - switch (request.redirect) { - case 'error': - reject(new FetchError(`redirect mode is set to error: ${request.url}`, 'no-redirect')); - finalize(); - return; - case 'manual': - // node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL. - if (locationURL !== null) { - headers.set('Location', locationURL); - } - break; - case 'follow': - // HTTP-redirect fetch step 2 - if (locationURL === null) { - break; - } - - // HTTP-redirect fetch step 5 - if (request.counter >= request.follow) { - reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect')); - finalize(); - return; - } - - // HTTP-redirect fetch step 6 (counter increment) - // Create a new Request object. - const requestOpts = { - headers: new Headers(request.headers), - follow: request.follow, - counter: request.counter + 1, - agent: request.agent, - compress: request.compress, - method: request.method, - body: request.body - }; - - // HTTP-redirect fetch step 9 - if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) { - reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect')); - finalize(); - return; - } - - // HTTP-redirect fetch step 11 - if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') { - requestOpts.method = 'GET'; - requestOpts.body = undefined; - requestOpts.headers.delete('content-length'); - } - - // HTTP-redirect fetch step 15 - resolve(fetch(new Request(locationURL, requestOpts))); - finalize(); - return; - } - } - - // prepare response - let body = res.pipe(new PassThrough$1()); - const response_options = { - url: request.url, - status: res.statusCode, - statusText: res.statusMessage, - headers: headers, - size: request.size, - timeout: request.timeout - }; - - // HTTP-network fetch step 12.1.1.3 - const codings = headers.get('Content-Encoding'); - - // HTTP-network fetch step 12.1.1.4: handle content codings - - // in following scenarios we ignore compression support - // 1. compression support is disabled - // 2. HEAD request - // 3. no Content-Encoding header - // 4. no content response (204) - // 5. content not modified response (304) - if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) { - resolve(new Response(body, response_options)); - return; - } - - // For Node v6+ - // Be less strict when decoding compressed responses, since sometimes - // servers send slightly invalid responses that are still accepted - // by common browsers. - // Always using Z_SYNC_FLUSH is what cURL does. - const zlibOptions = { - flush: zlib.Z_SYNC_FLUSH, - finishFlush: zlib.Z_SYNC_FLUSH - }; - - // for gzip - if (codings == 'gzip' || codings == 'x-gzip') { - body = body.pipe(zlib.createGunzip(zlibOptions)); - resolve(new Response(body, response_options)); - return; - } - - // for deflate - if (codings == 'deflate' || codings == 'x-deflate') { - // handle the infamous raw deflate response from old servers - // a hack for old IIS and Apache servers - const raw = res.pipe(new PassThrough$1()); - raw.once('data', function (chunk) { - // see http://stackoverflow.com/questions/37519828 - if ((chunk[0] & 0x0F) === 0x08) { - body = body.pipe(zlib.createInflate()); - } else { - body = body.pipe(zlib.createInflateRaw()); - } - resolve(new Response(body, response_options)); - }); - return; - } - - // otherwise, use response as-is - resolve(new Response(body, response_options)); - }); - - writeToStream(req, request); - }); -} - -/** - * Redirect code matching - * - * @param Number code Status code - * @return Boolean - */ -fetch.isRedirect = function (code) { - return code === 301 || code === 302 || code === 303 || code === 307 || code === 308; -}; - -// Needed for TypeScript. -fetch.default = fetch; - -// expose Promise -fetch.Promise = global.Promise; - -/* harmony default export */ __webpack_exports__["default"] = (fetch); - - - -/***/ }), -/* 242 */ -/***/ (function(module, exports) { - -module.exports = require("https"); - -/***/ }) -/******/ ]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNDNiZGQ0ZDkyNjM0ZjkxNzMyY2UiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicGF0aFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcInN0cmVhbVwiIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJidWZmZXJcIiIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29yZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2RlcGQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiZnNcIiIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1vYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FuLW9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL3V0aWxzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1kcC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJodHRwXCIiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvanNvbi9zdHJpbmdpZnkuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmljZXMvYW5vbWFseVR5cGUudHMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9ieXRlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3N0YXR1c2VzL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvdHlwZS1pcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3BhcnNldXJsL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9wcm9taXNlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faGFzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2YuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZm9yLW9mLmpzIiwid2VicGFjazovLy8uL2NvbmZpZy50cyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb250ZW50LXR5cGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9odHRwLWVycm9ycy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3NldHByb3RvdHlwZW9mL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYm9keS1wYXJzZXIvbGliL3JlYWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9vbi1maW5pc2hlZC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2VuY29kZXVybC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2VzY2FwZS1odG1sL2luZGV4LmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcInVybFwiIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYXJyYXktZmxhdHRlbi9hcnJheS1mbGF0dGVuLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvdXRpbHMtbWVyZ2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwiY3J5cHRvXCIiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZmFpbHMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmljZXMvanNvbi50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJldmVudHNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJ1dGlsXCIiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy90YWJsZXMvY3A5MzYuanNvbiIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL21ldGhvZHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9zZW5kL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pbnRlZ2VyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RlZmluZWQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbGlicmFyeS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kb20tY3JlYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWlvYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC1rZXkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdWlkLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jbGFzc29mLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUtYWxsLmpzIiwid2VicGFjazovLy8uL3NlcnZpY2VzL2FuYWx5dGljcy50cyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9nZXQtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmljZXMvc2VnbWVudHMudHMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy90aHJvdWdoL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYm9keS1wYXJzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9kZXBkL2xpYi9jb21wYXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0cy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9kZWJ1Zy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcIm5ldFwiIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcmF3LWJvZHkvbm9kZV9tb2R1bGVzL2RlcGQvbGliL2NvbXBhdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2ljb252LWxpdGUvbGliL2luZGV4LmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcInN0cmluZ19kZWNvZGVyXCIiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy90YWJsZXMvZ2JrLWFkZGVkLmpzb24iLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy90YWJsZXMvY3A5NTAuanNvbiIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3VucGlwZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJ6bGliXCIiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9taW1lLXR5cGVzL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcXMvbGliL3V0aWxzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcXMvbGliL2Zvcm1hdHMuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicXVlcnlzdHJpbmdcIiIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL3JvdXRlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL3JvdXRlci9yb3V0ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL3JvdXRlci9sYXllci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL21pZGRsZXdhcmUvcXVlcnkuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvbnRlbnQtZGlzcG9zaXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9ldGFnL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvZnJlc2gvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9yYW5nZS1wYXJzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9wcm94eS1hZGRyL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pb2JqZWN0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2h0bWwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3Rhc2suanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcGVyZm9ybS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9taXNlLXJlc29sdmUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXNwZWNpZXMuanMiLCJ3ZWJwYWNrOi8vLy4vc2VydmljZXMvbWV0cmljcy50cyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2R1cGxleGVyL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX21ldGEuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdmFsaWRhdGUtY29sbGVjdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9pbmRleC50cyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL2V4cHJlc3MuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9kZXBkL2xpYi9jb21wYXQvY2FsbHNpdGUtdG9zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9kZXBkL2xpYi9jb21wYXQvZXZlbnQtbGlzdGVuZXItY291bnQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9saWIvdHlwZXMvanNvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3N0YXR1c2VzL2NvZGVzLmpzb24iLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvbm9kZS5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJ0dHlcIiIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3Jhdy1ib2R5L2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcmF3LWJvZHkvbm9kZV9tb2R1bGVzL2h0dHAtZXJyb3JzL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcmF3LWJvZHkvbm9kZV9tb2R1bGVzL2RlcGQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9yYXctYm9keS9ub2RlX21vZHVsZXMvZGVwZC9saWIvY29tcGF0L2NhbGxzaXRlLXRvc3RyaW5nLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcmF3LWJvZHkvbm9kZV9tb2R1bGVzL2RlcGQvbGliL2NvbXBhdC9ldmVudC1saXN0ZW5lci1jb3VudC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3Jhdy1ib2R5L25vZGVfbW9kdWxlcy9zZXRwcm90b3R5cGVvZi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2ljb252LWxpdGUvbGliL2JvbS1oYW5kbGluZy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3MvaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy91dGYxNi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL3V0ZjcuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy9zYmNzLWNvZGVjLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3Mvc2Jjcy1kYXRhLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3Mvc2Jjcy1kYXRhLWdlbmVyYXRlZC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL2RiY3MtY29kZWMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy9kYmNzLWRhdGEuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy90YWJsZXMvc2hpZnRqaXMuanNvbiIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL3RhYmxlcy9ldWNqcC5qc29uIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3MvdGFibGVzL2diMTgwMzAtcmFuZ2VzLmpzb24iLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy90YWJsZXMvY3A5NDkuanNvbiIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL3RhYmxlcy9iaWc1LWFkZGVkLmpzb24iLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2xpYi9zdHJlYW1zLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9saWIvZXh0ZW5kLW5vZGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9lZS1maXJzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL21lZGlhLXR5cGVyL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvbWltZS1kYi9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL21pbWUtZGIvZGIuanNvbiIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JvZHktcGFyc2VyL2xpYi90eXBlcy9yYXcuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9saWIvdHlwZXMvdGV4dC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2JvZHktcGFyc2VyL2xpYi90eXBlcy91cmxlbmNvZGVkLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcXMvbGliL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi9wYXJzZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL21lcmdlLWRlc2NyaXB0b3JzL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvYXBwbGljYXRpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9maW5hbGhhbmRsZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9wYXRoLXRvLXJlZ2V4cC9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL21pZGRsZXdhcmUvaW5pdC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL3ZpZXcuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9leHByZXNzL2xpYiIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2Rlc3Ryb3kvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9taW1lL21pbWUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9taW1lL3R5cGVzLmpzb24iLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9mb3J3YXJkZWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9pcGFkZHIuanMvbGliL2lwYWRkci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9leHByZXNzL2xpYi9yZXF1ZXN0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYWNjZXB0cy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL25lZ290aWF0b3IvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9uZWdvdGlhdG9yL2xpYi9jaGFyc2V0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvbmVnb3RpYXRvci9saWIvZW5jb2RpbmcuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9uZWdvdGlhdG9yL2xpYi9sYW5ndWFnZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL25lZ290aWF0b3IvbGliL21lZGlhVHlwZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL3Jlc3BvbnNlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29va2llLXNpZ25hdHVyZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2Nvb2tpZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3ZhcnkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9zZXJ2ZS1zdGF0aWMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcm91dGVzL2Fub21hbGllcy50cyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9qc29uL3N0cmluZ2lmeS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faWU4LWRvbS1kZWZpbmUuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3JlZGVmaW5lLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tYWJzb2x1dGUtaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucHJvbWlzZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pbnZva2UuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWljcm90YXNrLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3VzZXItYWdlbnQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnByb21pc2UudHJ5LmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImNoaWxkX3Byb2Nlc3NcIiIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9nZXQtaXRlcmF0b3IuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2V2ZW50LXN0cmVhbS9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2Zyb20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9tYXAtc3RyZWFtL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvcGF1c2Utc3RyZWFtL2luZGV4LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvc3BsaXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9zdHJlYW0tY29tYmluZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcm91dGVzL3NlZ21lbnRzLnRzIiwid2VicGFjazovLy8uL3JvdXRlcy9hbGVydHMudHMiLCJ3ZWJwYWNrOi8vLy4vc2VydmljZXMvYWxlcnRzLnRzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3NldC5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9zZXQuanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc2V0LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvbGxlY3Rpb24tc3Ryb25nLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvbGxlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktbWV0aG9kcy5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNyZWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLWFycmF5LmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnNldC50by1qc29uLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvbGxlY3Rpb24tdG8tanNvbi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1mcm9tLWl0ZXJhYmxlLmpzIiwid2VicGFjazovLy8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnNldC5vZi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1vZi5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zZXQuZnJvbS5qcyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1mcm9tLmpzIiwid2VicGFjazovLy8uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi50cyIsIndlYnBhY2s6Ly8vLi4vbm9kZV9tb2R1bGVzL25vZGUtZmV0Y2gvbGliL2luZGV4LmVzLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImh0dHBzXCIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLG9EQUE0QztBQUM1QztBQUNBO0FBQ0E7O0FBRUEsMENBQWtDO0FBQ2xDO0FBQ0E7QUFDQSxZQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsNkNBQXFDO0FBQ3JDO0FBQ0E7Ozs7QUFJQTtBQUNBLHNEQUE4QztBQUM5QztBQUNBO0FBQ0Esb0NBQTRCO0FBQzVCLHFDQUE2QjtBQUM3Qix5Q0FBaUM7O0FBRWpDLCtDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBc0M7QUFDdEM7QUFDQTtBQUNBLHFDQUE2QjtBQUM3QixxQ0FBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLGFBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsYUFBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQWlCLDhCQUE4QjtBQUMvQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFJO0FBQ0o7O0FBRUEsNERBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7QUFDQSxjQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQWEsNEJBQTRCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFNO0FBQ047O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHNCQUFjLDRCQUE0QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHNCQUFjLDRCQUE0QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBZ0IsdUNBQXVDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBZ0IsdUNBQXVDO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQWdCLHNCQUFzQjtBQUN0QztBQUNBO0FBQ0E7QUFDQSxnQkFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxQkFBYSx3Q0FBd0M7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNB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QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCLGlDQUFpQztBQUM1RCxjQUFjLG9CQUFvQjtBQUNsQzs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7Ozs7Ozs7QUN6Z0JBLCtCOzs7Ozs7QUNBQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRUFBaUU7QUFDakU7QUFDQSxrRkFBa0Y7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsY0FBYztBQUNkLGNBQWM7QUFDZCxjQUFjO0FBQ2QsZUFBZTtBQUNmLGVBQWU7QUFDZixlQUFlO0FBQ2YsZ0JBQWdCO0FBQ2hCOzs7Ozs7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QixXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7O0FBRUEsb0NBQW9DLGNBQWM7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QixXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7O0FBRUEscUNBQXFDLGFBQWE7O0FBRWxEO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNEVBQTRFO0FBQzVFLG1EQUFtRDtBQUNuRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE1BQU07QUFDakIsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTyxxQ0FBcUM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0EsNEJBQTRCO0FBQzVCLGFBQWEsd0NBQXdDOztBQUVyRCxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHdCQUF3QjtBQUNwQyxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGdCQUFnQjtBQUM1QixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVkscUNBQXFDO0FBQ2pELFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQjtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNqVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7Ozs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLFlBQVk7QUFDZjtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ2ZBO0FBQ0E7QUFDQSxpQ0FBaUMsUUFBUSxtQkFBbUIsVUFBVSxFQUFFLEVBQUU7QUFDMUUsQ0FBQzs7Ozs7OztBQ0hELGlDOzs7Ozs7QUNBQSxrQkFBa0IseUQ7Ozs7Ozs7Ozs7QUNBbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQStCQSxJQUFJLHVCQUF1QixFQUEzQjtBQUVBO0FBQ0UsUUFBSSxXQUFXLEtBQUssSUFBTCxDQUFVLHVCQUFWLHVCQUFmO0FBQ0EsMkJBQXVCLHVCQUFnQixRQUFoQixDQUF2QjtBQUNEO0FBRUQ7QUFDRSxRQUFJLFdBQVcsS0FBSyxJQUFMLENBQVUsdUJBQVYsdUJBQWY7QUFDQSw2QkFBa0IsUUFBbEIsRUFBNEIsb0JBQTVCO0FBQ0Q7QUFFRCw0QkFBNEIsV0FBNUIsRUFBOEM7QUFDNUM7QUFDQSxrQkFBYyxZQUFZLFdBQVosRUFBZDtBQUNBLFFBQUcsZUFBZSxvQkFBbEIsRUFBd0M7QUFDdEMsZUFBTyxxQkFBcUIsV0FBckIsQ0FBUDtBQUNEO0FBQ0QsV0FBTyxXQUFQO0FBQ0Q7QUE0RXFCO0FBMUV0Qix1QkFBdUIsT0FBdkIsRUFBdUM7QUFDckMsUUFBTSxhQUFhLFFBQVEsSUFBUixHQUFnQixJQUFJLElBQUosRUFBRCxDQUFhLFFBQWIsRUFBbEM7QUFDQSxRQUFNLFlBQXNCLE9BQU8sVUFBUCxDQUFrQixLQUFsQixFQUF5QixNQUF6QixDQUFnQyxVQUFoQyxFQUE0QyxNQUE1QyxDQUFtRCxLQUFuRCxDQUE1QjtBQUNBLHlCQUFxQixRQUFRLElBQTdCLElBQXFDLFNBQXJDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBSSxXQUFXLEtBQUssSUFBTCxDQUFVLHVCQUFWLEVBQTZCLFNBQTdCLFdBQWY7QUFDQSxRQUFHLEdBQUcsVUFBSCxDQUFjLFFBQWQsQ0FBSCxFQUE0QjtBQUMxQixlQUFPLElBQVA7QUFDRDtBQUNELGdCQUFZLFNBQVosRUFBdUIsT0FBdkI7QUFDQSxXQUFPLFNBQVA7QUFDRDtBQTREa0Q7QUExRG5ELHVCQUF1QixTQUF2QixFQUEwQztBQUN4QyxRQUFJLFdBQVcsS0FBSyxJQUFMLENBQVUsdUJBQVYsRUFBNkIsU0FBN0IsV0FBZjtBQUNBLE9BQUcsVUFBSCxDQUFjLFFBQWQ7QUFDRDtBQXVEaUU7QUFyRGxFLHFCQUFxQixTQUFyQixFQUEyQyxPQUEzQyxFQUEyRDtBQUN6RCxRQUFJLFdBQVcsS0FBSyxJQUFMLENBQVUsdUJBQVYsRUFBNkIsU0FBN0IsV0FBZjtBQUNBLFdBQU8seUJBQWtCLFFBQWxCLEVBQTRCLE9BQTVCLENBQVA7QUFDRDtBQWtEQztBQWhERix5QkFBeUIsU0FBekIsRUFBNkM7QUFDM0MsUUFBSSxXQUFXLEtBQUssSUFBTCxDQUFVLHVCQUFWLEVBQTZCLFNBQTdCLFdBQWY7QUFDQSxRQUFHLENBQUMsR0FBRyxVQUFILENBQWMsUUFBZCxDQUFKLEVBQTZCO0FBQzNCLGVBQU8sSUFBUDtBQUNEO0FBQ0QsV0FBTyx1QkFBZ0IsUUFBaEIsQ0FBUDtBQUNEO0FBMENjO0FBeENmLDJCQUEyQixXQUEzQixFQUE4QztBQUM1QyxRQUFJLFlBQVksbUJBQW1CLFdBQW5CLENBQWhCO0FBQ0EsV0FBTyxnQkFBZ0IsU0FBaEIsQ0FBUDtBQUNEO0FBcUMrQjtBQW5DaEMsNkJBQTZCLElBQTdCLEVBQWlDO0FBQy9CLFlBQVEsR0FBUixDQUFZLFFBQVo7QUFDQSxRQUFJLFdBQVcsS0FBSyxJQUFMLENBQVUsdUJBQVYsRUFBNkIsS0FBSyxJQUFsQyxXQUFmO0FBQ0EsUUFBRyxLQUFLLE9BQUwsS0FBaUIsU0FBcEIsRUFBK0I7QUFDN0IsYUFBSyxPQUFMLEdBQWUsQ0FBZjtBQUNEO0FBQ0QsUUFBRyxLQUFLLG9CQUFMLEtBQThCLFNBQWpDLEVBQTRDO0FBQ3hDLGFBQUssb0JBQUwsR0FBNEIsQ0FBNUI7QUFDSDtBQUVELFdBQU8seUJBQWtCLFFBQWxCLEVBQTRCLElBQTVCLENBQVA7QUFDRDtBQXdCZ0Y7QUF0QmpGLDRCQUE0QixJQUE1QixFQUFnQztBQUM5QixXQUFPLHVCQUFnQixLQUFLLElBQUwsQ0FBVSx1QkFBVixFQUE2QixJQUE3QixXQUFoQixDQUFQO0FBQ0Q7QUFxQkM7QUFuQkYsMEJBQTBCLFNBQTFCLEVBQStDLE1BQS9DLEVBQThELEtBQTlELEVBQTJFO0FBQ3pFLFFBQUksT0FBTyxnQkFBZ0IsU0FBaEIsQ0FBWDtBQUNBLFNBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxRQUFHLFVBQVUsU0FBYixFQUF3QjtBQUN0QixhQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsYUFBSyxLQUFMLEdBQWEsRUFBYjtBQUNEO0FBQ0QsZ0JBQVksU0FBWixFQUF1QixJQUF2QjtBQUNEO0FBVXlDO0FBUjFDLGtDQUFrQyxTQUFsQyxFQUF1RCxrQkFBdkQsRUFBZ0Y7QUFDOUUsUUFBSSxPQUFPLGdCQUFnQixTQUFoQixDQUFYO0FBQ0EsU0FBSyxvQkFBTCxHQUE0QixrQkFBNUI7QUFDQSxnQkFBWSxTQUFaLEVBQXVCLElBQXZCO0FBQ0Q7QUFJMkQsNEQ7Ozs7Ozs7QUNsSTVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0NBQXNDLEVBQUU7O0FBRXhDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsY0FBYztBQUN6QjtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7OztBQzlKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNB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QUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7OztBQ25RQSw0Q0FBNEMsYUFBYTs7QUFFekQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHFCQUFxQjtBQUNoQyxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsTUFBTTtBQUNqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsb0JBQW9CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0RBQXdELElBQUk7QUFDNUQ7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZLE9BQU87QUFDbkI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQixPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esb0RBQW9EO0FBQ3BEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUMxR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLGNBQWMsU0FBUztBQUN2QixjQUFjLFNBQVM7QUFDdkIsY0FBYyxTQUFTO0FBQ3ZCLGNBQWMsU0FBUztBQUN2Qjs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7OztBQzVKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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RUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUMsU0FBUztBQUM1Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGlCQUFpQjtBQUNwQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7QUMzTEE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7O0FBRUE7QUFD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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsc0JBQXNCO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQSxpQkFBaUIscUJBQXFCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FB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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7OztBQzlDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzREFBc0QsWUFBWTs7QUFFbEU7QUFDQTtBQUNBOztBQUVBLHNDQUFzQyxFQUFFO0FBQ3hDLCtDQUErQyxFQUFFOztBQUVqRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQSxxQkFBcUIsTUFBTTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixNQUFNO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlEQUFpRCxpQkFBaUIsSUFBSSxhQUFhLEVBQUUsRUFBRSxJQUFJLFVBQVUsSUFBSSxvQkFBb0IsRUFBRTs7QUFFL0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhFQUE4RTs7QUFFOUU7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxlQUFlO0FBQzFCLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxlQUFlO0FBQzFCLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsbUJBQW1CO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0I7QUFDbEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZEQUE2RDtBQUM3RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUM1YkE7QUFDQTtBQUNBO0FBQ0E7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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ3RVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7Ozs7Ozs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDTEE7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEOztBQUVsRDtBQUNBLHFFQUFxRTtBQUNyRSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7OztBQ1hEO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDSEE7QUFDQTs7Ozs7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNKQTtBQUNBLFVBQVU7QUFDVjs7Ozs7OztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFH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O0FBRUg7QUFDQTtBQUNBLFVBQVU7QUFDVixHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSCxDQUFDOzs7Ozs7OztBQy9HRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUNyQkE7QUFDQTtB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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7O0FDblFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLGlCQUFpQixnQkFBZ0I7QUFDakM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDOztBQUV2QztBQUNBLDRDQUE0QztBQUM1Qzs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUJBQWlCLFdBQVc7QUFDNUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsa0JBQWtCO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCLGlDQUFpQztBQUM1RCxjQUFjLG9CQUFvQjtBQUNsQzs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLGtCQUFrQjtBQUNyQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7Ozs7Ozs7O0FDdmdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7OztBQ3JCQSw0Q0FBNEMsYUFBYTs7QUFFekQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7QUN2S0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdU5BQXVOLGlFQUFpRSxFQUFFO0FBQzFSLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFH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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixvQkFBb0I7QUFDdkM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsb0JBQW9CO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7OztBQ2pOQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLGtCQUFrQjtBQUNyQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQ0FBa0MsUUFBUTtBQUMxQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxtQkFBbUIsaUJBQWlCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7O0FDN0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsUUFBUTtBQUNuQixhQUFhLE9BQU87QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7Ozs7Ozs7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUMzRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEMsU0FBUztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsU0FBUztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsUUFBUTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFNBQVM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFNBQVM7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixTQUFTO0FBQ2hDO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLFNBQVM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsU0FBUztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLFNBQVM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFFBQVE7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxHQUFHOztBQUVIOztBQUVBLHlCQUF5QixHQUFHOztBQUU1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLFNBQVM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlFQUFpRSxFQUFFO0FBQ25FO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOzs7Ozs7OztBQy9tQkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7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QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDN09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7OztBQzNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFDQUFxQyxVQUFVOztBQUUvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHdCQUF3QixvQkFBb0I7QUFDNUM7O0FBRUE7QUFDQTtB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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0JBQWtCOztBQUVsQixpQkFBaUIscUJBQXFCO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx3QkFBd0Isb0JBQW9CO0FBQzVDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLCtCQUErQjs7QUFFL0Isd0JBQXdCLHVCQUF1QjtBQUMvQztBQUNBO0FBQ0EsS0FBSztBQUNMLHlCQUF5QjtBQUN6QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsaUJBQWlCLHVCQUF1QjtBQUN4QztBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7O0FDclNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCOztBQUV0QjtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGVBQWU7QUFDaEM7QUFDQTtBQUNBLFdBQVcsb0NBQW9DO0FBQy9DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsYUFBYTtBQUM5QjtBQUNBLFdBQVcsNkJBQTZCO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsYUFBYTtBQUMvQjtBQUNBLFdBQVcsNkJBQTZCO0FBQ3hDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRGQUE0RjtBQUM1Rjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7QUFDVixRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFF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QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQ3BKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFF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O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQyxjQUFjO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7OztBQzdSRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ1hBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7Ozs7Ozs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSx1Q0FBdUMsc0JBQXNCLEVBQUU7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7Ozs7Ozs7QUNwRUE7QUFDQTs7QUFFQTs7Ozs7OztBQ0hBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlDQUFpQyxxQkFBcUI7QUFDdEQ7QUFDQSxpQ0FBaUMsU0FBUyxFQUFFO0FBQzVDLENBQUMsWUFBWTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsU0FBUyxxQkFBcUI7QUFDM0QsaUNBQWlDLGFBQWE7QUFDOUM7QUFDQSxHQUFHLFlBQVk7QUFDZjtBQUNBOzs7Ozs7OztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsVUFBVSxFQUFFO0FBQzFFLEtBQUs7QUFDTDtBQUNBLDhEQUE4RCxTQUFTLEVBQUU7QUFDekUsS0FBSztBQUNMO0FBQ0EsQ0FBQyxFQUFFOzs7Ozs7OztBQ25CSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTs7Ozs7OztBQ1hILDBDOzs7Ozs7QUNBQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ05BOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHNCQUFzQixXQUFXO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGdDQUFnQyxlQUFlOztBQUUvQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxxQ0FBcUMsaUJBQWlCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQ2xVQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7Ozs7O0FDbkVBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyw4QkFBOEI7QUFDbkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7O0FDNUlBO0FBQ0E7Ozs7Ozs7O0FDREE7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQkFBbUIsbUJBQW1CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7OztBQzdEQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCLHdCQUF3QjtBQUN4Qzs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JDQTtBQUNBO0FBS0E7QUFDQTtBQUdBLHNCQUE0QixHQUE1QixFQUFpQyxHQUFqQyxFQUFvQzs7Ozs7OztBQUNsQyw0QkFBSTtBQUNFLHFDQURGLEdBQ3lCLElBQUksS0FBSixDQUFVLFVBRG5DO0FBRUUsbUNBRkYsR0FFb0IsOEJBQWdCLFNBQWhCLENBRnBCOztBQUdGLGdDQUFHLFlBQVksSUFBZixFQUFxQjtBQUNuQiw0Q0FBWSxpQ0FBbUIsU0FBbkIsQ0FBWjtBQUNEO0FBRUcseUNBUEYsR0FPa0IsSUFBSSxLQUFKLENBQVUsWUFQNUI7QUFRRSxvQ0FSRixHQVFhLElBQUksS0FBSixDQUFVLElBUnZCO0FBU0Usa0NBVEYsR0FTVyxJQUFJLEtBQUosQ0FBVSxFQVRyQjtBQVdFLG9DQVhGLEdBV2EsOEJBQW1CLFNBQW5CLENBWGI7QUFhRjs7QUFDQSxnQ0FBRyxrQkFBa0IsU0FBckIsRUFBZ0M7QUFDOUIsMkNBQVcsU0FBUyxNQUFULENBQWdCO0FBQUEsMkNBQU0sR0FBRyxFQUFILEdBQVEsYUFBZDtBQUFBLGlDQUFoQixDQUFYO0FBQ0Q7QUFFRDtBQUNBLGdDQUFHLGFBQWEsU0FBaEIsRUFBMkI7QUFDekIsMkNBQVcsU0FBUyxNQUFULENBQWdCO0FBQUEsMkNBQU0sR0FBRyxNQUFILEdBQVksUUFBbEI7QUFBQSxpQ0FBaEIsQ0FBWDtBQUNEO0FBRUQsZ0NBQUcsV0FBVyxTQUFkLEVBQXlCO0FBQ3ZCLDJDQUFXLFNBQVMsTUFBVCxDQUFnQjtBQUFBLDJDQUFNLEdBQUcsS0FBSCxHQUFXLE1BQWpCO0FBQUEsaUNBQWhCLENBQVg7QUFDRDtBQUVHLG1DQTNCRixHQTJCWSx5QkFBZTtBQUMzQjtBQUQyQiw2QkFBZixDQTNCWjs7QUE4QkYsZ0NBQUksTUFBSixDQUFXLEdBQVgsRUFBZ0IsSUFBaEIsQ0FBcUIsT0FBckI7QUFDRCx5QkEvQkQsQ0ErQkUsT0FBTSxDQUFOLEVBQVM7QUFDVCxnQ0FBSSxNQUFKLENBQVcsR0FBWCxFQUFnQixJQUFoQixDQUFxQjtBQUNuQixzQ0FBTSxHQURhO0FBRW5CLHlDQUFTO0FBRlUsNkJBQXJCO0FBSUQ7Ozs7Ozs7OztBQUNGO0FBRUQsd0JBQThCLEdBQTlCLEVBQW1DLEdBQW5DLEVBQXNDOzs7Ozs7O0FBQ3BDLDRCQUFJO0FBQ0UsMENBREYsR0FDbUIsSUFBSSxJQUR2QjtBQUdFLHFDQUhGLEdBR2MsZUFBZSxVQUg3QjtBQUlFLHVDQUpGLEdBSWdCLGVBQWUsSUFKL0I7O0FBTUYsZ0NBQUcsY0FBYyxTQUFqQixFQUE0QjtBQUMxQiw0Q0FBWSxpQ0FBbUIsWUFBWSxXQUFaLEVBQW5CLENBQVo7QUFDRDtBQUVHLG9DQVZGLEdBVWEsMEJBQWUsU0FBZixFQUEwQixlQUFlLGNBQXpDLEVBQXlELElBQXpELENBVmI7O0FBV0Ysc0RBQWUsU0FBZixFQUEwQixlQUFlLGdCQUF6QztBQUVJLG1DQWJGLEdBYVkseUJBQWUsRUFBRSxXQUFXLFFBQWIsRUFBZixDQWJaOztBQWNGLGdDQUFJLE1BQUosQ0FBVyxHQUFYLEVBQWdCLElBQWhCLENBQXFCLE9BQXJCO0FBRUEsb0RBQVksU0FBWjtBQUNELHlCQWpCRCxDQWlCRSxPQUFNLENBQU4sRUFBUztBQUNULGdDQUFJLE1BQUosQ0FBVyxHQUFYLEVBQWdCLElBQWhCLENBQXFCO0FBQ25CLHNDQUFNLEdBRGE7QUFFbkIseUNBQVM7QUFGVSw2QkFBckI7QUFJRDs7Ozs7Ozs7O0FBQ0Y7QUFFWSxpQkFBUyxRQUFRLE1BQVIsRUFBVDtBQUViLGVBQU8sR0FBUCxDQUFXLEdBQVgsRUFBZ0IsWUFBaEI7QUFDQSxlQUFPLEtBQVAsQ0FBYSxHQUFiLEVBQWtCLGNBQWxCLEU7Ozs7Ozs7Ozs7QUMvRUE7QUFDQTtBQUNBO0FBRUEsa0JBQWtCLEdBQWxCLEVBQXVCLEdBQXZCLEVBQTBCO0FBQ3hCLFFBQUk7QUFDRixZQUFJLFlBQXVCLElBQUksS0FBSixDQUFVLFVBQXJDO0FBQ0EsWUFBSSxVQUFVLDhCQUFnQixTQUFoQixDQUFkO0FBQ0EsWUFBSSxXQUFXLElBQWYsRUFBcUI7QUFDbkIsd0JBQVksaUNBQW1CLFVBQVUsV0FBVixFQUFuQixDQUFaO0FBQ0Q7QUFFRCxZQUFJLGtCQUFrQiw2QkFBdEI7QUFDQSxZQUFJLE1BQU0sZ0JBQWdCLE9BQWhCLENBQXdCLFNBQXhCLENBQVY7QUFFQSxZQUFJLFNBQW1CLFFBQVEsQ0FBQyxDQUFoQztBQUNBLFlBQUksTUFBSixDQUFXLEdBQVgsRUFBZ0IsSUFBaEIsQ0FBcUI7QUFDbkI7QUFEbUIsU0FBckI7QUFHRCxLQWRELENBY0UsT0FBTSxDQUFOLEVBQVM7QUFDVCxZQUFJLE1BQUosQ0FBVyxHQUFYLEVBQWdCLElBQWhCLENBQXFCO0FBQ25CLGtCQUFNLEdBRGE7QUFFbkIscUJBQVM7QUFGVSxTQUFyQjtBQUlEO0FBQ0Y7QUFFRCxxQkFBcUIsR0FBckIsRUFBMEIsR0FBMUIsRUFBNkI7QUFDM0IsUUFBSTtBQUNGLFlBQUksWUFBdUIsSUFBSSxJQUFKLENBQVMsVUFBcEM7QUFDQSxZQUFJLFNBQWtCLElBQUksSUFBSixDQUFTLE1BQS9CO0FBRUEsWUFBSSxVQUFVLDhCQUFnQixTQUFoQixDQUFkO0FBQ0EsWUFBSSxXQUFXLElBQWYsRUFBcUI7QUFDbkIsd0JBQVksaUNBQW1CLFVBQVUsV0FBVixFQUFuQixDQUFaO0FBQ0Q7QUFFRCxZQUFJLGtCQUFrQiw2QkFBdEI7QUFDQSxZQUFJLE1BQWMsZ0JBQWdCLE9BQWhCLENBQXdCLFNBQXhCLENBQWxCO0FBQ0EsWUFBRyxVQUFVLE9BQU8sQ0FBQyxDQUFyQixFQUF3QjtBQUN0Qiw0QkFBZ0IsSUFBaEIsQ0FBcUIsU0FBckI7QUFDQSx5Q0FBb0IsZUFBcEI7QUFDRCxTQUhELE1BR08sSUFBRyxDQUFDLE1BQUQsSUFBVyxNQUFNLENBQUMsQ0FBckIsRUFBd0I7QUFDN0IsNEJBQWdCLE1BQWhCLENBQXVCLEdBQXZCLEVBQTRCLENBQTVCO0FBQ0EseUNBQW9CLGVBQXBCO0FBQ0Q7QUFDRCxZQUFJLE1BQUosQ0FBVyxHQUFYLEVBQWdCLElBQWhCLENBQXFCO0FBQ25CLG9CQUFRO0FBRFcsU0FBckI7QUFHRCxLQXJCRCxDQXFCRSxPQUFNLENBQU4sRUFBUztBQUNULFlBQUksTUFBSixDQUFXLEdBQVgsRUFBZ0IsSUFBaEIsQ0FBcUI7QUFDbkIsa0JBQU0sR0FEYTtBQUVuQixxQkFBUztBQUZVLFNBQXJCO0FBSUQ7QUFDRjtBQUVZLGlCQUFTLFFBQVEsTUFBUixFQUFUO0FBRWIsZUFBTyxHQUFQLENBQVcsR0FBWCxFQUFnQixRQUFoQjtBQUNBLGVBQU8sSUFBUCxDQUFZLEdBQVosRUFBaUIsV0FBakIsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVEQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0UsUUFBSSxXQUFXLEtBQUssSUFBTCxDQUFVLHVCQUFWLDBCQUFmO0FBQ0EsUUFBRyxDQUFDLEdBQUcsVUFBSCxDQUFjLFFBQWQsQ0FBSixFQUE2QjtBQUMzQiw0QkFBb0IsRUFBcEI7QUFDRDtBQUNELFdBQU8sdUJBQWdCLEtBQUssSUFBTCxDQUFVLHVCQUFWLDBCQUFoQixDQUFQO0FBQ0Q7QUFnRFE7QUE5Q1QsNkJBQTZCLFNBQTdCLEVBQW1EO0FBQ2pELFdBQU8seUJBQWtCLEtBQUssSUFBTCxDQUFVLHVCQUFWLDBCQUFsQixFQUFzRSxTQUF0RSxDQUFQO0FBQ0Q7QUE0QzRCO0FBMUM3Qix1QkFBdUIsU0FBdkIsRUFBZ0M7QUFDOUIsUUFBSSxXQUFXLDhCQUFtQixTQUFuQixDQUFmO0FBRUEsUUFBTSxjQUFjLElBQUksSUFBSixHQUFXLE9BQVgsRUFBcEI7QUFDQSxRQUFNLGNBQWMsS0FBcEI7QUFDQSxRQUFJLGlCQUFpQixLQUFyQjtBQUVBLFFBQUcsU0FBUyxNQUFULEdBQWtCLENBQXJCLEVBQXdCO0FBQ3RCLFlBQUksY0FBYyxTQUFTLFNBQVMsTUFBVCxHQUFrQixDQUEzQixDQUFsQjtBQUNBLFlBQUcsWUFBWSxNQUFaLElBQXNCLGNBQWMsWUFBdkMsRUFBcUQ7QUFDbkQsNkJBQWlCLElBQWpCO0FBQ0Q7QUFDRjtBQUNELFlBQVEsR0FBUixDQUFZLFdBQVo7QUFDQSxxQkFBaUIsSUFBakI7QUFDQSxRQUFHLENBQUMsV0FBRCxJQUFnQixjQUFuQixFQUFtQztBQUNqQyxxQkFBYSxHQUFiLENBQWlCLFNBQWpCO0FBQ0Esd0NBQWlCLFNBQWpCLEVBQTRCLElBQTVCO0FBQ0QsS0FIRCxNQUdPLElBQUcsZUFBZSxDQUFDLGNBQW5CLEVBQW1DO0FBQ3hDLHFCQUFhLE1BQWIsQ0FBb0IsU0FBcEI7QUFDQSx3Q0FBaUIsU0FBakIsRUFBNEIsS0FBNUI7QUFDRDtBQUNGO0FBRUQ7Ozs7Ozs7O0FBQ00sdUMsR0FBa0Isb0I7Ozs7OytEQUNBLGU7Ozs7Ozs7O0FBQWIsaUM7OzsrQkFFQyx1QkFBVyxTQUFYLEM7OztBQUNOLHNDQUFjLFNBQWQ7Ozs7Ozs7O0FBRUEsZ0NBQVEsS0FBUjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0osbUNBQVcsVUFBWCxFQUF1QixJQUF2Qjs7Ozs7Ozs7O0FBQ0Q7QUFFRCxJQUFNLGVBQWUsS0FBckIsQyxDQUE0QjtBQUM1QixJQUFNLGVBQWUsbUJBQXJCO0FBQ0EsV0FBVyxVQUFYLEVBQXVCLElBQXZCLEU7Ozs7OztBQzVEQSxrQkFBa0IseUQ7Ozs7OztBQ0FsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUIsbUVBQW1FO0FBQzVGLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7Ozs7Ozs7O0FDYkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsT0FBTztBQUM5QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsNkJBQTZCO0FBQzdCLDBCQUEwQjtBQUMxQiwwQkFBMEI7QUFDMUIscUJBQXFCO0FBQ3JCO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFLE9BQU87QUFDckY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDLHFCQUFxQjtBQUNyQiwwQkFBMEI7QUFDMUIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FDL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOzs7Ozs7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxlQUFlO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBLDhCQUE4QjtBQUM5Qiw2QkFBNkI7QUFDN0IsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyxTQUFTLGlDQUFpQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDM0NBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7O0FDTEE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQ0pBO0FBQ0E7O0FBRUEsdUNBQXVDLDBDQUFrRDs7Ozs7OztBQ0h6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUNSQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDTkE7QUFDQTs7Ozs7Ozs7QUNEQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7QUFDTDs7Ozs7OztBQ1hBO0FBQ0E7Ozs7Ozs7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRyxFQUFFO0FBQ0w7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0JBO0FBQ0E7QUFFQSwwQkFBMEIsU0FBMUIsRUFBcUMsTUFBckMsRUFBMkM7QUFDekMsUUFBSSxjQUFjLDhCQUFnQixTQUFoQixFQUEyQixJQUE3QztBQUNBLFlBQVEsR0FBUixDQUFZLGtCQUFrQixXQUE5QjtBQUVBLFFBQUksZUFBZTtBQUNqQixpQkFBUyxXQURRO0FBRWpCLGdCQUFRO0FBRlMsS0FBbkI7QUFJQSxRQUFHLE1BQUgsRUFBVztBQUNULHFCQUFhLE1BQWIsR0FBc0IsT0FBdEI7QUFDRCxLQUZELE1BRU87QUFDTCxxQkFBYSxNQUFiLEdBQXNCLElBQXRCO0FBQ0Q7QUFFRCxRQUFHLFFBQVEsR0FBUixDQUFZLGNBQVosS0FBK0IsU0FBbEMsRUFBNkM7QUFDM0MsNkJBQU0sUUFBUSxHQUFSLENBQVksY0FBbEIsRUFBa0M7QUFDaEMsb0JBQVEsTUFEd0I7QUFFaEMsa0JBQU0seUJBQWUsWUFBZjtBQUYwQixTQUFsQyxFQUlHLElBSkgsQ0FJUTtBQUFBLG1CQUFRLFFBQVEsR0FBUixDQUFZLElBQVosQ0FBUjtBQUFBLFNBSlIsRUFLRyxLQUxILENBS1M7QUFBQSxtQkFBTyxRQUFRLEtBQVIsMEJBQXFDLFFBQVEsR0FBUixDQUFZLGNBQWpELGlCQUEyRSxHQUEzRSxDQUFQO0FBQUEsU0FMVDtBQU1ELEtBUEQsTUFPTztBQUNMLGdCQUFRLEtBQVI7QUFDRDtBQUNGO0FBRVEsNEM7Ozs7Ozs7Ozs7O0FDN0JUO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2QixxQkFBcUI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRLG1CQUFtQjtBQUMzQixRQUFRLG1CQUFtQjtBQUMzQixTQUFTO0FBQ1QsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0ZBQWtGO0FBQ2xGOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMEZBQTBGLFVBQVUsSUFBSSxZQUFZO0FBQ3BILEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSixHQUFHO0FBQ0gsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osK0VBQStFLFdBQVcsV0FBVyxZQUFZO0FBQ2pIO0FBQ0EsR0FBRztBQUNILEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTs7QUFFRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFFBQVEsbUJBQW1CO0FBQzNCLFlBQVksbUJBQW1CO0FBQy9CLGVBQWUsbUJBQW1CO0FBQ2xDLFFBQVEsbUJBQW1CO0FBQzNCLFFBQVEsbUJBQW1CO0FBQzNCLFFBQVE7QUFDUixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxRUFBcUUsU0FBUztBQUM5RTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLFdBQVcsU0FBUyxlQUFlO0FBQ3ZHLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0Esd0VBQXdFLFdBQVcsSUFBSSxZQUFZO0FBQ25HLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZDQUE2QyxXQUFXLGVBQWUsWUFBWTtBQUNuRjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSw0RUFBNEUsV0FBVyxJQUFJLFlBQVk7QUFDdkc7QUFDQSxHQUFHO0FBQ0gsRUFBRTtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0EscUJBQXFCO0FBQ3JCLEVBQUU7QUFDRjtBQUNBLDRDQUE0QztBQUM1QyxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSw4QkFBOEIsV0FBVyxtQkFBbUI7QUFDNUQsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0EsRUFBRTtBQUNGO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLEtBQUs7QUFDaEI7QUFDQSx5QkFBeUIsS0FBSztBQUM5QjtBQUNBOztBQUVBO0FBQ0EsWUFBWSxNQUFNO0FBQ2xCO0FBQ0EseUJBQXlCLE1BQU07QUFDL0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLEtBQUs7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxLQUFLO0FBQ2pCLGFBQWEsTUFBTTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLEtBQUs7QUFDakIsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxLQUFLO0FBQ2pCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksS0FBSztBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0EsT0FBTyxtQkFBbUI7QUFDMUIsV0FBVyxtQkFBbUI7QUFDOUIsT0FBTyxtQkFBbUI7QUFDMUIsVUFBVSxtQkFBbUI7QUFDN0IsT0FBTyxtQkFBbUI7QUFDMUIsVUFBVSxtQkFBbUI7QUFDN0IsUUFBUSxtQkFBbUI7QUFDM0IsVUFBVSxtQkFBbUI7QUFDN0IsV0FBVztBQUNYLENBQUM7O0FBRUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxFQUFFO0FBQ0Y7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGtCQUFrQjs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVB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RUE7QUFDQTtBQUNBO0FBQ0EsOERBQThELFlBQVk7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZEQUE2RCxZQUFZO0FBQ3pFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNROzs7Ozs7O0FDN2dEUixrQyIsImZpbGUiOiJzZXJ2ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHRmdW5jdGlvbiBob3REb3dubG9hZFVwZGF0ZUNodW5rKGNodW5rSWQpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gXHRcdHZhciBjaHVuayA9IHJlcXVpcmUoXCIuL1wiICsgXCJcIiArIGNodW5rSWQgKyBcIi5cIiArIGhvdEN1cnJlbnRIYXNoICsgXCIuaG90LXVwZGF0ZS5qc1wiKTtcclxuIFx0XHRob3RBZGRVcGRhdGVDaHVuayhjaHVuay5pZCwgY2h1bmsubW9kdWxlcyk7XHJcbiBcdH1cclxuIFx0XHJcbiBcdGZ1bmN0aW9uIGhvdERvd25sb2FkTWFuaWZlc3QoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcclxuIFx0XHR0cnkge1xyXG4gXHRcdFx0dmFyIHVwZGF0ZSA9IHJlcXVpcmUoXCIuL1wiICsgXCJcIiArIGhvdEN1cnJlbnRIYXNoICsgXCIuaG90LXVwZGF0ZS5qc29uXCIpO1xyXG4gXHRcdH0gY2F0Y2goZSkge1xyXG4gXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gXHRcdH1cclxuIFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVwZGF0ZSk7XHJcbiBcdH1cclxuIFx0XHJcbiBcdGZ1bmN0aW9uIGhvdERpc3Bvc2VDaHVuayhjaHVua0lkKSB7IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gXHRcdGRlbGV0ZSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF07XHJcbiBcdH1cclxuXG4gXHRcclxuIFx0XHJcbiBcdHZhciBob3RBcHBseU9uVXBkYXRlID0gdHJ1ZTtcclxuIFx0dmFyIGhvdEN1cnJlbnRIYXNoID0gXCI0M2JkZDRkOTI2MzRmOTE3MzJjZVwiOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXHJcbiBcdHZhciBob3RSZXF1ZXN0VGltZW91dCA9IDEwMDAwO1xyXG4gXHR2YXIgaG90Q3VycmVudE1vZHVsZURhdGEgPSB7fTtcclxuIFx0dmFyIGhvdEN1cnJlbnRDaGlsZE1vZHVsZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gXHR2YXIgaG90Q3VycmVudFBhcmVudHMgPSBbXTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gXHR2YXIgaG90Q3VycmVudFBhcmVudHNUZW1wID0gW107IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcclxuIFx0XHJcbiBcdGZ1bmN0aW9uIGhvdENyZWF0ZVJlcXVpcmUobW9kdWxlSWQpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gXHRcdHZhciBtZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xyXG4gXHRcdGlmKCFtZSkgcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX187XHJcbiBcdFx0dmFyIGZuID0gZnVuY3Rpb24ocmVxdWVzdCkge1xyXG4gXHRcdFx0aWYobWUuaG90LmFjdGl2ZSkge1xyXG4gXHRcdFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW3JlcXVlc3RdKSB7XHJcbiBcdFx0XHRcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1tyZXF1ZXN0XS5wYXJlbnRzLmluZGV4T2YobW9kdWxlSWQpIDwgMClcclxuIFx0XHRcdFx0XHRcdGluc3RhbGxlZE1vZHVsZXNbcmVxdWVzdF0ucGFyZW50cy5wdXNoKG1vZHVsZUlkKTtcclxuIFx0XHRcdFx0fSBlbHNlIHtcclxuIFx0XHRcdFx0XHRob3RDdXJyZW50UGFyZW50cyA9IFttb2R1bGVJZF07XHJcbiBcdFx0XHRcdFx0aG90Q3VycmVudENoaWxkTW9kdWxlID0gcmVxdWVzdDtcclxuIFx0XHRcdFx0fVxyXG4gXHRcdFx0XHRpZihtZS5jaGlsZHJlbi5pbmRleE9mKHJlcXVlc3QpIDwgMClcclxuIFx0XHRcdFx0XHRtZS5jaGlsZHJlbi5wdXNoKHJlcXVlc3QpO1xyXG4gXHRcdFx0fSBlbHNlIHtcclxuIFx0XHRcdFx0Y29uc29sZS53YXJuKFwiW0hNUl0gdW5leHBlY3RlZCByZXF1aXJlKFwiICsgcmVxdWVzdCArIFwiKSBmcm9tIGRpc3Bvc2VkIG1vZHVsZSBcIiArIG1vZHVsZUlkKTtcclxuIFx0XHRcdFx0aG90Q3VycmVudFBhcmVudHMgPSBbXTtcclxuIFx0XHRcdH1cclxuIFx0XHRcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKHJlcXVlc3QpO1xyXG4gXHRcdH07XHJcbiBcdFx0dmFyIE9iamVjdEZhY3RvcnkgPSBmdW5jdGlvbiBPYmplY3RGYWN0b3J5KG5hbWUpIHtcclxuIFx0XHRcdHJldHVybiB7XHJcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcclxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcclxuIFx0XHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcclxuIFx0XHRcdFx0XHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfX1tuYW1lXTtcclxuIFx0XHRcdFx0fSxcclxuIFx0XHRcdFx0c2V0OiBmdW5jdGlvbih2YWx1ZSkge1xyXG4gXHRcdFx0XHRcdF9fd2VicGFja19yZXF1aXJlX19bbmFtZV0gPSB2YWx1ZTtcclxuIFx0XHRcdFx0fVxyXG4gXHRcdFx0fTtcclxuIFx0XHR9O1xyXG4gXHRcdGZvcih2YXIgbmFtZSBpbiBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XHJcbiBcdFx0XHRpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoX193ZWJwYWNrX3JlcXVpcmVfXywgbmFtZSkgJiYgbmFtZSAhPT0gXCJlXCIpIHtcclxuIFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBuYW1lLCBPYmplY3RGYWN0b3J5KG5hbWUpKTtcclxuIFx0XHRcdH1cclxuIFx0XHR9XHJcbiBcdFx0Zm4uZSA9IGZ1bmN0aW9uKGNodW5rSWQpIHtcclxuIFx0XHRcdGlmKGhvdFN0YXR1cyA9PT0gXCJyZWFkeVwiKVxyXG4gXHRcdFx0XHRob3RTZXRTdGF0dXMoXCJwcmVwYXJlXCIpO1xyXG4gXHRcdFx0aG90Q2h1bmtzTG9hZGluZysrO1xyXG4gXHRcdFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uZShjaHVua0lkKS50aGVuKGZpbmlzaENodW5rTG9hZGluZywgZnVuY3Rpb24oZXJyKSB7XHJcbiBcdFx0XHRcdGZpbmlzaENodW5rTG9hZGluZygpO1xyXG4gXHRcdFx0XHR0aHJvdyBlcnI7XHJcbiBcdFx0XHR9KTtcclxuIFx0XHJcbiBcdFx0XHRmdW5jdGlvbiBmaW5pc2hDaHVua0xvYWRpbmcoKSB7XHJcbiBcdFx0XHRcdGhvdENodW5rc0xvYWRpbmctLTtcclxuIFx0XHRcdFx0aWYoaG90U3RhdHVzID09PSBcInByZXBhcmVcIikge1xyXG4gXHRcdFx0XHRcdGlmKCFob3RXYWl0aW5nRmlsZXNNYXBbY2h1bmtJZF0pIHtcclxuIFx0XHRcdFx0XHRcdGhvdEVuc3VyZVVwZGF0ZUNodW5rKGNodW5rSWQpO1xyXG4gXHRcdFx0XHRcdH1cclxuIFx0XHRcdFx0XHRpZihob3RDaHVua3NMb2FkaW5nID09PSAwICYmIGhvdFdhaXRpbmdGaWxlcyA9PT0gMCkge1xyXG4gXHRcdFx0XHRcdFx0aG90VXBkYXRlRG93bmxvYWRlZCgpO1xyXG4gXHRcdFx0XHRcdH1cclxuIFx0XHRcdFx0fVxyXG4gXHRcdFx0fVxyXG4gXHRcdH07XHJcbiBcdFx0cmV0dXJuIGZuO1xyXG4gXHR9XHJcbiBcdFxyXG4gXHRmdW5jdGlvbiBob3RDcmVhdGVNb2R1bGUobW9kdWxlSWQpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gXHRcdHZhciBob3QgPSB7XHJcbiBcdFx0XHQvLyBwcml2YXRlIHN0dWZmXHJcbiBcdFx0XHRfYWNjZXB0ZWREZXBlbmRlbmNpZXM6IHt9LFxyXG4gXHRcdFx0X2RlY2xpbmVkRGVwZW5kZW5jaWVzOiB7fSxcclxuIFx0XHRcdF9zZWxmQWNjZXB0ZWQ6IGZhbHNlLFxyXG4gXHRcdFx0X3NlbGZEZWNsaW5lZDogZmFsc2UsXHJcbiBcdFx0XHRfZGlzcG9zZUhhbmRsZXJzOiBbXSxcclxuIFx0XHRcdF9tYWluOiBob3RDdXJyZW50Q2hpbGRNb2R1bGUgIT09IG1vZHVsZUlkLFxyXG4gXHRcclxuIFx0XHRcdC8vIE1vZHVsZSBBUElcclxuIFx0XHRcdGFjdGl2ZTogdHJ1ZSxcclxuIFx0XHRcdGFjY2VwdDogZnVuY3Rpb24oZGVwLCBjYWxsYmFjaykge1xyXG4gXHRcdFx0XHRpZih0eXBlb2YgZGVwID09PSBcInVuZGVmaW5lZFwiKVxyXG4gXHRcdFx0XHRcdGhvdC5fc2VsZkFjY2VwdGVkID0gdHJ1ZTtcclxuIFx0XHRcdFx0ZWxzZSBpZih0eXBlb2YgZGVwID09PSBcImZ1bmN0aW9uXCIpXHJcbiBcdFx0XHRcdFx0aG90Ll9zZWxmQWNjZXB0ZWQgPSBkZXA7XHJcbiBcdFx0XHRcdGVsc2UgaWYodHlwZW9mIGRlcCA9PT0gXCJvYmplY3RcIilcclxuIFx0XHRcdFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgZGVwLmxlbmd0aDsgaSsrKVxyXG4gXHRcdFx0XHRcdFx0aG90Ll9hY2NlcHRlZERlcGVuZGVuY2llc1tkZXBbaV1dID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcclxuIFx0XHRcdFx0ZWxzZVxyXG4gXHRcdFx0XHRcdGhvdC5fYWNjZXB0ZWREZXBlbmRlbmNpZXNbZGVwXSA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XHJcbiBcdFx0XHR9LFxyXG4gXHRcdFx0ZGVjbGluZTogZnVuY3Rpb24oZGVwKSB7XHJcbiBcdFx0XHRcdGlmKHR5cGVvZiBkZXAgPT09IFwidW5kZWZpbmVkXCIpXHJcbiBcdFx0XHRcdFx0aG90Ll9zZWxmRGVjbGluZWQgPSB0cnVlO1xyXG4gXHRcdFx0XHRlbHNlIGlmKHR5cGVvZiBkZXAgPT09IFwib2JqZWN0XCIpXHJcbiBcdFx0XHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IGRlcC5sZW5ndGg7IGkrKylcclxuIFx0XHRcdFx0XHRcdGhvdC5fZGVjbGluZWREZXBlbmRlbmNpZXNbZGVwW2ldXSA9IHRydWU7XHJcbiBcdFx0XHRcdGVsc2VcclxuIFx0XHRcdFx0XHRob3QuX2RlY2xpbmVkRGVwZW5kZW5jaWVzW2RlcF0gPSB0cnVlO1xyXG4gXHRcdFx0fSxcclxuIFx0XHRcdGRpc3Bvc2U6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcbiBcdFx0XHRcdGhvdC5fZGlzcG9zZUhhbmRsZXJzLnB1c2goY2FsbGJhY2spO1xyXG4gXHRcdFx0fSxcclxuIFx0XHRcdGFkZERpc3Bvc2VIYW5kbGVyOiBmdW5jdGlvbihjYWxsYmFjaykge1xyXG4gXHRcdFx0XHRob3QuX2Rpc3Bvc2VIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTtcclxuIFx0XHRcdH0sXHJcbiBcdFx0XHRyZW1vdmVEaXNwb3NlSGFuZGxlcjogZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuIFx0XHRcdFx0dmFyIGlkeCA9IGhvdC5fZGlzcG9zZUhhbmRsZXJzLmluZGV4T2YoY2FsbGJhY2spO1xyXG4gXHRcdFx0XHRpZihpZHggPj0gMCkgaG90Ll9kaXNwb3NlSGFuZGxlcnMuc3BsaWNlKGlkeCwgMSk7XHJcbiBcdFx0XHR9LFxyXG4gXHRcclxuIFx0XHRcdC8vIE1hbmFnZW1lbnQgQVBJXHJcbiBcdFx0XHRjaGVjazogaG90Q2hlY2ssXHJcbiBcdFx0XHRhcHBseTogaG90QXBwbHksXHJcbiBcdFx0XHRzdGF0dXM6IGZ1bmN0aW9uKGwpIHtcclxuIFx0XHRcdFx0aWYoIWwpIHJldHVybiBob3RTdGF0dXM7XHJcbiBcdFx0XHRcdGhvdFN0YXR1c0hhbmRsZXJzLnB1c2gobCk7XHJcbiBcdFx0XHR9LFxyXG4gXHRcdFx0YWRkU3RhdHVzSGFuZGxlcjogZnVuY3Rpb24obCkge1xyXG4gXHRcdFx0XHRob3RTdGF0dXNIYW5kbGVycy5wdXNoKGwpO1xyXG4gXHRcdFx0fSxcclxuIFx0XHRcdHJlbW92ZVN0YXR1c0hhbmRsZXI6IGZ1bmN0aW9uKGwpIHtcclxuIFx0XHRcdFx0dmFyIGlkeCA9IGhvdFN0YXR1c0hhbmRsZXJzLmluZGV4T2YobCk7XHJcbiBcdFx0XHRcdGlmKGlkeCA+PSAwKSBob3RTdGF0dXNIYW5kbGVycy5zcGxpY2UoaWR4LCAxKTtcclxuIFx0XHRcdH0sXHJcbiBcdFxyXG4gXHRcdFx0Ly9pbmhlcml0IGZyb20gcHJldmlvdXMgZGlzcG9zZSBjYWxsXHJcbiBcdFx0XHRkYXRhOiBob3RDdXJyZW50TW9kdWxlRGF0YVttb2R1bGVJZF1cclxuIFx0XHR9O1xyXG4gXHRcdGhvdEN1cnJlbnRDaGlsZE1vZHVsZSA9IHVuZGVmaW5lZDtcclxuIFx0XHRyZXR1cm4gaG90O1xyXG4gXHR9XHJcbiBcdFxyXG4gXHR2YXIgaG90U3RhdHVzSGFuZGxlcnMgPSBbXTtcclxuIFx0dmFyIGhvdFN0YXR1cyA9IFwiaWRsZVwiO1xyXG4gXHRcclxuIFx0ZnVuY3Rpb24gaG90U2V0U3RhdHVzKG5ld1N0YXR1cykge1xyXG4gXHRcdGhvdFN0YXR1cyA9IG5ld1N0YXR1cztcclxuIFx0XHRmb3IodmFyIGkgPSAwOyBpIDwgaG90U3RhdHVzSGFuZGxlcnMubGVuZ3RoOyBpKyspXHJcbiBcdFx0XHRob3RTdGF0dXNIYW5kbGVyc1tpXS5jYWxsKG51bGwsIG5ld1N0YXR1cyk7XHJcbiBcdH1cclxuIFx0XHJcbiBcdC8vIHdoaWxlIGRvd25sb2FkaW5nXHJcbiBcdHZhciBob3RXYWl0aW5nRmlsZXMgPSAwO1xyXG4gXHR2YXIgaG90Q2h1bmtzTG9hZGluZyA9IDA7XHJcbiBcdHZhciBob3RXYWl0aW5nRmlsZXNNYXAgPSB7fTtcclxuIFx0dmFyIGhvdFJlcXVlc3RlZEZpbGVzTWFwID0ge307XHJcbiBcdHZhciBob3RBdmFpbGFibGVGaWxlc01hcCA9IHt9O1xyXG4gXHR2YXIgaG90RGVmZXJyZWQ7XHJcbiBcdFxyXG4gXHQvLyBUaGUgdXBkYXRlIGluZm9cclxuIFx0dmFyIGhvdFVwZGF0ZSwgaG90VXBkYXRlTmV3SGFzaDtcclxuIFx0XHJcbiBcdGZ1bmN0aW9uIHRvTW9kdWxlSWQoaWQpIHtcclxuIFx0XHR2YXIgaXNOdW1iZXIgPSAoK2lkKSArIFwiXCIgPT09IGlkO1xyXG4gXHRcdHJldHVybiBpc051bWJlciA/ICtpZCA6IGlkO1xyXG4gXHR9XHJcbiBcdFxyXG4gXHRmdW5jdGlvbiBob3RDaGVjayhhcHBseSkge1xyXG4gXHRcdGlmKGhvdFN0YXR1cyAhPT0gXCJpZGxlXCIpIHRocm93IG5ldyBFcnJvcihcImNoZWNrKCkgaXMgb25seSBhbGxvd2VkIGluIGlkbGUgc3RhdHVzXCIpO1xyXG4gXHRcdGhvdEFwcGx5T25VcGRhdGUgPSBhcHBseTtcclxuIFx0XHRob3RTZXRTdGF0dXMoXCJjaGVja1wiKTtcclxuIFx0XHRyZXR1cm4gaG90RG93bmxvYWRNYW5pZmVzdChob3RSZXF1ZXN0VGltZW91dCkudGhlbihmdW5jdGlvbih1cGRhdGUpIHtcclxuIFx0XHRcdGlmKCF1cGRhdGUpIHtcclxuIFx0XHRcdFx0aG90U2V0U3RhdHVzKFwiaWRsZVwiKTtcclxuIFx0XHRcdFx0cmV0dXJuIG51bGw7XHJcbiBcdFx0XHR9XHJcbiBcdFx0XHRob3RSZXF1ZXN0ZWRGaWxlc01hcCA9IHt9O1xyXG4gXHRcdFx0aG90V2FpdGluZ0ZpbGVzTWFwID0ge307XHJcbiBcdFx0XHRob3RBdmFpbGFibGVGaWxlc01hcCA9IHVwZGF0ZS5jO1xyXG4gXHRcdFx0aG90VXBkYXRlTmV3SGFzaCA9IHVwZGF0ZS5oO1xyXG4gXHRcclxuIFx0XHRcdGhvdFNldFN0YXR1cyhcInByZXBhcmVcIik7XHJcbiBcdFx0XHR2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gXHRcdFx0XHRob3REZWZlcnJlZCA9IHtcclxuIFx0XHRcdFx0XHRyZXNvbHZlOiByZXNvbHZlLFxyXG4gXHRcdFx0XHRcdHJlamVjdDogcmVqZWN0XHJcbiBcdFx0XHRcdH07XHJcbiBcdFx0XHR9KTtcclxuIFx0XHRcdGhvdFVwZGF0ZSA9IHt9O1xyXG4gXHRcdFx0dmFyIGNodW5rSWQgPSAwO1xyXG4gXHRcdFx0eyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWxvbmUtYmxvY2tzXHJcbiBcdFx0XHRcdC8qZ2xvYmFscyBjaHVua0lkICovXHJcbiBcdFx0XHRcdGhvdEVuc3VyZVVwZGF0ZUNodW5rKGNodW5rSWQpO1xyXG4gXHRcdFx0fVxyXG4gXHRcdFx0aWYoaG90U3RhdHVzID09PSBcInByZXBhcmVcIiAmJiBob3RDaHVua3NMb2FkaW5nID09PSAwICYmIGhvdFdhaXRpbmdGaWxlcyA9PT0gMCkge1xyXG4gXHRcdFx0XHRob3RVcGRhdGVEb3dubG9hZGVkKCk7XHJcbiBcdFx0XHR9XHJcbiBcdFx0XHRyZXR1cm4gcHJvbWlzZTtcclxuIFx0XHR9KTtcclxuIFx0fVxyXG4gXHRcclxuIFx0ZnVuY3Rpb24gaG90QWRkVXBkYXRlQ2h1bmsoY2h1bmtJZCwgbW9yZU1vZHVsZXMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xyXG4gXHRcdGlmKCFob3RBdmFpbGFibGVGaWxlc01hcFtjaHVua0lkXSB8fCAhaG90UmVxdWVzdGVkRmlsZXNNYXBbY2h1bmtJZF0pXHJcbiBcdFx0XHRyZXR1cm47XHJcbiBcdFx0aG90UmVxdWVzdGVkRmlsZXNNYXBbY2h1bmtJZF0gPSBmYWxzZTtcclxuIFx0XHRmb3IodmFyIG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XHJcbiBcdFx0XHRpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xyXG4gXHRcdFx0XHRob3RVcGRhdGVbbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xyXG4gXHRcdFx0fVxyXG4gXHRcdH1cclxuIFx0XHRpZigtLWhvdFdhaXRpbmdGaWxlcyA9PT0gMCAmJiBob3RDaHVua3NMb2FkaW5nID09PSAwKSB7XHJcbiBcdFx0XHRob3RVcGRhdGVEb3dubG9hZGVkKCk7XHJcbiBcdFx0fVxyXG4gXHR9XHJcbiBcdFxyXG4gXHRmdW5jdGlvbiBob3RFbnN1cmVVcGRhdGVDaHVuayhjaHVua0lkKSB7XHJcbiBcdFx0aWYoIWhvdEF2YWlsYWJsZUZpbGVzTWFwW2NodW5rSWRdKSB7XHJcbiBcdFx0XHRob3RXYWl0aW5nRmlsZXNNYXBbY2h1bmtJZF0gPSB0cnVlO1xyXG4gXHRcdH0gZWxzZSB7XHJcbiBcdFx0XHRob3RSZXF1ZXN0ZWRGaWxlc01hcFtjaHVua0lkXSA9IHRydWU7XHJcbiBcdFx0XHRob3RXYWl0aW5nRmlsZXMrKztcclxuIFx0XHRcdGhvdERvd25sb2FkVXBkYXRlQ2h1bmsoY2h1bmtJZCk7XHJcbiBcdFx0fVxyXG4gXHR9XHJcbiBcdFxyXG4gXHRmdW5jdGlvbiBob3RVcGRhdGVEb3dubG9hZGVkKCkge1xyXG4gXHRcdGhvdFNldFN0YXR1cyhcInJlYWR5XCIpO1xyXG4gXHRcdHZhciBkZWZlcnJlZCA9IGhvdERlZmVycmVkO1xyXG4gXHRcdGhvdERlZmVycmVkID0gbnVsbDtcclxuIFx0XHRpZighZGVmZXJyZWQpIHJldHVybjtcclxuIFx0XHRpZihob3RBcHBseU9uVXBkYXRlKSB7XHJcbiBcdFx0XHQvLyBXcmFwIGRlZmVycmVkIG9iamVjdCBpbiBQcm9taXNlIHRvIG1hcmsgaXQgYXMgYSB3ZWxsLWhhbmRsZWQgUHJvbWlzZSB0b1xyXG4gXHRcdFx0Ly8gYXZvaWQgdHJpZ2dlcmluZyB1bmNhdWdodCBleGNlcHRpb24gd2FybmluZyBpbiBDaHJvbWUuXHJcbiBcdFx0XHQvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDY1NjY2XHJcbiBcdFx0XHRQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uKCkge1xyXG4gXHRcdFx0XHRyZXR1cm4gaG90QXBwbHkoaG90QXBwbHlPblVwZGF0ZSk7XHJcbiBcdFx0XHR9KS50aGVuKFxyXG4gXHRcdFx0XHRmdW5jdGlvbihyZXN1bHQpIHtcclxuIFx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7XHJcbiBcdFx0XHRcdH0sXHJcbiBcdFx0XHRcdGZ1bmN0aW9uKGVycikge1xyXG4gXHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdChlcnIpO1xyXG4gXHRcdFx0XHR9XHJcbiBcdFx0XHQpO1xyXG4gXHRcdH0gZWxzZSB7XHJcbiBcdFx0XHR2YXIgb3V0ZGF0ZWRNb2R1bGVzID0gW107XHJcbiBcdFx0XHRmb3IodmFyIGlkIGluIGhvdFVwZGF0ZSkge1xyXG4gXHRcdFx0XHRpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaG90VXBkYXRlLCBpZCkpIHtcclxuIFx0XHRcdFx0XHRvdXRkYXRlZE1vZHVsZXMucHVzaCh0b01vZHVsZUlkKGlkKSk7XHJcbiBcdFx0XHRcdH1cclxuIFx0XHRcdH1cclxuIFx0XHRcdGRlZmVycmVkLnJlc29sdmUob3V0ZGF0ZWRNb2R1bGVzKTtcclxuIFx0XHR9XHJcbiBcdH1cclxuIFx0XHJcbiBcdGZ1bmN0aW9uIGhvdEFwcGx5KG9wdGlvbnMpIHtcclxuIFx0XHRpZihob3RTdGF0dXMgIT09IFwicmVhZHlcIikgdGhyb3cgbmV3IEVycm9yKFwiYXBwbHkoKSBpcyBvbmx5IGFsbG93ZWQgaW4gcmVhZHkgc3RhdHVzXCIpO1xyXG4gXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG4gXHRcclxuIFx0XHR2YXIgY2I7XHJcbiBcdFx0dmFyIGk7XHJcbiBcdFx0dmFyIGo7XHJcbiBcdFx0dmFyIG1vZHVsZTtcclxuIFx0XHR2YXIgbW9kdWxlSWQ7XHJcbiBcdFxyXG4gXHRcdGZ1bmN0aW9uIGdldEFmZmVjdGVkU3R1ZmYodXBkYXRlTW9kdWxlSWQpIHtcclxuIFx0XHRcdHZhciBvdXRkYXRlZE1vZHVsZXMgPSBbdXBkYXRlTW9kdWxlSWRdO1xyXG4gXHRcdFx0dmFyIG91dGRhdGVkRGVwZW5kZW5jaWVzID0ge307XHJcbiBcdFxyXG4gXHRcdFx0dmFyIHF1ZXVlID0gb3V0ZGF0ZWRNb2R1bGVzLnNsaWNlKCkubWFwKGZ1bmN0aW9uKGlkKSB7XHJcbiBcdFx0XHRcdHJldHVybiB7XHJcbiBcdFx0XHRcdFx0Y2hhaW46IFtpZF0sXHJcbiBcdFx0XHRcdFx0aWQ6IGlkXHJcbiBcdFx0XHRcdH07XHJcbiBcdFx0XHR9KTtcclxuIFx0XHRcdHdoaWxlKHF1ZXVlLmxlbmd0aCA+IDApIHtcclxuIFx0XHRcdFx0dmFyIHF1ZXVlSXRlbSA9IHF1ZXVlLnBvcCgpO1xyXG4gXHRcdFx0XHR2YXIgbW9kdWxlSWQgPSBxdWV1ZUl0ZW0uaWQ7XHJcbiBcdFx0XHRcdHZhciBjaGFpbiA9IHF1ZXVlSXRlbS5jaGFpbjtcclxuIFx0XHRcdFx0bW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XHJcbiBcdFx0XHRcdGlmKCFtb2R1bGUgfHwgbW9kdWxlLmhvdC5fc2VsZkFjY2VwdGVkKVxyXG4gXHRcdFx0XHRcdGNvbnRpbnVlO1xyXG4gXHRcdFx0XHRpZihtb2R1bGUuaG90Ll9zZWxmRGVjbGluZWQpIHtcclxuIFx0XHRcdFx0XHRyZXR1cm4ge1xyXG4gXHRcdFx0XHRcdFx0dHlwZTogXCJzZWxmLWRlY2xpbmVkXCIsXHJcbiBcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4sXHJcbiBcdFx0XHRcdFx0XHRtb2R1bGVJZDogbW9kdWxlSWRcclxuIFx0XHRcdFx0XHR9O1xyXG4gXHRcdFx0XHR9XHJcbiBcdFx0XHRcdGlmKG1vZHVsZS5ob3QuX21haW4pIHtcclxuIFx0XHRcdFx0XHRyZXR1cm4ge1xyXG4gXHRcdFx0XHRcdFx0dHlwZTogXCJ1bmFjY2VwdGVkXCIsXHJcbiBcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4sXHJcbiBcdFx0XHRcdFx0XHRtb2R1bGVJZDogbW9kdWxlSWRcclxuIFx0XHRcdFx0XHR9O1xyXG4gXHRcdFx0XHR9XHJcbiBcdFx0XHRcdGZvcih2YXIgaSA9IDA7IGkgPCBtb2R1bGUucGFyZW50cy5sZW5ndGg7IGkrKykge1xyXG4gXHRcdFx0XHRcdHZhciBwYXJlbnRJZCA9IG1vZHVsZS5wYXJlbnRzW2ldO1xyXG4gXHRcdFx0XHRcdHZhciBwYXJlbnQgPSBpbnN0YWxsZWRNb2R1bGVzW3BhcmVudElkXTtcclxuIFx0XHRcdFx0XHRpZighcGFyZW50KSBjb250aW51ZTtcclxuIFx0XHRcdFx0XHRpZihwYXJlbnQuaG90Ll9kZWNsaW5lZERlcGVuZGVuY2llc1ttb2R1bGVJZF0pIHtcclxuIFx0XHRcdFx0XHRcdHJldHVybiB7XHJcbiBcdFx0XHRcdFx0XHRcdHR5cGU6IFwiZGVjbGluZWRcIixcclxuIFx0XHRcdFx0XHRcdFx0Y2hhaW46IGNoYWluLmNvbmNhdChbcGFyZW50SWRdKSxcclxuIFx0XHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkLFxyXG4gXHRcdFx0XHRcdFx0XHRwYXJlbnRJZDogcGFyZW50SWRcclxuIFx0XHRcdFx0XHRcdH07XHJcbiBcdFx0XHRcdFx0fVxyXG4gXHRcdFx0XHRcdGlmKG91dGRhdGVkTW9kdWxlcy5pbmRleE9mKHBhcmVudElkKSA+PSAwKSBjb250aW51ZTtcclxuIFx0XHRcdFx0XHRpZihwYXJlbnQuaG90Ll9hY2NlcHRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0pIHtcclxuIFx0XHRcdFx0XHRcdGlmKCFvdXRkYXRlZERlcGVuZGVuY2llc1twYXJlbnRJZF0pXHJcbiBcdFx0XHRcdFx0XHRcdG91dGRhdGVkRGVwZW5kZW5jaWVzW3BhcmVudElkXSA9IFtdO1xyXG4gXHRcdFx0XHRcdFx0YWRkQWxsVG9TZXQob3V0ZGF0ZWREZXBlbmRlbmNpZXNbcGFyZW50SWRdLCBbbW9kdWxlSWRdKTtcclxuIFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG4gXHRcdFx0XHRcdH1cclxuIFx0XHRcdFx0XHRkZWxldGUgb3V0ZGF0ZWREZXBlbmRlbmNpZXNbcGFyZW50SWRdO1xyXG4gXHRcdFx0XHRcdG91dGRhdGVkTW9kdWxlcy5wdXNoKHBhcmVudElkKTtcclxuIFx0XHRcdFx0XHRxdWV1ZS5wdXNoKHtcclxuIFx0XHRcdFx0XHRcdGNoYWluOiBjaGFpbi5jb25jYXQoW3BhcmVudElkXSksXHJcbiBcdFx0XHRcdFx0XHRpZDogcGFyZW50SWRcclxuIFx0XHRcdFx0XHR9KTtcclxuIFx0XHRcdFx0fVxyXG4gXHRcdFx0fVxyXG4gXHRcclxuIFx0XHRcdHJldHVybiB7XHJcbiBcdFx0XHRcdHR5cGU6IFwiYWNjZXB0ZWRcIixcclxuIFx0XHRcdFx0bW9kdWxlSWQ6IHVwZGF0ZU1vZHVsZUlkLFxyXG4gXHRcdFx0XHRvdXRkYXRlZE1vZHVsZXM6IG91dGRhdGVkTW9kdWxlcyxcclxuIFx0XHRcdFx0b3V0ZGF0ZWREZXBlbmRlbmNpZXM6IG91dGRhdGVkRGVwZW5kZW5jaWVzXHJcbiBcdFx0XHR9O1xyXG4gXHRcdH1cclxuIFx0XHJcbiBcdFx0ZnVuY3Rpb24gYWRkQWxsVG9TZXQoYSwgYikge1xyXG4gXHRcdFx0Zm9yKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcclxuIFx0XHRcdFx0dmFyIGl0ZW0gPSBiW2ldO1xyXG4gXHRcdFx0XHRpZihhLmluZGV4T2YoaXRlbSkgPCAwKVxyXG4gXHRcdFx0XHRcdGEucHVzaChpdGVtKTtcclxuIFx0XHRcdH1cclxuIFx0XHR9XHJcbiBcdFxyXG4gXHRcdC8vIGF0IGJlZ2luIGFsbCB1cGRhdGVzIG1vZHVsZXMgYXJlIG91dGRhdGVkXHJcbiBcdFx0Ly8gdGhlIFwib3V0ZGF0ZWRcIiBzdGF0dXMgY2FuIHByb3BhZ2F0ZSB0byBwYXJlbnRzIGlmIHRoZXkgZG9uJ3QgYWNjZXB0IHRoZSBjaGlsZHJlblxyXG4gXHRcdHZhciBvdXRkYXRlZERlcGVuZGVuY2llcyA9IHt9O1xyXG4gXHRcdHZhciBvdXRkYXRlZE1vZHVsZXMgPSBbXTtcclxuIFx0XHR2YXIgYXBwbGllZFVwZGF0ZSA9IHt9O1xyXG4gXHRcclxuIFx0XHR2YXIgd2FyblVuZXhwZWN0ZWRSZXF1aXJlID0gZnVuY3Rpb24gd2FyblVuZXhwZWN0ZWRSZXF1aXJlKCkge1xyXG4gXHRcdFx0Y29uc29sZS53YXJuKFwiW0hNUl0gdW5leHBlY3RlZCByZXF1aXJlKFwiICsgcmVzdWx0Lm1vZHVsZUlkICsgXCIpIHRvIGRpc3Bvc2VkIG1vZHVsZVwiKTtcclxuIFx0XHR9O1xyXG4gXHRcclxuIFx0XHRmb3IodmFyIGlkIGluIGhvdFVwZGF0ZSkge1xyXG4gXHRcdFx0aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhvdFVwZGF0ZSwgaWQpKSB7XHJcbiBcdFx0XHRcdG1vZHVsZUlkID0gdG9Nb2R1bGVJZChpZCk7XHJcbiBcdFx0XHRcdHZhciByZXN1bHQ7XHJcbiBcdFx0XHRcdGlmKGhvdFVwZGF0ZVtpZF0pIHtcclxuIFx0XHRcdFx0XHRyZXN1bHQgPSBnZXRBZmZlY3RlZFN0dWZmKG1vZHVsZUlkKTtcclxuIFx0XHRcdFx0fSBlbHNlIHtcclxuIFx0XHRcdFx0XHRyZXN1bHQgPSB7XHJcbiBcdFx0XHRcdFx0XHR0eXBlOiBcImRpc3Bvc2VkXCIsXHJcbiBcdFx0XHRcdFx0XHRtb2R1bGVJZDogaWRcclxuIFx0XHRcdFx0XHR9O1xyXG4gXHRcdFx0XHR9XHJcbiBcdFx0XHRcdHZhciBhYm9ydEVycm9yID0gZmFsc2U7XHJcbiBcdFx0XHRcdHZhciBkb0FwcGx5ID0gZmFsc2U7XHJcbiBcdFx0XHRcdHZhciBkb0Rpc3Bvc2UgPSBmYWxzZTtcclxuIFx0XHRcdFx0dmFyIGNoYWluSW5mbyA9IFwiXCI7XHJcbiBcdFx0XHRcdGlmKHJlc3VsdC5jaGFpbikge1xyXG4gXHRcdFx0XHRcdGNoYWluSW5mbyA9IFwiXFxuVXBkYXRlIHByb3BhZ2F0aW9uOiBcIiArIHJlc3VsdC5jaGFpbi5qb2luKFwiIC0+IFwiKTtcclxuIFx0XHRcdFx0fVxyXG4gXHRcdFx0XHRzd2l0Y2gocmVzdWx0LnR5cGUpIHtcclxuIFx0XHRcdFx0XHRjYXNlIFwic2VsZi1kZWNsaW5lZFwiOlxyXG4gXHRcdFx0XHRcdFx0aWYob3B0aW9ucy5vbkRlY2xpbmVkKVxyXG4gXHRcdFx0XHRcdFx0XHRvcHRpb25zLm9uRGVjbGluZWQocmVzdWx0KTtcclxuIFx0XHRcdFx0XHRcdGlmKCFvcHRpb25zLmlnbm9yZURlY2xpbmVkKVxyXG4gXHRcdFx0XHRcdFx0XHRhYm9ydEVycm9yID0gbmV3IEVycm9yKFwiQWJvcnRlZCBiZWNhdXNlIG9mIHNlbGYgZGVjbGluZTogXCIgKyByZXN1bHQubW9kdWxlSWQgKyBjaGFpbkluZm8pO1xyXG4gXHRcdFx0XHRcdFx0YnJlYWs7XHJcbiBcdFx0XHRcdFx0Y2FzZSBcImRlY2xpbmVkXCI6XHJcbiBcdFx0XHRcdFx0XHRpZihvcHRpb25zLm9uRGVjbGluZWQpXHJcbiBcdFx0XHRcdFx0XHRcdG9wdGlvbnMub25EZWNsaW5lZChyZXN1bHQpO1xyXG4gXHRcdFx0XHRcdFx0aWYoIW9wdGlvbnMuaWdub3JlRGVjbGluZWQpXHJcbiBcdFx0XHRcdFx0XHRcdGFib3J0RXJyb3IgPSBuZXcgRXJyb3IoXCJBYm9ydGVkIGJlY2F1c2Ugb2YgZGVjbGluZWQgZGVwZW5kZW5jeTogXCIgKyByZXN1bHQubW9kdWxlSWQgKyBcIiBpbiBcIiArIHJlc3VsdC5wYXJlbnRJZCArIGNoYWluSW5mbyk7XHJcbiBcdFx0XHRcdFx0XHRicmVhaztcclxuIFx0XHRcdFx0XHRjYXNlIFwidW5hY2NlcHRlZFwiOlxyXG4gXHRcdFx0XHRcdFx0aWYob3B0aW9ucy5vblVuYWNjZXB0ZWQpXHJcbiBcdFx0XHRcdFx0XHRcdG9wdGlvbnMub25VbmFjY2VwdGVkKHJlc3VsdCk7XHJcbiBcdFx0XHRcdFx0XHRpZighb3B0aW9ucy5pZ25vcmVVbmFjY2VwdGVkKVxyXG4gXHRcdFx0XHRcdFx0XHRhYm9ydEVycm9yID0gbmV3IEVycm9yKFwiQWJvcnRlZCBiZWNhdXNlIFwiICsgbW9kdWxlSWQgKyBcIiBpcyBub3QgYWNjZXB0ZWRcIiArIGNoYWluSW5mbyk7XHJcbiBcdFx0XHRcdFx0XHRicmVhaztcclxuIFx0XHRcdFx0XHRjYXNlIFwiYWNjZXB0ZWRcIjpcclxuIFx0XHRcdFx0XHRcdGlmKG9wdGlvbnMub25BY2NlcHRlZClcclxuIFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5vbkFjY2VwdGVkKHJlc3VsdCk7XHJcbiBcdFx0XHRcdFx0XHRkb0FwcGx5ID0gdHJ1ZTtcclxuIFx0XHRcdFx0XHRcdGJyZWFrO1xyXG4gXHRcdFx0XHRcdGNhc2UgXCJkaXNwb3NlZFwiOlxyXG4gXHRcdFx0XHRcdFx0aWYob3B0aW9ucy5vbkRpc3Bvc2VkKVxyXG4gXHRcdFx0XHRcdFx0XHRvcHRpb25zLm9uRGlzcG9zZWQocmVzdWx0KTtcclxuIFx0XHRcdFx0XHRcdGRvRGlzcG9zZSA9IHRydWU7XHJcbiBcdFx0XHRcdFx0XHRicmVhaztcclxuIFx0XHRcdFx0XHRkZWZhdWx0OlxyXG4gXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5leGNlcHRpb24gdHlwZSBcIiArIHJlc3VsdC50eXBlKTtcclxuIFx0XHRcdFx0fVxyXG4gXHRcdFx0XHRpZihhYm9ydEVycm9yKSB7XHJcbiBcdFx0XHRcdFx0aG90U2V0U3RhdHVzKFwiYWJvcnRcIik7XHJcbiBcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGFib3J0RXJyb3IpO1xyXG4gXHRcdFx0XHR9XHJcbiBcdFx0XHRcdGlmKGRvQXBwbHkpIHtcclxuIFx0XHRcdFx0XHRhcHBsaWVkVXBkYXRlW21vZHVsZUlkXSA9IGhvdFVwZGF0ZVttb2R1bGVJZF07XHJcbiBcdFx0XHRcdFx0YWRkQWxsVG9TZXQob3V0ZGF0ZWRNb2R1bGVzLCByZXN1bHQub3V0ZGF0ZWRNb2R1bGVzKTtcclxuIFx0XHRcdFx0XHRmb3IobW9kdWxlSWQgaW4gcmVzdWx0Lm91dGRhdGVkRGVwZW5kZW5jaWVzKSB7XHJcbiBcdFx0XHRcdFx0XHRpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVzdWx0Lm91dGRhdGVkRGVwZW5kZW5jaWVzLCBtb2R1bGVJZCkpIHtcclxuIFx0XHRcdFx0XHRcdFx0aWYoIW91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXSlcclxuIFx0XHRcdFx0XHRcdFx0XHRvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0gPSBbXTtcclxuIFx0XHRcdFx0XHRcdFx0YWRkQWxsVG9TZXQob3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdLCByZXN1bHQub3V0ZGF0ZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdKTtcclxuIFx0XHRcdFx0XHRcdH1cclxuIFx0XHRcdFx0XHR9XHJcbiBcdFx0XHRcdH1cclxuIFx0XHRcdFx0aWYoZG9EaXNwb3NlKSB7XHJcbiBcdFx0XHRcdFx0YWRkQWxsVG9TZXQob3V0ZGF0ZWRNb2R1bGVzLCBbcmVzdWx0Lm1vZHVsZUlkXSk7XHJcbiBcdFx0XHRcdFx0YXBwbGllZFVwZGF0ZVttb2R1bGVJZF0gPSB3YXJuVW5leHBlY3RlZFJlcXVpcmU7XHJcbiBcdFx0XHRcdH1cclxuIFx0XHRcdH1cclxuIFx0XHR9XHJcbiBcdFxyXG4gXHRcdC8vIFN0b3JlIHNlbGYgYWNjZXB0ZWQgb3V0ZGF0ZWQgbW9kdWxlcyB0byByZXF1aXJlIHRoZW0gbGF0ZXIgYnkgdGhlIG1vZHVsZSBzeXN0ZW1cclxuIFx0XHR2YXIgb3V0ZGF0ZWRTZWxmQWNjZXB0ZWRNb2R1bGVzID0gW107XHJcbiBcdFx0Zm9yKGkgPSAwOyBpIDwgb3V0ZGF0ZWRNb2R1bGVzLmxlbmd0aDsgaSsrKSB7XHJcbiBcdFx0XHRtb2R1bGVJZCA9IG91dGRhdGVkTW9kdWxlc1tpXTtcclxuIFx0XHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdICYmIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmhvdC5fc2VsZkFjY2VwdGVkKVxyXG4gXHRcdFx0XHRvdXRkYXRlZFNlbGZBY2NlcHRlZE1vZHVsZXMucHVzaCh7XHJcbiBcdFx0XHRcdFx0bW9kdWxlOiBtb2R1bGVJZCxcclxuIFx0XHRcdFx0XHRlcnJvckhhbmRsZXI6IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmhvdC5fc2VsZkFjY2VwdGVkXHJcbiBcdFx0XHRcdH0pO1xyXG4gXHRcdH1cclxuIFx0XHJcbiBcdFx0Ly8gTm93IGluIFwiZGlzcG9zZVwiIHBoYXNlXHJcbiBcdFx0aG90U2V0U3RhdHVzKFwiZGlzcG9zZVwiKTtcclxuIFx0XHRPYmplY3Qua2V5cyhob3RBdmFpbGFibGVGaWxlc01hcCkuZm9yRWFjaChmdW5jdGlvbihjaHVua0lkKSB7XHJcbiBcdFx0XHRpZihob3RBdmFpbGFibGVGaWxlc01hcFtjaHVua0lkXSA9PT0gZmFsc2UpIHtcclxuIFx0XHRcdFx0aG90RGlzcG9zZUNodW5rKGNodW5rSWQpO1xyXG4gXHRcdFx0fVxyXG4gXHRcdH0pO1xyXG4gXHRcclxuIFx0XHR2YXIgaWR4O1xyXG4gXHRcdHZhciBxdWV1ZSA9IG91dGRhdGVkTW9kdWxlcy5zbGljZSgpO1xyXG4gXHRcdHdoaWxlKHF1ZXVlLmxlbmd0aCA+IDApIHtcclxuIFx0XHRcdG1vZHVsZUlkID0gcXVldWUucG9wKCk7XHJcbiBcdFx0XHRtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcclxuIFx0XHRcdGlmKCFtb2R1bGUpIGNvbnRpbnVlO1xyXG4gXHRcclxuIFx0XHRcdHZhciBkYXRhID0ge307XHJcbiBcdFxyXG4gXHRcdFx0Ly8gQ2FsbCBkaXNwb3NlIGhhbmRsZXJzXHJcbiBcdFx0XHR2YXIgZGlzcG9zZUhhbmRsZXJzID0gbW9kdWxlLmhvdC5fZGlzcG9zZUhhbmRsZXJzO1xyXG4gXHRcdFx0Zm9yKGogPSAwOyBqIDwgZGlzcG9zZUhhbmRsZXJzLmxlbmd0aDsgaisrKSB7XHJcbiBcdFx0XHRcdGNiID0gZGlzcG9zZUhhbmRsZXJzW2pdO1xyXG4gXHRcdFx0XHRjYihkYXRhKTtcclxuIFx0XHRcdH1cclxuIFx0XHRcdGhvdEN1cnJlbnRNb2R1bGVEYXRhW21vZHVsZUlkXSA9IGRhdGE7XHJcbiBcdFxyXG4gXHRcdFx0Ly8gZGlzYWJsZSBtb2R1bGUgKHRoaXMgZGlzYWJsZXMgcmVxdWlyZXMgZnJvbSB0aGlzIG1vZHVsZSlcclxuIFx0XHRcdG1vZHVsZS5ob3QuYWN0aXZlID0gZmFsc2U7XHJcbiBcdFxyXG4gXHRcdFx0Ly8gcmVtb3ZlIG1vZHVsZSBmcm9tIGNhY2hlXHJcbiBcdFx0XHRkZWxldGUgaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XHJcbiBcdFxyXG4gXHRcdFx0Ly8gd2hlbiBkaXNwb3NpbmcgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIGRpc3Bvc2UgaGFuZGxlclxyXG4gXHRcdFx0ZGVsZXRlIG91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXTtcclxuIFx0XHJcbiBcdFx0XHQvLyByZW1vdmUgXCJwYXJlbnRzXCIgcmVmZXJlbmNlcyBmcm9tIGFsbCBjaGlsZHJlblxyXG4gXHRcdFx0Zm9yKGogPSAwOyBqIDwgbW9kdWxlLmNoaWxkcmVuLmxlbmd0aDsgaisrKSB7XHJcbiBcdFx0XHRcdHZhciBjaGlsZCA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlLmNoaWxkcmVuW2pdXTtcclxuIFx0XHRcdFx0aWYoIWNoaWxkKSBjb250aW51ZTtcclxuIFx0XHRcdFx0aWR4ID0gY2hpbGQucGFyZW50cy5pbmRleE9mKG1vZHVsZUlkKTtcclxuIFx0XHRcdFx0aWYoaWR4ID49IDApIHtcclxuIFx0XHRcdFx0XHRjaGlsZC5wYXJlbnRzLnNwbGljZShpZHgsIDEpO1xyXG4gXHRcdFx0XHR9XHJcbiBcdFx0XHR9XHJcbiBcdFx0fVxyXG4gXHRcclxuIFx0XHQvLyByZW1vdmUgb3V0ZGF0ZWQgZGVwZW5kZW5jeSBmcm9tIG1vZHVsZSBjaGlsZHJlblxyXG4gXHRcdHZhciBkZXBlbmRlbmN5O1xyXG4gXHRcdHZhciBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llcztcclxuIFx0XHRmb3IobW9kdWxlSWQgaW4gb3V0ZGF0ZWREZXBlbmRlbmNpZXMpIHtcclxuIFx0XHRcdGlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvdXRkYXRlZERlcGVuZGVuY2llcywgbW9kdWxlSWQpKSB7XHJcbiBcdFx0XHRcdG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xyXG4gXHRcdFx0XHRpZihtb2R1bGUpIHtcclxuIFx0XHRcdFx0XHRtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llcyA9IG91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXTtcclxuIFx0XHRcdFx0XHRmb3IoaiA9IDA7IGogPCBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llcy5sZW5ndGg7IGorKykge1xyXG4gXHRcdFx0XHRcdFx0ZGVwZW5kZW5jeSA9IG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzW2pdO1xyXG4gXHRcdFx0XHRcdFx0aWR4ID0gbW9kdWxlLmNoaWxkcmVuLmluZGV4T2YoZGVwZW5kZW5jeSk7XHJcbiBcdFx0XHRcdFx0XHRpZihpZHggPj0gMCkgbW9kdWxlLmNoaWxkcmVuLnNwbGljZShpZHgsIDEpO1xyXG4gXHRcdFx0XHRcdH1cclxuIFx0XHRcdFx0fVxyXG4gXHRcdFx0fVxyXG4gXHRcdH1cclxuIFx0XHJcbiBcdFx0Ly8gTm90IGluIFwiYXBwbHlcIiBwaGFzZVxyXG4gXHRcdGhvdFNldFN0YXR1cyhcImFwcGx5XCIpO1xyXG4gXHRcclxuIFx0XHRob3RDdXJyZW50SGFzaCA9IGhvdFVwZGF0ZU5ld0hhc2g7XHJcbiBcdFxyXG4gXHRcdC8vIGluc2VydCBuZXcgY29kZVxyXG4gXHRcdGZvcihtb2R1bGVJZCBpbiBhcHBsaWVkVXBkYXRlKSB7XHJcbiBcdFx0XHRpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXBwbGllZFVwZGF0ZSwgbW9kdWxlSWQpKSB7XHJcbiBcdFx0XHRcdG1vZHVsZXNbbW9kdWxlSWRdID0gYXBwbGllZFVwZGF0ZVttb2R1bGVJZF07XHJcbiBcdFx0XHR9XHJcbiBcdFx0fVxyXG4gXHRcclxuIFx0XHQvLyBjYWxsIGFjY2VwdCBoYW5kbGVyc1xyXG4gXHRcdHZhciBlcnJvciA9IG51bGw7XHJcbiBcdFx0Zm9yKG1vZHVsZUlkIGluIG91dGRhdGVkRGVwZW5kZW5jaWVzKSB7XHJcbiBcdFx0XHRpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3V0ZGF0ZWREZXBlbmRlbmNpZXMsIG1vZHVsZUlkKSkge1xyXG4gXHRcdFx0XHRtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcclxuIFx0XHRcdFx0aWYobW9kdWxlKSB7XHJcbiBcdFx0XHRcdFx0bW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXMgPSBvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF07XHJcbiBcdFx0XHRcdFx0dmFyIGNhbGxiYWNrcyA9IFtdO1xyXG4gXHRcdFx0XHRcdGZvcihpID0gMDsgaSA8IG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrKSB7XHJcbiBcdFx0XHRcdFx0XHRkZXBlbmRlbmN5ID0gbW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXNbaV07XHJcbiBcdFx0XHRcdFx0XHRjYiA9IG1vZHVsZS5ob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW2RlcGVuZGVuY3ldO1xyXG4gXHRcdFx0XHRcdFx0aWYoY2IpIHtcclxuIFx0XHRcdFx0XHRcdFx0aWYoY2FsbGJhY2tzLmluZGV4T2YoY2IpID49IDApIGNvbnRpbnVlO1xyXG4gXHRcdFx0XHRcdFx0XHRjYWxsYmFja3MucHVzaChjYik7XHJcbiBcdFx0XHRcdFx0XHR9XHJcbiBcdFx0XHRcdFx0fVxyXG4gXHRcdFx0XHRcdGZvcihpID0gMDsgaSA8IGNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xyXG4gXHRcdFx0XHRcdFx0Y2IgPSBjYWxsYmFja3NbaV07XHJcbiBcdFx0XHRcdFx0XHR0cnkge1xyXG4gXHRcdFx0XHRcdFx0XHRjYihtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llcyk7XHJcbiBcdFx0XHRcdFx0XHR9IGNhdGNoKGVycikge1xyXG4gXHRcdFx0XHRcdFx0XHRpZihvcHRpb25zLm9uRXJyb3JlZCkge1xyXG4gXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMub25FcnJvcmVkKHtcclxuIFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiYWNjZXB0LWVycm9yZWRcIixcclxuIFx0XHRcdFx0XHRcdFx0XHRcdG1vZHVsZUlkOiBtb2R1bGVJZCxcclxuIFx0XHRcdFx0XHRcdFx0XHRcdGRlcGVuZGVuY3lJZDogbW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXNbaV0sXHJcbiBcdFx0XHRcdFx0XHRcdFx0XHRlcnJvcjogZXJyXHJcbiBcdFx0XHRcdFx0XHRcdFx0fSk7XHJcbiBcdFx0XHRcdFx0XHRcdH1cclxuIFx0XHRcdFx0XHRcdFx0aWYoIW9wdGlvbnMuaWdub3JlRXJyb3JlZCkge1xyXG4gXHRcdFx0XHRcdFx0XHRcdGlmKCFlcnJvcilcclxuIFx0XHRcdFx0XHRcdFx0XHRcdGVycm9yID0gZXJyO1xyXG4gXHRcdFx0XHRcdFx0XHR9XHJcbiBcdFx0XHRcdFx0XHR9XHJcbiBcdFx0XHRcdFx0fVxyXG4gXHRcdFx0XHR9XHJcbiBcdFx0XHR9XHJcbiBcdFx0fVxyXG4gXHRcclxuIFx0XHQvLyBMb2FkIHNlbGYgYWNjZXB0ZWQgbW9kdWxlc1xyXG4gXHRcdGZvcihpID0gMDsgaSA8IG91dGRhdGVkU2VsZkFjY2VwdGVkTW9kdWxlcy5sZW5ndGg7IGkrKykge1xyXG4gXHRcdFx0dmFyIGl0ZW0gPSBvdXRkYXRlZFNlbGZBY2NlcHRlZE1vZHVsZXNbaV07XHJcbiBcdFx0XHRtb2R1bGVJZCA9IGl0ZW0ubW9kdWxlO1xyXG4gXHRcdFx0aG90Q3VycmVudFBhcmVudHMgPSBbbW9kdWxlSWRdO1xyXG4gXHRcdFx0dHJ5IHtcclxuIFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCk7XHJcbiBcdFx0XHR9IGNhdGNoKGVycikge1xyXG4gXHRcdFx0XHRpZih0eXBlb2YgaXRlbS5lcnJvckhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gXHRcdFx0XHRcdHRyeSB7XHJcbiBcdFx0XHRcdFx0XHRpdGVtLmVycm9ySGFuZGxlcihlcnIpO1xyXG4gXHRcdFx0XHRcdH0gY2F0Y2goZXJyMikge1xyXG4gXHRcdFx0XHRcdFx0aWYob3B0aW9ucy5vbkVycm9yZWQpIHtcclxuIFx0XHRcdFx0XHRcdFx0b3B0aW9ucy5vbkVycm9yZWQoe1xyXG4gXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwic2VsZi1hY2NlcHQtZXJyb3ItaGFuZGxlci1lcnJvcmVkXCIsXHJcbiBcdFx0XHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkLFxyXG4gXHRcdFx0XHRcdFx0XHRcdGVycm9yOiBlcnIyLFxyXG4gXHRcdFx0XHRcdFx0XHRcdG9yZ2luYWxFcnJvcjogZXJyLCAvLyBUT0RPIHJlbW92ZSBpbiB3ZWJwYWNrIDRcclxuIFx0XHRcdFx0XHRcdFx0XHRvcmlnaW5hbEVycm9yOiBlcnJcclxuIFx0XHRcdFx0XHRcdFx0fSk7XHJcbiBcdFx0XHRcdFx0XHR9XHJcbiBcdFx0XHRcdFx0XHRpZighb3B0aW9ucy5pZ25vcmVFcnJvcmVkKSB7XHJcbiBcdFx0XHRcdFx0XHRcdGlmKCFlcnJvcilcclxuIFx0XHRcdFx0XHRcdFx0XHRlcnJvciA9IGVycjI7XHJcbiBcdFx0XHRcdFx0XHR9XHJcbiBcdFx0XHRcdFx0XHRpZighZXJyb3IpXHJcbiBcdFx0XHRcdFx0XHRcdGVycm9yID0gZXJyO1xyXG4gXHRcdFx0XHRcdH1cclxuIFx0XHRcdFx0fSBlbHNlIHtcclxuIFx0XHRcdFx0XHRpZihvcHRpb25zLm9uRXJyb3JlZCkge1xyXG4gXHRcdFx0XHRcdFx0b3B0aW9ucy5vbkVycm9yZWQoe1xyXG4gXHRcdFx0XHRcdFx0XHR0eXBlOiBcInNlbGYtYWNjZXB0LWVycm9yZWRcIixcclxuIFx0XHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkLFxyXG4gXHRcdFx0XHRcdFx0XHRlcnJvcjogZXJyXHJcbiBcdFx0XHRcdFx0XHR9KTtcclxuIFx0XHRcdFx0XHR9XHJcbiBcdFx0XHRcdFx0aWYoIW9wdGlvbnMuaWdub3JlRXJyb3JlZCkge1xyXG4gXHRcdFx0XHRcdFx0aWYoIWVycm9yKVxyXG4gXHRcdFx0XHRcdFx0XHRlcnJvciA9IGVycjtcclxuIFx0XHRcdFx0XHR9XHJcbiBcdFx0XHRcdH1cclxuIFx0XHRcdH1cclxuIFx0XHR9XHJcbiBcdFxyXG4gXHRcdC8vIGhhbmRsZSBlcnJvcnMgaW4gYWNjZXB0IGhhbmRsZXJzIGFuZCBzZWxmIGFjY2VwdGVkIG1vZHVsZSBsb2FkXHJcbiBcdFx0aWYoZXJyb3IpIHtcclxuIFx0XHRcdGhvdFNldFN0YXR1cyhcImZhaWxcIik7XHJcbiBcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xyXG4gXHRcdH1cclxuIFx0XHJcbiBcdFx0aG90U2V0U3RhdHVzKFwiaWRsZVwiKTtcclxuIFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xyXG4gXHRcdFx0cmVzb2x2ZShvdXRkYXRlZE1vZHVsZXMpO1xyXG4gXHRcdH0pO1xyXG4gXHR9XHJcblxuIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aG90OiBob3RDcmVhdGVNb2R1bGUobW9kdWxlSWQpLFxuIFx0XHRcdHBhcmVudHM6IChob3RDdXJyZW50UGFyZW50c1RlbXAgPSBob3RDdXJyZW50UGFyZW50cywgaG90Q3VycmVudFBhcmVudHMgPSBbXSwgaG90Q3VycmVudFBhcmVudHNUZW1wKSxcbiBcdFx0XHRjaGlsZHJlbjogW11cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgaG90Q3JlYXRlUmVxdWlyZShtb2R1bGVJZCkpO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBfX3dlYnBhY2tfaGFzaF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmggPSBmdW5jdGlvbigpIHsgcmV0dXJuIGhvdEN1cnJlbnRIYXNoOyB9O1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBob3RDcmVhdGVSZXF1aXJlKDExOCkoX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTE4KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA0M2JkZDRkOTI2MzRmOTE3MzJjZSIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJwYXRoXCJcbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwic3RyZWFtXCJcbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYgKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpIF9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYnVmZmVyXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiYnVmZmVyXCJcbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHN0b3JlID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ3drcycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlN5bWJvbDtcbnZhciBVU0VfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xuXG52YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuICAgIFVTRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdIHx8IChVU0VfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuXG4kZXhwb3J0cy5zdG9yZSA9IHN0b3JlO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanNcbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBEZXRlY3QgRWxlY3Ryb24gcmVuZGVyZXIgcHJvY2Vzcywgd2hpY2ggaXMgbm9kZSwgYnV0IHdlIHNob3VsZFxuICogdHJlYXQgYXMgYSBicm93c2VyLlxuICovXG5cbmlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9icm93c2VyLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbm9kZS5qcycpO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2RlYnVnL3NyYy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0geyB2ZXJzaW9uOiAnMi41LjYnIH07XG5pZiAodHlwZW9mIF9fZSA9PSAnbnVtYmVyJykgX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb3JlLmpzXG4vLyBtb2R1bGUgaWQgPSA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogZGVwZFxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNyBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBjYWxsU2l0ZVRvU3RyaW5nID0gcmVxdWlyZSgnLi9saWIvY29tcGF0JykuY2FsbFNpdGVUb1N0cmluZ1xudmFyIGV2ZW50TGlzdGVuZXJDb3VudCA9IHJlcXVpcmUoJy4vbGliL2NvbXBhdCcpLmV2ZW50TGlzdGVuZXJDb3VudFxudmFyIHJlbGF0aXZlID0gcmVxdWlyZSgncGF0aCcpLnJlbGF0aXZlXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXBkXG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIHRvIGJhc2UgZmlsZXMgb24uXG4gKi9cblxudmFyIGJhc2VQYXRoID0gcHJvY2Vzcy5jd2QoKVxuXG4vKipcbiAqIERldGVybWluZSBpZiBuYW1lc3BhY2UgaXMgY29udGFpbmVkIGluIHRoZSBzdHJpbmcuXG4gKi9cblxuZnVuY3Rpb24gY29udGFpbnNOYW1lc3BhY2UgKHN0ciwgbmFtZXNwYWNlKSB7XG4gIHZhciB2YWxzID0gc3RyLnNwbGl0KC9bICxdKy8pXG4gIHZhciBucyA9IFN0cmluZyhuYW1lc3BhY2UpLnRvTG93ZXJDYXNlKClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdmFsID0gdmFsc1tpXVxuXG4gICAgLy8gbmFtZXNwYWNlIGNvbnRhaW5lZFxuICAgIGlmICh2YWwgJiYgKHZhbCA9PT0gJyonIHx8IHZhbC50b0xvd2VyQ2FzZSgpID09PSBucykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQ29udmVydCBhIGRhdGEgZGVzY3JpcHRvciB0byBhY2Nlc3NvciBkZXNjcmlwdG9yLlxuICovXG5cbmZ1bmN0aW9uIGNvbnZlcnREYXRhRGVzY3JpcHRvclRvQWNjZXNzb3IgKG9iaiwgcHJvcCwgbWVzc2FnZSkge1xuICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKVxuICB2YXIgdmFsdWUgPSBkZXNjcmlwdG9yLnZhbHVlXG5cbiAgZGVzY3JpcHRvci5nZXQgPSBmdW5jdGlvbiBnZXR0ZXIgKCkgeyByZXR1cm4gdmFsdWUgfVxuXG4gIGlmIChkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgZGVzY3JpcHRvci5zZXQgPSBmdW5jdGlvbiBzZXR0ZXIgKHZhbCkgeyByZXR1cm4gKHZhbHVlID0gdmFsKSB9XG4gIH1cblxuICBkZWxldGUgZGVzY3JpcHRvci52YWx1ZVxuICBkZWxldGUgZGVzY3JpcHRvci53cml0YWJsZVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2NyaXB0b3IpXG5cbiAgcmV0dXJuIGRlc2NyaXB0b3Jcbn1cblxuLyoqXG4gKiBDcmVhdGUgYXJndW1lbnRzIHN0cmluZyB0byBrZWVwIGFyaXR5LlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUFyZ3VtZW50c1N0cmluZyAoYXJpdHkpIHtcbiAgdmFyIHN0ciA9ICcnXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcml0eTsgaSsrKSB7XG4gICAgc3RyICs9ICcsIGFyZycgKyBpXG4gIH1cblxuICByZXR1cm4gc3RyLnN1YnN0cigyKVxufVxuXG4vKipcbiAqIENyZWF0ZSBzdGFjayBzdHJpbmcgZnJvbSBzdGFjay5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTdGFja1N0cmluZyAoc3RhY2spIHtcbiAgdmFyIHN0ciA9IHRoaXMubmFtZSArICc6ICcgKyB0aGlzLm5hbWVzcGFjZVxuXG4gIGlmICh0aGlzLm1lc3NhZ2UpIHtcbiAgICBzdHIgKz0gJyBkZXByZWNhdGVkICcgKyB0aGlzLm1lc3NhZ2VcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspIHtcbiAgICBzdHIgKz0gJ1xcbiAgICBhdCAnICsgY2FsbFNpdGVUb1N0cmluZyhzdGFja1tpXSlcbiAgfVxuXG4gIHJldHVybiBzdHJcbn1cblxuLyoqXG4gKiBDcmVhdGUgZGVwcmVjYXRlIGZvciBuYW1lc3BhY2UgaW4gY2FsbGVyLlxuICovXG5cbmZ1bmN0aW9uIGRlcGQgKG5hbWVzcGFjZSkge1xuICBpZiAoIW5hbWVzcGFjZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG5hbWVzcGFjZSBpcyByZXF1aXJlZCcpXG4gIH1cblxuICB2YXIgc3RhY2sgPSBnZXRTdGFjaygpXG4gIHZhciBzaXRlID0gY2FsbFNpdGVMb2NhdGlvbihzdGFja1sxXSlcbiAgdmFyIGZpbGUgPSBzaXRlWzBdXG5cbiAgZnVuY3Rpb24gZGVwcmVjYXRlIChtZXNzYWdlKSB7XG4gICAgLy8gY2FsbCB0byBzZWxmIGFzIGxvZ1xuICAgIGxvZy5jYWxsKGRlcHJlY2F0ZSwgbWVzc2FnZSlcbiAgfVxuXG4gIGRlcHJlY2F0ZS5fZmlsZSA9IGZpbGVcbiAgZGVwcmVjYXRlLl9pZ25vcmVkID0gaXNpZ25vcmVkKG5hbWVzcGFjZSlcbiAgZGVwcmVjYXRlLl9uYW1lc3BhY2UgPSBuYW1lc3BhY2VcbiAgZGVwcmVjYXRlLl90cmFjZWQgPSBpc3RyYWNlZChuYW1lc3BhY2UpXG4gIGRlcHJlY2F0ZS5fd2FybmVkID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIGRlcHJlY2F0ZS5mdW5jdGlvbiA9IHdyYXBmdW5jdGlvblxuICBkZXByZWNhdGUucHJvcGVydHkgPSB3cmFwcHJvcGVydHlcblxuICByZXR1cm4gZGVwcmVjYXRlXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIG5hbWVzcGFjZSBpcyBpZ25vcmVkLlxuICovXG5cbmZ1bmN0aW9uIGlzaWdub3JlZCAobmFtZXNwYWNlKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiB0ZXN0ZWQgaW4gYSBjaGlsZCBwcm9jZXNzcyAqL1xuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uKSB7XG4gICAgLy8gLS1uby1kZXByZWNhdGlvbiBzdXBwb3J0XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHZhciBzdHIgPSBwcm9jZXNzLmVudi5OT19ERVBSRUNBVElPTiB8fCAnJ1xuXG4gIC8vIG5hbWVzcGFjZSBpZ25vcmVkXG4gIHJldHVybiBjb250YWluc05hbWVzcGFjZShzdHIsIG5hbWVzcGFjZSlcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgbmFtZXNwYWNlIGlzIHRyYWNlZC5cbiAqL1xuXG5mdW5jdGlvbiBpc3RyYWNlZCAobmFtZXNwYWNlKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiB0ZXN0ZWQgaW4gYSBjaGlsZCBwcm9jZXNzcyAqL1xuICBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgLy8gLS10cmFjZS1kZXByZWNhdGlvbiBzdXBwb3J0XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHZhciBzdHIgPSBwcm9jZXNzLmVudi5UUkFDRV9ERVBSRUNBVElPTiB8fCAnJ1xuXG4gIC8vIG5hbWVzcGFjZSB0cmFjZWRcbiAgcmV0dXJuIGNvbnRhaW5zTmFtZXNwYWNlKHN0ciwgbmFtZXNwYWNlKVxufVxuXG4vKipcbiAqIERpc3BsYXkgZGVwcmVjYXRpb24gbWVzc2FnZS5cbiAqL1xuXG5mdW5jdGlvbiBsb2cgKG1lc3NhZ2UsIHNpdGUpIHtcbiAgdmFyIGhhc2xpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJDb3VudChwcm9jZXNzLCAnZGVwcmVjYXRpb24nKSAhPT0gMFxuXG4gIC8vIGFib3J0IGVhcmx5IGlmIG5vIGRlc3RpbmF0aW9uXG4gIGlmICghaGFzbGlzdGVuZXJzICYmIHRoaXMuX2lnbm9yZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBjYWxsZXJcbiAgdmFyIGNhbGxGaWxlXG4gIHZhciBjYWxsU2l0ZVxuICB2YXIgZGVwU2l0ZVxuICB2YXIgaSA9IDBcbiAgdmFyIHNlZW4gPSBmYWxzZVxuICB2YXIgc3RhY2sgPSBnZXRTdGFjaygpXG4gIHZhciBmaWxlID0gdGhpcy5fZmlsZVxuXG4gIGlmIChzaXRlKSB7XG4gICAgLy8gcHJvdmlkZWQgc2l0ZVxuICAgIGRlcFNpdGUgPSBzaXRlXG4gICAgY2FsbFNpdGUgPSBjYWxsU2l0ZUxvY2F0aW9uKHN0YWNrWzFdKVxuICAgIGNhbGxTaXRlLm5hbWUgPSBkZXBTaXRlLm5hbWVcbiAgICBmaWxlID0gY2FsbFNpdGVbMF1cbiAgfSBlbHNlIHtcbiAgICAvLyBnZXQgY2FsbCBzaXRlXG4gICAgaSA9IDJcbiAgICBkZXBTaXRlID0gY2FsbFNpdGVMb2NhdGlvbihzdGFja1tpXSlcbiAgICBjYWxsU2l0ZSA9IGRlcFNpdGVcbiAgfVxuXG4gIC8vIGdldCBjYWxsZXIgb2YgZGVwcmVjYXRlZCB0aGluZyBpbiByZWxhdGlvbiB0byBmaWxlXG4gIGZvciAoOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspIHtcbiAgICBjYWxsZXIgPSBjYWxsU2l0ZUxvY2F0aW9uKHN0YWNrW2ldKVxuICAgIGNhbGxGaWxlID0gY2FsbGVyWzBdXG5cbiAgICBpZiAoY2FsbEZpbGUgPT09IGZpbGUpIHtcbiAgICAgIHNlZW4gPSB0cnVlXG4gICAgfSBlbHNlIGlmIChjYWxsRmlsZSA9PT0gdGhpcy5fZmlsZSkge1xuICAgICAgZmlsZSA9IHRoaXMuX2ZpbGVcbiAgICB9IGVsc2UgaWYgKHNlZW4pIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgdmFyIGtleSA9IGNhbGxlclxuICAgID8gZGVwU2l0ZS5qb2luKCc6JykgKyAnX18nICsgY2FsbGVyLmpvaW4oJzonKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIGtleSBpbiB0aGlzLl93YXJuZWQpIHtcbiAgICAvLyBhbHJlYWR5IHdhcm5lZFxuICAgIHJldHVyblxuICB9XG5cbiAgdGhpcy5fd2FybmVkW2tleV0gPSB0cnVlXG5cbiAgLy8gZ2VuZXJhdGUgYXV0b21hdGljIG1lc3NhZ2UgZnJvbSBjYWxsIHNpdGVcbiAgdmFyIG1zZyA9IG1lc3NhZ2VcbiAgaWYgKCFtc2cpIHtcbiAgICBtc2cgPSBjYWxsU2l0ZSA9PT0gZGVwU2l0ZSB8fCAhY2FsbFNpdGUubmFtZVxuICAgICAgPyBkZWZhdWx0TWVzc2FnZShkZXBTaXRlKVxuICAgICAgOiBkZWZhdWx0TWVzc2FnZShjYWxsU2l0ZSlcbiAgfVxuXG4gIC8vIGVtaXQgZGVwcmVjYXRpb24gaWYgbGlzdGVuZXJzIGV4aXN0XG4gIGlmIChoYXNsaXN0ZW5lcnMpIHtcbiAgICB2YXIgZXJyID0gRGVwcmVjYXRpb25FcnJvcih0aGlzLl9uYW1lc3BhY2UsIG1zZywgc3RhY2suc2xpY2UoaSkpXG4gICAgcHJvY2Vzcy5lbWl0KCdkZXByZWNhdGlvbicsIGVycilcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIGZvcm1hdCBhbmQgd3JpdGUgbWVzc2FnZVxuICB2YXIgZm9ybWF0ID0gcHJvY2Vzcy5zdGRlcnIuaXNUVFlcbiAgICA/IGZvcm1hdENvbG9yXG4gICAgOiBmb3JtYXRQbGFpblxuICB2YXIgb3V0cHV0ID0gZm9ybWF0LmNhbGwodGhpcywgbXNnLCBjYWxsZXIsIHN0YWNrLnNsaWNlKGkpKVxuICBwcm9jZXNzLnN0ZGVyci53cml0ZShvdXRwdXQgKyAnXFxuJywgJ3V0ZjgnKVxufVxuXG4vKipcbiAqIEdldCBjYWxsIHNpdGUgbG9jYXRpb24gYXMgYXJyYXkuXG4gKi9cblxuZnVuY3Rpb24gY2FsbFNpdGVMb2NhdGlvbiAoY2FsbFNpdGUpIHtcbiAgdmFyIGZpbGUgPSBjYWxsU2l0ZS5nZXRGaWxlTmFtZSgpIHx8ICc8YW5vbnltb3VzPidcbiAgdmFyIGxpbmUgPSBjYWxsU2l0ZS5nZXRMaW5lTnVtYmVyKClcbiAgdmFyIGNvbG0gPSBjYWxsU2l0ZS5nZXRDb2x1bW5OdW1iZXIoKVxuXG4gIGlmIChjYWxsU2l0ZS5pc0V2YWwoKSkge1xuICAgIGZpbGUgPSBjYWxsU2l0ZS5nZXRFdmFsT3JpZ2luKCkgKyAnLCAnICsgZmlsZVxuICB9XG5cbiAgdmFyIHNpdGUgPSBbZmlsZSwgbGluZSwgY29sbV1cblxuICBzaXRlLmNhbGxTaXRlID0gY2FsbFNpdGVcbiAgc2l0ZS5uYW1lID0gY2FsbFNpdGUuZ2V0RnVuY3Rpb25OYW1lKClcblxuICByZXR1cm4gc2l0ZVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgZGVmYXVsdCBtZXNzYWdlIGZyb20gdGhlIHNpdGUuXG4gKi9cblxuZnVuY3Rpb24gZGVmYXVsdE1lc3NhZ2UgKHNpdGUpIHtcbiAgdmFyIGNhbGxTaXRlID0gc2l0ZS5jYWxsU2l0ZVxuICB2YXIgZnVuY05hbWUgPSBzaXRlLm5hbWVcblxuICAvLyBtYWtlIHVzZWZ1bCBhbm9ueW1vdXMgbmFtZVxuICBpZiAoIWZ1bmNOYW1lKSB7XG4gICAgZnVuY05hbWUgPSAnPGFub255bW91c0AnICsgZm9ybWF0TG9jYXRpb24oc2l0ZSkgKyAnPidcbiAgfVxuXG4gIHZhciBjb250ZXh0ID0gY2FsbFNpdGUuZ2V0VGhpcygpXG4gIHZhciB0eXBlTmFtZSA9IGNvbnRleHQgJiYgY2FsbFNpdGUuZ2V0VHlwZU5hbWUoKVxuXG4gIC8vIGlnbm9yZSB1c2VsZXNzIHR5cGUgbmFtZVxuICBpZiAodHlwZU5hbWUgPT09ICdPYmplY3QnKSB7XG4gICAgdHlwZU5hbWUgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8vIG1ha2UgdXNlZnVsIHR5cGUgbmFtZVxuICBpZiAodHlwZU5hbWUgPT09ICdGdW5jdGlvbicpIHtcbiAgICB0eXBlTmFtZSA9IGNvbnRleHQubmFtZSB8fCB0eXBlTmFtZVxuICB9XG5cbiAgcmV0dXJuIHR5cGVOYW1lICYmIGNhbGxTaXRlLmdldE1ldGhvZE5hbWUoKVxuICAgID8gdHlwZU5hbWUgKyAnLicgKyBmdW5jTmFtZVxuICAgIDogZnVuY05hbWVcbn1cblxuLyoqXG4gKiBGb3JtYXQgZGVwcmVjYXRpb24gbWVzc2FnZSB3aXRob3V0IGNvbG9yLlxuICovXG5cbmZ1bmN0aW9uIGZvcm1hdFBsYWluIChtc2csIGNhbGxlciwgc3RhY2spIHtcbiAgdmFyIHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKVxuXG4gIHZhciBmb3JtYXR0ZWQgPSB0aW1lc3RhbXAgK1xuICAgICcgJyArIHRoaXMuX25hbWVzcGFjZSArXG4gICAgJyBkZXByZWNhdGVkICcgKyBtc2dcblxuICAvLyBhZGQgc3RhY2sgdHJhY2VcbiAgaWYgKHRoaXMuX3RyYWNlZCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvcm1hdHRlZCArPSAnXFxuICAgIGF0ICcgKyBjYWxsU2l0ZVRvU3RyaW5nKHN0YWNrW2ldKVxuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXR0ZWRcbiAgfVxuXG4gIGlmIChjYWxsZXIpIHtcbiAgICBmb3JtYXR0ZWQgKz0gJyBhdCAnICsgZm9ybWF0TG9jYXRpb24oY2FsbGVyKVxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdHRlZFxufVxuXG4vKipcbiAqIEZvcm1hdCBkZXByZWNhdGlvbiBtZXNzYWdlIHdpdGggY29sb3IuXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0Q29sb3IgKG1zZywgY2FsbGVyLCBzdGFjaykge1xuICB2YXIgZm9ybWF0dGVkID0gJ1xceDFiWzM2OzFtJyArIHRoaXMuX25hbWVzcGFjZSArICdcXHgxYlsyMjszOW0nICsgLy8gYm9sZCBjeWFuXG4gICAgJyBcXHgxYlszMzsxbWRlcHJlY2F0ZWRcXHgxYlsyMjszOW0nICsgLy8gYm9sZCB5ZWxsb3dcbiAgICAnIFxceDFiWzBtJyArIG1zZyArICdcXHgxYlszOW0nIC8vIHJlc2V0XG5cbiAgLy8gYWRkIHN0YWNrIHRyYWNlXG4gIGlmICh0aGlzLl90cmFjZWQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3JtYXR0ZWQgKz0gJ1xcbiAgICBcXHgxYlszNm1hdCAnICsgY2FsbFNpdGVUb1N0cmluZyhzdGFja1tpXSkgKyAnXFx4MWJbMzltJyAvLyBjeWFuXG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdHRlZFxuICB9XG5cbiAgaWYgKGNhbGxlcikge1xuICAgIGZvcm1hdHRlZCArPSAnIFxceDFiWzM2bScgKyBmb3JtYXRMb2NhdGlvbihjYWxsZXIpICsgJ1xceDFiWzM5bScgLy8gY3lhblxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdHRlZFxufVxuXG4vKipcbiAqIEZvcm1hdCBjYWxsIHNpdGUgbG9jYXRpb24uXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0TG9jYXRpb24gKGNhbGxTaXRlKSB7XG4gIHJldHVybiByZWxhdGl2ZShiYXNlUGF0aCwgY2FsbFNpdGVbMF0pICtcbiAgICAnOicgKyBjYWxsU2l0ZVsxXSArXG4gICAgJzonICsgY2FsbFNpdGVbMl1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHN0YWNrIGFzIGFycmF5IG9mIGNhbGwgc2l0ZXMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0U3RhY2sgKCkge1xuICB2YXIgbGltaXQgPSBFcnJvci5zdGFja1RyYWNlTGltaXRcbiAgdmFyIG9iaiA9IHt9XG4gIHZhciBwcmVwID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2VcblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXBhcmVPYmplY3RTdGFja1RyYWNlXG4gIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IE1hdGgubWF4KDEwLCBsaW1pdClcblxuICAvLyBjYXB0dXJlIHRoZSBzdGFja1xuICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShvYmopXG5cbiAgLy8gc2xpY2UgdGhpcyBmdW5jdGlvbiBvZmYgdGhlIHRvcFxuICB2YXIgc3RhY2sgPSBvYmouc3RhY2suc2xpY2UoMSlcblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXBcbiAgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0ID0gbGltaXRcblxuICByZXR1cm4gc3RhY2tcbn1cblxuLyoqXG4gKiBDYXB0dXJlIGNhbGwgc2l0ZSBzdGFjayBmcm9tIHY4LlxuICovXG5cbmZ1bmN0aW9uIHByZXBhcmVPYmplY3RTdGFja1RyYWNlIChvYmosIHN0YWNrKSB7XG4gIHJldHVybiBzdGFja1xufVxuXG4vKipcbiAqIFJldHVybiBhIHdyYXBwZWQgZnVuY3Rpb24gaW4gYSBkZXByZWNhdGlvbiBtZXNzYWdlLlxuICovXG5cbmZ1bmN0aW9uIHdyYXBmdW5jdGlvbiAoZm4sIG1lc3NhZ2UpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IGZuIG11c3QgYmUgYSBmdW5jdGlvbicpXG4gIH1cblxuICB2YXIgYXJncyA9IGNyZWF0ZUFyZ3VtZW50c1N0cmluZyhmbi5sZW5ndGgpXG4gIHZhciBkZXByZWNhdGUgPSB0aGlzIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIHN0YWNrID0gZ2V0U3RhY2soKVxuICB2YXIgc2l0ZSA9IGNhbGxTaXRlTG9jYXRpb24oc3RhY2tbMV0pXG5cbiAgc2l0ZS5uYW1lID0gZm4ubmFtZVxuXG4gICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXZhbFxuICB2YXIgZGVwcmVjYXRlZGZuID0gZXZhbCgnKGZ1bmN0aW9uICgnICsgYXJncyArICcpIHtcXG4nICtcbiAgICAnXCJ1c2Ugc3RyaWN0XCJcXG4nICtcbiAgICAnbG9nLmNhbGwoZGVwcmVjYXRlLCBtZXNzYWdlLCBzaXRlKVxcbicgK1xuICAgICdyZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxcbicgK1xuICAgICd9KScpXG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWRmblxufVxuXG4vKipcbiAqIFdyYXAgcHJvcGVydHkgaW4gYSBkZXByZWNhdGlvbiBtZXNzYWdlLlxuICovXG5cbmZ1bmN0aW9uIHdyYXBwcm9wZXJ0eSAob2JqLCBwcm9wLCBtZXNzYWdlKSB7XG4gIGlmICghb2JqIHx8ICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG9iaiBtdXN0IGJlIG9iamVjdCcpXG4gIH1cblxuICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKVxuXG4gIGlmICghZGVzY3JpcHRvcikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ211c3QgY2FsbCBwcm9wZXJ0eSBvbiBvd25lciBvYmplY3QnKVxuICB9XG5cbiAgaWYgKCFkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Byb3BlcnR5IG11c3QgYmUgY29uZmlndXJhYmxlJylcbiAgfVxuXG4gIHZhciBkZXByZWNhdGUgPSB0aGlzXG4gIHZhciBzdGFjayA9IGdldFN0YWNrKClcbiAgdmFyIHNpdGUgPSBjYWxsU2l0ZUxvY2F0aW9uKHN0YWNrWzFdKVxuXG4gIC8vIHNldCBzaXRlIG5hbWVcbiAgc2l0ZS5uYW1lID0gcHJvcFxuXG4gIC8vIGNvbnZlcnQgZGF0YSBkZXNjcmlwdG9yXG4gIGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIHtcbiAgICBkZXNjcmlwdG9yID0gY29udmVydERhdGFEZXNjcmlwdG9yVG9BY2Nlc3NvcihvYmosIHByb3AsIG1lc3NhZ2UpXG4gIH1cblxuICB2YXIgZ2V0ID0gZGVzY3JpcHRvci5nZXRcbiAgdmFyIHNldCA9IGRlc2NyaXB0b3Iuc2V0XG5cbiAgLy8gd3JhcCBnZXR0ZXJcbiAgaWYgKHR5cGVvZiBnZXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkZXNjcmlwdG9yLmdldCA9IGZ1bmN0aW9uIGdldHRlciAoKSB7XG4gICAgICBsb2cuY2FsbChkZXByZWNhdGUsIG1lc3NhZ2UsIHNpdGUpXG4gICAgICByZXR1cm4gZ2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgICB9XG4gIH1cblxuICAvLyB3cmFwIHNldHRlclxuICBpZiAodHlwZW9mIHNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRlc2NyaXB0b3Iuc2V0ID0gZnVuY3Rpb24gc2V0dGVyICgpIHtcbiAgICAgIGxvZy5jYWxsKGRlcHJlY2F0ZSwgbWVzc2FnZSwgc2l0ZSlcbiAgICAgIHJldHVybiBzZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgIH1cbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2NyaXB0b3IpXG59XG5cbi8qKlxuICogQ3JlYXRlIERlcHJlY2F0aW9uRXJyb3IgZm9yIGRlcHJlY2F0aW9uXG4gKi9cblxuZnVuY3Rpb24gRGVwcmVjYXRpb25FcnJvciAobmFtZXNwYWNlLCBtZXNzYWdlLCBzdGFjaykge1xuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoKVxuICB2YXIgc3RhY2tTdHJpbmdcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsICdjb25zdHJ1Y3RvcicsIHtcbiAgICB2YWx1ZTogRGVwcmVjYXRpb25FcnJvclxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ21lc3NhZ2UnLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBtZXNzYWdlLFxuICAgIHdyaXRhYmxlOiB0cnVlXG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCAnbmFtZScsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6ICdEZXByZWNhdGlvbkVycm9yJyxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ25hbWVzcGFjZScsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IG5hbWVzcGFjZSxcbiAgICB3cml0YWJsZTogdHJ1ZVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ3N0YWNrJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzdGFja1N0cmluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzdGFja1N0cmluZ1xuICAgICAgfVxuXG4gICAgICAvLyBwcmVwYXJlIHN0YWNrIHRyYWNlXG4gICAgICByZXR1cm4gKHN0YWNrU3RyaW5nID0gY3JlYXRlU3RhY2tTdHJpbmcuY2FsbCh0aGlzLCBzdGFjaykpXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldHRlciAodmFsKSB7XG4gICAgICBzdGFja1N0cmluZyA9IHZhbFxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gZXJyb3Jcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9kZXBkL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiZnNcIlxuLy8gbW9kdWxlIGlkID0gOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09PSAnb2JqZWN0JyA/IGl0ICE9PSBudWxsIDogdHlwZW9mIGl0ID09PSAnZnVuY3Rpb24nO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtb2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIHNvdXJjZSkge1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRjtcbiAgdmFyIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0Lkc7XG4gIHZhciBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TO1xuICB2YXIgSVNfUFJPVE8gPSB0eXBlICYgJGV4cG9ydC5QO1xuICB2YXIgSVNfQklORCA9IHR5cGUgJiAkZXhwb3J0LkI7XG4gIHZhciBJU19XUkFQID0gdHlwZSAmICRleHBvcnQuVztcbiAgdmFyIGV4cG9ydHMgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KTtcbiAgdmFyIGV4cFByb3RvID0gZXhwb3J0c1tQUk9UT1RZUEVdO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIDogKGdsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTtcbiAgdmFyIGtleSwgb3duLCBvdXQ7XG4gIGlmIChJU19HTE9CQUwpIHNvdXJjZSA9IG5hbWU7XG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKG93biAmJiBoYXMoZXhwb3J0cywga2V5KSkgY29udGludWU7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSBvd24gPyB0YXJnZXRba2V5XSA6IHNvdXJjZVtrZXldO1xuICAgIC8vIHByZXZlbnQgZ2xvYmFsIHBvbGx1dGlvbiBmb3IgbmFtZXNwYWNlc1xuICAgIGV4cG9ydHNba2V5XSA9IElTX0dMT0JBTCAmJiB0eXBlb2YgdGFyZ2V0W2tleV0gIT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZVtrZXldXG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICA6IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKVxuICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2UgdGhlbSBpbiBsaWJyYXJ5XG4gICAgOiBJU19XUkFQICYmIHRhcmdldFtrZXldID09IG91dCA/IChmdW5jdGlvbiAoQykge1xuICAgICAgdmFyIEYgPSBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEMpIHtcbiAgICAgICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDKCk7XG4gICAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQyhhKTtcbiAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuICAgICAgICB9IHJldHVybiBDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuICAgICAgcmV0dXJuIEY7XG4gICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG4gICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5tZXRob2RzLiVOQU1FJVxuICAgIGlmIChJU19QUk9UTykge1xuICAgICAgKGV4cG9ydHMudmlydHVhbCB8fCAoZXhwb3J0cy52aXJ0dWFsID0ge30pKVtrZXldID0gb3V0O1xuICAgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSVcbiAgICAgIGlmICh0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKSBoaWRlKGV4cFByb3RvLCBrZXksIG91dCk7XG4gICAgfVxuICB9XG59O1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19leHBvcnQuanNcbi8vIG1vZHVsZSBpZCA9IDEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG52YXIgY29udGVudERpc3Bvc2l0aW9uID0gcmVxdWlyZSgnY29udGVudC1kaXNwb3NpdGlvbicpO1xudmFyIGNvbnRlbnRUeXBlID0gcmVxdWlyZSgnY29udGVudC10eXBlJyk7XG52YXIgZGVwcmVjYXRlID0gcmVxdWlyZSgnZGVwZCcpKCdleHByZXNzJyk7XG52YXIgZmxhdHRlbiA9IHJlcXVpcmUoJ2FycmF5LWZsYXR0ZW4nKTtcbnZhciBtaW1lID0gcmVxdWlyZSgnc2VuZCcpLm1pbWU7XG52YXIgZXRhZyA9IHJlcXVpcmUoJ2V0YWcnKTtcbnZhciBwcm94eWFkZHIgPSByZXF1aXJlKCdwcm94eS1hZGRyJyk7XG52YXIgcXMgPSByZXF1aXJlKCdxcycpO1xudmFyIHF1ZXJ5c3RyaW5nID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKTtcblxuLyoqXG4gKiBSZXR1cm4gc3Ryb25nIEVUYWcgZm9yIGBib2R5YC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xCdWZmZXJ9IGJvZHlcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZW5jb2RpbmddXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmV0YWcgPSBjcmVhdGVFVGFnR2VuZXJhdG9yKHsgd2VhazogZmFsc2UgfSlcblxuLyoqXG4gKiBSZXR1cm4gd2VhayBFVGFnIGZvciBgYm9keWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QnVmZmVyfSBib2R5XG4gKiBAcGFyYW0ge1N0cmluZ30gW2VuY29kaW5nXVxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy53ZXRhZyA9IGNyZWF0ZUVUYWdHZW5lcmF0b3IoeyB3ZWFrOiB0cnVlIH0pXG5cbi8qKlxuICogQ2hlY2sgaWYgYHBhdGhgIGxvb2tzIGFic29sdXRlLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5pc0Fic29sdXRlID0gZnVuY3Rpb24ocGF0aCl7XG4gIGlmICgnLycgPT09IHBhdGhbMF0pIHJldHVybiB0cnVlO1xuICBpZiAoJzonID09PSBwYXRoWzFdICYmICgnXFxcXCcgPT09IHBhdGhbMl0gfHwgJy8nID09PSBwYXRoWzJdKSkgcmV0dXJuIHRydWU7IC8vIFdpbmRvd3MgZGV2aWNlIHBhdGhcbiAgaWYgKCdcXFxcXFxcXCcgPT09IHBhdGguc3Vic3RyaW5nKDAsIDIpKSByZXR1cm4gdHJ1ZTsgLy8gTWljcm9zb2Z0IEF6dXJlIGFic29sdXRlIHBhdGhcbn07XG5cbi8qKlxuICogRmxhdHRlbiB0aGUgZ2l2ZW4gYGFycmAuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJyXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuZmxhdHRlbiA9IGRlcHJlY2F0ZS5mdW5jdGlvbihmbGF0dGVuLFxuICAndXRpbHMuZmxhdHRlbjogdXNlIGFycmF5LWZsYXR0ZW4gbnBtIG1vZHVsZSBpbnN0ZWFkJyk7XG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSBnaXZlbiBgdHlwZWAsIGZvciBleGFtcGxlIFwiaHRtbFwiIGJlY29tZXMgXCJ0ZXh0L2h0bWxcIi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5ub3JtYWxpemVUeXBlID0gZnVuY3Rpb24odHlwZSl7XG4gIHJldHVybiB+dHlwZS5pbmRleE9mKCcvJylcbiAgICA/IGFjY2VwdFBhcmFtcyh0eXBlKVxuICAgIDogeyB2YWx1ZTogbWltZS5sb29rdXAodHlwZSksIHBhcmFtczoge30gfTtcbn07XG5cbi8qKlxuICogTm9ybWFsaXplIGB0eXBlc2AsIGZvciBleGFtcGxlIFwiaHRtbFwiIGJlY29tZXMgXCJ0ZXh0L2h0bWxcIi5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSB0eXBlc1xuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLm5vcm1hbGl6ZVR5cGVzID0gZnVuY3Rpb24odHlwZXMpe1xuICB2YXIgcmV0ID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7ICsraSkge1xuICAgIHJldC5wdXNoKGV4cG9ydHMubm9ybWFsaXplVHlwZSh0eXBlc1tpXSkpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgQ29udGVudC1EaXNwb3NpdGlvbiBoZWFkZXIgYXBwcm9wcmlhdGUgZm9yIHRoZSBmaWxlbmFtZS5cbiAqIG5vbi1hc2NpaSBmaWxlbmFtZXMgYXJlIHVybGVuY29kZWQgYW5kIGEgZmlsZW5hbWUqIHBhcmFtZXRlciBpcyBhZGRlZFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZVxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5jb250ZW50RGlzcG9zaXRpb24gPSBkZXByZWNhdGUuZnVuY3Rpb24oY29udGVudERpc3Bvc2l0aW9uLFxuICAndXRpbHMuY29udGVudERpc3Bvc2l0aW9uOiB1c2UgY29udGVudC1kaXNwb3NpdGlvbiBucG0gbW9kdWxlIGluc3RlYWQnKTtcblxuLyoqXG4gKiBQYXJzZSBhY2NlcHQgcGFyYW1zIGBzdHJgIHJldHVybmluZyBhblxuICogb2JqZWN0IHdpdGggYC52YWx1ZWAsIGAucXVhbGl0eWAgYW5kIGAucGFyYW1zYC5cbiAqIGFsc28gaW5jbHVkZXMgYC5vcmlnaW5hbEluZGV4YCBmb3Igc3RhYmxlIHNvcnRpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBhY2NlcHRQYXJhbXMoc3RyLCBpbmRleCkge1xuICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoLyAqOyAqLyk7XG4gIHZhciByZXQgPSB7IHZhbHVlOiBwYXJ0c1swXSwgcXVhbGl0eTogMSwgcGFyYW1zOiB7fSwgb3JpZ2luYWxJbmRleDogaW5kZXggfTtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBtcyA9IHBhcnRzW2ldLnNwbGl0KC8gKj0gKi8pO1xuICAgIGlmICgncScgPT09IHBtc1swXSkge1xuICAgICAgcmV0LnF1YWxpdHkgPSBwYXJzZUZsb2F0KHBtc1sxXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldC5wYXJhbXNbcG1zWzBdXSA9IHBtc1sxXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIENvbXBpbGUgXCJldGFnXCIgdmFsdWUgdG8gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtICB7Qm9vbGVhbnxTdHJpbmd8RnVuY3Rpb259IHZhbFxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLmNvbXBpbGVFVGFnID0gZnVuY3Rpb24odmFsKSB7XG4gIHZhciBmbjtcblxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBzd2l0Y2ggKHZhbCkge1xuICAgIGNhc2UgdHJ1ZTpcbiAgICAgIGZuID0gZXhwb3J0cy53ZXRhZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgZmFsc2U6XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzdHJvbmcnOlxuICAgICAgZm4gPSBleHBvcnRzLmV0YWc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd3ZWFrJzpcbiAgICAgIGZuID0gZXhwb3J0cy53ZXRhZztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1bmtub3duIHZhbHVlIGZvciBldGFnIGZ1bmN0aW9uOiAnICsgdmFsKTtcbiAgfVxuXG4gIHJldHVybiBmbjtcbn1cblxuLyoqXG4gKiBDb21waWxlIFwicXVlcnkgcGFyc2VyXCIgdmFsdWUgdG8gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfEZ1bmN0aW9ufSB2YWxcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5jb21waWxlUXVlcnlQYXJzZXIgPSBmdW5jdGlvbiBjb21waWxlUXVlcnlQYXJzZXIodmFsKSB7XG4gIHZhciBmbjtcblxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBzd2l0Y2ggKHZhbCkge1xuICAgIGNhc2UgdHJ1ZTpcbiAgICAgIGZuID0gcXVlcnlzdHJpbmcucGFyc2U7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGZhbHNlOlxuICAgICAgZm4gPSBuZXdPYmplY3Q7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdleHRlbmRlZCc6XG4gICAgICBmbiA9IHBhcnNlRXh0ZW5kZWRRdWVyeVN0cmluZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NpbXBsZSc6XG4gICAgICBmbiA9IHF1ZXJ5c3RyaW5nLnBhcnNlO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Vua25vd24gdmFsdWUgZm9yIHF1ZXJ5IHBhcnNlciBmdW5jdGlvbjogJyArIHZhbCk7XG4gIH1cblxuICByZXR1cm4gZm47XG59XG5cbi8qKlxuICogQ29tcGlsZSBcInByb3h5IHRydXN0XCIgdmFsdWUgdG8gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtICB7Qm9vbGVhbnxTdHJpbmd8TnVtYmVyfEFycmF5fEZ1bmN0aW9ufSB2YWxcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5jb21waWxlVHJ1c3QgPSBmdW5jdGlvbih2YWwpIHtcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHJldHVybiB2YWw7XG5cbiAgaWYgKHZhbCA9PT0gdHJ1ZSkge1xuICAgIC8vIFN1cHBvcnQgcGxhaW4gdHJ1ZS9mYWxzZVxuICAgIHJldHVybiBmdW5jdGlvbigpeyByZXR1cm4gdHJ1ZSB9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgLy8gU3VwcG9ydCB0cnVzdGluZyBob3AgY291bnRcbiAgICByZXR1cm4gZnVuY3Rpb24oYSwgaSl7IHJldHVybiBpIDwgdmFsIH07XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBTdXBwb3J0IGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXNcbiAgICB2YWwgPSB2YWwuc3BsaXQoLyAqLCAqLyk7XG4gIH1cblxuICByZXR1cm4gcHJveHlhZGRyLmNvbXBpbGUodmFsIHx8IFtdKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGNoYXJzZXQgaW4gYSBnaXZlbiBDb250ZW50LVR5cGUgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0ge1N0cmluZ30gY2hhcnNldFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZXhwb3J0cy5zZXRDaGFyc2V0ID0gZnVuY3Rpb24gc2V0Q2hhcnNldCh0eXBlLCBjaGFyc2V0KSB7XG4gIGlmICghdHlwZSB8fCAhY2hhcnNldCkge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgLy8gcGFyc2UgdHlwZVxuICB2YXIgcGFyc2VkID0gY29udGVudFR5cGUucGFyc2UodHlwZSk7XG5cbiAgLy8gc2V0IGNoYXJzZXRcbiAgcGFyc2VkLnBhcmFtZXRlcnMuY2hhcnNldCA9IGNoYXJzZXQ7XG5cbiAgLy8gZm9ybWF0IHR5cGVcbiAgcmV0dXJuIGNvbnRlbnRUeXBlLmZvcm1hdChwYXJzZWQpO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gRVRhZyBnZW5lcmF0b3IgZnVuY3Rpb24sIGdlbmVyYXRpbmcgRVRhZ3Mgd2l0aFxuICogdGhlIGdpdmVuIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFVGFnR2VuZXJhdG9yIChvcHRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZUVUYWcgKGJvZHksIGVuY29kaW5nKSB7XG4gICAgdmFyIGJ1ZiA9ICFCdWZmZXIuaXNCdWZmZXIoYm9keSlcbiAgICAgID8gQnVmZmVyLmZyb20oYm9keSwgZW5jb2RpbmcpXG4gICAgICA6IGJvZHlcblxuICAgIHJldHVybiBldGFnKGJ1Ziwgb3B0aW9ucylcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIGFuIGV4dGVuZGVkIHF1ZXJ5IHN0cmluZyB3aXRoIHFzLlxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VFeHRlbmRlZFF1ZXJ5U3RyaW5nKHN0cikge1xuICByZXR1cm4gcXMucGFyc2Uoc3RyLCB7XG4gICAgYWxsb3dQcm90b3R5cGVzOiB0cnVlXG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybiBuZXcgZW1wdHkgb2JqZWN0LlxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG5ld09iamVjdCgpIHtcbiAgcmV0dXJuIHt9O1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL3V0aWxzLmpzXG4vLyBtb2R1bGUgaWQgPSAxMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qc1xuLy8gbW9kdWxlIGlkID0gMTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oaWRlLmpzXG4vLyBtb2R1bGUgaWQgPSAxNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBkUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHAuanNcbi8vIG1vZHVsZSBpZCA9IDE1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZXNjcmlwdG9ycy5qc1xuLy8gbW9kdWxlIGlkID0gMTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiaHR0cFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImh0dHBcIlxuLy8gbW9kdWxlIGlkID0gMTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2pzb24vc3RyaW5naWZ5XCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9qc29uL3N0cmluZ2lmeS5qc1xuLy8gbW9kdWxlIGlkID0gMThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgZ2V0SnNvbkRhdGFTeW5jLCB3cml0ZUpzb25EYXRhU3luYyB9IGZyb20gJy4vanNvbidcbmltcG9ydCB7IEFOT01BTElFU19QQVRIIH0gZnJvbSAnLi4vY29uZmlnJ1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnXG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcblxuZXhwb3J0IHR5cGUgRGF0YXNvdXJjZSA9IHtcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIGRhdGE6IE9iamVjdCxcbiAgcGFyYW1zOiBPYmplY3QsXG4gIHR5cGU6IHN0cmluZyxcbiAgdXJsOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgTWV0cmljID0ge1xuICBkYXRhc291cmNlOiBzdHJpbmcsXG4gIHRhcmdldHM6IHN0cmluZ1tdXG59XG5cbmV4cG9ydCB0eXBlIEFub21hbHkgPSB7XG4gIG5hbWU6IHN0cmluZyxcblxuICBwYW5lbFVybDogc3RyaW5nLFxuXG4gIG1ldHJpYzogTWV0cmljLFxuICBkYXRhc291cmNlOiBEYXRhc291cmNlXG4gIHN0YXR1czogc3RyaW5nLFxuICBlcnJvcj86IHN0cmluZyxcblxuICBsYXN0X3ByZWRpY3Rpb25fdGltZTogbnVtYmVyLFxuICBuZXh0X2lkOiBudW1iZXJcbn1cblxuZXhwb3J0IHR5cGUgQW5vbWFseUlkID0gc3RyaW5nO1xuXG5sZXQgYW5vbWFsaWVzTmFtZVRvSWRNYXAgPSB7fTtcblxuZnVuY3Rpb24gbG9hZEFub21hbGllc01hcCgpIHtcbiAgbGV0IGZpbGVuYW1lID0gcGF0aC5qb2luKEFOT01BTElFU19QQVRILCBgYWxsX2Fub21hbGllcy5qc29uYCk7XG4gIGFub21hbGllc05hbWVUb0lkTWFwID0gZ2V0SnNvbkRhdGFTeW5jKGZpbGVuYW1lKTtcbn1cblxuZnVuY3Rpb24gc2F2ZUFub21hbGllc01hcCgpIHtcbiAgbGV0IGZpbGVuYW1lID0gcGF0aC5qb2luKEFOT01BTElFU19QQVRILCBgYWxsX2Fub21hbGllcy5qc29uYCk7XG4gIHdyaXRlSnNvbkRhdGFTeW5jKGZpbGVuYW1lLCBhbm9tYWxpZXNOYW1lVG9JZE1hcCk7XG59XG5cbmZ1bmN0aW9uIGdldEFub21hbHlJZEJ5TmFtZShhbm9tYWx5TmFtZTpzdHJpbmcpIDogQW5vbWFseUlkIHtcbiAgbG9hZEFub21hbGllc01hcCgpO1xuICBhbm9tYWx5TmFtZSA9IGFub21hbHlOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGlmKGFub21hbHlOYW1lIGluIGFub21hbGllc05hbWVUb0lkTWFwKSB7XG4gICAgcmV0dXJuIGFub21hbGllc05hbWVUb0lkTWFwW2Fub21hbHlOYW1lXTtcbiAgfVxuICByZXR1cm4gYW5vbWFseU5hbWU7XG59XG5cbmZ1bmN0aW9uIGluc2VydEFub21hbHkoYW5vbWFseTogQW5vbWFseSkgOiBBbm9tYWx5SWQge1xuICBjb25zdCBoYXNoU3RyaW5nID0gYW5vbWFseS5uYW1lICsgKG5ldyBEYXRlKCkpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGFub21hbHlJZDpBbm9tYWx5SWQgPSBjcnlwdG8uY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKGhhc2hTdHJpbmcpLmRpZ2VzdCgnaGV4Jyk7XG4gIGFub21hbGllc05hbWVUb0lkTWFwW2Fub21hbHkubmFtZV0gPSBhbm9tYWx5SWQ7XG4gIHNhdmVBbm9tYWxpZXNNYXAoKTtcbiAgLy8gcmV0dXJuIGFub21hbHlJZFxuICAvLyBjb25zdCBhbm9tYWx5SWQ6QW5vbWFseUlkID0gYW5vbWFseS5uYW1lO1xuICBsZXQgZmlsZW5hbWUgPSBwYXRoLmpvaW4oQU5PTUFMSUVTX1BBVEgsIGAke2Fub21hbHlJZH0uanNvbmApO1xuICBpZihmcy5leGlzdHNTeW5jKGZpbGVuYW1lKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHNhdmVBbm9tYWx5KGFub21hbHlJZCwgYW5vbWFseSk7XG4gIHJldHVybiBhbm9tYWx5SWQ7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUFub21hbHkoYW5vbWFseUlkOkFub21hbHlJZCkge1xuICBsZXQgZmlsZW5hbWUgPSBwYXRoLmpvaW4oQU5PTUFMSUVTX1BBVEgsIGAke2Fub21hbHlJZH0uanNvbmApO1xuICBmcy51bmxpbmtTeW5jKGZpbGVuYW1lKTtcbn1cblxuZnVuY3Rpb24gc2F2ZUFub21hbHkoYW5vbWFseUlkOiBBbm9tYWx5SWQsIGFub21hbHk6IEFub21hbHkpIHtcbiAgbGV0IGZpbGVuYW1lID0gcGF0aC5qb2luKEFOT01BTElFU19QQVRILCBgJHthbm9tYWx5SWR9Lmpzb25gKTtcbiAgcmV0dXJuIHdyaXRlSnNvbkRhdGFTeW5jKGZpbGVuYW1lLCBhbm9tYWx5KTtcbn1cblxuZnVuY3Rpb24gbG9hZEFub21hbHlCeUlkKGFub21hbHlJZDogQW5vbWFseUlkKSA6IEFub21hbHkge1xuICBsZXQgZmlsZW5hbWUgPSBwYXRoLmpvaW4oQU5PTUFMSUVTX1BBVEgsIGAke2Fub21hbHlJZH0uanNvbmApO1xuICBpZighZnMuZXhpc3RzU3luYyhmaWxlbmFtZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gZ2V0SnNvbkRhdGFTeW5jKGZpbGVuYW1lKTtcbn1cblxuZnVuY3Rpb24gbG9hZEFub21hbHlCeU5hbWUoYW5vbWFseU5hbWU6IHN0cmluZykgOiBBbm9tYWx5IHtcbiAgbGV0IGFub21hbHlJZCA9IGdldEFub21hbHlJZEJ5TmFtZShhbm9tYWx5TmFtZSk7XG4gIHJldHVybiBsb2FkQW5vbWFseUJ5SWQoYW5vbWFseUlkKTtcbn1cblxuZnVuY3Rpb24gc2F2ZUFub21hbHlUeXBlSW5mbyhpbmZvKSB7XG4gIGNvbnNvbGUubG9nKCdTYXZpbmcnKTtcbiAgbGV0IGZpbGVuYW1lID0gcGF0aC5qb2luKEFOT01BTElFU19QQVRILCBgJHtpbmZvLm5hbWV9Lmpzb25gKTtcbiAgaWYoaW5mby5uZXh0X2lkID09PSB1bmRlZmluZWQpIHtcbiAgICBpbmZvLm5leHRfaWQgPSAwO1xuICB9XG4gIGlmKGluZm8ubGFzdF9wcmVkaWN0aW9uX3RpbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5mby5sYXN0X3ByZWRpY3Rpb25fdGltZSA9IDA7XG4gIH1cblxuICByZXR1cm4gd3JpdGVKc29uRGF0YVN5bmMoZmlsZW5hbWUsIGluZm8pO1xufVxuXG5mdW5jdGlvbiBnZXRBbm9tYWx5VHlwZUluZm8obmFtZSkge1xuICByZXR1cm4gZ2V0SnNvbkRhdGFTeW5jKHBhdGguam9pbihBTk9NQUxJRVNfUEFUSCwgYCR7bmFtZX0uanNvbmApKTtcbn1cblxuZnVuY3Rpb24gc2V0QW5vbWFseVN0YXR1cyhhbm9tYWx5SWQ6QW5vbWFseUlkLCBzdGF0dXM6c3RyaW5nLCBlcnJvcj86c3RyaW5nKSB7XG4gIGxldCBpbmZvID0gbG9hZEFub21hbHlCeUlkKGFub21hbHlJZCk7XG4gIGluZm8uc3RhdHVzID0gc3RhdHVzO1xuICBpZihlcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaW5mby5lcnJvciA9IGVycm9yO1xuICB9IGVsc2Uge1xuICAgIGluZm8uZXJyb3IgPSAnJztcbiAgfVxuICBzYXZlQW5vbWFseShhbm9tYWx5SWQsIGluZm8pO1xufVxuXG5mdW5jdGlvbiBzZXRBbm9tYWx5UHJlZGljdGlvblRpbWUoYW5vbWFseUlkOkFub21hbHlJZCwgbGFzdFByZWRpY3Rpb25UaW1lOm51bWJlcikge1xuICBsZXQgaW5mbyA9IGxvYWRBbm9tYWx5QnlJZChhbm9tYWx5SWQpO1xuICBpbmZvLmxhc3RfcHJlZGljdGlvbl90aW1lID0gbGFzdFByZWRpY3Rpb25UaW1lO1xuICBzYXZlQW5vbWFseShhbm9tYWx5SWQsIGluZm8pO1xufVxuXG5leHBvcnQge1xuICBzYXZlQW5vbWFseSwgbG9hZEFub21hbHlCeUlkLCBsb2FkQW5vbWFseUJ5TmFtZSwgaW5zZXJ0QW5vbWFseSwgcmVtb3ZlQW5vbWFseSwgc2F2ZUFub21hbHlUeXBlSW5mbyxcbiAgZ2V0QW5vbWFseVR5cGVJbmZvLCBnZXRBbm9tYWx5SWRCeU5hbWUsIHNldEFub21hbHlTdGF0dXMsIHNldEFub21hbHlQcmVkaWN0aW9uVGltZVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmljZXMvYW5vbWFseVR5cGUudHMiLCIvKiFcbiAqIGJ5dGVzXG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBKZWQgV2F0c29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBieXRlcztcbm1vZHVsZS5leHBvcnRzLmZvcm1hdCA9IGZvcm1hdDtcbm1vZHVsZS5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGZvcm1hdFRob3VzYW5kc1JlZ0V4cCA9IC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nO1xuXG52YXIgZm9ybWF0RGVjaW1hbHNSZWdFeHAgPSAvKD86XFwuMCp8KFxcLlteMF0rKTArKSQvO1xuXG52YXIgbWFwID0ge1xuICBiOiAgMSxcbiAga2I6IDEgPDwgMTAsXG4gIG1iOiAxIDw8IDIwLFxuICBnYjogMSA8PCAzMCxcbiAgdGI6ICgoMSA8PCAzMCkgKiAxMDI0KVxufTtcblxudmFyIHBhcnNlUmVnRXhwID0gL14oKC18XFwrKT8oXFxkKyg/OlxcLlxcZCspPykpICooa2J8bWJ8Z2J8dGIpJC9pO1xuXG4vKipcbiAqIENvbnZlcnQgdGhlIGdpdmVuIHZhbHVlIGluIGJ5dGVzIGludG8gYSBzdHJpbmcgb3IgcGFyc2UgdG8gc3RyaW5nIHRvIGFuIGludGVnZXIgaW4gYnl0ZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHt7XG4gKiAgY2FzZTogW3N0cmluZ10sXG4gKiAgZGVjaW1hbFBsYWNlczogW251bWJlcl1cbiAqICBmaXhlZERlY2ltYWxzOiBbYm9vbGVhbl1cbiAqICB0aG91c2FuZHNTZXBhcmF0b3I6IFtzdHJpbmddXG4gKiAgdW5pdFNlcGFyYXRvcjogW3N0cmluZ11cbiAqICB9fSBbb3B0aW9uc10gYnl0ZXMgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfG51bWJlcnxudWxsfVxuICovXG5cbmZ1bmN0aW9uIGJ5dGVzKHZhbHVlLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbHVlKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZvcm1hdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBGb3JtYXQgdGhlIGdpdmVuIHZhbHVlIGluIGJ5dGVzIGludG8gYSBzdHJpbmcuXG4gKlxuICogSWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlLCBpdCBpcyBrZXB0IGFzIHN1Y2guIElmIGl0IGlzIGEgZmxvYXQsXG4gKiBpdCBpcyByb3VuZGVkLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmRlY2ltYWxQbGFjZXM9Ml1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5maXhlZERlY2ltYWxzPWZhbHNlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnRob3VzYW5kc1NlcGFyYXRvcj1dXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudW5pdD1dXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudW5pdFNlcGFyYXRvcj1dXG4gKlxuICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdCh2YWx1ZSwgb3B0aW9ucykge1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYWcgPSBNYXRoLmFicyh2YWx1ZSk7XG4gIHZhciB0aG91c2FuZHNTZXBhcmF0b3IgPSAob3B0aW9ucyAmJiBvcHRpb25zLnRob3VzYW5kc1NlcGFyYXRvcikgfHwgJyc7XG4gIHZhciB1bml0U2VwYXJhdG9yID0gKG9wdGlvbnMgJiYgb3B0aW9ucy51bml0U2VwYXJhdG9yKSB8fCAnJztcbiAgdmFyIGRlY2ltYWxQbGFjZXMgPSAob3B0aW9ucyAmJiBvcHRpb25zLmRlY2ltYWxQbGFjZXMgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmRlY2ltYWxQbGFjZXMgOiAyO1xuICB2YXIgZml4ZWREZWNpbWFscyA9IEJvb2xlYW4ob3B0aW9ucyAmJiBvcHRpb25zLmZpeGVkRGVjaW1hbHMpO1xuICB2YXIgdW5pdCA9IChvcHRpb25zICYmIG9wdGlvbnMudW5pdCkgfHwgJyc7XG5cbiAgaWYgKCF1bml0IHx8ICFtYXBbdW5pdC50b0xvd2VyQ2FzZSgpXSkge1xuICAgIGlmIChtYWcgPj0gbWFwLnRiKSB7XG4gICAgICB1bml0ID0gJ1RCJztcbiAgICB9IGVsc2UgaWYgKG1hZyA+PSBtYXAuZ2IpIHtcbiAgICAgIHVuaXQgPSAnR0InO1xuICAgIH0gZWxzZSBpZiAobWFnID49IG1hcC5tYikge1xuICAgICAgdW5pdCA9ICdNQic7XG4gICAgfSBlbHNlIGlmIChtYWcgPj0gbWFwLmtiKSB7XG4gICAgICB1bml0ID0gJ0tCJztcbiAgICB9IGVsc2Uge1xuICAgICAgdW5pdCA9ICdCJztcbiAgICB9XG4gIH1cblxuICB2YXIgdmFsID0gdmFsdWUgLyBtYXBbdW5pdC50b0xvd2VyQ2FzZSgpXTtcbiAgdmFyIHN0ciA9IHZhbC50b0ZpeGVkKGRlY2ltYWxQbGFjZXMpO1xuXG4gIGlmICghZml4ZWREZWNpbWFscykge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKGZvcm1hdERlY2ltYWxzUmVnRXhwLCAnJDEnKTtcbiAgfVxuXG4gIGlmICh0aG91c2FuZHNTZXBhcmF0b3IpIHtcbiAgICBzdHIgPSBzdHIucmVwbGFjZShmb3JtYXRUaG91c2FuZHNSZWdFeHAsIHRob3VzYW5kc1NlcGFyYXRvcik7XG4gIH1cblxuICByZXR1cm4gc3RyICsgdW5pdFNlcGFyYXRvciArIHVuaXQ7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIHN0cmluZyB2YWx1ZSBpbnRvIGFuIGludGVnZXIgaW4gYnl0ZXMuXG4gKlxuICogSWYgbm8gdW5pdCBpcyBnaXZlbiwgaXQgaXMgYXNzdW1lZCB0aGUgdmFsdWUgaXMgaW4gYnl0ZXMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB2YWxcbiAqXG4gKiBAcmV0dXJucyB7bnVtYmVyfG51bGx9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcGFyc2UodmFsKSB7XG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsKSkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFRlc3QgaWYgdGhlIHN0cmluZyBwYXNzZWQgaXMgdmFsaWRcbiAgdmFyIHJlc3VsdHMgPSBwYXJzZVJlZ0V4cC5leGVjKHZhbCk7XG4gIHZhciBmbG9hdFZhbHVlO1xuICB2YXIgdW5pdCA9ICdiJztcblxuICBpZiAoIXJlc3VsdHMpIHtcbiAgICAvLyBOb3RoaW5nIGNvdWxkIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBnaXZlbiBzdHJpbmdcbiAgICBmbG9hdFZhbHVlID0gcGFyc2VJbnQodmFsLCAxMCk7XG4gICAgdW5pdCA9ICdiJ1xuICB9IGVsc2Uge1xuICAgIC8vIFJldHJpZXZlIHRoZSB2YWx1ZSBhbmQgdGhlIHVuaXRcbiAgICBmbG9hdFZhbHVlID0gcGFyc2VGbG9hdChyZXN1bHRzWzFdKTtcbiAgICB1bml0ID0gcmVzdWx0c1s0XS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcmV0dXJuIE1hdGguZmxvb3IobWFwW3VuaXRdICogZmxvYXRWYWx1ZSk7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvYnl0ZXMvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDIwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogc3RhdHVzZXNcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBjb2RlcyA9IHJlcXVpcmUoJy4vY29kZXMuanNvbicpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBzdGF0dXNcblxuLy8gc3RhdHVzIGNvZGUgdG8gbWVzc2FnZSBtYXBcbnN0YXR1cy5TVEFUVVNfQ09ERVMgPSBjb2Rlc1xuXG4vLyBhcnJheSBvZiBzdGF0dXMgY29kZXNcbnN0YXR1cy5jb2RlcyA9IHBvcHVsYXRlU3RhdHVzZXNNYXAoc3RhdHVzLCBjb2RlcylcblxuLy8gc3RhdHVzIGNvZGVzIGZvciByZWRpcmVjdHNcbnN0YXR1cy5yZWRpcmVjdCA9IHtcbiAgMzAwOiB0cnVlLFxuICAzMDE6IHRydWUsXG4gIDMwMjogdHJ1ZSxcbiAgMzAzOiB0cnVlLFxuICAzMDU6IHRydWUsXG4gIDMwNzogdHJ1ZSxcbiAgMzA4OiB0cnVlXG59XG5cbi8vIHN0YXR1cyBjb2RlcyBmb3IgZW1wdHkgYm9kaWVzXG5zdGF0dXMuZW1wdHkgPSB7XG4gIDIwNDogdHJ1ZSxcbiAgMjA1OiB0cnVlLFxuICAzMDQ6IHRydWVcbn1cblxuLy8gc3RhdHVzIGNvZGVzIGZvciB3aGVuIHlvdSBzaG91bGQgcmV0cnkgdGhlIHJlcXVlc3RcbnN0YXR1cy5yZXRyeSA9IHtcbiAgNTAyOiB0cnVlLFxuICA1MDM6IHRydWUsXG4gIDUwNDogdHJ1ZVxufVxuXG4vKipcbiAqIFBvcHVsYXRlIHRoZSBzdGF0dXNlcyBtYXAgZm9yIGdpdmVuIGNvZGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwb3B1bGF0ZVN0YXR1c2VzTWFwIChzdGF0dXNlcywgY29kZXMpIHtcbiAgdmFyIGFyciA9IFtdXG5cbiAgT2JqZWN0LmtleXMoY29kZXMpLmZvckVhY2goZnVuY3Rpb24gZm9yRWFjaENvZGUgKGNvZGUpIHtcbiAgICB2YXIgbWVzc2FnZSA9IGNvZGVzW2NvZGVdXG4gICAgdmFyIHN0YXR1cyA9IE51bWJlcihjb2RlKVxuXG4gICAgLy8gUG9wdWxhdGUgcHJvcGVydGllc1xuICAgIHN0YXR1c2VzW3N0YXR1c10gPSBtZXNzYWdlXG4gICAgc3RhdHVzZXNbbWVzc2FnZV0gPSBzdGF0dXNcbiAgICBzdGF0dXNlc1ttZXNzYWdlLnRvTG93ZXJDYXNlKCldID0gc3RhdHVzXG5cbiAgICAvLyBBZGQgdG8gYXJyYXlcbiAgICBhcnIucHVzaChzdGF0dXMpXG4gIH0pXG5cbiAgcmV0dXJuIGFyclxufVxuXG4vKipcbiAqIEdldCB0aGUgc3RhdHVzIGNvZGUuXG4gKlxuICogR2l2ZW4gYSBudW1iZXIsIHRoaXMgd2lsbCB0aHJvdyBpZiBpdCBpcyBub3QgYSBrbm93biBzdGF0dXNcbiAqIGNvZGUsIG90aGVyd2lzZSB0aGUgY29kZSB3aWxsIGJlIHJldHVybmVkLiBHaXZlbiBhIHN0cmluZyxcbiAqIHRoZSBzdHJpbmcgd2lsbCBiZSBwYXJzZWQgZm9yIGEgbnVtYmVyIGFuZCByZXR1cm4gdGhlIGNvZGVcbiAqIGlmIHZhbGlkLCBvdGhlcndpc2Ugd2lsbCBsb29rdXAgdGhlIGNvZGUgYXNzdW1pbmcgdGhpcyBpc1xuICogdGhlIHN0YXR1cyBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gY29kZVxuICogQHJldHVybnMge251bWJlcn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBzdGF0dXMgKGNvZGUpIHtcbiAgaWYgKHR5cGVvZiBjb2RlID09PSAnbnVtYmVyJykge1xuICAgIGlmICghc3RhdHVzW2NvZGVdKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdHVzIGNvZGU6ICcgKyBjb2RlKVxuICAgIHJldHVybiBjb2RlXG4gIH1cblxuICBpZiAodHlwZW9mIGNvZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY29kZSBtdXN0IGJlIGEgbnVtYmVyIG9yIHN0cmluZycpXG4gIH1cblxuICAvLyAnNDAzJ1xuICB2YXIgbiA9IHBhcnNlSW50KGNvZGUsIDEwKVxuICBpZiAoIWlzTmFOKG4pKSB7XG4gICAgaWYgKCFzdGF0dXNbbl0pIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0dXMgY29kZTogJyArIG4pXG4gICAgcmV0dXJuIG5cbiAgfVxuXG4gIG4gPSBzdGF0dXNbY29kZS50b0xvd2VyQ2FzZSgpXVxuICBpZiAoIW4pIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0dXMgbWVzc2FnZTogXCInICsgY29kZSArICdcIicpXG4gIHJldHVybiBuXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvc3RhdHVzZXMvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDIxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogdHlwZS1pc1xuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgdHlwZXIgPSByZXF1aXJlKCdtZWRpYS10eXBlcicpXG52YXIgbWltZSA9IHJlcXVpcmUoJ21pbWUtdHlwZXMnKVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mcmVxdWVzdFxubW9kdWxlLmV4cG9ydHMuaXMgPSB0eXBlaXNcbm1vZHVsZS5leHBvcnRzLmhhc0JvZHkgPSBoYXNib2R5XG5tb2R1bGUuZXhwb3J0cy5ub3JtYWxpemUgPSBub3JtYWxpemVcbm1vZHVsZS5leHBvcnRzLm1hdGNoID0gbWltZU1hdGNoXG5cbi8qKlxuICogQ29tcGFyZSBhIGB2YWx1ZWAgY29udGVudC10eXBlIHdpdGggYHR5cGVzYC5cbiAqIEVhY2ggYHR5cGVgIGNhbiBiZSBhbiBleHRlbnNpb24gbGlrZSBgaHRtbGAsXG4gKiBhIHNwZWNpYWwgc2hvcnRjdXQgbGlrZSBgbXVsdGlwYXJ0YCBvciBgdXJsZW5jb2RlZGAsXG4gKiBvciBhIG1pbWUgdHlwZS5cbiAqXG4gKiBJZiBubyB0eXBlcyBtYXRjaCwgYGZhbHNlYCBpcyByZXR1cm5lZC5cbiAqIE90aGVyd2lzZSwgdGhlIGZpcnN0IGB0eXBlYCB0aGF0IG1hdGNoZXMgaXMgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge0FycmF5fSB0eXBlc1xuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHR5cGVpcyAodmFsdWUsIHR5cGVzXykge1xuICB2YXIgaVxuICB2YXIgdHlwZXMgPSB0eXBlc19cblxuICAvLyByZW1vdmUgcGFyYW1ldGVycyBhbmQgbm9ybWFsaXplXG4gIHZhciB2YWwgPSB0cnlOb3JtYWxpemVUeXBlKHZhbHVlKVxuXG4gIC8vIG5vIHR5cGUgb3IgaW52YWxpZFxuICBpZiAoIXZhbCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gc3VwcG9ydCBmbGF0dGVuZWQgYXJndW1lbnRzXG4gIGlmICh0eXBlcyAmJiAhQXJyYXkuaXNBcnJheSh0eXBlcykpIHtcbiAgICB0eXBlcyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSlcbiAgICBmb3IgKGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHR5cGVzW2ldID0gYXJndW1lbnRzW2kgKyAxXVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vIHR5cGVzLCByZXR1cm4gdGhlIGNvbnRlbnQgdHlwZVxuICBpZiAoIXR5cGVzIHx8ICF0eXBlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdmFsXG4gIH1cblxuICB2YXIgdHlwZVxuICBmb3IgKGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobWltZU1hdGNoKG5vcm1hbGl6ZSh0eXBlID0gdHlwZXNbaV0pLCB2YWwpKSB7XG4gICAgICByZXR1cm4gdHlwZVswXSA9PT0gJysnIHx8IHR5cGUuaW5kZXhPZignKicpICE9PSAtMVxuICAgICAgICA/IHZhbFxuICAgICAgICA6IHR5cGVcbiAgICB9XG4gIH1cblxuICAvLyBubyBtYXRjaGVzXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcmVxdWVzdCBoYXMgYSByZXF1ZXN0IGJvZHkuXG4gKiBBIHJlcXVlc3Qgd2l0aCBhIGJvZHkgX19tdXN0X18gZWl0aGVyIGhhdmUgYHRyYW5zZmVyLWVuY29kaW5nYFxuICogb3IgYGNvbnRlbnQtbGVuZ3RoYCBoZWFkZXJzIHNldC5cbiAqIGh0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjNC5odG1sI3NlYzQuM1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXF1ZXN0XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGhhc2JvZHkgKHJlcSkge1xuICByZXR1cm4gcmVxLmhlYWRlcnNbJ3RyYW5zZmVyLWVuY29kaW5nJ10gIT09IHVuZGVmaW5lZCB8fFxuICAgICFpc05hTihyZXEuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSlcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgaW5jb21pbmcgcmVxdWVzdCBjb250YWlucyB0aGUgXCJDb250ZW50LVR5cGVcIlxuICogaGVhZGVyIGZpZWxkLCBhbmQgaXQgY29udGFpbnMgYW55IG9mIHRoZSBnaXZlIG1pbWUgYHR5cGVgcy5cbiAqIElmIHRoZXJlIGlzIG5vIHJlcXVlc3QgYm9keSwgYG51bGxgIGlzIHJldHVybmVkLlxuICogSWYgdGhlcmUgaXMgbm8gY29udGVudCB0eXBlLCBgZmFsc2VgIGlzIHJldHVybmVkLlxuICogT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRoZSBmaXJzdCBgdHlwZWAgdGhhdCBtYXRjaGVzLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAvLyBXaXRoIENvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XG4gKiAgICAgdGhpcy5pcygnaHRtbCcpOyAvLyA9PiAnaHRtbCdcbiAqICAgICB0aGlzLmlzKCd0ZXh0L2h0bWwnKTsgLy8gPT4gJ3RleHQvaHRtbCdcbiAqICAgICB0aGlzLmlzKCd0ZXh0LyonLCAnYXBwbGljYXRpb24vanNvbicpOyAvLyA9PiAndGV4dC9odG1sJ1xuICpcbiAqICAgICAvLyBXaGVuIENvbnRlbnQtVHlwZSBpcyBhcHBsaWNhdGlvbi9qc29uXG4gKiAgICAgdGhpcy5pcygnanNvbicsICd1cmxlbmNvZGVkJyk7IC8vID0+ICdqc29uJ1xuICogICAgIHRoaXMuaXMoJ2FwcGxpY2F0aW9uL2pzb24nKTsgLy8gPT4gJ2FwcGxpY2F0aW9uL2pzb24nXG4gKiAgICAgdGhpcy5pcygnaHRtbCcsICdhcHBsaWNhdGlvbi8qJyk7IC8vID0+ICdhcHBsaWNhdGlvbi9qc29uJ1xuICpcbiAqICAgICB0aGlzLmlzKCdodG1sJyk7IC8vID0+IGZhbHNlXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IHR5cGVzLi4uXG4gKiBAcmV0dXJuIHtTdHJpbmd8ZmFsc2V8bnVsbH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiB0eXBlb2ZyZXF1ZXN0IChyZXEsIHR5cGVzXykge1xuICB2YXIgdHlwZXMgPSB0eXBlc19cblxuICAvLyBubyBib2R5XG4gIGlmICghaGFzYm9keShyZXEpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8vIHN1cHBvcnQgZmxhdHRlbmVkIGFyZ3VtZW50c1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHtcbiAgICB0eXBlcyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0eXBlc1tpXSA9IGFyZ3VtZW50c1tpICsgMV1cbiAgICB9XG4gIH1cblxuICAvLyByZXF1ZXN0IGNvbnRlbnQgdHlwZVxuICB2YXIgdmFsdWUgPSByZXEuaGVhZGVyc1snY29udGVudC10eXBlJ11cblxuICByZXR1cm4gdHlwZWlzKHZhbHVlLCB0eXBlcylcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYSBtaW1lIHR5cGUuXG4gKiBJZiBpdCdzIGEgc2hvcnRoYW5kLCBleHBhbmQgaXQgdG8gYSB2YWxpZCBtaW1lIHR5cGUuXG4gKlxuICogSW4gZ2VuZXJhbCwgeW91IHByb2JhYmx5IHdhbnQ6XG4gKlxuICogICB2YXIgdHlwZSA9IGlzKHJlcSwgWyd1cmxlbmNvZGVkJywgJ2pzb24nLCAnbXVsdGlwYXJ0J10pO1xuICpcbiAqIFRoZW4gdXNlIHRoZSBhcHByb3ByaWF0ZSBib2R5IHBhcnNlcnMuXG4gKiBUaGVzZSB0aHJlZSBhcmUgdGhlIG1vc3QgY29tbW9uIHJlcXVlc3QgYm9keSB0eXBlc1xuICogYW5kIGFyZSB0aHVzIGVuc3VyZWQgdG8gd29yay5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemUgKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgIC8vIGludmFsaWQgdHlwZVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAndXJsZW5jb2RlZCc6XG4gICAgICByZXR1cm4gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICBjYXNlICdtdWx0aXBhcnQnOlxuICAgICAgcmV0dXJuICdtdWx0aXBhcnQvKidcbiAgfVxuXG4gIGlmICh0eXBlWzBdID09PSAnKycpIHtcbiAgICAvLyBcIitqc29uXCIgLT4gXCIqLyoranNvblwiIGV4cGFuZG9cbiAgICByZXR1cm4gJyovKicgKyB0eXBlXG4gIH1cblxuICByZXR1cm4gdHlwZS5pbmRleE9mKCcvJykgPT09IC0xXG4gICAgPyBtaW1lLmxvb2t1cCh0eXBlKVxuICAgIDogdHlwZVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGBleHBlY3RlZGAgbWltZSB0eXBlXG4gKiBtYXRjaGVzIGBhY3R1YWxgIG1pbWUgdHlwZSB3aXRoXG4gKiB3aWxkY2FyZCBhbmQgK3N1ZmZpeCBzdXBwb3J0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBleHBlY3RlZFxuICogQHBhcmFtIHtTdHJpbmd9IGFjdHVhbFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWltZU1hdGNoIChleHBlY3RlZCwgYWN0dWFsKSB7XG4gIC8vIGludmFsaWQgdHlwZVxuICBpZiAoZXhwZWN0ZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBzcGxpdCB0eXBlc1xuICB2YXIgYWN0dWFsUGFydHMgPSBhY3R1YWwuc3BsaXQoJy8nKVxuICB2YXIgZXhwZWN0ZWRQYXJ0cyA9IGV4cGVjdGVkLnNwbGl0KCcvJylcblxuICAvLyBpbnZhbGlkIGZvcm1hdFxuICBpZiAoYWN0dWFsUGFydHMubGVuZ3RoICE9PSAyIHx8IGV4cGVjdGVkUGFydHMubGVuZ3RoICE9PSAyKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyB2YWxpZGF0ZSB0eXBlXG4gIGlmIChleHBlY3RlZFBhcnRzWzBdICE9PSAnKicgJiYgZXhwZWN0ZWRQYXJ0c1swXSAhPT0gYWN0dWFsUGFydHNbMF0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIHZhbGlkYXRlIHN1ZmZpeCB3aWxkY2FyZFxuICBpZiAoZXhwZWN0ZWRQYXJ0c1sxXS5zdWJzdHIoMCwgMikgPT09ICcqKycpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWRQYXJ0c1sxXS5sZW5ndGggPD0gYWN0dWFsUGFydHNbMV0ubGVuZ3RoICsgMSAmJlxuICAgICAgZXhwZWN0ZWRQYXJ0c1sxXS5zdWJzdHIoMSkgPT09IGFjdHVhbFBhcnRzWzFdLnN1YnN0cigxIC0gZXhwZWN0ZWRQYXJ0c1sxXS5sZW5ndGgpXG4gIH1cblxuICAvLyB2YWxpZGF0ZSBzdWJ0eXBlXG4gIGlmIChleHBlY3RlZFBhcnRzWzFdICE9PSAnKicgJiYgZXhwZWN0ZWRQYXJ0c1sxXSAhPT0gYWN0dWFsUGFydHNbMV0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogTm9ybWFsaXplIGEgdHlwZSBhbmQgcmVtb3ZlIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVR5cGUgKHZhbHVlKSB7XG4gIC8vIHBhcnNlIHRoZSB0eXBlXG4gIHZhciB0eXBlID0gdHlwZXIucGFyc2UodmFsdWUpXG5cbiAgLy8gcmVtb3ZlIHRoZSBwYXJhbWV0ZXJzXG4gIHR5cGUucGFyYW1ldGVycyA9IHVuZGVmaW5lZFxuXG4gIC8vIHJlZm9ybWF0IGl0XG4gIHJldHVybiB0eXBlci5mb3JtYXQodHlwZSlcbn1cblxuLyoqXG4gKiBUcnkgdG8gbm9ybWFsaXplIGEgdHlwZSBhbmQgcmVtb3ZlIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRyeU5vcm1hbGl6ZVR5cGUgKHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVR5cGUodmFsdWUpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy90eXBlLWlzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAyMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIHBhcnNldXJsXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTcgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciB1cmwgPSByZXF1aXJlKCd1cmwnKVxudmFyIHBhcnNlID0gdXJsLnBhcnNlXG52YXIgVXJsID0gdXJsLlVybFxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcGFyc2V1cmxcbm1vZHVsZS5leHBvcnRzLm9yaWdpbmFsID0gb3JpZ2luYWx1cmxcblxuLyoqXG4gKiBQYXJzZSB0aGUgYHJlcWAgdXJsIHdpdGggbWVtb2l6YXRpb24uXG4gKlxuICogQHBhcmFtIHtTZXJ2ZXJSZXF1ZXN0fSByZXFcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZXVybCAocmVxKSB7XG4gIHZhciB1cmwgPSByZXEudXJsXG5cbiAgaWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gVVJMIGlzIHVuZGVmaW5lZFxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHZhciBwYXJzZWQgPSByZXEuX3BhcnNlZFVybFxuXG4gIGlmIChmcmVzaCh1cmwsIHBhcnNlZCkpIHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIFVSTCBwYXJzZVxuICAgIHJldHVybiBwYXJzZWRcbiAgfVxuXG4gIC8vIFBhcnNlIHRoZSBVUkxcbiAgcGFyc2VkID0gZmFzdHBhcnNlKHVybClcbiAgcGFyc2VkLl9yYXcgPSB1cmxcblxuICByZXR1cm4gKHJlcS5fcGFyc2VkVXJsID0gcGFyc2VkKVxufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgYHJlcWAgb3JpZ2luYWwgdXJsIHdpdGggZmFsbGJhY2sgYW5kIG1lbW9pemF0aW9uLlxuICpcbiAqIEBwYXJhbSB7U2VydmVyUmVxdWVzdH0gcmVxXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gb3JpZ2luYWx1cmwgKHJlcSkge1xuICB2YXIgdXJsID0gcmVxLm9yaWdpbmFsVXJsXG5cbiAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gRmFsbGJhY2tcbiAgICByZXR1cm4gcGFyc2V1cmwocmVxKVxuICB9XG5cbiAgdmFyIHBhcnNlZCA9IHJlcS5fcGFyc2VkT3JpZ2luYWxVcmxcblxuICBpZiAoZnJlc2godXJsLCBwYXJzZWQpKSB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCBVUkwgcGFyc2VcbiAgICByZXR1cm4gcGFyc2VkXG4gIH1cblxuICAvLyBQYXJzZSB0aGUgVVJMXG4gIHBhcnNlZCA9IGZhc3RwYXJzZSh1cmwpXG4gIHBhcnNlZC5fcmF3ID0gdXJsXG5cbiAgcmV0dXJuIChyZXEuX3BhcnNlZE9yaWdpbmFsVXJsID0gcGFyc2VkKVxufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgYHN0cmAgdXJsIHdpdGggZmFzdC1wYXRoIHNob3J0LWN1dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZhc3RwYXJzZSAoc3RyKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBzdHIuY2hhckNvZGVBdCgwKSAhPT0gMHgyZiAvKiAvICovKSB7XG4gICAgcmV0dXJuIHBhcnNlKHN0cilcbiAgfVxuXG4gIHZhciBwYXRobmFtZSA9IHN0clxuICB2YXIgcXVlcnkgPSBudWxsXG4gIHZhciBzZWFyY2ggPSBudWxsXG5cbiAgLy8gVGhpcyB0YWtlcyB0aGUgcmVnZXhwIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL3B1bGwvNzg3OFxuICAvLyBXaGljaCBpcyAvXihcXC9bXj8jXFxzXSopKFxcP1teI1xcc10qKT8kL1xuICAvLyBBbmQgdW5yb2xscyBpdCBpbnRvIGEgZm9yIGxvb3BcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBzd2l0Y2ggKHN0ci5jaGFyQ29kZUF0KGkpKSB7XG4gICAgICBjYXNlIDB4M2Y6IC8qID8gICovXG4gICAgICAgIGlmIChzZWFyY2ggPT09IG51bGwpIHtcbiAgICAgICAgICBwYXRobmFtZSA9IHN0ci5zdWJzdHJpbmcoMCwgaSlcbiAgICAgICAgICBxdWVyeSA9IHN0ci5zdWJzdHJpbmcoaSArIDEpXG4gICAgICAgICAgc2VhcmNoID0gc3RyLnN1YnN0cmluZyhpKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDB4MDk6IC8qIFxcdCAqL1xuICAgICAgY2FzZSAweDBhOiAvKiBcXG4gKi9cbiAgICAgIGNhc2UgMHgwYzogLyogXFxmICovXG4gICAgICBjYXNlIDB4MGQ6IC8qIFxcciAqL1xuICAgICAgY2FzZSAweDIwOiAvKiAgICAqL1xuICAgICAgY2FzZSAweDIzOiAvKiAjICAqL1xuICAgICAgY2FzZSAweGEwOlxuICAgICAgY2FzZSAweGZlZmY6XG4gICAgICAgIHJldHVybiBwYXJzZShzdHIpXG4gICAgfVxuICB9XG5cbiAgdmFyIHVybCA9IFVybCAhPT0gdW5kZWZpbmVkXG4gICAgPyBuZXcgVXJsKClcbiAgICA6IHt9XG4gIHVybC5wYXRoID0gc3RyXG4gIHVybC5ocmVmID0gc3RyXG4gIHVybC5wYXRobmFtZSA9IHBhdGhuYW1lXG4gIHVybC5xdWVyeSA9IHF1ZXJ5XG4gIHVybC5zZWFyY2ggPSBzZWFyY2hcblxuICByZXR1cm4gdXJsXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHBhcnNlZCBpcyBzdGlsbCBmcmVzaCBmb3IgdXJsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJzZWRVcmxcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZyZXNoICh1cmwsIHBhcnNlZFVybCkge1xuICByZXR1cm4gdHlwZW9mIHBhcnNlZFVybCA9PT0gJ29iamVjdCcgJiZcbiAgICBwYXJzZWRVcmwgIT09IG51bGwgJiZcbiAgICAoVXJsID09PSB1bmRlZmluZWQgfHwgcGFyc2VkVXJsIGluc3RhbmNlb2YgVXJsKSAmJlxuICAgIHBhcnNlZFVybC5fcmF3ID09PSB1cmxcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9wYXJzZXVybC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAyNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvcHJvbWlzZS5qc1xuLy8gbW9kdWxlIGlkID0gMjVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oYXMuanNcbi8vIG1vZHVsZSBpZCA9IDI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0ge307XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXJhdG9ycy5qc1xuLy8gbW9kdWxlIGlkID0gMjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2YuanNcbi8vIG1vZHVsZSBpZCA9IDI5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG52YXIgQlJFQUsgPSB7fTtcbnZhciBSRVRVUk4gPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUikge1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSk7XG4gIHZhciBmID0gY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmIChpc0FycmF5SXRlcihpdGVyRm4pKSBmb3IgKGxlbmd0aCA9IHRvTGVuZ3RoKGl0ZXJhYmxlLmxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOykge1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuZXhwb3J0cy5CUkVBSyA9IEJSRUFLO1xuZXhwb3J0cy5SRVRVUk4gPSBSRVRVUk47XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2Zvci1vZi5qc1xuLy8gbW9kdWxlIGlkID0gMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuY29uc3QgREFUQV9QQVRIID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2RhdGEnKTtcbmNvbnN0IEFOQUxZVElDU19QQVRIID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL3NyYycpO1xuY29uc3QgQU5PTUFMSUVTX1BBVEggPSBwYXRoLmpvaW4oQU5BTFlUSUNTX1BBVEgsICdhbm9tYWxpZXMnKTtcbmNvbnN0IFNFR01FTlRTX1BBVEggPSBwYXRoLmpvaW4oQU5BTFlUSUNTX1BBVEgsICdzZWdtZW50cycpO1xuY29uc3QgTUVUUklDU19QQVRIID0gcGF0aC5qb2luKEFOQUxZVElDU19QQVRILCAnbWV0cmljcycpO1xuXG5leHBvcnQgeyBEQVRBX1BBVEgsIEFOQUxZVElDU19QQVRILCBBTk9NQUxJRVNfUEFUSCwgU0VHTUVOVFNfUEFUSCwgTUVUUklDU19QQVRIIH1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2NvbmZpZy50cyIsIi8qIVxuICogZXhwcmVzc1xuICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMyBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTMgUm9tYW4gU2h0eWxtYW5cbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9leHByZXNzJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvZXhwcmVzcy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMzJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBjb250ZW50LXR5cGVcbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggKiggXCI7XCIgcGFyYW1ldGVyICkgaW4gUkZDIDcyMzEgc2VjIDMuMS4xLjFcbiAqXG4gKiBwYXJhbWV0ZXIgICAgID0gdG9rZW4gXCI9XCIgKCB0b2tlbiAvIHF1b3RlZC1zdHJpbmcgKVxuICogdG9rZW4gICAgICAgICA9IDEqdGNoYXJcbiAqIHRjaGFyICAgICAgICAgPSBcIiFcIiAvIFwiI1wiIC8gXCIkXCIgLyBcIiVcIiAvIFwiJlwiIC8gXCInXCIgLyBcIipcIlxuICogICAgICAgICAgICAgICAvIFwiK1wiIC8gXCItXCIgLyBcIi5cIiAvIFwiXlwiIC8gXCJfXCIgLyBcImBcIiAvIFwifFwiIC8gXCJ+XCJcbiAqICAgICAgICAgICAgICAgLyBESUdJVCAvIEFMUEhBXG4gKiAgICAgICAgICAgICAgIDsgYW55IFZDSEFSLCBleGNlcHQgZGVsaW1pdGVyc1xuICogcXVvdGVkLXN0cmluZyA9IERRVU9URSAqKCBxZHRleHQgLyBxdW90ZWQtcGFpciApIERRVU9URVxuICogcWR0ZXh0ICAgICAgICA9IEhUQUIgLyBTUCAvICV4MjEgLyAleDIzLTVCIC8gJXg1RC03RSAvIG9icy10ZXh0XG4gKiBvYnMtdGV4dCAgICAgID0gJXg4MC1GRlxuICogcXVvdGVkLXBhaXIgICA9IFwiXFxcIiAoIEhUQUIgLyBTUCAvIFZDSEFSIC8gb2JzLXRleHQgKVxuICovXG52YXIgUEFSQU1fUkVHRVhQID0gLzsgKihbISMkJSYnKisuXl9gfH4wLTlBLVphLXotXSspICo9ICooXCIoPzpbXFx1MDAwYlxcdTAwMjBcXHUwMDIxXFx1MDAyMy1cXHUwMDViXFx1MDA1ZC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXXxcXFxcW1xcdTAwMGJcXHUwMDIwLVxcdTAwZmZdKSpcInxbISMkJSYnKisuXl9gfH4wLTlBLVphLXotXSspICovZ1xudmFyIFRFWFRfUkVHRVhQID0gL15bXFx1MDAwYlxcdTAwMjAtXFx1MDA3ZVxcdTAwODAtXFx1MDBmZl0rJC9cbnZhciBUT0tFTl9SRUdFWFAgPSAvXlshIyQlJicqKy5eX2B8fjAtOUEtWmEtei1dKyQvXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHF1b3RlZC1wYWlyIGluIFJGQyA3MjMwIHNlYyAzLjIuNlxuICpcbiAqIHF1b3RlZC1wYWlyID0gXCJcXFwiICggSFRBQiAvIFNQIC8gVkNIQVIgLyBvYnMtdGV4dCApXG4gKiBvYnMtdGV4dCAgICA9ICV4ODAtRkZcbiAqL1xudmFyIFFFU0NfUkVHRVhQID0gL1xcXFwoW1xcdTAwMGJcXHUwMDIwLVxcdTAwZmZdKS9nXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGNoYXJzIHRoYXQgbXVzdCBiZSBxdW90ZWQtcGFpciBpbiBSRkMgNzIzMCBzZWMgMy4yLjZcbiAqL1xudmFyIFFVT1RFX1JFR0VYUCA9IC8oW1xcXFxcIl0pL2dcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggdHlwZSBpbiBSRkMgNzIzMSBzZWMgMy4xLjEuMVxuICpcbiAqIG1lZGlhLXR5cGUgPSB0eXBlIFwiL1wiIHN1YnR5cGVcbiAqIHR5cGUgICAgICAgPSB0b2tlblxuICogc3VidHlwZSAgICA9IHRva2VuXG4gKi9cbnZhciBUWVBFX1JFR0VYUCA9IC9eWyEjJCUmJyorLl5fYHx+MC05QS1aYS16LV0rXFwvWyEjJCUmJyorLl5fYHx+MC05QS1aYS16LV0rJC9cblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmZvcm1hdCA9IGZvcm1hdFxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlXG5cbi8qKlxuICogRm9ybWF0IG9iamVjdCB0byBtZWRpYSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXQgKG9iaikge1xuICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG9iaiBpcyByZXF1aXJlZCcpXG4gIH1cblxuICB2YXIgcGFyYW1ldGVycyA9IG9iai5wYXJhbWV0ZXJzXG4gIHZhciB0eXBlID0gb2JqLnR5cGVcblxuICBpZiAoIXR5cGUgfHwgIVRZUEVfUkVHRVhQLnRlc3QodHlwZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHR5cGUnKVxuICB9XG5cbiAgdmFyIHN0cmluZyA9IHR5cGVcblxuICAvLyBhcHBlbmQgcGFyYW1ldGVyc1xuICBpZiAocGFyYW1ldGVycyAmJiB0eXBlb2YgcGFyYW1ldGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgcGFyYW1cbiAgICB2YXIgcGFyYW1zID0gT2JqZWN0LmtleXMocGFyYW1ldGVycykuc29ydCgpXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcGFyYW0gPSBwYXJhbXNbaV1cblxuICAgICAgaWYgKCFUT0tFTl9SRUdFWFAudGVzdChwYXJhbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXJhbWV0ZXIgbmFtZScpXG4gICAgICB9XG5cbiAgICAgIHN0cmluZyArPSAnOyAnICsgcGFyYW0gKyAnPScgKyBxc3RyaW5nKHBhcmFtZXRlcnNbcGFyYW1dKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHJpbmdcbn1cblxuLyoqXG4gKiBQYXJzZSBtZWRpYSB0eXBlIHRvIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHN0cmluZ1xuICogQHJldHVybiB7T2JqZWN0fVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHBhcnNlIChzdHJpbmcpIHtcbiAgaWYgKCFzdHJpbmcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzdHJpbmcgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgLy8gc3VwcG9ydCByZXEvcmVzLWxpa2Ugb2JqZWN0cyBhcyBhcmd1bWVudFxuICB2YXIgaGVhZGVyID0gdHlwZW9mIHN0cmluZyA9PT0gJ29iamVjdCdcbiAgICA/IGdldGNvbnRlbnR0eXBlKHN0cmluZylcbiAgICA6IHN0cmluZ1xuXG4gIGlmICh0eXBlb2YgaGVhZGVyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHN0cmluZyBpcyByZXF1aXJlZCB0byBiZSBhIHN0cmluZycpXG4gIH1cblxuICB2YXIgaW5kZXggPSBoZWFkZXIuaW5kZXhPZignOycpXG4gIHZhciB0eXBlID0gaW5kZXggIT09IC0xXG4gICAgPyBoZWFkZXIuc3Vic3RyKDAsIGluZGV4KS50cmltKClcbiAgICA6IGhlYWRlci50cmltKClcblxuICBpZiAoIVRZUEVfUkVHRVhQLnRlc3QodHlwZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIG1lZGlhIHR5cGUnKVxuICB9XG5cbiAgdmFyIG9iaiA9IG5ldyBDb250ZW50VHlwZSh0eXBlLnRvTG93ZXJDYXNlKCkpXG5cbiAgLy8gcGFyc2UgcGFyYW1ldGVyc1xuICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgdmFyIGtleVxuICAgIHZhciBtYXRjaFxuICAgIHZhciB2YWx1ZVxuXG4gICAgUEFSQU1fUkVHRVhQLmxhc3RJbmRleCA9IGluZGV4XG5cbiAgICB3aGlsZSAoKG1hdGNoID0gUEFSQU1fUkVHRVhQLmV4ZWMoaGVhZGVyKSkpIHtcbiAgICAgIGlmIChtYXRjaC5pbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXJhbWV0ZXIgZm9ybWF0JylcbiAgICAgIH1cblxuICAgICAgaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoXG4gICAgICBrZXkgPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgICB2YWx1ZSA9IG1hdGNoWzJdXG5cbiAgICAgIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgICAgICAvLyByZW1vdmUgcXVvdGVzIGFuZCBlc2NhcGVzXG4gICAgICAgIHZhbHVlID0gdmFsdWVcbiAgICAgICAgICAuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCAtIDIpXG4gICAgICAgICAgLnJlcGxhY2UoUUVTQ19SRUdFWFAsICckMScpXG4gICAgICB9XG5cbiAgICAgIG9iai5wYXJhbWV0ZXJzW2tleV0gPSB2YWx1ZVxuICAgIH1cblxuICAgIGlmIChpbmRleCAhPT0gaGVhZGVyLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXJhbWV0ZXIgZm9ybWF0JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbi8qKlxuICogR2V0IGNvbnRlbnQtdHlwZSBmcm9tIHJlcS9yZXMgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH1cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0Y29udGVudHR5cGUgKG9iaikge1xuICB2YXIgaGVhZGVyXG5cbiAgaWYgKHR5cGVvZiBvYmouZ2V0SGVhZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gcmVzLWxpa2VcbiAgICBoZWFkZXIgPSBvYmouZ2V0SGVhZGVyKCdjb250ZW50LXR5cGUnKVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmouaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyByZXEtbGlrZVxuICAgIGhlYWRlciA9IG9iai5oZWFkZXJzICYmIG9iai5oZWFkZXJzWydjb250ZW50LXR5cGUnXVxuICB9XG5cbiAgaWYgKHR5cGVvZiBoZWFkZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY29udGVudC10eXBlIGhlYWRlciBpcyBtaXNzaW5nIGZyb20gb2JqZWN0JylcbiAgfVxuXG4gIHJldHVybiBoZWFkZXJcbn1cblxuLyoqXG4gKiBRdW90ZSBhIHN0cmluZyBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbFxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBxc3RyaW5nICh2YWwpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyh2YWwpXG5cbiAgLy8gbm8gbmVlZCB0byBxdW90ZSB0b2tlbnNcbiAgaWYgKFRPS0VOX1JFR0VYUC50ZXN0KHN0cikpIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cblxuICBpZiAoc3RyLmxlbmd0aCA+IDAgJiYgIVRFWFRfUkVHRVhQLnRlc3Qoc3RyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgcGFyYW1ldGVyIHZhbHVlJylcbiAgfVxuXG4gIHJldHVybiAnXCInICsgc3RyLnJlcGxhY2UoUVVPVEVfUkVHRVhQLCAnXFxcXCQxJykgKyAnXCInXG59XG5cbi8qKlxuICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgY29udGVudCB0eXBlLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gQ29udGVudFR5cGUgKHR5cGUpIHtcbiAgdGhpcy5wYXJhbWV0ZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICB0aGlzLnR5cGUgPSB0eXBlXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29udGVudC10eXBlL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAzM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIGh0dHAtZXJyb3JzXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGVwcmVjYXRlID0gcmVxdWlyZSgnZGVwZCcpKCdodHRwLWVycm9ycycpXG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCdzZXRwcm90b3R5cGVvZicpXG52YXIgc3RhdHVzZXMgPSByZXF1aXJlKCdzdGF0dXNlcycpXG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVFcnJvclxubW9kdWxlLmV4cG9ydHMuSHR0cEVycm9yID0gY3JlYXRlSHR0cEVycm9yQ29uc3RydWN0b3IoKVxuXG4vLyBQb3B1bGF0ZSBleHBvcnRzIGZvciBhbGwgY29uc3RydWN0b3JzXG5wb3B1bGF0ZUNvbnN0cnVjdG9yRXhwb3J0cyhtb2R1bGUuZXhwb3J0cywgc3RhdHVzZXMuY29kZXMsIG1vZHVsZS5leHBvcnRzLkh0dHBFcnJvcilcblxuLyoqXG4gKiBHZXQgdGhlIGNvZGUgY2xhc3Mgb2YgYSBzdGF0dXMgY29kZS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29kZUNsYXNzIChzdGF0dXMpIHtcbiAgcmV0dXJuIE51bWJlcihTdHJpbmcoc3RhdHVzKS5jaGFyQXQoMCkgKyAnMDAnKVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBIVFRQIEVycm9yLlxuICpcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFcnJvciAoKSB7XG4gIC8vIHNvIG11Y2ggYXJpdHkgZ29pbmcgb24gfl9+XG4gIHZhciBlcnJcbiAgdmFyIG1zZ1xuICB2YXIgc3RhdHVzID0gNTAwXG4gIHZhciBwcm9wcyA9IHt9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXVxuICAgIGlmIChhcmcgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgZXJyID0gYXJnXG4gICAgICBzdGF0dXMgPSBlcnIuc3RhdHVzIHx8IGVyci5zdGF0dXNDb2RlIHx8IHN0YXR1c1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgc3dpdGNoICh0eXBlb2YgYXJnKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICBtc2cgPSBhcmdcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHN0YXR1cyA9IGFyZ1xuICAgICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICAgIGRlcHJlY2F0ZSgnbm9uLWZpcnN0LWFyZ3VtZW50IHN0YXR1cyBjb2RlOyByZXBsYWNlIHdpdGggY3JlYXRlRXJyb3IoJyArIGFyZyArICcsIC4uLiknKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBwcm9wcyA9IGFyZ1xuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJyAmJiAoc3RhdHVzIDwgNDAwIHx8IHN0YXR1cyA+PSA2MDApKSB7XG4gICAgZGVwcmVjYXRlKCdub24tZXJyb3Igc3RhdHVzIGNvZGU7IHVzZSBvbmx5IDR4eCBvciA1eHggc3RhdHVzIGNvZGVzJylcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RhdHVzICE9PSAnbnVtYmVyJyB8fFxuICAgICghc3RhdHVzZXNbc3RhdHVzXSAmJiAoc3RhdHVzIDwgNDAwIHx8IHN0YXR1cyA+PSA2MDApKSkge1xuICAgIHN0YXR1cyA9IDUwMFxuICB9XG5cbiAgLy8gY29uc3RydWN0b3JcbiAgdmFyIEh0dHBFcnJvciA9IGNyZWF0ZUVycm9yW3N0YXR1c10gfHwgY3JlYXRlRXJyb3JbY29kZUNsYXNzKHN0YXR1cyldXG5cbiAgaWYgKCFlcnIpIHtcbiAgICAvLyBjcmVhdGUgZXJyb3JcbiAgICBlcnIgPSBIdHRwRXJyb3JcbiAgICAgID8gbmV3IEh0dHBFcnJvcihtc2cpXG4gICAgICA6IG5ldyBFcnJvcihtc2cgfHwgc3RhdHVzZXNbc3RhdHVzXSlcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShlcnIsIGNyZWF0ZUVycm9yKVxuICB9XG5cbiAgaWYgKCFIdHRwRXJyb3IgfHwgIShlcnIgaW5zdGFuY2VvZiBIdHRwRXJyb3IpIHx8IGVyci5zdGF0dXMgIT09IHN0YXR1cykge1xuICAgIC8vIGFkZCBwcm9wZXJ0aWVzIHRvIGdlbmVyaWMgZXJyb3JcbiAgICBlcnIuZXhwb3NlID0gc3RhdHVzIDwgNTAwXG4gICAgZXJyLnN0YXR1cyA9IGVyci5zdGF0dXNDb2RlID0gc3RhdHVzXG4gIH1cblxuICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICBpZiAoa2V5ICE9PSAnc3RhdHVzJyAmJiBrZXkgIT09ICdzdGF0dXNDb2RlJykge1xuICAgICAgZXJyW2tleV0gPSBwcm9wc1trZXldXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVyclxufVxuXG4vKipcbiAqIENyZWF0ZSBIVFRQIGVycm9yIGFic3RyYWN0IGJhc2UgY2xhc3MuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUh0dHBFcnJvckNvbnN0cnVjdG9yICgpIHtcbiAgZnVuY3Rpb24gSHR0cEVycm9yICgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjYW5ub3QgY29uc3RydWN0IGFic3RyYWN0IGNsYXNzJylcbiAgfVxuXG4gIGluaGVyaXRzKEh0dHBFcnJvciwgRXJyb3IpXG5cbiAgcmV0dXJuIEh0dHBFcnJvclxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGNvbnN0cnVjdG9yIGZvciBhIGNsaWVudCBlcnJvci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlQ2xpZW50RXJyb3JDb25zdHJ1Y3RvciAoSHR0cEVycm9yLCBuYW1lLCBjb2RlKSB7XG4gIHZhciBjbGFzc05hbWUgPSBuYW1lLm1hdGNoKC9FcnJvciQvKSA/IG5hbWUgOiBuYW1lICsgJ0Vycm9yJ1xuXG4gIGZ1bmN0aW9uIENsaWVudEVycm9yIChtZXNzYWdlKSB7XG4gICAgLy8gY3JlYXRlIHRoZSBlcnJvciBvYmplY3RcbiAgICB2YXIgbXNnID0gbWVzc2FnZSAhPSBudWxsID8gbWVzc2FnZSA6IHN0YXR1c2VzW2NvZGVdXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpXG5cbiAgICAvLyBjYXB0dXJlIGEgc3RhY2sgdHJhY2UgdG8gdGhlIGNvbnN0cnVjdGlvbiBwb2ludFxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgQ2xpZW50RXJyb3IpXG5cbiAgICAvLyBhZGp1c3QgdGhlIFtbUHJvdG90eXBlXV1cbiAgICBzZXRQcm90b3R5cGVPZihlcnIsIENsaWVudEVycm9yLnByb3RvdHlwZSlcblxuICAgIC8vIHJlZGVmaW5lIHRoZSBlcnJvciBtZXNzYWdlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ21lc3NhZ2UnLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IG1zZyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSlcblxuICAgIC8vIHJlZGVmaW5lIHRoZSBlcnJvciBuYW1lXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ25hbWUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBjbGFzc05hbWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pXG5cbiAgICByZXR1cm4gZXJyXG4gIH1cblxuICBpbmhlcml0cyhDbGllbnRFcnJvciwgSHR0cEVycm9yKVxuXG4gIENsaWVudEVycm9yLnByb3RvdHlwZS5zdGF0dXMgPSBjb2RlXG4gIENsaWVudEVycm9yLnByb3RvdHlwZS5zdGF0dXNDb2RlID0gY29kZVxuICBDbGllbnRFcnJvci5wcm90b3R5cGUuZXhwb3NlID0gdHJ1ZVxuXG4gIHJldHVybiBDbGllbnRFcnJvclxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGNvbnN0cnVjdG9yIGZvciBhIHNlcnZlciBlcnJvci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU2VydmVyRXJyb3JDb25zdHJ1Y3RvciAoSHR0cEVycm9yLCBuYW1lLCBjb2RlKSB7XG4gIHZhciBjbGFzc05hbWUgPSBuYW1lLm1hdGNoKC9FcnJvciQvKSA/IG5hbWUgOiBuYW1lICsgJ0Vycm9yJ1xuXG4gIGZ1bmN0aW9uIFNlcnZlckVycm9yIChtZXNzYWdlKSB7XG4gICAgLy8gY3JlYXRlIHRoZSBlcnJvciBvYmplY3RcbiAgICB2YXIgbXNnID0gbWVzc2FnZSAhPSBudWxsID8gbWVzc2FnZSA6IHN0YXR1c2VzW2NvZGVdXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcihtc2cpXG5cbiAgICAvLyBjYXB0dXJlIGEgc3RhY2sgdHJhY2UgdG8gdGhlIGNvbnN0cnVjdGlvbiBwb2ludFxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgU2VydmVyRXJyb3IpXG5cbiAgICAvLyBhZGp1c3QgdGhlIFtbUHJvdG90eXBlXV1cbiAgICBzZXRQcm90b3R5cGVPZihlcnIsIFNlcnZlckVycm9yLnByb3RvdHlwZSlcblxuICAgIC8vIHJlZGVmaW5lIHRoZSBlcnJvciBtZXNzYWdlXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ21lc3NhZ2UnLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IG1zZyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSlcblxuICAgIC8vIHJlZGVmaW5lIHRoZSBlcnJvciBuYW1lXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgJ25hbWUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBjbGFzc05hbWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pXG5cbiAgICByZXR1cm4gZXJyXG4gIH1cblxuICBpbmhlcml0cyhTZXJ2ZXJFcnJvciwgSHR0cEVycm9yKVxuXG4gIFNlcnZlckVycm9yLnByb3RvdHlwZS5zdGF0dXMgPSBjb2RlXG4gIFNlcnZlckVycm9yLnByb3RvdHlwZS5zdGF0dXNDb2RlID0gY29kZVxuICBTZXJ2ZXJFcnJvci5wcm90b3R5cGUuZXhwb3NlID0gZmFsc2VcblxuICByZXR1cm4gU2VydmVyRXJyb3Jcbn1cblxuLyoqXG4gKiBQb3B1bGF0ZSB0aGUgZXhwb3J0cyBvYmplY3Qgd2l0aCBjb25zdHJ1Y3RvcnMgZm9yIGV2ZXJ5IGVycm9yIGNsYXNzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwb3B1bGF0ZUNvbnN0cnVjdG9yRXhwb3J0cyAoZXhwb3J0cywgY29kZXMsIEh0dHBFcnJvcikge1xuICBjb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uIGZvckVhY2hDb2RlIChjb2RlKSB7XG4gICAgdmFyIENvZGVFcnJvclxuICAgIHZhciBuYW1lID0gdG9JZGVudGlmaWVyKHN0YXR1c2VzW2NvZGVdKVxuXG4gICAgc3dpdGNoIChjb2RlQ2xhc3MoY29kZSkpIHtcbiAgICAgIGNhc2UgNDAwOlxuICAgICAgICBDb2RlRXJyb3IgPSBjcmVhdGVDbGllbnRFcnJvckNvbnN0cnVjdG9yKEh0dHBFcnJvciwgbmFtZSwgY29kZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgNTAwOlxuICAgICAgICBDb2RlRXJyb3IgPSBjcmVhdGVTZXJ2ZXJFcnJvckNvbnN0cnVjdG9yKEh0dHBFcnJvciwgbmFtZSwgY29kZSlcbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBpZiAoQ29kZUVycm9yKSB7XG4gICAgICAvLyBleHBvcnQgdGhlIGNvbnN0cnVjdG9yXG4gICAgICBleHBvcnRzW2NvZGVdID0gQ29kZUVycm9yXG4gICAgICBleHBvcnRzW25hbWVdID0gQ29kZUVycm9yXG4gICAgfVxuICB9KVxuXG4gIC8vIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5XG4gIGV4cG9ydHNbXCJJJ21hdGVhcG90XCJdID0gZGVwcmVjYXRlLmZ1bmN0aW9uKGV4cG9ydHMuSW1BVGVhcG90LFxuICAgICdcIklcXCdtYXRlYXBvdFwiOyB1c2UgXCJJbUFUZWFwb3RcIiBpbnN0ZWFkJylcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIG9mIHdvcmRzIHRvIGEgSmF2YVNjcmlwdCBpZGVudGlmaWVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB0b0lkZW50aWZpZXIgKHN0cikge1xuICByZXR1cm4gc3RyLnNwbGl0KCcgJykubWFwKGZ1bmN0aW9uICh0b2tlbikge1xuICAgIHJldHVybiB0b2tlbi5zbGljZSgwLCAxKS50b1VwcGVyQ2FzZSgpICsgdG9rZW4uc2xpY2UoMSlcbiAgfSkuam9pbignJykucmVwbGFjZSgvW14gXzAtOWEtel0vZ2ksICcnKVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2h0dHAtZXJyb3JzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAzNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoe19fcHJvdG9fXzpbXX0gaW5zdGFuY2VvZiBBcnJheSA/IHNldFByb3RvT2YgOiBtaXhpblByb3BlcnRpZXMpO1xuXG5mdW5jdGlvbiBzZXRQcm90b09mKG9iaiwgcHJvdG8pIHtcblx0b2JqLl9fcHJvdG9fXyA9IHByb3RvO1xuXHRyZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBtaXhpblByb3BlcnRpZXMob2JqLCBwcm90bykge1xuXHRmb3IgKHZhciBwcm9wIGluIHByb3RvKSB7XG5cdFx0aWYgKCFvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcblx0XHRcdG9ialtwcm9wXSA9IHByb3RvW3Byb3BdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb2JqO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3NldHByb3RvdHlwZW9mL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAzNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIGJvZHktcGFyc2VyXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgY3JlYXRlRXJyb3IgPSByZXF1aXJlKCdodHRwLWVycm9ycycpXG52YXIgZ2V0Qm9keSA9IHJlcXVpcmUoJ3Jhdy1ib2R5JylcbnZhciBpY29udiA9IHJlcXVpcmUoJ2ljb252LWxpdGUnKVxudmFyIG9uRmluaXNoZWQgPSByZXF1aXJlKCdvbi1maW5pc2hlZCcpXG52YXIgemxpYiA9IHJlcXVpcmUoJ3psaWInKVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcmVhZFxuXG4vKipcbiAqIFJlYWQgYSByZXF1ZXN0IGludG8gYSBidWZmZXIgYW5kIHBhcnNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXFcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG5leHRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHBhcnNlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBkZWJ1Z1xuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcmVhZCAocmVxLCByZXMsIG5leHQsIHBhcnNlLCBkZWJ1Zywgb3B0aW9ucykge1xuICB2YXIgbGVuZ3RoXG4gIHZhciBvcHRzID0gb3B0aW9uc1xuICB2YXIgc3RyZWFtXG5cbiAgLy8gZmxhZyBhcyBwYXJzZWRcbiAgcmVxLl9ib2R5ID0gdHJ1ZVxuXG4gIC8vIHJlYWQgb3B0aW9uc1xuICB2YXIgZW5jb2RpbmcgPSBvcHRzLmVuY29kaW5nICE9PSBudWxsXG4gICAgPyBvcHRzLmVuY29kaW5nXG4gICAgOiBudWxsXG4gIHZhciB2ZXJpZnkgPSBvcHRzLnZlcmlmeVxuXG4gIHRyeSB7XG4gICAgLy8gZ2V0IHRoZSBjb250ZW50IHN0cmVhbVxuICAgIHN0cmVhbSA9IGNvbnRlbnRzdHJlYW0ocmVxLCBkZWJ1Zywgb3B0cy5pbmZsYXRlKVxuICAgIGxlbmd0aCA9IHN0cmVhbS5sZW5ndGhcbiAgICBzdHJlYW0ubGVuZ3RoID0gdW5kZWZpbmVkXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBuZXh0KGVycilcbiAgfVxuXG4gIC8vIHNldCByYXctYm9keSBvcHRpb25zXG4gIG9wdHMubGVuZ3RoID0gbGVuZ3RoXG4gIG9wdHMuZW5jb2RpbmcgPSB2ZXJpZnlcbiAgICA/IG51bGxcbiAgICA6IGVuY29kaW5nXG5cbiAgLy8gYXNzZXJ0IGNoYXJzZXQgaXMgc3VwcG9ydGVkXG4gIGlmIChvcHRzLmVuY29kaW5nID09PSBudWxsICYmIGVuY29kaW5nICE9PSBudWxsICYmICFpY29udi5lbmNvZGluZ0V4aXN0cyhlbmNvZGluZykpIHtcbiAgICByZXR1cm4gbmV4dChjcmVhdGVFcnJvcig0MTUsICd1bnN1cHBvcnRlZCBjaGFyc2V0IFwiJyArIGVuY29kaW5nLnRvVXBwZXJDYXNlKCkgKyAnXCInLCB7XG4gICAgICBjaGFyc2V0OiBlbmNvZGluZy50b0xvd2VyQ2FzZSgpLFxuICAgICAgdHlwZTogJ2NoYXJzZXQudW5zdXBwb3J0ZWQnXG4gICAgfSkpXG4gIH1cblxuICAvLyByZWFkIGJvZHlcbiAgZGVidWcoJ3JlYWQgYm9keScpXG4gIGdldEJvZHkoc3RyZWFtLCBvcHRzLCBmdW5jdGlvbiAoZXJyb3IsIGJvZHkpIHtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHZhciBfZXJyb3JcblxuICAgICAgaWYgKGVycm9yLnR5cGUgPT09ICdlbmNvZGluZy51bnN1cHBvcnRlZCcpIHtcbiAgICAgICAgLy8gZWNobyBiYWNrIGNoYXJzZXRcbiAgICAgICAgX2Vycm9yID0gY3JlYXRlRXJyb3IoNDE1LCAndW5zdXBwb3J0ZWQgY2hhcnNldCBcIicgKyBlbmNvZGluZy50b1VwcGVyQ2FzZSgpICsgJ1wiJywge1xuICAgICAgICAgIGNoYXJzZXQ6IGVuY29kaW5nLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgdHlwZTogJ2NoYXJzZXQudW5zdXBwb3J0ZWQnXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzZXQgc3RhdHVzIGNvZGUgb24gZXJyb3JcbiAgICAgICAgX2Vycm9yID0gY3JlYXRlRXJyb3IoNDAwLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgLy8gcmVhZCBvZmYgZW50aXJlIHJlcXVlc3RcbiAgICAgIHN0cmVhbS5yZXN1bWUoKVxuICAgICAgb25GaW5pc2hlZChyZXEsIGZ1bmN0aW9uIG9uZmluaXNoZWQgKCkge1xuICAgICAgICBuZXh0KGNyZWF0ZUVycm9yKDQwMCwgX2Vycm9yKSlcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyB2ZXJpZnlcbiAgICBpZiAodmVyaWZ5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBkZWJ1ZygndmVyaWZ5IGJvZHknKVxuICAgICAgICB2ZXJpZnkocmVxLCByZXMsIGJvZHksIGVuY29kaW5nKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIG5leHQoY3JlYXRlRXJyb3IoNDAzLCBlcnIsIHtcbiAgICAgICAgICBib2R5OiBib2R5LFxuICAgICAgICAgIHR5cGU6IGVyci50eXBlIHx8ICdlbnRpdHkudmVyaWZ5LmZhaWxlZCdcbiAgICAgICAgfSkpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHBhcnNlXG4gICAgdmFyIHN0ciA9IGJvZHlcbiAgICB0cnkge1xuICAgICAgZGVidWcoJ3BhcnNlIGJvZHknKVxuICAgICAgc3RyID0gdHlwZW9mIGJvZHkgIT09ICdzdHJpbmcnICYmIGVuY29kaW5nICE9PSBudWxsXG4gICAgICAgID8gaWNvbnYuZGVjb2RlKGJvZHksIGVuY29kaW5nKVxuICAgICAgICA6IGJvZHlcbiAgICAgIHJlcS5ib2R5ID0gcGFyc2Uoc3RyKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbmV4dChjcmVhdGVFcnJvcig0MDAsIGVyciwge1xuICAgICAgICBib2R5OiBzdHIsXG4gICAgICAgIHR5cGU6IGVyci50eXBlIHx8ICdlbnRpdHkucGFyc2UuZmFpbGVkJ1xuICAgICAgfSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBuZXh0KClcbiAgfSlcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNvbnRlbnQgc3RyZWFtIG9mIHRoZSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXFcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGRlYnVnXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmZsYXRlPXRydWVdXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb250ZW50c3RyZWFtIChyZXEsIGRlYnVnLCBpbmZsYXRlKSB7XG4gIHZhciBlbmNvZGluZyA9IChyZXEuaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddIHx8ICdpZGVudGl0eScpLnRvTG93ZXJDYXNlKClcbiAgdmFyIGxlbmd0aCA9IHJlcS5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddXG4gIHZhciBzdHJlYW1cblxuICBkZWJ1ZygnY29udGVudC1lbmNvZGluZyBcIiVzXCInLCBlbmNvZGluZylcblxuICBpZiAoaW5mbGF0ZSA9PT0gZmFsc2UgJiYgZW5jb2RpbmcgIT09ICdpZGVudGl0eScpIHtcbiAgICB0aHJvdyBjcmVhdGVFcnJvcig0MTUsICdjb250ZW50IGVuY29kaW5nIHVuc3VwcG9ydGVkJywge1xuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLFxuICAgICAgdHlwZTogJ2VuY29kaW5nLnVuc3VwcG9ydGVkJ1xuICAgIH0pXG4gIH1cblxuICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgY2FzZSAnZGVmbGF0ZSc6XG4gICAgICBzdHJlYW0gPSB6bGliLmNyZWF0ZUluZmxhdGUoKVxuICAgICAgZGVidWcoJ2luZmxhdGUgYm9keScpXG4gICAgICByZXEucGlwZShzdHJlYW0pXG4gICAgICBicmVha1xuICAgIGNhc2UgJ2d6aXAnOlxuICAgICAgc3RyZWFtID0gemxpYi5jcmVhdGVHdW56aXAoKVxuICAgICAgZGVidWcoJ2d1bnppcCBib2R5JylcbiAgICAgIHJlcS5waXBlKHN0cmVhbSlcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnaWRlbnRpdHknOlxuICAgICAgc3RyZWFtID0gcmVxXG4gICAgICBzdHJlYW0ubGVuZ3RoID0gbGVuZ3RoXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBjcmVhdGVFcnJvcig0MTUsICd1bnN1cHBvcnRlZCBjb250ZW50IGVuY29kaW5nIFwiJyArIGVuY29kaW5nICsgJ1wiJywge1xuICAgICAgICBlbmNvZGluZzogZW5jb2RpbmcsXG4gICAgICAgIHR5cGU6ICdlbmNvZGluZy51bnN1cHBvcnRlZCdcbiAgICAgIH0pXG4gIH1cblxuICByZXR1cm4gc3RyZWFtXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvYm9keS1wYXJzZXIvbGliL3JlYWQuanNcbi8vIG1vZHVsZSBpZCA9IDM2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogb24tZmluaXNoZWRcbiAqIENvcHlyaWdodChjKSAyMDEzIEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTQgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gb25GaW5pc2hlZFxubW9kdWxlLmV4cG9ydHMuaXNGaW5pc2hlZCA9IGlzRmluaXNoZWRcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZmlyc3QgPSByZXF1aXJlKCdlZS1maXJzdCcpXG5cbi8qKlxuICogVmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIGRlZmVyID0gdHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IHNldEltbWVkaWF0ZVxuICA6IGZ1bmN0aW9uKGZuKXsgcHJvY2Vzcy5uZXh0VGljayhmbi5iaW5kLmFwcGx5KGZuLCBhcmd1bWVudHMpKSB9XG5cbi8qKlxuICogSW52b2tlIGNhbGxiYWNrIHdoZW4gdGhlIHJlc3BvbnNlIGhhcyBmaW5pc2hlZCwgdXNlZnVsIGZvclxuICogY2xlYW5pbmcgdXAgcmVzb3VyY2VzIGFmdGVyd2FyZHMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG1zZ1xuICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXJcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBvbkZpbmlzaGVkKG1zZywgbGlzdGVuZXIpIHtcbiAgaWYgKGlzRmluaXNoZWQobXNnKSAhPT0gZmFsc2UpIHtcbiAgICBkZWZlcihsaXN0ZW5lciwgbnVsbCwgbXNnKVxuICAgIHJldHVybiBtc2dcbiAgfVxuXG4gIC8vIGF0dGFjaCB0aGUgbGlzdGVuZXIgdG8gdGhlIG1lc3NhZ2VcbiAgYXR0YWNoTGlzdGVuZXIobXNnLCBsaXN0ZW5lcilcblxuICByZXR1cm4gbXNnXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIG1lc3NhZ2UgaXMgYWxyZWFkeSBmaW5pc2hlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbXNnXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGlzRmluaXNoZWQobXNnKSB7XG4gIHZhciBzb2NrZXQgPSBtc2cuc29ja2V0XG5cbiAgaWYgKHR5cGVvZiBtc2cuZmluaXNoZWQgPT09ICdib29sZWFuJykge1xuICAgIC8vIE91dGdvaW5nTWVzc2FnZVxuICAgIHJldHVybiBCb29sZWFuKG1zZy5maW5pc2hlZCB8fCAoc29ja2V0ICYmICFzb2NrZXQud3JpdGFibGUpKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBtc2cuY29tcGxldGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEluY29taW5nTWVzc2FnZVxuICAgIHJldHVybiBCb29sZWFuKG1zZy51cGdyYWRlIHx8ICFzb2NrZXQgfHwgIXNvY2tldC5yZWFkYWJsZSB8fCAobXNnLmNvbXBsZXRlICYmICFtc2cucmVhZGFibGUpKVxuICB9XG5cbiAgLy8gZG9uJ3Qga25vd1xuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQXR0YWNoIGEgZmluaXNoZWQgbGlzdGVuZXIgdG8gdGhlIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG1zZ1xuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gYXR0YWNoRmluaXNoZWRMaXN0ZW5lcihtc2csIGNhbGxiYWNrKSB7XG4gIHZhciBlZU1zZ1xuICB2YXIgZWVTb2NrZXRcbiAgdmFyIGZpbmlzaGVkID0gZmFsc2VcblxuICBmdW5jdGlvbiBvbkZpbmlzaChlcnJvcikge1xuICAgIGVlTXNnLmNhbmNlbCgpXG4gICAgZWVTb2NrZXQuY2FuY2VsKClcblxuICAgIGZpbmlzaGVkID0gdHJ1ZVxuICAgIGNhbGxiYWNrKGVycm9yKVxuICB9XG5cbiAgLy8gZmluaXNoZWQgb24gZmlyc3QgbWVzc2FnZSBldmVudFxuICBlZU1zZyA9IGVlU29ja2V0ID0gZmlyc3QoW1ttc2csICdlbmQnLCAnZmluaXNoJ11dLCBvbkZpbmlzaClcblxuICBmdW5jdGlvbiBvblNvY2tldChzb2NrZXQpIHtcbiAgICAvLyByZW1vdmUgbGlzdGVuZXJcbiAgICBtc2cucmVtb3ZlTGlzdGVuZXIoJ3NvY2tldCcsIG9uU29ja2V0KVxuXG4gICAgaWYgKGZpbmlzaGVkKSByZXR1cm5cbiAgICBpZiAoZWVNc2cgIT09IGVlU29ja2V0KSByZXR1cm5cblxuICAgIC8vIGZpbmlzaGVkIG9uIGZpcnN0IHNvY2tldCBldmVudFxuICAgIGVlU29ja2V0ID0gZmlyc3QoW1tzb2NrZXQsICdlcnJvcicsICdjbG9zZSddXSwgb25GaW5pc2gpXG4gIH1cblxuICBpZiAobXNnLnNvY2tldCkge1xuICAgIC8vIHNvY2tldCBhbHJlYWR5IGFzc2lnbmVkXG4gICAgb25Tb2NrZXQobXNnLnNvY2tldClcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIHdhaXQgZm9yIHNvY2tldCB0byBiZSBhc3NpZ25lZFxuICBtc2cub24oJ3NvY2tldCcsIG9uU29ja2V0KVxuXG4gIGlmIChtc2cuc29ja2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBub2RlLmpzIDAuOCBwYXRjaFxuICAgIHBhdGNoQXNzaWduU29ja2V0KG1zZywgb25Tb2NrZXQpXG4gIH1cbn1cblxuLyoqXG4gKiBBdHRhY2ggdGhlIGxpc3RlbmVyIHRvIHRoZSBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBtc2dcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBhdHRhY2hMaXN0ZW5lcihtc2csIGxpc3RlbmVyKSB7XG4gIHZhciBhdHRhY2hlZCA9IG1zZy5fX29uRmluaXNoZWRcblxuICAvLyBjcmVhdGUgYSBwcml2YXRlIHNpbmdsZSBsaXN0ZW5lciB3aXRoIHF1ZXVlXG4gIGlmICghYXR0YWNoZWQgfHwgIWF0dGFjaGVkLnF1ZXVlKSB7XG4gICAgYXR0YWNoZWQgPSBtc2cuX19vbkZpbmlzaGVkID0gY3JlYXRlTGlzdGVuZXIobXNnKVxuICAgIGF0dGFjaEZpbmlzaGVkTGlzdGVuZXIobXNnLCBhdHRhY2hlZClcbiAgfVxuXG4gIGF0dGFjaGVkLnF1ZXVlLnB1c2gobGlzdGVuZXIpXG59XG5cbi8qKlxuICogQ3JlYXRlIGxpc3RlbmVyIG9uIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG1zZ1xuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyKG1zZykge1xuICBmdW5jdGlvbiBsaXN0ZW5lcihlcnIpIHtcbiAgICBpZiAobXNnLl9fb25GaW5pc2hlZCA9PT0gbGlzdGVuZXIpIG1zZy5fX29uRmluaXNoZWQgPSBudWxsXG4gICAgaWYgKCFsaXN0ZW5lci5xdWV1ZSkgcmV0dXJuXG5cbiAgICB2YXIgcXVldWUgPSBsaXN0ZW5lci5xdWV1ZVxuICAgIGxpc3RlbmVyLnF1ZXVlID0gbnVsbFxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgcXVldWVbaV0oZXJyLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgbGlzdGVuZXIucXVldWUgPSBbXVxuXG4gIHJldHVybiBsaXN0ZW5lclxufVxuXG4vKipcbiAqIFBhdGNoIFNlcnZlclJlc3BvbnNlLnByb3RvdHlwZS5hc3NpZ25Tb2NrZXQgZm9yIG5vZGUuanMgMC44LlxuICpcbiAqIEBwYXJhbSB7U2VydmVyUmVzcG9uc2V9IHJlc1xuICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGF0Y2hBc3NpZ25Tb2NrZXQocmVzLCBjYWxsYmFjaykge1xuICB2YXIgYXNzaWduU29ja2V0ID0gcmVzLmFzc2lnblNvY2tldFxuXG4gIGlmICh0eXBlb2YgYXNzaWduU29ja2V0ICE9PSAnZnVuY3Rpb24nKSByZXR1cm5cblxuICAvLyByZXMub24oJ3NvY2tldCcsIGNhbGxiYWNrKSBpcyBicm9rZW4gaW4gMC44XG4gIHJlcy5hc3NpZ25Tb2NrZXQgPSBmdW5jdGlvbiBfYXNzaWduU29ja2V0KHNvY2tldCkge1xuICAgIGFzc2lnblNvY2tldC5jYWxsKHRoaXMsIHNvY2tldClcbiAgICBjYWxsYmFjayhzb2NrZXQpXG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9vbi1maW5pc2hlZC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBlbmNvZGV1cmxcbiAqIENvcHlyaWdodChjKSAyMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVuY29kZVVybFxuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBub24tVVJMIGNvZGUgcG9pbnRzLCAqYWZ0ZXIqIGVuY29kaW5nIChpLmUuIG5vdCBpbmNsdWRpbmcgXCIlXCIpXG4gKiBhbmQgaW5jbHVkaW5nIGludmFsaWQgZXNjYXBlIHNlcXVlbmNlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIEVOQ09ERV9DSEFSU19SRUdFWFAgPSAvKD86W15cXHgyMVxceDI1XFx4MjYtXFx4M0JcXHgzRFxceDNGLVxceDVCXFx4NURcXHg1RlxceDYxLVxceDdBXFx4N0VdfCUoPzpbXjAtOUEtRmEtZl18WzAtOUEtRmEtZl1bXjAtOUEtRmEtZl18JCkpKy9nXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHVubWF0Y2hlZCBzdXJyb2dhdGUgcGFpci5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIFVOTUFUQ0hFRF9TVVJST0dBVEVfUEFJUl9SRUdFWFAgPSAvKF58W15cXHVEODAwLVxcdURCRkZdKVtcXHVEQzAwLVxcdURGRkZdfFtcXHVEODAwLVxcdURCRkZdKFteXFx1REMwMC1cXHVERkZGXXwkKS9nXG5cbi8qKlxuICogU3RyaW5nIHRvIHJlcGxhY2UgdW5tYXRjaGVkIHN1cnJvZ2F0ZSBwYWlyIHdpdGguXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBVTk1BVENIRURfU1VSUk9HQVRFX1BBSVJfUkVQTEFDRSA9ICckMVxcdUZGRkQkMidcblxuLyoqXG4gKiBFbmNvZGUgYSBVUkwgdG8gYSBwZXJjZW50LWVuY29kZWQgZm9ybSwgZXhjbHVkaW5nIGFscmVhZHktZW5jb2RlZCBzZXF1ZW5jZXMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgYW4gYWxyZWFkeS1lbmNvZGVkIFVSTCBhbmQgZW5jb2RlIGFsbCB0aGUgbm9uLVVSTFxuICogY29kZSBwb2ludHMuIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZW5jb2RlIHRoZSBcIiVcIiBjaGFyYWN0ZXIgdW5sZXNzIGl0IGlzXG4gKiBub3QgcGFydCBvZiBhIHZhbGlkIHNlcXVlbmNlIChgJTIwYCB3aWxsIGJlIGxlZnQgYXMtaXMsIGJ1dCBgJWZvb2Agd2lsbFxuICogYmUgZW5jb2RlZCBhcyBgJTI1Zm9vYCkuXG4gKlxuICogVGhpcyBlbmNvZGUgaXMgbWVhbnQgdG8gYmUgXCJzYWZlXCIgYW5kIGRvZXMgbm90IHRocm93IGVycm9ycy4gSXQgd2lsbCB0cnkgYXNcbiAqIGhhcmQgYXMgaXQgY2FuIHRvIHByb3Blcmx5IGVuY29kZSB0aGUgZ2l2ZW4gVVJMLCBpbmNsdWRpbmcgcmVwbGFjaW5nIGFueSByYXcsXG4gKiB1bnBhaXJlZCBzdXJyb2dhdGUgcGFpcnMgd2l0aCB0aGUgVW5pY29kZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgcHJpb3IgdG9cbiAqIGVuY29kaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmNvZGVVcmwgKHVybCkge1xuICByZXR1cm4gU3RyaW5nKHVybClcbiAgICAucmVwbGFjZShVTk1BVENIRURfU1VSUk9HQVRFX1BBSVJfUkVHRVhQLCBVTk1BVENIRURfU1VSUk9HQVRFX1BBSVJfUkVQTEFDRSlcbiAgICAucmVwbGFjZShFTkNPREVfQ0hBUlNfUkVHRVhQLCBlbmNvZGVVUkkpXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvZW5jb2RldXJsL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAzOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIGVzY2FwZS1odG1sXG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBBbmRyZWFzIEx1YmJlXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBUaWFuY2hlbmcgXCJUaW1vdGh5XCIgR3VcbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgbWF0Y2hIdG1sUmVnRXhwID0gL1tcIicmPD5dLztcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVzY2FwZUh0bWw7XG5cbi8qKlxuICogRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIG9mIGh0bWwuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBlc2NhcGUgZm9yIGluc2VydGluZyBpbnRvIEhUTUxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHN0cmluZykge1xuICB2YXIgc3RyID0gJycgKyBzdHJpbmc7XG4gIHZhciBtYXRjaCA9IG1hdGNoSHRtbFJlZ0V4cC5leGVjKHN0cik7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICB2YXIgZXNjYXBlO1xuICB2YXIgaHRtbCA9ICcnO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGFzdEluZGV4ID0gMDtcblxuICBmb3IgKGluZGV4ID0gbWF0Y2guaW5kZXg7IGluZGV4IDwgc3RyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaW5kZXgpKSB7XG4gICAgICBjYXNlIDM0OiAvLyBcIlxuICAgICAgICBlc2NhcGUgPSAnJnF1b3Q7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM4OiAvLyAmXG4gICAgICAgIGVzY2FwZSA9ICcmYW1wOyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOTogLy8gJ1xuICAgICAgICBlc2NhcGUgPSAnJiMzOTsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjA6IC8vIDxcbiAgICAgICAgZXNjYXBlID0gJyZsdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6IC8vID5cbiAgICAgICAgZXNjYXBlID0gJyZndDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChsYXN0SW5kZXggIT09IGluZGV4KSB7XG4gICAgICBodG1sICs9IHN0ci5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleCk7XG4gICAgfVxuXG4gICAgbGFzdEluZGV4ID0gaW5kZXggKyAxO1xuICAgIGh0bWwgKz0gZXNjYXBlO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RJbmRleCAhPT0gaW5kZXhcbiAgICA/IGh0bWwgKyBzdHIuc3Vic3RyaW5nKGxhc3RJbmRleCwgaW5kZXgpXG4gICAgOiBodG1sO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2VzY2FwZS1odG1sL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAzOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1cmxcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJ1cmxcIlxuLy8gbW9kdWxlIGlkID0gNDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogRXhwb3NlIGBhcnJheUZsYXR0ZW5gLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGFycmF5RmxhdHRlblxuXG4vKipcbiAqIFJlY3Vyc2l2ZSBmbGF0dGVuIGZ1bmN0aW9uIHdpdGggZGVwdGguXG4gKlxuICogQHBhcmFtICB7QXJyYXl9ICBhcnJheVxuICogQHBhcmFtICB7QXJyYXl9ICByZXN1bHRcbiAqIEBwYXJhbSAge051bWJlcn0gZGVwdGhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBmbGF0dGVuV2l0aERlcHRoIChhcnJheSwgcmVzdWx0LCBkZXB0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaV1cblxuICAgIGlmIChkZXB0aCA+IDAgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZsYXR0ZW5XaXRoRGVwdGgodmFsdWUsIHJlc3VsdCwgZGVwdGggLSAxKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogUmVjdXJzaXZlIGZsYXR0ZW4gZnVuY3Rpb24uIE9taXR0aW5nIGRlcHRoIGlzIHNsaWdodGx5IGZhc3Rlci5cbiAqXG4gKiBAcGFyYW0gIHtBcnJheX0gYXJyYXlcbiAqIEBwYXJhbSAge0FycmF5fSByZXN1bHRcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBmbGF0dGVuRm9yZXZlciAoYXJyYXksIHJlc3VsdCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaV1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZmxhdHRlbkZvcmV2ZXIodmFsdWUsIHJlc3VsdClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2godmFsdWUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIEZsYXR0ZW4gYW4gYXJyYXksIHdpdGggdGhlIGFiaWxpdHkgdG8gZGVmaW5lIGEgZGVwdGguXG4gKlxuICogQHBhcmFtICB7QXJyYXl9ICBhcnJheVxuICogQHBhcmFtICB7TnVtYmVyfSBkZXB0aFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIGFycmF5RmxhdHRlbiAoYXJyYXksIGRlcHRoKSB7XG4gIGlmIChkZXB0aCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGZsYXR0ZW5Gb3JldmVyKGFycmF5LCBbXSlcbiAgfVxuXG4gIHJldHVybiBmbGF0dGVuV2l0aERlcHRoKGFycmF5LCBbXSwgZGVwdGgpXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvYXJyYXktZmxhdHRlbi9hcnJheS1mbGF0dGVuLmpzXG4vLyBtb2R1bGUgaWQgPSA0MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKipcbiAqIE1lcmdlIG9iamVjdCBiIHdpdGggb2JqZWN0IGEuXG4gKlxuICogICAgIHZhciBhID0geyBmb286ICdiYXInIH1cbiAqICAgICAgICwgYiA9IHsgYmFyOiAnYmF6JyB9O1xuICpcbiAqICAgICBtZXJnZShhLCBiKTtcbiAqICAgICAvLyA9PiB7IGZvbzogJ2JhcicsIGJhcjogJ2JheicgfVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhXG4gKiBAcGFyYW0ge09iamVjdH0gYlxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihhLCBiKXtcbiAgaWYgKGEgJiYgYikge1xuICAgIGZvciAodmFyIGtleSBpbiBiKSB7XG4gICAgICBhW2tleV0gPSBiW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBhO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy91dGlscy1tZXJnZS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiY3J5cHRvXCJcbi8vIG1vZHVsZSBpZCA9IDQzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZmFpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDQ0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qc1xuLy8gbW9kdWxlIGlkID0gNDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRKc29uRGF0YShmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxPYmplY3Q+IHtcbiAgdmFyIGRhdGEgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBmcy5yZWFkRmlsZShmaWxlbmFtZSwgJ3V0ZjgnLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICByZWplY3QoJ0NhbmB0IHJlYWQgZmlsZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgfSBjYXRjaChlKSB7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1dyb25nIGZpbGUgZm9ybWF0Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVKc29uRGF0YShmaWxlbmFtZTogc3RyaW5nLCBkYXRhOiBPYmplY3QpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBmcy53cml0ZUZpbGUoZmlsZW5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpLCAndXRmOCcsIChlcnIpID0+IHtcbiAgICAgIGlmKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHJlamVjdCgnQ2F0YHQgd3JpdGUgZmlsZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KVxufVxuXG5mdW5jdGlvbiBnZXRKc29uRGF0YVN5bmMoZmlsZW5hbWU6IHN0cmluZykge1xuICBsZXQgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgJ3V0ZjgnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgfSBjYXRjaChlKSB7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1dyb25nIGZpbGUgZm9ybWF0Jyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JpdGVKc29uRGF0YVN5bmMoZmlsZW5hbWU6IHN0cmluZywgZGF0YTogT2JqZWN0KSB7XG4gIGZzLndyaXRlRmlsZVN5bmMoZmlsZW5hbWUsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbn1cblxuZXhwb3J0IHtcbiAgZ2V0SnNvbkRhdGEsXG4gIHdyaXRlSnNvbkRhdGEsXG4gIGdldEpzb25EYXRhU3luYyxcbiAgd3JpdGVKc29uRGF0YVN5bmNcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZpY2VzL2pzb24udHMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJldmVudHNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJldmVudHNcIlxuLy8gbW9kdWxlIGlkID0gNDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidXRpbFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInV0aWxcIlxuLy8gbW9kdWxlIGlkID0gNDhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBbW1wiMFwiLFwiXFx1MDAwMFwiLDEyNyxcIuKCrFwiXSxbXCI4MTQwXCIsXCLkuILkuITkuIXkuIbkuI/kuJLkuJfkuJ/kuKDkuKHkuKPkuKbkuKnkuK7kuK/kuLHkuLPkuLXkuLfkuLzkuYDkuYHkuYLkuYTkuYbkuYrkuZHkuZXkuZfkuZrkuZvkuaLkuaPkuaTkuaXkuafkuajkuapcIiw1LFwi5Lmy5Lm0XCIsOSxcIuS5v1wiLDYsXCLkuofkuopcIl0sW1wiODE4MFwiLFwi5LqQ5LqW5LqX5LqZ5Lqc5Lqd5Lqe5Lqj5Lqq5Lqv5Lqw5Lqx5Lq05Lq25Lq35Lq45Lq55Lq85Lq95Lq+5LuI5LuM5LuP5LuQ5LuS5Lua5Lub5Luc5Lug5Lui5Lum5Lun5Lup5Lut5Luu5Luv5Lux5Lu05Lu45Lu55Lu65Lu85Lu+5LyA5LyCXCIsNixcIuS8i+S8jOS8klwiLDQsXCLkvJzkvJ3kvKHkvKPkvKjkvKnkvKzkvK3kvK7kvLHkvLPkvLXkvLfkvLnkvLvkvL5cIiw0LFwi5L2E5L2F5L2HXCIsNSxcIuS9kuS9lOS9luS9oeS9ouS9puS9qOS9quS9q+S9reS9ruS9seS9suS9teS9t+S9uOS9ueS9uuS9veS+gOS+geS+guS+heS+huS+h+S+iuS+jOS+juS+kOS+kuS+k+S+leS+luS+mOS+meS+muS+nOS+nuS+n+S+oeS+olwiXSxbXCI4MjQwXCIsXCLkvqTkvqvkvq3kvrBcIiw0LFwi5L62XCIsOCxcIuS/gOS/geS/guS/huS/h+S/iOS/ieS/i+S/jOS/jeS/klwiLDQsXCLkv5nkv5vkv6Dkv6Lkv6Tkv6Xkv6fkv6vkv6zkv7Dkv7Lkv7Tkv7Xkv7bkv7fkv7nkv7vkv7zkv73kv79cIiwxMV0sW1wiODI4MFwiLFwi5YCL5YCO5YCQ5YCR5YCT5YCV5YCW5YCX5YCb5YCd5YCe5YCg5YCi5YCj5YCk5YCn5YCr5YCvXCIsMTAsXCLlgLvlgL3lgL/lgYDlgYHlgYLlgYTlgYXlgYblgYnlgYrlgYvlgY3lgZBcIiw0LFwi5YGW5YGX5YGY5YGZ5YGb5YGdXCIsNyxcIuWBplwiLDUsXCLlga1cIiw4LFwi5YG45YG55YG65YG85YG95YKB5YKC5YKD5YKE5YKG5YKH5YKJ5YKK5YKL5YKM5YKOXCIsMjAsXCLlgqTlgqblgqrlgqvlgq1cIiw0LFwi5YKzXCIsNixcIuWCvFwiXSxbXCI4MzQwXCIsXCLlgr1cIiwxNyxcIuWDkFwiLDUsXCLlg5flg5jlg5nlg5tcIiwxMCxcIuWDqOWDqeWDquWDq+WDr+WDsOWDseWDsuWDtOWDtlwiLDQsXCLlg7xcIiw5LFwi5YSIXCJdLFtcIjgzODBcIixcIuWEieWEiuWEjFwiLDUsXCLlhJNcIiwxMyxcIuWEolwiLDI4LFwi5YWC5YWH5YWK5YWM5YWO5YWP5YWQ5YWS5YWT5YWX5YWY5YWZ5YWb5YWdXCIsNCxcIuWFo+WFpOWFpuWFp+WFqeWFquWFr+WFsuWFuuWFvuWFv+WGg+WGhOWGhuWGh+WGiuWGi+WGjuWGj+WGkOWGkeWGk+WGlOWGmOWGmuWGneWGnuWGn+WGoeWGo+WGplwiLDQsXCLlhq3lhq7lhrTlhrjlhrnlhrrlhr7lhr/lh4Hlh4Llh4Plh4Xlh4jlh4rlh43lh47lh5Dlh5JcIiw1XSxbXCI4NDQwXCIsXCLlh5jlh5nlh5rlh5zlh57lh5/lh6Llh6Plh6VcIiw1LFwi5Yes5Yeu5Yex5Yey5Ye05Ye35Ye+5YiE5YiF5YiJ5YiL5YiM5YiP5YiQ5YiT5YiU5YiV5Yic5Yie5Yif5Yih5Yii5Yij5Yil5Yim5Yin5Yiq5Yis5Yiv5Yix5Yiy5Yi05Yi15Yi85Yi+5YmEXCIsNSxcIuWJi+WJjuWJj+WJkuWJk+WJleWJl+WJmFwiXSxbXCI4NDgwXCIsXCLliZnliZrliZvliZ3liZ/liaDliaLliaPliaTliabliajliavliazlia3lia7libDlibHlibNcIiw5LFwi5Ym+5YqA5YqDXCIsNCxcIuWKiVwiLDYsXCLlipHlipLlipRcIiw2LFwi5Yqc5Yqk5Yql5Yqm5Yqn5Yqu5Yqv5Yqw5Yq0XCIsOSxcIuWLgOWLgeWLguWLhOWLheWLhuWLiOWLiuWLjOWLjeWLjuWLj+WLkeWLk+WLlOWLleWLl+WLmVwiLDUsXCLli6Dli6Hli6Lli6Pli6VcIiwxMCxcIuWLsVwiLDcsXCLli7vli7zli73ljIHljILljIPljITljIfljInljIrljIvljIzljI5cIl0sW1wiODU0MFwiLFwi5YyR5YyS5YyT5YyU5YyY5Yyb5Yyc5Yye5Yyf5Yyi5Yyk5Yyl5Yyn5Yyo5Yyp5Yyr5Yys5Yyt5YyvXCIsOSxcIuWMvOWMveWNgOWNguWNhOWNhuWNi+WNjOWNjeWNkOWNlOWNmOWNmeWNm+WNneWNpeWNqOWNquWNrOWNreWNsuWNtuWNueWNu+WNvOWNveWNvuWOgOWOgeWOg+WOh+WOiOWOiuWOjuWOj1wiXSxbXCI4NTgwXCIsXCLljpBcIiw0LFwi5Y6W5Y6X5Y6Z5Y6b5Y6c5Y6e5Y6g5Y6h5Y6k5Y6n5Y6q5Y6r5Y6s5Y6t5Y6vXCIsNixcIuWOt+WOuOWOueWOuuWOvOWOveWOvuWPgOWPg1wiLDQsXCLlj47lj4/lj5Dlj5Llj5Plj5Xlj5rlj5zlj53lj57lj6Hlj6Llj6flj7Tlj7rlj77lj7/lkIDlkILlkIXlkIflkIvlkJTlkJjlkJnlkJrlkJzlkKLlkKTlkKXlkKrlkLDlkLPlkLblkLflkLrlkL3lkL/lkYHlkYLlkYTlkYXlkYflkYnlkYzlkY3lkY7lkY/lkZHlkZrlkZ1cIiw0LFwi5ZGj5ZGl5ZGn5ZGpXCIsNyxcIuWRtOWRueWRuuWRvuWRv+WSgeWSg+WSheWSh+WSiOWSieWSiuWSjeWSkeWSk+WSl+WSmOWSnOWSnuWSn+WSoOWSoVwiXSxbXCI4NjQwXCIsXCLlkqLlkqXlkq7lkrDlkrLlkrXlkrblkrflkrnlkrrlkrzlkr7lk4Plk4Xlk4rlk4vlk5blk5jlk5vlk6BcIiw0LFwi5ZOr5ZOs5ZOv5ZOw5ZOx5ZO0XCIsNSxcIuWTu+WTvuWUgOWUguWUg+WUhOWUheWUiOWUilwiLDQsXCLllJLllJPllJVcIiw1LFwi5ZSc5ZSd5ZSe5ZSf5ZSh5ZSl5ZSmXCJdLFtcIjg2ODBcIixcIuWUqOWUqeWUq+WUreWUsuWUtOWUteWUtuWUuOWUueWUuuWUu+WUveWVgOWVguWVheWVh+WViOWVi1wiLDQsXCLllZHllZLllZPllZTllZdcIiw0LFwi5ZWd5ZWe5ZWf5ZWg5ZWi5ZWj5ZWo5ZWp5ZWr5ZWvXCIsNSxcIuWVueWVuuWVveWVv+WWheWWhuWWjOWWjeWWjuWWkOWWkuWWk+WWleWWluWWl+WWmuWWm+WWnuWWoFwiLDYsXCLllqhcIiw4LFwi5Zay5Za05Za25Za45Za65Za85Za/XCIsNCxcIuWXhuWXh+WXiOWXiuWXi+WXjuWXj+WXkOWXleWXl1wiLDQsXCLll57ll6Dll6Lll6fll6nll63ll67ll7Dll7Hll7Tll7bll7hcIiw0LFwi5Ze/5ZiC5ZiD5ZiE5ZiFXCJdLFtcIjg3NDBcIixcIuWYhuWYh+WYiuWYi+WYjeWYkFwiLDcsXCLlmJnlmJrlmJzlmJ3lmKDlmKHlmKLlmKXlmKblmKjlmKnlmKrlmKvlmK7lmK/lmLDlmLPlmLXlmLflmLjlmLrlmLzlmL3lmL7lmYBcIiwxMSxcIuWZj1wiLDQsXCLlmZXlmZblmZrlmZvlmZ1cIiw0XSxbXCI4NzgwXCIsXCLlmaPlmaXlmablmaflma3lma7lma/lmbDlmbLlmbPlmbTlmbXlmbflmbjlmbnlmbrlmb1cIiw3LFwi5ZqHXCIsNixcIuWakOWakeWakuWalFwiLDE0LFwi5ZqkXCIsMTAsXCLlmrBcIiw2LFwi5Zq45Zq55Zq65Zq75Zq9XCIsMTIsXCLlm4tcIiw4LFwi5ZuV5ZuW5ZuY5ZuZ5Zuc5Zuj5ZulXCIsNSxcIuWbrOWbruWbr+WbsuWbs+WbtuWbt+WbuOWbu+WbvOWcgOWcgeWcguWcheWch+Wci1wiLDZdLFtcIjg4NDBcIixcIuWcklwiLDksXCLlnJ3lnJ7lnKDlnKHlnKLlnKTlnKXlnKblnKflnKvlnLHlnLLlnLRcIiw0LFwi5Zy85Zy95Zy/5Z2B5Z2D5Z2E5Z2F5Z2G5Z2I5Z2J5Z2L5Z2SXCIsNCxcIuWdmOWdmeWdouWdo+WdpeWdp+WdrOWdruWdsOWdseWdsuWdtOWdteWduOWdueWduuWdveWdvuWdv+WegFwiXSxbXCI4ODgwXCIsXCLlnoHlnoflnojlnonlnorlno1cIiw0LFwi5Z6UXCIsNixcIuWenOWeneWenuWen+WepeWeqOWequWerOWer+WesOWeseWes+WeteWetuWet+WeuVwiLDgsXCLln4RcIiw2LFwi5Z+M5Z+N5Z+Q5Z+R5Z+T5Z+W5Z+X5Z+b5Z+c5Z+e5Z+h5Z+i5Z+j5Z+lXCIsNyxcIuWfruWfsOWfseWfsuWfs+WfteWftuWft+Wfu+WfvOWfvuWfv+WggeWgg+WghOWgheWgiOWgieWgiuWgjOWgjuWgj+WgkOWgkuWgk+WglOWgluWgl+WgmOWgmuWgm+WgnOWgneWgn+WgouWgo+WgpVwiLDQsXCLloKtcIiw0LFwi5aCx5aCy5aCz5aC05aC2XCIsN10sW1wiODk0MFwiLFwi5aC+XCIsNSxcIuWhhVwiLDYsXCLloY7loY/loZDloZLloZPloZXloZbloZfloZlcIiw0LFwi5aGfXCIsNSxcIuWhplwiLDQsXCLloa1cIiwxNixcIuWhv+WiguWihOWihuWih+WiiOWiiuWii+WijFwiXSxbXCI4OTgwXCIsXCLloo1cIiw0LFwi5aKUXCIsNCxcIuWim+WinOWineWioFwiLDcsXCLloqpcIiwxNyxcIuWiveWivuWiv+WjgOWjguWjg+WjhOWjhlwiLDEwLFwi5aOS5aOT5aOU5aOWXCIsMTMsXCLlo6VcIiw1LFwi5aOt5aOv5aOx5aOy5aO05aO15aO35aO45aO6XCIsNyxcIuWkg+WkheWkhuWkiFwiLDQsXCLlpI7lpJDlpJHlpJLlpJPlpJflpJjlpJvlpJ3lpJ7lpKDlpKHlpKLlpKPlpKblpKjlpKzlpLDlpLLlpLPlpLXlpLblpLtcIl0sW1wiOGE0MFwiLFwi5aS95aS+5aS/5aWA5aWD5aWF5aWG5aWK5aWM5aWN5aWQ5aWS5aWT5aWZ5aWbXCIsNCxcIuWloeWlo+WlpOWlplwiLDEyLFwi5aW15aW35aW65aW75aW85aW+5aW/5aaA5aaF5aaJ5aaL5aaM5aaO5aaP5aaQ5aaR5aaU5aaV5aaY5aaa5aab5aac5aad5aaf5aag5aah5aai5aamXCJdLFtcIjhhODBcIixcIuWmp+WmrOWmreWmsOWmseWms1wiLDUsXCLlprrlprzlpr3lpr9cIiw2LFwi5aeH5aeI5aeJ5aeM5aeN5aeO5aeP5aeV5aeW5aeZ5aeb5aeeXCIsNCxcIuWnpOWnpuWnp+WnqeWnquWnq+WnrVwiLDExLFwi5ae65ae85ae95ae+5aiA5aiC5aiK5aiL5aiN5aiO5aiP5aiQ5aiS5aiU5aiV5aiW5aiX5aiZ5aia5aib5aid5aie5aih5aii5aik5aim5ain5aio5aiqXCIsNixcIuWos+WoteWot1wiLDQsXCLlqL3lqL7lqL/lqYFcIiw0LFwi5amH5amI5amLXCIsOSxcIuWpluWpl+WpmOWpmeWpm1wiLDVdLFtcIjhiNDBcIixcIuWpoeWpo+WppOWppeWppuWpqOWpqeWpq1wiLDgsXCLlqbjlqbnlqbvlqbzlqb3lqb7lqoBcIiwxNyxcIuWqk1wiLDYsXCLlqpxcIiwxMyxcIuWqq+WqrFwiXSxbXCI4YjgwXCIsXCLlqq1cIiw0LFwi5aq05aq25aq35aq5XCIsNCxcIuWqv+WrgOWrg1wiLDUsXCLlq4rlq4vlq41cIiw0LFwi5auT5auV5auX5auZ5aua5aub5aud5aue5auf5aui5auk5aul5aun5auo5auq5ausXCIsNCxcIuWrslwiLDIyLFwi5ayKXCIsMTEsXCLlrJhcIiwyNSxcIuWss+WsteWstuWsuFwiLDcsXCLlrYFcIiw2XSxbXCI4YzQwXCIsXCLlrYhcIiw3LFwi5a2S5a2W5a2e5a2g5a2h5a2n5a2o5a2r5a2t5a2u5a2v5a2y5a205a225a235a245a255a275a285a2+5a2/5a6C5a6G5a6K5a6N5a6O5a6Q5a6R5a6S5a6U5a6W5a6f5a6n5a6o5a6p5a6s5a6t5a6u5a6v5a6x5a6y5a635a665a675a685a+A5a+B5a+D5a+I5a+J5a+K5a+L5a+N5a+O5a+PXCJdLFtcIjhjODBcIixcIuWvkeWvlFwiLDgsXCLlr6Dlr6Llr6Plr6blr6flr6lcIiw0LFwi5a+v5a+xXCIsNixcIuWvveWvvuWwgOWwguWwg+WwheWwh+WwiOWwi+WwjOWwjeWwjuWwkOWwkuWwk+Wwl+WwmeWwm+WwnuWwn+WwoOWwoeWwo+WwpuWwqOWwqeWwquWwq+WwreWwruWwr+WwsOWwsuWws+WwteWwtuWwt+Wxg+WxhOWxhuWxh+WxjOWxjeWxkuWxk+WxlOWxluWxl+WxmOWxmuWxm+WxnOWxneWxn+WxouWxpOWxp1wiLDYsXCLlsbDlsbJcIiw2LFwi5bG75bG85bG95bG+5bKA5bKDXCIsNCxcIuWyieWyiuWyi+WyjuWyj+WykuWyk+WyleWynVwiLDQsXCLlsqRcIiw0XSxbXCI4ZDQwXCIsXCLlsqrlsq7lsq/lsrDlsrLlsrTlsrblsrnlsrrlsrvlsrzlsr7ls4Dls4Lls4Pls4VcIiw1LFwi5bOMXCIsNSxcIuWzk1wiLDUsXCLls5pcIiw2LFwi5bOi5bOj5bOn5bOp5bOr5bOs5bOu5bOv5bOxXCIsOSxcIuWzvFwiLDRdLFtcIjhkODBcIixcIuW0geW0hOW0heW0iFwiLDUsXCLltI9cIiw0LFwi5bSV5bSX5bSY5bSZ5bSa5bSc5bSd5bSfXCIsNCxcIuW0peW0qOW0quW0q+W0rOW0r1wiLDQsXCLltLVcIiw3LFwi5bS/XCIsNyxcIuW1iOW1ieW1jVwiLDEwLFwi5bWZ5bWa5bWc5bWeXCIsMTAsXCLltarlta3lta7ltbDltbHltbLltbPltbVcIiwxMixcIuW2g1wiLDIxLFwi5baa5bab5bac5bae5baf5bagXCJdLFtcIjhlNDBcIixcIuW2oVwiLDIxLFwi5ba4XCIsMTIsXCLlt4ZcIiw2LFwi5beOXCIsMTIsXCLlt5zlt5/lt6Dlt6Plt6Tlt6rlt6zlt61cIl0sW1wiOGU4MFwiLFwi5bew5be15be25be4XCIsNCxcIuW3v+W4gOW4hOW4h+W4ieW4iuW4i+W4jeW4juW4kuW4k+W4l+W4nlwiLDcsXCLluKhcIiw0LFwi5biv5biw5biyXCIsNCxcIuW4ueW4uuW4vuW4v+W5gOW5geW5g+W5hlwiLDUsXCLluY1cIiw2LFwi5bmWXCIsNCxcIuW5nOW5neW5n+W5oOW5o1wiLDE0LFwi5bm15bm35bm55bm+5bqB5bqC5bqD5bqF5bqI5bqJ5bqM5bqN5bqO5bqS5bqY5bqb5bqd5bqh5bqi5bqj5bqk5bqoXCIsNCxcIuW6rlwiLDQsXCLlurTlurrlurvlurzlur3lur9cIiw2XSxbXCI4ZjQwXCIsXCLlu4blu4flu4jlu4tcIiw1LFwi5buU5buV5buX5buY5buZ5bua5bucXCIsMTEsXCLlu6nlu6tcIiw4LFwi5bu15bu45bu55bu75bu85bu95byF5byG5byH5byJ5byM5byN5byO5byQ5byS5byU5byW5byZ5bya5byc5byd5bye5byh5byi5byj5bykXCJdLFtcIjhmODBcIixcIuW8qOW8q+W8rOW8ruW8sOW8slwiLDYsXCLlvLvlvL3lvL7lvL/lvYFcIiwxNCxcIuW9keW9lOW9meW9muW9m+W9nOW9nuW9n+W9oOW9o+W9peW9p+W9qOW9q+W9ruW9r+W9suW9tOW9teW9tuW9uOW9uuW9veW9vuW9v+W+g+W+huW+jeW+juW+j+W+keW+k+W+lOW+luW+muW+m+W+neW+nuW+n+W+oOW+olwiLDUsXCLlvqnlvqvlvqzlvq9cIiw1LFwi5b625b645b655b665b675b6+XCIsNCxcIuW/h+W/iOW/iuW/i+W/juW/k+W/lOW/leW/muW/m+W/nOW/nuW/n+W/ouW/o+W/peW/puW/qOW/qeW/rOW/r+W/sOW/suW/s+W/tOW/tuW/t+W/ueW/uuW/vOaAh1wiXSxbXCI5MDQwXCIsXCLmgIjmgInmgIvmgIzmgJDmgJHmgJPmgJfmgJjmgJrmgJ7mgJ/mgKLmgKPmgKTmgKzmgK3mgK7mgLBcIiw0LFwi5oC2XCIsNCxcIuaAveaAvuaBgOaBhFwiLDYsXCLmgYzmgY7mgY/mgZHmgZPmgZTmgZbmgZfmgZjmgZvmgZzmgZ7mgZ/mgaDmgaHmgaXmgabmga7mgbHmgbLmgbTmgbXmgbfmgb7mgoBcIl0sW1wiOTA4MFwiLFwi5oKB5oKC5oKF5oKG5oKH5oKI5oKK5oKL5oKO5oKP5oKQ5oKR5oKT5oKV5oKX5oKY5oKZ5oKc5oKe5oKh5oKi5oKk5oKl5oKn5oKp5oKq5oKu5oKw5oKz5oK15oK25oK35oK55oK65oK9XCIsNyxcIuaDh+aDiOaDieaDjFwiLDQsXCLmg5Lmg5Pmg5Tmg5bmg5fmg5nmg5vmg57mg6FcIiw0LFwi5oOq5oOx5oOy5oO15oO35oO45oO7XCIsNCxcIuaEguaEg+aEhOaEheaEh+aEiuaEi+aEjOaEkFwiLDQsXCLmhJbmhJfmhJjmhJnmhJvmhJzmhJ3mhJ7mhKHmhKLmhKXmhKjmhKnmhKrmhKxcIiwxOCxcIuaFgFwiLDZdLFtcIjkxNDBcIixcIuaFh+aFieaFi+aFjeaFj+aFkOaFkuaFk+aFlOaFllwiLDYsXCLmhZ7mhZ/mhaDmhaHmhaPmhaTmhaXmhabmhalcIiw2LFwi5oWx5oWy5oWz5oW05oW25oW4XCIsMTgsXCLmhozmho3mho9cIiw0LFwi5oaVXCJdLFtcIjkxODBcIixcIuaGllwiLDYsXCLmhp5cIiw4LFwi5oaq5oar5oatXCIsOSxcIuaGuFwiLDUsXCLmhr/mh4Dmh4Hmh4NcIiw0LFwi5oeJ5oeMXCIsNCxcIuaHk+aHlVwiLDE2LFwi5oenXCIsMTMsXCLmh7ZcIiw4LFwi5oiAXCIsNSxcIuaIh+aIieaIk+aIlOaImeaInOaIneaInuaIoOaIo+aIpuaIp+aIqOaIqeaIq+aIreaIr+aIsOaIseaIsuaIteaItuaIuFwiLDQsXCLmiYLmiYTmiYXmiYbmiYpcIl0sW1wiOTI0MFwiLFwi5omP5omQ5omV5omW5omX5omZ5oma5omcXCIsNixcIuaJpOaJpeaJqOaJseaJsuaJtOaJteaJt+aJuOaJuuaJu+aJveaKgeaKguaKg+aKheaKhuaKh+aKiOaKi1wiLDUsXCLmipTmipnmipzmip3mip7miqPmiqbmiqfmiqnmiqrmiq3miq7miq/mirDmirLmirPmirTmirbmirfmirjmirrmir7mi4Dmi4FcIl0sW1wiOTI4MFwiLFwi5ouD5ouL5ouP5ouR5ouV5oud5oue5oug5ouh5ouk5ouq5our5ouw5ouy5ou15ou45ou55ou65ou75oyA5oyD5oyE5oyF5oyG5oyK5oyL5oyM5oyN5oyP5oyQ5oyS5oyT5oyU5oyV5oyX5oyY5oyZ5oyc5oym5oyn5oyp5oys5oyt5oyu5oyw5oyx5oyzXCIsNSxcIuaMu+aMvOaMvuaMv+aNgOaNgeaNhOaNh+aNiOaNiuaNkeaNkuaNk+aNlOaNllwiLDcsXCLmjaDmjaTmjaXmjabmjajmjarmjavmjazmja/mjbDmjbLmjbPmjbTmjbXmjbjmjbnmjbzmjb3mjb7mjb/mjoHmjoPmjoTmjoXmjobmjovmjo3mjpHmjpPmjpTmjpXmjpfmjplcIiw2LFwi5o6h5o6k5o6m5o6r5o6v5o6x5o6y5o615o625o655o675o695o6/5o+AXCJdLFtcIjkzNDBcIixcIuaPgeaPguaPg+aPheaPh+aPiOaPiuaPi+aPjOaPkeaPk+aPlOaPleaPl1wiLDYsXCLmj5/mj6Lmj6RcIiw0LFwi5o+r5o+s5o+u5o+v5o+w5o+x5o+z5o+15o+35o+55o+65o+75o+85o++5pCD5pCE5pCGXCIsNCxcIuaQjeaQjuaQkeaQkuaQlVwiLDUsXCLmkJ3mkJ/mkKLmkKPmkKRcIl0sW1wiOTM4MFwiLFwi5pCl5pCn5pCo5pCp5pCr5pCuXCIsNSxcIuaQtVwiLDQsXCLmkLvmkLzmkL7mkYDmkYLmkYPmkYnmkYtcIiw2LFwi5pGT5pGV5pGW5pGX5pGZXCIsNCxcIuaRn1wiLDcsXCLmkajmkarmkavmkazmka5cIiw5LFwi5pG7XCIsNixcIuaSg+aShuaSiFwiLDgsXCLmkpPmkpTmkpfmkpjmkprmkpvmkpzmkp3mkp9cIiw0LFwi5pKl5pKm5pKn5pKo5pKq5pKr5pKv5pKx5pKy5pKz5pK05pK25pK55pK75pK95pK+5pK/5pOB5pOD5pOE5pOGXCIsNixcIuaTj+aTkeaTk+aTlOaTleaTluaTmeaTmlwiXSxbXCI5NDQwXCIsXCLmk5vmk5zmk53mk5/mk6Dmk6Hmk6Pmk6Xmk6dcIiwyNCxcIuaUgVwiLDcsXCLmlIpcIiw3LFwi5pSTXCIsNCxcIuaUmVwiLDhdLFtcIjk0ODBcIixcIuaUouaUo+aUpOaUplwiLDQsXCLmlKzmlK3mlLDmlLHmlLLmlLPmlLfmlLrmlLzmlL3mlYBcIiw0LFwi5pWG5pWH5pWK5pWL5pWN5pWO5pWQ5pWS5pWT5pWU5pWX5pWY5pWa5pWc5pWf5pWg5pWh5pWk5pWl5pWn5pWo5pWp5pWq5pWt5pWu5pWv5pWx5pWz5pW15pW25pW4XCIsMTQsXCLmlojmlonmlormlo3mlo7mlo/mlpLmlpTmlpXmlpbmlpjmlprmlp3mlp7mlqDmlqLmlqPmlqbmlqjmlqrmlqzmlq7mlrFcIiw3LFwi5pa65pa75pa+5pa/5peA5peC5peH5peI5peJ5peK5peN5peQ5peR5peT5peU5peV5peYXCIsNyxcIuaXoeaXo+aXpOaXquaXq1wiXSxbXCI5NTQwXCIsXCLml7Lml7Pml7Tml7Xml7jml7nml7tcIiw0LFwi5piB5piE5piF5piH5piI5piJ5piL5piN5piQ5piR5piS5piW5piX5piY5pia5pib5pic5pie5pih5pii5pij5pik5pim5pip5piq5pir5pis5piu5piw5piy5piz5pi3XCIsNCxcIuaYveaYv+aZgOaZguaZhFwiLDYsXCLmmY3mmY7mmZDmmZHmmZhcIl0sW1wiOTU4MFwiLFwi5pmZ5pmb5pmc5pmd5pme5pmg5pmi5pmj5pml5pmn5pmpXCIsNCxcIuaZseaZsuaZs+aZteaZuOaZueaZu+aZvOaZveaZv+aagOaageaag+aaheaahuaaiOaaieaaiuaai+aajeaajuaaj+aakOaakuaak+aalOaaleaamFwiLDQsXCLmmp5cIiw4LFwi5pqpXCIsNCxcIuaar1wiLDQsXCLmmrXmmrbmmrfmmrjmmrrmmrvmmrzmmr3mmr9cIiwyNSxcIuabmuabnlwiLDcsXCLmm6fmm6jmm6pcIiw1LFwi5pux5pu15pu25pu45pu65pu75pu95pyB5pyC5pyDXCJdLFtcIjk2NDBcIixcIuachOacheachuach+acjOacjuacj+ackeackuack+acluacmOacmeacmuacnOacnuacoFwiLDUsXCLmnKfmnKnmnK7mnLDmnLLmnLPmnLbmnLfmnLjmnLnmnLvmnLzmnL7mnL/mnYHmnYTmnYXmnYfmnYrmnYvmnY3mnZLmnZTmnZXmnZdcIiw0LFwi5p2d5p2i5p2j5p2k5p2m5p2n5p2r5p2s5p2u5p2x5p205p22XCJdLFtcIjk2ODBcIixcIuaduOadueaduuadu+adveaegOaeguaeg+aeheaehuaeiOaeiuaejOaejeaejuaej+aekeaekuaek+aelOaeluaemeaem+aen+aeoOaeoeaepOaepuaeqeaerOaeruaeseaesuaetOaeuVwiLDcsXCLmn4Lmn4VcIiw5LFwi5p+V5p+W5p+X5p+b5p+f5p+h5p+j5p+k5p+m5p+n5p+o5p+q5p+r5p+t5p+u5p+y5p+1XCIsNyxcIuafvuaggeagguagg+aghOaghuagjeagkOagkuaglOagleagmFwiLDQsXCLmoJ7moJ/moKDmoKJcIiw2LFwi5qCrXCIsNixcIuagtOagteagtuaguuagu+agv+ahh+ahi+ahjeahj+ahkuahllwiLDVdLFtcIjk3NDBcIixcIuahnOahneahnuahn+ahquahrFwiLDcsXCLmobXmobhcIiw4LFwi5qKC5qKE5qKHXCIsNyxcIuaikOaikeaikuailOaileailuaimFwiLDksXCLmoqPmoqTmoqXmoqnmoqrmoqvmoqzmoq7morHmorLmorTmorbmorfmorhcIl0sW1wiOTc4MFwiLFwi5qK5XCIsNixcIuajgeajg1wiLDUsXCLmo4rmo4zmo47mo4/mo5Dmo5Hmo5Pmo5Tmo5bmo5fmo5nmo5tcIiw0LFwi5qOh5qOi5qOkXCIsOSxcIuajr+ajsuajs+ajtOajtuajt+ajuOaju+ajveajvuajv+akgOakguakg+akhOakhlwiLDQsXCLmpIzmpI/mpJHmpJNcIiwxMSxcIuakoeakouako+akpVwiLDcsXCLmpK7mpK/mpLHmpLLmpLPmpLXmpLbmpLfmpLjmpLrmpLvmpLzmpL7mpYDmpYHmpYNcIiwxNixcIualleallualmOalmealm+alnOaln1wiXSxbXCI5ODQwXCIsXCLmpaHmpaLmpaTmpaXmpafmpajmpanmparmpazmpa3mpa/mpbDmpbJcIiw0LFwi5qW65qW75qW95qW+5qW/5qaB5qaD5qaF5qaK5qaL5qaM5qaOXCIsNSxcIuamluaml+ammeammuamnVwiLDksXCLmpqnmpqrmpqzmpq7mpq/mprDmprLmprPmprXmprbmprjmprnmprrmprzmpr1cIl0sW1wiOTg4MFwiLFwi5qa+5qa/5qeA5qeCXCIsNyxcIuani+anjeanj+ankeankuank+anlVwiLDUsXCLmp5zmp53mp57mp6FcIiwxMSxcIuanruanr+ansOanseans1wiLDksXCLmp77mqIBcIiw5LFwi5qiLXCIsMTEsXCLmqJlcIiw1LFwi5qig5qiiXCIsNSxcIuaoqeaoq+aorOaoreaoruaosOaosuaos+aotOaotlwiLDYsXCLmqL9cIiw0LFwi5qmF5qmG5qmIXCIsNyxcIuapkVwiLDYsXCLmqZpcIl0sW1wiOTk0MFwiLFwi5qmcXCIsNCxcIuapouapo+appOapplwiLDEwLFwi5qmyXCIsNixcIuapuuapu+apveapvuapv+aqgeaqguaqg+aqhVwiLDgsXCLmqo/mqpJcIiw0LFwi5qqYXCIsNyxcIuaqoVwiLDVdLFtcIjk5ODBcIixcIuaqp+aqqOaqquaqrVwiLDExNCxcIuaspeaspuasqFwiLDZdLFtcIjlhNDBcIixcIuasr+assOasseass+astOasteastuasuOasu+asvOasveasv+atgOatgeatguathOatheatiOatiuati+atjVwiLDExLFwi5q2aXCIsNyxcIuatqOatqeatq1wiLDEzLFwi5q265q295q2+5q2/5q6A5q6F5q6IXCJdLFtcIjlhODBcIixcIuaujOaujuauj+aukOaukeaulOauleaul+aumOaumeaunFwiLDQsXCLmrqJcIiw3LFwi5q6rXCIsNyxcIuautuauuFwiLDYsXCLmr4Dmr4Pmr4Tmr4ZcIiw0LFwi5q+M5q+O5q+Q5q+R5q+Y5q+a5q+cXCIsNCxcIuavolwiLDcsXCLmr6zmr63mr67mr7Dmr7Hmr7Lmr7Tmr7bmr7fmr7jmr7rmr7vmr7zmr75cIiw2LFwi5rCIXCIsNCxcIuawjuawkuawl+awnOawneawnuawoOawo+awpeawq+awrOawreawseaws+awtuawt+awueawuuawu+awvOawvuawv+axg+axhOaxheaxiOaxi1wiLDQsXCLmsZHmsZLmsZPmsZbmsZhcIl0sW1wiOWI0MFwiLFwi5rGZ5rGa5rGi5rGj5rGl5rGm5rGn5rGrXCIsNCxcIuaxseaxs+axteaxt+axuOaxuuaxu+axvOaxv+aygOayhOayh+ayiuayi+ayjeayjuaykeaykuayleayluayl+aymOaymuaynOayneaynuayoOayouayqOayrOayr+aysOaytOayteaytuayt+ayuuazgOazgeazguazg+azhuazh+aziOazi+azjeazjuazj+azkeazkuazmFwiXSxbXCI5YjgwXCIsXCLms5nms5rms5zms53ms5/ms6Tms6bms6fms6nms6zms63ms7Lms7Tms7nms7/mtIDmtILmtIPmtIXmtIbmtIjmtInmtIrmtI3mtI/mtJDmtJHmtJPmtJTmtJXmtJbmtJjmtJzmtJ3mtJ9cIiw1LFwi5rSm5rSo5rSp5rSs5rSt5rSv5rSw5rS05rS25rS35rS45rS65rS/5rWA5rWC5rWE5rWJ5rWM5rWQ5rWV5rWW5rWX5rWY5rWb5rWd5rWf5rWh5rWi5rWk5rWl5rWn5rWo5rWr5rWs5rWt5rWw5rWx5rWy5rWz5rW15rW25rW55rW65rW75rW9XCIsNCxcIua2g+a2hOa2hua2h+a2iua2i+a2jea2j+a2kOa2kua2llwiLDQsXCLmtpzmtqLmtqXmtqzmtq3mtrDmtrHmtrPmtrTmtrbmtrfmtrlcIiw1LFwi5reB5reC5reD5reI5reJ5reKXCJdLFtcIjljNDBcIixcIua3jea3jua3j+a3kOa3kua3k+a3lOa3lea3l+a3mua3m+a3nOa3n+a3oua3o+a3pea3p+a3qOa3qea3qua3rea3r+a3sOa3sua3tOa3tea3tua3uOa3uua3vVwiLDcsXCLmuIbmuIfmuIjmuInmuIvmuI/muJLmuJPmuJXmuJjmuJnmuJvmuJzmuJ7muJ/muKLmuKbmuKfmuKjmuKrmuKzmuK7muLDmuLHmuLPmuLVcIl0sW1wiOWM4MFwiLFwi5ri25ri35ri55ri7XCIsNyxcIua5hVwiLDcsXCLmuY/muZDmuZHmuZLmuZXmuZfmuZnmuZrmuZzmuZ3muZ7muaBcIiwxMCxcIua5rOa5rea5r1wiLDE0LFwi5rqA5rqB5rqC5rqE5rqH5rqI5rqKXCIsNCxcIua6kVwiLDYsXCLmupnmuprmupvmup3mup7muqDmuqHmuqPmuqTmuqbmuqjmuqnmuqvmuqzmuq3muq7murDmurPmurXmurjmurnmurzmur7mur/mu4Dmu4Pmu4Tmu4Xmu4bmu4jmu4nmu4rmu4zmu43mu47mu5Dmu5Lmu5bmu5jmu5nmu5vmu5zmu53mu6Pmu6fmu6pcIiw1XSxbXCI5ZDQwXCIsXCLmu7Dmu7Hmu7Lmu7Pmu7Xmu7bmu7fmu7jmu7pcIiw3LFwi5ryD5ryE5ryF5ryH5ryI5ryKXCIsNCxcIua8kOa8kea8kua8llwiLDksXCLmvKHmvKLmvKPmvKXmvKbmvKfmvKjmvKzmvK7mvLDmvLLmvLTmvLXmvLdcIiw2LFwi5ry/5r2A5r2B5r2CXCJdLFtcIjlkODBcIixcIua9g+a9hOa9hea9iOa9iea9iua9jOa9jlwiLDksXCLmvZnmvZrmvZvmvZ3mvZ/mvaDmvaHmvaPmvaTmvaXmvadcIiw1LFwi5r2v5r2w5r2x5r2z5r215r225r235r255r275r29XCIsNixcIua+hea+hua+h+a+iua+i+a+j1wiLDEyLFwi5r6d5r6e5r6f5r6g5r6iXCIsNCxcIua+qFwiLDEwLFwi5r605r615r635r645r66XCIsNSxcIua/gea/g1wiLDUsXCLmv4pcIiw2LFwi5r+TXCIsMTAsXCLmv5/mv6Lmv6Pmv6Tmv6VcIl0sW1wiOWU0MFwiLFwi5r+mXCIsNyxcIua/sFwiLDMyLFwi54CSXCIsNyxcIueAnFwiLDYsXCLngKRcIiw2XSxbXCI5ZTgwXCIsXCLngKtcIiw5LFwi54C254C354C454C6XCIsMTcsXCLngY3ngY7ngZBcIiwxMyxcIueBn1wiLDExLFwi54Gu54Gx54Gy54Gz54G054G354G554G654G754G954KB54KC54KD54KE54KG54KH54KI54KL54KM54KN54KP54KQ54KR54KT54KX54KY54Ka54Kb54KeXCIsMTIsXCLngrDngrLngrTngrXngrbngrrngr7ngr/ng4Tng4Xng4bng4fng4nng4tcIiwxMixcIueDmlwiXSxbXCI5ZjQwXCIsXCLng5zng53ng57ng6Dng6Hng6Lng6Png6Xng6rng67ng7BcIiw2LFwi54O454O654O754O854O+XCIsMTAsXCLnhItcIiw0LFwi54SR54SS54SU54SX54SbXCIsMTAsXCLnhKdcIiw3LFwi54Sy54Sz54S0XCJdLFtcIjlmODBcIixcIueEteeEt1wiLDEzLFwi54WG54WH54WI54WJ54WL54WN54WPXCIsMTIsXCLnhZ3nhZ9cIiw0LFwi54Wl54WpXCIsNCxcIueFr+eFsOeFseeFtOeFteeFtueFt+eFueeFu+eFvOeFvlwiLDUsXCLnhoVcIiw0LFwi54aL54aM54aN54aO54aQ54aR54aS54aT54aV54aW54aX54aaXCIsNCxcIueGoVwiLDYsXCLnhqnnhqrnhqvnhq1cIiw1LFwi54a054a254a354a454a6XCIsOCxcIueHhFwiLDksXCLnh49cIiw0XSxbXCJhMDQwXCIsXCLnh5ZcIiw5LFwi54eh54ei54ej54ek54em54eoXCIsNSxcIueHr1wiLDksXCLnh7pcIiwxMSxcIueIh1wiLDE5XSxbXCJhMDgwXCIsXCLniJvniJzniJ5cIiw5LFwi54ip54ir54it54iu54iv54iy54iz54i054i654i854i+54mAXCIsNixcIueJieeJiueJi+eJjueJj+eJkOeJkeeJk+eJlOeJleeJl+eJmOeJmueJnOeJnueJoOeJo+eJpOeJpeeJqOeJqueJq+eJrOeJreeJsOeJseeJs+eJtOeJtueJt+eJuOeJu+eJvOeJveeKgueKg+eKhVwiLDQsXCLnioznio7nipDnipHnipNcIiwxMSxcIueKoFwiLDExLFwi54qu54qx54qy54qz54q154q6XCIsNixcIueLheeLhueLh+eLieeLiueLi+eLjOeLj+eLkeeLk+eLlOeLleeLlueLmOeLmueLm1wiXSxbXCJhMWExXCIsXCLjgIDjgIHjgILCt8uJy4fCqOOAg+OAheKAlO+9nuKAluKApuKAmOKAmeKAnOKAneOAlOOAleOAiFwiLDcsXCLjgJbjgJfjgJDjgJHCscOXw7fiiLbiiKfiiKjiiJHiiI/iiKriiKniiIjiiLfiiJriiqXiiKXiiKDijJLiipniiKviiK7iiaHiiYziiYjiiL3iiJ3iiaDiia7iia/iiaTiiaXiiJ7iiLXiiLTimYLimYDCsOKAsuKAs+KEg++8hMKk77+g77+h4oCwwqfihJbimIbimIXil4vil4/il47il4fil4bilqHilqDilrPilrLigLvihpLihpDihpHihpPjgJNcIl0sW1wiYTJhMVwiLFwi4oWwXCIsOV0sW1wiYTJiMVwiLFwi4pKIXCIsMTksXCLikbRcIiwxOSxcIuKRoFwiLDldLFtcImEyZTVcIixcIuOIoFwiLDldLFtcImEyZjFcIixcIuKFoFwiLDExXSxbXCJhM2ExXCIsXCLvvIHvvILvvIPvv6XvvIVcIiw4OCxcIu+/o1wiXSxbXCJhNGExXCIsXCLjgYFcIiw4Ml0sW1wiYTVhMVwiLFwi44KhXCIsODVdLFtcImE2YTFcIixcIs6RXCIsMTYsXCLOo1wiLDZdLFtcImE2YzFcIixcIs6xXCIsMTYsXCLPg1wiLDZdLFtcImE2ZTBcIixcIu+4te+4tu+4ue+4uu+4v++5gO+4ve+4vu+5ge+5gu+5g++5hFwiXSxbXCJhNmVlXCIsXCLvuLvvuLzvuLfvuLjvuLFcIl0sW1wiYTZmNFwiLFwi77iz77i0XCJdLFtcImE3YTFcIixcItCQXCIsNSxcItCB0JZcIiwyNV0sW1wiYTdkMVwiLFwi0LBcIiw1LFwi0ZHQtlwiLDI1XSxbXCJhODQwXCIsXCLLisuLy5nigJPigJXigKXigLXihIXihInihpbihpfihpjihpniiJXiiJ/iiKPiiZLiiabiiafiir/ilZBcIiwzNSxcIuKWgVwiLDZdLFtcImE4ODBcIixcIuKWiFwiLDcsXCLilpPilpTilpXilrzilr3il6Lil6Pil6Til6XimIniipXjgJLjgJ3jgJ5cIl0sW1wiYThhMVwiLFwixIHDoceOw6DEk8OpxJvDqMSrw63HkMOsxY3Ds8eSw7LFq8O6x5TDuceWx5jHmsecw7zDqsmRXCJdLFtcImE4YmRcIixcIsWExYhcIl0sW1wiYThjMFwiLFwiyaFcIl0sW1wiYThjNVwiLFwi44SFXCIsMzZdLFtcImE5NDBcIixcIuOAoVwiLDgsXCLjiqPjjo7jjo/jjpzjjp3jjp7jjqHjj4Tjj47jj5Hjj5Ljj5XvuLDvv6Lvv6RcIl0sW1wiYTk1OVwiLFwi4oSh44ixXCJdLFtcImE5NWNcIixcIuKAkFwiXSxbXCJhOTYwXCIsXCLjg7zjgpvjgpzjg73jg77jgIbjgp3jgp7vuYlcIiw5LFwi77mU77mV77mW77mX77mZXCIsOF0sW1wiYTk4MFwiLFwi77miXCIsNCxcIu+5qO+5qe+5qu+5q1wiXSxbXCJhOTk2XCIsXCLjgIdcIl0sW1wiYTlhNFwiLFwi4pSAXCIsNzVdLFtcImFhNDBcIixcIueLnOeLneeLn+eLolwiLDUsXCLni6rni6vni7Xni7bni7nni73ni77ni7/njIDnjILnjIRcIiw1LFwi54yL54yM54yN54yP54yQ54yR54yS54yU54yY54yZ54ya54yf54yg54yj54yk54ym54yn54yo54yt54yv54yw54yy54yz54y154y254y654y754y854y9542AXCIsOF0sW1wiYWE4MFwiLFwi542J542K542L542M542O542P542R542T542U542V542W542YXCIsNyxcIueNoVwiLDEwLFwi542u542w542xXCJdLFtcImFiNDBcIixcIueNslwiLDExLFwi542/XCIsNCxcIueOheeOhueOiOeOiueOjOeOjeeOj+eOkOeOkueOk+eOlOeOleeOl+eOmOeOmeeOmueOnOeOneeOnueOoOeOoeeOo1wiLDUsXCLnjqrnjqznjq3njrHnjrTnjrXnjrbnjrjnjrnnjrznjr3njr7njr/nj4Hnj4NcIiw0XSxbXCJhYjgwXCIsXCLnj4vnj4znj47nj5JcIiw2LFwi54+a54+b54+c54+d54+f54+h54+i54+j54+k54+m54+o54+q54+r54+s54+u54+v54+w54+x54+zXCIsNF0sW1wiYWM0MFwiLFwi54+4XCIsMTAsXCLnkITnkIfnkIjnkIvnkIznkI3nkI7nkJFcIiw4LFwi55CcXCIsNSxcIueQo+eQpOeQp+eQqeeQq+eQreeQr+eQseeQsueQt1wiLDQsXCLnkL3nkL7nkL/nkYDnkYJcIiwxMV0sW1wiYWM4MFwiLFwi55GOXCIsNixcIueRlueRmOeRneeRoFwiLDEyLFwi55Gu55Gv55GxXCIsNCxcIueRuOeRueeRulwiXSxbXCJhZDQwXCIsXCLnkbvnkbznkb3nkb/nkoLnkoTnkoXnkobnkojnkonnkornkoznko3nko/nkpFcIiwxMCxcIueSneeSn1wiLDcsXCLnkqpcIiwxNSxcIueSu1wiLDEyXSxbXCJhZDgwXCIsXCLnk4hcIiw5LFwi55OTXCIsOCxcIueTneeTn+eToeeTpeeTp1wiLDYsXCLnk7Dnk7Hnk7JcIl0sW1wiYWU0MFwiLFwi55Oz55O155O4XCIsNixcIueUgOeUgeeUgueUg+eUhVwiLDcsXCLnlI7nlJDnlJLnlJTnlJXnlJbnlJfnlJvnlJ3nlJ7nlKBcIiw0LFwi55Sm55Sn55Sq55Su55S055S255S555S855S955S/55WB55WC55WD55WE55WG55WH55WJ55WK55WN55WQ55WR55WS55WT55WV55WW55WX55WYXCJdLFtcImFlODBcIixcIueVnVwiLDcsXCLnlafnlajnlannlatcIiw2LFwi55Wz55W155W255W355W6XCIsNCxcIueWgOeWgeeWgueWhOeWheeWh1wiXSxbXCJhZjQwXCIsXCLnlojnlonnlornloznlo3nlo7nlpDnlpPnlpXnlpjnlpvnlpznlp7nlqLnlqZcIiw0LFwi55at55a255a355a655a755a/55eA55eB55eG55eL55eM55eO55eP55eQ55eR55eT55eX55eZ55ea55ec55ed55ef55eg55eh55el55ep55es55et55eu55ev55ey55ez55e155e255e355e455e655e755e955e+55iC55iE55iG55iHXCJdLFtcImFmODBcIixcIueYiOeYieeYi+eYjeeYjueYj+eYkeeYkueYk+eYlOeYlueYmueYnOeYneeYnueYoeeYo+eYp+eYqOeYrOeYrueYr+eYseeYsueYtueYt+eYueeYuueYu+eYveeZgeeZgueZhFwiXSxbXCJiMDQwXCIsXCLnmYVcIiw2LFwi55mOXCIsNSxcIueZleeZl1wiLDQsXCLnmZ3nmZ/nmaDnmaHnmaLnmaRcIiw2LFwi55ms55mt55mu55mwXCIsNyxcIueZueeZuueZvOeZv+eagOeageeag+eaheeaieeaiueajOeajeeaj+eakOeakuealOealeeal+eamOeamueam1wiXSxbXCJiMDgwXCIsXCLnmpxcIiw3LFwi55qlXCIsOCxcIuear+easOeas+eatVwiLDksXCLnm4Dnm4Hnm4PllYrpmL/ln4PmjKjlk47llInlk4DnmpHnmYzolLznn67oib7noo3niLHpmpjpno3msKjlronkv7rmjInmmpflsrjog7rmoYjogq7mmILnm47lh7nmlZbnhqznv7HoooTlgrLlpaXmh4rmvrPoiq3mjYzmiZLlj63lkKfnrIblhavnlqTlt7Tmi5Tot4vpnbbmiorogJnlnZ3pnLjnvaLniLjnmb3mn4/nmb7mkYbkvbDotKXmi5znqJfmlpHnj63mkKzmibPoiKzpooHmnb/niYjmia7mi4zkvLTnk6PljYrlip7nu4rpgqbluK7moobmppzohoDnu5Hmo5Lno4XomozplZHlgo3osKToi57og57ljIXopJLliaVcIl0sW1wiYjE0MFwiLFwi55uE55uH55uJ55uL55uM55uT55uV55uZ55ua55uc55ud55ue55ugXCIsNCxcIuebplwiLDcsXCLnm7Dnm7Pnm7Xnm7bnm7fnm7rnm7vnm73nm7/nnIDnnILnnIPnnIXnnIbnnIrnnIznnI5cIiwxMCxcIuecm+ecnOecneecnuecoeeco+ecpOecpeecp+ecquecq1wiXSxbXCJiMTgwXCIsXCLnnKznnK7nnLBcIiw0LFwi55y555y755y955y+55y/552C552E552F552G552IXCIsNyxcIuedklwiLDcsXCLnnZzoloTpm7nkv53loKHppbHlrp3mirHmiqXmmrTosbnpso3niIbmna/nopHmgrLljZHljJfovojog4zotJ3pkqHlgI3ni4jlpIfmg6vnhJnooqvlpZToi6/mnKznrKjltKnnu7fnlK3ms7Xouabov7jpgLzpvLvmr5TphJnnrJTlvbznoqfok5bolL3mr5Xmr5nmr5bluIHluofnl7npl63mlZ3lvIrlv4Xovp/lo4Hoh4Lpgb/pmZvpnq3ovrnnvJbotKzmiYHkvr/lj5jljZ7ovqjovqnovqvpgY3moIflvarohpjooajps5bmhovliKvnmKrlvazmlozmv5Lmu6jlrr7mkYjlhbXlhrDmn4TkuJnnp4nppbzngrNcIl0sW1wiYjI0MFwiLFwi552d552e552f552g552k552n552p552q552tXCIsMTEsXCLnnbrnnbvnnbznnoHnnoLnnoPnnoZcIiw1LFwi556P556Q556TXCIsMTEsXCLnnqHnnqPnnqTnnqbnnqjnnqvnnq3nnq7nnq/nnrHnnrLnnrTnnrZcIiw0XSxbXCJiMjgwXCIsXCLnnrznnr7nn4BcIiwxMixcIuefjlwiLDgsXCLnn5jnn5nnn5rnn51cIiw0LFwi55+k55eF5bm254676I+g5pKt5ouo6ZK15rOi5Y2a5YuD5pCP6ZOC566U5Lyv5bib6Ii26ISW6IaK5rik5rOK6amz5o2V5Y2c5ZO66KGl5Z+g5LiN5biD5q2l57C/6YOo5oCW5pOm54yc6KOB5p2Q5omN6LSi552s6Lip6YeH5b2p6I+c6JSh6aSQ5Y+C6JqV5q6L5oOt5oOo54G/6IuN6Iix5LuT5rKn6JeP5pON57OZ5qe95pu56I2J5Y6V562W5L6n5YaM5rWL5bGC6Lmt5o+S5Y+J6Iys6Iy25p+l56K05pC95a+f5bKU5beu6K+n5ouG5p+06LG65pCA5o666J2J6aaL6LCX57yg6ZOy5Lqn6ZiQ6aKk5piM54yWXCJdLFtcImIzNDBcIixcIuefpuefqOefquefr+efsOefseefsueftOefteeft+efueefuuefu+efvOegg1wiLDUsXCLnoIrnoIvnoI7noI/noJDnoJPnoJXnoJnnoJvnoJ7noKDnoKHnoKLnoKTnoKjnoKrnoKvnoK7noK/noLHnoLLnoLPnoLXnoLbnoL3noL/noYHnoYLnoYPnoYTnoYbnoYjnoYnnoYrnoYvnoY3noY/noZHnoZPnoZTnoZjnoZnnoZpcIl0sW1wiYjM4MFwiLFwi56Gb56Gc56GeXCIsMTEsXCLnoa9cIiw3LFwi56G456G556G656G756G9XCIsNixcIuWcuuWwneW4uOmVv+WBv+iCoOWOguaVnueVheWUseWAoei2heaKhOmSnuacneWYsua9ruW3ouWQteeCkui9puaJr+aSpOaOo+W9u+a+iOmDtOiHo+i+sOWwmOaZqOW/seayiemZiOi2geihrOaSkeensOWfjuapmeaIkOWRiOS5mOeoi+aDqea+hOivmuaJv+mAnumqi+enpOWQg+eXtOaMgeWMmeaxoOi/n+W8m+mpsOiAu+m9v+S+iOWwuui1pOe/heaWpeeCveWFheWGsuiZq+W0h+WuoOaKvemFrOeVtOi4jOeooOaEgeetueS7h+e7uOeeheS4keiHreWIneWHuuapseWOqOi6h+mUhOmbj+a7gemZpOalmlwiXSxbXCJiNDQwXCIsXCLnooTnooXnoobnoojnoornoovnoo/nopDnopLnopTnopXnopbnopnnop3nop7noqDnoqLnoqTnoqbnoqhcIiw3LFwi56K156K256K356K456K656K756K856K956K/56OA56OC56OD56OE56OG56OH56OI56OM56ON56OO56OP56OR56OS56OT56OW56OX56OY56OaXCIsOV0sW1wiYjQ4MFwiLFwi56Ok56Ol56Om56On56Op56Oq56Or56OtXCIsNCxcIuejs+ejteejtuejuOejueeju1wiLDUsXCLnpILnpIPnpITnpIZcIiw2LFwi56GA5YKo55+X5pCQ6Kem5aSE5o+j5bed56m/5qS95Lyg6Ii55ZaY5Liy55au56qX5bmi5bqK6Zev5Yib5ZC554KK5o226ZSk5Z6C5pil5qS/6YaH5ZSH5rez57qv6KCi5oiz57uw55a16Iyo56OB6ZuM6L6e5oWI55O36K+N5q2k5Yi66LWQ5qyh6IGq6JGx5Zux5YyG5LuO5Lib5YeR57KX6YaL57CH5L+D6Lm/56+h56qc5pGn5bSU5YKs6ISG55iB57K55res57+g5p2R5a2Y5a+456OL5pKu5pCT5o6q5oyr6ZSZ5pCt6L6+562U55ip5omT5aSn5ZGG5q255YKj5oi05bim5q6G5Luj6LS36KKL5b6F6YCuXCJdLFtcImI1NDBcIixcIuekjVwiLDUsXCLnpJRcIiw5LFwi56SfXCIsNCxcIuekpVwiLDE0LFwi56S1XCIsNCxcIuekveekv+elguelg+elhOelheelh+elilwiLDgsXCLnpZTnpZXnpZjnpZnnpaHnpaNcIl0sW1wiYjU4MFwiLFwi56Wk56Wm56Wp56Wq56Wr56Ws56Wu56WwXCIsNixcIuelueelu1wiLDQsXCLnpoLnpoPnpobnpofnpojnponnpovnpoznpo3npo7nppDnppHnppLmgKDogL3mi4XkuLnljZXpg7jmjrjog4bml6bmsK7kvYbmg67mt6Hor57lvLnom4vlvZPmjKHlhZrojaHmoaPliIDmjaPouYjlgJLlspvnpbflr7zliLDnqLvmgrzpgZPnm5flvrflvpfnmoTouaznga/nmbvnrYnnnqrlh7PpgpPloKTkvY7mu7Tov6rmlYznrJvni4TmtqTnv5/lq6HmirXlupXlnLDokoLnrKzluJ3lvJ/pgJLnvJTpoqDmjoLmu4fnopjngrnlhbjpnZvlnqvnlLXkvYPnlLjlupfmg6blpaDmt4Dmrr/noonlj7zpm5Xlh4vliIHmjonlkIrpkpPosIPot4zniLnnop/onbbov63osI3lj6BcIl0sW1wiYjY0MFwiLFwi56aTXCIsNixcIuemm1wiLDExLFwi56aoXCIsMTAsXCLnprRcIiw0LFwi56a856a/56eC56eE56eF56eH56eI56eK56eM56eO56eP56eQ56eT56eU56eW56eX56eZXCIsNSxcIuenoOenoeenouenpeenqOenqlwiXSxbXCJiNjgwXCIsXCLnp6znp67np7FcIiw2LFwi56e556e656e856e+56e/56iB56iE56iF56iH56iI56iJ56iK56iM56iPXCIsNCxcIueoleeolueomOeomeeom+eonOS4geebr+WPrumSiemhtum8jumUreWumuiuouS4ouS4nOWGrOiRo+aHguWKqOagi+S+l+aBq+WGu+a0nuWFnOaKluaWl+mZoeixhumAl+eXmOmDveedo+avkueKiueLrOivu+Wgteeduei1jOadnOmVgOiCmuW6pua4oeWmkuerr+efremUu+auteaWree8juWghuWFkemYn+WvueWiqeWQqOi5suaVpumhv+WbpOmSneebvumBgeaOh+WThuWkmuWkuuWem+i6suactei3uuiIteWJgeaDsOWgleibvuWzqOm5heS/hOmineiuueWopeaBtuWOhOaJvOmBj+mEgumlv+aBqeiAjOWEv+iAs+WwlOmltea0seS6jFwiXSxbXCJiNzQwXCIsXCLnqJ3nqJ/nqKHnqKLnqKRcIiwxNCxcIueotOeoteeotueouOeouueovuepgFwiLDUsXCLnqYdcIiw5LFwi56mSXCIsNCxcIuepmFwiLDE2XSxbXCJiNzgwXCIsXCLnqalcIiw2LFwi56mx56my56mz56m156m756m856m956m+56qC56qF56qH56qJ56qK56qL56qM56qO56qP56qQ56qT56qU56qZ56qa56qb56qe56qh56qi6LSw5Y+R572a562P5LyQ5LmP6ZiA5rOV54+Q6Jep5biG55Wq57+75qiK55++6ZKS57mB5Yeh54Om5Y+N6L+U6IyD6LSp54qv6aWt5rOb5Z2K6Iqz5pa56IKq5oi/6Ziy5aao5Lu/6K6/57q65pS+6I+y6Z2e5ZWh6aOe6IKl5Yyq6K+95ZCg6IK65bqf5rK46LS56Iqs6YWa5ZCp5rCb5YiG57q35Z2f54Sa5rG+57KJ5aWL5Lu95b+/5oSk57Kq5Liw5bCB5p6r6JyC5bOw6ZSL6aOO55av54O96YCi5Yav57yd6K695aWJ5Yek5L2b5ZCm5aSr5pW36IKk5a215om25ouC6L6Q5bmF5rCf56ym5LyP5L+Y5pyNXCJdLFtcImI4NDBcIixcIueqo+eqpOeqp+eqqeeqqueqq+eqrlwiLDQsXCLnqrRcIiwxMCxcIuergFwiLDEwLFwi56uMXCIsOSxcIuerl+ermOermuerm+ernOerneeroeerouerpOerp1wiLDUsXCLnq67nq7Dnq7Hnq7Lnq7NcIl0sW1wiYjg4MFwiLFwi56u0XCIsNCxcIueru+ervOervuesgOesgeesguesheesh+esieesjOesjeesjueskOeskuesk+esluesl+esmOesmuesnOesneesn+esoeesoueso+esp+esqeesrea1rua2quemj+iiseW8l+eUq+aKmui+heS/r+mHnOaWp+iEr+iFkeW6nOiFkOi1tOWJr+imhui1i+WkjeWCheS7mOmYnOeItuiFuei0n+WvjOiuo+mZhOWmh+e8muWSkOWZtuWYjuivpeaUueamgumSmeeblua6ieW5sueUmOadhuafkeerv+iCnei1tuaEn+enhuaVoui1o+WGiOWImumSoue8uOiCm+e6suWyl+a4r+adoOevmeeai+mrmOiGj+e+lOezleaQnumVkOeov+WRiuWTpeatjOaQgeaIiOm4veiDs+eWmeWJsumdqeiRm+agvOibpOmYgemalOmTrOS4quWQhOe7meaguei3n+iAleabtOW6mue+uVwiXSxbXCJiOTQwXCIsXCLnrK/nrLDnrLLnrLTnrLXnrLbnrLfnrLnnrLvnrL3nrL9cIiw1LFwi562G562I562K562N562O562T562V562X562Z562c562e562f562h562jXCIsMTAsXCLnra/nrbDnrbPnrbTnrbbnrbjnrbrnrbznrb3nrb/nroHnroLnroPnroTnroZcIiw2LFwi566O566PXCJdLFtcImI5ODBcIixcIueukeeukueuk+eulueumOeumeeumueum+eunueun+euoOeuo+eupOeupeeurueur+eusOeusueus+euteeutueut+euuVwiLDcsXCLnr4Lnr4Pnr4Tln4LogL/mopflt6XmlLvlip/mga3pvprkvpvouqzlhazlrqvlvJPlt6nmsZ7mi7HotKHlhbHpkqnli77msp/oi5/ni5flnqLmnoTotK3lpJ/ovpzoj4flkpXnro3kvLDmsr3lraTlp5HpvJPlj6Tom4rpqqjosLfogqHmlYXpob7lm7rpm4fliK7nk5zliZDlr6HmjILopILkuZbmi5DmgKrmo7rlhbPlrpjlhqDop4LnrqHppobnvZDmg6/ngYzotK/lhYnlub/pgJvnkbDop4TlnK3noYXlvZLpvp/pl7rovajprLzor6HnmbjmoYLmn5zot6rotLXliL3ovormu5rmo43plIXpg63lm73mnpzoo7nov4flk4hcIl0sW1wiYmE0MFwiLFwi56+F56+I56+J56+K56+L56+N56+O56+P56+Q56+S56+UXCIsNCxcIuevm+evnOevnuevn+evoOevouevo+evpOevp+evqOevqeevq+evrOevreevr+evsOevslwiLDQsXCLnr7jnr7nnr7rnr7vnr73nr79cIiw3LFwi57CI57CJ57CK57CN57CO57CQXCIsNSxcIuewl+ewmOewmVwiXSxbXCJiYTgwXCIsXCLnsJpcIiw0LFwi57CgXCIsNSxcIuewqOewqeewq1wiLDEyLFwi57C5XCIsNSxcIuexgumquOWtqea1t+awpuS6peWus+mqh+mFo+aGqOmCr+mfqeWQq+a2teWvkuWHveWWiue9lee/sOaSvOaNjeaXseaGvuaCjeeEiuaxl+axieWkr+adreiIquWjleWajuixquavq+mDneWlveiAl+WPt+a1qeWRteWWneiNt+iPj+aguOemvuWSjOS9leWQiOebkuiyiemYguays+a2uOi1q+ikkOm5pOi0uuWYv+m7keeXleW+iOeLoOaBqOWTvOS6qOaoquihoeaBkui9sOWThOeDmOiZuem4v+a0quWuj+W8mOe6ouWWieS+r+eMtOWQvOWOmuWAmeWQjuWRvOS5juW/veeRmuWjtuiRq+iDoeidtOeLkOeziua5llwiXSxbXCJiYjQwXCIsXCLnsYNcIiw5LFwi57GOXCIsMzYsXCLnsbVcIiw1LFwi57G+XCIsOV0sW1wiYmI4MFwiLFwi57KI57KKXCIsNixcIueyk+eylOeylueymeeymueym+eyoOeyoeeyo+eypueyp+eyqOeyqeeyq+eyrOeyreeyr+eysOeytFwiLDQsXCLnsrrnsrvlvKfomY7llKzmiqTkupLmsqrmiLfoirHlk5fljY7njL7mu5HnlLvliJLljJbor53mp5DlvormgIDmt67lnY/mrKLnjq/moZPov5jnvJPmjaLmgqPllKTnl6rosaLnhJXmtqPlrqblubvojZLmhYzpu4Tno7ronZfnsKfnmoflh7Dmg7bnhYzmmYPluYzmgY3osI7ngbDmjKXovonlvr3mgaLom5Tlm57mr4HmgpTmhafljYnmg6DmmabotL/np73kvJrng6nmsYforrPor7Lnu5jojaTmmI/lqZrprYLmtZHmt7fosYHmtLvkvJnngavojrfmiJbmg5HpnI3otKfnpbjlh7vlnL7ln7rmnLrnlbjnqL3np6/nrpVcIl0sW1wiYmM0MFwiLFwi57K/57OA57OC57OD57OE57OG57OJ57OL57OOXCIsNixcIuezmOezmuezm+ezneeznuezoVwiLDYsXCLns6lcIiw1LFwi57OwXCIsNyxcIuezueezuuezvFwiLDEzLFwi57SLXCIsNV0sW1wiYmM4MFwiLFwi57SRXCIsMTQsXCLntKHntKPntKTntKXntKbntKjntKnntKrntKzntK3ntK7ntLBcIiw2LFwi6IKM6aWl6L+55r+A6K6l6bih5aes57up57yJ5ZCJ5p6B5qOY6L6R57GN6ZuG5Y+K5oCl55a+5rGy5Y2z5auJ57qn5oyk5Yeg6ISK5bex6JOf5oqA5YaA5a2j5LyO56Wt5YmC5oK45rWO5a+E5a+C6K6h6K6w5pei5b+M6ZmF5aaT57un57qq5ZiJ5p635aS55L2z5a625Yqg6I2a6aKK6LS+55Sy6ZK+5YGH56i85Lu35p626am+5auB5q2855uR5Z2a5bCW56y66Ze054WO5YW86IKp6Imw5aW457yE6Iyn5qOA5p+s56Kx56G35ouj5o2h566A5L+t5Ymq5YeP6I2Q5qeb6Ym06Le16LSx6KeB6ZSu566t5Lu2XCJdLFtcImJkNDBcIixcIue0t1wiLDU0LFwi57WvXCIsN10sW1wiYmQ4MFwiLFwi57W4XCIsMzIsXCLlgaXoiLDliZHppa/muJDmuoXmtqflu7rlg7Xlp5zlsIbmtYbmsZ/nlobokovmoajlpZborrLljKDphbHpmY3olYnmpJLnpIHnhKbog7bkuqTpg4rmtYfpqoTlqIflmrzmkIXpk7Dnn6vkvqXohJrni6Hop5LppbrnvLTnu57lib/mlZnphbXovb/ovoPlj6vnqpbmj63mjqXnmobnp7jooZfpmLbmiKrliqvoioLmoZTmnbDmjbfnnavnq63mtIHnu5Pop6Plp5DmiJLol4noiqXnlYzlgJ/ku4vnlqXor6vlsYrlt77nrYvmlqTph5Hku4rmtKXopZ/ntKfplKbku4XosKjov5vpnbPmmYvnpoHov5Hng6zmtbhcIl0sW1wiYmU0MFwiLFwi57aZXCIsMTIsXCLntqdcIiw2LFwi57avXCIsNDJdLFtcImJlODBcIixcIue3mlwiLDMyLFwi5bC95Yqy6I2G5YWi6IyO552b5pm26bK45Lqs5oOK57K+57Kz57uP5LqV6K2m5pmv6aKI6Z2Z5aKD5pWs6ZWc5b6E55eJ6Z2W56uf56ue5YeA54Kv56qY5o+q56m257qg546W6Z+t5LmF54G45Lmd6YWS5Y6p5pWR5pen6Ie86IiF5ZKO5bCx55aa6Z6g5ouY54uZ55a95bGF6am56I+K5bGA5ZKA55+p5Li+5rKu6IGa5ouS5o2u5beo5YW36Led6Lie6ZSv5L+x5Y+l5oOn54Ks5Ymn5o2Q6bmD5aif5YCm55y35Y2357ui5pKF5pSr5oqJ5o6Y5YCU54i16KeJ5Yaz6K+A57ud5Z2H6I+M6ZKn5Yab5ZCb5bO7XCJdLFtcImJmNDBcIixcIue3u1wiLDYyXSxbXCJiZjgwXCIsXCLnuLrnuLxcIiw0LFwi57mCXCIsNCxcIue5iFwiLDIxLFwi5L+K56uj5rWa6YOh6aqP5ZaA5ZKW5Y2h5ZKv5byA5o+p5qW35Yev5oWo5YiK5aCq5YuY5Z2O56CN55yL5bq35oW357Og5omb5oqX5Lqi54KV6ICD5ou354Ok6Z2g5Z236Iub5p+v5qO156OV6aKX56eR5aOz5ZKz5Y+v5ri05YWL5Yi75a6i6K++6IKv5ZWD5Z6m5oGz5Z2R5ZCt56m65oGQ5a2U5o6n5oqg5Y+j5omj5a+H5p6v5ZOt56qf6Ium6YW35bqT6KOk5aS45Z6u5oyO6Leo6IOv5Z2X56235L6p5b+r5a695qy+5Yyh562Q54uC5qGG55+/55y25pe35Ya15LqP55uU5bK/56ql6JG15aWO6a2B5YKAXCJdLFtcImMwNDBcIixcIue5nlwiLDM1LFwi57qDXCIsMjMsXCLnupznup3nup5cIl0sW1wiYzA4MFwiLFwi57qu57q057q757q857uW57uk57us57u557yK57yQ57ye57y357y557y7XCIsNixcIue9g+e9hlwiLDksXCLnvZLnvZPppojmhKfmuoPlnaTmmIbmjYblm7Dmi6zmianlu5PpmJTlnoPmi4nllofonKHohYrovqPllabojrHmnaXotZbok53lqarmoI/mi6bnr67pmJHlhbDmvpzosLDmj73op4jmh5LnvIbng4Lmu6XnkIXmppTni7zlu4rpg47mnJfmtarmjZ7lirPniaLogIHkvazlp6Xpharng5nmtp3li5LkuZDpm7fpla3olb7no4rntK/lhKHlnpLmk4Logovnsbvms6rmo7HmpZ7lhrfljpjmoqjnioHpu47nr7Hni7jnprvmvJPnkIbmnY7ph4zpsqTnpLzojonojZTlkI/moJfkuL3ljonlirHnoL7ljobliKnlgojkvovkv5BcIl0sW1wiYzE0MFwiLFwi572W572Z572b572c572d572e572g572jXCIsNCxcIue9q+e9rOe9ree9r+e9sOe9s+e9tee9tue9t+e9uOe9uue9u+e9vOe9vee9v+e+gOe+glwiLDcsXCLnvovnvo3nvo9cIiw0LFwi576VXCIsNCxcIue+m+e+nOe+oOe+oue+o+e+pee+pue+qFwiLDYsXCLnvrFcIl0sW1wiYzE4MFwiLFwi576zXCIsNCxcIue+uue+u+e+vue/gOe/gue/g+e/hOe/hue/h+e/iOe/iee/i+e/jee/j1wiLDQsXCLnv5bnv5fnv5lcIiw1LFwi57+i57+j55ei56uL57KS5rKl6Zq25Yqb55KD5ZOp5L+p6IGU6I6y6L+e6ZWw5buJ5oCc5raf5biY5pWb6IS46ZO+5oGL54K857uD57Ku5YeJ5qKB57Kx6Imv5Lik6L6G6YeP5pm+5Lqu6LCF5pKp6IGK5YOa55aX54eO5a+l6L695r2m5LqG5pKC6ZWj5buW5paZ5YiX6KOC54OI5Yqj54yO55Cz5p6X56O36ZyW5Li06YK76bOe5reL5Yeb6LWB5ZCd5ouO546y6I+x6Zu26b6E6ZOD5Ly2576a5YeM54G16Zm15bKt6aKG5Y+m5Luk5rqc55CJ5qa056Gr6aaP55WZ5YiY55ik5rWB5p+z5YWt6b6Z6IGL5ZKZ56y856q/XCJdLFtcImMyNDBcIixcIue/pOe/p+e/qOe/que/q+e/rOe/ree/r+e/sue/tFwiLDYsXCLnv73nv77nv7/ogILogIfogIjogInogIrogI7ogI/ogJHogJPogJrogJvogJ3ogJ7ogJ/ogKHogKPogKTogKtcIiw1LFwi6ICy6IC06IC56IC66IC86IC+6IGA6IGB6IGE6IGF6IGH6IGI6IGJ6IGO6IGP6IGQ6IGR6IGT6IGV6IGW6IGXXCJdLFtcImMyODBcIixcIuiBmeiBm1wiLDEzLFwi6IGrXCIsNSxcIuiBslwiLDExLFwi6ZqG5Z6E5oui6ZmH5qW85aiE5pCC56+T5ryP6ZmL6Iqm5Y2i6aKF5bqQ54KJ5o6z5Y2k6JmP6bKB6bqT56KM6Zyy6Lev6LWC6bm/5r2e56aE5b2V6ZmG5oiu6am05ZCV6ZOd5L6j5peF5bGl5bGh57yV6JmR5rCv5b6L546H5ruk57u/5bOm5oyb5a2q5rum5Y215Lmx5o6g55Wl5oqh6L2u5Lym5LuR5rKm57q26K666JCd6J66572X6YC76ZSj566p6aqh6KO46JC95rSb6aqG57uc5aaI6bq7546b56CB6JqC6ams6aqC5Zib5ZCX5Z+L5Lmw6bqm5Y2W6L+I6ISJ556S6aaS6Juu5ruh6JST5pu85oWi5ryrXCJdLFtcImMzNDBcIixcIuiBvuiCgeiCguiCheiCiOiCiuiCjVwiLDUsXCLogpTogpXogpfogpnogp7ogqPogqbogqfogqjogqzogrDogrPogrXogrbogrjogrnogrvog4Xog4dcIiw0LFwi6IOPXCIsNixcIuiDmOiDn+iDoOiDouiDo+iDpuiDruiDteiDt+iDueiDu+iDvuiDv+iEgOiEgeiEg+iEhOiEheiEh+iEiOiEi1wiXSxbXCJjMzgwXCIsXCLohIzohJXohJfohJnohJvohJzohJ3ohJ9cIiwxMixcIuiEreiEruiEsOiEs+iEtOiEteiEt+iEuVwiLDQsXCLohL/osKnoipLojKvnm7LmsJPlv5nojr3njKvojIXplJrmr5vnn5vpk4blja/ojILlhpLluL3osozotLjkuYjnjqvmnprmooXphbbpnInnhaTmsqHnnInlqpLplYHmr4/nvo7mmKflr5Dlprnlqprpl6jpl7fku6zokIzokpnmqqznm5/plLDnjJvmoqblrZ/nnK/phprpnaHns5zov7fosJzlvKXnsbPnp5jop4Xms4zonJzlr4bluYLmo4nnnKDnu7XlhpXlhY3li4nlqKnnvIXpnaLoi5fmj4/nnoTol5Dnp5LmuLrlupnlppnolJHnga3msJHmir/nmr/mlY/mgq/pl73mmI7onp/puKPpk63lkI3lkb3osKzmkbhcIl0sW1wiYzQ0MFwiLFwi6IWAXCIsNSxcIuiFh+iFieiFjeiFjuiFj+iFkuiFluiFl+iFmOiFm1wiLDQsXCLohaHohaLohaPohaTohabohajoharohavohazoha/ohbLohbPohbXohbbohbfohbjohoHohoNcIiw0LFwi6IaJ6IaL6IaM6IaN6IaO6IaQ6IaSXCIsNSxcIuiGmeiGmuiGnlwiLDQsXCLohqTohqVcIl0sW1wiYzQ4MFwiLFwi6Ian6Iap6IarXCIsNyxcIuiGtFwiLDUsXCLohrzohr3ohr7ohr/oh4Toh4Xoh4foh4joh4noh4voh41cIiw2LFwi5pG56JiR5qih6Iac56Oo5pGp6a2U5oq55pyr6I6r5aKo6buY5rKr5ryg5a+e6ZmM6LCL54mf5p+Q5ouH54mh5Lqp5aeG5q+N5aKT5pqu5bmV5Yuf5oWV5pyo55uu552m54mn56mG5ou/5ZOq5ZGQ6ZKg6YKj5aic57qz5rCW5LmD5aW26ICQ5aWI5Y2X55S36Zq+5ZuK5oyg6ISR5oG86Ze55reW5ZGi6aaB5YaF5aup6IO95aau6ZyT5YCq5rOl5bC85ouf5L2g5Yy/6IW76YCG5rq66JSr5ouI5bm056K+5pK15o275b+15aiY6YW/6bif5bC/5o2P6IGC5a295ZWu6ZWK6ZWN5raF5oKo5p+g54ue5Yed5a6BXCJdLFtcImM1NDBcIixcIuiHlFwiLDE0LFwi6Iek6Iel6Iem6Ieo6Iep6Ier6IeuXCIsNCxcIuiHtVwiLDUsXCLoh73oh7/oiIPoiIdcIiw0LFwi6IiO6IiP6IiR6IiT6IiVXCIsNSxcIuiIneiIoOiIpOiIpeiIpuiIp+iIqeiIruiIsuiIuuiIvOiIveiIv1wiXSxbXCJjNTgwXCIsXCLoiYDoiYHoiYLoiYPoiYXoiYboiYjoiYroiYzoiY3oiY7oiZBcIiw3LFwi6ImZ6Imb6Imc6Imd6Ime6ImgXCIsNyxcIuiJqeaLp+aznueJm+aJremSrue6veiEk+a1k+WGnOW8hOWltOWKquaAkuWls+aaluiZkOeWn+aMquaHpuezr+ivuuWTpuasp+m4peautOiXleWRleWBtuaypOWVqui2tOeIrOW4leaAleeQtuaLjeaOkueJjOW+mOa5g+a0vuaUgOa9mOebmOejkOebvOeVlOWIpOWPm+S5k+W6nuaXgeiAquiDluaKm+WShuWIqOeCruiijei3keazoeWRuOiDmuWfueijtOi1lOmZqumFjeS9qeaym+WWt+ebhuegsOaKqOeDuea+juW9reiTrOajmuehvOevt+iGqOaci+m5j+aNp+eisOWdr+egkumcueaJueaKq+WKiOeQteavl1wiXSxbXCJjNjQwXCIsXCLoiaroiavoiazoia3oibHoibXoibboibfoibjoibvoibzoioDoioHoioPoioXoioboiofoionoiozoipDoipPoipToipXoipboiproipvoip7oiqDoiqLoiqPoiqfoirLoirXoirboirroirvoirzoir/oi4Doi4Loi4Poi4Xoi4boi4noi5Doi5boi5noi5roi53oi6Loi6foi6joi6noi6roi6zoi63oi67oi7Doi7Loi7Poi7Xoi7boi7hcIl0sW1wiYzY4MFwiLFwi6Iu66Iu8XCIsNCxcIuiMiuiMi+iMjeiMkOiMkuiMk+iMluiMmOiMmeiMnVwiLDksXCLojKnojKrojK7ojLDojLLojLfojLvojL3llaTohL7nlrLnmq7ljLnnl57lg7vlsYHoraznr4flgY/niYfpqpfpo5jmvILnk6LnpajmkofnnqXmi7zpopHotKvlk4HogZjkuZLlnaroi7nokI3lubPlh63nk7bor4TlsY/lnaHms7zpooflqYbnoLTprYTov6vnspXliZbmiZHpk7rku4bojobokaHoj6nokrLln5TmnLTlnIPmma7mtabosLHmm53ngJHmnJ/mrLrmoJbmiJrlprvkuIPlh4TmvIbmn5Lmso/lhbbmo4vlpYfmrafnlabltI7ohJDpvZDml5fnpYjnpYHpqpHotbflsoLkuZ7kvIHlkK/lpZHnoIzlmajmsJTov4TlvIPmsb3ms6PorqvmjpBcIl0sW1wiYzc0MFwiLFwi6Iy+6Iy/6I2B6I2C6I2E6I2F6I2I6I2KXCIsNCxcIuiNk+iNlVwiLDQsXCLojZ3ojaLojbBcIiw2LFwi6I256I266I2+XCIsNixcIuiOh+iOiOiOiuiOi+iOjOiOjeiOj+iOkOiOkeiOlOiOleiOluiOl+iOmeiOmuiOneiOn+iOoVwiLDYsXCLojqzojq3ojq5cIl0sW1wiYzc4MFwiLFwi6I6v6I616I676I6+6I6/6I+C6I+D6I+E6I+G6I+I6I+J6I+L6I+N6I+O6I+Q6I+R6I+S6I+T6I+V6I+X6I+Z6I+a6I+b6I+e6I+i6I+j6I+k6I+m6I+n6I+o6I+r6I+s6I+t5oGw5rS954m15omm6ZKO6ZOF5Y2D6L+B562+5Luf6LCm5Lm+6buU6ZKx6ZKz5YmN5r2c6YGj5rWF6LC05aCR5bWM5qyg5q2J5p6q5ZGb6IWU576M5aKZ6JS35by65oqi5qmH6ZS55pWy5oKE5qGl556n5LmU5L6o5ben6Z6Y5pKs57+Y5bOt5L+P56qN5YiH6IyE5LiU5oCv56qD6ZKm5L615Lqy56em55C05Yuk6Iq55pOS56a95a+d5rKB6Z2S6L275rCi5YC+5Y2/5riF5pOO5pm05rCw5oOF6aG36K+35bqG55C856m356eL5LiY6YKx55CD5rGC5Zua6YWL5rOF6LaL5Yy66JuG5puy6Lqv5bGI6amx5rigXCJdLFtcImM4NDBcIixcIuiPruiPr+iPs1wiLDQsXCLoj7roj7voj7zoj77oj7/okIDokILokIXokIfokIjokInokIrokJDokJJcIiw1LFwi6JCZ6JCa6JCb6JCeXCIsNSxcIuiQqVwiLDcsXCLokLJcIiw1LFwi6JC56JC66JC76JC+XCIsNyxcIuiRh+iRiOiRiVwiXSxbXCJjODgwXCIsXCLokYpcIiw2LFwi6JGSXCIsNCxcIuiRmOiRneiRnuiRn+iRoOiRouiRpFwiLDQsXCLokaroka7oka/okbDokbLokbTokbfokbnokbvokbzlj5blqLbpvovotqPljrvlnIjpoqfmnYPphpvms4nlhajnl4rmi7PniqzliLjlip3nvLrngpTnmLjljbTpuYrmprfnoa7pm4Doo5nnvqTnhLbnh4Plhonmn5Pnk6Tlo6TmlJjlmrforqnppbbmibDnu5Xmg7nng63lo6zku4Hkurrlv43pn6fku7vorqTliIPlpornuqvmiZTku43ml6XmiI7ojLjok4nojaPono3nhpTmurblrrnnu5Llhpfmj4nmn5TogonojLnooJXlhJLlrbrlpoLovrHkubPmsZ3lhaXopKXova/pmK7olYrnkZ7plJDpl7Dmtqboi6XlvLHmkpLmtJLokKjoha7ps4PloZ7otZvkuInlj4FcIl0sW1wiYzk0MFwiLFwi6JG9XCIsNCxcIuiSg+iShOiSheiShuiSiuiSjeiSj1wiLDcsXCLokpjokprokpvokp3okp7okp/okqDokqJcIiwxMixcIuiSsOiSseiSs+iSteiStuiSt+iSu+iSvOiSvuiTgOiTguiTg+iTheiThuiTh+iTiOiTi+iTjOiTjuiTj+iTkuiTlOiTleiTl1wiXSxbXCJjOTgwXCIsXCLok5hcIiw0LFwi6JOe6JOh6JOi6JOk6JOnXCIsNCxcIuiTreiTruiTr+iTsVwiLDEwLFwi6JO96JO+6JSA6JSB6JSC5Lye5pWj5qGR5ZeT5Lin5pCU6aqa5omr5auC55Gf6Imy5rap5qOu5YOn6I6O56CC5p2A5Yi55rKZ57qx5YK75ZWl54We562b5pmS54+K6Iur5p2J5bGx5Yig54W96KGr6Zeq6ZmV5pOF6LWh6Iaz5ZaE5rGV5omH57yu5aKS5Lyk5ZWG6LWP5pmM5LiK5bCa6KOz5qKi5o2O56iN54On6IqN5Yu66Z+25bCR5ZOo6YK157uN5aWi6LWK6JuH6IiM6IiN6LWm5pGE5bCE5oWR5raJ56S+6K6+56C355Sz5ZG75Ly46Lqr5rex5aig57uF56We5rKI5a6h5am255Sa6IK+5oWO5riX5aOw55Sf55Sl54my5Y2H57uzXCJdLFtcImNhNDBcIixcIuiUg1wiLDgsXCLolI3olI7olI/olJDolJLolJTolJXolJbolJjolJnolJvolJzolJ3olJ7olKDolKJcIiw4LFwi6JStXCIsOSxcIuiUvlwiLDQsXCLolYTolYXolYbolYfolYtcIiwxMF0sW1wiY2E4MFwiLFwi6JWX6JWY6JWa6JWb6JWc6JWd6JWfXCIsNCxcIuiVpeiVpuiVp+iVqVwiLDgsXCLolbPolbXolbbolbfolbjolbzolb3olb/oloDoloHnnIHnm5vlianog5zlnKPluIjlpLHni67mlr3mub/or5flsLjombHljYHnn7Pmi77ml7bku4Dpo5/omoDlrp7or4blj7Lnn6Lkvb/lsY7pqbblp4vlvI/npLrlo6vkuJbmn7/kuovmi63oqpPpgJ3lir/mmK/ll5zlmazpgILku5Xkvo3ph4rppbDmsI/luILmgYPlrqTop4bor5XmlLbmiYvpppblrojlr7/mjojllK7lj5fnmKblhb3olKzmnqLmorPmrormipLovpPlj5ToiJLmt5Hnlo/kuabotY7lrbDnhp/olq/mmpHmm5nnvbLonIDpu43pvKDlsZ7mnK/ov7DmoJHmnZ/miI3nq5blooXlurbmlbDmvLFcIl0sW1wiY2I0MFwiLFwi6JaC6JaD6JaG6JaIXCIsNixcIuiWkFwiLDEwLFwi6JadXCIsNixcIuiWpeiWpuiWp+iWqeiWq+iWrOiWreiWsVwiLDUsXCLolrjolrpcIiw2LFwi6JeCXCIsNixcIuiXilwiLDQsXCLol5Hol5JcIl0sW1wiY2I4MFwiLFwi6JeU6JeWXCIsNSxcIuiXnVwiLDYsXCLol6Xol6bol6fol6jol6pcIiwxNCxcIuaBleWIt+iAjeaRlOihsOeUqeW4heagk+aLtOmcnOWPjOeIveiwgeawtOedoeeojuWQrueerOmhuuiInOivtOehleaclOeDgeaWr+aSleWYtuaAneengeWPuOS4neatu+iChuWvuuWXo+Wbm+S8uuS8vOmlsuW3s+advuiAuOaAgumigumAgeWui+iuvOivteaQnOiJmOaTnuWXveiLj+mFpeS/l+e0oOmAn+eyn+WDs+Whkea6r+Wuv+ivieiCg+mFuOiSnOeul+iZvemai+maj+e7pemrk+eijuWygeepl+mBgumap+eln+WtmeaNn+esi+iTkeaireWUhue8qeeQkOe0oumUgeaJgOWhjOS7luWug+WlueWhlFwiXSxbXCJjYzQwXCIsXCLol7nol7rol7zol73ol77omIBcIiw0LFwi6JiGXCIsMTAsXCLomJLomJPomJTomJXomJdcIiwxNSxcIuiYqOiYqlwiLDEzLFwi6Ji56Ji66Ji76Ji96Ji+6Ji/6JmAXCJdLFtcImNjODBcIixcIuiZgVwiLDExLFwi6JmS6JmT6JmVXCIsNCxcIuiZm+iZnOiZneiZn+iZoOiZoeiZo1wiLDcsXCLnja3mjJ7ouYvouI/og47oi5Tmiqzlj7Dms7DphZ7lpKrmgIHmsbDlnY3mkYrotKrnmKvmu6nlnZvmqoDnl7Dmva3osK3osIjlnabmr6/oopLnorPmjqLlj7nngq3msaTloZjmkKrloILmo6DohpvllJDns5blgJjourrmt4zotp/ng6vmjo/mtpvmu5Tnu6bokITmoYPpgIPmt5jpmbborqjlpZfnibnol6Tohb7nlrzoqormoq/liZTouKLplJHmj5DpopjouYTllbzkvZPmm7/lmo/mg5XmtpXliYPlsYnlpKnmt7vloavnlLDnlJzmgazoiJTohYbmjJHmnaHov6LnnLrot7PotLTpk4HluJbljoXlkKzng4NcIl0sW1wiY2Q0MFwiLFwi6Jmt6Jmv6Jmw6JmyXCIsNixcIuiag1wiLDYsXCLomo5cIiw0LFwi6JqU6JqWXCIsNSxcIuianlwiLDQsXCLomqXomqbomqvomq3omq7omrLomrPomrfomrjomrnomrtcIiw0LFwi6JuB6JuC6JuD6JuF6JuI6JuM6JuN6JuS6JuT6JuV6JuW6JuX6Jua6JucXCJdLFtcImNkODBcIixcIuibneiboOiboeibouibo+ibpeibpuibp+ibqOibquibq+ibrOibr+ibteibtuibt+ibuuibu+ibvOibveibv+icgeichOicheichuici+icjOicjuicj+ickOickeiclOicluaxgOW7t+WBnOS6reW6reaMuuiJh+mAmuahkOmFruees+WQjOmTnOW9pOerpeahtuaNheetkue7n+eXm+WBt+aKleWktOmAj+WHuOeng+eqgeWbvuW+kumAlOa2guWxoOWcn+WQkOWFlOa5jeWbouaOqOmik+iFv+icleikqumAgOWQnuWxr+iHgOaLluaJmOiEsem4temZgOmprumpvOakreWmpeaLk+WUvuaMluWTh+ibmea0vOWog+eTpuiinOatquWkluixjOW8r+a5vueOqemhveS4uOeDt+WujOeil+aMveaZmuealuaDi+Wum+WpieS4h+iFleaxqueOi+S6oeaeiee9keW+gOaXuuacm+W/mOWmhOWogVwiXSxbXCJjZTQwXCIsXCLonJnonJvonJ3onJ/onKDonKTonKbonKfonKjonKronKvonKzonK3onK/onLDonLLonLPonLXonLbonLjonLnonLronLzonL3onYBcIiw2LFwi6J2K6J2L6J2N6J2P6J2Q6J2R6J2S6J2U6J2V6J2W6J2Y6J2aXCIsNSxcIuidoeidouidplwiLDcsXCLona/onbHonbLonbPonbVcIl0sW1wiY2U4MFwiLFwi6J236J246J256J266J2/6J6A6J6B6J6E6J6G6J6H6J6J6J6K6J6M6J6OXCIsNCxcIuielOieleieluiemFwiLDYsXCLonqBcIiw0LFwi5beN5b6u5Y2x6Z+m6L+d5qGF5Zu05ZSv5oOf5Li65r2N57u06IuH6JCO5aeU5Lyf5Lyq5bC+57qs5pyq6JSa5ZGz55WP6IOD5ZaC6a2P5L2N5rit6LCT5bCJ5oWw5Y2r55if5rip6JqK5paH6Ze757q55ZC756iz57SK6Zeu5Zeh57+B55Ou5oyd6JyX5rah56qd5oiR5pah5Y2n5o+h5rKD5ber5ZGc6ZKo5LmM5rGh6K+s5bGL5peg6Iqc5qKn5ZC+5ZC05q+L5q2m5LqU5o2C5Y2I6Iie5LyN5L6u5Z2e5oiK6Zu+5pmk54mp5Yu/5Yqh5oKf6K+v5piU54aZ5p6Q6KW/56GS55+95pmw5Zi75ZC46ZSh54m6XCJdLFtcImNmNDBcIixcIuiepeiepuiep+ieqeiequieruiesOieseiesuietOietuiet+ieuOieueieu+ievOievuiev+ifgVwiLDQsXCLon4fon4jon4non4xcIiw0LFwi6J+UXCIsNixcIuifnOifneifnuifn+ifoeifouifo+ifpOifpuifp+ifqOifqeifq+ifrOifreifr1wiLDldLFtcImNmODBcIixcIuifuuifu+ifvOifveifv+iggOiggeigguighFwiLDUsXCLooItcIiw3LFwi6KCU6KCX6KCY6KCZ6KCa6KCcXCIsNCxcIuigo+eogOaBr+W4jOaCieiGneWkleaDnOeGhOeDr+a6quaxkOeKgOaqhOiireW4reS5oOWqs+WWnOmTo+a0l+ezu+mameaIj+e7hueejuiZvuWMo+mcnui+luaah+WzoeS+oOeLreS4i+WOpuWkj+WQk+aOgOmUqOWFiOS7memynOe6pOWSuOi0pOihlOiIt+mXsua2juW8puWrjOaYvumZqeeOsOeMruWOv+iFuummhee+oeWuqumZt+mZkOe6v+ebuOWOoumVtummmeeuseilhOa5mOS5oee/lOelpeivpuaDs+WTjeS6q+mhueW3t+apoeWDj+WQkeixoeiQp+ehnemchOWJiuWTruWao+mUgOa2iOWutea3huaZk1wiXSxbXCJkMDQwXCIsXCLooKRcIiwxMyxcIuigs1wiLDUsXCLooLrooLvooL3ooL7ooL/ooYHooYLooYPooYZcIiw1LFwi6KGOXCIsNSxcIuihleihluihmOihmlwiLDYsXCLooabooafooarooa3ooa/oobHoobPoobToobXoobboobjoobnoobpcIl0sW1wiZDA4MFwiLFwi6KG76KG86KKA6KKD6KKG6KKH6KKJ6KKK6KKM6KKO6KKP6KKQ6KKR6KKT6KKU6KKV6KKXXCIsNCxcIuiinVwiLDQsXCLooqPooqVcIiw1LFwi5bCP5a2d5qCh6IKW5ZW456yR5pWI5qWU5Lqb5q2H6J2O6Z6L5Y2P5oyf5pC66YKq5pac6IOB6LCQ5YaZ5qKw5Y246J+55oeI5rOE5rO76LCi5bGR6Jaq6Iqv6ZSM5qyj6L6b5paw5b+75b+D5L+h6KGF5pif6IWl54yp5oO65YW05YiR5Z6L5b2i6YKi6KGM6YaS5bm45p2P5oCn5aeT5YWE5Ye26IO45YyI5rG56ZuE54aK5LyR5L+u576e5py95ZeF6ZSI56eA6KKW57uj5aKf5oiM6ZyA6Jma5ZiY6aG75b6Q6K646JOE6YWX5Y+Z5pet5bqP55Wc5oGk57Wu5am/57uq57ut6L2p5Zan5a6j5oKs5peL546EXCJdLFtcImQxNDBcIixcIuiirOiiruiir+iisOiislwiLDQsXCLoorjoornoorroorvoor3oor7oor/oo4Doo4Poo4Too4foo4joo4roo4voo4zoo43oo4/oo5Doo5Hoo5Poo5boo5foo5pcIiw0LFwi6KOg6KOh6KOm6KOn6KOpXCIsNixcIuijsuijteijtuijt+ijuuiju+ijveijv+ikgOikgeikg1wiLDVdLFtcImQxODBcIixcIuikieiki1wiLDQsXCLopJHopJRcIiw0LFwi6KScXCIsNCxcIuikouiko+ikpOikpuikp+ikqOikqeikrOikreikruikr+ikseiksuiks+ikteikt+mAieeZo+ecqee7mumdtOiWm+WtpueptOmbquihgOWLi+eGj+W+quaXrOivouWvu+mpr+W3oeauieaxm+iureiur+mAiui/heWOi+aKvOm4pum4reWRgOS4q+iKveeJmeianOW0luihmea2r+mbheWTkeS6muiutueEieWSvemYieeDn+a3ueebkOS4peeglOickuWyqeW7tuiogOminOmYjueCjuayv+WlhOaOqeecvOihjea8lOiJs+WgsOeHleWOjOegmumbgeWUgeW9pueEsOWutOiwmumqjOaug+Wkrum4r+enp+adqOaJrOS9r+eWoee+iua0i+mYs+awp+S7sOeXkuWFu+agt+a8vumCgOiFsOWmlueRtlwiXSxbXCJkMjQwXCIsXCLopLhcIiw4LFwi6KWC6KWD6KWFXCIsMjQsXCLopaBcIiw1LFwi6KWnXCIsMTksXCLopbxcIl0sW1wiZDI4MFwiLFwi6KW96KW+6KaA6KaC6KaE6KaF6KaHXCIsMjYsXCLmkYflsKfpgaXnqpHosKPlp5rlkqzoiIDoja/opoHogIDmpLDlmY7ogLbniLfph47lhrbkuZ/pobXmjpbkuJrlj7bmm7PohYvlpJzmtrLkuIDlo7nljLvmj5bpk7Hkvp3kvIrooaPpopDlpLfpgZfnp7vku6rog7DnlpHmsoLlrpzlp6jlvZ3mpIXomoHlgJrlt7LkuZnnn6Pku6XoibrmipHmmJPpgpHlsbnkur/lvbnoh4bpgLjogoTnlqvkuqboo5TmhI/mr4Xlv4bkuYnnm4rmuqLor6Porq7osIror5HlvILnv7znv4znu47ojLXojavlm6Dmrrfpn7PpmLTlp7vlkJ/pk7bmt6vlr4Xppa7lsLnlvJXpmpBcIl0sW1wiZDM0MFwiLFwi6KaiXCIsMzAsXCLop4Pop43op5Pop5Top5Xop5fop5jop5nop5vop53op5/op6Dop6Hop6Lop6Top6fop6jop6nop6rop6zop63op67op7Dop7Hop7Lop7RcIiw2XSxbXCJkMzgwXCIsXCLop7tcIiw0LFwi6KiBXCIsNSxcIuioiFwiLDIxLFwi5Y2w6Iux5qix5am06bmw5bqU57yo6I656JCk6JCl6I2n6J2H6L+O6LWi55uI5b2x6aKW56Gs5pig5ZOf5oul5L2j6IeD55eI5bq46ZuN6LiK6Ju55ZKP5rOz5raM5rC45oG/5YuH55So5bm95LyY5oKg5b+n5bCk55Sx6YKu6ZOA54q55rK55ri46YWJ5pyJ5Y+L5Y+z5L2R6YeJ6K+x5Y+I5bm86L+C5rek5LqO55uC5qaG6Jme5oSa6IiG5L2Z5L+e6YC+6bG85oSJ5rid5riU6ZqF5LqI5aix6Zuo5LiO5bG/56a55a6H6K+t5769546J5Z+f6IqL6YOB5ZCB6YGH5Za75bOq5b6h5oSI5qyy54ux6IKy6KqJXCJdLFtcImQ0NDBcIixcIuionlwiLDMxLFwi6Ki/XCIsOCxcIuipiVwiLDIxXSxbXCJkNDgwXCIsXCLoqZ9cIiwyNSxcIuipulwiLDYsXCLmtbTlr5Poo5XpooTosavpqa3puLPmuIrlhqTlhYPlnqPoooHljp/mj7TovpXlm63lkZjlnIbnjL/mupDnvJjov5zoi5HmhL/mgKjpmaLmm7Dnuqbotorot4PpkqXlsrPnsqTmnIjmgqbpmIXogJjkupHpg6fljIDpmajlhYHov5DolbTphZ3mmZXpn7XlrZXljJ3noLjmnYLmoL3lk4nngb7lrrDovb3lho3lnKjlkrHmlJLmmoLotZ7otYPohI/okazpga3ns5/lh7/ol7vmnqPml6nmvqHomqTouoHlmarpgKDnmoLngbbnh6XotKPmi6nliJnms73otLzmgI7lop7mho7mm77otaDmiY7llrPmuKPmnK3ovadcIl0sW1wiZDU0MFwiLFwi6KqBXCIsNyxcIuiqi1wiLDcsXCLoqpRcIiw0Nl0sW1wiZDU4MFwiLFwi6KuDXCIsMzIsXCLpk6Hpl7jnnKjmoIXmpqjlkovkuY3ngrjor4jmkZjmlovlroXnqoTlgLrlr6jnnrvmr6Hoqbnnspjmsr7nm4/mlqnovpfltK3lsZXomLjmoIjljaDmiJjnq5nmuZvnu73mqJ/nq6DlvbDmvLPlvKDmjozmtqjmnZbkuIjluJDotKbku5fog4DnmLTpmpzmi5vmmK3mib7msrzotbXnhafnvanlhYbogoflj6zpga7mipjlk7Lom7DovpnogIXplJfolJfov5nmtZnnj43mlp/nnJ/nlITnoKfoh7votJ7pkojkvqbmnpXnlrnor4rpnIfmjK/plYfpmLXokrjmjKPnnYHlvoHni7DkuonmgJTmlbTmi6/mraPmlL9cIl0sW1wiZDY0MFwiLFwi6KukXCIsMzQsXCLorIhcIiwyN10sW1wiZDY4MFwiLFwi6Kyk6Kyl6KynXCIsMzAsXCLluKfnl4fpg5Hor4Hoip3mnp3mlK/lkLHonJjnn6XogqLohILmsYHkuYvnu4fogYznm7TmpI3mrpbmiaflgLzkvoTlnYDmjIfmraLotr7lj6rml6jnurjlv5fmjJrmjrfoh7Poh7Tnva7luJzls5nliLbmmbrnp6nnqJrotKjngpnnl5Tmu57msrvnqpLkuK3nm4Xlv6Dpkp/oobfnu4jnp43ogr/ph43ku7LkvJfoiJ/lkajlt57mtLLor4znsqXovbTogpjluJrlkpLnmrHlrpnmmLzpqqTnj6DmoKrom5vmnLHnjKror7jor5vpgJDnq7nng5vnha7mi4TnnqnlmLHkuLvokZfmn7Hliqnom4DotK7pk7jnrZFcIl0sW1wiZDc0MFwiLFwi6K2GXCIsMzEsXCLoradcIiw0LFwi6K2tXCIsMjVdLFtcImQ3ODBcIixcIuiuh1wiLDI0LFwi6K6s6K6x6K676K+H6K+Q6K+q6LCJ6LCe5L2P5rOo56Wd6am75oqT54iq5ou95LiT56CW6L2s5pKw6LWa56+G5qGp5bqE6KOF5aaG5pKe5aOu54q25qSO6ZSl6L+96LWY5Z2g57yA6LCG5YeG5o2J5ouZ5Y2T5qGM55Ci6IyB6YWM5ZWE552A54G85rWK5YW55ZKo6LWE5ae/5ruL5reE5a2c57Sr5LuU57G95ruT5a2Q6Ieq5riN5a2X6ayD5qOV6Liq5a6X57u85oC757q16YK56LWw5aWP5o+N56ef6Laz5Y2S5peP56WW6K+F6Zi757uE6ZK757qC5Zi06YaJ5pyA572q5bCK6YG15pio5bem5L2Q5p+e5YGa5L2c5Z2Q5bqnXCJdLFtcImQ4NDBcIixcIuiwuFwiLDgsXCLosYLosYPosYTosYXosYjosYrosYvosY1cIiw3LFwi6LGW6LGX6LGY6LGZ6LGbXCIsNSxcIuixo1wiLDYsXCLosaxcIiw2LFwi6LG06LG16LG26LG36LG7XCIsNixcIuiyg+iyhOiyhuiyh1wiXSxbXCJkODgwXCIsXCLosojosovoso1cIiw2LFwi6LKV6LKW6LKX6LKZXCIsMjAsXCLkuo3kuIzlhYDkuJDlu7/ljYXkuJXkupjkuJ7prLLlrazlmankuKjnprrkuL/ljJXkuYflpK3niLvlja7msJDlm5/og6Tpppfmr5Pnnb7pvJfkuLbkup/pvJDkuZzkuankupPoiojlrZvllazlmI/ku4Tljo3ljp3ljqPljqXljq7pnaXotZ3ljJrlj7XljKbljK7ljL7otZzljabljaPliILliIjliI7liK3liLPliL/liYDliYzliZ7liaHliZzokq/lib3lioLlioHlipDlipPlhoLnvZTkurvku4Pku4nku4Lku6jku6Hku6vku57kvJvku7PkvKLkvaTku7XkvKXkvKfkvInkvKvkvZ7kvafmlLjkvZrkvZ1cIl0sW1wiZDk0MFwiLFwi6LKuXCIsNjJdLFtcImQ5ODBcIixcIuizrVwiLDMyLFwi5L2f5L2X5Lyy5Ly95L225L205L6R5L6J5L6D5L6P5L2+5L275L6q5L285L6s5L6U5L+m5L+o5L+q5L+F5L+a5L+j5L+c5L+R5L+f5L+45YCp5YGM5L+z5YCs5YCP5YCu5YCt5L++5YCc5YCM5YCl5YCo5YG+5YGD5YGV5YGI5YGO5YGs5YG75YKl5YKn5YKp5YK65YOW5YSG5YOt5YOs5YOm5YOu5YSH5YSL5Lud5rC95L2Y5L2l5L+O6b6g5rGG57G05YWu5be96buJ6aaY5YaB5aSU5Yu55YyN6KiH5YyQ5Yer5aSZ5YWV5Lqg5YWW5Lqz6KGu6KKk5Lq16ISU6KOS56aA5ay06KCD57645Yar5Yax5Ya95Ya8XCJdLFtcImRhNDBcIixcIui0jlwiLDE0LFwi6LSg6LWR6LWS6LWX6LWf6LWl6LWo6LWp6LWq6LWs6LWu6LWv6LWx6LWy6LW4XCIsOCxcIui2gui2g+i2hui2h+i2iOi2iei2jFwiLDQsXCLotpLotpPotpVcIiw5LFwi6Lag6LahXCJdLFtcImRhODBcIixcIui2oui2pFwiLDEyLFwi6Lay6La26La36La56La76La96LeA6LeB6LeC6LeF6LeH6LeI6LeJ6LeK6LeN6LeQ6LeS6LeT6LeU5YeH5YaW5Yai5Yal6K6g6K6m6K6n6K6q6K606K616K636K+C6K+D6K+L6K+P6K+O6K+S6K+T6K+U6K+W6K+Y6K+Z6K+c6K+f6K+g6K+k6K+o6K+p6K+u6K+w6K+z6K+26K+56K+86K+/6LCA6LCC6LCE6LCH6LCM6LCP6LCR6LCS6LCU6LCV6LCW6LCZ6LCb6LCY6LCd6LCf6LCg6LCh6LCl6LCn6LCq6LCr6LCu6LCv6LCy6LCz6LC16LC25Y2p5Y266Zid6Zii6Zih6Zix6Ziq6Zi96Zi86ZmC6ZmJ6ZmU6Zmf6Zmn6Zms6Zmy6Zm06ZqI6ZqN6ZqX6Zqw6YKX6YKb6YKd6YKZ6YKs6YKh6YK06YKz6YK26YK6XCJdLFtcImRiNDBcIixcIui3lei3mOi3mei3nOi3oOi3oei3oui3pei3pui3p+i3qei3rei3rui3sOi3sei3sui3tOi3tui3vOi3vlwiLDYsXCLouIbouIfouIjouIvouI3ouI7ouJDouJHouJLouJPouJVcIiw3LFwi6Lig6Lih6LikXCIsNCxcIui4q+i4rei4sOi4sui4s+i4tOi4tui4t+i4uOi4u+i4vOi4vlwiXSxbXCJkYjgwXCIsXCLouL/ouYPouYXouYbouYxcIiw0LFwi6LmTXCIsNSxcIui5mlwiLDExLFwi6Lmn6Lmo6Lmq6Lmr6Lmu6Lmx6YK46YKw6YOP6YOF6YK+6YOQ6YOE6YOH6YOT6YOm6YOi6YOc6YOX6YOb6YOr6YOv6YO+6YSE6YSi6YSe6YSj6YSx6YSv6YS56YWD6YWG5YiN5aWC5Yqi5Yqs5Yqt5Yq+5ZO/5YuQ5YuW5Yuw5Y+f54eu55+N5bu05Ye15Ye86ayv5Y625byB55Wa5bev5Z2M5Z6p5Z6h5aG+5aK85aOF5aOR5Zyp5Zys5Zyq5Zyz5Zy55Zyu5Zyv5Z2c5Zy75Z2C5Z2p5Z6F5Z2r5Z6G5Z285Z275Z2o5Z2t5Z225Z2z5Z6t5Z6k5Z6M5Z6y5Z+P5Z6n5Z605Z6T5Z6g5Z+V5Z+Y5Z+a5Z+Z5Z+S5Z645Z+05Z+v5Z+45Z+k5Z+dXCJdLFtcImRjNDBcIixcIui5s+i5tei5t1wiLDQsXCLoub3oub7ouoDouoLouoPouoTouobouohcIiw2LFwi6LqR6LqS6LqT6LqVXCIsNixcIui6nei6n1wiLDExLFwi6Lqt6Lqu6Lqw6Lqx6LqzXCIsNixcIui6u1wiLDddLFtcImRjODBcIixcIui7g1wiLDEwLFwi6LuPXCIsMjEsXCLloIvloI3ln73ln63loIDloJ7loJnloYTloKDloaXloazlooHloonloprlooDppqjpvJnmh7/oibnoib3oib/oio/oioroiqjoioToio7oipHoipfoipnoiqvoirjoir7oirDoi4joi4roi6Poipjoirfoiq7oi4voi4zoi4HoiqnoirToiqHoiqroip/oi4Toi47oiqToi6HojInoi7foi6TojI/ojIfoi5zoi7Toi5Loi5jojIzoi7voi5PojJHojJrojIbojJTojJXoi6Doi5XojJzojZHojZvojZzojIjojpLojLzojLTojLHojpvojZ7ojK/ojY/ojYfojYPojZ/ojYDojJfojaDojK3ojLrojLPojabojaVcIl0sW1wiZGQ0MFwiLFwi6LulXCIsNjJdLFtcImRkODBcIixcIui8pFwiLDMyLFwi6I2o6Iyb6I2p6I2s6I2q6I2t6I2u6I6w6I246I6z6I606I6g6I6q6I6T6I6c6I6F6I286I626I6p6I296I646I276I6Y6I6e6I6o6I666I686I+B6JCB6I+l6I+Y5aCH6JCY6JCL6I+d6I+96I+W6JCc6JC46JCR6JCG6I+U6I+f6JCP6JCD6I+46I+56I+q6I+F6I+A6JCm6I+w6I+h6JGc6JGR6JGa6JGZ6JGz6JKH6JKI6JG66JKJ6JG46JC86JGG6JGp6JG26JKM6JKO6JCx6JGt6JOB6JON6JOQ6JOm6JK96JOT6JOK6JK/6JK66JOg6JKh6JK56JK06JKX6JOl6JOj6JSM55SN6JS46JOw6JS56JSf6JS6XCJdLFtcImRlNDBcIixcIui9hVwiLDMyLFwi6L2q6L6A6L6M6L6S6L6d6L6g6L6h6L6i6L6k6L6l6L6m6L6n6L6q6L6s6L6t6L6u6L6v6L6y6L6z6L606L616L636L646L666L676L686L6/6L+A6L+D6L+GXCJdLFtcImRlODBcIixcIui/iVwiLDQsXCLov4/ov5Lov5bov5fov5rov6Dov6Hov6Pov6fov6zov6/ov7Hov7Lov7Tov7Xov7bov7rov7vov7zov77ov7/pgIfpgIjpgIzpgI7pgJPpgJXpgJjolZbolLvok7/ok7zolZnolYjolajolaTolZ7olbrnnqLolYPolbLolbvolqTolqjolofolo/olbnolq7olpzoloXolrnolrfolrDol5Pol4Hol5zol7/omKfomIXomKnomJbomLzlu77lvIjlpLzlpYHogLflpZXlpZrlpZjljI/lsKLlsKXlsKzlsLTmiYzmiarmip/mirvmi4rmi5rmi5fmi67mjKLmi7bmjLnmjYvmjYPmjq3mj7bmjbHmjbrmjo7mjrTmja3mjqzmjormjanmjq7mjrzmj7Lmj7jmj6Dmj7/mj4Tmj57mj47mkZLmj4bmjr7mkYXmkYHmkIvmkJvmkKDmkIzmkKbmkKHmkZ7mkoTmka3mkpZcIl0sW1wiZGY0MFwiLFwi6YCZ6YCc6YCj6YCk6YCl6YCnXCIsNSxcIumAsFwiLDQsXCLpgLfpgLnpgLrpgL3pgL/pgYDpgYPpgYXpgYbpgYhcIiw0LFwi6YGO6YGU6YGV6YGW6YGZ6YGa6YGcXCIsNSxcIumBpOmBpumBp+mBqemBqumBq+mBrOmBr1wiLDQsXCLpgbZcIiw2LFwi6YG+6YKBXCJdLFtcImRmODBcIixcIumChOmChemChumCh+mCiemCiumCjFwiLDQsXCLpgpLpgpTpgpbpgpjpgprpgpzpgp7pgp/pgqDpgqTpgqXpgqfpgqjpgqnpgqvpgq3pgrLpgrfpgrzpgr3pgr/pg4Dmkbrmkrfmkrjmkpnmkrrmk4Dmk5Dmk5fmk6Tmk6LmlInmlKXmlK7lvIvlv5LnlJnlvJHljZ/lj7Hlj73lj6nlj6jlj7vlkJLlkJblkIblkYvlkZLlkZPlkZTlkZblkYPlkKHlkZflkZnlkKPlkLLlkoLlkpTlkbflkbHlkaTlkprlkpvlkoTlkbblkablkp3lk5Dlkq3lk4LlkrTlk5Llkqflkqblk5Plk5TlkbLlkqPlk5Xlkrvlkr/lk4zlk5nlk5rlk5zlkqnlkqrlkqTlk53lk4/lk57llJvlk6fllKDlk73llJTlk7PllKLllKPllI/llJHllKfllKrllafllo/llrXllYnlla3llYHllZXllL/llZDllLxcIl0sW1wiZTA0MFwiLFwi6YOC6YOD6YOG6YOI6YOJ6YOL6YOM6YON6YOS6YOU6YOV6YOW6YOY6YOZ6YOa6YOe6YOf6YOg6YOj6YOk6YOl6YOp6YOq6YOs6YOu6YOw6YOx6YOy6YOz6YO16YO26YO36YO56YO66YO76YO86YO/6YSA6YSB6YSD6YSFXCIsMTksXCLphJrphJvphJxcIl0sW1wiZTA4MFwiLFwi6YSd6YSf6YSg6YSh6YSkXCIsMTAsXCLphLDphLJcIiw2LFwi6YS6XCIsOCxcIumFhOWUt+WVluWVteWVtuWVt+WUs+WUsOWVnOWWi+WXkuWWg+WWseWWueWWiOWWgeWWn+WVvuWXluWWkeWVu+WXn+WWveWWvuWWlOWWmeWXquWXt+WXieWYn+WXkeWXq+WXrOWXlOWXpuWXneWXhOWXr+WXpeWXsuWXs+WXjOWXjeWXqOWXteWXpOi+lOWYnuWYiOWYjOWYgeWYpOWYo+WXvuWYgOWYp+WYreWZmOWYueWZl+WYrOWZjeWZouWZmeWZnOWZjOWZlOWahuWZpOWZseWZq+WZu+WZvOWaheWak+War+WblOWbl+WbneWboeWbteWbq+WbueWbv+WchOWciuWcieWcnOW4j+W4meW4lOW4keW4seW4u+W4vFwiXSxbXCJlMTQwXCIsXCLphYXphYfphYjphZHphZPphZTphZXphZbphZjphZnphZvphZzphZ/phaDphabphafphajphavpha3phbPphbrphbvphbzphoBcIiw0LFwi6YaG6YaI6YaK6YaO6YaP6YaTXCIsNixcIumGnFwiLDUsXCLphqRcIiw1LFwi6Yar6Yas6Yaw6Yax6Yay6Yaz6Ya26Ya36Ya46Ya56Ya7XCJdLFtcImUxODBcIixcIumGvFwiLDEwLFwi6YeI6YeL6YeQ6YeSXCIsOSxcIumHnVwiLDgsXCLluLfluYTluZTluZvluZ7luaHlsozlsbrlso3lspDlspblsojlspjlspnlspHlsprlspzlsrXlsqLlsr3lsqzlsqvlsrHlsqPls4Hlsrfls4Tls5Lls6Tls4vls6XltILltIPltKfltKbltK7ltKTltJ7ltIbltJvltZjltL7ltLTltL3ltazltZvlta/ltZ3ltavltYvltYrltanltbTltoLltpnltp3osbPltrflt4XlvbPlvbflvoLlvoflvonlvozlvpXlvpnlvpzlvqjlvq3lvrXlvrzooaLlvaHniq3nirDnirTnirfnirjni4Pni4Hni47ni43ni5Lni6jni6/ni6nni7Lni7Tni7fnjIHni7PnjIPni7pcIl0sW1wiZTI0MFwiLFwi6YemXCIsNjJdLFtcImUyODBcIixcIumIpVwiLDMyLFwi54u754yX54yT54yh54yK54ye54yd54yV54yi54y554yl54ys54y454yx542Q542N542X542g542s542v542+6Iib5aSl6aOn5aSk5aSC6aWj6aWnXCIsNSxcIumltOmlt+mlvemmgOmmhOmmh+mmiummjemmkOmmkemmk+mmlOmmleW6gOW6keW6i+W6luW6peW6oOW6ueW6teW6vuW6s+i1k+W7kuW7keW7m+W7qOW7quiGuuW/hOW/ieW/luW/j+aAg+W/ruaAhOW/oeW/pOW/vuaAheaAhuW/quW/reW/uOaAmeaAteaApuaAm+aAj+aAjeaAqeaAq+aAiuaAv+aAoeaBuOaBueaBu+aBuuaBglwiXSxbXCJlMzQwXCIsXCLpiYZcIiw0NSxcIumJtVwiLDE2XSxbXCJlMzgwXCIsXCLpioZcIiw3LFwi6YqPXCIsMjQsXCLmgarmgb3mgpbmgprmgq3mgp3mgoPmgpLmgozmgpvmg6zmgrvmgrHmg53mg5jmg4bmg5rmgrTmhKDmhKbmhJXmhKPmg7TmhIDmhI7mhKvmhYrmhbXmhqzmhpTmhqfmhrfmh5Tmh7Xlv53pmrPpl6npl6vpl7Hpl7Ppl7Xpl7bpl7zpl77pmIPpmITpmIbpmIjpmIrpmIvpmIzpmI3pmI/pmJLpmJXpmJbpmJfpmJnpmJrkuKzniL/miJXmsLXmsZTmsZzmsYrmsqPmsoXmspDmspTmsozmsajmsanmsbTmsbbmsobmsqnms5Dms5Tmsq3ms7fms7jms7Hms5fmsrLms6Dms5bms7rms6vms67msrHms5Pms6/ms75cIl0sW1wiZTQ0MFwiLFwi6YqoXCIsNSxcIumKr1wiLDI0LFwi6YuJXCIsMzFdLFtcImU0ODBcIixcIumLqVwiLDMyLFwi5rS55rSn5rSM5rWD5rWI5rSH5rSE5rSZ5rSO5rSr5rWN5rSu5rS15rSa5rWP5rWS5rWU5rSz5raR5rWv5rae5rag5rWe5raT5raU5rWc5rWg5rW85rWj5ria5reH5reF5ree5riO5ra/5reg5riR5rem5red5reZ5riW5rar5riM5rau5rir5rmu5rmO5rmr5rqy5rmf5rqG5rmT5rmU5riy5ril5rmE5ruf5rqx5rqY5rug5ryt5rui5rql5rqn5rq95rq75rq35ruX5rq05ruP5rqP5ruC5rqf5r2i5r2G5r2H5ryk5ryV5ru55ryv5ry25r2L5r205ryq5ryJ5ryp5r6J5r6N5r6M5r245r2y5r285r265r+RXCJdLFtcImU1NDBcIixcIumMilwiLDUxLFwi6Yy/XCIsMTBdLFtcImU1ODBcIixcIumNilwiLDMxLFwi6Y2r5r+J5r6n5r655r625r+C5r+h5r+u5r+e5r+g5r+v54Ca54Cj54Cb54C554C154GP54Ge5a6A5a6E5a6V5a6T5a6l5a6455Sv6aqe5pC05a+k5a+u6KSw5a+w6LmH6KyH6L626L+T6L+V6L+l6L+u6L+k6L+p6L+m6L+z6L+o6YCF6YCE6YCL6YCm6YCR6YCN6YCW6YCh6YC16YC26YCt6YCv6YGE6YGR6YGS6YGQ6YGo6YGY6YGi6YGb5pq56YG06YG96YKC6YKI6YKD6YKL5b2Q5b2X5b2W5b2Y5bC75ZKr5bGQ5bGZ5a2x5bGj5bGm57685byq5byp5byt6Im05by86ay75bGu5aaB5aaD5aaN5aap5aaq5aajXCJdLFtcImU2NDBcIixcIumNrFwiLDM0LFwi6Y6QXCIsMjddLFtcImU2ODBcIixcIumOrFwiLDI5LFwi6Y+L6Y+M6Y+N5aaX5aeK5aar5aae5aak5aeS5aay5aav5aeX5aa+5aiF5aiG5aed5aiI5aej5aeY5ae55aiM5aiJ5aiy5ai05aiR5aij5aiT5amA5amn5amK5amV5ai85ami5am16IOs5aqq5aqb5am35am65aq+5aur5aqy5auS5auU5aq45aug5auj5aux5auW5aum5auY5auc5ayJ5ayX5ayW5ayy5ay35a2A5bCV5bCc5a2a5a2l5a2z5a2R5a2T5a2i6am16am36am46am66am/6am96aqA6aqB6aqF6aqI6aqK6aqQ6aqS6aqT6aqW6aqY6aqb6aqc6aqd6aqf6aqg6aqi6aqj6aql6aqn57qf57qh57qj57ql57qo57qpXCJdLFtcImU3NDBcIixcIumPjlwiLDcsXCLpj5dcIiw1NF0sW1wiZTc4MFwiLFwi6ZCOXCIsMzIsXCLnuq3nurDnur7nu4Dnu4Hnu4Lnu4nnu4vnu4znu5Dnu5Tnu5fnu5vnu6Dnu6Hnu6jnu6vnu67nu6/nu7Hnu7LnvI3nu7bnu7rnu7vnu77nvIHnvILnvIPnvIfnvIjnvIvnvIznvI/nvJHnvJLnvJfnvJnnvJznvJvnvJ/nvKFcIiw2LFwi57yq57yr57ys57yt57yvXCIsNCxcIue8teW5uueVv+W3m+eUvumCleeOjueOkeeOrueOoueOn+ePj+ePguePkeeOt+eOs+ePgOePieePiOePpeePmemhvOeQiuePqeePp+ePnueOuuePsueQj+eQqueRm+eQpueQpeeQqOeQsOeQrueQrFwiXSxbXCJlODQwXCIsXCLpkK9cIiwxNCxcIumQv1wiLDQzLFwi6ZGs6ZGt6ZGu6ZGvXCJdLFtcImU4ODBcIixcIumRsFwiLDIwLFwi6ZKR6ZKW6ZKY6ZOH6ZOP6ZOT6ZOU6ZOa6ZOm6ZO76ZSc6ZSg55Cb55Ca55GB55Gc55GX55GV55GZ55G355Gt55G+55Kc55KO55KA55KB55KH55KL55Ke55Ko55Kp55KQ55Kn55OS55K66Z+q6Z+r6Z+s5p2M5p2T5p2e5p2I5p2p5p6l5p6H5p2q5p2z5p6Y5p6n5p215p6o5p6e5p6t5p6L5p235p285p+w5qCJ5p+Y5qCK5p+p5p6w5qCM5p+Z5p615p+a5p6z5p+d5qCA5p+D5p645p+i5qCO5p+B5p+95qCy5qCz5qGg5qGh5qGO5qGi5qGE5qGk5qKD5qCd5qGV5qGm5qGB5qGn5qGA5qC+5qGK5qGJ5qCp5qK15qKP5qG05qG35qKT5qGr5qOC5qWu5qO85qSf5qSg5qO5XCJdLFtcImU5NDBcIixcIumUp+mUs+mUvemVg+mViOmVi+mVlemVmumVoOmVrumVtOmVtemVt1wiLDcsXCLploBcIiw0Ml0sW1wiZTk4MFwiLFwi6ZarXCIsMzIsXCLmpKTmo7DmpIvmpIHmpZfmo6PmpJDmpbHmpLnmpaDmpYLmpZ3mpoTmpavmpoDmppjmpbjmpLTmp4zmpofmpojmp47mponmpabmpaPmpbnmppvmpqfmprvmpqvmpq3mp5TmprHmp4Hmp4rmp5/mppXmp6Dmpo3mp7/mqK/mp63mqJfmqJjmqaXmp7LmqYTmqL7mqqDmqZDmqZvmqLXmqo7mqbnmqL3mqKjmqZjmqbzmqpHmqpDmqqnmqpfmqqvnjLfnjZLmroHmroLmrofmroTmrpLmrpPmro3mrprmrpvmrqHmrqrovavova3ovbHovbLovbPovbXovbbovbjovbfovbnovbrovbzovb7ovoHovoLovoTovofovotcIl0sW1wiZWE0MFwiLFwi6ZeMXCIsMjcsXCLpl6zpl7/pmIfpmJPpmJjpmJvpmJ7pmKDpmKNcIiw2LFwi6Zir6Zis6Zit6Ziv6Ziw6Zi36Zi46Zi56Zi66Zi+6ZmB6ZmD6ZmK6ZmO6ZmP6ZmR6ZmS6ZmT6ZmW6ZmXXCJdLFtcImVhODBcIixcIumZmOmZmemZmumZnOmZnemZnumZoOmZo+mZpemZpumZq+mZrVwiLDQsXCLpmbPpmbhcIiwxMixcIumah+maiemaiui+jei+jui+j+i+mOi+mui7juaIi+aIl+aIm+aIn+aIouaIoeaIpeaIpOaIrOiHp+eTr+eTtOeTv+eUj+eUkeeUk+aUtOaXruaXr+aXsOaYiuaYmeadsuaYg+aYleaYgOeCheabt+aYneaYtOaYseaYtuaYteiAhuaZn+aZlOaZgeaZj+aZluaZoeaZl+aZt+aahOaajOaap+aaneaavuabm+abnOabpuabqei0sui0s+i0tui0u+i0vei1gOi1hei1hui1iOi1iei1h+i1jei1lei1meinh+iniuini+injOinjuinj+inkOinkeeJrueKn+eJneeJpueJr+eJvueJv+eKhOeKi+eKjeeKj+eKkuaMiOaMsuaOsFwiXSxbXCJlYjQwXCIsXCLpmozpmo7pmpHpmpLpmpPpmpXpmpbpmprpmpvpmp1cIiw5LFwi6ZqoXCIsNyxcIumasemasumatOmatemat+mauOmauumau+mav+mbgumbg+mbiOmbiumbi+mbkOmbkembk+mblOmbllwiLDksXCLpm6FcIiw2LFwi6ZurXCJdLFtcImViODBcIixcIumbrOmbrembrumbsOmbsembsumbtOmbtembuOmbuumbu+mbvOmbvembv+mcgumcg+mchemciumci+mcjOmckOmckemckumclOmclemcl1wiLDQsXCLpnJ3pnJ/pnKDmkL/mk5jogITmr6rmr7Pmr73mr7Xmr7nmsIXmsIfmsIbmsI3msJXmsJjmsJnmsJrmsKHmsKnmsKTmsKrmsLLmlLXmlZXmlavniY3niZLniZbniLDomaLliJbogp/ogpzogpPogrzmnIrogr3ogrHogqvogq3ogrTogrfog6fog6jog6nog6rog5vog4Log4Tog5nog43og5fmnJDog53og6vog7Hog7Tog63ohI3ohI7og7Log7zmnJXohJLosZrohLbohJ7ohKzohJjohLLohYjohYzohZPohbTohZnohZrohbHohaDohanohbzohb3oha3ohafloY3lqrXohojohoLohpHmu5XohqPohqroh4zmnKboh4rohrtcIl0sW1wiZWM0MFwiLFwi6ZyhXCIsOCxcIumcq+mcrOmcrumcr+mcsemcs1wiLDQsXCLpnLrpnLvpnLzpnL3pnL9cIiwxOCxcIumdlOmdlemdl+mdmOmdmumdnOmdnemdn+mdo+mdpOmdpumdp+mdqOmdqlwiLDddLFtcImVjODBcIixcIumdsumdtemdt1wiLDQsXCLpnb1cIiw3LFwi6Z6GXCIsNCxcIumejOmejumej+mekOmek+melemelumel+memVwiLDQsXCLoh4HohqbmrKTmrLfmrLnmrYPmrYbmrZnpo5Hpo5Lpo5Ppo5Xpo5npo5rmrrPlvYDmr4Lop7PmlpDpvZHmlpPmlrzml4bml4Tml4Pml4zml47ml5Lml5bngoDngpzngpbngp3ngrvng4DngrfngqvngrHng6jng4rnhJDnhJPnhJbnhK/nhLHnhbPnhZznhajnhYXnhbLnhYrnhbjnhbrnhpjnhrPnhrXnhqjnhqDnh6Dnh5Tnh6fnh7nniJ3niKjngaznhJjnhabnhrnmiL7miL3miYPmiYjmiYnnpLvnpYDnpYbnpYnnpZvnpZznpZPnpZrnpaLnpZfnpaDnpa/npafnpbrnpoXnpornpprnpqfnprPlv5Hlv5BcIl0sW1wiZWQ0MFwiLFwi6Z6e6Z6f6Z6h6Z6i6Z6kXCIsNixcIumerOmerumesOmesemes+metVwiLDQ2XSxbXCJlZDgwXCIsXCLpn6Tpn6Xpn6jpn65cIiw0LFwi6Z+06Z+3XCIsMjMsXCLmgLzmgZ3mgZrmgafmgYHmgZnmgaPmgqvmhIbmhI3mhZ3mhqnmhp3mh4vmh5HmiIbogoDogb/mspPms7bmt7znn7bnn7jnoIDnoInnoJfnoJjnoJHmlqvnoK3noJznoJ3noLnnoLrnoLvnoJ/noLznoKXnoKznoKPnoKnnoY7noa3noZbnoZfnoKbnoZDnoYfnoYznoarnopvnopPnoprnoofnopznoqHnoqPnorLnornnoqXno5Tno5nno4nno6zno7LnpIXno7TnpJPnpKTnpJ7npLTpvpvpu7npu7vpu7znm7HnnITnnI3nm7nnnIfnnIjnnJrnnKLnnJnnnK3nnKbnnLXnnLjnnZDnnZHnnYfnnYPnnZrnnahcIl0sW1wiZWU0MFwiLFwi6aCPXCIsNjJdLFtcImVlODBcIixcIumhjlwiLDMyLFwi552i552l552/556N5529556A556M556R556f556g556w5561556955S655WA55WO55WL55WI55Wb55Wy55W555aD572Y572h572f6KmI572o5720572x5725576B572+55uN55ul6KCy6ZKF6ZKG6ZKH6ZKL6ZKK6ZKM6ZKN6ZKP6ZKQ6ZKU6ZKX6ZKV6ZKa6ZKb6ZKc6ZKj6ZKk6ZKr6ZKq6ZKt6ZKs6ZKv6ZKw6ZKy6ZK06ZK2XCIsNCxcIumSvOmSvemSv+mThOmTiFwiLDYsXCLpk5Dpk5Hpk5Lpk5Xpk5bpk5fpk5npk5jpk5vpk57pk5/pk6Dpk6Lpk6Tpk6Xpk6fpk6jpk6pcIl0sW1wiZWY0MFwiLFwi6aGvXCIsNSxcIumii+mijumikumilemimemio+miqFwiLDM3LFwi6aOP6aOQ6aOU6aOW6aOX6aOb6aOc6aOd6aOgXCIsNF0sW1wiZWY4MFwiLFwi6aOl6aOm6aOpXCIsMzAsXCLpk6npk6vpk67pk6/pk7Ppk7Tpk7Xpk7fpk7npk7zpk73pk7/plIPplILplIbplIfplInplIrplI3plI7plI/plJJcIiw0LFwi6ZSY6ZSb6ZSd6ZSe6ZSf6ZSi6ZSq6ZSr6ZSp6ZSs6ZSx6ZSy6ZS06ZS26ZS36ZS46ZS86ZS+6ZS/6ZWC6ZS16ZWE6ZWF6ZWG6ZWJ6ZWM6ZWO6ZWP6ZWS6ZWT6ZWU6ZWW6ZWX6ZWY6ZWZ6ZWb6ZWe6ZWf6ZWd6ZWh6ZWi6ZWkXCIsOCxcIumVr+mVsemVsumVs+mUuuefp+efrOmbieenleenreeno+enq+eohuW1h+eog+eogueonueolFwiXSxbXCJmMDQwXCIsXCLppIhcIiw0LFwi6aSO6aSP6aSRXCIsMjgsXCLppK9cIiwyNl0sW1wiZjA4MFwiLFwi6aWKXCIsOSxcIumlllwiLDEyLFwi6aWk6aWm6aWz6aW46aW56aW76aW+6aaC6aaD6aaJ56i556i356mR6buP6aal56mw55qI55qO55qT55qZ55qk55Oe55Og55Ss6big6bii6bioXCIsNCxcIum4sum4sem4tum4uOm4t+m4uem4uum4vum5gem5gum5hOm5hum5h+m5iOm5iem5i+m5jOm5jum5kem5lem5l+m5mum5m+m5nOm5num5o+m5plwiLDYsXCLpubHpua3pubPnlpLnlpTnlpbnlqDnlp3nlqznlqPnlrPnlrTnlrjnl4TnlrHnlrDnl4Pnl4Lnl5bnl43nl6Pnl6jnl6bnl6Tnl6vnl6fnmIPnl7Hnl7znl7/nmJDnmIDnmIXnmIznmJfnmIrnmKXnmJjnmJXnmJlcIl0sW1wiZjE0MFwiLFwi6aaM6aaO6aaaXCIsMTAsXCLppqbppqfppqlcIiw0N10sW1wiZjE4MFwiLFwi6aeZXCIsMzIsXCLnmJvnmLznmKLnmKDnmYDnmK3nmLDnmL/nmLXnmYPnmL7nmLPnmY3nmZ7nmZTnmZznmZbnmavnma/nv4rnq6bnqbjnqbnnqoDnqobnqojnqpXnqqbnqqDnqqznqqjnqq3nqrPooaTooanoobLoob3oob/oooLooqLoo4boorfoorzoo4noo6Loo47oo6Poo6Xoo7HopJroo7zoo6joo77oo7DopKHopJnopJPopJvopIropLTopKvopLbopYHopabopbvnlovog6XnmrLnmrTnn5zogJLogJTogJbogJzogKDogKLogKXogKbogKfogKnogKjogLHogIvogLXogYPogYbogY3ogZLoganogbHopoPpobjpooDpooNcIl0sW1wiZjI0MFwiLFwi6ae6XCIsNjJdLFtcImYyODBcIixcIumouVwiLDMyLFwi6aKJ6aKM6aKN6aKP6aKU6aKa6aKb6aKe6aKf6aKh6aKi6aKl6aKm6JmN6JmU6Jms6Jmu6Jm/6Jm66Jm86Jm76Jqo6JqN6JqL6Jqs6Jqd6Jqn6Jqj6Jqq6JqT6Jqp6Jq26JuE6Jq16JuO6Jqw6Jq66Jqx6Jqv6JuJ6JuP6Jq06Jup6Jux6Juy6Jut6Juz6JuQ6JyT6Jue6Ju06Juf6JuY6JuR6JyD6JyH6Ju46JyI6JyK6JyN6JyJ6Jyj6Jy76Jye6Jyl6Jyu6Jya6Jy+6J2I6Jy06Jyx6Jyp6Jy36Jy/6J6C6Jyi6J296J2+6J276J2g6J2w6J2M6J2u6J6L6J2T6J2j6J286J2k6J2Z6J2l6J6T6J6v6J6o6J+SXCJdLFtcImYzNDBcIixcIumpmlwiLDE3LFwi6amy6aqD6aqJ6aqN6aqO6aqU6aqV6aqZ6aqm6aqpXCIsNixcIumqsumqs+mqtOmqtemquemqu+mqvemqvumqv+mrg+mrhOmrhlwiLDQsXCLpq43pq47pq4/pq5Dpq5Lpq5Tpq5Xpq5bpq5fpq5npq5rpq5vpq5xcIl0sW1wiZjM4MFwiLFwi6aud6aue6aug6aui6auj6auk6aul6aun6auo6aup6auq6aus6auu6auwXCIsOCxcIumruumrvFwiLDYsXCLprITprIXprIbon4bonojonoXonq3onpfonoPonqvon6XonqzonrXonrPon4von5Ponr3on5Hon4Don4ron5von6ron6Don67ooJbooJPon77ooIrooJvooKHooLnooLznvLbnvYLnvYTnvYXoiJDnq7rnq73nrIjnrIPnrITnrJXnrIrnrKvnrI/nrYfnrLjnrKrnrJnnrK7nrLHnrKDnrKXnrKTnrLPnrL7nrJ7nrZjnrZrnrYXnrbXnrYznrZ3nraDnra7nrbvnraLnrbLnrbHnrpDnrqbnrqfnrrjnrqznrp3nrqjnroXnrqrnrpznrqLnrqvnrrTnr5Hnr4Hnr4znr53nr5rnr6Xnr6bnr6rnsIznr77nr7znsI/nsJbnsItcIl0sW1wiZjQ0MFwiLFwi6ayH6ayJXCIsNSxcIumskOmskemskumslFwiLDEwLFwi6ayg6ayh6ayi6aykXCIsMTAsXCLprLDprLHprLNcIiw3LFwi6ay96ay+6ay/6a2A6a2G6a2K6a2L6a2M6a2O6a2Q6a2S6a2T6a2VXCIsNV0sW1wiZjQ4MFwiLFwi6a2bXCIsMzIsXCLnsJ/nsKrnsKbnsLjnsYHnsYDoh77oiIHoiILoiIToh6zooYToiKHoiKLoiKPoiK3oiK/oiKjoiKvoiLjoiLvoiLPoiLToiL7oiYToiYnoiYvoiY/oiZroiZ/oiajoob7oooXooojoo5joo5/opZ7nvp3nvp/nvqfnvq/nvrDnvrLnsbzmlYnnspHnsp3nspznsp7nsqLnsrLnsrznsr3ns4Hns4fns4zns43ns4jns4Xns5fns6joia7mmqjnvr/nv47nv5Xnv6Xnv6Hnv6bnv6nnv67nv7Pns7jntbfntqbntq7nuYfnupvpurjpurTotbPotoTotpTotpHotrHotafota3osYfosYnphYrphZDphY7phY/phaRcIl0sW1wiZjU0MFwiLFwi6a28XCIsNjJdLFtcImY1ODBcIixcIumuu1wiLDMyLFwi6YWi6YWh6YWw6YWp6YWv6YW96YW+6YWy6YW06YW56YaM6YaF6YaQ6YaN6YaR6Yai6Yaj6Yaq6Yat6Yau6Yav6Ya16Ya06Ya66LGV6bm+6La46Ler6LiF6LmZ6Lmp6La16La/6La86La66LeE6LeW6LeX6Lea6Lee6LeO6LeP6Leb6LeG6Les6Le36Le46Lej6Le56Le76Lek6LiJ6Le96LiU6Lid6Lif6Lis6Liu6Lij6Liv6Li66LmA6Li56Li16Li96Lix6LmJ6LmB6LmC6LmR6LmS6LmK6Lmw6Lm26Lm86Lmv6Lm06LqF6LqP6LqU6LqQ6Lqc6Lqe6LG46LKC6LKK6LKF6LKY6LKU5pab6KeW6Kee6Kea6KecXCJdLFtcImY2NDBcIixcIumvnFwiLDYyXSxbXCJmNjgwXCIsXCLpsJtcIiwzMixcIuinpeinq+inr+iovuispumdk+mbqembs+mbr+mchumcgemciOmcj+mcjumcqumcremcsOmcvum+gOm+g+m+hVwiLDUsXCLpvozpu77pvIvpvI3pmrnpmrzpmr3pm47pm5Lnnr/pm6Dpio7piq7pi4jpjL7pjarpj4rpjo/pkL7pkavpsb/psoLpsoXpsobpsofpsojnqKPpsovpso7pspDpspHpspLpspTpspXpsprpspvpsp5cIiw1LFwi6bKlXCIsNCxcIumyq+myremyrumysFwiLDcsXCLpsrrpsrvpsrzpsr3ps4Tps4Xps4bps4fps4rps4tcIl0sW1wiZjc0MFwiLFwi6bC8XCIsNjJdLFtcImY3ODBcIixcIumxu+mxvemxvumygOmyg+myhOmyiemyiumyjOmyj+myk+mylumyl+mymOmymemynemyqumyrOmyr+myuemyvlwiLDQsXCLps4jps4nps5Hps5Lps5rps5vps6Dps6Hps4xcIiw0LFwi6bOT6bOU6bOV6bOX6bOY6bOZ6bOc6bOd6bOf6bOi6Z286Z6F6Z6R6Z6S6Z6U6Z6v6Z6r6Z6j6Z6y6Z606aqx6aqw6aq36bmY6aq26aq66aq86auB6auA6auF6auC6auL6auM6auR6a2F6a2D6a2H6a2J6a2I6a2N6a2R6aOo6aSN6aSu6aWV6aWU6auf6auh6aum6auv6aur6au76aut6au56ayI6ayP6ayT6ayf6ayj6bq96bq+57i76bqC6bqH6bqI6bqL6bqS6Y+W6bqd6bqf6bub6buc6bud6bug6buf6bui6bup6bun6bul6buq6buv6byi6bys6byv6by56by36by96by+6b2EXCJdLFtcImY4NDBcIixcIumzo1wiLDYyXSxbXCJmODgwXCIsXCLptKJcIiwzMl0sW1wiZjk0MFwiLFwi6bWDXCIsNjJdLFtcImY5ODBcIixcIum2glwiLDMyXSxbXCJmYTQwXCIsXCLptqNcIiw2Ml0sW1wiZmE4MFwiLFwi6beiXCIsMzJdLFtcImZiNDBcIixcIum4g1wiLDI3LFwi6bik6bin6biu6biw6bi06bi76bi86bmA6bmN6bmQ6bmS6bmT6bmU6bmW6bmZ6bmd6bmf6bmg6bmh6bmi6bml6bmu6bmv6bmy6bm0XCIsOSxcIum6gFwiXSxbXCJmYjgwXCIsXCLpuoHpuoPpuoTpuoXpuobpuonpuorpuoxcIiw1LFwi6bqUXCIsOCxcIum6num6oFwiLDUsXCLpuqfpuqjpuqnpuqpcIl0sW1wiZmM0MFwiLFwi6bqrXCIsOCxcIum6tem6tum6t+m6uem6uum6vOm6v1wiLDQsXCLpu4Xpu4bpu4fpu4jpu4rpu4vpu4zpu5Dpu5Lpu5Ppu5Xpu5bpu5fpu5npu5rpu57pu6Hpu6Ppu6Tpu6bpu6jpu6vpu6zpu63pu67pu7BcIiw4LFwi6bu66bu96bu/XCIsNl0sW1wiZmM4MFwiLFwi6byGXCIsNCxcIum8jOm8j+m8kem8kum8lOm8lem8lum8mOm8mlwiLDUsXCLpvKHpvKNcIiw4LFwi6byt6byu6byw6byxXCJdLFtcImZkNDBcIixcIum8slwiLDQsXCLpvLjpvLrpvLzpvL9cIiw0LFwi6b2FXCIsMTAsXCLpvZJcIiwzOF0sW1wiZmQ4MFwiLFwi6b25XCIsNSxcIum+gem+gum+jVwiLDExLFwi6b6c6b6d6b6e6b6hXCIsNCxcIu+krO+lue+mle+np++nsVwiXSxbXCJmZTQwXCIsXCLvqIzvqI3vqI7vqI/vqJHvqJPvqJTvqJjvqJ/vqKDvqKHvqKPvqKTvqKfvqKjvqKlcIl1dXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL3RhYmxlcy9jcDkzNi5qc29uXG4vLyBtb2R1bGUgaWQgPSA0OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnkgPSByZXF1aXJlKCcuL3N0cmluZ2lmeScpO1xudmFyIHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpO1xudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZm9ybWF0czogZm9ybWF0cyxcbiAgICBwYXJzZTogcGFyc2UsXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvcXMvbGliL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIG1ldGhvZHNcbiAqIENvcHlyaWdodChjKSAyMDEzLTIwMTQgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDE1LTIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEN1cnJlbnROb2RlTWV0aG9kcygpIHx8IGdldEJhc2ljTm9kZU1ldGhvZHMoKTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgTm9kZS5qcyBtZXRob2RzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Tm9kZU1ldGhvZHMoKSB7XG4gIHJldHVybiBodHRwLk1FVEhPRFMgJiYgaHR0cC5NRVRIT0RTLm1hcChmdW5jdGlvbiBsb3dlckNhc2VNZXRob2QobWV0aG9kKSB7XG4gICAgcmV0dXJuIG1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIFwiYmFzaWNcIiBOb2RlLmpzIG1ldGhvZHMsIGEgc25hcHNob3QgZnJvbSBOb2RlLmpzIDAuMTAuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEJhc2ljTm9kZU1ldGhvZHMoKSB7XG4gIHJldHVybiBbXG4gICAgJ2dldCcsXG4gICAgJ3Bvc3QnLFxuICAgICdwdXQnLFxuICAgICdoZWFkJyxcbiAgICAnZGVsZXRlJyxcbiAgICAnb3B0aW9ucycsXG4gICAgJ3RyYWNlJyxcbiAgICAnY29weScsXG4gICAgJ2xvY2snLFxuICAgICdta2NvbCcsXG4gICAgJ21vdmUnLFxuICAgICdwdXJnZScsXG4gICAgJ3Byb3BmaW5kJyxcbiAgICAncHJvcHBhdGNoJyxcbiAgICAndW5sb2NrJyxcbiAgICAncmVwb3J0JyxcbiAgICAnbWthY3Rpdml0eScsXG4gICAgJ2NoZWNrb3V0JyxcbiAgICAnbWVyZ2UnLFxuICAgICdtLXNlYXJjaCcsXG4gICAgJ25vdGlmeScsXG4gICAgJ3N1YnNjcmliZScsXG4gICAgJ3Vuc3Vic2NyaWJlJyxcbiAgICAncGF0Y2gnLFxuICAgICdzZWFyY2gnLFxuICAgICdjb25uZWN0J1xuICBdO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL21ldGhvZHMvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDUxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogc2VuZFxuICogQ29weXJpZ2h0KGMpIDIwMTIgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJ2h0dHAtZXJyb3JzJylcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ3NlbmQnKVxudmFyIGRlcHJlY2F0ZSA9IHJlcXVpcmUoJ2RlcGQnKSgnc2VuZCcpXG52YXIgZGVzdHJveSA9IHJlcXVpcmUoJ2Rlc3Ryb3knKVxudmFyIGVuY29kZVVybCA9IHJlcXVpcmUoJ2VuY29kZXVybCcpXG52YXIgZXNjYXBlSHRtbCA9IHJlcXVpcmUoJ2VzY2FwZS1odG1sJylcbnZhciBldGFnID0gcmVxdWlyZSgnZXRhZycpXG52YXIgZnJlc2ggPSByZXF1aXJlKCdmcmVzaCcpXG52YXIgZnMgPSByZXF1aXJlKCdmcycpXG52YXIgbWltZSA9IHJlcXVpcmUoJ21pbWUnKVxudmFyIG1zID0gcmVxdWlyZSgnbXMnKVxudmFyIG9uRmluaXNoZWQgPSByZXF1aXJlKCdvbi1maW5pc2hlZCcpXG52YXIgcGFyc2VSYW5nZSA9IHJlcXVpcmUoJ3JhbmdlLXBhcnNlcicpXG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKVxudmFyIHN0YXR1c2VzID0gcmVxdWlyZSgnc3RhdHVzZXMnKVxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpXG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKVxuXG4vKipcbiAqIFBhdGggZnVuY3Rpb24gcmVmZXJlbmNlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGV4dG5hbWUgPSBwYXRoLmV4dG5hbWVcbnZhciBqb2luID0gcGF0aC5qb2luXG52YXIgbm9ybWFsaXplID0gcGF0aC5ub3JtYWxpemVcbnZhciByZXNvbHZlID0gcGF0aC5yZXNvbHZlXG52YXIgc2VwID0gcGF0aC5zZXBcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIGlkZW50aWZ5aW5nIGEgYnl0ZXMgUmFuZ2UgaGVhZGVyLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgQllURVNfUkFOR0VfUkVHRVhQID0gL14gKmJ5dGVzPS9cblxuLyoqXG4gKiBNYXhpbXVtIHZhbHVlIGFsbG93ZWQgZm9yIHRoZSBtYXggYWdlLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgTUFYX01BWEFHRSA9IDYwICogNjAgKiAyNCAqIDM2NSAqIDEwMDAgLy8gMSB5ZWFyXG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGEgcGF0aCB3aXRoIGEgZGlyZWN0b3J5IHVwIGNvbXBvbmVudC5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIFVQX1BBVEhfUkVHRVhQID0gLyg/Ol58W1xcXFwvXSlcXC5cXC4oPzpbXFxcXC9dfCQpL1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gc2VuZFxubW9kdWxlLmV4cG9ydHMubWltZSA9IG1pbWVcblxuLyoqXG4gKiBSZXR1cm4gYSBgU2VuZFN0cmVhbWAgZm9yIGByZXFgIGFuZCBgcGF0aGAuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlcVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge1NlbmRTdHJlYW19XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gc2VuZCAocmVxLCBwYXRoLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgU2VuZFN0cmVhbShyZXEsIHBhdGgsIG9wdGlvbnMpXG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIGBTZW5kU3RyZWFtYCB3aXRoIHRoZSBnaXZlbiBgcGF0aGAuXG4gKlxuICogQHBhcmFtIHtSZXF1ZXN0fSByZXFcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIFNlbmRTdHJlYW0gKHJlcSwgcGF0aCwgb3B0aW9ucykge1xuICBTdHJlYW0uY2FsbCh0aGlzKVxuXG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fVxuXG4gIHRoaXMub3B0aW9ucyA9IG9wdHNcbiAgdGhpcy5wYXRoID0gcGF0aFxuICB0aGlzLnJlcSA9IHJlcVxuXG4gIHRoaXMuX2FjY2VwdFJhbmdlcyA9IG9wdHMuYWNjZXB0UmFuZ2VzICE9PSB1bmRlZmluZWRcbiAgICA/IEJvb2xlYW4ob3B0cy5hY2NlcHRSYW5nZXMpXG4gICAgOiB0cnVlXG5cbiAgdGhpcy5fY2FjaGVDb250cm9sID0gb3B0cy5jYWNoZUNvbnRyb2wgIT09IHVuZGVmaW5lZFxuICAgID8gQm9vbGVhbihvcHRzLmNhY2hlQ29udHJvbClcbiAgICA6IHRydWVcblxuICB0aGlzLl9ldGFnID0gb3B0cy5ldGFnICE9PSB1bmRlZmluZWRcbiAgICA/IEJvb2xlYW4ob3B0cy5ldGFnKVxuICAgIDogdHJ1ZVxuXG4gIHRoaXMuX2RvdGZpbGVzID0gb3B0cy5kb3RmaWxlcyAhPT0gdW5kZWZpbmVkXG4gICAgPyBvcHRzLmRvdGZpbGVzXG4gICAgOiAnaWdub3JlJ1xuXG4gIGlmICh0aGlzLl9kb3RmaWxlcyAhPT0gJ2lnbm9yZScgJiYgdGhpcy5fZG90ZmlsZXMgIT09ICdhbGxvdycgJiYgdGhpcy5fZG90ZmlsZXMgIT09ICdkZW55Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RvdGZpbGVzIG9wdGlvbiBtdXN0IGJlIFwiYWxsb3dcIiwgXCJkZW55XCIsIG9yIFwiaWdub3JlXCInKVxuICB9XG5cbiAgdGhpcy5faGlkZGVuID0gQm9vbGVhbihvcHRzLmhpZGRlbilcblxuICBpZiAob3B0cy5oaWRkZW4gIT09IHVuZGVmaW5lZCkge1xuICAgIGRlcHJlY2F0ZSgnaGlkZGVuOiB1c2UgZG90ZmlsZXM6IFxcJycgKyAodGhpcy5faGlkZGVuID8gJ2FsbG93JyA6ICdpZ25vcmUnKSArICdcXCcgaW5zdGVhZCcpXG4gIH1cblxuICAvLyBsZWdhY3kgc3VwcG9ydFxuICBpZiAob3B0cy5kb3RmaWxlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZG90ZmlsZXMgPSB1bmRlZmluZWRcbiAgfVxuXG4gIHRoaXMuX2V4dGVuc2lvbnMgPSBvcHRzLmV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZFxuICAgID8gbm9ybWFsaXplTGlzdChvcHRzLmV4dGVuc2lvbnMsICdleHRlbnNpb25zIG9wdGlvbicpXG4gICAgOiBbXVxuXG4gIHRoaXMuX2ltbXV0YWJsZSA9IG9wdHMuaW1tdXRhYmxlICE9PSB1bmRlZmluZWRcbiAgICA/IEJvb2xlYW4ob3B0cy5pbW11dGFibGUpXG4gICAgOiBmYWxzZVxuXG4gIHRoaXMuX2luZGV4ID0gb3B0cy5pbmRleCAhPT0gdW5kZWZpbmVkXG4gICAgPyBub3JtYWxpemVMaXN0KG9wdHMuaW5kZXgsICdpbmRleCBvcHRpb24nKVxuICAgIDogWydpbmRleC5odG1sJ11cblxuICB0aGlzLl9sYXN0TW9kaWZpZWQgPSBvcHRzLmxhc3RNb2RpZmllZCAhPT0gdW5kZWZpbmVkXG4gICAgPyBCb29sZWFuKG9wdHMubGFzdE1vZGlmaWVkKVxuICAgIDogdHJ1ZVxuXG4gIHRoaXMuX21heGFnZSA9IG9wdHMubWF4QWdlIHx8IG9wdHMubWF4YWdlXG4gIHRoaXMuX21heGFnZSA9IHR5cGVvZiB0aGlzLl9tYXhhZ2UgPT09ICdzdHJpbmcnXG4gICAgPyBtcyh0aGlzLl9tYXhhZ2UpXG4gICAgOiBOdW1iZXIodGhpcy5fbWF4YWdlKVxuICB0aGlzLl9tYXhhZ2UgPSAhaXNOYU4odGhpcy5fbWF4YWdlKVxuICAgID8gTWF0aC5taW4oTWF0aC5tYXgoMCwgdGhpcy5fbWF4YWdlKSwgTUFYX01BWEFHRSlcbiAgICA6IDBcblxuICB0aGlzLl9yb290ID0gb3B0cy5yb290XG4gICAgPyByZXNvbHZlKG9wdHMucm9vdClcbiAgICA6IG51bGxcblxuICBpZiAoIXRoaXMuX3Jvb3QgJiYgb3B0cy5mcm9tKSB7XG4gICAgdGhpcy5mcm9tKG9wdHMuZnJvbSlcbiAgfVxufVxuXG4vKipcbiAqIEluaGVyaXRzIGZyb20gYFN0cmVhbWAuXG4gKi9cblxudXRpbC5pbmhlcml0cyhTZW5kU3RyZWFtLCBTdHJlYW0pXG5cbi8qKlxuICogRW5hYmxlIG9yIGRpc2FibGUgZXRhZyBnZW5lcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gdmFsXG4gKiBAcmV0dXJuIHtTZW5kU3RyZWFtfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5ldGFnID0gZGVwcmVjYXRlLmZ1bmN0aW9uKGZ1bmN0aW9uIGV0YWcgKHZhbCkge1xuICB0aGlzLl9ldGFnID0gQm9vbGVhbih2YWwpXG4gIGRlYnVnKCdldGFnICVzJywgdGhpcy5fZXRhZylcbiAgcmV0dXJuIHRoaXNcbn0sICdzZW5kLmV0YWc6IHBhc3MgZXRhZyBhcyBvcHRpb24nKVxuXG4vKipcbiAqIEVuYWJsZSBvciBkaXNhYmxlIFwiaGlkZGVuXCIgKGRvdCkgZmlsZXMuXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBwYXRoXG4gKiBAcmV0dXJuIHtTZW5kU3RyZWFtfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5oaWRkZW4gPSBkZXByZWNhdGUuZnVuY3Rpb24oZnVuY3Rpb24gaGlkZGVuICh2YWwpIHtcbiAgdGhpcy5faGlkZGVuID0gQm9vbGVhbih2YWwpXG4gIHRoaXMuX2RvdGZpbGVzID0gdW5kZWZpbmVkXG4gIGRlYnVnKCdoaWRkZW4gJXMnLCB0aGlzLl9oaWRkZW4pXG4gIHJldHVybiB0aGlzXG59LCAnc2VuZC5oaWRkZW46IHVzZSBkb3RmaWxlcyBvcHRpb24nKVxuXG4vKipcbiAqIFNldCBpbmRleCBgcGF0aHNgLCBzZXQgdG8gYSBmYWxzeVxuICogdmFsdWUgdG8gZGlzYWJsZSBpbmRleCBzdXBwb3J0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEJvb2xlYW58QXJyYXl9IHBhdGhzXG4gKiBAcmV0dXJuIHtTZW5kU3RyZWFtfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5pbmRleCA9IGRlcHJlY2F0ZS5mdW5jdGlvbihmdW5jdGlvbiBpbmRleCAocGF0aHMpIHtcbiAgdmFyIGluZGV4ID0gIXBhdGhzID8gW10gOiBub3JtYWxpemVMaXN0KHBhdGhzLCAncGF0aHMgYXJndW1lbnQnKVxuICBkZWJ1ZygnaW5kZXggJW8nLCBwYXRocylcbiAgdGhpcy5faW5kZXggPSBpbmRleFxuICByZXR1cm4gdGhpc1xufSwgJ3NlbmQuaW5kZXg6IHBhc3MgaW5kZXggYXMgb3B0aW9uJylcblxuLyoqXG4gKiBTZXQgcm9vdCBgcGF0aGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge1NlbmRTdHJlYW19XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLnJvb3QgPSBmdW5jdGlvbiByb290IChwYXRoKSB7XG4gIHRoaXMuX3Jvb3QgPSByZXNvbHZlKFN0cmluZyhwYXRoKSlcbiAgZGVidWcoJ3Jvb3QgJXMnLCB0aGlzLl9yb290KVxuICByZXR1cm4gdGhpc1xufVxuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5mcm9tID0gZGVwcmVjYXRlLmZ1bmN0aW9uKFNlbmRTdHJlYW0ucHJvdG90eXBlLnJvb3QsXG4gICdzZW5kLmZyb206IHBhc3Mgcm9vdCBhcyBvcHRpb24nKVxuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5yb290ID0gZGVwcmVjYXRlLmZ1bmN0aW9uKFNlbmRTdHJlYW0ucHJvdG90eXBlLnJvb3QsXG4gICdzZW5kLnJvb3Q6IHBhc3Mgcm9vdCBhcyBvcHRpb24nKVxuXG4vKipcbiAqIFNldCBtYXgtYWdlIHRvIGBtYXhBZ2VgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXhBZ2VcbiAqIEByZXR1cm4ge1NlbmRTdHJlYW19XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLm1heGFnZSA9IGRlcHJlY2F0ZS5mdW5jdGlvbihmdW5jdGlvbiBtYXhhZ2UgKG1heEFnZSkge1xuICB0aGlzLl9tYXhhZ2UgPSB0eXBlb2YgbWF4QWdlID09PSAnc3RyaW5nJ1xuICAgID8gbXMobWF4QWdlKVxuICAgIDogTnVtYmVyKG1heEFnZSlcbiAgdGhpcy5fbWF4YWdlID0gIWlzTmFOKHRoaXMuX21heGFnZSlcbiAgICA/IE1hdGgubWluKE1hdGgubWF4KDAsIHRoaXMuX21heGFnZSksIE1BWF9NQVhBR0UpXG4gICAgOiAwXG4gIGRlYnVnKCdtYXgtYWdlICVkJywgdGhpcy5fbWF4YWdlKVxuICByZXR1cm4gdGhpc1xufSwgJ3NlbmQubWF4YWdlOiBwYXNzIG1heEFnZSBhcyBvcHRpb24nKVxuXG4vKipcbiAqIEVtaXQgZXJyb3Igd2l0aCBgc3RhdHVzYC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gKiBAcGFyYW0ge0Vycm9yfSBbZXJyXVxuICogQHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uIGVycm9yIChzdGF0dXMsIGVycikge1xuICAvLyBlbWl0IGlmIGxpc3RlbmVycyBpbnN0ZWFkIG9mIHJlc3BvbmRpbmdcbiAgaWYgKGhhc0xpc3RlbmVycyh0aGlzLCAnZXJyb3InKSkge1xuICAgIHJldHVybiB0aGlzLmVtaXQoJ2Vycm9yJywgY3JlYXRlRXJyb3Ioc3RhdHVzLCBlcnIsIHtcbiAgICAgIGV4cG9zZTogZmFsc2VcbiAgICB9KSlcbiAgfVxuXG4gIHZhciByZXMgPSB0aGlzLnJlc1xuICB2YXIgbXNnID0gc3RhdHVzZXNbc3RhdHVzXSB8fCBTdHJpbmcoc3RhdHVzKVxuICB2YXIgZG9jID0gY3JlYXRlSHRtbERvY3VtZW50KCdFcnJvcicsIGVzY2FwZUh0bWwobXNnKSlcblxuICAvLyBjbGVhciBleGlzdGluZyBoZWFkZXJzXG4gIGNsZWFySGVhZGVycyhyZXMpXG5cbiAgLy8gYWRkIGVycm9yIGhlYWRlcnNcbiAgaWYgKGVyciAmJiBlcnIuaGVhZGVycykge1xuICAgIHNldEhlYWRlcnMocmVzLCBlcnIuaGVhZGVycylcbiAgfVxuXG4gIC8vIHNlbmQgYmFzaWMgcmVzcG9uc2VcbiAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXNcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbDsgY2hhcnNldD1VVEYtOCcpXG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgQnVmZmVyLmJ5dGVMZW5ndGgoZG9jKSlcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLCBcImRlZmF1bHQtc3JjICdzZWxmJ1wiKVxuICByZXMuc2V0SGVhZGVyKCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJywgJ25vc25pZmYnKVxuICByZXMuZW5kKGRvYylcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcGF0aG5hbWUgZW5kcyB3aXRoIFwiL1wiLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmhhc1RyYWlsaW5nU2xhc2ggPSBmdW5jdGlvbiBoYXNUcmFpbGluZ1NsYXNoICgpIHtcbiAgcmV0dXJuIHRoaXMucGF0aFt0aGlzLnBhdGgubGVuZ3RoIC0gMV0gPT09ICcvJ1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoaXMgaXMgYSBjb25kaXRpb25hbCBHRVQgcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUuaXNDb25kaXRpb25hbEdFVCA9IGZ1bmN0aW9uIGlzQ29uZGl0aW9uYWxHRVQgKCkge1xuICByZXR1cm4gdGhpcy5yZXEuaGVhZGVyc1snaWYtbWF0Y2gnXSB8fFxuICAgIHRoaXMucmVxLmhlYWRlcnNbJ2lmLXVubW9kaWZpZWQtc2luY2UnXSB8fFxuICAgIHRoaXMucmVxLmhlYWRlcnNbJ2lmLW5vbmUtbWF0Y2gnXSB8fFxuICAgIHRoaXMucmVxLmhlYWRlcnNbJ2lmLW1vZGlmaWVkLXNpbmNlJ11cbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBwcmVjb25kaXRpb25zIGZhaWxlZC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5pc1ByZWNvbmRpdGlvbkZhaWx1cmUgPSBmdW5jdGlvbiBpc1ByZWNvbmRpdGlvbkZhaWx1cmUgKCkge1xuICB2YXIgcmVxID0gdGhpcy5yZXFcbiAgdmFyIHJlcyA9IHRoaXMucmVzXG5cbiAgLy8gaWYtbWF0Y2hcbiAgdmFyIG1hdGNoID0gcmVxLmhlYWRlcnNbJ2lmLW1hdGNoJ11cbiAgaWYgKG1hdGNoKSB7XG4gICAgdmFyIGV0YWcgPSByZXMuZ2V0SGVhZGVyKCdFVGFnJylcbiAgICByZXR1cm4gIWV0YWcgfHwgKG1hdGNoICE9PSAnKicgJiYgcGFyc2VUb2tlbkxpc3QobWF0Y2gpLmV2ZXJ5KGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoICE9PSBldGFnICYmIG1hdGNoICE9PSAnVy8nICsgZXRhZyAmJiAnVy8nICsgbWF0Y2ggIT09IGV0YWdcbiAgICB9KSlcbiAgfVxuXG4gIC8vIGlmLXVubW9kaWZpZWQtc2luY2VcbiAgdmFyIHVubW9kaWZpZWRTaW5jZSA9IHBhcnNlSHR0cERhdGUocmVxLmhlYWRlcnNbJ2lmLXVubW9kaWZpZWQtc2luY2UnXSlcbiAgaWYgKCFpc05hTih1bm1vZGlmaWVkU2luY2UpKSB7XG4gICAgdmFyIGxhc3RNb2RpZmllZCA9IHBhcnNlSHR0cERhdGUocmVzLmdldEhlYWRlcignTGFzdC1Nb2RpZmllZCcpKVxuICAgIHJldHVybiBpc05hTihsYXN0TW9kaWZpZWQpIHx8IGxhc3RNb2RpZmllZCA+IHVubW9kaWZpZWRTaW5jZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogU3RyaXAgY29udGVudC0qIGhlYWRlciBmaWVsZHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5yZW1vdmVDb250ZW50SGVhZGVyRmllbGRzID0gZnVuY3Rpb24gcmVtb3ZlQ29udGVudEhlYWRlckZpZWxkcyAoKSB7XG4gIHZhciByZXMgPSB0aGlzLnJlc1xuICB2YXIgaGVhZGVycyA9IGdldEhlYWRlck5hbWVzKHJlcylcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaGVhZGVyID0gaGVhZGVyc1tpXVxuICAgIGlmIChoZWFkZXIuc3Vic3RyKDAsIDgpID09PSAnY29udGVudC0nICYmIGhlYWRlciAhPT0gJ2NvbnRlbnQtbG9jYXRpb24nKSB7XG4gICAgICByZXMucmVtb3ZlSGVhZGVyKGhlYWRlcilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNwb25kIHdpdGggMzA0IG5vdCBtb2RpZmllZC5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5ub3RNb2RpZmllZCA9IGZ1bmN0aW9uIG5vdE1vZGlmaWVkICgpIHtcbiAgdmFyIHJlcyA9IHRoaXMucmVzXG4gIGRlYnVnKCdub3QgbW9kaWZpZWQnKVxuICB0aGlzLnJlbW92ZUNvbnRlbnRIZWFkZXJGaWVsZHMoKVxuICByZXMuc3RhdHVzQ29kZSA9IDMwNFxuICByZXMuZW5kKClcbn1cblxuLyoqXG4gKiBSYWlzZSBlcnJvciB0aGF0IGhlYWRlcnMgYWxyZWFkeSBzZW50LlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLmhlYWRlcnNBbHJlYWR5U2VudCA9IGZ1bmN0aW9uIGhlYWRlcnNBbHJlYWR5U2VudCAoKSB7XG4gIHZhciBlcnIgPSBuZXcgRXJyb3IoJ0NhblxcJ3Qgc2V0IGhlYWRlcnMgYWZ0ZXIgdGhleSBhcmUgc2VudC4nKVxuICBkZWJ1ZygnaGVhZGVycyBhbHJlYWR5IHNlbnQnKVxuICB0aGlzLmVycm9yKDUwMCwgZXJyKVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIGNhY2hlYWJsZSwgYWthXG4gKiByZXNwb25kZWQgd2l0aCAyeHggb3IgMzA0IChzZWUgUkZDIDI2MTYgc2VjdGlvbiAxNC4yezUsNn0pLlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5pc0NhY2hhYmxlID0gZnVuY3Rpb24gaXNDYWNoYWJsZSAoKSB7XG4gIHZhciBzdGF0dXNDb2RlID0gdGhpcy5yZXMuc3RhdHVzQ29kZVxuICByZXR1cm4gKHN0YXR1c0NvZGUgPj0gMjAwICYmIHN0YXR1c0NvZGUgPCAzMDApIHx8XG4gICAgc3RhdHVzQ29kZSA9PT0gMzA0XG59XG5cbi8qKlxuICogSGFuZGxlIHN0YXQoKSBlcnJvci5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICogQHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5vblN0YXRFcnJvciA9IGZ1bmN0aW9uIG9uU3RhdEVycm9yIChlcnJvcikge1xuICBzd2l0Y2ggKGVycm9yLmNvZGUpIHtcbiAgICBjYXNlICdFTkFNRVRPT0xPTkcnOlxuICAgIGNhc2UgJ0VOT0VOVCc6XG4gICAgY2FzZSAnRU5PVERJUic6XG4gICAgICB0aGlzLmVycm9yKDQwNCwgZXJyb3IpXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aGlzLmVycm9yKDUwMCwgZXJyb3IpXG4gICAgICBicmVha1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGNhY2hlIGlzIGZyZXNoLlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5pc0ZyZXNoID0gZnVuY3Rpb24gaXNGcmVzaCAoKSB7XG4gIHJldHVybiBmcmVzaCh0aGlzLnJlcS5oZWFkZXJzLCB7XG4gICAgJ2V0YWcnOiB0aGlzLnJlcy5nZXRIZWFkZXIoJ0VUYWcnKSxcbiAgICAnbGFzdC1tb2RpZmllZCc6IHRoaXMucmVzLmdldEhlYWRlcignTGFzdC1Nb2RpZmllZCcpXG4gIH0pXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHJhbmdlIGlzIGZyZXNoLlxuICpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5pc1JhbmdlRnJlc2ggPSBmdW5jdGlvbiBpc1JhbmdlRnJlc2ggKCkge1xuICB2YXIgaWZSYW5nZSA9IHRoaXMucmVxLmhlYWRlcnNbJ2lmLXJhbmdlJ11cblxuICBpZiAoIWlmUmFuZ2UpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gaWYtcmFuZ2UgYXMgZXRhZ1xuICBpZiAoaWZSYW5nZS5pbmRleE9mKCdcIicpICE9PSAtMSkge1xuICAgIHZhciBldGFnID0gdGhpcy5yZXMuZ2V0SGVhZGVyKCdFVGFnJylcbiAgICByZXR1cm4gQm9vbGVhbihldGFnICYmIGlmUmFuZ2UuaW5kZXhPZihldGFnKSAhPT0gLTEpXG4gIH1cblxuICAvLyBpZi1yYW5nZSBhcyBtb2RpZmllZCBkYXRlXG4gIHZhciBsYXN0TW9kaWZpZWQgPSB0aGlzLnJlcy5nZXRIZWFkZXIoJ0xhc3QtTW9kaWZpZWQnKVxuICByZXR1cm4gcGFyc2VIdHRwRGF0ZShsYXN0TW9kaWZpZWQpIDw9IHBhcnNlSHR0cERhdGUoaWZSYW5nZSlcbn1cblxuLyoqXG4gKiBSZWRpcmVjdCB0byBwYXRoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcHJpdmF0ZVxuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLnJlZGlyZWN0ID0gZnVuY3Rpb24gcmVkaXJlY3QgKHBhdGgpIHtcbiAgdmFyIHJlcyA9IHRoaXMucmVzXG5cbiAgaWYgKGhhc0xpc3RlbmVycyh0aGlzLCAnZGlyZWN0b3J5JykpIHtcbiAgICB0aGlzLmVtaXQoJ2RpcmVjdG9yeScsIHJlcywgcGF0aClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICh0aGlzLmhhc1RyYWlsaW5nU2xhc2goKSkge1xuICAgIHRoaXMuZXJyb3IoNDAzKVxuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGxvYyA9IGVuY29kZVVybChjb2xsYXBzZUxlYWRpbmdTbGFzaGVzKHRoaXMucGF0aCArICcvJykpXG4gIHZhciBkb2MgPSBjcmVhdGVIdG1sRG9jdW1lbnQoJ1JlZGlyZWN0aW5nJywgJ1JlZGlyZWN0aW5nIHRvIDxhIGhyZWY9XCInICsgZXNjYXBlSHRtbChsb2MpICsgJ1wiPicgK1xuICAgIGVzY2FwZUh0bWwobG9jKSArICc8L2E+JylcblxuICAvLyByZWRpcmVjdFxuICByZXMuc3RhdHVzQ29kZSA9IDMwMVxuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sOyBjaGFyc2V0PVVURi04JylcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1MZW5ndGgnLCBCdWZmZXIuYnl0ZUxlbmd0aChkb2MpKVxuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsIFwiZGVmYXVsdC1zcmMgJ3NlbGYnXCIpXG4gIHJlcy5zZXRIZWFkZXIoJ1gtQ29udGVudC1UeXBlLU9wdGlvbnMnLCAnbm9zbmlmZicpXG4gIHJlcy5zZXRIZWFkZXIoJ0xvY2F0aW9uJywgbG9jKVxuICByZXMuZW5kKGRvYylcbn1cblxuLyoqXG4gKiBQaXBlIHRvIGByZXMuXG4gKlxuICogQHBhcmFtIHtTdHJlYW19IHJlc1xuICogQHJldHVybiB7U3RyZWFtfSByZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuU2VuZFN0cmVhbS5wcm90b3R5cGUucGlwZSA9IGZ1bmN0aW9uIHBpcGUgKHJlcykge1xuICAvLyByb290IHBhdGhcbiAgdmFyIHJvb3QgPSB0aGlzLl9yb290XG5cbiAgLy8gcmVmZXJlbmNlc1xuICB0aGlzLnJlcyA9IHJlc1xuXG4gIC8vIGRlY29kZSB0aGUgcGF0aFxuICB2YXIgcGF0aCA9IGRlY29kZSh0aGlzLnBhdGgpXG4gIGlmIChwYXRoID09PSAtMSkge1xuICAgIHRoaXMuZXJyb3IoNDAwKVxuICAgIHJldHVybiByZXNcbiAgfVxuXG4gIC8vIG51bGwgYnl0ZShzKVxuICBpZiAofnBhdGguaW5kZXhPZignXFwwJykpIHtcbiAgICB0aGlzLmVycm9yKDQwMClcbiAgICByZXR1cm4gcmVzXG4gIH1cblxuICB2YXIgcGFydHNcbiAgaWYgKHJvb3QgIT09IG51bGwpIHtcbiAgICAvLyBub3JtYWxpemVcbiAgICBpZiAocGF0aCkge1xuICAgICAgcGF0aCA9IG5vcm1hbGl6ZSgnLicgKyBzZXAgKyBwYXRoKVxuICAgIH1cblxuICAgIC8vIG1hbGljaW91cyBwYXRoXG4gICAgaWYgKFVQX1BBVEhfUkVHRVhQLnRlc3QocGF0aCkpIHtcbiAgICAgIGRlYnVnKCdtYWxpY2lvdXMgcGF0aCBcIiVzXCInLCBwYXRoKVxuICAgICAgdGhpcy5lcnJvcig0MDMpXG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgLy8gZXhwbG9kZSBwYXRoIHBhcnRzXG4gICAgcGFydHMgPSBwYXRoLnNwbGl0KHNlcClcblxuICAgIC8vIGpvaW4gLyBub3JtYWxpemUgZnJvbSBvcHRpb25hbCByb290IGRpclxuICAgIHBhdGggPSBub3JtYWxpemUoam9pbihyb290LCBwYXRoKSlcbiAgICByb290ID0gbm9ybWFsaXplKHJvb3QgKyBzZXApXG4gIH0gZWxzZSB7XG4gICAgLy8gXCIuLlwiIGlzIG1hbGljaW91cyB3aXRob3V0IFwicm9vdFwiXG4gICAgaWYgKFVQX1BBVEhfUkVHRVhQLnRlc3QocGF0aCkpIHtcbiAgICAgIGRlYnVnKCdtYWxpY2lvdXMgcGF0aCBcIiVzXCInLCBwYXRoKVxuICAgICAgdGhpcy5lcnJvcig0MDMpXG4gICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgLy8gZXhwbG9kZSBwYXRoIHBhcnRzXG4gICAgcGFydHMgPSBub3JtYWxpemUocGF0aCkuc3BsaXQoc2VwKVxuXG4gICAgLy8gcmVzb2x2ZSB0aGUgcGF0aFxuICAgIHBhdGggPSByZXNvbHZlKHBhdGgpXG4gIH1cblxuICAvLyBkb3RmaWxlIGhhbmRsaW5nXG4gIGlmIChjb250YWluc0RvdEZpbGUocGFydHMpKSB7XG4gICAgdmFyIGFjY2VzcyA9IHRoaXMuX2RvdGZpbGVzXG5cbiAgICAvLyBsZWdhY3kgc3VwcG9ydFxuICAgIGlmIChhY2Nlc3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWNjZXNzID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV1bMF0gPT09ICcuJ1xuICAgICAgICA/ICh0aGlzLl9oaWRkZW4gPyAnYWxsb3cnIDogJ2lnbm9yZScpXG4gICAgICAgIDogJ2FsbG93J1xuICAgIH1cblxuICAgIGRlYnVnKCclcyBkb3RmaWxlIFwiJXNcIicsIGFjY2VzcywgcGF0aClcbiAgICBzd2l0Y2ggKGFjY2Vzcykge1xuICAgICAgY2FzZSAnYWxsb3cnOlxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnZGVueSc6XG4gICAgICAgIHRoaXMuZXJyb3IoNDAzKVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICBjYXNlICdpZ25vcmUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5lcnJvcig0MDQpXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG4gIH1cblxuICAvLyBpbmRleCBmaWxlIHN1cHBvcnRcbiAgaWYgKHRoaXMuX2luZGV4Lmxlbmd0aCAmJiB0aGlzLmhhc1RyYWlsaW5nU2xhc2goKSkge1xuICAgIHRoaXMuc2VuZEluZGV4KHBhdGgpXG4gICAgcmV0dXJuIHJlc1xuICB9XG5cbiAgdGhpcy5zZW5kRmlsZShwYXRoKVxuICByZXR1cm4gcmVzXG59XG5cbi8qKlxuICogVHJhbnNmZXIgYHBhdGhgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiBzZW5kIChwYXRoLCBzdGF0KSB7XG4gIHZhciBsZW4gPSBzdGF0LnNpemVcbiAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNcbiAgdmFyIG9wdHMgPSB7fVxuICB2YXIgcmVzID0gdGhpcy5yZXNcbiAgdmFyIHJlcSA9IHRoaXMucmVxXG4gIHZhciByYW5nZXMgPSByZXEuaGVhZGVycy5yYW5nZVxuICB2YXIgb2Zmc2V0ID0gb3B0aW9ucy5zdGFydCB8fCAwXG5cbiAgaWYgKGhlYWRlcnNTZW50KHJlcykpIHtcbiAgICAvLyBpbXBvc3NpYmxlIHRvIHNlbmQgbm93XG4gICAgdGhpcy5oZWFkZXJzQWxyZWFkeVNlbnQoKVxuICAgIHJldHVyblxuICB9XG5cbiAgZGVidWcoJ3BpcGUgXCIlc1wiJywgcGF0aClcblxuICAvLyBzZXQgaGVhZGVyIGZpZWxkc1xuICB0aGlzLnNldEhlYWRlcihwYXRoLCBzdGF0KVxuXG4gIC8vIHNldCBjb250ZW50LXR5cGVcbiAgdGhpcy50eXBlKHBhdGgpXG5cbiAgLy8gY29uZGl0aW9uYWwgR0VUIHN1cHBvcnRcbiAgaWYgKHRoaXMuaXNDb25kaXRpb25hbEdFVCgpKSB7XG4gICAgaWYgKHRoaXMuaXNQcmVjb25kaXRpb25GYWlsdXJlKCkpIHtcbiAgICAgIHRoaXMuZXJyb3IoNDEyKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNDYWNoYWJsZSgpICYmIHRoaXMuaXNGcmVzaCgpKSB7XG4gICAgICB0aGlzLm5vdE1vZGlmaWVkKClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIC8vIGFkanVzdCBsZW4gdG8gc3RhcnQvZW5kIG9wdGlvbnNcbiAgbGVuID0gTWF0aC5tYXgoMCwgbGVuIC0gb2Zmc2V0KVxuICBpZiAob3B0aW9ucy5lbmQgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBieXRlcyA9IG9wdGlvbnMuZW5kIC0gb2Zmc2V0ICsgMVxuICAgIGlmIChsZW4gPiBieXRlcykgbGVuID0gYnl0ZXNcbiAgfVxuXG4gIC8vIFJhbmdlIHN1cHBvcnRcbiAgaWYgKHRoaXMuX2FjY2VwdFJhbmdlcyAmJiBCWVRFU19SQU5HRV9SRUdFWFAudGVzdChyYW5nZXMpKSB7XG4gICAgLy8gcGFyc2VcbiAgICByYW5nZXMgPSBwYXJzZVJhbmdlKGxlbiwgcmFuZ2VzLCB7XG4gICAgICBjb21iaW5lOiB0cnVlXG4gICAgfSlcblxuICAgIC8vIElmLVJhbmdlIHN1cHBvcnRcbiAgICBpZiAoIXRoaXMuaXNSYW5nZUZyZXNoKCkpIHtcbiAgICAgIGRlYnVnKCdyYW5nZSBzdGFsZScpXG4gICAgICByYW5nZXMgPSAtMlxuICAgIH1cblxuICAgIC8vIHVuc2F0aXNmaWFibGVcbiAgICBpZiAocmFuZ2VzID09PSAtMSkge1xuICAgICAgZGVidWcoJ3JhbmdlIHVuc2F0aXNmaWFibGUnKVxuXG4gICAgICAvLyBDb250ZW50LVJhbmdlXG4gICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVJhbmdlJywgY29udGVudFJhbmdlKCdieXRlcycsIGxlbikpXG5cbiAgICAgIC8vIDQxNiBSZXF1ZXN0ZWQgUmFuZ2UgTm90IFNhdGlzZmlhYmxlXG4gICAgICByZXR1cm4gdGhpcy5lcnJvcig0MTYsIHtcbiAgICAgICAgaGVhZGVyczogeydDb250ZW50LVJhbmdlJzogcmVzLmdldEhlYWRlcignQ29udGVudC1SYW5nZScpfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyB2YWxpZCAoc3ludGFjdGljYWxseSBpbnZhbGlkL211bHRpcGxlIHJhbmdlcyBhcmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgcmVzcG9uc2UpXG4gICAgaWYgKHJhbmdlcyAhPT0gLTIgJiYgcmFuZ2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZGVidWcoJ3JhbmdlICVqJywgcmFuZ2VzKVxuXG4gICAgICAvLyBDb250ZW50LVJhbmdlXG4gICAgICByZXMuc3RhdHVzQ29kZSA9IDIwNlxuICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1SYW5nZScsIGNvbnRlbnRSYW5nZSgnYnl0ZXMnLCBsZW4sIHJhbmdlc1swXSkpXG5cbiAgICAgIC8vIGFkanVzdCBmb3IgcmVxdWVzdGVkIHJhbmdlXG4gICAgICBvZmZzZXQgKz0gcmFuZ2VzWzBdLnN0YXJ0XG4gICAgICBsZW4gPSByYW5nZXNbMF0uZW5kIC0gcmFuZ2VzWzBdLnN0YXJ0ICsgMVxuICAgIH1cbiAgfVxuXG4gIC8vIGNsb25lIG9wdGlvbnNcbiAgZm9yICh2YXIgcHJvcCBpbiBvcHRpb25zKSB7XG4gICAgb3B0c1twcm9wXSA9IG9wdGlvbnNbcHJvcF1cbiAgfVxuXG4gIC8vIHNldCByZWFkIG9wdGlvbnNcbiAgb3B0cy5zdGFydCA9IG9mZnNldFxuICBvcHRzLmVuZCA9IE1hdGgubWF4KG9mZnNldCwgb2Zmc2V0ICsgbGVuIC0gMSlcblxuICAvLyBjb250ZW50LWxlbmd0aFxuICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIGxlbilcblxuICAvLyBIRUFEIHN1cHBvcnRcbiAgaWYgKHJlcS5tZXRob2QgPT09ICdIRUFEJykge1xuICAgIHJlcy5lbmQoKVxuICAgIHJldHVyblxuICB9XG5cbiAgdGhpcy5zdHJlYW0ocGF0aCwgb3B0cylcbn1cblxuLyoqXG4gKiBUcmFuc2ZlciBmaWxlIGZvciBgcGF0aGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5TZW5kU3RyZWFtLnByb3RvdHlwZS5zZW5kRmlsZSA9IGZ1bmN0aW9uIHNlbmRGaWxlIChwYXRoKSB7XG4gIHZhciBpID0gMFxuICB2YXIgc2VsZiA9IHRoaXNcblxuICBkZWJ1Zygnc3RhdCBcIiVzXCInLCBwYXRoKVxuICBmcy5zdGF0KHBhdGgsIGZ1bmN0aW9uIG9uc3RhdCAoZXJyLCBzdGF0KSB7XG4gICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ0VOT0VOVCcgJiYgIWV4dG5hbWUocGF0aCkgJiYgcGF0aFtwYXRoLmxlbmd0aCAtIDFdICE9PSBzZXApIHtcbiAgICAgIC8vIG5vdCBmb3VuZCwgY2hlY2sgZXh0ZW5zaW9uc1xuICAgICAgcmV0dXJuIG5leHQoZXJyKVxuICAgIH1cbiAgICBpZiAoZXJyKSByZXR1cm4gc2VsZi5vblN0YXRFcnJvcihlcnIpXG4gICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIHNlbGYucmVkaXJlY3QocGF0aClcbiAgICBzZWxmLmVtaXQoJ2ZpbGUnLCBwYXRoLCBzdGF0KVxuICAgIHNlbGYuc2VuZChwYXRoLCBzdGF0KVxuICB9KVxuXG4gIGZ1bmN0aW9uIG5leHQgKGVycikge1xuICAgIGlmIChzZWxmLl9leHRlbnNpb25zLmxlbmd0aCA8PSBpKSB7XG4gICAgICByZXR1cm4gZXJyXG4gICAgICAgID8gc2VsZi5vblN0YXRFcnJvcihlcnIpXG4gICAgICAgIDogc2VsZi5lcnJvcig0MDQpXG4gICAgfVxuXG4gICAgdmFyIHAgPSBwYXRoICsgJy4nICsgc2VsZi5fZXh0ZW5zaW9uc1tpKytdXG5cbiAgICBkZWJ1Zygnc3RhdCBcIiVzXCInLCBwKVxuICAgIGZzLnN0YXQocCwgZnVuY3Rpb24gKGVyciwgc3RhdCkge1xuICAgICAgaWYgKGVycikgcmV0dXJuIG5leHQoZXJyKVxuICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIG5leHQoKVxuICAgICAgc2VsZi5lbWl0KCdmaWxlJywgcCwgc3RhdClcbiAgICAgIHNlbGYuc2VuZChwLCBzdGF0KVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBUcmFuc2ZlciBpbmRleCBmb3IgYHBhdGhgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuU2VuZFN0cmVhbS5wcm90b3R5cGUuc2VuZEluZGV4ID0gZnVuY3Rpb24gc2VuZEluZGV4IChwYXRoKSB7XG4gIHZhciBpID0gLTFcbiAgdmFyIHNlbGYgPSB0aGlzXG5cbiAgZnVuY3Rpb24gbmV4dCAoZXJyKSB7XG4gICAgaWYgKCsraSA+PSBzZWxmLl9pbmRleC5sZW5ndGgpIHtcbiAgICAgIGlmIChlcnIpIHJldHVybiBzZWxmLm9uU3RhdEVycm9yKGVycilcbiAgICAgIHJldHVybiBzZWxmLmVycm9yKDQwNClcbiAgICB9XG5cbiAgICB2YXIgcCA9IGpvaW4ocGF0aCwgc2VsZi5faW5kZXhbaV0pXG5cbiAgICBkZWJ1Zygnc3RhdCBcIiVzXCInLCBwKVxuICAgIGZzLnN0YXQocCwgZnVuY3Rpb24gKGVyciwgc3RhdCkge1xuICAgICAgaWYgKGVycikgcmV0dXJuIG5leHQoZXJyKVxuICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIG5leHQoKVxuICAgICAgc2VsZi5lbWl0KCdmaWxlJywgcCwgc3RhdClcbiAgICAgIHNlbGYuc2VuZChwLCBzdGF0KVxuICAgIH0pXG4gIH1cblxuICBuZXh0KClcbn1cblxuLyoqXG4gKiBTdHJlYW0gYHBhdGhgIHRvIHRoZSByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLnN0cmVhbSA9IGZ1bmN0aW9uIHN0cmVhbSAocGF0aCwgb3B0aW9ucykge1xuICAvLyBUT0RPOiB0aGlzIGlzIGFsbCBsYW1lLCByZWZhY3RvciBtZWVlZVxuICB2YXIgZmluaXNoZWQgPSBmYWxzZVxuICB2YXIgc2VsZiA9IHRoaXNcbiAgdmFyIHJlcyA9IHRoaXMucmVzXG5cbiAgLy8gcGlwZVxuICB2YXIgc3RyZWFtID0gZnMuY3JlYXRlUmVhZFN0cmVhbShwYXRoLCBvcHRpb25zKVxuICB0aGlzLmVtaXQoJ3N0cmVhbScsIHN0cmVhbSlcbiAgc3RyZWFtLnBpcGUocmVzKVxuXG4gIC8vIHJlc3BvbnNlIGZpbmlzaGVkLCBkb25lIHdpdGggdGhlIGZkXG4gIG9uRmluaXNoZWQocmVzLCBmdW5jdGlvbiBvbmZpbmlzaGVkICgpIHtcbiAgICBmaW5pc2hlZCA9IHRydWVcbiAgICBkZXN0cm95KHN0cmVhbSlcbiAgfSlcblxuICAvLyBlcnJvciBoYW5kbGluZyBjb2RlLXNtZWxsXG4gIHN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiBvbmVycm9yIChlcnIpIHtcbiAgICAvLyByZXF1ZXN0IGFscmVhZHkgZmluaXNoZWRcbiAgICBpZiAoZmluaXNoZWQpIHJldHVyblxuXG4gICAgLy8gY2xlYW4gdXAgc3RyZWFtXG4gICAgZmluaXNoZWQgPSB0cnVlXG4gICAgZGVzdHJveShzdHJlYW0pXG5cbiAgICAvLyBlcnJvclxuICAgIHNlbGYub25TdGF0RXJyb3IoZXJyKVxuICB9KVxuXG4gIC8vIGVuZFxuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uIG9uZW5kICgpIHtcbiAgICBzZWxmLmVtaXQoJ2VuZCcpXG4gIH0pXG59XG5cbi8qKlxuICogU2V0IGNvbnRlbnQtdHlwZSBiYXNlZCBvbiBgcGF0aGBcbiAqIGlmIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5TZW5kU3RyZWFtLnByb3RvdHlwZS50eXBlID0gZnVuY3Rpb24gdHlwZSAocGF0aCkge1xuICB2YXIgcmVzID0gdGhpcy5yZXNcblxuICBpZiAocmVzLmdldEhlYWRlcignQ29udGVudC1UeXBlJykpIHJldHVyblxuXG4gIHZhciB0eXBlID0gbWltZS5sb29rdXAocGF0aClcblxuICBpZiAoIXR5cGUpIHtcbiAgICBkZWJ1Zygnbm8gY29udGVudC10eXBlJylcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBjaGFyc2V0ID0gbWltZS5jaGFyc2V0cy5sb29rdXAodHlwZSlcblxuICBkZWJ1ZygnY29udGVudC10eXBlICVzJywgdHlwZSlcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgdHlwZSArIChjaGFyc2V0ID8gJzsgY2hhcnNldD0nICsgY2hhcnNldCA6ICcnKSlcbn1cblxuLyoqXG4gKiBTZXQgcmVzcG9uc2UgaGVhZGVyIGZpZWxkcywgbW9zdFxuICogZmllbGRzIG1heSBiZSBwcmUtZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtPYmplY3R9IHN0YXRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cblNlbmRTdHJlYW0ucHJvdG90eXBlLnNldEhlYWRlciA9IGZ1bmN0aW9uIHNldEhlYWRlciAocGF0aCwgc3RhdCkge1xuICB2YXIgcmVzID0gdGhpcy5yZXNcblxuICB0aGlzLmVtaXQoJ2hlYWRlcnMnLCByZXMsIHBhdGgsIHN0YXQpXG5cbiAgaWYgKHRoaXMuX2FjY2VwdFJhbmdlcyAmJiAhcmVzLmdldEhlYWRlcignQWNjZXB0LVJhbmdlcycpKSB7XG4gICAgZGVidWcoJ2FjY2VwdCByYW5nZXMnKVxuICAgIHJlcy5zZXRIZWFkZXIoJ0FjY2VwdC1SYW5nZXMnLCAnYnl0ZXMnKVxuICB9XG5cbiAgaWYgKHRoaXMuX2NhY2hlQ29udHJvbCAmJiAhcmVzLmdldEhlYWRlcignQ2FjaGUtQ29udHJvbCcpKSB7XG4gICAgdmFyIGNhY2hlQ29udHJvbCA9ICdwdWJsaWMsIG1heC1hZ2U9JyArIE1hdGguZmxvb3IodGhpcy5fbWF4YWdlIC8gMTAwMClcblxuICAgIGlmICh0aGlzLl9pbW11dGFibGUpIHtcbiAgICAgIGNhY2hlQ29udHJvbCArPSAnLCBpbW11dGFibGUnXG4gICAgfVxuXG4gICAgZGVidWcoJ2NhY2hlLWNvbnRyb2wgJXMnLCBjYWNoZUNvbnRyb2wpXG4gICAgcmVzLnNldEhlYWRlcignQ2FjaGUtQ29udHJvbCcsIGNhY2hlQ29udHJvbClcbiAgfVxuXG4gIGlmICh0aGlzLl9sYXN0TW9kaWZpZWQgJiYgIXJlcy5nZXRIZWFkZXIoJ0xhc3QtTW9kaWZpZWQnKSkge1xuICAgIHZhciBtb2RpZmllZCA9IHN0YXQubXRpbWUudG9VVENTdHJpbmcoKVxuICAgIGRlYnVnKCdtb2RpZmllZCAlcycsIG1vZGlmaWVkKVxuICAgIHJlcy5zZXRIZWFkZXIoJ0xhc3QtTW9kaWZpZWQnLCBtb2RpZmllZClcbiAgfVxuXG4gIGlmICh0aGlzLl9ldGFnICYmICFyZXMuZ2V0SGVhZGVyKCdFVGFnJykpIHtcbiAgICB2YXIgdmFsID0gZXRhZyhzdGF0KVxuICAgIGRlYnVnKCdldGFnICVzJywgdmFsKVxuICAgIHJlcy5zZXRIZWFkZXIoJ0VUYWcnLCB2YWwpXG4gIH1cbn1cblxuLyoqXG4gKiBDbGVhciBhbGwgaGVhZGVycyBmcm9tIGEgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlc1xuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjbGVhckhlYWRlcnMgKHJlcykge1xuICB2YXIgaGVhZGVycyA9IGdldEhlYWRlck5hbWVzKHJlcylcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICByZXMucmVtb3ZlSGVhZGVyKGhlYWRlcnNbaV0pXG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsYXBzZSBhbGwgbGVhZGluZyBzbGFzaGVzIGludG8gYSBzaW5nbGUgc2xhc2hcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjb2xsYXBzZUxlYWRpbmdTbGFzaGVzIChzdHIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3RyW2ldICE9PSAnLycpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGkgPiAxXG4gICAgPyAnLycgKyBzdHIuc3Vic3RyKGkpXG4gICAgOiBzdHJcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgcGF0aCBwYXJ0cyBjb250YWluIGEgZG90ZmlsZS5cbiAqXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb250YWluc0RvdEZpbGUgKHBhcnRzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGFydCA9IHBhcnRzW2ldXG4gICAgaWYgKHBhcnQubGVuZ3RoID4gMSAmJiBwYXJ0WzBdID09PSAnLicpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgQ29udGVudC1SYW5nZSBoZWFkZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gKiBAcGFyYW0ge2FycmF5fSBbcmFuZ2VdXG4gKi9cblxuZnVuY3Rpb24gY29udGVudFJhbmdlICh0eXBlLCBzaXplLCByYW5nZSkge1xuICByZXR1cm4gdHlwZSArICcgJyArIChyYW5nZSA/IHJhbmdlLnN0YXJ0ICsgJy0nICsgcmFuZ2UuZW5kIDogJyonKSArICcvJyArIHNpemVcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBtaW5pbWFsIEhUTUwgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gKiBAcGFyYW0ge3N0cmluZ30gYm9keVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVIdG1sRG9jdW1lbnQgKHRpdGxlLCBib2R5KSB7XG4gIHJldHVybiAnPCFET0NUWVBFIGh0bWw+XFxuJyArXG4gICAgJzxodG1sIGxhbmc9XCJlblwiPlxcbicgK1xuICAgICc8aGVhZD5cXG4nICtcbiAgICAnPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XFxuJyArXG4gICAgJzx0aXRsZT4nICsgdGl0bGUgKyAnPC90aXRsZT5cXG4nICtcbiAgICAnPC9oZWFkPlxcbicgK1xuICAgICc8Ym9keT5cXG4nICtcbiAgICAnPHByZT4nICsgYm9keSArICc8L3ByZT5cXG4nICtcbiAgICAnPC9ib2R5PlxcbicgK1xuICAgICc8L2h0bWw+XFxuJ1xufVxuXG4vKipcbiAqIGRlY29kZVVSSUNvbXBvbmVudC5cbiAqXG4gKiBBbGxvd3MgVjggdG8gb25seSBkZW9wdGltaXplIHRoaXMgZm4gaW5zdGVhZCBvZiBhbGxcbiAqIG9mIHNlbmQoKS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZGVjb2RlIChwYXRoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChwYXRoKVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgaGVhZGVyIG5hbWVzIG9uIGEgcmVzcG5zZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzXG4gKiBAcmV0dXJucyB7YXJyYXlbc3RyaW5nXX1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0SGVhZGVyTmFtZXMgKHJlcykge1xuICByZXR1cm4gdHlwZW9mIHJlcy5nZXRIZWFkZXJOYW1lcyAhPT0gJ2Z1bmN0aW9uJ1xuICAgID8gT2JqZWN0LmtleXMocmVzLl9oZWFkZXJzIHx8IHt9KVxuICAgIDogcmVzLmdldEhlYWRlck5hbWVzKClcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgZW1pdHRlciBoYXMgbGlzdGVuZXJzIG9mIGEgZ2l2ZW4gdHlwZS5cbiAqXG4gKiBUaGUgd2F5IHRvIGRvIHRoaXMgY2hlY2sgaXMgZG9uZSB0aHJlZSBkaWZmZXJlbnQgd2F5cyBpbiBOb2RlLmpzID49IDAuOFxuICogc28gdGhpcyBjb25zb2xpZGF0ZXMgdGhlbSBpbnRvIGEgbWluaW1hbCBzZXQgdXNpbmcgaW5zdGFuY2UgbWV0aG9kcy5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50RW1pdHRlcn0gZW1pdHRlclxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBoYXNMaXN0ZW5lcnMgKGVtaXR0ZXIsIHR5cGUpIHtcbiAgdmFyIGNvdW50ID0gdHlwZW9mIGVtaXR0ZXIubGlzdGVuZXJDb3VudCAhPT0gJ2Z1bmN0aW9uJ1xuICAgID8gZW1pdHRlci5saXN0ZW5lcnModHlwZSkubGVuZ3RoXG4gICAgOiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSlcblxuICByZXR1cm4gY291bnQgPiAwXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSByZXNwb25zZSBoZWFkZXJzIGhhdmUgYmVlbiBzZW50LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBoZWFkZXJzU2VudCAocmVzKSB7XG4gIHJldHVybiB0eXBlb2YgcmVzLmhlYWRlcnNTZW50ICE9PSAnYm9vbGVhbidcbiAgICA/IEJvb2xlYW4ocmVzLl9oZWFkZXIpXG4gICAgOiByZXMuaGVhZGVyc1NlbnRcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIGluZGV4IG9wdGlvbiBpbnRvIGFuIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd8YXJyYXl9IHZhbFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplTGlzdCAodmFsLCBuYW1lKSB7XG4gIHZhciBsaXN0ID0gW10uY29uY2F0KHZhbCB8fCBbXSlcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodHlwZW9mIGxpc3RbaV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG5hbWUgKyAnIG11c3QgYmUgYXJyYXkgb2Ygc3RyaW5ncyBvciBmYWxzZScpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxpc3Rcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBIVFRQIERhdGUgaW50byBhIG51bWJlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0ZVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZUh0dHBEYXRlIChkYXRlKSB7XG4gIHZhciB0aW1lc3RhbXAgPSBkYXRlICYmIERhdGUucGFyc2UoZGF0ZSlcblxuICByZXR1cm4gdHlwZW9mIHRpbWVzdGFtcCA9PT0gJ251bWJlcidcbiAgICA/IHRpbWVzdGFtcFxuICAgIDogTmFOXG59XG5cbi8qKlxuICogUGFyc2UgYSBIVFRQIHRva2VuIGxpc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZVRva2VuTGlzdCAoc3RyKSB7XG4gIHZhciBlbmQgPSAwXG4gIHZhciBsaXN0ID0gW11cbiAgdmFyIHN0YXJ0ID0gMFxuXG4gIC8vIGdhdGhlciB0b2tlbnNcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaSkpIHtcbiAgICAgIGNhc2UgMHgyMDogLyogICAqL1xuICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgICAgICAgIHN0YXJ0ID0gZW5kID0gaSArIDFcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAweDJjOiAvKiAsICovXG4gICAgICAgIGxpc3QucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKVxuICAgICAgICBzdGFydCA9IGVuZCA9IGkgKyAxXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlbmQgPSBpICsgMVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmFsIHRva2VuXG4gIGxpc3QucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKVxuXG4gIHJldHVybiBsaXN0XG59XG5cbi8qKlxuICogU2V0IGFuIG9iamVjdCBvZiBoZWFkZXJzIG9uIGEgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlc1xuICogQHBhcmFtIHtvYmplY3R9IGhlYWRlcnNcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2V0SGVhZGVycyAocmVzLCBoZWFkZXJzKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycylcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXVxuICAgIHJlcy5zZXRIZWFkZXIoa2V5LCBoZWFkZXJzW2tleV0pXG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9zZW5kL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIgaW5kZXggPSB0aGlzLl9pO1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBPLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSA1M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW50ZWdlci5qc1xuLy8gbW9kdWxlIGlkID0gNTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVmaW5lZC5qc1xuLy8gbW9kdWxlIGlkID0gNTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyICRpdGVyQ3JlYXRlID0gcmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBCVUdHWSA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKTsgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxudmFyIEZGX0lURVJBVE9SID0gJ0BAaXRlcmF0b3InO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uIChraW5kKSB7XG4gICAgaWYgKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKSByZXR1cm4gcHJvdG9ba2luZF07XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgdmFyIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFUztcbiAgdmFyIFZBTFVFU19CVUcgPSBmYWxzZTtcbiAgdmFyIHByb3RvID0gQmFzZS5wcm90b3R5cGU7XG4gIHZhciAkbmF0aXZlID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdO1xuICB2YXIgJGRlZmF1bHQgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKTtcbiAgdmFyICRlbnRyaWVzID0gREVGQVVMVCA/ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKSA6IHVuZGVmaW5lZDtcbiAgdmFyICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlO1xuICB2YXIgbWV0aG9kcywga2V5LCBJdGVyYXRvclByb3RvdHlwZTtcbiAgLy8gRml4IG5hdGl2ZVxuICBpZiAoJGFueU5hdGl2ZSkge1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKCkpKTtcbiAgICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgSXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmICghTElCUkFSWSAmJiB0eXBlb2YgSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIGhpZGUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICB9XG4gIH1cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgVkFMVUVTX0JVRyA9IHRydWU7XG4gICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiAkbmF0aXZlLmNhbGwodGhpcyk7IH07XG4gIH1cbiAgLy8gRGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSkge1xuICAgIGhpZGUocHJvdG8sIElURVJBVE9SLCAkZGVmYXVsdCk7XG4gIH1cbiAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuICBJdGVyYXRvcnNbTkFNRV0gPSAkZGVmYXVsdDtcbiAgSXRlcmF0b3JzW1RBR10gPSByZXR1cm5UaGlzO1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYgKEZPUkNFRCkgZm9yIChrZXkgaW4gbWV0aG9kcykge1xuICAgICAgaWYgKCEoa2V5IGluIHByb3RvKSkgcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZWZpbmUuanNcbi8vIG1vZHVsZSBpZCA9IDU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gdHJ1ZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbGlicmFyeS5qc1xuLy8gbW9kdWxlIGlkID0gNTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDU4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWlvYmplY3QuanNcbi8vIG1vZHVsZSBpZCA9IDU5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1sZW5ndGguanNcbi8vIG1vZHVsZSBpZCA9IDYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQta2V5LmpzXG4vLyBtb2R1bGUgaWQgPSA2MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdWlkLmpzXG4vLyBtb2R1bGUgaWQgPSA2MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG52YXIgRE9NSXRlcmFibGVzID0gKCdDU1NSdWxlTGlzdCxDU1NTdHlsZURlY2xhcmF0aW9uLENTU1ZhbHVlTGlzdCxDbGllbnRSZWN0TGlzdCxET01SZWN0TGlzdCxET01TdHJpbmdMaXN0LCcgK1xuICAnRE9NVG9rZW5MaXN0LERhdGFUcmFuc2Zlckl0ZW1MaXN0LEZpbGVMaXN0LEhUTUxBbGxDb2xsZWN0aW9uLEhUTUxDb2xsZWN0aW9uLEhUTUxGb3JtRWxlbWVudCxIVE1MU2VsZWN0RWxlbWVudCwnICtcbiAgJ01lZGlhTGlzdCxNaW1lVHlwZUFycmF5LE5hbWVkTm9kZU1hcCxOb2RlTGlzdCxQYWludFJlcXVlc3RMaXN0LFBsdWdpbixQbHVnaW5BcnJheSxTVkdMZW5ndGhMaXN0LFNWR051bWJlckxpc3QsJyArXG4gICdTVkdQYXRoU2VnTGlzdCxTVkdQb2ludExpc3QsU1ZHU3RyaW5nTGlzdCxTVkdUcmFuc2Zvcm1MaXN0LFNvdXJjZUJ1ZmZlckxpc3QsU3R5bGVTaGVldExpc3QsVGV4dFRyYWNrQ3VlTGlzdCwnICtcbiAgJ1RleHRUcmFja0xpc3QsVG91Y2hMaXN0Jykuc3BsaXQoJywnKTtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCBET01JdGVyYWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIE5BTUUgPSBET01JdGVyYWJsZXNbaV07XG4gIHZhciBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdO1xuICB2YXIgcHJvdG8gPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZiAocHJvdG8gJiYgIXByb3RvW1RPX1NUUklOR19UQUddKSBoaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcbiAgSXRlcmF0b3JzW05BTUVdID0gSXRlcmF0b3JzLkFycmF5O1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDYzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG4vLyBFUzMgd3JvbmcgaGVyZVxudmFyIEFSRyA9IGNvZihmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY2xhc3NvZi5qc1xuLy8gbW9kdWxlIGlkID0gNjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIENvbnN0cnVjdG9yLCBuYW1lLCBmb3JiaWRkZW5GaWVsZCkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB8fCAoZm9yYmlkZGVuRmllbGQgIT09IHVuZGVmaW5lZCAmJiBmb3JiaWRkZW5GaWVsZCBpbiBpdCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IobmFtZSArICc6IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICB9IHJldHVybiBpdDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FuLWluc3RhbmNlLmpzXG4vLyBtb2R1bGUgaWQgPSA2NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyAyNS40LjEuNSBOZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcblxuZnVuY3Rpb24gUHJvbWlzZUNhcGFiaWxpdHkoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanNcbi8vIG1vZHVsZSBpZCA9IDY2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIHNhZmUpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGlmIChzYWZlICYmIHRhcmdldFtrZXldKSB0YXJnZXRba2V5XSA9IHNyY1trZXldO1xuICAgIGVsc2UgaGlkZSh0YXJnZXQsIGtleSwgc3JjW2tleV0pO1xuICB9IHJldHVybiB0YXJnZXQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19yZWRlZmluZS1hbGwuanNcbi8vIG1vZHVsZSBpZCA9IDY3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2VzcydcbmltcG9ydCB7IEFOQUxZVElDU19QQVRIIH0gZnJvbSAnLi4vY29uZmlnJ1xuaW1wb3J0IHtcbiAgQW5vbWFseSxcbiAgQW5vbWFseUlkLCBnZXRBbm9tYWx5VHlwZUluZm8sXG4gIGxvYWRBbm9tYWx5QnlJZCxcbiAgc2V0QW5vbWFseVByZWRpY3Rpb25UaW1lLFxuICBzZXRBbm9tYWx5U3RhdHVzXG59IGZyb20gJy4vYW5vbWFseVR5cGUnXG5pbXBvcnQgeyBnZXRUYXJnZXQgfSBmcm9tICcuL21ldHJpY3MnO1xuaW1wb3J0IHsgZ2V0TGFiZWxlZFNlZ21lbnRzLCBpbnNlcnRTZWdtZW50cywgcmVtb3ZlU2VnbWVudHMgfSBmcm9tICcuL3NlZ21lbnRzJztcbmltcG9ydCB7IHNwbGl0LCBtYXAsIG1hcFN5bmMgfSBmcm9tICdldmVudC1zdHJlYW0nO1xuXG5jb25zdCBsZWFybldvcmtlciA9IHNwYXduKCdweXRob24zJywgWyd3b3JrZXIucHknXSwgeyBjd2Q6IEFOQUxZVElDU19QQVRIIH0pXG5sZWFybldvcmtlci5zdGRvdXQucGlwZShzcGxpdCgpKVxuICAucGlwZShcbiAgICBtYXBTeW5jKGZ1bmN0aW9uKGxpbmUpe1xuICAgICAgb25NZXNzYWdlKGxpbmUpXG4gICAgfSlcbiAgKTtcblxubGVhcm5Xb3JrZXIuc3RkZXJyLm9uKCdkYXRhJywgZGF0YSA9PiBjb25zb2xlLmVycm9yKGB3b3JrZXIgc3RkZXJyOiAke2RhdGF9YCkpO1xuXG5jb25zdCB0YXNrTWFwID0ge307XG5sZXQgbmV4dFRhc2tJZCA9IDA7XG5cbmZ1bmN0aW9uIG9uTWVzc2FnZShkYXRhKSB7XG4gIGNvbnNvbGUubG9nKGB3b3JrZXIgc3Rkb3V0OiAke2RhdGF9YCk7XG4gIGxldCByZXNwb25zZSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gIGxldCB0YXNrSWQgPSByZXNwb25zZS5fX3Rhc2tfaWQ7XG4gIC8vIGxldCBhbm9tYWx5TmFtZSA9IHJlc3BvbnNlLmFub21hbHlfbmFtZTtcbiAgLy8gbGV0IHRhc2sgPSByZXNwb25zZS50YXNrO1xuICBsZXQgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuXG4gIGlmKHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnIHx8IHN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICBpZih0YXNrSWQgaW4gdGFza01hcCkge1xuICAgICAgbGV0IHJlc29sdmVyID0gdGFza01hcFt0YXNrSWRdO1xuICAgICAgcmVzb2x2ZXIocmVzcG9uc2UpO1xuICAgICAgZGVsZXRlIHRhc2tNYXBbdGFza0lkXTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcnVuVGFzayh0YXNrKSA6IFByb21pc2U8YW55PiB7XG4gIGxldCBhbm9tYWx5OkFub21hbHkgPSBsb2FkQW5vbWFseUJ5SWQodGFzay5hbm9tYWx5X2lkKTtcbiAgdGFzay5tZXRyaWMgPSB7XG4gICAgZGF0YXNvdXJjZTogYW5vbWFseS5tZXRyaWMuZGF0YXNvdXJjZSxcbiAgICB0YXJnZXRzOiBhbm9tYWx5Lm1ldHJpYy50YXJnZXRzLm1hcCh0ID0+IGdldFRhcmdldCh0KSlcbiAgfTtcblxuICB0YXNrLl9fdGFza19pZCA9IG5leHRUYXNrSWQrKztcbiAgbGV0IGNvbW1hbmQgPSBKU09OLnN0cmluZ2lmeSh0YXNrKVxuICBsZWFybldvcmtlci5zdGRpbi53cml0ZShgJHtjb21tYW5kfVxcbmApO1xuICByZXR1cm4gbmV3IFByb21pc2U8T2JqZWN0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdGFza01hcFt0YXNrLl9fdGFza19pZF0gPSByZXNvbHZlXG4gIH0pXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkxlYXJuaW5nKGFub21hbHlJZDpBbm9tYWx5SWQpIHtcbiAgbGV0IHNlZ21lbnRzID0gZ2V0TGFiZWxlZFNlZ21lbnRzKGFub21hbHlJZCk7XG4gIHNldEFub21hbHlTdGF0dXMoYW5vbWFseUlkLCAnbGVhcm5pbmcnKTtcbiAgbGV0IGFub21hbHk6QW5vbWFseSAgPSBsb2FkQW5vbWFseUJ5SWQoYW5vbWFseUlkKTtcbiAgbGV0IGFuYWx5dGljc1R5cGUgPSBcImFub21hbGllc1wiO1xuICBsZXQgcHJlc2V0ID0gdW5kZWZpbmVkO1xuICBpZiAoYW5vbWFseS5uYW1lLmluY2x1ZGVzKFwianVtcHNcIikpIHtcbiAgICBhbmFseXRpY3NUeXBlID0gXCJwYXR0ZXJuc1wiO1xuICAgIHByZXNldCA9IFwic3RlcHNcIlxuICB9XG4gIGlmIChhbm9tYWx5Lm5hbWUuaW5jbHVkZXMoXCJjbGlmZnNcIikgfHwgYW5vbWFseS5uYW1lLmluY2x1ZGVzKFwiZHJvcHNcIikpIHtcbiAgICBhbmFseXRpY3NUeXBlID0gXCJwYXR0ZXJuc1wiO1xuICAgIHByZXNldCA9IFwiY2xpZmZzXCJcbiAgfVxuICBpZiAoYW5vbWFseS5uYW1lLmluY2x1ZGVzKFwicGVha3NcIikpIHtcbiAgICBhbmFseXRpY3NUeXBlID0gXCJwYXR0ZXJuc1wiO1xuICAgIHByZXNldCA9IFwicGVha3NcIlxuICB9XG4gIGxldCB0YXNrID0ge1xuICAgIHR5cGU6ICdsZWFybicsXG4gICAgYW5vbWFseV9pZDogYW5vbWFseUlkLFxuICAgIGFuYWx5dGljc190eXBlOiBhbmFseXRpY3NUeXBlLFxuICAgIHByZXNldCxcbiAgICBzZWdtZW50czogc2VnbWVudHNcbiAgfTtcblxuICBsZXQgcmVzdWx0ID0gYXdhaXQgcnVuVGFzayh0YXNrKTtcblxuICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgc2V0QW5vbWFseVN0YXR1cyhhbm9tYWx5SWQsICdyZWFkeScpO1xuICAgIGluc2VydFNlZ21lbnRzKGFub21hbHlJZCwgcmVzdWx0LnNlZ21lbnRzLCBmYWxzZSk7XG4gICAgc2V0QW5vbWFseVByZWRpY3Rpb25UaW1lKGFub21hbHlJZCwgcmVzdWx0Lmxhc3RfcHJlZGljdGlvbl90aW1lKTtcbiAgfSBlbHNlIHtcbiAgICBzZXRBbm9tYWx5U3RhdHVzKGFub21hbHlJZCwgJ2ZhaWxlZCcsIHJlc3VsdC5lcnJvcik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJlZGljdChhbm9tYWx5SWQ6QW5vbWFseUlkKSB7XG4gIGxldCBhbm9tYWx5OkFub21hbHkgPSBsb2FkQW5vbWFseUJ5SWQoYW5vbWFseUlkKTtcbiAgbGV0IGFuYWx5dGljc1R5cGUgPSBcImFub21hbGllc1wiO1xuICBsZXQgcHJlc2V0ID0gdW5kZWZpbmVkO1xuICBpZiAoYW5vbWFseS5uYW1lLmluY2x1ZGVzKFwianVtcFwiKSkge1xuICAgIGFuYWx5dGljc1R5cGUgPSBcInBhdHRlcm5zXCI7XG4gICAgcHJlc2V0ID0gXCJzdGVwc1wiXG4gIH1cbiAgaWYgKGFub21hbHkubmFtZS5pbmNsdWRlcyhcImNsaWZmc1wiKSB8fCBhbm9tYWx5Lm5hbWUuaW5jbHVkZXMoXCJkcm9wc1wiKSkge1xuICAgIGFuYWx5dGljc1R5cGUgPSBcInBhdHRlcm5zXCI7XG4gICAgcHJlc2V0ID0gXCJjbGlmZnNcIlxuICB9XG4gIGlmIChhbm9tYWx5Lm5hbWUuaW5jbHVkZXMoXCJwZWFrc1wiKSkge1xuICAgIGFuYWx5dGljc1R5cGUgPSBcInBhdHRlcm5zXCI7XG4gICAgcHJlc2V0ID0gXCJwZWFrc1wiXG4gIH1cbiAgbGV0IHRhc2sgPSB7XG4gICAgdHlwZTogJ3ByZWRpY3QnLFxuICAgIGFub21hbHlfaWQ6IGFub21hbHlJZCxcbiAgICBhbmFseXRpY3NfdHlwZTogYW5hbHl0aWNzVHlwZSxcbiAgICBwcmVzZXQsXG4gICAgbGFzdF9wcmVkaWN0aW9uX3RpbWU6IGFub21hbHkubGFzdF9wcmVkaWN0aW9uX3RpbWVcbiAgfTtcbiAgbGV0IHJlc3VsdCA9IGF3YWl0IHJ1blRhc2sodGFzayk7XG5cbiAgaWYocmVzdWx0LnN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgLy8gTWVyZ2luZyBzZWdtZW50c1xuICBsZXQgc2VnbWVudHMgPSBnZXRMYWJlbGVkU2VnbWVudHMoYW5vbWFseUlkKTtcbiAgaWYoc2VnbWVudHMubGVuZ3RoID4gMCAmJiByZXN1bHQuc2VnbWVudHMubGVuZ3RoID4gMCkge1xuICAgIGxldCBsYXN0T2xkU2VnbWVudCA9IHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdO1xuICAgIGxldCBmaXJzdE5ld1NlZ21lbnQgPSByZXN1bHQuc2VnbWVudHNbMF07XG5cbiAgICBpZihmaXJzdE5ld1NlZ21lbnQuc3RhcnQgPD0gbGFzdE9sZFNlZ21lbnQuZmluaXNoKSB7XG4gICAgICByZXN1bHQuc2VnbWVudHNbMF0uc3RhcnQgPSBsYXN0T2xkU2VnbWVudC5zdGFydDtcbiAgICAgIHJlbW92ZVNlZ21lbnRzKGFub21hbHlJZCwgW2xhc3RPbGRTZWdtZW50LmlkXSk7XG4gICAgfVxuICB9XG5cbiAgaW5zZXJ0U2VnbWVudHMoYW5vbWFseUlkLCByZXN1bHQuc2VnbWVudHMsIGZhbHNlKTtcbiAgc2V0QW5vbWFseVByZWRpY3Rpb25UaW1lKGFub21hbHlJZCwgcmVzdWx0Lmxhc3RfcHJlZGljdGlvbl90aW1lKTtcbiAgcmV0dXJuIHJlc3VsdC5zZWdtZW50cztcbn1cblxuZXhwb3J0IHsgcnVuTGVhcm5pbmcsIHJ1blByZWRpY3QgfVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmljZXMvYW5hbHl0aWNzLnRzIiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2dldC1pdGVyYXRvclwiKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvZ2V0LWl0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSA2OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0SnNvbkRhdGFTeW5jLCB3cml0ZUpzb25EYXRhU3luYyB9ICBmcm9tICcuL2pzb24nO1xuaW1wb3J0IHsgU0VHTUVOVFNfUEFUSCB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBBbm9tYWx5SWQsIGxvYWRBbm9tYWx5QnlJZCwgc2F2ZUFub21hbHkgfSBmcm9tICcuL2Fub21hbHlUeXBlJztcblxuZnVuY3Rpb24gZ2V0TGFiZWxlZFNlZ21lbnRzKGFub21hbHlJZDogQW5vbWFseUlkKSB7XG4gIGxldCBmaWxlbmFtZSA9IHBhdGguam9pbihTRUdNRU5UU19QQVRILCBgJHthbm9tYWx5SWR9X2xhYmVsZWQuanNvbmApO1xuXG4gIGxldCBzZWdtZW50cyA9IFtdO1xuICB0cnkge1xuICAgIHNlZ21lbnRzID0gZ2V0SnNvbkRhdGFTeW5jKGZpbGVuYW1lKTtcbiAgICBmb3IgKGxldCBzZWdtZW50IG9mIHNlZ21lbnRzKSB7XG4gICAgICBpZiAoc2VnbWVudC5sYWJlbGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2VnbWVudC5sYWJlbGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihlLm1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuZnVuY3Rpb24gZ2V0UHJlZGljdGVkU2VnbWVudHMoYW5vbWFseUlkOiBBbm9tYWx5SWQpIHtcbiAgbGV0IGZpbGVuYW1lID0gcGF0aC5qb2luKFNFR01FTlRTX1BBVEgsIGAke2Fub21hbHlJZH1fc2VnbWVudHMuanNvbmApO1xuXG4gIGxldCBqc29uRGF0YTtcbiAgdHJ5IHtcbiAgICBqc29uRGF0YSA9IGdldEpzb25EYXRhU3luYyhmaWxlbmFtZSk7XG4gIH0gY2F0Y2goZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICBqc29uRGF0YSA9IFtdO1xuICB9XG4gIHJldHVybiBqc29uRGF0YTtcbn1cblxuZnVuY3Rpb24gc2F2ZVNlZ21lbnRzKGFub21hbHlJZDogQW5vbWFseUlkLCBzZWdtZW50cykge1xuICBsZXQgZmlsZW5hbWUgPSBwYXRoLmpvaW4oU0VHTUVOVFNfUEFUSCwgYCR7YW5vbWFseUlkfV9sYWJlbGVkLmpzb25gKTtcblxuICB0cnkge1xuICAgIHJldHVybiB3cml0ZUpzb25EYXRhU3luYyhmaWxlbmFtZSwgc2VnbWVudHMpO1xuICB9IGNhdGNoKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGUubWVzc2FnZSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5gdCB3cml0ZSB0byBkYicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc2VydFNlZ21lbnRzKGFub21hbHlJZDogQW5vbWFseUlkLCBhZGRlZFNlZ21lbnRzLCBsYWJlbGVkOmJvb2xlYW4pIHtcbiAgLy8gU2V0IHN0YXR1c1xuICBsZXQgaW5mbyA9IGxvYWRBbm9tYWx5QnlJZChhbm9tYWx5SWQpO1xuICBsZXQgc2VnbWVudHMgPSBnZXRMYWJlbGVkU2VnbWVudHMoYW5vbWFseUlkKTtcblxuICBsZXQgbmV4dElkID0gaW5mby5uZXh0X2lkO1xuICBsZXQgYWRkZWRJZHMgPSBbXVxuICBmb3IgKGxldCBzZWdtZW50IG9mIGFkZGVkU2VnbWVudHMpIHtcbiAgICBzZWdtZW50LmlkID0gbmV4dElkO1xuICAgIHNlZ21lbnQubGFiZWxlZCA9IGxhYmVsZWQ7XG4gICAgYWRkZWRJZHMucHVzaChuZXh0SWQpO1xuICAgIG5leHRJZCsrO1xuICAgIHNlZ21lbnRzLnB1c2goc2VnbWVudCk7XG4gIH1cbiAgaW5mby5uZXh0X2lkID0gbmV4dElkO1xuICBzYXZlU2VnbWVudHMoYW5vbWFseUlkLCBzZWdtZW50cyk7XG4gIHNhdmVBbm9tYWx5KGFub21hbHlJZCwgaW5mbyk7XG4gIHJldHVybiBhZGRlZElkcztcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU2VnbWVudHMoYW5vbWFseUlkOiBBbm9tYWx5SWQsIHJlbW92ZWRTZWdtZW50cykge1xuICBsZXQgc2VnbWVudHMgPSBnZXRMYWJlbGVkU2VnbWVudHMoYW5vbWFseUlkKTtcbiAgZm9yIChsZXQgc2VnbWVudElkIG9mIHJlbW92ZWRTZWdtZW50cykge1xuICAgIHNlZ21lbnRzID0gc2VnbWVudHMuZmlsdGVyKGVsID0+IGVsLmlkICE9PSBzZWdtZW50SWQpO1xuICB9XG4gIHNhdmVTZWdtZW50cyhhbm9tYWx5SWQsIHNlZ21lbnRzKTtcbn1cblxuZXhwb3J0IHsgZ2V0TGFiZWxlZFNlZ21lbnRzLCBnZXRQcmVkaWN0ZWRTZWdtZW50cywgc2F2ZVNlZ21lbnRzLCBpbnNlcnRTZWdtZW50cywgcmVtb3ZlU2VnbWVudHMgfVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmljZXMvc2VnbWVudHMudHMiLCJ2YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcblxuLy8gdGhyb3VnaFxuLy9cbi8vIGEgc3RyZWFtIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCByZS1lbWl0IHRoZSBpbnB1dC5cbi8vIHVzZWZ1bCBmb3IgYWdncmVnYXRpbmcgYSBzZXJpZXMgb2YgY2hhbmdpbmcgYnV0IG5vdCBlbmRpbmcgc3RyZWFtcyBpbnRvIG9uZSBzdHJlYW0pXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHRocm91Z2hcbnRocm91Z2gudGhyb3VnaCA9IHRocm91Z2hcblxuLy9jcmVhdGUgYSByZWFkYWJsZSB3cml0YWJsZSBzdHJlYW0uXG5cbmZ1bmN0aW9uIHRocm91Z2ggKHdyaXRlLCBlbmQsIG9wdHMpIHtcbiAgd3JpdGUgPSB3cml0ZSB8fCBmdW5jdGlvbiAoZGF0YSkgeyB0aGlzLnF1ZXVlKGRhdGEpIH1cbiAgZW5kID0gZW5kIHx8IGZ1bmN0aW9uICgpIHsgdGhpcy5xdWV1ZShudWxsKSB9XG5cbiAgdmFyIGVuZGVkID0gZmFsc2UsIGRlc3Ryb3llZCA9IGZhbHNlLCBidWZmZXIgPSBbXSwgX2VuZGVkID0gZmFsc2VcbiAgdmFyIHN0cmVhbSA9IG5ldyBTdHJlYW0oKVxuICBzdHJlYW0ucmVhZGFibGUgPSBzdHJlYW0ud3JpdGFibGUgPSB0cnVlXG4gIHN0cmVhbS5wYXVzZWQgPSBmYWxzZVxuXG4vLyAgc3RyZWFtLmF1dG9QYXVzZSAgID0gIShvcHRzICYmIG9wdHMuYXV0b1BhdXNlICAgPT09IGZhbHNlKVxuICBzdHJlYW0uYXV0b0Rlc3Ryb3kgPSAhKG9wdHMgJiYgb3B0cy5hdXRvRGVzdHJveSA9PT0gZmFsc2UpXG5cbiAgc3RyZWFtLndyaXRlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB3cml0ZS5jYWxsKHRoaXMsIGRhdGEpXG4gICAgcmV0dXJuICFzdHJlYW0ucGF1c2VkXG4gIH1cblxuICBmdW5jdGlvbiBkcmFpbigpIHtcbiAgICB3aGlsZShidWZmZXIubGVuZ3RoICYmICFzdHJlYW0ucGF1c2VkKSB7XG4gICAgICB2YXIgZGF0YSA9IGJ1ZmZlci5zaGlmdCgpXG4gICAgICBpZihudWxsID09PSBkYXRhKVxuICAgICAgICByZXR1cm4gc3RyZWFtLmVtaXQoJ2VuZCcpXG4gICAgICBlbHNlXG4gICAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgZGF0YSlcbiAgICB9XG4gIH1cblxuICBzdHJlYW0ucXVldWUgPSBzdHJlYW0ucHVzaCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4vLyAgICBjb25zb2xlLmVycm9yKGVuZGVkKVxuICAgIGlmKF9lbmRlZCkgcmV0dXJuIHN0cmVhbVxuICAgIGlmKGRhdGEgPT09IG51bGwpIF9lbmRlZCA9IHRydWVcbiAgICBidWZmZXIucHVzaChkYXRhKVxuICAgIGRyYWluKClcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cblxuICAvL3RoaXMgd2lsbCBiZSByZWdpc3RlcmVkIGFzIHRoZSBmaXJzdCAnZW5kJyBsaXN0ZW5lclxuICAvL211c3QgY2FsbCBkZXN0cm95IG5leHQgdGljaywgdG8gbWFrZSBzdXJlIHdlJ3JlIGFmdGVyIGFueVxuICAvL3N0cmVhbSBwaXBlZCBmcm9tIGhlcmUuXG4gIC8vdGhpcyBpcyBvbmx5IGEgcHJvYmxlbSBpZiBlbmQgaXMgbm90IGVtaXR0ZWQgc3luY2hyb25vdXNseS5cbiAgLy9hIG5pY2VyIHdheSB0byBkbyB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGlzIGlzIHRoZSBsYXN0IGxpc3RlbmVyIGZvciAnZW5kJ1xuXG4gIHN0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlXG4gICAgaWYoIXN0cmVhbS53cml0YWJsZSAmJiBzdHJlYW0uYXV0b0Rlc3Ryb3kpXG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3RyZWFtLmRlc3Ryb3koKVxuICAgICAgfSlcbiAgfSlcblxuICBmdW5jdGlvbiBfZW5kICgpIHtcbiAgICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZVxuICAgIGVuZC5jYWxsKHN0cmVhbSlcbiAgICBpZighc3RyZWFtLnJlYWRhYmxlICYmIHN0cmVhbS5hdXRvRGVzdHJveSlcbiAgICAgIHN0cmVhbS5kZXN0cm95KClcbiAgfVxuXG4gIHN0cmVhbS5lbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmKGVuZGVkKSByZXR1cm5cbiAgICBlbmRlZCA9IHRydWVcbiAgICBpZihhcmd1bWVudHMubGVuZ3RoKSBzdHJlYW0ud3JpdGUoZGF0YSlcbiAgICBfZW5kKCkgLy8gd2lsbCBlbWl0IG9yIHF1ZXVlXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG5cbiAgc3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYoZGVzdHJveWVkKSByZXR1cm5cbiAgICBkZXN0cm95ZWQgPSB0cnVlXG4gICAgZW5kZWQgPSB0cnVlXG4gICAgYnVmZmVyLmxlbmd0aCA9IDBcbiAgICBzdHJlYW0ud3JpdGFibGUgPSBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZVxuICAgIHN0cmVhbS5lbWl0KCdjbG9zZScpXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG5cbiAgc3RyZWFtLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKHN0cmVhbS5wYXVzZWQpIHJldHVyblxuICAgIHN0cmVhbS5wYXVzZWQgPSB0cnVlXG4gICAgcmV0dXJuIHN0cmVhbVxuICB9XG5cbiAgc3RyZWFtLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZihzdHJlYW0ucGF1c2VkKSB7XG4gICAgICBzdHJlYW0ucGF1c2VkID0gZmFsc2VcbiAgICAgIHN0cmVhbS5lbWl0KCdyZXN1bWUnKVxuICAgIH1cbiAgICBkcmFpbigpXG4gICAgLy9tYXkgaGF2ZSBiZWNvbWUgcGF1c2VkIGFnYWluLFxuICAgIC8vYXMgZHJhaW4gZW1pdHMgJ2RhdGEnLlxuICAgIGlmKCFzdHJlYW0ucGF1c2VkKVxuICAgICAgc3RyZWFtLmVtaXQoJ2RyYWluJylcbiAgICByZXR1cm4gc3RyZWFtXG4gIH1cbiAgcmV0dXJuIHN0cmVhbVxufVxuXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvdGhyb3VnaC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBib2R5LXBhcnNlclxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGRlcHJlY2F0ZSA9IHJlcXVpcmUoJ2RlcGQnKSgnYm9keS1wYXJzZXInKVxuXG4vKipcbiAqIENhY2hlIG9mIGxvYWRlZCBwYXJzZXJzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgcGFyc2VycyA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuLyoqXG4gKiBAdHlwZWRlZiBQYXJzZXJzXG4gKiBAdHlwZSB7ZnVuY3Rpb259XG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSBqc29uXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9ufSByYXdcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHRleHRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IHVybGVuY29kZWRcbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHR5cGUge1BhcnNlcnN9XG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZGVwcmVjYXRlLmZ1bmN0aW9uKGJvZHlQYXJzZXIsXG4gICdib2R5UGFyc2VyOiB1c2UgaW5kaXZpZHVhbCBqc29uL3VybGVuY29kZWQgbWlkZGxld2FyZXMnKVxuXG4vKipcbiAqIEpTT04gcGFyc2VyLlxuICogQHB1YmxpY1xuICovXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnanNvbicsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGNyZWF0ZVBhcnNlckdldHRlcignanNvbicpXG59KVxuXG4vKipcbiAqIFJhdyBwYXJzZXIuXG4gKiBAcHVibGljXG4gKi9cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdyYXcnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBjcmVhdGVQYXJzZXJHZXR0ZXIoJ3JhdycpXG59KVxuXG4vKipcbiAqIFRleHQgcGFyc2VyLlxuICogQHB1YmxpY1xuICovXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAndGV4dCcsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGNyZWF0ZVBhcnNlckdldHRlcigndGV4dCcpXG59KVxuXG4vKipcbiAqIFVSTC1lbmNvZGVkIHBhcnNlci5cbiAqIEBwdWJsaWNcbiAqL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ3VybGVuY29kZWQnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBjcmVhdGVQYXJzZXJHZXR0ZXIoJ3VybGVuY29kZWQnKVxufSlcblxuLyoqXG4gKiBDcmVhdGUgYSBtaWRkbGV3YXJlIHRvIHBhcnNlIGpzb24gYW5kIHVybGVuY29kZWQgYm9kaWVzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQGRlcHJlY2F0ZWRcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBib2R5UGFyc2VyIChvcHRpb25zKSB7XG4gIHZhciBvcHRzID0ge31cblxuICAvLyBleGNsdWRlIHR5cGUgb3B0aW9uXG4gIGlmIChvcHRpb25zKSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAocHJvcCAhPT0gJ3R5cGUnKSB7XG4gICAgICAgIG9wdHNbcHJvcF0gPSBvcHRpb25zW3Byb3BdXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIF91cmxlbmNvZGVkID0gZXhwb3J0cy51cmxlbmNvZGVkKG9wdHMpXG4gIHZhciBfanNvbiA9IGV4cG9ydHMuanNvbihvcHRzKVxuXG4gIHJldHVybiBmdW5jdGlvbiBib2R5UGFyc2VyIChyZXEsIHJlcywgbmV4dCkge1xuICAgIF9qc29uKHJlcSwgcmVzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG4gICAgICBfdXJsZW5jb2RlZChyZXEsIHJlcywgbmV4dClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZ2V0dGVyIGZvciBsb2FkaW5nIGEgcGFyc2VyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVQYXJzZXJHZXR0ZXIgKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldCAoKSB7XG4gICAgcmV0dXJuIGxvYWRQYXJzZXIobmFtZSlcbiAgfVxufVxuXG4vKipcbiAqIExvYWQgYSBwYXJzZXIgbW9kdWxlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkUGFyc2VyIChwYXJzZXJOYW1lKSB7XG4gIHZhciBwYXJzZXIgPSBwYXJzZXJzW3BhcnNlck5hbWVdXG5cbiAgaWYgKHBhcnNlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHBhcnNlclxuICB9XG5cbiAgLy8gdGhpcyB1c2VzIGEgc3dpdGNoIGZvciBzdGF0aWMgcmVxdWlyZSBhbmFseXNpc1xuICBzd2l0Y2ggKHBhcnNlck5hbWUpIHtcbiAgICBjYXNlICdqc29uJzpcbiAgICAgIHBhcnNlciA9IHJlcXVpcmUoJy4vbGliL3R5cGVzL2pzb24nKVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdyYXcnOlxuICAgICAgcGFyc2VyID0gcmVxdWlyZSgnLi9saWIvdHlwZXMvcmF3JylcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAndGV4dCc6XG4gICAgICBwYXJzZXIgPSByZXF1aXJlKCcuL2xpYi90eXBlcy90ZXh0JylcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAndXJsZW5jb2RlZCc6XG4gICAgICBwYXJzZXIgPSByZXF1aXJlKCcuL2xpYi90eXBlcy91cmxlbmNvZGVkJylcbiAgICAgIGJyZWFrXG4gIH1cblxuICAvLyBzdG9yZSB0byBwcmV2ZW50IGludm9raW5nIHJlcXVpcmUoKVxuICByZXR1cm4gKHBhcnNlcnNbcGFyc2VyTmFtZV0gPSBwYXJzZXIpXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvYm9keS1wYXJzZXIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDcyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogZGVwZFxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlclxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbmxhenlQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ2NhbGxTaXRlVG9TdHJpbmcnLCBmdW5jdGlvbiBjYWxsU2l0ZVRvU3RyaW5nICgpIHtcbiAgdmFyIGxpbWl0ID0gRXJyb3Iuc3RhY2tUcmFjZUxpbWl0XG4gIHZhciBvYmogPSB7fVxuICB2YXIgcHJlcCA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlXG5cbiAgZnVuY3Rpb24gcHJlcGFyZU9iamVjdFN0YWNrVHJhY2UgKG9iaiwgc3RhY2spIHtcbiAgICByZXR1cm4gc3RhY2tcbiAgfVxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJlcGFyZU9iamVjdFN0YWNrVHJhY2VcbiAgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0ID0gMlxuXG4gIC8vIGNhcHR1cmUgdGhlIHN0YWNrXG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKG9iailcblxuICAvLyBzbGljZSB0aGUgc3RhY2tcbiAgdmFyIHN0YWNrID0gb2JqLnN0YWNrLnNsaWNlKClcblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXBcbiAgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0ID0gbGltaXRcblxuICByZXR1cm4gc3RhY2tbMF0udG9TdHJpbmcgPyB0b1N0cmluZyA6IHJlcXVpcmUoJy4vY2FsbHNpdGUtdG9zdHJpbmcnKVxufSlcblxubGF6eVByb3BlcnR5KG1vZHVsZS5leHBvcnRzLCAnZXZlbnRMaXN0ZW5lckNvdW50JywgZnVuY3Rpb24gZXZlbnRMaXN0ZW5lckNvdW50ICgpIHtcbiAgcmV0dXJuIEV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50IHx8IHJlcXVpcmUoJy4vZXZlbnQtbGlzdGVuZXItY291bnQnKVxufSlcblxuLyoqXG4gKiBEZWZpbmUgYSBsYXp5IHByb3BlcnR5LlxuICovXG5cbmZ1bmN0aW9uIGxhenlQcm9wZXJ0eSAob2JqLCBwcm9wLCBnZXR0ZXIpIHtcbiAgZnVuY3Rpb24gZ2V0ICgpIHtcbiAgICB2YXIgdmFsID0gZ2V0dGVyKClcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogdmFsXG4gICAgfSlcblxuICAgIHJldHVybiB2YWxcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGdldFxuICB9KVxufVxuXG4vKipcbiAqIENhbGwgdG9TdHJpbmcoKSBvbiB0aGUgb2JqXG4gKi9cblxuZnVuY3Rpb24gdG9TdHJpbmcgKG9iaikge1xuICByZXR1cm4gb2JqLnRvU3RyaW5nKClcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9kZXBkL2xpYi9jb21wYXQvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDczXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInRyeSB7XG4gIHZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuICBpZiAodHlwZW9mIHV0aWwuaW5oZXJpdHMgIT09ICdmdW5jdGlvbicpIHRocm93ICcnO1xuICBtb2R1bGUuZXhwb3J0cyA9IHV0aWwuaW5oZXJpdHM7XG59IGNhdGNoIChlKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9pbmhlcml0c19icm93c2VyLmpzJyk7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHMuanNcbi8vIG1vZHVsZSBpZCA9IDc0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnWydkZWZhdWx0J10gPSBjcmVhdGVEZWJ1ZztcbmV4cG9ydHMuY29lcmNlID0gY29lcmNlO1xuZXhwb3J0cy5kaXNhYmxlID0gZGlzYWJsZTtcbmV4cG9ydHMuZW5hYmxlID0gZW5hYmxlO1xuZXhwb3J0cy5lbmFibGVkID0gZW5hYmxlZDtcbmV4cG9ydHMuaHVtYW5pemUgPSByZXF1aXJlKCdtcycpO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50bHkgYWN0aXZlIGRlYnVnIG1vZGUgbmFtZXMsIGFuZCBuYW1lcyB0byBza2lwLlxuICovXG5cbmV4cG9ydHMubmFtZXMgPSBbXTtcbmV4cG9ydHMuc2tpcHMgPSBbXTtcblxuLyoqXG4gKiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG4gKlxuICogVmFsaWQga2V5IG5hbWVzIGFyZSBhIHNpbmdsZSwgbG93ZXIgb3IgdXBwZXItY2FzZSBsZXR0ZXIsIGkuZS4gXCJuXCIgYW5kIFwiTlwiLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycyA9IHt9O1xuXG4vKipcbiAqIFByZXZpb3VzIGxvZyB0aW1lc3RhbXAuXG4gKi9cblxudmFyIHByZXZUaW1lO1xuXG4vKipcbiAqIFNlbGVjdCBhIGNvbG9yLlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG4gIHZhciBoYXNoID0gMCwgaTtcblxuICBmb3IgKGkgaW4gbmFtZXNwYWNlKSB7XG4gICAgaGFzaCAgPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuICAgIGhhc2ggfD0gMDsgLy8gQ29udmVydCB0byAzMmJpdCBpbnRlZ2VyXG4gIH1cblxuICByZXR1cm4gZXhwb3J0cy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBleHBvcnRzLmNvbG9ycy5sZW5ndGhdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblxuICBmdW5jdGlvbiBkZWJ1ZygpIHtcbiAgICAvLyBkaXNhYmxlZD9cbiAgICBpZiAoIWRlYnVnLmVuYWJsZWQpIHJldHVybjtcblxuICAgIHZhciBzZWxmID0gZGVidWc7XG5cbiAgICAvLyBzZXQgYGRpZmZgIHRpbWVzdGFtcFxuICAgIHZhciBjdXJyID0gK25ldyBEYXRlKCk7XG4gICAgdmFyIG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcbiAgICBzZWxmLmRpZmYgPSBtcztcbiAgICBzZWxmLnByZXYgPSBwcmV2VGltZTtcbiAgICBzZWxmLmN1cnIgPSBjdXJyO1xuICAgIHByZXZUaW1lID0gY3VycjtcblxuICAgIC8vIHR1cm4gdGhlIGBhcmd1bWVudHNgIGludG8gYSBwcm9wZXIgQXJyYXlcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgYXJnc1swXSA9IGV4cG9ydHMuY29lcmNlKGFyZ3NbMF0pO1xuXG4gICAgaWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgYXJnc1swXSkge1xuICAgICAgLy8gYW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cbiAgICAgIGFyZ3MudW5zaGlmdCgnJU8nKTtcbiAgICB9XG5cbiAgICAvLyBhcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgYXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIGZ1bmN0aW9uKG1hdGNoLCBmb3JtYXQpIHtcbiAgICAgIC8vIGlmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcbiAgICAgIGlmIChtYXRjaCA9PT0gJyUlJykgcmV0dXJuIG1hdGNoO1xuICAgICAgaW5kZXgrKztcbiAgICAgIHZhciBmb3JtYXR0ZXIgPSBleHBvcnRzLmZvcm1hdHRlcnNbZm9ybWF0XTtcbiAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgZm9ybWF0dGVyKSB7XG4gICAgICAgIHZhciB2YWwgPSBhcmdzW2luZGV4XTtcbiAgICAgICAgbWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG4gICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcbiAgICAgICAgYXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICBpbmRleC0tO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH0pO1xuXG4gICAgLy8gYXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcbiAgICBleHBvcnRzLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuICAgIHZhciBsb2dGbiA9IGRlYnVnLmxvZyB8fCBleHBvcnRzLmxvZyB8fCBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xuICAgIGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICB9XG5cbiAgZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICBkZWJ1Zy5lbmFibGVkID0gZXhwb3J0cy5lbmFibGVkKG5hbWVzcGFjZSk7XG4gIGRlYnVnLnVzZUNvbG9ycyA9IGV4cG9ydHMudXNlQ29sb3JzKCk7XG4gIGRlYnVnLmNvbG9yID0gc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblxuICAvLyBlbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGV4cG9ydHMuaW5pdCkge1xuICAgIGV4cG9ydHMuaW5pdChkZWJ1Zyk7XG4gIH1cblxuICByZXR1cm4gZGVidWc7XG59XG5cbi8qKlxuICogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuICogc2VwYXJhdGVkIGJ5IGEgY29sb24gYW5kIHdpbGRjYXJkcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuICBleHBvcnRzLnNhdmUobmFtZXNwYWNlcyk7XG5cbiAgZXhwb3J0cy5uYW1lcyA9IFtdO1xuICBleHBvcnRzLnNraXBzID0gW107XG5cbiAgdmFyIHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcbiAgdmFyIGxlbiA9IHNwbGl0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKCFzcGxpdFtpXSkgY29udGludWU7IC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG4gICAgbmFtZXNwYWNlcyA9IHNwbGl0W2ldLnJlcGxhY2UoL1xcKi9nLCAnLio/Jyk7XG4gICAgaWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuICAgICAgZXhwb3J0cy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zdWJzdHIoMSkgKyAnJCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwb3J0cy5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcyArICckJykpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERpc2FibGUgZGVidWcgb3V0cHV0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGlzYWJsZSgpIHtcbiAgZXhwb3J0cy5lbmFibGUoJycpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW9kZSBuYW1lIGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG4gIHZhciBpLCBsZW47XG4gIGZvciAoaSA9IDAsIGxlbiA9IGV4cG9ydHMuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZXhwb3J0cy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGZvciAoaSA9IDAsIGxlbiA9IGV4cG9ydHMubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBpZiAoZXhwb3J0cy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENvZXJjZSBgdmFsYC5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSB2YWxcbiAqIEByZXR1cm4ge01peGVkfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuICBpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG4gIHJldHVybiB2YWw7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2RlYnVnLmpzXG4vLyBtb2R1bGUgaWQgPSA3NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpID09PSBmYWxzZSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oKD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhcbiAgICBzdHJcbiAgKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICB2YXIgdHlwZSA9IChtYXRjaFsyXSB8fCAnbXMnKS50b0xvd2VyQ2FzZSgpO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICd5ZWFycyc6XG4gICAgY2FzZSAneWVhcic6XG4gICAgY2FzZSAneXJzJzpcbiAgICBjYXNlICd5cic6XG4gICAgY2FzZSAneSc6XG4gICAgICByZXR1cm4gbiAqIHk7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICBpZiAobXMgPj0gZCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gIH1cbiAgaWYgKG1zID49IGgpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGgpICsgJ2gnO1xuICB9XG4gIGlmIChtcyA+PSBtKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBtKSArICdtJztcbiAgfVxuICBpZiAobXMgPj0gcykge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gIH1cbiAgcmV0dXJuIG1zICsgJ21zJztcbn1cblxuLyoqXG4gKiBMb25nIGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdExvbmcobXMpIHtcbiAgcmV0dXJuIHBsdXJhbChtcywgZCwgJ2RheScpIHx8XG4gICAgcGx1cmFsKG1zLCBoLCAnaG91cicpIHx8XG4gICAgcGx1cmFsKG1zLCBtLCAnbWludXRlJykgfHxcbiAgICBwbHVyYWwobXMsIHMsICdzZWNvbmQnKSB8fFxuICAgIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBuLCBuYW1lKSB7XG4gIGlmIChtcyA8IG4pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG1zIDwgbiAqIDEuNSkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKG1zIC8gbikgKyAnICcgKyBuYW1lO1xuICB9XG4gIHJldHVybiBNYXRoLmNlaWwobXMgLyBuKSArICcgJyArIG5hbWUgKyAncyc7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvbXMvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDc2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5ldFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcIm5ldFwiXG4vLyBtb2R1bGUgaWQgPSA3N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIGRlcGRcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXJcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5sYXp5UHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdjYWxsU2l0ZVRvU3RyaW5nJywgZnVuY3Rpb24gY2FsbFNpdGVUb1N0cmluZyAoKSB7XG4gIHZhciBsaW1pdCA9IEVycm9yLnN0YWNrVHJhY2VMaW1pdFxuICB2YXIgb2JqID0ge31cbiAgdmFyIHByZXAgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZVxuXG4gIGZ1bmN0aW9uIHByZXBhcmVPYmplY3RTdGFja1RyYWNlIChvYmosIHN0YWNrKSB7XG4gICAgcmV0dXJuIHN0YWNrXG4gIH1cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXBhcmVPYmplY3RTdGFja1RyYWNlXG4gIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IDJcblxuICAvLyBjYXB0dXJlIHRoZSBzdGFja1xuICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShvYmopXG5cbiAgLy8gc2xpY2UgdGhlIHN0YWNrXG4gIHZhciBzdGFjayA9IG9iai5zdGFjay5zbGljZSgpXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmVwXG4gIEVycm9yLnN0YWNrVHJhY2VMaW1pdCA9IGxpbWl0XG5cbiAgcmV0dXJuIHN0YWNrWzBdLnRvU3RyaW5nID8gdG9TdHJpbmcgOiByZXF1aXJlKCcuL2NhbGxzaXRlLXRvc3RyaW5nJylcbn0pXG5cbmxhenlQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgJ2V2ZW50TGlzdGVuZXJDb3VudCcsIGZ1bmN0aW9uIGV2ZW50TGlzdGVuZXJDb3VudCAoKSB7XG4gIHJldHVybiBFdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCB8fCByZXF1aXJlKCcuL2V2ZW50LWxpc3RlbmVyLWNvdW50Jylcbn0pXG5cbi8qKlxuICogRGVmaW5lIGEgbGF6eSBwcm9wZXJ0eS5cbiAqL1xuXG5mdW5jdGlvbiBsYXp5UHJvcGVydHkgKG9iaiwgcHJvcCwgZ2V0dGVyKSB7XG4gIGZ1bmN0aW9uIGdldCAoKSB7XG4gICAgdmFyIHZhbCA9IGdldHRlcigpXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IHZhbFxuICAgIH0pXG5cbiAgICByZXR1cm4gdmFsXG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBnZXRcbiAgfSlcbn1cblxuLyoqXG4gKiBDYWxsIHRvU3RyaW5nKCkgb24gdGhlIG9ialxuICovXG5cbmZ1bmN0aW9uIHRvU3RyaW5nIChvYmopIHtcbiAgcmV0dXJuIG9iai50b1N0cmluZygpXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvcmF3LWJvZHkvbm9kZV9tb2R1bGVzL2RlcGQvbGliL2NvbXBhdC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIFNvbWUgZW52aXJvbm1lbnRzIGRvbid0IGhhdmUgZ2xvYmFsIEJ1ZmZlciAoZS5nLiBSZWFjdCBOYXRpdmUpLlxuLy8gU29sdXRpb24gd291bGQgYmUgaW5zdGFsbGluZyBucG0gbW9kdWxlcyBcImJ1ZmZlclwiIGFuZCBcInN0cmVhbVwiIGV4cGxpY2l0bHkuXG52YXIgQnVmZmVyID0gcmVxdWlyZShcImJ1ZmZlclwiKS5CdWZmZXI7XG5cbnZhciBib21IYW5kbGluZyA9IHJlcXVpcmUoXCIuL2JvbS1oYW5kbGluZ1wiKSxcbiAgICBpY29udiA9IG1vZHVsZS5leHBvcnRzO1xuXG4vLyBBbGwgY29kZWNzIGFuZCBhbGlhc2VzIGFyZSBrZXB0IGhlcmUsIGtleWVkIGJ5IGVuY29kaW5nIG5hbWUvYWxpYXMuXG4vLyBUaGV5IGFyZSBsYXp5IGxvYWRlZCBpbiBgaWNvbnYuZ2V0Q29kZWNgIGZyb20gYGVuY29kaW5ncy9pbmRleC5qc2AuXG5pY29udi5lbmNvZGluZ3MgPSBudWxsO1xuXG4vLyBDaGFyYWN0ZXJzIGVtaXR0ZWQgaW4gY2FzZSBvZiBlcnJvci5cbmljb252LmRlZmF1bHRDaGFyVW5pY29kZSA9ICfvv70nO1xuaWNvbnYuZGVmYXVsdENoYXJTaW5nbGVCeXRlID0gJz8nO1xuXG4vLyBQdWJsaWMgQVBJLlxuaWNvbnYuZW5jb2RlID0gZnVuY3Rpb24gZW5jb2RlKHN0ciwgZW5jb2RpbmcsIG9wdGlvbnMpIHtcbiAgICBzdHIgPSBcIlwiICsgKHN0ciB8fCBcIlwiKTsgLy8gRW5zdXJlIHN0cmluZy5cblxuICAgIHZhciBlbmNvZGVyID0gaWNvbnYuZ2V0RW5jb2RlcihlbmNvZGluZywgb3B0aW9ucyk7XG5cbiAgICB2YXIgcmVzID0gZW5jb2Rlci53cml0ZShzdHIpO1xuICAgIHZhciB0cmFpbCA9IGVuY29kZXIuZW5kKCk7XG4gICAgXG4gICAgcmV0dXJuICh0cmFpbCAmJiB0cmFpbC5sZW5ndGggPiAwKSA/IEJ1ZmZlci5jb25jYXQoW3JlcywgdHJhaWxdKSA6IHJlcztcbn1cblxuaWNvbnYuZGVjb2RlID0gZnVuY3Rpb24gZGVjb2RlKGJ1ZiwgZW5jb2RpbmcsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIGJ1ZiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKCFpY29udi5za2lwRGVjb2RlV2FybmluZykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignSWNvbnYtbGl0ZSB3YXJuaW5nOiBkZWNvZGUoKS1pbmcgc3RyaW5ncyBpcyBkZXByZWNhdGVkLiBSZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vYXNodHVjaGtpbi9pY29udi1saXRlL3dpa2kvVXNlLUJ1ZmZlcnMtd2hlbi1kZWNvZGluZycpO1xuICAgICAgICAgICAgaWNvbnYuc2tpcERlY29kZVdhcm5pbmcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgYnVmID0gbmV3IEJ1ZmZlcihcIlwiICsgKGJ1ZiB8fCBcIlwiKSwgXCJiaW5hcnlcIik7IC8vIEVuc3VyZSBidWZmZXIuXG4gICAgfVxuXG4gICAgdmFyIGRlY29kZXIgPSBpY29udi5nZXREZWNvZGVyKGVuY29kaW5nLCBvcHRpb25zKTtcblxuICAgIHZhciByZXMgPSBkZWNvZGVyLndyaXRlKGJ1Zik7XG4gICAgdmFyIHRyYWlsID0gZGVjb2Rlci5lbmQoKTtcblxuICAgIHJldHVybiB0cmFpbCA/IChyZXMgKyB0cmFpbCkgOiByZXM7XG59XG5cbmljb252LmVuY29kaW5nRXhpc3RzID0gZnVuY3Rpb24gZW5jb2RpbmdFeGlzdHMoZW5jKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWNvbnYuZ2V0Q29kZWMoZW5jKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBMZWdhY3kgYWxpYXNlcyB0byBjb252ZXJ0IGZ1bmN0aW9uc1xuaWNvbnYudG9FbmNvZGluZyA9IGljb252LmVuY29kZTtcbmljb252LmZyb21FbmNvZGluZyA9IGljb252LmRlY29kZTtcblxuLy8gU2VhcmNoIGZvciBhIGNvZGVjIGluIGljb252LmVuY29kaW5ncy4gQ2FjaGUgY29kZWMgZGF0YSBpbiBpY29udi5fY29kZWNEYXRhQ2FjaGUuXG5pY29udi5fY29kZWNEYXRhQ2FjaGUgPSB7fTtcbmljb252LmdldENvZGVjID0gZnVuY3Rpb24gZ2V0Q29kZWMoZW5jb2RpbmcpIHtcbiAgICBpZiAoIWljb252LmVuY29kaW5ncylcbiAgICAgICAgaWNvbnYuZW5jb2RpbmdzID0gcmVxdWlyZShcIi4uL2VuY29kaW5nc1wiKTsgLy8gTGF6eSBsb2FkIGFsbCBlbmNvZGluZyBkZWZpbml0aW9ucy5cbiAgICBcbiAgICAvLyBDYW5vbmljYWxpemUgZW5jb2RpbmcgbmFtZTogc3RyaXAgYWxsIG5vbi1hbHBoYW51bWVyaWMgY2hhcnMgYW5kIGFwcGVuZGVkIHllYXIuXG4gICAgdmFyIGVuYyA9ICgnJytlbmNvZGluZykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXjAtOWEtel18OlxcZHs0fSQvZywgXCJcIik7XG5cbiAgICAvLyBUcmF2ZXJzZSBpY29udi5lbmNvZGluZ3MgdG8gZmluZCBhY3R1YWwgY29kZWMuXG4gICAgdmFyIGNvZGVjT3B0aW9ucyA9IHt9O1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBjb2RlYyA9IGljb252Ll9jb2RlY0RhdGFDYWNoZVtlbmNdO1xuICAgICAgICBpZiAoY29kZWMpXG4gICAgICAgICAgICByZXR1cm4gY29kZWM7XG5cbiAgICAgICAgdmFyIGNvZGVjRGVmID0gaWNvbnYuZW5jb2RpbmdzW2VuY107XG5cbiAgICAgICAgc3dpdGNoICh0eXBlb2YgY29kZWNEZWYpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjogLy8gRGlyZWN0IGFsaWFzIHRvIG90aGVyIGVuY29kaW5nLlxuICAgICAgICAgICAgICAgIGVuYyA9IGNvZGVjRGVmO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IC8vIEFsaWFzIHdpdGggb3B0aW9ucy4gQ2FuIGJlIGxheWVyZWQuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGNvZGVjRGVmKVxuICAgICAgICAgICAgICAgICAgICBjb2RlY09wdGlvbnNba2V5XSA9IGNvZGVjRGVmW2tleV07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWUgPSBlbmM7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZW5jID0gY29kZWNEZWYudHlwZTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6IC8vIENvZGVjIGl0c2VsZi5cbiAgICAgICAgICAgICAgICBpZiAoIWNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWUgPSBlbmM7XG5cbiAgICAgICAgICAgICAgICAvLyBUaGUgY29kZWMgZnVuY3Rpb24gbXVzdCBsb2FkIGFsbCB0YWJsZXMgYW5kIHJldHVybiBvYmplY3Qgd2l0aCAuZW5jb2RlciBhbmQgLmRlY29kZXIgbWV0aG9kcy5cbiAgICAgICAgICAgICAgICAvLyBJdCdsbCBiZSBjYWxsZWQgb25seSBvbmNlIChmb3IgZWFjaCBkaWZmZXJlbnQgb3B0aW9ucyBvYmplY3QpLlxuICAgICAgICAgICAgICAgIGNvZGVjID0gbmV3IGNvZGVjRGVmKGNvZGVjT3B0aW9ucywgaWNvbnYpO1xuXG4gICAgICAgICAgICAgICAgaWNvbnYuX2NvZGVjRGF0YUNhY2hlW2NvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWVdID0gY29kZWM7IC8vIFNhdmUgaXQgdG8gYmUgcmV1c2VkIGxhdGVyLlxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlYztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbmNvZGluZyBub3QgcmVjb2duaXplZDogJ1wiICsgZW5jb2RpbmcgKyBcIicgKHNlYXJjaGVkIGFzOiAnXCIrZW5jK1wiJylcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmljb252LmdldEVuY29kZXIgPSBmdW5jdGlvbiBnZXRFbmNvZGVyKGVuY29kaW5nLCBvcHRpb25zKSB7XG4gICAgdmFyIGNvZGVjID0gaWNvbnYuZ2V0Q29kZWMoZW5jb2RpbmcpLFxuICAgICAgICBlbmNvZGVyID0gbmV3IGNvZGVjLmVuY29kZXIob3B0aW9ucywgY29kZWMpO1xuXG4gICAgaWYgKGNvZGVjLmJvbUF3YXJlICYmIG9wdGlvbnMgJiYgb3B0aW9ucy5hZGRCT00pXG4gICAgICAgIGVuY29kZXIgPSBuZXcgYm9tSGFuZGxpbmcuUHJlcGVuZEJPTShlbmNvZGVyLCBvcHRpb25zKTtcblxuICAgIHJldHVybiBlbmNvZGVyO1xufVxuXG5pY29udi5nZXREZWNvZGVyID0gZnVuY3Rpb24gZ2V0RGVjb2RlcihlbmNvZGluZywgb3B0aW9ucykge1xuICAgIHZhciBjb2RlYyA9IGljb252LmdldENvZGVjKGVuY29kaW5nKSxcbiAgICAgICAgZGVjb2RlciA9IG5ldyBjb2RlYy5kZWNvZGVyKG9wdGlvbnMsIGNvZGVjKTtcblxuICAgIGlmIChjb2RlYy5ib21Bd2FyZSAmJiAhKG9wdGlvbnMgJiYgb3B0aW9ucy5zdHJpcEJPTSA9PT0gZmFsc2UpKVxuICAgICAgICBkZWNvZGVyID0gbmV3IGJvbUhhbmRsaW5nLlN0cmlwQk9NKGRlY29kZXIsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGRlY29kZXI7XG59XG5cblxuLy8gTG9hZCBleHRlbnNpb25zIGluIE5vZGUuIEFsbCBvZiB0aGVtIGFyZSBvbWl0dGVkIGluIEJyb3dzZXJpZnkgYnVpbGQgdmlhICdicm93c2VyJyBmaWVsZCBpbiBwYWNrYWdlLmpzb24uXG52YXIgbm9kZVZlciA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZTtcbmlmIChub2RlVmVyKSB7XG5cbiAgICAvLyBMb2FkIHN0cmVhbWluZyBzdXBwb3J0IGluIE5vZGUgdjAuMTArXG4gICAgdmFyIG5vZGVWZXJBcnIgPSBub2RlVmVyLnNwbGl0KFwiLlwiKS5tYXAoTnVtYmVyKTtcbiAgICBpZiAobm9kZVZlckFyclswXSA+IDAgfHwgbm9kZVZlckFyclsxXSA+PSAxMCkge1xuICAgICAgICByZXF1aXJlKFwiLi9zdHJlYW1zXCIpKGljb252KTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIE5vZGUgcHJpbWl0aXZlIGV4dGVuc2lvbnMuXG4gICAgcmVxdWlyZShcIi4vZXh0ZW5kLW5vZGVcIikoaWNvbnYpO1xufVxuXG5pZiAoXCLEgFwiICE9IFwiXFx1MDEwMFwiKSB7XG4gICAgY29uc29sZS5lcnJvcihcImljb252LWxpdGUgd2FybmluZzogamF2YXNjcmlwdCBmaWxlcyB1c2UgZW5jb2RpbmcgZGlmZmVyZW50IGZyb20gdXRmLTguIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXNodHVjaGtpbi9pY29udi1saXRlL3dpa2kvSmF2YXNjcmlwdC1zb3VyY2UtZmlsZS1lbmNvZGluZ3MgZm9yIG1vcmUgaW5mby5cIik7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9saWIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDc5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInN0cmluZ19kZWNvZGVyXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwic3RyaW5nX2RlY29kZXJcIlxuLy8gbW9kdWxlIGlkID0gODBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBbW1wiYTE0MFwiLFwi7pOGXCIsNjJdLFtcImExODBcIixcIu6UhVwiLDMyXSxbXCJhMjQwXCIsXCLulKZcIiw2Ml0sW1wiYTI4MFwiLFwi7pWlXCIsMzJdLFtcImEyYWJcIixcIu6dplwiLDVdLFtcImEyZTNcIixcIuKCrO6drVwiXSxbXCJhMmVmXCIsXCLuna7una9cIl0sW1wiYTJmZFwiLFwi7p2w7p2xXCJdLFtcImEzNDBcIixcIu6WhlwiLDYyXSxbXCJhMzgwXCIsXCLul4VcIiwzMSxcIuOAgFwiXSxbXCJhNDQwXCIsXCLul6ZcIiw2Ml0sW1wiYTQ4MFwiLFwi7pilXCIsMzJdLFtcImE0ZjRcIixcIu6dslwiLDEwXSxbXCJhNTQwXCIsXCLumYZcIiw2Ml0sW1wiYTU4MFwiLFwi7pqFXCIsMzJdLFtcImE1ZjdcIixcIu6dvVwiLDddLFtcImE2NDBcIixcIu6aplwiLDYyXSxbXCJhNjgwXCIsXCLum6VcIiwzMl0sW1wiYTZiOVwiLFwi7p6FXCIsN10sW1wiYTZkOVwiLFwi7p6NXCIsNl0sW1wiYTZlY1wiLFwi7p6U7p6VXCJdLFtcImE2ZjNcIixcIu6ellwiXSxbXCJhNmY2XCIsXCLunpdcIiw4XSxbXCJhNzQwXCIsXCLunIZcIiw2Ml0sW1wiYTc4MFwiLFwi7p2FXCIsMzJdLFtcImE3YzJcIixcIu6eoFwiLDE0XSxbXCJhN2YyXCIsXCLunq9cIiwxMl0sW1wiYTg5NlwiLFwi7p68XCIsMTBdLFtcImE4YmNcIixcIu6fh1wiXSxbXCJhOGJmXCIsXCLHuVwiXSxbXCJhOGMxXCIsXCLun4nun4run4vun4xcIl0sW1wiYThlYVwiLFwi7p+NXCIsMjBdLFtcImE5NThcIixcIu6folwiXSxbXCJhOTViXCIsXCLun6NcIl0sW1wiYTk1ZFwiLFwi7p+k7p+l7p+mXCJdLFtcImE5ODlcIixcIuOAvuK/sFwiLDExXSxbXCJhOTk3XCIsXCLun7RcIiwxMl0sW1wiYTlmMFwiLFwi7qCBXCIsMTRdLFtcImFhYTFcIixcIu6AgFwiLDkzXSxbXCJhYmExXCIsXCLugZ5cIiw5M10sW1wiYWNhMVwiLFwi7oK8XCIsOTNdLFtcImFkYTFcIixcIu6EmlwiLDkzXSxbXCJhZWExXCIsXCLuhbhcIiw5M10sW1wiYWZhMVwiLFwi7oeWXCIsOTNdLFtcImQ3ZmFcIixcIu6gkFwiLDRdLFtcImY4YTFcIixcIu6ItFwiLDkzXSxbXCJmOWExXCIsXCLuipJcIiw5M10sW1wiZmFhMVwiLFwi7ouwXCIsOTNdLFtcImZiYTFcIixcIu6NjlwiLDkzXSxbXCJmY2ExXCIsXCLujqxcIiw5M10sW1wiZmRhMVwiLFwi7pCKXCIsOTNdLFtcImZlNTBcIixcIuK6ge6glu6gl+6gmOK6hOORs+ORh+K6iOK6i+6gnuOWnuOYmuOYjuK6jOK6l+OlruOkmO6gpuOnj+Onn+Ops+OnkO6gq+6grOOtjuOxruOzoOK6p+6gse6gsuK6quSBluSFn+K6ruSMt+K6s+K6tuK6t+6gu+SOseSOrOK6u+SPneSTluSZoeSZjO6hg1wiXSxbXCJmZTgwXCIsXCLknKPknKnknbzkno3iu4rkpYfkpbrkpb3kpoLkpoPkpoXkpobkpp/kppvkprfkprbuoZTuoZXksqPksp/ksqDksqHksbfksqLktJNcIiw2LFwi5Lau7qGk7pGoXCIsOTNdXVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy90YWJsZXMvZ2JrLWFkZGVkLmpzb25cbi8vIG1vZHVsZSBpZCA9IDgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gW1tcIjBcIixcIlxcdTAwMDBcIiwxMjddLFtcImExNDBcIixcIuOAgO+8jOOAgeOAgu+8juKAp++8m++8mu+8n++8ge+4sOKApuKApe+5kO+5ke+5ksK377mU77mV77mW77mX772c4oCT77ix4oCU77iz4pW077i077mP77yI77yJ77i177i2772b772d77i377i444CU44CV77i577i644CQ44CR77i777i844CK44CL77i977i+44CI44CJ77i/77mA44CM44CN77mB77mC44CO44CP77mD77mE77mZ77maXCJdLFtcImExYTFcIixcIu+5m++5nO+5ne+5nuKAmOKAmeKAnOKAneOAneOAnuKAteKAsu+8g++8hu+8iuKAu8Kn44CD4peL4peP4paz4pay4peO4piG4piF4peH4peG4pah4pag4pa94pa844qj4oSFwq/vv6PvvL/Lje+5ie+5iu+5je+5ju+5i++5jO+5n++5oO+5oe+8i++8jcOXw7fCseKImu+8nO+8nu+8neKJpuKJp+KJoOKInuKJkuKJoe+5olwiLDQsXCLvvZ7iiKniiKriiqXiiKDiiJ/iir/jj5Ljj5HiiKviiK7iiLXiiLTimYDimYLiipXiipnihpHihpPihpDihpLihpbihpfihpnihpjiiKXiiKPvvI9cIl0sW1wiYTI0MFwiLFwi77y84oiV77mo77yE77+l44CS77+g77+h77yF77yg4oSD4oSJ77mp77mq77mr44+V446c446d446e44+O446h446O446P44+EwrDlhZnlhZvlhZ7lhZ3lhaHlhaPll6fnk6nns47iloFcIiw3LFwi4paP4paO4paN4paM4paL4paK4paJ4pS84pS04pSs4pSk4pSc4paU4pSA4pSC4paV4pSM4pSQ4pSU4pSY4pWtXCJdLFtcImEyYTFcIixcIuKVruKVsOKVr+KVkOKVnuKVquKVoeKXouKXo+KXpeKXpOKVseKVsuKVs++8kFwiLDksXCLihaBcIiw5LFwi44ChXCIsOCxcIuWNgeWNhOWNhe+8oVwiLDI1LFwi772BXCIsMjFdLFtcImEzNDBcIixcIu+9l++9mO+9me+9ms6RXCIsMTYsXCLOo1wiLDYsXCLOsVwiLDE2LFwiz4NcIiw2LFwi44SFXCIsMTBdLFtcImEzYTFcIixcIuOEkFwiLDI1LFwiy5nLicuKy4fLi1wiXSxbXCJhM2UxXCIsXCLigqxcIl0sW1wiYTQ0MFwiLFwi5LiA5LmZ5LiB5LiD5LmD5Lmd5LqG5LqM5Lq65YS/5YWl5YWr5Yeg5YiA5YiB5Yqb5YyV5Y2B5Y2c5Y+I5LiJ5LiL5LiI5LiK5Lir5Li45Yeh5LmF5LmI5Lmf5Lme5LqO5Lqh5YWA5YiD5Yu65Y2D5Y+J5Y+j5Zyf5aOr5aSV5aSn5aWz5a2Q5a2R5a2T5a+45bCP5bCi5bC45bGx5bed5bel5bex5bey5bez5be+5bmy5bu+5byL5byT5omNXCJdLFtcImE0YTFcIixcIuS4keS4kOS4jeS4reS4sOS4ueS5i+WwueS6iOS6keS6leS6kuS6lOS6ouS7geS7gOS7g+S7huS7h+S7jeS7iuS7i+S7hOWFg+WFgeWFp+WFreWFruWFrOWGl+WHtuWIhuWIh+WIiOWLu+WLvuWLv+WMluWMueWNiOWNh+WNheWNnuWOhOWPi+WPiuWPjeWjrOWkqeWkq+WkquWkreWtlOWwkeWwpOWwuuWxr+W3tOW5u+W7v+W8lOW8leW/g+aIiOaItuaJi+aJjuaUr+aWh+aWl+aWpOaWueaXpeabsOaciOacqOasoOatouatueavi+avlOavm+awj+awtOeBq+eIqueItueIu+eJh+eJmeeJm+eKrOeOi+S4mVwiXSxbXCJhNTQwXCIsXCLkuJbkuJXkuJTkuJjkuLvkuY3kuY/kuY7ku6Xku5jku5Tku5Xku5bku5fku6Pku6Tku5nku57lhYXlhYTlhonlhorlhqzlh7nlh7rlh7jliIrliqDlip/ljIXljIbljJfljJ3ku5/ljYrljYnljaHljaDlja/lja7ljrvlj6/lj6Tlj7Plj6zlj67lj6nlj6jlj7zlj7jlj7Xlj6vlj6blj6rlj7Llj7Hlj7Dlj6Xlj63lj7vlm5vlm5rlpJZcIl0sW1wiYTVhMVwiLFwi5aSu5aSx5aW05aW25a2V5a6D5bC85beo5ben5bem5biC5biD5bmz5bm85byB5byY5byX5b+F5oiK5omT5omU5omS5omR5pal5pem5pyu5pys5pyq5pyr5pyt5q2j5q+N5rCR5rCQ5rC45rGB5rGA5rC+54qv546E546J55Oc55Om55SY55Sf55So55Sp55Sw55Sx55Sy55Sz55aL55m955qu55q/55uu55+b55+i55+z56S656a+56m056uL5Lie5Lif5LmS5LmT5Lmp5LqZ5Lqk5Lqm5Lql5Lu/5LyJ5LyZ5LyK5LyV5LyN5LyQ5LyR5LyP5Luy5Lu25Lu75Luw5Luz5Lu95LyB5LyL5YWJ5YWH5YWG5YWI5YWoXCJdLFtcImE2NDBcIixcIuWFseWGjeWGsOWIl+WIkeWIkuWIjuWIluWKo+WMiOWMoeWMoOWNsOWNseWQieWQj+WQjOWQiuWQkOWQgeWQi+WQhOWQkeWQjeWQiOWQg+WQjuWQhuWQkuWboOWbnuWbneWcs+WcsOWcqOWcreWcrOWcr+WcqeWkmeWkmuWkt+WkuOWmhOWluOWmg+WlveWlueWmguWmgeWtl+WtmOWuh+WuiOWuheWuieWvuuWwluWxueW3nuW4huW5tuW5tFwiXSxbXCJhNmExXCIsXCLlvI/lvJvlv5nlv5bmiI7miIzmiI3miJDmiaPmiZvmiZjmlLbml6nml6jml6zml63mm7Lmm7PmnInmnL3mnLTmnLHmnLXmrKHmraTmrbvmsJbmsZ3msZfmsZnmsZ/msaDmsZDmsZXmsaHmsZvmsY3msY7ngbDniZ/niZ3nmb7nq7nnsbPns7jnvLbnvornvr3ogIHogIPogIzogJLogLPogb/ogonogovogozoh6Poh6roh7Poh7zoiIzoiJvoiJ/oia7oibLoib7omavooYDooYzooaPopb/pmKHkuLLkuqjkvY3kvY/kvYfkvZfkvZ7kvLTkvZvkvZXkvLDkvZDkvZHkvL3kvLrkvLjkvYPkvZTkvLzkvYbkvaNcIl0sW1wiYTc0MFwiLFwi5L2c5L2g5Lyv5L2O5Ly25L2Z5L2d5L2I5L2a5YWM5YWL5YWN5YW15Ya25Ya35Yil5Yik5Yip5Yiq5Yio5Yqr5Yqp5Yqq5Yqs5Yyj5Y2z5Y215ZCd5ZCt5ZCe5ZC+5ZCm5ZGO5ZCn5ZGG5ZGD5ZCz5ZGI5ZGC5ZCb5ZCp5ZGK5ZC55ZC75ZC45ZCu5ZC15ZC25ZCg5ZC85ZGA5ZCx5ZCr5ZCf5ZCs5Zuq5Zuw5Zuk5Zur5Z2K5Z2R5Z2A5Z2NXCJdLFtcImE3YTFcIixcIuWdh+WdjuWcvuWdkOWdj+Wcu+Wjr+WkvuWmneWmkuWmqOWmnuWmo+WmmeWmluWmjeWmpOWmk+WmiuWmpeWtneWtnOWtmuWtm+WujOWui+Wuj+WwrOWxgOWxgeWwv+WwvuWykOWykeWylOWyjOW3q+W4jOW6j+W6h+W6iuW7t+W8hOW8n+W9pOW9ouW9t+W9ueW/mOW/jOW/l+W/jeW/seW/q+W/uOW/quaIkuaIkeaKhOaKl+aKluaKgOaJtuaKieaJreaKiuaJvOaJvuaJueaJs+aKkuaJr+aKmOaJruaKleaKk+aKkeaKhuaUueaUu+aUuOaXseabtOadn+adjuadj+adkOadkeadnOadluadnuadieadhuadoFwiXSxbXCJhODQwXCIsXCLmnZPmnZfmraXmr4/msYLmsZ7mspnmsoHmsojmsonmsoXmspvmsarmsbrmspDmsbDmsozmsajmspbmspLmsb3msoPmsbLmsb7msbTmsobmsbbmso3mspTmspjmsoLngbbngbzngb3ngbjniaLniaHniaDni4Tni4LnjpbnlKznlKvnlLfnlLjnmoLnm6/nn6Pnp4Hnp4Dnpr/nqbbns7vnvZXogpbogpPogp3ogpjogpvogprogrLoia/oipJcIl0sW1wiYThhMVwiLFwi6IqL6IqN6KaL6KeS6KiA6LC36LGG6LGV6LKd6LWk6LWw6Laz6Lqr6LuK6L6b6L6w6L+C6L+G6L+F6L+E5beh6YKR6YKi6YKq6YKm6YKj6YWJ6YeG6YeM6Ziy6Ziu6Zix6Ziq6Zis5Lim5LmW5Lmz5LqL5Lqb5Lqe5Lqr5Lqs5L2v5L6d5L6N5L2z5L2/5L2s5L6b5L6L5L6G5L6D5L2w5L215L6I5L2p5L275L6W5L2+5L6P5L6R5L265YWU5YWS5YWV5YWp5YW35YW25YW45Ya95Ye95Yi75Yi45Yi35Yi65Yiw5Yiu5Yi25YmB5Yq+5Yq75Y2S5Y2U5Y2T5Y2R5Y2m5Y235Y245Y255Y+W5Y+U5Y+X5ZGz5ZG1XCJdLFtcImE5NDBcIixcIuWSluWRuOWSleWSgOWRu+WRt+WShOWSkuWShuWRvOWSkOWRseWRtuWSjOWSmuWRouWRqOWSi+WRveWSjuWbuuWeg+Wdt+WdquWdqeWdoeWdpuWdpOWdvOWknOWlieWlh+WliOWlhOWllOWmvuWmu+WnlOWmueWmruWnkeWnhuWnkOWnjeWni+Wnk+WniuWmr+Wms+WnkuWnheWtn+WtpOWto+Wul+WumuWumOWunOWumeWum+WwmuWxiOWxhVwiXSxbXCJhOWExXCIsXCLlsYblsrflsqHlsrjlsqnlsqvlsrHlsrPluJjluJrluJbluJXluJvluJHlubjluprlupflupzlupXlupblu7blvKblvKflvKnlvoDlvoHlvb/lvbzlv53lv6Dlv73lv7Xlv7/mgI/mgJTmgK/mgLXmgJbmgKrmgJXmgKHmgKfmgKnmgKvmgJvmiJbmiJXmiL/miL7miYDmib/mi4nmi4zmi4Tmir/mi4Lmirnmi5Lmi5vmiqvmi5Pmi5Tmi4vmi4jmiqjmir3mirzmi5Dmi5nmi4fmi43mirXmi5rmirHmi5jmi5bmi5fmi4bmiqzmi47mlL7mlqfmlrzml7rmmJTmmJPmmIzmmIbmmILmmI7mmIDmmI/mmJXmmIpcIl0sW1wiYWE0MFwiLFwi5piH5pyN5pyL5p2t5p6L5p6V5p2x5p6c5p2z5p235p6H5p6d5p6X5p2v5p2w5p2/5p6J5p2+5p6Q5p215p6a5p6T5p285p2q5p2y5qyj5q2m5q2n5q2/5rCT5rCb5rOj5rOo5rOz5rKx5rOM5rOl5rKz5rK95rK+5rK85rOi5rKr5rOV5rOT5rK45rOE5rK55rOB5rKu5rOX5rOF5rOx5rK/5rK75rOh5rOb5rOK5rKs5rOv5rOc5rOW5rOgXCJdLFtcImFhYTFcIixcIueCleeCjueCkueCiueCmeeIrOeIreeIuOeJiOeJp+eJqeeLgOeLjueLmeeLl+eLkOeOqeeOqOeOn+eOq+eOpeeUveeWneeWmeeWmueahOebguebsuebtOefpeefveekvuelgOelgeenieeniOepuuepueeruuezvue9lOe+jOe+i+iAheiCuuiCpeiCouiCseiCoeiCq+iCqeiCtOiCquiCr+iHpeiHvuiIjeiKs+iKneiKmeiKreiKveiKn+iKueiKseiKrOiKpeiKr+iKuOiKo+iKsOiKvuiKt+iZjuiZseWIneihqOi7i+i/jui/lOi/kemCtemCuOmCsemCtumHh+mHkemVt+mWgOmYnOmZgOmYv+mYu+mZhFwiXSxbXCJhYjQwXCIsXCLpmYLpmrnpm6jpnZLpnZ7kup/kuq3kuq7kv6HkvrXkvq/kvr/kv6Dkv5Hkv4/kv53kv4Pkvrbkv5jkv5/kv4rkv5fkvq7kv5Dkv4Tkv4Lkv5rkv47kv57kvrflhZflhpLlhpHlhqDliY7liYPliYrliY3liYzliYvliYfli4fli4nli4Pli4HljI3ljZfljbvljprlj5vlkqzlk4Dlkqjlk47lk4nlkrjlkqblkrPlk4flk4Llkr3lkqrlk4FcIl0sW1wiYWJhMVwiLFwi5ZOE5ZOI5ZKv5ZKr5ZKx5ZK75ZKp5ZKn5ZK/5Zu/5Z6C5Z6L5Z6g5Z6j5Z6i5Z+O5Z6u5Z6T5aWV5aWR5aWP5aWO5aWQ5aec5aeY5ae/5aej5aeo5aiD5ael5aeq5aea5aem5aiB5ae75a2p5a6j5a6m5a6k5a6i5a6l5bCB5bGO5bGP5bGN5bGL5bOZ5bOS5be35bid5bil5bif5bm95bqg5bqm5bu65byI5byt5b2l5b6I5b6F5b6K5b6L5b6H5b6M5b6J5oCS5oCd5oCg5oCl5oCO5oCo5oGN5oGw5oGo5oGi5oGG5oGD5oGs5oGr5oGq5oGk5omB5ouc5oyW5oyJ5ou85out5oyB5ouu5ou95oyH5oux5ou3XCJdLFtcImFjNDBcIixcIuaLr+aLrOaLvuaLtOaMkeaMguaUv+aVheaWq+aWveaXouaYpeaYreaYoOaYp+aYr+aYn+aYqOaYseaYpOabt+afv+afk+afseaflOafkOafrOaetuaer+afteafqeafr+afhOafkeaetOafmuafpeaeuOafj+afnuafs+aesOafmeafouafneafkuatquaug+auhuauteavkuavl+awn+aziea0i+a0sua0qua1gea0pea0jOa0sea0nua0l1wiXSxbXCJhY2ExXCIsXCLmtLvmtL3mtL7mtLbmtJvms7XmtLnmtKfmtLjmtKnmtK7mtLXmtI7mtKvngqvngrrngrPngqzngq/ngq3ngrjngq7ngqTniLDnibLnia/nibTni6nni6Dni6Hnjrfnj4rnjrvnjrLnj43nj4DnjrPnlJrnlK3nlY/nlYznlY7nlYvnlqvnlqTnlqXnlqLnlqPnmbjnmobnmofnmojnm4jnm4bnm4Pnm4XnnIHnm7nnm7jnnInnnIvnm77nm7znnIfnn5znoILnoJTnoIznoI3npYbnpYnnpYjnpYfnprnnprrnp5Hnp5Lnp4vnqb/nqoHnq7/nq73nsb3ntILntIXntIDntInntIfntITntIbnvLjnvo7nvr/ogIRcIl0sW1wiYWQ0MFwiLFwi6ICQ6ICN6ICR6IC26IOW6IOl6IOa6IOD6IOE6IOM6IOh6IOb6IOO6IOe6IOk6IOd6Ie06Iii6Iun6IyD6IyF6Iuj6Iub6Ium6IyE6Iul6IyC6IyJ6IuS6IuX6Iux6IyB6Iuc6IuU6IuR6Iue6IuT6Iuf6Iuv6IyG6JmQ6Jm56Jm76Jm66KGN6KGr6KaB6KeU6KiI6KiC6KiD6LKe6LKg6LW06LWz6La06LuN6LuM6L+w6L+m6L+i6L+q6L+lXCJdLFtcImFkYTFcIixcIui/rei/q+i/pOi/qOmDiumDjumDgemDg+mFi+mFiumHjemWgumZkOmZi+mZjOmZjemdoumdqemfi+mfremfs+mggemiqOmjm+mjn+mmlummmeS5mOS6s+WAjOWAjeWAo+S/r+WApuWApeS/uOWAqeWAluWAhuWAvOWAn+WAmuWAkuWAkeS/uuWAgOWAlOWAqOS/seWAoeWAi+WAmeWAmOS/s+S/ruWAreWAquS/vuWAq+WAieWFvOWGpOWGpeWGouWHjeWHjOWHhuWHi+WJluWJnOWJlOWJm+WJneWMquWNv+WOn+WOneWPn+WTqOWUkOWUgeWUt+WTvOWTpeWTsuWUhuWTuuWUlOWTqeWTreWToeWUieWTruWTqlwiXSxbXCJhZTQwXCIsXCLlk6bllKfllIflk73llI/lnIPlnITln4Lln5Tln4vln4PloInlpI/lpZflpZjlpZrlqJHlqJjlqJzlqJ/lqJvlqJPlp6zlqKDlqKPlqKnlqKXlqIzlqInlravlsZjlrrDlrrPlrrblrrTlrq7lrrXlrrnlrrjlsITlsZHlsZXlsZDls63ls73ls7vls6rls6jls7Dls7bltIHls7Tlt67luK3luKvluqvluq3luqflvLHlvpLlvpHlvpDmgZlcIl0sW1wiYWVhMVwiLFwi5oGj5oGl5oGQ5oGV5oGt5oGp5oGv5oKE5oKf5oKa5oKN5oKU5oKM5oKF5oKW5omH5ouz5oyI5ou/5o2O5oy+5oyv5o2V5o2C5o2G5o2P5o2J5oy65o2Q5oy95oyq5oyr5oyo5o2N5o2M5pWI5pWJ5paZ5peB5peF5pmC5pmJ5pmP5pmD5pmS5pmM5pmF5pmB5pu45pyU5pyV5pyX5qCh5qC45qGI5qGG5qGT5qC55qGC5qGU5qCp5qKz5qCX5qGM5qGR5qC95p+05qGQ5qGA5qC85qGD5qCq5qGF5qCT5qCY5qGB5q6K5q6J5q635rCj5rCn5rCo5rCm5rCk5rOw5rWq5raV5raI5raH5rWm5rW45rW35rWZ5raTXCJdLFtcImFmNDBcIixcIua1rOa2iea1rua1mua1tOa1qea2jOa2iua1uea2hea1pea2lOeDiueDmOeDpOeDmeeDiOeDj+eIueeJueeLvOeLueeLveeLuOeLt+eOhuePreeQieePruePoOePquePnueVlOeVneeVnOeVmueVmeeWvueXheeXh+eWsueWs+eWveeWvOeWueeXgueWuOeai+easOebiuebjeebjuecqeecn+ecoOecqOefqeegsOegp+eguOegneegtOegt1wiXSxbXCJhZmExXCIsXCLnoKXnoK3noKDnoJ/noLLnpZXnpZDnpaDnpZ/npZbnpZ7npZ3npZfnpZrnp6Tnp6Pnp6fnp5/np6bnp6nnp5jnqoTnqojnq5nnrIbnrJHnsonntKHntJfntIvntIrntKDntKLntJTntJDntJXntJrntJzntI3ntJnntJvnvLrnvZ/nvpTnv4Xnv4HogIbogJjogJXogJnogJfogL3ogL/og7HohILog7DohIXog63og7TohIbog7jog7PohIjog73ohIrog7zog6/oh63oh6zoiIDoiJDoiKroiKvoiKjoiKzoirvojKvojZLojZTojYrojLjojZDojYnojLXojLTojY/ojLLojLnojLbojJfojYDojLHojKjojYNcIl0sW1wiYjA0MFwiLFwi6JmU6JqK6Jqq6JqT6Jqk6Jqp6JqM6Jqj6Jqc6KGw6KG36KKB6KKC6KG96KG56KiY6KiQ6KiO6KiM6KiV6KiK6KiX6KiT6KiW6KiP6KiR6LGI6LG66LG56LKh6LKi6LW36Lqs6LuS6LuU6LuP6L6x6YCB6YCG6L+36YCA6L+66L+06YCD6L+96YCF6L+46YKV6YOh6YOd6YOi6YWS6YWN6YWM6YeY6Yed6YeX6Yec6YeZ6ZaD6Zmi6Zmj6ZmhXCJdLFtcImIwYTFcIixcIumZm+mZnemZpOmZmOmZnumau+mjoummrOmqqOmrmOmspemssumsvOS5vuWBuuWBveWBnOWBh+WBg+WBjOWBmuWBieWBpeWBtuWBjuWBleWBteWBtOWBt+WBj+WAj+WBr+WBreWFnOWGleWHsOWJquWJr+WLkuWLmeWLmOWLleWMkOWMj+WMmeWMv+WNgOWMvuWPg+abvOWVhuWVquWVpuWVhOWVnuWVoeWVg+WViuWUseWVluWVj+WVleWUr+WVpOWUuOWUruWVnOWUrOWVo+WUs+WVgeWVl+WciOWci+WcieWfn+WgheWgiuWghuWfoOWfpOWfuuWgguWgteWft+WfueWkoOWlouWotuWpgeWpieWppuWpquWpgFwiXSxbXCJiMTQwXCIsXCLlqLzlqaLlqZrlqYblqYrlrbDlr4flr4Xlr4Tlr4Llrr/lr4blsInlsIjlsIflsaDlsZzlsZ3ltIfltIbltI7ltJvltJbltKLltJHltKnltJTltJnltKTltKfltJflt6LluLjluLbluLPluLflurflurjlurblurXlur7lvLXlvLflvZflvazlvanlvavlvpflvpnlvp7lvpjlvqHlvqDlvpzmgb/mgqPmgonmgqDmgqjmg4vmgrTmg6bmgr1cIl0sW1wiYjFhMVwiLFwi5oOF5oK75oK15oOc5oK85oOY5oOV5oOG5oOf5oK45oOa5oOH5oia5oib5omI5o6g5o6n5o2y5o6W5o6i5o6l5o235o2n5o6Y5o6q5o2x5o6p5o6J5o6D5o6b5o2r5o6o5o6E5o6I5o6Z5o6h5o6s5o6S5o6P5o6A5o275o2p5o2o5o265pWd5pWW5pWR5pWZ5pWX5ZWf5pWP5pWY5pWV5pWU5pac5pab5pas5peP5peL5peM5peO5pmd5pma5pmk5pmo5pmm5pme5pu55YuX5pyb5qKB5qKv5qKi5qKT5qK15qG/5qG25qKx5qKn5qKX5qKw5qKD5qOE5qKt5qKG5qKF5qKU5qKd5qKo5qKf5qKh5qKC5qyy5q66XCJdLFtcImIyNDBcIixcIuavq+avrOawq+a2jua2vOa3s+a3mea2sua3oea3jOa3pOa3u+a3uua4hea3h+a3i+a2r+a3kea2rua3nua3uea2uOa3t+a3tea3hea3kua4mua2tea3mua3q+a3mOa3qua3sea3rua3qOa3hua3hOa2qua3rOa2v+a3pueDueeEieeEiueDveeDr+eIveeJveeKgeeMnOeMm+eMlueMk+eMmeeOh+eQheeQiueQg+eQhuePvueQjeeToOeTtlwiXSxbXCJiMmExXCIsXCLnk7fnlJznlKLnlaXnlabnlaLnlbDnlo/nl5Tnl5XnlrXnl4rnl43nmo7nm5Tnm5Lnm5vnnLfnnL7nnLznnLbnnLjnnLrnoavnoYPnoY7npaXnpajnpa3np7vnqpLnqpXnrKDnrKjnrJvnrKznrKbnrJnnrJ7nrK7nspLnspfnspXntYbntYPntbHntK7ntLnntLzntYDntLDntLPntYTntK/ntYLntLLntLHnvL3nvp7nvprnv4znv47nv5LogJzogYrogYbohK/ohJbohKPohKvohKnohLDohKToiILoiLXoiLfoiLboiLnojo7ojp7ojpjojbjojqLojpbojr3ojqvojpLojorojpPojonojqDojbfojbvojbxcIl0sW1wiYjM0MFwiLFwi6I6G6I6n6JmV5b2q6JuH6JuA6Jq26JuE6Jq16JuG6JuL6Jqx6Jqv6JuJ6KGT6KKe6KKI6KKr6KKS6KKW6KKN6KKL6KaT6KaP6Kiq6Kid6Kij6Kil6Kix6Kit6Kif6Kib6Kii6LGJ6LGa6LKp6LKs6LKr6LKo6LKq6LKn6LWn6LWm6La+6La66Lub6Luf6YCZ6YCN6YCa6YCX6YCj6YCf6YCd6YCQ6YCV6YCe6YCg6YCP6YCi6YCW6YCb6YCUXCJdLFtcImIzYTFcIixcIumDqOmDremDvemFl+mHjumHtemHpumHo+mHp+mHremHqemWiemZqumZtemZs+mZuOmZsOmZtOmZtumZt+mZrOmbgOmbqumbqeeroOern+mggumgg+mtmumzpem5tem5v+m6pem6u+WCouWCjeWCheWCmeWCkeWCgOWCluWCmOWCmuacgOWHseWJsuWJtOWJteWJqeWLnuWLneWLm+WNmuWOpeWVu+WWgOWWp+WVvOWWiuWWneWWmOWWguWWnOWWquWWlOWWh+WWi+WWg+WWs+WWruWWn+WUvuWWsuWWmuWWu+WWrOWWseWVvuWWieWWq+WWmeWcjeWgr+WgquWgtOWgpOWgsOWgseWgoeWgneWgoOWjueWjuuWloFwiXSxbXCJiNDQwXCIsXCLlqbflqprlqb/lqpLlqpvlqqflrbPlrbHlr5Llr4zlr5Plr5DlsIrlsIvlsLHltYzltZDltLTltYflt73luYXluL3luYDluYPlub7lu4rlu4Hlu4Llu4TlvLzlva3lvqnlvqrlvqjmg5Hmg6HmgrLmgrbmg6DmhJzmhKPmg7rmhJXmg7Dmg7vmg7Tmhajmg7HmhI7mg7bmhInmhIDmhJLmiJ/miYnmjqPmjozmj4/mj4Dmj6nmj4nmj4bmj41cIl0sW1wiYjRhMVwiLFwi5o+S5o+j5o+Q5o+h5o+W5o+t5o+u5o225o+05o+q5o+b5pGS5o+a5o+55pWe5pWm5pWi5pWj5paR5paQ5pav5pmu5pmw5pm05pm25pmv5pqR5pm65pm+5pm35pu+5pu/5pyf5pyd5qO65qOV5qOg5qOY5qOX5qSF5qOf5qO15qOu5qOn5qO55qOS5qOy5qOj5qOL5qON5qSN5qSS5qSO5qOJ5qOa5qWu5qO75qy+5qy65qy95q6Y5q6W5q685q+v5rCu5rCv5rCs5riv5ri45rmU5rih5riy5rmn5rmK5rig5ril5rij5rib5rmb5rmY5rik5rmW5rmu5rit5rim5rmv5ri05rmN5ri65ris5rmD5rid5ri+5ruLXCJdLFtcImI1NDBcIixcIua6iea4mea5jua5o+a5hOa5sua5qea5n+eEmeeEmueEpueEsOeEoeeEtueFrueEnOeJjOeKhOeKgOeMtueMpeeMtOeMqeeQuueQqueQs+eQoueQpeeQteeQtueQtOeQr+eQm+eQpueQqOeUpeeUpueVq+eVqueXoueXm+eXo+eXmeeXmOeXnueXoOeZu+eZvOealueak+eatOebnOedj+efreehneehrOehr+eojeeoiOeoi+eoheeogOeqmFwiXSxbXCJiNWExXCIsXCLnqpfnqpbnq6Xnq6PnrYnnrZbnrYbnrZDnrZLnrZTnrY3nrYvnrY/nrZHnsp/nsqXntZ7ntZDntajntZXntKvnta7ntbLntaHntabntaLntbDntbPlloTnv5Tnv5XogIvogZLogoXohZXohZTohYvohZHohY7ohLnohYbohL7ohYzohZPohbToiJLoiJzoj6nokIPoj7jokI3oj6Doj4XokIvoj4Hoj6/oj7Hoj7TokZfokIroj7DokIzoj4zoj73oj7Loj4rokLjokI7okIToj5zokIfoj5Toj5/omZvom5/om5nom63om5Tom5vom6Tom5Dom57ooZfoo4Hoo4LoorHopoPoppboqLvoqaDoqZXoqZ7oqLzoqYFcIl0sW1wiYjY0MFwiLFwi6KmU6Kmb6KmQ6KmG6Ki06Ki66Ki26KmW6LGh6LKC6LKv6LK86LKz6LK96LOB6LK76LOA6LK06LK36LK26LK/6LK46LaK6LaF6LaB6LeO6Led6LeL6Lea6LeR6LeM6Leb6LeG6Lu76Lu46Lu86L6c6YCu6YC16YCx6YC46YCy6YC26YSC6YO16YSJ6YO+6YWj6YWl6YeP6YiU6YiV6Yij6YiJ6Yie6YiN6YiQ6YiH6YiR6ZaU6ZaP6ZaL6ZaRXCJdLFtcImI2YTFcIixcIumWk+mWkumWjumaiumajumai+mZvemahemahumajemZsumahOmbgembhembhOmbhumbh+mbr+mbsumfjOmghemghumgiOmjp+mjqumjr+mjqemjsumjremmrummrem7g+m7jem7keS6guWCreWCteWCsuWCs+WDheWCvuWCrOWCt+WCu+WCr+WDh+WJv+WJt+WJveWLn+WLpuWLpOWLouWLo+WMr+WXn+WXqOWXk+WXpuWXjuWXnOWXh+WXkeWXo+WXpOWXr+WXmuWXoeWXheWXhuWXpeWXieWckuWck+WhnuWhkeWhmOWhl+WhmuWhlOWhq+WhjOWhreWhiuWhouWhkuWhi+Wlp+WrgeWrieWrjOWqvuWqveWqvFwiXSxbXCJiNzQwXCIsXCLlqrPlq4LlqrLltanlta/luYzlubnlu4nlu4jlvJLlvZnlvqzlvq7mhJrmhI/mhYjmhJ/mg7PmhJvmg7nmhIHmhIjmhY7mhYzmhYTmhY3mhL7mhLTmhKfmhI3mhIbmhLfmiKHmiKLmkJPmkL7mkJ7mkKrmkK3mkL3mkKzmkI/mkJzmkJTmkI3mkLbmkJbmkJfmkIbmlazmlp/mlrDmmpfmmonmmofmmojmmpbmmoTmmpjmmo3mnIPmppTmpa1cIl0sW1wiYjdhMVwiLFwi5qWa5qW35qWg5qWU5qW15qSw5qaC5qWK5qWo5qWr5qWe5qWT5qW55qaG5qWd5qWj5qWb5q2H5q2y5q+A5q6/5q+T5q+95rqi5rqv5ruT5rq25ruC5rqQ5rqd5ruH5ruF5rql5rqY5rq85rq65rqr5ruR5rqW5rqc5ruE5ruU5rqq5rqn5rq054WO54WZ54Wp54Wk54WJ54Wn54Wc54Ws54Wm54WM54Wl54We54WG54Wo54WW54i654mS54y3542F54y/54y+55Gv55Ga55GV55Gf55Ge55GB55C/55GZ55Gb55Gc55W255W455iA55ew55iB55ey55ex55e655e/55e055ez55ue55uf552b552r552m552e552jXCJdLFtcImI4NDBcIixcIuedueedquedrOednOedpeedqOedouefrueijueisOeil+eimOeijOeiieehvOeikeeik+ehv+eluuelv+emgeiQrOemveeonOeomueooOeolOeon+eonueqn+eqoOett+evgOetoOetruetp+eyseeys+eytee2k+e1uee2kee2gee2j+e1m+e9rue9qee9que9sue+qee+qOe+pOiBluiBmOiChuiChOiFseiFsOiFuOiFpeiFruiFs+iFq1wiXSxbXCJiOGExXCIsXCLohbnohbrohaboiIXoiYfokoLokbfokL3okLHokbXokabokavokYnokazokZvokLzokLXokaHokaPokanoka3okYbomZ7omZzomZ/om7nonJPonIjonIfonIDom77om7vonILonIPonIbonIrooZnoo5/oo5Too5noo5zoo5joo53oo6Hoo4roo5Xoo5Loppzop6PoqavoqbLoqbPoqaboqanoqbDoqofoqbzoqaPoqqDoqbHoqoXoqa3oqaLoqa7oqazoqbnoqbvoqL7oqajosaLosorosonos4ros4fos4jos4TosrLos4Pos4Los4Xot6Hot5/ot6jot6/ot7Pot7rot6rot6Tot6bourLovIPovInou77ovIpcIl0sW1wiYjk0MFwiLFwi6L6f6L6y6YGL6YGK6YGT6YGC6YGU6YC86YGV6YGQ6YGH6YGP6YGO6YGN6YGR6YC+6YGB6YSS6YSX6YWs6YWq6YWp6YeJ6Yi36YmX6Yi46Yi96YmA6Yi+6Ymb6YmL6Ymk6YmR6Yi06YmJ6YmN6YmF6Yi56Yi/6Yma6ZaY6ZqY6ZqU6ZqV6ZuN6ZuL6ZuJ6ZuK6Zu36Zu76Zu56Zu26Z2W6Z206Z226aCQ6aCR6aCT6aCK6aCS6aCM6aO86aO0XCJdLFtcImI5YTFcIixcIumjvemjvumms+mmsemmtOmroemzqem6gum8jum8k+m8oOWDp+WDruWDpeWDluWDreWDmuWDleWDj+WDkeWDseWDjuWDqeWFouWHs+WKg+WKguWMseWOreWXvuWYgOWYm+WYl+WXveWYlOWYhuWYieWYjeWYjuWXt+WYluWYn+WYiOWYkOWXtuWcmOWcluWhteWhvuWig+Wik+WiiuWhueWiheWhveWjveWkpeWkouWkpOWlquWlqeWroeWrpuWrqeWrl+WrluWrmOWro+WtteWvnuWvp+WvoeWvpeWvpuWvqOWvouWvpOWvn+WwjeWxouW2hOW2h+W5m+W5o+W5leW5l+W5lOW7k+W7luW8iuW9huW9sOW+ueaFh1wiXSxbXCJiYTQwXCIsXCLmhL/mhYvmhbfmhaLmhaPmhZ/mhZrmhZjmhbXmiKrmkofmkZjmkZTmkqTmkbjmkZ/mkbrmkZHmkafmkLTmka3mkbvmlbLmlqHml5fml5bmmqLmmqjmmp3mppzmpqjmppXmp4Hmpq7mp5Pmp4vmppvmprfmprvmpqvmprTmp5Dmp43mpq3mp4zmpqbmp4PmpqPmrYnmrYzmsLPmvLPmvJTmu77mvJPmu7TmvKnmvL7mvKDmvKzmvI/mvILmvKJcIl0sW1wiYmFhMVwiLFwi5ru/5ruv5ryG5ryx5ry45ryy5ryj5ryV5ryr5ryv5r6I5ryq5rus5ryB5ruy5ruM5ru354aU54aZ54W954aK54aE54aS54i+54qS54qW542E542Q55Gk55Gj55Gq55Gw55Gt55SE55aR55in55iN55iL55iJ55iT55uh55uj556E5529552/552h56OB56Kf56Kn56Kz56Kp56Kj56aO56aP56aN56iu56ix56qq56qp56ut56uv566h566V566L5621566X566d566U566P5664566H566E57K557K957K+57a757aw57ac57a957a+57ag57eK57a057ay57ax57a657ai57a/57a157a457at57eS57eH57asXCJdLFtcImJiNDBcIixcIue9sOe/oOe/oee/n+iBnuiBmuiCh+iFkOiGgOiGj+iGiOiGiuiFv+iGguiHp+iHuuiIh+iIlOiInuiJi+iTieiSv+iThuiThOiSmeiSnuiSsuiSnOiTi+iSuOiTgOiTk+iSkOiSvOiTkeiTiuicv+icnOicu+icouicpeictOicmOidleict+icqeijs+ikguijtOijueijuOijveijqOikmuijr+iqpuiqjOiqnuiqo+iqjeiqoeiqk+iqpFwiXSxbXCJiYmExXCIsXCLoqqroqqXoqqjoqpjoqpHoqproqqfosaroso3osozos5Pos5Hos5LotavotpnotpXot7zovJTovJLovJXovJPovqPpgaDpgZjpgZzpgaPpgZnpgZ7pgaLpgZ3pgZvphJnphJjphJ7phbXphbjphbfphbTpibjpioDpioXpipjpipbpibvpipPpipzpiqjpibzpipHplqHplqjplqnplqPplqXplqTpmpnpmpzpmpvpm4zpm5LpnIDpnbzpnoXpn7bpoJfpoJjpoq/porHppIPppIXppIzppInpp4Hpqq/pqrDpq6bprYHprYLps7Tps7bps7PpurzpvLvpvYrlhITlhIDlg7vlg7Xlg7nlhILlhIjlhInlhIXlh5xcIl0sW1wiYmM0MFwiLFwi5YqH5YqI5YqJ5YqN5YqK5Yuw5Y6y5Ziu5Zi75Zi55Ziy5Zi/5Zi05Zip5ZmT5ZmO5ZmX5Zm05Zi25Ziv5Ziw5aKA5aKf5aKe5aKz5aKc5aKu5aKp5aKm5aWt5ayJ5au75ayL5au15ayM5ayI5a+u5a+s5a+p5a+r5bGk5bGl5bad5baU5bmi5bmf5bmh5bui5bua5buf5bud5buj5bug5b2I5b2x5b635b615oW25oWn5oWu5oWd5oWV5oaCXCJdLFtcImJjYTFcIixcIuaFvOaFsOaFq+aFvuaGp+aGkOaGq+aGjuaGrOaGmuaGpOaGlOaGruaIruaRqeaRr+aRueaSnuaSsuaSiOaSkOaSsOaSpeaSk+aSleaSqeaSkuaSruaSreaSq+aSmuaSrOaSmeaSouaSs+aVteaVt+aVuOaaruaaq+aatOaaseaoo+aon+anqOaogeaonuaomeanveaooeaok+aoiuans+aoguaoheanreaokeatkOatjuaupOavheavhua8v+a9vOa+hOa9kea9pua9lOa+hua9rea9m+a9uOa9rua+jua9uua9sOa9pOa+l+a9mOa7lea9r+a9oOa9n+eGn+eGrOeGseeGqOeJlueKm+eNjueNl+eRqeeSi+eSg1wiXSxbXCJiZDQwXCIsXCLnkb7nkoDnlb/nmKDnmKnnmJ/nmKTnmKbnmKHnmKLnmprnmrrnm6Tnno7nnofnnoznnpHnnovno4vno4Xnorrno4rnor7no5Xnorzno5DnqL/nqLznqYDnqL3nqLfnqLvnqq/nqq7nrq3nrrHnr4TnrrTnr4bnr4fnr4HnrqDnr4zns4rnt6Dnt7Tnt6/nt7vnt5jnt6znt53nt6jnt6Pnt5rnt57nt6nntp7nt5nnt7Lnt7nnvbXnvbfnvq9cIl0sW1wiYmRhMVwiLFwi57+p6ICm6Iab6Iac6Iad6Iag6Iaa6IaY6JSX6JS96JSa6JOu6JSs6JSt6JST6JSR6JSj6JSh6JSU6JOs6JSl6JO/6JSG6J6C6J206J226J2g6J2m6J246J2o6J2Z6J2X6J2M6J2T6KGb6KGd6KSQ6KSH6KSS6KST6KSV6KSK6Kq86KuS6KuH6KuE6KqV6KuL6Ku46Kqy6KuJ6KuC6Kq/6Kqw6KuW6KuN6Kq26Kq56Kub6LGM6LGO6LGs6LOg6LOe6LOm6LOk6LOs6LOt6LOi6LOj6LOc6LOq6LOh6LWt6Laf6Laj6Lir6LiQ6Lid6Lii6LiP6Lip6Lif6Lih6Lie6Lq66Lyd6Lyb6Lyf6Lyp6Lym6Lyq6Lyc6LyeXCJdLFtcImJlNDBcIixcIui8pemBqemBrumBqOmBremBt+mEsOmEremEp+mEsemGh+mGiemGi+mGg+mLhemKu+mKt+mLqumKrOmLpOmLgemKs+mKvOmLkumLh+mLsOmKsumWremWsemchOmchumch+mciemdoOmejemei+mej+mgoemgq+mgnOmis+mkiumkk+mkkumkmOmnnemnkOmnn+mnm+mnkemnlemnkumnmemqt+mrrumrr+msp+mthemthOmtt+mtr+m0hum0iVwiXSxbXCJiZWExXCIsXCLptIPpuqnpur7pu47loqjpvZLlhJLlhJjlhJTlhJDlhJXlhoDlhqrlh53lipHlipPli7PlmZnlmavlmbnlmanlmaTlmbjlmarlmajlmaXlmbHlma/lmazlmaLlmbblo4Hlor7lo4flo4Xlpa7lrJ3lrLTlrbjlr7DlsI7lvYrmhrLmhpHmhqnmhormh43mhrbmhr7mh4rmh4jmiLDmk4Xmk4Hmk4vmkrvmkrzmk5rmk4Tmk4fmk4Lmk43mkr/mk5Lmk5Tmkr7mlbTmm4bmm4nmmrnmm4Tmm4fmmrjmqL3mqLjmqLrmqZnmqavmqZjmqLnmqYTmqaLmqaHmqYvmqYfmqLXmqZ/mqYjmrZnmrbfmsIXmv4LmvrHmvqFcIl0sW1wiYmY0MFwiLFwi5r+D5r6k5r+B5r6n5r6z5r+A5r655r625r6m5r6g5r6054a+54eJ54eQ54eS54eI54eV54a554eO54eZ54ec54eD54eE542o55Kc55Kj55KY55Kf55Ke55Oi55SM55SN55i055i455i655un55ul556g556e556f556l56Oo56Oa56Os56On56am56mN56mO56mG56mM56mL56q656+Z57CR56+J56+k56+b56+h56+p56+m57OV57OW57iKXCJdLFtcImJmYTFcIixcIue4kee4iOe4m+e4o+e4nue4nee4iee4kOe9uee+sue/sOe/see/ruiAqOiGs+iGqeiGqOiHu+iIiOiJmOiJmeiViuiVmeiViOiVqOiVqeiVg+iVieiVreiVquiVnuieg+ien+ienuieouiejeihoeikquiksuikpeikq+ikoeimquimpuirpuiruuirq+irseisgOirnOirp+irruirvuisgeisguirt+irreirs+irtuirvOixq+ixreiyk+iztOi5hOi4sei4tOi5gui4uei4tei8u+i8r+i8uOi8s+i+qOi+pumBtemBtOmBuOmBsumBvOmBuumEtOmGkumMoOmMtumLuOmMs+mMr+mMoumLvOmMq+mMhOmMmlwiXSxbXCJjMDQwXCIsXCLpjJDpjKbpjKHpjJXpjK7pjJnplrvpmqfpmqjpmqrpm5XpnI7pnJHpnJbpnI3pnJPpnI/pnZvpnZzpnabpnpjpoLDpoLjpoLvpoLfpoK3poLnpoKTppJDppKjppJ7ppJvppKHppJrpp63pp6Lpp7Hpqrjpqrzpq7vpq63prKjprpHptJXptKPptKbptKjptJLptJvpu5jpu5Tpvo3pvpzlhKrlhJ/lhKHlhLLli7Xlmo7lmoDlmpDlmoXlmodcIl0sW1wiYzBhMVwiLFwi5ZqP5aOV5aOT5aOR5aOO5ayw5ayq5ayk5a265bC35bGo5ba85ba65ba95ba45bmr5b2M5b695oeJ5oeC5oeH5oem5oeL5oiy5oi05pOO5pOK5pOY5pOg5pOw5pOm5pOs5pOx5pOi5pOt5paC5paD5puZ5puW5qqA5qqU5qqE5qqi5qqc5qub5qqj5qm+5qqX5qqQ5qqg5q2c5q6u5q+a5rCI5r+Y5r+x5r+f5r+g5r+b5r+k5r+r5r+v5r6A5r+s5r+h5r+p5r+V5r+u5r+w54en54ef54eu54em54el54et54es54e054eg54i154mG542w542y55Kp55Kw55Km55Ko55mG55mC55mM55uq556z556q556w556sXCJdLFtcImMxNDBcIixcIueep+eereefr+ejt+ejuuejtOejr+ekgeemp+emquepl+eqv+ewh+ewjeevvuevt+ewjOevoOezoOeznOeznuezouezn+ezmeeznee4rue4vue5hue4t+e4sue5g+e4q+e4vee4see5hee5gee4tOe4uee5iOe4tee4v+e4r+e9hOe/s+e/vOiBseiBsuiBsOiBr+iBs+iHhuiHg+iGuuiHguiHgOiGv+iGveiHieiGvuiHqOiIieiJseiWqlwiXSxbXCJjMWExXCIsXCLoloTolb7olpzolpHolpTolq/olpvolofolqjoloromafon4Don5HonrPon5Lon4bonqvonrvonrron4jon4vopLvopLbopYTopLjopL3opqzorI7orJforJnorJvorIrorKDorJ3orITorJDosYHosL/osbPos7ros73os7zos7jos7votqjouYnouYvouYjouYrovYTovL7ovYLovYXovL/pgb/pgb3pgoTpgoHpgoLpgoDphLnphqPphp7phpzpjY3pjoLpjKjpjbXpjYrpjaXpjYvpjJjpjb7pjazpjZvpjbDpjZrpjZTpl4rpl4vpl4zpl4jpl4bpmrHpmrjpm5bpnJzpnJ7pnqDpn5PpoYbporbppLXpqIFcIl0sW1wiYzI0MFwiLFwi6ae/6a6u6a6r6a6q6a6t6bS76bS/6bqL6buP6bue6buc6bud6bub6by+6b2L5Y+i5ZqV5Zqu5aOZ5aOY5ay45b2d5oej5oiz5pO05pOy5pO+5pSG5pO65pO75pO35pa35puc5pym5qqz5qqs5quD5qq75qq45quC5qqu5qqv5q2f5q245q6v54CJ54CL5r++54CG5r+654CR54CP54e754e854e+54e45423542155Kn55K/55SV55mW55mYXCJdLFtcImMyYTFcIixcIueZkueeveeev+eeu+eevOekjuemruepoeepouepoOerhOerheewq+ewp+ewquewnuewo+ewoeezp+e5lOe5lee5nue5mue5oee5kue5mee9iOe/uee/u+iBt+iBtuiHjeiHj+iIiuiXj+iWqeiXjeiXkOiXieiWsOiWuuiWueiWpuifr+ifrOifsuifoOimhuimsuintOisqOisueisrOisq+ixkOi0hei5mei5o+i5pui5pOi5n+i5lei7gOi9iei9jemCh+mCg+mCiOmGq+mGrOmHkOmOlOmOiumOlumOoumOs+mOrumOrOmOsOmOmOmOmumOl+mXlOmXlumXkOmXlemboumbnOmbmembm+mbnumcpOmeo+meplwiXSxbXCJjMzQwXCIsXCLpnq3pn7npoY3poY/poYzpoY7poZPporrppL7ppL/ppL3ppK7ppqXpqI7pq4HprIPprIbprY/prY7prY3pr4rpr4npr73pr4jpr4DptZHptZ3ptaDpu6DpvJXpvKzlhLPlmqXlo57lo5/lo6Llr7XpvpDlu6zmh7Lmh7fmh7bmh7XmlIDmlI/mm6Dmm53mq6Xmq53mq5rmq5PngJvngJ/ngKjngJrngJ3ngJXngJjniIbniI3niZjniqLnjbhcIl0sW1wiYzNhMVwiLFwi542655K955OK55Oj55aH55aG55mf55mh55+H56SZ56ax56mr56mp57C+57C/57C457C957C357GA57mr57mt57m557mp57mq576F57mz5762576557646IeY6Jep6Jed6Jeq6JeV6Jek6Jel6Je36J+76KCF6KCN6J+56J++6KWg6KWf6KWW6KWe6K2B6K2c6K2Y6K2J6K2a6K2O6K2P6K2G6K2Z6LSI6LSK6Lm86Lmy6LqH6Lm26Lms6Lm66Lm06L2U6L2O6L6t6YKK6YKL6Yax6Yau6Y+h6Y+R6Y+f6Y+D6Y+I6Y+c6Y+d6Y+W6Y+i6Y+N6Y+Y6Y+k6Y+X6Y+o6Zec6Zq06Zuj6Zyq6Zyn6Z2h6Z+c6Z+76aGeXCJdLFtcImM0NDBcIixcIumhmOmhm+mivOmlhemliemolumomemsjemvqOmvp+mvlumvm+m2iem1oem1sum1qum1rOm6kum6l+m6k+m6tOWLuOWaqOWat+WatuWatOWavOWjpOWtgOWtg+WtveWvtuW3ieaHuOaHuuaUmOaUlOaUmeabpuacp+arrOeAvueAsOeAsueIkOeNu+eTj+eZoueZpeekpuekquekrOekq+erh+ertuexjOexg+exjeezr+ezsOi+rue5vee5vFwiXSxbXCJjNGExXCIsXCLnuoLnvYzogIDoh5roiabol7vol7nomJHol7romIbomIvomIfomIrooJTooJXopaToprrop7jorbDorazorabora/orZ/oravotI/otI3ouonouoHouoXouoLphrTph4vpkJjpkIPpj73pl6HpnLDpo4TppZLppZHppqjpqKvpqLDpqLfpqLXpsJPpsI3pubnpurXpu6jpvK/pvZ/pvaPpvaHlhLflhLjlm4Hlm4Dlm4LlpJTlsazlt43mh7zmh77mlJ3mlJzmlpXmm6nmq7vmrITmq7rmrrLngYzniJvniqfnk5bnk5Tnmannn5PnsZDnuo/nuoznvrzomJfomK3omJrooKPooKLooKHooJ/oparopazopr3orbRcIl0sW1wiYzU0MFwiLFwi6K236K296LST6LqK6LqN6LqL6L2f6L6v6Ya66ZCu6ZCz6ZC16ZC66ZC46ZCy6ZCr6Zei6Zy46Zy56Zyy6Z+/6aGn6aGl6aWX6amF6amD6amA6ai+6auP6a2U6a2R6bCt6bCl6bav6ba06beC6ba46bqd6buv6byZ6b2c6b2m6b2n5YS85YS75ZuI5ZuK5ZuJ5a2/5beU5beS5b2O5oe/5pSk5qyK5q2h54GR54GY546A55Ok55aK55mu55msXCJdLFtcImM1YTFcIixcIuems+exoOexn+iBvuiBveiHn+ilsuilr+invOiugOi0lui0l+i6kei6k+i9oemFiOmRhOmRkemRkumcvemcvumfg+mfgemhq+mllemplempjemrkumsmumxiemwsemwvumwu+m3k+m3l+m8tOm9rOm9qum+lOWbjOW3luaIgOaUo+aUq+aUquabrOaskOeTmueriuexpOexo+expee6k+e6lue6lOiHouiYuOiYv+igseiuiumCkOmCj+mRo+mRoOmRpOmdqOmhr+mlnOmpmumpm+mpl+mrk+mrlOmrkemxlOmxl+mxlum3pem6n+m7tOWbkeWjqeaUrOeBnueZseeZsuefl+e9kOe+iOigtuigueihouiuk+iuklwiXSxbXCJjNjQwXCIsXCLorpboibfotJvph4DpkarpnYLpnYjpnYTpn4bpobDpqZ/prKLprZjpsZ/pt7npt7rpubzpub3pvIfpvbfpvbLlu7PmrJbngaPnsaznsa7ooLvop4DouqHph4HpkbLpkbDpobHppZ7pq5bprKPpu4zngaTnn5rorprpkbfpn4npqaLpqaXnupzorpzouqrph4Xpkb3pkb7pkbzpsbfpsbjpu7fosZTpkb/puJrniKjpqarprLHpuJvpuJ7nsbJcIl0sW1wiYzk0MFwiLFwi5LmC5Lmc5Ye15Yya5Y6C5LiH5LiM5LmH5LqN5ZuX76iM5bGu5b2z5LiP5YaH5LiO5Liu5LqT5LuC5LuJ5LuI5YaY5Yu85Y2s5Y655Zyg5aSD5aSs5bCQ5be/5peh5q6z5q+M5rCU54i/5Lix5Li85Luo5Luc5Lup5Luh5Lud5Lua5YiM5Yyc5Y2M5Zyi5Zyj5aSX5aSv5a6B5a6E5bCS5bC75bG05bGz5biE5bqA5bqC5b+J5oiJ5omQ5rCVXCJdLFtcImM5YTFcIixcIuawtuaxg+awv+awu+eKrueKsOeOiuemuOiCiumYnuS8juS8mOS8rOS7teS8lOS7seS8gOS7t+S8iOS8neS8guS8heS8ouS8k+S8hOS7tOS8kuWGseWIk+WIieWIkOWKpuWMouWMn+WNjeWOiuWQh+WboeWbn+WcruWcquWctOWkvOWmgOWlvOWmheWlu+WlvuWlt+Wlv+WtluWwleWwpeWxvOWxuuWxu+WxvuW3n+W5teW6hOW8guW8muW9tOW/leW/lOW/j+aJnOaJnuaJpOaJoeaJpuaJouaJmeaJoOaJmuaJpeaXr+aXruacvuacueacuOacu+acuuacv+acvOacs+awmOaxhuaxkuaxnOaxj+axiuaxlOaxi1wiXSxbXCJjYTQwXCIsXCLmsYzngbHniZ7nirTnirXnjo7nlKrnmb/nqbXnvZHoibjoibzoioDoib3oib/omY3opb7pgpnpgpfpgpjpgpvpgpTpmKLpmKTpmKDpmKPkvZbkvLvkvaLkvYnkvZPkvaTkvL7kvafkvZLkvZ/kvYHkvZjkvK3kvLPkvL/kvaHlho/lhrnliJzliJ7liKHliq3liq7ljInljaPljbLljo7ljo/lkLDlkLflkKrlkZTlkYXlkJnlkJzlkKXlkJhcIl0sW1wiY2FhMVwiLFwi5ZC95ZGP5ZGB5ZCo5ZCk5ZGH5Zuu5Zun5Zul5Z2B5Z2F5Z2M5Z2J5Z2L5Z2S5aSG5aWA5aam5aaY5aag5aaX5aaO5aai5aaQ5aaP5aan5aah5a6O5a6S5bCo5bCq5bKN5bKP5bKI5bKL5bKJ5bKS5bKK5bKG5bKT5bKV5beg5biK5biO5bqL5bqJ5bqM5bqI5bqN5byF5byd5b245b225b+S5b+R5b+Q5b+t5b+o5b+u5b+z5b+h5b+k5b+j5b+65b+v5b+35b+75oCA5b+05oi65oqD5oqM5oqO5oqP5oqU5oqH5omx5om75om65omw5oqB5oqI5om35om95omy5om05pS35pew5pe05pez5pey5pe15p2F5p2HXCJdLFtcImNiNDBcIixcIuadmeadleadjOadiOadneadjeadmuadi+avkOawmeawmuaxuOaxp+axq+ayhOayi+ayj+axseaxr+axqeaymuaxreayh+ayleaynOaxpuaxs+axpeaxu+ayjueBtOeBuueJo+eKv+eKveeLg+eLhueLgeeKuueLheeOleeOl+eOk+eOlOeOkueUuueUueeWlOeWleeageekveiAtOiCleiCmeiCkOiCkuiCnOiKkOiKj+iKheiKjuiKkeiKk1wiXSxbXCJjYmExXCIsXCLoioroioPoioTosbjov4novr/pgp/pgqHpgqXpgp7pgqfpgqDpmLDpmKjpmK/pmK3kuLPkvpjkvbzkvoXkvb3kvoDkvofkvbbkvbTkvonkvoTkvbfkvYzkvpfkvarkvprkvbnkvoHkvbjkvpDkvpzkvpTkvp7kvpLkvoLkvpXkvavkva7lhp7lhrzlhr7liLXliLLliLPliYbliLHlirzljIrljIvljLzljpLljpTlkoflkb/lkoHlkpHlkoLlkojlkavlkbrlkb7lkaXlkazlkbTlkablko3lka/lkaHlkaDlkpjlkaPlkaflkaTlm7flm7nlna/lnbLlna3lnavlnbHlnbDlnbblnoDlnbXlnbvlnbPlnbTlnaJcIl0sW1wiY2M0MFwiLFwi5Z2o5Z295aSM5aWF5aa15aa65aeP5aeO5aay5aeM5aeB5aa25aa85aeD5aeW5aax5aa95aeA5aeI5aa05aeH5a2i5a2l5a6T5a6V5bGE5bGH5bKu5bKk5bKg5bK15bKv5bKo5bKs5bKf5bKj5bKt5bKi5bKq5bKn5bKd5bKl5bK25bKw5bKm5biX5biU5biZ5byo5byi5byj5byk5b2U5b6C5b2+5b295b+e5b+l5oCt5oCm5oCZ5oCy5oCLXCJdLFtcImNjYTFcIixcIuaAtOaAiuaAl+aAs+aAmuaAnuaArOaAouaAjeaAkOaAruaAk+aAkeaAjOaAieaAnOaIlOaIveaKreaKtOaLkeaKvuaKquaKtuaLiuaKruaKs+aKr+aKu+aKqeaKsOaKuOaUveaWqOaWu+aYieaXvOaYhOaYkuaYiOaXu+aYg+aYi+aYjeaYheaXveaYkeaYkOabtuaciuaeheadrOaejuaekuadtuadu+aemOaehuaehOadtOaejeaejOaduuaen+aekeaemeaeg+adveaegeaduOadueaelOaspeaugOatvuavnuawneayk+azrOazq+azruazmeaytuazlOayreazp+ayt+azkOazguayuuazg+azhuazreazslwiXSxbXCJjZDQwXCIsXCLms5Lms53msrTmsormsp3msoDms57ms4DmtLDms43ms4fmsrDms7nms4/ms6nms5HngpTngpjngoXngpPngobngoTngpHngpbngoLngprngoPniarni5bni4vni5jni4nni5zni5Lni5Tni5rni4zni5HnjqTnjqHnjq3njqbnjqLnjqDnjqznjp3nk53nk6jnlL/nlYDnlL7nloznlpjnmq/nm7Pnm7Hnm7Dnm7Xnn7jnn7znn7nnn7vnn7pcIl0sW1wiY2RhMVwiLFwi55+356WC56S/56eF56m456m756u757G157O96IC16IKP6IKu6IKj6IK46IK16IKt6Iig6Iqg6IuA6Iqr6Iqa6IqY6Iqb6Iq16Iqn6Iqu6Iq86Iqe6Iq66Iq06Iqo6Iqh6Iqp6IuC6Iqk6IuD6Iq26Iqi6Jmw6Jmv6Jmt6Jmu6LGW6L+S6L+L6L+T6L+N6L+W6L+V6L+X6YKy6YK06YKv6YKz6YKw6Zi56Zi96Zi86Zi66ZmD5L+N5L+F5L+T5L6y5L+J5L+L5L+B5L+U5L+c5L+Z5L675L6z5L+b5L+H5L+W5L665L+A5L655L+s5YmE5YmJ5YuA5YuC5Yy95Y285Y6X5Y6W5Y6Z5Y6Y5ZK65ZKh5ZKt5ZKl5ZOPXCJdLFtcImNlNDBcIixcIuWTg+iMjeWSt+WSruWTluWStuWTheWThuWSoOWRsOWSvOWSouWSvuWRsuWTnuWSsOWeteWenuWen+WepOWejOWel+WeneWem+WelOWemOWej+WemeWepeWemuWeleWjtOWkjeWlk+WnoeWnnuWnruWogOWnseWnneWnuuWnveWnvOWntuWnpOWnsuWnt+Wnm+WnqeWns+WnteWnoOWnvuWntOWnreWuqOWxjOWzkOWzmOWzjOWzl+Wzi+Wzm1wiXSxbXCJjZWExXCIsXCLls57ls5rls4nls4fls4rls5bls5Pls5Tls4/ls4jls4bls47ls5/ls7jlt7nluKHluKLluKPluKDluKTlurDluqTluqLlupvluqPluqXlvIflvK7lvZblvobmgLfmgLnmgZTmgbLmgZ7mgYXmgZPmgYfmgYnmgZvmgYzmgYDmgYLmgZ/mgKTmgYTmgZjmgabmga7miYLmiYPmi4/mjI3mjIvmi7XmjI7mjIPmi6vmi7nmjI/mjIzmi7jmi7bmjIDmjJPmjJTmi7rmjJXmi7vmi7DmlYHmlYPmlqrmlr/mmLbmmKHmmLLmmLXmmJzmmKbmmKLmmLPmmKvmmLrmmJ3mmLTmmLnmmK7mnI/mnJDmn4Hmn7Lmn4jmnrpcIl0sW1wiY2Y0MFwiLFwi5p+c5p675p+45p+Y5p+A5p635p+F5p+r5p+k5p+f5p615p+N5p6z5p+35p+25p+u5p+j5p+C5p655p+O5p+n5p+w5p6y5p+85p+G5p+t5p+M5p6u5p+m5p+b5p+65p+J5p+K5p+D5p+q5p+L5qyo5q6C5q6E5q625q+W5q+Y5q+g5rCg5rCh5rSo5rS05rSt5rSf5rS85rS/5rSS5rSK5rOa5rSz5rSE5rSZ5rS65rSa5rSR5rSA5rSd5rWCXCJdLFtcImNmYTFcIixcIua0gea0mOa0t+a0g+a0j+a1gOa0h+a0oOa0rOa0iOa0oua0iea0kOeCt+eCn+eCvueCseeCsOeCoeeCtOeCteeCqeeJgeeJieeJiueJrOeJsOeJs+eJrueLiueLpOeLqOeLq+eLn+eLqueLpueLo+eOheePjOePguePiOePheeOueeOtueOteeOtOePq+eOv+ePh+eOvuePg+ePhueOuOePi+eTrOeTrueUrueVh+eViOeWp+eWqueZueebhOeciOecg+echOecheeciuebt+ebu+ebuuefp+efqOeghuegkeegkuegheegkOegj+egjuegieegg+egk+eliueljOeli+elheelhOenleenjeenj+enluenjueqgFwiXSxbXCJkMDQwXCIsXCLnqb7nq5HnrIDnrIHnsbrnsbjnsbnnsb/nsoDnsoHntIPntIjntIHnvZjnvpHnvo3nvr7ogIfogI7ogI/ogJTogLfog5jog4fog6Dog5Hog4jog4Log5Dog4Xog6Pog5nog5zog4rog5Xog4nog4/og5fog6bog43oh7/oiKHoipToi5noi77oi7nojIfoi6jojIDoi5XojLroi6voi5boi7Toi6zoi6Hoi7Loi7XojIzoi7voi7boi7Doi6pcIl0sW1wiZDBhMVwiLFwi6Iuk6Iug6Iu66Iuz6Iut6Jm36Jm06Jm86Jmz6KGB6KGO6KGn6KGq6KGp6KeT6KiE6KiH6LWy6L+j6L+h6L+u6L+g6YOx6YK96YK/6YOV6YOF6YK+6YOH6YOL6YOI6YeU6YeT6ZmU6ZmP6ZmR6ZmT6ZmK6ZmO5YCe5YCF5YCH5YCT5YCi5YCw5YCb5L+15L+05YCz5YC35YCs5L+25L+35YCX5YCc5YCg5YCn5YC15YCv5YCx5YCO5YWa5YaU5YaT5YeK5YeE5YeF5YeI5YeO5Ymh5Yma5YmS5Yme5Ymf5YmV5Ymi5YuN5YyO5Y6e5ZSm5ZOi5ZSX5ZSS5ZOn5ZOz5ZOk5ZSa5ZO/5ZSE5ZSI5ZOr5ZSR5ZSF5ZOxXCJdLFtcImQxNDBcIixcIuWUiuWTu+WTt+WTuOWToOWUjuWUg+WUi+WcgeWcguWfjOWgsuWfleWfkuWeuuWfhuWeveWevOWeuOWetuWev+Wfh+WfkOWeueWfgeWkjuWliuWomeWoluWoreWoruWoleWoj+Wol+WoiuWonuWos+WtrOWup+WureWurOWwg+WxluWxlOWzrOWzv+WzruWzseWzt+W0gOWzueW4qeW4qOW6qOW6ruW6quW6rOW8s+W8sOW9p+aBneaBmuaBp1wiXSxbXCJkMWExXCIsXCLmgYHmgqLmgojmgoDmgpLmgoHmgp3mgoPmgpXmgpvmgpfmgofmgpzmgo7miJnmiYbmi7LmjJDmjZbmjKzmjYTmjYXmjLbmjYPmj6TmjLnmjYvmjYrmjLzmjKnmjYHmjLTmjZjmjZTmjZnmjK3mjYfmjLPmjZrmjZHmjLjmjZfmjYDmjYjmlYrmlYbml4bml4Pml4Tml4LmmYrmmZ/mmYfmmZHmnJLmnJPmoJ/moJrmoYnmoLLmoLPmoLvmoYvmoY/moJbmoLHmoJzmoLXmoKvmoK3moK/moY7moYTmoLTmoJ3moJLmoJTmoKbmoKjmoK7moY3moLrmoKXmoKDmrKzmrK/mrK3mrLHmrLTmra3ogoLmrojmr6bmr6RcIl0sW1wiZDI0MFwiLFwi5q+o5q+j5q+i5q+n5rCl5rW65rWj5rWk5rW25rSN5rWh5raS5rWY5rWi5rWt5rWv5raR5raN5rev5rW/5raG5rWe5rWn5rWg5raX5rWw5rW85rWf5raC5raY5rSv5rWo5raL5rW+5raA5raE5rSW5raD5rW75rW95rW15raQ54Oc54OT54OR54Od54OL57y554Oi54OX54OS54Oe54Og54OU54ON54OF54OG54OH54Oa54OO54Oh54mC54m4XCJdLFtcImQyYTFcIixcIueJt+eJtueMgOeLuueLtOeLvueLtueLs+eLu+eMgeePk+ePmeePpeePlueOvOePp+ePo+ePqeePnOePkuePm+ePlOePneePmuePl+ePmOePqOeTnueTn+eTtOeTteeUoeeVm+eVn+eWsOeXgeeWu+eXhOeXgOeWv+eWtueWuueaiuebieecneecm+eckOeck+eckueco+eckeecleecmeecmuecouecp+ego+egrOegouegteegr+egqOegruegq+egoeegqeegs+egquegseellOelm+elj+elnOelk+elkuelkeenq+enrOenoOenruenreenquennOennuenneeqhueqieeqheeqi+eqjOeqiueqh+ermOeskFwiXSxbXCJkMzQwXCIsXCLnrITnrJPnrIXnrI/nrIjnrIrnrI7nrInnrJLnsoTnspHnsornsoznsojnso3nsoXntJ7ntJ3ntJHntI7ntJjntJbntJPntJ/ntJLntI/ntIznvZznvaHnvZ7nvaDnvZ3nvZvnvpbnvpLnv4Pnv4Lnv4DogJbogL7ogLnog7rog7Log7nog7XohIHog7vohIDoiIHoiK/oiKXojLPojK3ojYTojJnojZHojKXojZbojL/ojYHojKbojJzojKJcIl0sW1wiZDNhMVwiLFwi6I2C6I2O6Iyb6Iyq6IyI6Iy86I2N6IyW6Iyk6Iyg6Iy36Iyv6Iyp6I2H6I2F6I2M6I2T6Iye6Iys6I2L6Iyn6I2I6JmT6JmS6Jqi6Jqo6JqW6JqN6JqR6Jqe6JqH6JqX6JqG6JqL6Jqa6JqF6Jql6JqZ6Jqh6Jqn6JqV6JqY6JqO6Jqd6JqQ6JqU6KGD6KGE6KGt6KG16KG26KGy6KKA6KGx6KG/6KGv6KKD6KG+6KG06KG86KiS6LGH6LGX6LG76LKk6LKj6LW26LW46La16La36La26LuR6LuT6L++6L+16YCC6L+/6L+76YCE6L+86L+26YOW6YOg6YOZ6YOa6YOj6YOf6YOl6YOY6YOb6YOX6YOc6YOk6YWQXCJdLFtcImQ0NDBcIixcIumFjumFj+mHlemHoumHmumZnOmZn+mavOmjo+mrn+msr+S5v+WBsOWBquWBoeWBnuWBoOWBk+WBi+WBneWBsuWBiOWBjeWBgeWBm+WBiuWBouWAleWBheWBn+WBqeWBq+WBo+WBpOWBhuWBgOWBruWBs+WBl+WBkeWHkOWJq+WJreWJrOWJruWLluWLk+WMreWOnOWVteWVtuWUvOWVjeWVkOWUtOWUquWVkeWVouWUtuWUteWUsOWVkuWVhVwiXSxbXCJkNGExXCIsXCLllIzllLLllaXllY7llLnllYjllK3llLvllYDllYvlnIrlnIfln7vloJTln6Lln7bln5zln7TloIDln63ln73loIjln7jloIvln7Pln4/loIfln67ln6Pln7Lln6Xln6zln6HloI7ln7zloJDln6floIHloIzln7Hln6nln7DloI3loITlpZzlqaDlqZjlqZXlqaflqZ7lqLjlqLXlqa3lqZDlqZ/lqaXlqazlqZPlqaTlqZflqYPlqZ3lqZLlqYTlqZvlqYjlqo7lqL7lqY3lqLnlqYzlqbDlqanlqYflqZHlqZblqYLlqZzlrbLlra7lr4Hlr4DlsZnltJ7ltIvltJ3ltJrltKDltIzltKjltI3ltKbltKXltI9cIl0sW1wiZDU0MFwiLFwi5bSw5bSS5bSj5bSf5bSu5bi+5bi05bqx5bq05bq55bqy5bqz5by25by45b6b5b6W5b6f5oKK5oKQ5oKG5oK+5oKw5oK65oOT5oOU5oOP5oOk5oOZ5oOd5oOI5oKx5oOb5oK35oOK5oK/5oOD5oON5oOA5oyy5o2l5o6K5o6C5o295o695o6e5o6t5o6d5o6X5o6r5o6O5o2v5o6H5o6Q5o2u5o6v5o215o6c5o2t5o6u5o285o6k5oy75o6fXCJdLFtcImQ1YTFcIixcIuaNuOaOheaOgeaOkeaOjeaNsOaVk+aXjeaZpeaZoeaZm+aZmeaZnOaZouacmOahueaih+aikOainOahreahruairuaiq+alluahr+aio+airOaiqeahteahtOaisuaij+aht+aikuahvOahq+ahsuaiquaigOahseahvuaim+ailuaii+aioOaiieaipOahuOahu+aikeaijOaiiuahveastuass+ast+asuOaukeauj+aujeaujuaujOawqua3gOa2q+a2tOa2s+a5tOa2rOa3qea3oua2t+a3tua3lOa4gOa3iOa3oOa3n+a3lua2vua3pea3nOa3nea3m+a3tOa3iua2vea3rea3sOa2uua3lea3gua3j+a3iVwiXSxbXCJkNjQwXCIsXCLmt5Dmt7Lmt5Pmt73mt5fmt43mt6Pmtrvng7rnhI3ng7fnhJfng7TnhIzng7DnhITng7PnhJDng7zng7/nhIbnhJPnhIDng7jng7bnhIvnhILnhI7nib7nibvnibznib/njJ3njJfnjIfnjJHnjJjnjIrnjIjni7/njI/njJ7njojnj7bnj7jnj7XnkITnkIHnj73nkIfnkIDnj7rnj7znj7/nkIznkIvnj7TnkIjnlaTnlaPnl47nl5Lnl49cIl0sW1wiZDZhMVwiLFwi55eL55eM55eR55eQ55qP55qJ55uT55y555yv55yt55yx55yy55y055yz55y955yl55y755y156GI56GS56GJ56GN56GK56GM56Cm56GF56GQ56Wk56Wn56Wp56Wq56Wj56Wr56Wh56a756e656e456e256e356qP56qU56qQ56y1562H56y056yl56yw56yi56yk56yz56yY56yq56yd56yx56yr56yt56yv56yy56y456ya56yj57KU57KY57KW57Kj57S157S957S457S257S657WF57Ss57Sp57WB57WH57S+57S/57WK57S757So572j576V576c576d576b57+K57+L57+N57+Q57+R57+H57+P57+J6ICfXCJdLFtcImQ3NDBcIixcIuiAnuiAm+iBh+iBg+iBiOiEmOiEpeiEmeiEm+iEreiEn+iErOiEnuiEoeiEleiEp+iEneiEouiIkeiIuOiIs+iIuuiItOiIsuiJtOiOkOiOo+iOqOiOjeiNuuiNs+iOpOiNtOiOj+iOgeiOleiOmeiNteiOlOiOqeiNveiOg+iOjOiOneiOm+iOquiOi+iNvuiOpeiOr+iOiOiOl+iOsOiNv+iOpuiOh+iOruiNtuiOmuiZmeiZluiav+iat1wiXSxbXCJkN2ExXCIsXCLom4Lom4Hom4XomrromrDom4jomrnomrPomrjom4zomrTomrvomrzom4Pomr3omr7ooZLooonoopXooqjooqLooqrooproopHooqHoop/oopjooqfoopnoopvoopfooqTooqzooozoopPooo7opoLop5bop5nop5XoqLDoqKfoqKzoqJ7osLnosLvosZzosZ3osb3osqXotb3otbvotbnotrzot4Lotrnotr/ot4Hou5jou57ou53ou5zou5fou6Dou6HpgKTpgIvpgJHpgJzpgIzpgKHpg6/pg6rpg7Dpg7Tpg7Lpg7Ppg5Tpg6vpg6zpg6nphZbphZjphZrphZPphZXph6zph7Tph7Hph7Pph7jph6Tph7nph6pcIl0sW1wiZDg0MFwiLFwi6Yer6Ye36Yeo6Yeu6ZW66ZaG6ZaI6Zm86Zmt6Zmr6Zmx6Zmv6Zq/6Z2q6aCE6aOl6aaX5YKb5YKV5YKU5YKe5YKL5YKj5YKD5YKM5YKO5YKd5YGo5YKc5YKS5YKC5YKH5YWf5YeU5YyS5YyR5Y6k5Y6n5ZaR5Zao5Zal5Zat5ZW35ZmF5Zai5ZaT5ZaI5ZaP5Za15ZaB5Zaj5ZaS5Zak5ZW95ZaM5Zam5ZW/5ZaV5Zah5ZaO5ZyM5aCp5aC3XCJdLFtcImQ4YTFcIixcIuWgmeWgnuWgp+Wgo+WgqOWfteWhiOWgpeWgnOWgm+Wgs+Wgv+WgtuWgruWgueWguOWgreWgrOWgu+WloeWqr+WqlOWqn+WpuuWqouWqnuWpuOWqpuWpvOWqpeWqrOWqleWqruWot+WqhOWqiuWql+Wqg+Wqi+WqqeWpu+WpveWqjOWqnOWqj+Wqk+WqneWvquWvjeWvi+WvlOWvkeWviuWvjuWwjOWwsOW0t+W1g+W1q+W1geW1i+W0v+W0teW1keW1juW1leW0s+W0uuW1kuW0veW0seW1meW1guW0ueW1ieW0uOW0vOW0suW0tuW1gOW1heW5hOW5geW9mOW+puW+peW+q+aDieaCueaDjOaDouaDjuaDhOaElFwiXSxbXCJkOTQwXCIsXCLmg7LmhIrmhJbmhIXmg7XmhJPmg7jmg7zmg77mg4HmhIPmhJjmhJ3mhJDmg7/mhITmhIvmiYrmjpTmjrHmjrDmj47mj6Xmj6jmj6/mj4Pmkp3mj7Pmj4rmj6Dmj7bmj5Xmj7Lmj7XmkaHmj5/mjr7mj53mj5zmj4Tmj5jmj5Pmj4Lmj4fmj4zmj4vmj4jmj7Dmj5fmj5nmlLLmlafmlarmlaTmlZzmlajmlaXmlozmlp3mlp7mlq7ml5Dml5JcIl0sW1wiZDlhMVwiLFwi5pm85pms5pm75pqA5pmx5pm55pmq5pmy5pyB5qSM5qOT5qSE5qOc5qSq5qOs5qOq5qOx5qSP5qOW5qO35qOr5qOk5qO25qST5qSQ5qOz5qOh5qSH5qOM5qSI5qWw5qK05qSR5qOv5qOG5qSU5qO45qOQ5qO95qO85qOo5qSL5qSK5qSX5qOO5qOI5qOd5qOe5qOm5qO05qOR5qSG5qOU5qOp5qSV5qSl5qOH5qy55qy75qy/5qy85q6U5q6X5q6Z5q6V5q695q+w5q+y5q+z5rCw5re85rmG5rmH5rif5rmJ5rqI5ri85ri95rmF5rmi5rir5ri/5rmB5rmd5rmz5ric5riz5rmL5rmA5rmR5ri75riD5riu5rmeXCJdLFtcImRhNDBcIixcIua5qOa5nOa5oea4sea4qOa5oOa5sea5q+a4uea4oua4sOa5k+a5pea4p+a5uOa5pOa5t+a5lea5uea5kua5pua4tea4tua5mueEoOeEnueEr+eDu+eErueEseeEo+eEpeeEoueEsueEn+eEqOeEuueEm+eJi+eJmueKiOeKieeKhueKheeKi+eMkueMi+eMsOeMoueMseeMs+eMp+eMsueMreeMpueMo+eMteeMjOeQrueQrOeQsOeQq+eQllwiXSxbXCJkYWExXCIsXCLnkJrnkKHnkK3nkLHnkKTnkKPnkJ3nkKnnkKDnkLLnk7vnlK/nla/nlaznl6fnl5rnl6Hnl6bnl53nl5/nl6Tnl5fnmpXnmpLnm5rnnYbnnYfnnYTnnY3nnYXnnYrnnY7nnYvnnYznn57nn6znoaDnoaTnoaXnoZznoa3nobHnoarnoa7nobDnoannoajnoZ7noaLnpbTnpbPnpbLnpbDnqILnqIrnqIPnqIznqITnqpnnq6bnq6TnrYrnrLvnrYTnrYjnrYznrY7nrYDnrZjnrYXnsqLnsp7nsqjnsqHntZjnta/ntaPntZPntZbntafntarntY/nta3ntZzntavntZLntZTntanntZHntZ/ntY7nvL7nvL/nvaVcIl0sW1wiZGI0MFwiLFwi572m576i576g576h57+X6IGR6IGP6IGQ6IO+6IOU6IWD6IWK6IWS6IWP6IWH6IS96IWN6IS66Iem6Ieu6Ie36Ie46Ie56IiE6Ii86Ii96Ii/6Im16Iy76I+P6I+56JCj6I+A6I+o6JCS6I+n6I+k6I+86I+26JCQ6I+G6I+I6I+r6I+j6I6/6JCB6I+d6I+l6I+Y6I+/6I+h6I+L6I+O6I+W6I+16I+J6JCJ6JCP6I+e6JCR6JCG6I+C6I+zXCJdLFtcImRiYTFcIixcIuiPleiPuuiPh+iPkeiPquiQk+iPg+iPrOiPruiPhOiPu+iPl+iPouiQm+iPm+iPvuibmOibouibpuibk+ibo+ibmuibquibneibq+ibnOibrOibqeibl+ibqOibkeihiOihluihleiiuuijl+iiueiiuOijgOiivuiituiivOiit+iiveiisuikgeijieimleimmOiml+inneinmuinm+ipjuipjeioueipmeipgOipl+ipmOiphOipheipkuipiOipkeipiuipjOipj+ixn+iygeiygOiyuuiyvuiysOiyueiytei2hOi2gOi2iei3mOi3k+i3jei3h+i3lui3nOi3j+i3lei3mei3iOi3l+i3hei7r+i7t+i7ulwiXSxbXCJkYzQwXCIsXCLou7nou6bou67ou6Xou7Xou6fou6jou7bou6vou7Hou6zou7Tou6npgK3pgLTpgK/phIbphKzphITpg7/pg7zphIjpg7npg7vphIHphIDphIfphIXphIPphaHphaTphZ/phaLphaDpiIHpiIrpiKXpiIPpiJrpiKbpiI/piIzpiIDpiJLph7/ph73piIbpiITpiKfpiILpiJzpiKTpiJnpiJfpiIXpiJbplbvplo3plozplpDpmofpmb7pmohcIl0sW1wiZGNhMVwiLFwi6ZqJ6ZqD6ZqA6ZuC6ZuI6ZuD6Zux6Zuw6Z2s6Z2w6Z2u6aCH6aKp6aOr6bOm6bu55LqD5LqE5Lq25YK95YK/5YOG5YKu5YOE5YOK5YK05YOI5YOC5YKw5YOB5YK65YKx5YOL5YOJ5YK25YK45YeX5Ym65Ym45Ym75Ym85ZeD5Zeb5ZeM5ZeQ5ZeL5ZeK5Zed5ZeA5ZeU5ZeE5Zep5Za/5ZeS5ZaN5ZeP5ZeV5Zei5ZeW5ZeI5Zey5ZeN5ZeZ5ZeC5ZyU5aGT5aGo5aGk5aGP5aGN5aGJ5aGv5aGV5aGO5aGd5aGZ5aGl5aGb5aC95aGj5aGx5aO85auH5auE5auL5aq65aq45aqx5aq15aqw5aq/5auI5aq75auGXCJdLFtcImRkNDBcIixcIuWqt+WrgOWriuWqtOWqtuWrjeWqueWqkOWvluWvmOWvmeWwn+Wws+W1seW1o+W1iuW1peW1suW1rOW1nuW1qOW1p+W1ouW3sOW5j+W5juW5iuW5jeW5i+W7heW7jOW7huW7i+W7h+W9gOW+r+W+reaDt+aFieaFiuaEq+aFheaEtuaEsuaEruaFhuaEr+aFj+aEqeaFgOaIoOmFqOaIo+aIpeaIpOaPheaPseaPq+aQkOaQkuaQieaQoOaQpFwiXSxbXCJkZGExXCIsXCLmkLPmkYPmkJ/mkJXmkJjmkLnmkLfmkKLmkKPmkIzmkKbmkLDmkKjmkYHmkLXmkK/mkIrmkJrmkYDmkKXmkKfmkIvmj6fmkJvmkK7mkKHmkI7mla/mlpLml5PmmobmmozmmpXmmpDmmovmmormmpnmmpTmmbjmnKDmpabmpZ/mpLjmpY7mpaLmpbHmpL/mpYXmparmpLnmpYLmpZfmpZnmpbrmpYjmpYnmpLXmpazmpLPmpL3mpaXmo7DmpbjmpLTmpanmpYDmpa/mpYTmpbbmpZjmpYHmpbTmpYzmpLvmpYvmpLfmpZzmpY/mpZHmpLLmpZLmpK/mpbvmpLzmrYbmrYXmrYPmrYLmrYjmrYHmrpvvqI3mr7vmr7xcIl0sW1wiZGU0MFwiLFwi5q+55q+35q+45rqb5ruW5ruI5rqP5ruA5rqf5rqT5rqU5rqg5rqx5rq55ruG5ruS5rq95ruB5rqe5ruJ5rq35rqw5ruN5rqm5ruP5rqy5rq+5ruD5ruc5ruY5rqZ5rqS5rqO5rqN5rqk5rqh5rq/5rqz5ruQ5ruK5rqX5rqu5rqj54WH54WU54WS54Wj54Wg54WB54Wd54Wi54Wy54W454Wq54Wh54WC54WY54WD54WL54Ww54Wf54WQ54WTXCJdLFtcImRlYTFcIixcIueFhOeFjeeFmueJj+eKjeeKjOeKkeeKkOeKjueMvOeNgueMu+eMuueNgOeNiueNieeRhOeRiueRi+eRkueRkeeRl+eRgOeRj+eRkOeRjueRgueRhueRjeeRlOeToeeTv+eTvueTveeUneeVueeVt+amg+eXr+eYj+eYg+eXt+eXvueXvOeXueeXuOeYkOeXu+eXtueXreeXteeXveeameeateebneedleedn+edoOedkuedluedmuedqeedp+edlOedmeedreefoOeih+eimueilOeij+eihOeileeiheeihueioeeig+ehueeimeeigOeiluehu+elvOemguelveelueeokeeomOeomeeokueol+eoleeooueok1wiXSxbXCJkZjQwXCIsXCLnqJvnqJDnqqPnqqLnqp7nq6vnrabnraTnra3nrbTnrannrbLnraXnrbPnrbHnrbDnraHnrbjnrbbnraPnsrLnsrTnsq/ntojntobntoDnto3ntb/ntoXntbrnto7ntbvntoPntbzntozntpTntoTntb3ntpLnva3nvavnvafnvajnvaznvqbnvqXnvqfnv5vnv5zogKHohaTohaDohbfohZzohanohZvohaLohbLmnKHohZ7ohbbohafoha9cIl0sW1wiZGZhMVwiLFwi6IWE6IWh6Iid6ImJ6ImE6ImA6ImC6ImF6JOx6JC/6JGW6JG26JG56JKP6JKN6JGl6JGR6JGA6JKG6JGn6JCw6JGN6JG96JGa6JGZ6JG06JGz6JGd6JSH6JGe6JC36JC66JC06JG66JGD6JG46JCy6JGF6JCp6I+Z6JGL6JCv6JGC6JCt6JGf6JGw6JC56JGO6JGM6JGS6JGv6JOF6JKO6JC76JGH6JC26JCz6JGo6JG+6JGE6JCr6JGg6JGU6JGu6JGQ6JyL6JyE6Ju36JyM6Ju66JuW6Ju16J2N6Ju46JyO6JyJ6JyB6Ju26JyN6JyF6KOW6KOL6KON6KOO6KOe6KOb6KOa6KOM6KOQ6KaF6Kab6Kef6Kel6KekXCJdLFtcImUwNDBcIixcIuinoeinoOinouinnOinpuiptuiqhuipv+ipoeiov+ipt+iqguiqhOipteiqg+iqgeiptOipuuiwvOixi+ixiuixpeixpOixpuiyhuiyhOiyheizjOi1qOi1qei2kei2jOi2jui2j+i2jei2k+i2lOi2kOi2kui3sOi3oOi3rOi3sei3rui3kOi3qei3o+i3oui3p+i3sui3q+i3tOi8hui7v+i8gei8gOi8hei8h+i8iOi8gui8i+mBkumAv1wiXSxbXCJlMGExXCIsXCLpgYTpgYnpgL3phJDphI3phI/phJHphJbphJTphIvphI7pha7pha/piYjpiZLpiLDpiLrpiabpiLPpiaXpiZ7pioPpiK7piYrpiYbpia3piazpiY/piaDpiafpia/piLbpiaHpibDpiLHpiZTpiaPpiZDpibLpiY7piZPpiYzpiZbpiLLplp/plpzplp7plpvpmpLpmpPpmpHpmpfpm47pm7rpm73pm7jpm7XpnbPpnbfpnbjpnbLpoI/poI3poI7poqzpo7bpo7nppq/pprLpprDpprXpqq3pqqvprZvps6rps63ps6fpuoDpu73lg6blg5Tlg5flg6jlg7Plg5vlg6rlg53lg6Tlg5Plg6zlg7Dlg6/lg6Plg6BcIl0sW1wiZTE0MFwiLFwi5YeY5YqA5YqB5Yup5Yur5Yyw5Y6s5Zin5ZiV5ZiM5ZiS5Ze85ZiP5Zic5ZiB5ZiT5ZiC5Ze65Zid5ZiE5Ze/5Ze55aKJ5aG85aKQ5aKY5aKG5aKB5aG/5aG05aKL5aG65aKH5aKR5aKO5aG25aKC5aKI5aG75aKU5aKP5aO+5aWr5auc5auu5aul5auV5auq5aua5aut5aur5auz5aui5aug5aub5aus5aue5aud5auZ5auo5auf5a235a+gXCJdLFtcImUxYTFcIixcIuWvo+Wxo+W2guW2gOW1veW2huW1uuW2geW1t+W2iuW2ieW2iOW1vuW1vOW2jeW1ueW1v+W5mOW5meW5k+W7mOW7keW7l+W7juW7nOW7leW7meW7kuW7lOW9hOW9g+W9r+W+tuaErOaEqOaFgeaFnuaFseaFs+aFkuaFk+aFsuaFrOaGgOaFtOaFlOaFuuaFm+aFpeaEu+aFquaFoeaFluaIqeaIp+aIq+aQq+aRjeaRm+aRneaRtOaRtuaRsuaRs+aRveaRteaRpuaSpuaRjuaSguaRnuaRnOaRi+aRk+aRoOaRkOaRv+aQv+aRrOaRq+aRmeaRpeaRt+aVs+aWoOaaoeaaoOaan+acheachOacouamseamtuaniVwiXSxbXCJlMjQwXCIsXCLmpqDmp47mppbmprDmpqzmprzmppHmppnmpo7mpqfmpo3mpqnmpr7mpq/mpr/mp4Tmpr3mpqTmp5Tmprnmp4rmpprmp4/mprPmppPmpqrmpqHmpp7mp5nmppfmppDmp4LmprXmpqXmp4bmrYrmrY3mrYvmrp7mrp/mrqDmr4Pmr4Tmr77mu47mu7Xmu7HmvIPmvKXmu7jmvLfmu7vmvK7mvInmvY7mvJnmvJrmvKfmvJjmvLvmvJLmu63mvIpcIl0sW1wiZTJhMVwiLFwi5ry25r2z5ru55ruu5ryt5r2A5ryw5ry85ry15rur5ryH5ryO5r2D5ryF5ru95ru25ry55ryc5ru85ry65ryf5ryN5rye5ryI5ryh54aH54aQ54aJ54aA54aF54aC54aP54W754aG54aB54aX54mE54mT54qX54qV54qT542D542N542R542M55Gi55Gz55Gx55G155Gy55Gn55Gu55SA55SC55SD55W955aQ55iW55iI55iM55iV55iR55iK55iU55q4556B5528556F556C552u556A552v552+556D56Ky56Kq56K056Kt56Ko56G+56Kr56Ke56Kl56Kg56Ks56Ki56Kk56aY56aK56aL56aW56aV56aU56aTXCJdLFtcImUzNDBcIixcIueml+emiOemkuemkOeoq+epiueosOeor+eoqOeopueqqOeqq+eqrOerrueuiOeunOeuiueukeeukOeulueujeeujOeum+eujueuheeumOWKhOeumeeupOeugueyu+eyv+eyvOeyuue2p+e2t+e3gue2o+e2que3gee3gOe3hee2nee3jue3hOe3hue3i+e3jOe2r+e2uee2lue2vOe2n+e2pue2rue2qee2oee3iee9s+e/oue/o+e/pee/nlwiXSxbXCJlM2ExXCIsXCLogKTogZ3ogZzohonohobohoPohofoho3ohozohovoiJXokpfokqTokqHokp/okrrok47ok4Lokqzokq7okqvokrnokrTok4Hok43okqrokprokrHok5Dokp3okqfokrvokqLokpTok4fok4zokpvokqnokq/okqjok5bokpjokrbok4/okqDok5fok5Tok5Lok5vokrDokpHomaHonLPonKPonKjonavonYDonK7onJ7onKHonJnonJvonYPonKzonYHonL7onYbonKDonLLonKronK3onLzonJLonLronLHonLXonYLonKbonKfonLjonKTonJronLDonJHoo7foo6foo7Hoo7Loo7roo77oo67oo7zoo7boo7tcIl0sW1wiZTQ0MFwiLFwi6KOw6KOs6KOr6Kad6Kah6Kaf6Kae6Kep6Ker6Keo6Kqr6KqZ6KqL6KqS6KqP6KqW6LC96LGo6LGp6LOV6LOP6LOX6LaW6LiJ6LiC6Le/6LiN6Le96LiK6LiD6LiH6LiG6LiF6Le+6LiA6LiE6LyQ6LyR6LyO6LyN6YSj6YSc6YSg6YSi6YSf6YSd6YSa6YSk6YSh6YSb6YW66YWy6YW56YWz6Yql6Yqk6Ym26Yqb6Ym66Yqg6YqU6Yqq6YqNXCJdLFtcImU0YTFcIixcIumKpumKmumKq+mJuemKl+mJv+mKo+mLrumKjumKgumKlemKoumJvemKiOmKoemKiumKhumKjOmKmemKp+mJvumKh+mKqemKnemKi+mIremanumaoembv+mdmOmdvemduumdvumeg+megOmegumdu+mehOmegemdv+mfjumfjemglumiremirumkgumkgOmkh+mmnemmnOmng+mmuemmu+mmuumngummvemnh+mqsemro+mrp+msvumsv+mtoOmtoemtn+mzsemzsumztem6p+WDv+WEg+WEsOWDuOWEhuWEh+WDtuWDvuWEi+WEjOWDveWEiuWKi+WKjOWLseWLr+WZiOWZguWZjOWYteWZgeWZiuWZieWZhuWZmFwiXSxbXCJlNTQwXCIsXCLlmZrlmYDlmLPlmL3lmKzlmL7lmLjlmKrlmLrlnJrloqvlop3lorHloqDloqPloq/loqzloqXloqHlo7/lq7/lq7Tlq73lq7flq7blrIPlq7jlrILlq7nlrIHlrIflrIXlrI/lsafltpnltpfltp/ltpLltqLltpPltpXltqDltpzltqHltprltp7luanluZ3luaDluZznt7Plu5vlu57lu6HlvYnlvrLmhovmhoPmhbnmhrHmhrDmhqLmholcIl0sW1wiZTVhMVwiLFwi5oab5oaT5oav5oat5oaf5oaS5oaq5oah5oaN5oWm5oaz5oit5pGu5pGw5pKW5pKg5pKF5pKX5pKc5pKP5pKL5pKK5pKM5pKj5pKf5pGo5pKx5pKY5pW25pW65pW55pW75pay5paz5pq15pqw5pqp5pqy5pq35pqq5pqv5qiA5qiG5qiX5qel5qe45qiV5qex5qek5qig5qe/5qes5qei5qib5qid5qe+5qin5qey5qeu5qiU5qe35qen5qmA5qiI5qem5qe75qiN5qe85qer5qiJ5qiE5qiY5qil5qiP5qe25qim5qiH5qe05qiW5q2R5q6l5q6j5q6i5q6m5rCB5rCA5q+/5rCC5r2B5rym5r2+5r6H5r+G5r6SXCJdLFtcImU2NDBcIixcIua+jea+iea+jOa9oua9j+a+hea9mua+lua9tua9rOa+gua9lea9sua9kua9kOa9l+a+lOa+k+a9nea8gOa9oea9q+a9vea9p+a+kOa9k+a+i+a9qea9v+a+lea9o+a9t+a9qua9u+eGsueGr+eGm+eGsOeGoOeGmueGqeeGteeGneeGpeeGnueGpOeGoeeGqueGnOeGp+eGs+eKmOeKmueNmOeNkueNnueNn+eNoOeNneeNm+eNoeeNmueNmVwiXSxbXCJlNmExXCIsXCLnjaLnkofnkonnkornkobnkoHnkb3nkoXnkojnkbznkbnnlIjnlIfnlb7nmKXnmJ7nmJnnmJ3nmJznmKPnmJrnmKjnmJvnmpznmp3nmp7nmpvnno3nno/nnonnnojno43norvno4/no4zno5Hno47no5Tno4jno4Pno4Tno4nnpprnpqHnpqDnppznpqLnppvmrbbnqLnnqrLnqrTnqrPnrrfnr4vnrr7nrqznr47nrq/nrrnnr4rnrrXns4Xns4jns4zns4vnt7fnt5vnt6rnt6fnt5fnt6HnuIPnt7rnt6bnt7bnt7Hnt7Dnt67nt5/nvbbnvqznvrDnvq3nv63nv6vnv6rnv6znv6bnv6jogaTogafohqPohp9cIl0sW1wiZTc0MFwiLFwi6Iae6IaV6Iai6IaZ6IaX6IiW6ImP6ImT6ImS6ImQ6ImO6ImR6JSk6JS76JSP6JSA6JSp6JSO6JSJ6JSN6JSf6JSK6JSn6JSc6JO76JSr6JO66JSI6JSM6JO06JSq6JOy6JSV6JO36JOr6JOz6JO86JSS6JOq6JOp6JSW6JO+6JSo6JSd6JSu6JSC6JO96JSe6JO26JSx6JSm6JOn6JOo6JOw6JOv6JO56JSY6JSg6JSw6JSL6JSZ6JSv6JmiXCJdLFtcImU3YTFcIixcIuidluido+idpOidt+ifoeids+idmOidlOidm+idkuidoeidmuidkeidnuidreidquidkOidjuidn+idneidr+idrOiduuidruidnOidpeidj+idu+idteidouidp+idqeihmuikheikjOiklOiki+ikl+ikmOikmeikhuikluikkeikjuikieimouimpOimo+inreinsOinrOirj+irhuiquOirk+irkeirlOirleiqu+irl+iqvuirgOirheirmOirg+iquuiqveirmeiwvuixjeiyj+izpeizn+izmeizqOizmuizneizp+i2oOi2nOi2oei2m+i4oOi4o+i4pei4pOi4rui4lei4m+i4lui4kei4mei4pui4p1wiXSxbXCJlODQwXCIsXCLouJTouJLouJjouJPouJzouJfouJrovKzovKTovJjovJrovKDovKPovJbovJfpgbPpgbDpga/pgafpgavphK/phKvphKnphKrphLLphKbphK7phoXphobphorphoHphoLphoTphoDpi5Dpi4Ppi4Tpi4Dpi5npirbpi4/pi7Hpi5/pi5jpi6npi5fpi53pi4zpi6/pi4Lpi6jpi4rpi4jpi47pi6bpi43pi5Xpi4npi6Dpi57pi6fpi5Hpi5NcIl0sW1wiZThhMVwiLFwi6Yq16Yuh6YuG6Yq06ZW86Zas6Zar6Zau6Zaw6Zqk6Zqi6ZuT6ZyF6ZyI6ZyC6Z2a6Z6K6Z6O6Z6I6Z+Q6Z+P6aCe6aCd6aCm6aCp6aCo6aCg6aCb6aCn6aKy6aSI6aO66aSR6aSU6aSW6aSX6aSV6aec6aeN6aeP6aeT6aeU6aeO6aeJ6aeW6aeY6aeL6aeX6aeM6aqz6aus6aur6auz6auy6aux6a2G6a2D6a2n6a206a2x6a2m6a226a216a2w6a2o6a2k6a2s6bO86bO66bO96bO/6bO36bSH6bSA6bO56bO76bSI6bSF6bSE6bqD6buT6byP6byQ5YSc5YST5YSX5YSa5YSR5Yee5Yy05Y+h5Zmw5Zmg5ZmuXCJdLFtcImU5NDBcIixcIuWZs+WZpuWZo+WZreWZsuWZnuWZt+WcnOWcm+WjiOWiveWjieWiv+WiuuWjguWivOWjhuWsl+WsmeWsm+WsoeWslOWsk+WskOWsluWsqOWsmuWsoOWsnuWvr+W2rOW2seW2qeW2p+W2teW2sOW2ruW2quW2qOW2suW2reW2r+W2tOW5p+W5qOW5puW5r+W7qeW7p+W7puW7qOW7peW9i+W+vOaGneaGqOaGluaHheaGtOaHhuaHgeaHjOaGulwiXSxbXCJlOWExXCIsXCLmhr/mhrjmhozmk5fmk5bmk5Dmk4/mk4nmkr3mkonmk4Pmk5vmk7Pmk5nmlLPmlb/mlbzmlqLmm4jmmr7mm4Dmm4rmm4vmm4/mmr3mmrvmmrrmm4zmnKPmqLTmqabmqYnmqafmqLLmqajmqL7mqZ3mqa3mqbbmqZvmqZHmqKjmqZrmqLvmqL/mqYHmqarmqaTmqZDmqY/mqZTmqa/mqanmqaDmqLzmqZ7mqZbmqZXmqY3mqY7mqYbmrZXmrZTmrZbmrqfmrqrmrqvmr4jmr4fmsITmsIPmsIbmvq3mv4vmvqPmv4fmvrzmv47mv4jmvZ7mv4Tmvr3mvp7mv4rmvqjngITmvqXmvq7mvrrmvqzmvqrmv4/mvr/mvrhcIl0sW1wiZWE0MFwiLFwi5r6i5r+J5r6r5r+N5r6v5r6y5r6w54eF54eC54a/54a454eW54eA54eB54eL54eU54eK54eH54eP54a954eY54a854eG54ea54eb54qd54qe542p542m542n542s542l542r542q55G/55Ka55Kg55KU55KS55KV55Kh55SL55aA55iv55it55ix55i955iz55i855i155iy55iw55q755um556a556d556h556c556b556i556j556V556ZXCJdLFtcImVhYTFcIixcIueel+ejneejqeejpeejquejnuejo+ejm+ejoeejouejreejn+ejoOempOephOepiOeph+eqtuequOeqteeqseeqt+evnuevo+evp+evneevleevpeevmuevqOevueevlOevquevouevnOevq+evmOevn+ezkuezlOezl+ezkOezkee4kue4oee4l+e4jOe4n+e4oOe4k+e4jue4nOe4lee4mue4oue4i+e4j+e4lue4jee4lOe4pee4pOe9g+e9u+e9vOe9uue+see/r+iAquiAqeiBrOiGseiGpuiGruiGueiGteiGq+iGsOiGrOiGtOiGsuiGt+iGp+iHsuiJleiJluiJl+iVluiVheiVq+iVjeiVk+iVoeiVmFwiXSxbXCJlYjQwXCIsXCLolYDolYbolaTolYHolaLolYTolZHolYfolaPolL7olZvolbHolY7ola7olbXolZXolafolaDolozolabolZ3olZTolaXolazomaPomaXomaTonpvono/onpfonpPonpLonojonoHonpbonpjonbnonofonqPonoXonpDonpHonp3onoTonpTonpzonprononopJ7opKbopLDopK3opK7opKfopLHopKLopKnopKPopK/opKzopJ/op7Hoq6BcIl0sW1wiZWJhMVwiLFwi6Kui6Kuy6Ku06Ku16Kud6KyU6Kuk6Kuf6Kuw6KuI6Kue6Kuh6Kuo6Ku/6Kuv6Ku76LKR6LKS6LKQ6LO16LOu6LOx6LOw6LOz6LWs6LWu6Lal6Lan6Liz6Li+6Li46LmA6LmF6Li26Li86Li96LmB6Liw6Li/6Lq96Ly26Lyu6Ly16Lyy6Ly56Ly36Ly06YG26YG56YG76YKG6YO66YSz6YS16YS26YaT6YaQ6YaR6YaN6YaP6Yyn6Yye6YyI6Yyf6YyG6YyP6Y266Yy46Yy86Yyb6Yyj6YyS6YyB6Y2G6Yyt6YyO6YyN6YuL6Yyd6Yu66Yyl6YyT6Yu56Yu36Yy06YyC6Yyk6Yu/6Yyp6Yy56Yy16Yyq6YyU6YyMXCJdLFtcImVjNDBcIixcIumMi+mLvumMiemMgOmLu+mMlumWvOmXjemWvumWuemWuumWtumWv+mWtemWvemaqemblOmci+mckumckOmememel+melOmfsOmfuOmgtemgr+mgsumkpOmkn+mkp+mkqemmnumnrumnrOmnpemnpOmnsOmno+mnqumnqemnp+mquemqv+mqtOmqu+mrtumruumruemrt+mss+mugOmuhemuh+mtvOmtvumtu+mugumuk+mukumukOmtuumulVwiXSxbXCJlY2ExXCIsXCLprb3projptKXptJfptKDptJ7ptJTptKnptJ3ptJjptKLptJDptJnptJ/puojpuobpuofpuq7puq3pu5Xpu5bpu7rpvJLpvL3lhKblhKXlhKLlhKTlhKDlhKnli7TlmpPlmozlmo3lmoblmoTlmoPlmb7lmoLlmb/lmoHlo5blo5Tlo4/lo5LlrK3lrKXlrLLlrKPlrKzlrKflrKblrK/lrK7lrbvlr7Hlr7Lltrfluazluarlvr7lvrvmh4PmhrXmhrzmh6fmh6Dmh6Xmh6Tmh6jmh57mk6/mk6nmk6Pmk6vmk6Tmk6jmloHmloDmlrbml5rmm5Lmqo3mqpbmqoHmqqXmqonmqp/mqpvmqqHmqp7mqofmqpPmqo5cIl0sW1wiZWQ0MFwiLFwi5qqV5qqD5qqo5qqk5qqR5qm/5qqm5qqa5qqF5qqM5qqS5q2b5q6t5rCJ5r+M5r6p5r+05r+U5r+j5r+c5r+t5r+n5r+m5r+e5r+y5r+d5r+i5r+o54eh54ex54eo54ey54ek54ew54ei542z542u542v55KX55Ky55Kr55KQ55Kq55Kt55Kx55Kl55Kv55SQ55SR55SS55SP55aE55mD55mI55mJ55mH55qk55up5561556r556y55635562XCJdLFtcImVkYTFcIixcIueetOeeseeeqOefsOejs+ejveekgueju+ejvOejsuekheejueejvuekhOemq+emqOepnOepm+epluepmOeplOepmueqvuergOergeewheewj+evsuewgOevv+evu+ewjuevtOewi+evs+ewguewieewg+ewgeevuOevveewhuevsOevseewkOewiuezqOe4ree4vOe5gue4s+mhiOe4uOe4que5iee5gOe5h+e4qee5jOe4sOe4u+e4tue5hOe4uue9hee9v+e9vue9vee/tOe/suiArOiGu+iHhOiHjOiHiuiHheiHh+iGvOiHqeiJm+iJmuiJnOiWg+iWgOiWj+iWp+iWleiWoOiWi+iWo+iVu+iWpOiWmuiWnlwiXSxbXCJlZTQwXCIsXCLolbfolbzolonolqHolbrolbjolZfolo7olpbolobolo3olpnolp3oloHolqLoloLolojoloXolbnolbbolpjolpDolp/omajonr7onqronq3on4XonrDonqzonrnonrXonrzonq7on4non4Pon4Lon4zonrfonq/on4Ton4ronrTonrbonr/onrjonr3on57onrLopLXopLPopLzopL7opYHopZLopLfopYLopq3opq/opq7op7Lop7PorJ5cIl0sW1wiZWVhMVwiLFwi6KyY6KyW6KyR6KyF6KyL6Kyi6KyP6KyS6KyV6KyH6KyN6KyI6KyG6Kyc6KyT6Kya6LGP6LGw6LGy6LGx6LGv6LKV6LKU6LO56LWv6LmO6LmN6LmT6LmQ6LmM6LmH6L2D6L2A6YKF6YG+6YS46Yaa6Yai6Yab6YaZ6Yaf6Yah6Yad6Yag6Y6h6Y6D6Y6v6Y2k6Y2W6Y2H6Y286Y2Y6Y2c6Y226Y2J6Y2Q6Y2R6Y2g6Y2t6Y6P6Y2M6Y2q6Y256Y2X6Y2V6Y2S6Y2P6Y2x6Y236Y276Y2h6Y2e6Y2j6Y2n6Y6A6Y2O6Y2Z6ZeH6ZeA6ZeJ6ZeD6ZeF6Za36Zqu6Zqw6Zqs6Zyg6Zyf6ZyY6Zyd6ZyZ6Z6a6Z6h6Z6cXCJdLFtcImVmNDBcIixcIumenumenemflemflOmfsemhgemhhOmhiumhiemhhemhg+mkpemkq+mkrOmkqumks+mksumkr+mkremksemksOmmmOmmo+mmoemogumnuumntOmnt+mnuemnuOmntumnu+mnvemnvumnvOmog+mqvumrvumrvemsgemrvOmtiOmumumuqOmunumum+mupumuoemupemupOmuhumuoumuoOmur+m0s+m1gem1p+m0tum0rum0r+m0sem0uOm0sFwiXSxbXCJlZmExXCIsXCLptYXptYLptYPptL7ptLfptYDptL3nv7XptK3puorpuonpuo3purDpu4jpu5rpu7vpu7/pvKTpvKPpvKLpvZTpvqDlhLHlhK3lhK7lmpjlmpzlmpflmprlmp3lmpnlpbDlrLzlsanlsarlt4Dlua3lua7mh5jmh5/mh63mh67mh7Hmh6rmh7Dmh6vmh5bmh6nmk7/mlITmk73mk7jmlIHmlIPmk7zmlpTml5vmm5rmm5vmm5jmq4Xmqrnmqr3mq6Hmq4bmqrrmqrbmqrfmq4fmqrTmqq3mrZ7mr4nmsIvngIfngIzngI3ngIHngIXngJTngI7mv7/ngIDmv7vngKbmv7zmv7fngIrniIHnh7/nh7nniIPnh73njbZcIl0sW1wiZjA0MFwiLFwi55K455OA55K155OB55K+55K255K755OC55SU55ST55mc55mk55mZ55mQ55mT55mX55ma55qm55q955us55+C556656O/56SM56ST56SU56SJ56SQ56SS56SR56at56as56mf57Cc57Cp57CZ57Cg57Cf57Ct57Cd57Cm57Co57Ci57Cl57Cw57mc57mQ57mW57mj57mY57mi57mf57mR57mg57mX57mT5761576z57+357+46IG16IeR6IeSXCJdLFtcImYwYTFcIixcIuiHkOiJn+iJnuiWtOiXhuiXgOiXg+iXguiWs+iWteiWveiXh+iXhOiWv+iXi+iXjuiXiOiXheiWseiWtuiXkuiYpOiWuOiWt+iWvuiZqeifp+ifpuifouifm+ifq+ifquifpeifn+ifs+ifpOiflOifnOifk+ifreifmOifo+iepOifl+ifmeiggeiftOifqOifneilk+ili+ilj+iljOilhuilkOilkeilieisquisp+iso+iss+issOisteith+isr+isvOisvuisseispeist+ispuistuisruispOisu+isveisuuixguixteiymeiymOiyl+izvui0hOi0gui0gOi5nOi5oui5oOi5l+i5lui5nui5pei5p1wiXSxbXCJmMTQwXCIsXCLouZvouZrouaHouZ3ouanouZTovYbovYfovYjovYvphKjphLrphLvphL7phqjphqXphqfphq/phqrpjrXpjozpjpLpjrfpjpvpjp3pjonpjqfpjo7pjqrpjp7pjqbpjpXpjojpjpnpjp/pjo3pjrHpjpHpjrLpjqTpjqjpjrTpjqPpjqXpl5Lpl5Ppl5HpmrPpm5fpm5rlt4Lpm5/pm5jpm53pnKPpnKLpnKXpnqzpnq7pnqjpnqvpnqTpnqpcIl0sW1wiZjFhMVwiLFwi6Z6i6Z6l6Z+X6Z+Z6Z+W6Z+Y6Z+66aGQ6aGR6aGS6aK46aWB6aS86aS66aiP6aiL6aiJ6aiN6aiE6aiR6aiK6aiF6aiH6aiG6auA6auc6ayI6ayE6ayF6ayp6ay16a2K6a2M6a2L6a+H6a+G6a+D6a6/6a+B6a616a646a+T6a626a+E6a656a696bWc6bWT6bWP6bWK6bWb6bWL6bWZ6bWW6bWM6bWX6bWS6bWU6bWf6bWY6bWa6bqO6bqM6buf6byB6byA6byW6byl6byr6byq6byp6byo6b2M6b2V5YS05YS15YqW5Yu35Y605Zqr5Zqt5Zqm5Zqn5Zqq5Zqs5aOa5aOd5aOb5aSS5ay95ay+5ay/5beD5bmwXCJdLFtcImYyNDBcIixcIuW+v+aHu+aUh+aUkOaUjeaUieaUjOaUjuaWhOaXnuaXneabnuarp+aroOarjOarkearmeari+arn+arnOarkOarq+arj+arjearnuatoOausOawjOeAmeeAp+eAoOeAlueAq+eAoeeAoueAo+eAqeeAl+eApOeAnOeAqueIjOeIiueIh+eIgueIheeKpeeKpueKpOeKo+eKoeeTi+eTheeSt+eTg+eUlueZoOefieefiuefhOefseekneekm1wiXSxbXCJmMmExXCIsXCLnpKHnpJznpJfnpJ7nprDnqafnqajnsLPnsLznsLnnsKznsLvns6zns6rnubbnubXnubjnubDnubfnua/nubrnubLnubTnuajnvYvnvYrnvoPnvobnvrfnv73nv77ogbjoh5foh5XoiaToiaHoiaPol6vol7Hol63ol5nol6Hol6jol5rol5fol6zol7Lol7jol5jol5/ol6Pol5zol5Hol7Dol6bol6/ol57ol6LooIDon7rooIPon7bon7fooInooIzooIvooIbon7zooIjon7/ooIrooILopaLopZropZvopZfopaHopZzopZjopZ3opZnopojoprfoprbop7borZDorYjorYrorYDorZPorZborZTorYvorZVcIl0sW1wiZjM0MFwiLFwi6K2R6K2C6K2S6K2X6LGD6LG36LG26LKa6LSG6LSH6LSJ6Las6Laq6Lat6Lar6Lmt6Lm46Lmz6Lmq6Lmv6Lm76LuC6L2S6L2R6L2P6L2Q6L2T6L606YWA6YS/6Yaw6Yat6Y+e6Y+H6Y+P6Y+C6Y+a6Y+Q6Y+56Y+s6Y+M6Y+Z6Y6p6Y+m6Y+K6Y+U6Y+u6Y+j6Y+V6Y+E6Y+O6Y+A6Y+S6Y+n6ZW96Zea6Zeb6Zuh6Zyp6Zyr6Zys6Zyo6ZymXCJdLFtcImYzYTFcIixcIumes+met+metumfnemfnumfn+mhnOmhmemhnemhl+miv+mivemiu+mivumliOmlh+mlg+mmpummp+momumolemopemonemopOmom+mooumooOmop+moo+monumonOmolOmrgumsi+msiumsjumsjOmst+mvqumvq+mvoOmvnumvpOmvpumvoumvsOmvlOmvl+mvrOmvnOmvmemvpemvlemvoemvmum1t+m2gem2ium2hOm2iOm1sem2gOm1uOm2hum2i+m2jOm1vem1q+m1tOm1tem1sOm1qem2hem1s+m1u+m2gum1r+m1uem1v+m2h+m1qOm6lOm6kem7gOm7vOm8rem9gOm9gem9jem9lum9l+m9mOWMt+WaslwiXSxbXCJmNDQwXCIsXCLlmrXlmrPlo6PlrYXlt4blt4flu67lu6/lv4Dlv4Hmh7nmlJfmlJbmlJXmlJPml5/mm6jmm6Pmm6Tmq7Pmq7Dmq6rmq6jmq7nmq7Hmq67mq6/ngLzngLXngK/ngLfngLTngLHngYLngLjngL/ngLrngLnngYDngLvngLPngYHniJPniJTniqjnjb3njbznkrrnmqvnmqrnmr7nm63nn4znn47nn4/nn43nn7LnpKXnpKPnpKfnpKjnpKTnpKlcIl0sW1wiZjRhMVwiLFwi56ay56mu56ms56mt56u357GJ57GI57GK57GH57GF57Ou57m757m+57qB57qA576657+/6IG56Ieb6IeZ6IiL6Imo6Imp6Jii6Je/6JiB6Je+6Jib6JiA6Je26JiE6JiJ6JiF6JiM6Je96KCZ6KCQ6KCR6KCX6KCT6KCW6KWj6KWm6Ka56Ke36K2g6K2q6K2d6K2o6K2j6K2l6K2n6K2t6Lau6LqG6LqI6LqE6L2Z6L2W6L2X6L2V6L2Y6L2a6YKN6YWD6YWB6Ya36Ya16Yay6Yaz6ZCL6ZCT6Y+76ZCg6ZCP6ZCU6Y++6ZCV6ZCQ6ZCo6ZCZ6ZCN6Y+16ZCA6Y+36ZCH6ZCO6ZCW6ZCS6Y+66ZCJ6Y+46ZCK6Y+/XCJdLFtcImY1NDBcIixcIumPvOmQjOmPtumQkemQhumXnumXoOmXn+mcrumcr+meuemeu+mfvemfvumhoOmhoumho+mhn+mjgemjgumlkOmljumlmemljOmli+mlk+mosumotOmosemorOmoqumotumoqemorumouOmoremrh+mriumrhumskOmskumskemwi+mwiOmvt+mwhemwkumvuOmxgOmwh+mwjumwhumwl+mwlOmwiem2n+m2mem2pOm2nem2kum2mOm2kOm2m1wiXSxbXCJmNWExXCIsXCLptqDptpTptpzptqrptpfptqHptprptqLptqjptp7ptqPptr/ptqnptpbptqbptqfpupnpupvpuprpu6Xpu6Tpu6fpu6bpvLDpvK7pvZvpvaDpvZ7pvZ3pvZnpvpHlhLrlhLnlipjlipflm4Plmr3lmr7lrYjlrYflt4vlt4/lu7Hmh73mlJvmrILmq7zmrIPmq7jmrIDngYPngYTngYrngYjngYnngYXngYbniJ3niJrniJnnjb7nlJfnmarnn5DnpK3npLHnpK/nsZTnsZPns7Lnuornuofnuojnuovnuobnuo3nvY3nvrvogLDoh53omJjomKromKbomJ/omKPomJzomJnomKfomK7omKHomKDomKnomJ7omKVcIl0sW1wiZjY0MFwiLFwi6KCp6KCd6KCb6KCg6KCk6KCc6KCr6KGK6KWt6KWp6KWu6KWr6Ke66K256K246K2F6K266K276LSQ6LSU6Lav6LqO6LqM6L2e6L2b6L2d6YWG6YWE6YWF6Ya56ZC/6ZC76ZC26ZCp6ZC96ZC86ZCw6ZC56ZCq6ZC36ZCs6ZGA6ZCx6Zel6Zek6Zej6Zy16Zy66Z6/6Z+h6aGk6aOJ6aOG6aOA6aWY6aWW6ai56ai96amG6amE6amC6amB6ai6XCJdLFtcImY2YTFcIixcIumov+mrjemslemsl+msmOmslumsuumtkumwq+mwnemwnOmwrOmwo+mwqOmwqemwpOmwoem2t+m2tum2vOm3gem3h+m3ium3j+m2vum3hem3g+m2u+m2tem3jum2uem2uum2rOm3iOm2sem2rem3jOm2s+m3jem2sum5uum6nOm7q+m7rum7rem8m+m8mOm8mum8sem9jum9pem9pOm+kuS6ueWbhuWbheWbi+WlseWti+WtjOW3leW3keW7suaUoeaUoOaUpuaUouasi+asiOasieawjeeBleeBlueBl+eBkueInueIn+eKqeeNv+eTmOeTleeTmeeTl+eZreeareekteemtOepsOepseexl+exnOexmeexm+exmlwiXSxbXCJmNzQwXCIsXCLns7Tns7HnupHnvY/nvofoh57oiavomLTomLXomLPomKzomLLomLbooKzooKjooKbooKrooKXopbHopr/opr7op7vorb7oroToroLoroboroXorb/otJXoupXoupTouproupLoupDoupboupfovaDovaLphYfpkYzpkZDpkYrpkYvpkY/pkYfpkYXpkYjpkYnpkYbpnL/pn6Ppoarpoanpo4vppZTppZvpqY7pqZPpqZTpqYzpqY/pqYjpqYpcIl0sW1wiZjdhMVwiLFwi6amJ6amS6amQ6auQ6ayZ6ayr6ay76a2W6a2V6bGG6bGI6bC/6bGE6bC56bCz6bGB6bC86bC36bC06bCy6bC96bC26beb6beS6bee6bea6beL6beQ6bec6beR6bef6bep6beZ6beY6beW6be16beV6bed6bq26buw6by16byz6byy6b2C6b2r6b6V6b6i5YS95YqZ5aOo5aOn5aWy5a2N5beY6KCv5b2P5oiB5oiD5oiE5pSp5pSl5paW5pur5qyR5qyS5qyP5q+K54Gb54Ga54ii546C546B546D55mw55+U57Gn57Gm57qV6Ims6Ji66JmA6Ji56Ji86Jix6Ji76Ji+6KCw6KCy6KCu6KCz6KW26KW06KWz6Ke+XCJdLFtcImY4NDBcIixcIuiujOiujuiui+iuiOixhei0mei6mOi9pOi9o+mGvOmRoumRlemRnemRl+mRnumfhOmfhemggOmplumpmemsnumsn+msoOmxkumxmOmxkOmxiumxjemxi+mxlemxmemxjOmxjum3u+m3t+m3r+m3o+m3q+m3uOm3pOm3tum3oem3rum3pum3sum3sOm3oum3rOm3tOm3s+m3qOm3rem7gum7kOm7sum7s+m8hum8nOm8uOm8t+m8tum9g+m9j1wiXSxbXCJmOGExXCIsXCLpvbHpvbDpva7pva/lm5Plm43lrY7lsa3mlK3mm63mm67mrJPngZ/ngaHngZ3ngaDniKPnk5vnk6Xnn5XnpLjnprfnprbnsarnupfnvonoia3omYPooLjooLfooLXooYvorpTorpXoup7oup/ouqDoup3phr7phr3ph4Lpkavpkajpkanpm6XpnYbpnYPpnYfpn4fpn6XpqZ7pq5XprZnpsaPpsafpsabpsaLpsZ7psaDpuILpt77puIfpuIPpuIbpuIXpuIDpuIHpuInpt7/pt73puITpuqDpvJ7pvYbpvbTpvbXpvbblm5TmlK7mlrjmrJjmrJnmrJfmrJrngaLniKbniqrnn5jnn5nnpLnnsannsavns7bnuppcIl0sW1wiZjk0MFwiLFwi57qY57qb57qZ6Ieg6Ieh6JmG6JmH6JmI6KW56KW66KW86KW76Ke/6K6Y6K6Z6Lql6Lqk6Lqj6ZGu6ZGt6ZGv6ZGx6ZGz6Z2J6aGy6aWf6bGo6bGu6bGt6biL6biN6biQ6biP6biS6biR6bqh6bu16byJ6b2H6b246b276b266b255Zye54Gm57Gv6KC86Lay6Lqm6YeD6ZG06ZG46ZG26ZG16amg6bG06bGz6bGx6bG16biU6biT6bu26byKXCJdLFtcImY5YTFcIixcIum+pOeBqOeBpeezt+iZquigvuigveigv+iunuiynOi6qei7iemdi+mhs+mhtOmjjOmloemmq+mppOmppumpp+mspOm4lem4l+m9iOaIh+asnueIp+iZjOi6qOmSgumSgOmSgempqempqOmsrum4meeIqeiZi+iun+mSg+mxuem6t+eZtempq+mxuum4neeBqeeBqum6pOm9vum9iem+mOeigemKueijj+Wiu+aBkueyp+WruuKVlOKVpuKVl+KVoOKVrOKVo+KVmuKVqeKVneKVkuKVpOKVleKVnuKVquKVoeKVmOKVp+KVm+KVk+KVpeKVluKVn+KVq+KVouKVmeKVqOKVnOKVkeKVkOKVreKVruKVsOKVr+KWk1wiXV1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3MvdGFibGVzL2NwOTUwLmpzb25cbi8vIG1vZHVsZSBpZCA9IDgyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogdW5waXBlXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSB1bnBpcGVcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlcmUgYXJlIE5vZGUuanMgcGlwZS1saWtlIGRhdGEgbGlzdGVuZXJzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBoYXNQaXBlRGF0YUxpc3RlbmVycyhzdHJlYW0pIHtcbiAgdmFyIGxpc3RlbmVycyA9IHN0cmVhbS5saXN0ZW5lcnMoJ2RhdGEnKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGxpc3RlbmVyc1tpXS5uYW1lID09PSAnb25kYXRhJykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBVbnBpcGUgYSBzdHJlYW0gZnJvbSBhbGwgZGVzdGluYXRpb25zLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHJlYW1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiB1bnBpcGUoc3RyZWFtKSB7XG4gIGlmICghc3RyZWFtKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyZWFtIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RyZWFtLnVucGlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIG5ldy1zdHlsZVxuICAgIHN0cmVhbS51bnBpcGUoKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gTm9kZS5qcyAwLjggaGFja1xuICBpZiAoIWhhc1BpcGVEYXRhTGlzdGVuZXJzKHN0cmVhbSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBsaXN0ZW5lclxuICB2YXIgbGlzdGVuZXJzID0gc3RyZWFtLmxpc3RlbmVycygnY2xvc2UnKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV1cblxuICAgIGlmIChsaXN0ZW5lci5uYW1lICE9PSAnY2xlYW51cCcgJiYgbGlzdGVuZXIubmFtZSAhPT0gJ29uY2xvc2UnKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIGludm9rZSB0aGUgbGlzdGVuZXJcbiAgICBsaXN0ZW5lci5jYWxsKHN0cmVhbSlcbiAgfVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3VucGlwZS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gODNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiemxpYlwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcInpsaWJcIlxuLy8gbW9kdWxlIGlkID0gODRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBtaW1lLXR5cGVzXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGIgPSByZXF1aXJlKCdtaW1lLWRiJylcbnZhciBleHRuYW1lID0gcmVxdWlyZSgncGF0aCcpLmV4dG5hbWVcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRVhUUkFDVF9UWVBFX1JFR0VYUCA9IC9eXFxzKihbXjtcXHNdKikoPzo7fFxcc3wkKS9cbnZhciBURVhUX1RZUEVfUkVHRVhQID0gL150ZXh0XFwvL2lcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLmNoYXJzZXQgPSBjaGFyc2V0XG5leHBvcnRzLmNoYXJzZXRzID0geyBsb29rdXA6IGNoYXJzZXQgfVxuZXhwb3J0cy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlXG5leHBvcnRzLmV4dGVuc2lvbiA9IGV4dGVuc2lvblxuZXhwb3J0cy5leHRlbnNpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuZXhwb3J0cy5sb29rdXAgPSBsb29rdXBcbmV4cG9ydHMudHlwZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbi8vIFBvcHVsYXRlIHRoZSBleHRlbnNpb25zL3R5cGVzIG1hcHNcbnBvcHVsYXRlTWFwcyhleHBvcnRzLmV4dGVuc2lvbnMsIGV4cG9ydHMudHlwZXMpXG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGNoYXJzZXQgZm9yIGEgTUlNRSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufHN0cmluZ31cbiAqL1xuXG5mdW5jdGlvbiBjaGFyc2V0ICh0eXBlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFRPRE86IHVzZSBtZWRpYS10eXBlclxuICB2YXIgbWF0Y2ggPSBFWFRSQUNUX1RZUEVfUkVHRVhQLmV4ZWModHlwZSlcbiAgdmFyIG1pbWUgPSBtYXRjaCAmJiBkYlttYXRjaFsxXS50b0xvd2VyQ2FzZSgpXVxuXG4gIGlmIChtaW1lICYmIG1pbWUuY2hhcnNldCkge1xuICAgIHJldHVybiBtaW1lLmNoYXJzZXRcbiAgfVxuXG4gIC8vIGRlZmF1bHQgdGV4dC8qIHRvIHV0Zi04XG4gIGlmIChtYXRjaCAmJiBURVhUX1RZUEVfUkVHRVhQLnRlc3QobWF0Y2hbMV0pKSB7XG4gICAgcmV0dXJuICdVVEYtOCdcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bGwgQ29udGVudC1UeXBlIGhlYWRlciBnaXZlbiBhIE1JTUUgdHlwZSBvciBleHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7Ym9vbGVhbnxzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gY29udGVudFR5cGUgKHN0cikge1xuICAvLyBUT0RPOiBzaG91bGQgdGhpcyBldmVuIGJlIGluIHRoaXMgbW9kdWxlP1xuICBpZiAoIXN0ciB8fCB0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgdmFyIG1pbWUgPSBzdHIuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gZXhwb3J0cy5sb29rdXAoc3RyKVxuICAgIDogc3RyXG5cbiAgaWYgKCFtaW1lKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUT0RPOiB1c2UgY29udGVudC10eXBlIG9yIG90aGVyIG1vZHVsZVxuICBpZiAobWltZS5pbmRleE9mKCdjaGFyc2V0JykgPT09IC0xKSB7XG4gICAgdmFyIGNoYXJzZXQgPSBleHBvcnRzLmNoYXJzZXQobWltZSlcbiAgICBpZiAoY2hhcnNldCkgbWltZSArPSAnOyBjaGFyc2V0PScgKyBjaGFyc2V0LnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIHJldHVybiBtaW1lXG59XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgYSBNSU1FIHR5cGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGV4dGVuc2lvbiAodHlwZSkge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBUT0RPOiB1c2UgbWVkaWEtdHlwZXJcbiAgdmFyIG1hdGNoID0gRVhUUkFDVF9UWVBFX1JFR0VYUC5leGVjKHR5cGUpXG5cbiAgLy8gZ2V0IGV4dGVuc2lvbnNcbiAgdmFyIGV4dHMgPSBtYXRjaCAmJiBleHBvcnRzLmV4dGVuc2lvbnNbbWF0Y2hbMV0udG9Mb3dlckNhc2UoKV1cblxuICBpZiAoIWV4dHMgfHwgIWV4dHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZXh0c1swXVxufVxuXG4vKipcbiAqIExvb2t1cCB0aGUgTUlNRSB0eXBlIGZvciBhIGZpbGUgcGF0aC9leHRlbnNpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge2Jvb2xlYW58c3RyaW5nfVxuICovXG5cbmZ1bmN0aW9uIGxvb2t1cCAocGF0aCkge1xuICBpZiAoIXBhdGggfHwgdHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBnZXQgdGhlIGV4dGVuc2lvbiAoXCJleHRcIiBvciBcIi5leHRcIiBvciBmdWxsIHBhdGgpXG4gIHZhciBleHRlbnNpb24gPSBleHRuYW1lKCd4LicgKyBwYXRoKVxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnN1YnN0cigxKVxuXG4gIGlmICghZXh0ZW5zaW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gZXhwb3J0cy50eXBlc1tleHRlbnNpb25dIHx8IGZhbHNlXG59XG5cbi8qKlxuICogUG9wdWxhdGUgdGhlIGV4dGVuc2lvbnMgYW5kIHR5cGVzIG1hcHMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBvcHVsYXRlTWFwcyAoZXh0ZW5zaW9ucywgdHlwZXMpIHtcbiAgLy8gc291cmNlIHByZWZlcmVuY2UgKGxlYXN0IC0+IG1vc3QpXG4gIHZhciBwcmVmZXJlbmNlID0gWyduZ2lueCcsICdhcGFjaGUnLCB1bmRlZmluZWQsICdpYW5hJ11cblxuICBPYmplY3Qua2V5cyhkYikuZm9yRWFjaChmdW5jdGlvbiBmb3JFYWNoTWltZVR5cGUgKHR5cGUpIHtcbiAgICB2YXIgbWltZSA9IGRiW3R5cGVdXG4gICAgdmFyIGV4dHMgPSBtaW1lLmV4dGVuc2lvbnNcblxuICAgIGlmICghZXh0cyB8fCAhZXh0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIG1pbWUgLT4gZXh0ZW5zaW9uc1xuICAgIGV4dGVuc2lvbnNbdHlwZV0gPSBleHRzXG5cbiAgICAvLyBleHRlbnNpb24gLT4gbWltZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGV4dGVuc2lvbiA9IGV4dHNbaV1cblxuICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0pIHtcbiAgICAgICAgdmFyIGZyb20gPSBwcmVmZXJlbmNlLmluZGV4T2YoZGJbdHlwZXNbZXh0ZW5zaW9uXV0uc291cmNlKVxuICAgICAgICB2YXIgdG8gPSBwcmVmZXJlbmNlLmluZGV4T2YobWltZS5zb3VyY2UpXG5cbiAgICAgICAgaWYgKHR5cGVzW2V4dGVuc2lvbl0gIT09ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nICYmXG4gICAgICAgICAgKGZyb20gPiB0byB8fCAoZnJvbSA9PT0gdG8gJiYgdHlwZXNbZXh0ZW5zaW9uXS5zdWJzdHIoMCwgMTIpID09PSAnYXBwbGljYXRpb24vJykpKSB7XG4gICAgICAgICAgLy8gc2tpcCB0aGUgcmVtYXBwaW5nXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdGhlIGV4dGVuc2lvbiAtPiBtaW1lXG4gICAgICB0eXBlc1tleHRlbnNpb25dID0gdHlwZVxuICAgIH1cbiAgfSlcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9taW1lLXR5cGVzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA4NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgaGV4VGFibGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcnJheSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgICAgICAgYXJyYXkucHVzaCgnJScgKyAoKGkgPCAxNiA/ICcwJyA6ICcnKSArIGkudG9TdHJpbmcoMTYpKS50b1VwcGVyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyYXk7XG59KCkpO1xuXG52YXIgY29tcGFjdFF1ZXVlID0gZnVuY3Rpb24gY29tcGFjdFF1ZXVlKHF1ZXVlKSB7XG4gICAgdmFyIG9iajtcblxuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZS5wb3AoKTtcbiAgICAgICAgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICB2YXIgY29tcGFjdGVkID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpbal0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhY3RlZC5wdXNoKG9ialtqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLm9ialtpdGVtLnByb3BdID0gY29tcGFjdGVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbmV4cG9ydHMuYXJyYXlUb09iamVjdCA9IGZ1bmN0aW9uIGFycmF5VG9PYmplY3Qoc291cmNlLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzb3VyY2UubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2VbaV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBvYmpbaV0gPSBzb3VyY2VbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xufTtcblxuZXhwb3J0cy5tZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGxhaW5PYmplY3RzIHx8IG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzIHx8ICFoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3NvdXJjZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFt0YXJnZXQsIHNvdXJjZV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW3RhcmdldF0uY29uY2F0KHNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIG1lcmdlVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkgJiYgIUFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBtZXJnZVRhcmdldCA9IGV4cG9ydHMuYXJyYXlUb09iamVjdCh0YXJnZXQsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkgJiYgQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICAgIHNvdXJjZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgICAgICAgICBpZiAoaGFzLmNhbGwodGFyZ2V0LCBpKSkge1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRbaV0gJiYgdHlwZW9mIHRhcmdldFtpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gZXhwb3J0cy5tZXJnZSh0YXJnZXRbaV0sIGl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gaXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBzb3VyY2Vba2V5XTtcblxuICAgICAgICBpZiAoaGFzLmNhbGwoYWNjLCBrZXkpKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IGV4cG9ydHMubWVyZ2UoYWNjW2tleV0sIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBtZXJnZVRhcmdldCk7XG59O1xuXG5leHBvcnRzLmFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnblNpbmdsZVNvdXJjZSh0YXJnZXQsIHNvdXJjZSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICAgICAgYWNjW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0YXJnZXQpO1xufTtcblxuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHIucmVwbGFjZSgvXFwrL2csICcgJykpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG59O1xuXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHIpIHtcbiAgICAvLyBUaGlzIGNvZGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBCcmlhbiBXaGl0ZSAobXNjZGV4KSBmb3IgdGhlIGlvLmpzIGNvcmUgcXVlcnlzdHJpbmcgbGlicmFyeS5cbiAgICAvLyBJdCBoYXMgYmVlbiBhZGFwdGVkIGhlcmUgZm9yIHN0cmljdGVyIGFkaGVyZW5jZSB0byBSRkMgMzk4NlxuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgdmFyIHN0cmluZyA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gc3RyIDogU3RyaW5nKHN0cik7XG5cbiAgICB2YXIgb3V0ID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChpKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjID09PSAweDJEIC8vIC1cbiAgICAgICAgICAgIHx8IGMgPT09IDB4MkUgLy8gLlxuICAgICAgICAgICAgfHwgYyA9PT0gMHg1RiAvLyBfXG4gICAgICAgICAgICB8fCBjID09PSAweDdFIC8vIH5cbiAgICAgICAgICAgIHx8IChjID49IDB4MzAgJiYgYyA8PSAweDM5KSAvLyAwLTlcbiAgICAgICAgICAgIHx8IChjID49IDB4NDEgJiYgYyA8PSAweDVBKSAvLyBhLXpcbiAgICAgICAgICAgIHx8IChjID49IDB4NjEgJiYgYyA8PSAweDdBKSAvLyBBLVpcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBvdXQgKz0gc3RyaW5nLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyBoZXhUYWJsZVtjXTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4QzAgfCAoYyA+PiA2KV0gKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4RDgwMCB8fCBjID49IDB4RTAwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4RTAgfCAoYyA+PiAxMildICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKChjICYgMHgzRkYpIDw8IDEwKSB8IChzdHJpbmcuY2hhckNvZGVBdChpKSAmIDB4M0ZGKSk7XG4gICAgICAgIG91dCArPSBoZXhUYWJsZVsweEYwIHwgKGMgPj4gMTgpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuZXhwb3J0cy5jb21wYWN0ID0gZnVuY3Rpb24gY29tcGFjdCh2YWx1ZSkge1xuICAgIHZhciBxdWV1ZSA9IFt7IG9iajogeyBvOiB2YWx1ZSB9LCBwcm9wOiAnbycgfV07XG4gICAgdmFyIHJlZnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBxdWV1ZVtpXTtcbiAgICAgICAgdmFyIG9iaiA9IGl0ZW0ub2JqW2l0ZW0ucHJvcF07XG5cbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2pdO1xuICAgICAgICAgICAgdmFyIHZhbCA9IG9ialtrZXldO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCAmJiByZWZzLmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKHsgb2JqOiBvYmosIHByb3A6IGtleSB9KTtcbiAgICAgICAgICAgICAgICByZWZzLnB1c2godmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb21wYWN0UXVldWUocXVldWUpO1xufTtcblxuZXhwb3J0cy5pc1JlZ0V4cCA9IGZ1bmN0aW9uIGlzUmVnRXhwKG9iaikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59O1xuXG5leHBvcnRzLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhKG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaikpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9xcy9saWIvdXRpbHMuanNcbi8vIG1vZHVsZSBpZCA9IDg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxudmFyIHJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG52YXIgcGVyY2VudFR3ZW50aWVzID0gLyUyMC9nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAnZGVmYXVsdCc6ICdSRkMzOTg2JyxcbiAgICBmb3JtYXR0ZXJzOiB7XG4gICAgICAgIFJGQzE3Mzg6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2UuY2FsbCh2YWx1ZSwgcGVyY2VudFR3ZW50aWVzLCAnKycpO1xuICAgICAgICB9LFxuICAgICAgICBSRkMzOTg2OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgUkZDMTczODogJ1JGQzE3MzgnLFxuICAgIFJGQzM5ODY6ICdSRkMzOTg2J1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9xcy9saWIvZm9ybWF0cy5qc1xuLy8gbW9kdWxlIGlkID0gODdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicXVlcnlzdHJpbmdcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJxdWVyeXN0cmluZ1wiXG4vLyBtb2R1bGUgaWQgPSA4OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDEzIFJvbWFuIFNodHlsbWFuXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIFJvdXRlID0gcmVxdWlyZSgnLi9yb3V0ZScpO1xudmFyIExheWVyID0gcmVxdWlyZSgnLi9sYXllcicpO1xudmFyIG1ldGhvZHMgPSByZXF1aXJlKCdtZXRob2RzJyk7XG52YXIgbWl4aW4gPSByZXF1aXJlKCd1dGlscy1tZXJnZScpO1xudmFyIGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnZXhwcmVzczpyb3V0ZXInKTtcbnZhciBkZXByZWNhdGUgPSByZXF1aXJlKCdkZXBkJykoJ2V4cHJlc3MnKTtcbnZhciBmbGF0dGVuID0gcmVxdWlyZSgnYXJyYXktZmxhdHRlbicpO1xudmFyIHBhcnNlVXJsID0gcmVxdWlyZSgncGFyc2V1cmwnKTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJ3NldHByb3RvdHlwZW9mJylcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgb2JqZWN0UmVnRXhwID0gL15cXFtvYmplY3QgKFxcUyspXFxdJC87XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIEluaXRpYWxpemUgYSBuZXcgYFJvdXRlcmAgd2l0aCB0aGUgZ2l2ZW4gYG9wdGlvbnNgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtSb3V0ZXJ9IHdoaWNoIGlzIGFuIGNhbGxhYmxlIGZ1bmN0aW9uXG4gKiBAcHVibGljXG4gKi9cblxudmFyIHByb3RvID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICBmdW5jdGlvbiByb3V0ZXIocmVxLCByZXMsIG5leHQpIHtcbiAgICByb3V0ZXIuaGFuZGxlKHJlcSwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIC8vIG1peGluIFJvdXRlciBjbGFzcyBmdW5jdGlvbnNcbiAgc2V0UHJvdG90eXBlT2Yocm91dGVyLCBwcm90bylcblxuICByb3V0ZXIucGFyYW1zID0ge307XG4gIHJvdXRlci5fcGFyYW1zID0gW107XG4gIHJvdXRlci5jYXNlU2Vuc2l0aXZlID0gb3B0cy5jYXNlU2Vuc2l0aXZlO1xuICByb3V0ZXIubWVyZ2VQYXJhbXMgPSBvcHRzLm1lcmdlUGFyYW1zO1xuICByb3V0ZXIuc3RyaWN0ID0gb3B0cy5zdHJpY3Q7XG4gIHJvdXRlci5zdGFjayA9IFtdO1xuXG4gIHJldHVybiByb3V0ZXI7XG59O1xuXG4vKipcbiAqIE1hcCB0aGUgZ2l2ZW4gcGFyYW0gcGxhY2Vob2xkZXIgYG5hbWVgKHMpIHRvIHRoZSBnaXZlbiBjYWxsYmFjay5cbiAqXG4gKiBQYXJhbWV0ZXIgbWFwcGluZyBpcyB1c2VkIHRvIHByb3ZpZGUgcHJlLWNvbmRpdGlvbnMgdG8gcm91dGVzXG4gKiB3aGljaCB1c2Ugbm9ybWFsaXplZCBwbGFjZWhvbGRlcnMuIEZvciBleGFtcGxlIGEgXzp1c2VyX2lkXyBwYXJhbWV0ZXJcbiAqIGNvdWxkIGF1dG9tYXRpY2FsbHkgbG9hZCBhIHVzZXIncyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkYXRhYmFzZSB3aXRob3V0XG4gKiBhbnkgYWRkaXRpb25hbCBjb2RlLFxuICpcbiAqIFRoZSBjYWxsYmFjayB1c2VzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyBtaWRkbGV3YXJlLCB0aGUgb25seSBkaWZmZXJlbmNlXG4gKiBiZWluZyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgcGxhY2Vob2xkZXIgaXMgcGFzc2VkLCBpbiB0aGlzIGNhc2UgdGhlIF9pZF9cbiAqIG9mIHRoZSB1c2VyLiBPbmNlIHRoZSBgbmV4dCgpYCBmdW5jdGlvbiBpcyBpbnZva2VkLCBqdXN0IGxpa2UgbWlkZGxld2FyZVxuICogaXQgd2lsbCBjb250aW51ZSBvbiB0byBleGVjdXRlIHRoZSByb3V0ZSwgb3Igc3Vic2VxdWVudCBwYXJhbWV0ZXIgZnVuY3Rpb25zLlxuICpcbiAqIEp1c3QgbGlrZSBpbiBtaWRkbGV3YXJlLCB5b3UgbXVzdCBlaXRoZXIgcmVzcG9uZCB0byB0aGUgcmVxdWVzdCBvciBjYWxsIG5leHRcbiAqIHRvIGF2b2lkIHN0YWxsaW5nIHRoZSByZXF1ZXN0LlxuICpcbiAqICBhcHAucGFyYW0oJ3VzZXJfaWQnLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCwgaWQpe1xuICogICAgVXNlci5maW5kKGlkLCBmdW5jdGlvbihlcnIsIHVzZXIpe1xuICogICAgICBpZiAoZXJyKSB7XG4gKiAgICAgICAgcmV0dXJuIG5leHQoZXJyKTtcbiAqICAgICAgfSBlbHNlIGlmICghdXNlcikge1xuICogICAgICAgIHJldHVybiBuZXh0KG5ldyBFcnJvcignZmFpbGVkIHRvIGxvYWQgdXNlcicpKTtcbiAqICAgICAgfVxuICogICAgICByZXEudXNlciA9IHVzZXI7XG4gKiAgICAgIG5leHQoKTtcbiAqICAgIH0pO1xuICogIH0pO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7YXBwfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5wcm90by5wYXJhbSA9IGZ1bmN0aW9uIHBhcmFtKG5hbWUsIGZuKSB7XG4gIC8vIHBhcmFtIGxvZ2ljXG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRlcHJlY2F0ZSgncm91dGVyLnBhcmFtKGZuKTogUmVmYWN0b3IgdG8gdXNlIHBhdGggcGFyYW1zJyk7XG4gICAgdGhpcy5fcGFyYW1zLnB1c2gobmFtZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gYXBwbHkgcGFyYW0gZnVuY3Rpb25zXG4gIHZhciBwYXJhbXMgPSB0aGlzLl9wYXJhbXM7XG4gIHZhciBsZW4gPSBwYXJhbXMubGVuZ3RoO1xuICB2YXIgcmV0O1xuXG4gIGlmIChuYW1lWzBdID09PSAnOicpIHtcbiAgICBkZXByZWNhdGUoJ3JvdXRlci5wYXJhbSgnICsgSlNPTi5zdHJpbmdpZnkobmFtZSkgKyAnLCBmbik6IFVzZSByb3V0ZXIucGFyYW0oJyArIEpTT04uc3RyaW5naWZ5KG5hbWUuc3Vic3RyKDEpKSArICcsIGZuKSBpbnN0ZWFkJyk7XG4gICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChyZXQgPSBwYXJhbXNbaV0obmFtZSwgZm4pKSB7XG4gICAgICBmbiA9IHJldDtcbiAgICB9XG4gIH1cblxuICAvLyBlbnN1cmUgd2UgZW5kIHVwIHdpdGggYVxuICAvLyBtaWRkbGV3YXJlIGZ1bmN0aW9uXG4gIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2YgZm4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGFyYW0oKSBjYWxsIGZvciAnICsgbmFtZSArICcsIGdvdCAnICsgZm4pO1xuICB9XG5cbiAgKHRoaXMucGFyYW1zW25hbWVdID0gdGhpcy5wYXJhbXNbbmFtZV0gfHwgW10pLnB1c2goZm4pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXEsIHJlcyBpbnRvIHRoZSByb3V0ZXIuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnByb3RvLmhhbmRsZSA9IGZ1bmN0aW9uIGhhbmRsZShyZXEsIHJlcywgb3V0KSB7XG4gIHZhciBzZWxmID0gdGhpcztcblxuICBkZWJ1ZygnZGlzcGF0Y2hpbmcgJXMgJXMnLCByZXEubWV0aG9kLCByZXEudXJsKTtcblxuICB2YXIgaWR4ID0gMDtcbiAgdmFyIHByb3RvaG9zdCA9IGdldFByb3RvaG9zdChyZXEudXJsKSB8fCAnJ1xuICB2YXIgcmVtb3ZlZCA9ICcnO1xuICB2YXIgc2xhc2hBZGRlZCA9IGZhbHNlO1xuICB2YXIgcGFyYW1jYWxsZWQgPSB7fTtcblxuICAvLyBzdG9yZSBvcHRpb25zIGZvciBPUFRJT05TIHJlcXVlc3RcbiAgLy8gb25seSB1c2VkIGlmIE9QVElPTlMgcmVxdWVzdFxuICB2YXIgb3B0aW9ucyA9IFtdO1xuXG4gIC8vIG1pZGRsZXdhcmUgYW5kIHJvdXRlc1xuICB2YXIgc3RhY2sgPSBzZWxmLnN0YWNrO1xuXG4gIC8vIG1hbmFnZSBpbnRlci1yb3V0ZXIgdmFyaWFibGVzXG4gIHZhciBwYXJlbnRQYXJhbXMgPSByZXEucGFyYW1zO1xuICB2YXIgcGFyZW50VXJsID0gcmVxLmJhc2VVcmwgfHwgJyc7XG4gIHZhciBkb25lID0gcmVzdG9yZShvdXQsIHJlcSwgJ2Jhc2VVcmwnLCAnbmV4dCcsICdwYXJhbXMnKTtcblxuICAvLyBzZXR1cCBuZXh0IGxheWVyXG4gIHJlcS5uZXh0ID0gbmV4dDtcblxuICAvLyBmb3Igb3B0aW9ucyByZXF1ZXN0cywgcmVzcG9uZCB3aXRoIGEgZGVmYXVsdCBpZiBub3RoaW5nIGVsc2UgcmVzcG9uZHNcbiAgaWYgKHJlcS5tZXRob2QgPT09ICdPUFRJT05TJykge1xuICAgIGRvbmUgPSB3cmFwKGRvbmUsIGZ1bmN0aW9uKG9sZCwgZXJyKSB7XG4gICAgICBpZiAoZXJyIHx8IG9wdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gb2xkKGVycik7XG4gICAgICBzZW5kT3B0aW9uc1Jlc3BvbnNlKHJlcywgb3B0aW9ucywgb2xkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHNldHVwIGJhc2ljIHJlcSB2YWx1ZXNcbiAgcmVxLmJhc2VVcmwgPSBwYXJlbnRVcmw7XG4gIHJlcS5vcmlnaW5hbFVybCA9IHJlcS5vcmlnaW5hbFVybCB8fCByZXEudXJsO1xuXG4gIG5leHQoKTtcblxuICBmdW5jdGlvbiBuZXh0KGVycikge1xuICAgIHZhciBsYXllckVycm9yID0gZXJyID09PSAncm91dGUnXG4gICAgICA/IG51bGxcbiAgICAgIDogZXJyO1xuXG4gICAgLy8gcmVtb3ZlIGFkZGVkIHNsYXNoXG4gICAgaWYgKHNsYXNoQWRkZWQpIHtcbiAgICAgIHJlcS51cmwgPSByZXEudXJsLnN1YnN0cigxKTtcbiAgICAgIHNsYXNoQWRkZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyByZXN0b3JlIGFsdGVyZWQgcmVxLnVybFxuICAgIGlmIChyZW1vdmVkLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcmVxLmJhc2VVcmwgPSBwYXJlbnRVcmw7XG4gICAgICByZXEudXJsID0gcHJvdG9ob3N0ICsgcmVtb3ZlZCArIHJlcS51cmwuc3Vic3RyKHByb3RvaG9zdC5sZW5ndGgpO1xuICAgICAgcmVtb3ZlZCA9ICcnO1xuICAgIH1cblxuICAgIC8vIHNpZ25hbCB0byBleGl0IHJvdXRlclxuICAgIGlmIChsYXllckVycm9yID09PSAncm91dGVyJykge1xuICAgICAgc2V0SW1tZWRpYXRlKGRvbmUsIG51bGwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBubyBtb3JlIG1hdGNoaW5nIGxheWVyc1xuICAgIGlmIChpZHggPj0gc3RhY2subGVuZ3RoKSB7XG4gICAgICBzZXRJbW1lZGlhdGUoZG9uZSwgbGF5ZXJFcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZ2V0IHBhdGhuYW1lIG9mIHJlcXVlc3RcbiAgICB2YXIgcGF0aCA9IGdldFBhdGhuYW1lKHJlcSk7XG5cbiAgICBpZiAocGF0aCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZG9uZShsYXllckVycm9yKTtcbiAgICB9XG5cbiAgICAvLyBmaW5kIG5leHQgbWF0Y2hpbmcgbGF5ZXJcbiAgICB2YXIgbGF5ZXI7XG4gICAgdmFyIG1hdGNoO1xuICAgIHZhciByb3V0ZTtcblxuICAgIHdoaWxlIChtYXRjaCAhPT0gdHJ1ZSAmJiBpZHggPCBzdGFjay5sZW5ndGgpIHtcbiAgICAgIGxheWVyID0gc3RhY2tbaWR4KytdO1xuICAgICAgbWF0Y2ggPSBtYXRjaExheWVyKGxheWVyLCBwYXRoKTtcbiAgICAgIHJvdXRlID0gbGF5ZXIucm91dGU7XG5cbiAgICAgIGlmICh0eXBlb2YgbWF0Y2ggIT09ICdib29sZWFuJykge1xuICAgICAgICAvLyBob2xkIG9uIHRvIGxheWVyRXJyb3JcbiAgICAgICAgbGF5ZXJFcnJvciA9IGxheWVyRXJyb3IgfHwgbWF0Y2g7XG4gICAgICB9XG5cbiAgICAgIGlmIChtYXRjaCAhPT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyb3V0ZSkge1xuICAgICAgICAvLyBwcm9jZXNzIG5vbi1yb3V0ZSBoYW5kbGVycyBub3JtYWxseVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxheWVyRXJyb3IpIHtcbiAgICAgICAgLy8gcm91dGVzIGRvIG5vdCBtYXRjaCB3aXRoIGEgcGVuZGluZyBlcnJvclxuICAgICAgICBtYXRjaCA9IGZhbHNlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIG1ldGhvZCA9IHJlcS5tZXRob2Q7XG4gICAgICB2YXIgaGFzX21ldGhvZCA9IHJvdXRlLl9oYW5kbGVzX21ldGhvZChtZXRob2QpO1xuXG4gICAgICAvLyBidWlsZCB1cCBhdXRvbWF0aWMgb3B0aW9ucyByZXNwb25zZVxuICAgICAgaWYgKCFoYXNfbWV0aG9kICYmIG1ldGhvZCA9PT0gJ09QVElPTlMnKSB7XG4gICAgICAgIGFwcGVuZE1ldGhvZHMob3B0aW9ucywgcm91dGUuX29wdGlvbnMoKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRvbid0IGV2ZW4gYm90aGVyIG1hdGNoaW5nIHJvdXRlXG4gICAgICBpZiAoIWhhc19tZXRob2QgJiYgbWV0aG9kICE9PSAnSEVBRCcpIHtcbiAgICAgICAgbWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbm8gbWF0Y2hcbiAgICBpZiAobWF0Y2ggIT09IHRydWUpIHtcbiAgICAgIHJldHVybiBkb25lKGxheWVyRXJyb3IpO1xuICAgIH1cblxuICAgIC8vIHN0b3JlIHJvdXRlIGZvciBkaXNwYXRjaCBvbiBjaGFuZ2VcbiAgICBpZiAocm91dGUpIHtcbiAgICAgIHJlcS5yb3V0ZSA9IHJvdXRlO1xuICAgIH1cblxuICAgIC8vIENhcHR1cmUgb25lLXRpbWUgbGF5ZXIgdmFsdWVzXG4gICAgcmVxLnBhcmFtcyA9IHNlbGYubWVyZ2VQYXJhbXNcbiAgICAgID8gbWVyZ2VQYXJhbXMobGF5ZXIucGFyYW1zLCBwYXJlbnRQYXJhbXMpXG4gICAgICA6IGxheWVyLnBhcmFtcztcbiAgICB2YXIgbGF5ZXJQYXRoID0gbGF5ZXIucGF0aDtcblxuICAgIC8vIHRoaXMgc2hvdWxkIGJlIGRvbmUgZm9yIHRoZSBsYXllclxuICAgIHNlbGYucHJvY2Vzc19wYXJhbXMobGF5ZXIsIHBhcmFtY2FsbGVkLCByZXEsIHJlcywgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gbmV4dChsYXllckVycm9yIHx8IGVycik7XG4gICAgICB9XG5cbiAgICAgIGlmIChyb3V0ZSkge1xuICAgICAgICByZXR1cm4gbGF5ZXIuaGFuZGxlX3JlcXVlc3QocmVxLCByZXMsIG5leHQpO1xuICAgICAgfVxuXG4gICAgICB0cmltX3ByZWZpeChsYXllciwgbGF5ZXJFcnJvciwgbGF5ZXJQYXRoLCBwYXRoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyaW1fcHJlZml4KGxheWVyLCBsYXllckVycm9yLCBsYXllclBhdGgsIHBhdGgpIHtcbiAgICBpZiAobGF5ZXJQYXRoLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gVmFsaWRhdGUgcGF0aCBicmVha3Mgb24gYSBwYXRoIHNlcGFyYXRvclxuICAgICAgdmFyIGMgPSBwYXRoW2xheWVyUGF0aC5sZW5ndGhdXG4gICAgICBpZiAoYyAmJiBjICE9PSAnLycgJiYgYyAhPT0gJy4nKSByZXR1cm4gbmV4dChsYXllckVycm9yKVxuXG4gICAgICAvLyBUcmltIG9mZiB0aGUgcGFydCBvZiB0aGUgdXJsIHRoYXQgbWF0Y2hlcyB0aGUgcm91dGVcbiAgICAgIC8vIG1pZGRsZXdhcmUgKC51c2Ugc3R1ZmYpIG5lZWRzIHRvIGhhdmUgdGhlIHBhdGggc3RyaXBwZWRcbiAgICAgIGRlYnVnKCd0cmltIHByZWZpeCAoJXMpIGZyb20gdXJsICVzJywgbGF5ZXJQYXRoLCByZXEudXJsKTtcbiAgICAgIHJlbW92ZWQgPSBsYXllclBhdGg7XG4gICAgICByZXEudXJsID0gcHJvdG9ob3N0ICsgcmVxLnVybC5zdWJzdHIocHJvdG9ob3N0Lmxlbmd0aCArIHJlbW92ZWQubGVuZ3RoKTtcblxuICAgICAgLy8gRW5zdXJlIGxlYWRpbmcgc2xhc2hcbiAgICAgIGlmICghcHJvdG9ob3N0ICYmIHJlcS51cmxbMF0gIT09ICcvJykge1xuICAgICAgICByZXEudXJsID0gJy8nICsgcmVxLnVybDtcbiAgICAgICAgc2xhc2hBZGRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldHVwIGJhc2UgVVJMIChubyB0cmFpbGluZyBzbGFzaClcbiAgICAgIHJlcS5iYXNlVXJsID0gcGFyZW50VXJsICsgKHJlbW92ZWRbcmVtb3ZlZC5sZW5ndGggLSAxXSA9PT0gJy8nXG4gICAgICAgID8gcmVtb3ZlZC5zdWJzdHJpbmcoMCwgcmVtb3ZlZC5sZW5ndGggLSAxKVxuICAgICAgICA6IHJlbW92ZWQpO1xuICAgIH1cblxuICAgIGRlYnVnKCclcyAlcyA6ICVzJywgbGF5ZXIubmFtZSwgbGF5ZXJQYXRoLCByZXEub3JpZ2luYWxVcmwpO1xuXG4gICAgaWYgKGxheWVyRXJyb3IpIHtcbiAgICAgIGxheWVyLmhhbmRsZV9lcnJvcihsYXllckVycm9yLCByZXEsIHJlcywgbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyLmhhbmRsZV9yZXF1ZXN0KHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUHJvY2VzcyBhbnkgcGFyYW1ldGVycyBmb3IgdGhlIGxheWVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5wcm90by5wcm9jZXNzX3BhcmFtcyA9IGZ1bmN0aW9uIHByb2Nlc3NfcGFyYW1zKGxheWVyLCBjYWxsZWQsIHJlcSwgcmVzLCBkb25lKSB7XG4gIHZhciBwYXJhbXMgPSB0aGlzLnBhcmFtcztcblxuICAvLyBjYXB0dXJlZCBwYXJhbWV0ZXJzIGZyb20gdGhlIGxheWVyLCBrZXlzIGFuZCB2YWx1ZXNcbiAgdmFyIGtleXMgPSBsYXllci5rZXlzO1xuXG4gIC8vIGZhc3QgdHJhY2tcbiAgaWYgKCFrZXlzIHx8IGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGRvbmUoKTtcbiAgfVxuXG4gIHZhciBpID0gMDtcbiAgdmFyIG5hbWU7XG4gIHZhciBwYXJhbUluZGV4ID0gMDtcbiAgdmFyIGtleTtcbiAgdmFyIHBhcmFtVmFsO1xuICB2YXIgcGFyYW1DYWxsYmFja3M7XG4gIHZhciBwYXJhbUNhbGxlZDtcblxuICAvLyBwcm9jZXNzIHBhcmFtcyBpbiBvcmRlclxuICAvLyBwYXJhbSBjYWxsYmFja3MgY2FuIGJlIGFzeW5jXG4gIGZ1bmN0aW9uIHBhcmFtKGVycikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBkb25lKGVycik7XG4gICAgfVxuXG4gICAgaWYgKGkgPj0ga2V5cy5sZW5ndGggKSB7XG4gICAgICByZXR1cm4gZG9uZSgpO1xuICAgIH1cblxuICAgIHBhcmFtSW5kZXggPSAwO1xuICAgIGtleSA9IGtleXNbaSsrXTtcbiAgICBuYW1lID0ga2V5Lm5hbWU7XG4gICAgcGFyYW1WYWwgPSByZXEucGFyYW1zW25hbWVdO1xuICAgIHBhcmFtQ2FsbGJhY2tzID0gcGFyYW1zW25hbWVdO1xuICAgIHBhcmFtQ2FsbGVkID0gY2FsbGVkW25hbWVdO1xuXG4gICAgaWYgKHBhcmFtVmFsID09PSB1bmRlZmluZWQgfHwgIXBhcmFtQ2FsbGJhY2tzKSB7XG4gICAgICByZXR1cm4gcGFyYW0oKTtcbiAgICB9XG5cbiAgICAvLyBwYXJhbSBwcmV2aW91c2x5IGNhbGxlZCB3aXRoIHNhbWUgdmFsdWUgb3IgZXJyb3Igb2NjdXJyZWRcbiAgICBpZiAocGFyYW1DYWxsZWQgJiYgKHBhcmFtQ2FsbGVkLm1hdGNoID09PSBwYXJhbVZhbFxuICAgICAgfHwgKHBhcmFtQ2FsbGVkLmVycm9yICYmIHBhcmFtQ2FsbGVkLmVycm9yICE9PSAncm91dGUnKSkpIHtcbiAgICAgIC8vIHJlc3RvcmUgdmFsdWVcbiAgICAgIHJlcS5wYXJhbXNbbmFtZV0gPSBwYXJhbUNhbGxlZC52YWx1ZTtcblxuICAgICAgLy8gbmV4dCBwYXJhbVxuICAgICAgcmV0dXJuIHBhcmFtKHBhcmFtQ2FsbGVkLmVycm9yKTtcbiAgICB9XG5cbiAgICBjYWxsZWRbbmFtZV0gPSBwYXJhbUNhbGxlZCA9IHtcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgbWF0Y2g6IHBhcmFtVmFsLFxuICAgICAgdmFsdWU6IHBhcmFtVmFsXG4gICAgfTtcblxuICAgIHBhcmFtQ2FsbGJhY2soKTtcbiAgfVxuXG4gIC8vIHNpbmdsZSBwYXJhbSBjYWxsYmFja3NcbiAgZnVuY3Rpb24gcGFyYW1DYWxsYmFjayhlcnIpIHtcbiAgICB2YXIgZm4gPSBwYXJhbUNhbGxiYWNrc1twYXJhbUluZGV4KytdO1xuXG4gICAgLy8gc3RvcmUgdXBkYXRlZCB2YWx1ZVxuICAgIHBhcmFtQ2FsbGVkLnZhbHVlID0gcmVxLnBhcmFtc1trZXkubmFtZV07XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICAvLyBzdG9yZSBlcnJvclxuICAgICAgcGFyYW1DYWxsZWQuZXJyb3IgPSBlcnI7XG4gICAgICBwYXJhbShlcnIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZm4pIHJldHVybiBwYXJhbSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZuKHJlcSwgcmVzLCBwYXJhbUNhbGxiYWNrLCBwYXJhbVZhbCwga2V5Lm5hbWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHBhcmFtQ2FsbGJhY2soZSk7XG4gICAgfVxuICB9XG5cbiAgcGFyYW0oKTtcbn07XG5cbi8qKlxuICogVXNlIHRoZSBnaXZlbiBtaWRkbGV3YXJlIGZ1bmN0aW9uLCB3aXRoIG9wdGlvbmFsIHBhdGgsIGRlZmF1bHRpbmcgdG8gXCIvXCIuXG4gKlxuICogVXNlIChsaWtlIGAuYWxsYCkgd2lsbCBydW4gZm9yIGFueSBodHRwIE1FVEhPRCwgYnV0IGl0IHdpbGwgbm90IGFkZFxuICogaGFuZGxlcnMgZm9yIHRob3NlIG1ldGhvZHMgc28gT1BUSU9OUyByZXF1ZXN0cyB3aWxsIG5vdCBjb25zaWRlciBgLnVzZWBcbiAqIGZ1bmN0aW9ucyBldmVuIGlmIHRoZXkgY291bGQgcmVzcG9uZC5cbiAqXG4gKiBUaGUgb3RoZXIgZGlmZmVyZW5jZSBpcyB0aGF0IF9yb3V0ZV8gcGF0aCBpcyBzdHJpcHBlZCBhbmQgbm90IHZpc2libGVcbiAqIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uLiBUaGUgbWFpbiBlZmZlY3Qgb2YgdGhpcyBmZWF0dXJlIGlzIHRoYXQgbW91bnRlZFxuICogaGFuZGxlcnMgY2FuIG9wZXJhdGUgd2l0aG91dCBhbnkgY29kZSBjaGFuZ2VzIHJlZ2FyZGxlc3Mgb2YgdGhlIFwicHJlZml4XCJcbiAqIHBhdGhuYW1lLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG5wcm90by51c2UgPSBmdW5jdGlvbiB1c2UoZm4pIHtcbiAgdmFyIG9mZnNldCA9IDA7XG4gIHZhciBwYXRoID0gJy8nO1xuXG4gIC8vIGRlZmF1bHQgcGF0aCB0byAnLydcbiAgLy8gZGlzYW1iaWd1YXRlIHJvdXRlci51c2UoW2ZuXSlcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBhcmcgPSBmbjtcblxuICAgIHdoaWxlIChBcnJheS5pc0FycmF5KGFyZykgJiYgYXJnLmxlbmd0aCAhPT0gMCkge1xuICAgICAgYXJnID0gYXJnWzBdO1xuICAgIH1cblxuICAgIC8vIGZpcnN0IGFyZyBpcyB0aGUgcGF0aFxuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvZmZzZXQgPSAxO1xuICAgICAgcGF0aCA9IGZuO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjYWxsYmFja3MgPSBmbGF0dGVuKHNsaWNlLmNhbGwoYXJndW1lbnRzLCBvZmZzZXQpKTtcblxuICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JvdXRlci51c2UoKSByZXF1aXJlcyBhIG1pZGRsZXdhcmUgZnVuY3Rpb24nKVxuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZm4gPSBjYWxsYmFja3NbaV07XG5cbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSb3V0ZXIudXNlKCkgcmVxdWlyZXMgYSBtaWRkbGV3YXJlIGZ1bmN0aW9uIGJ1dCBnb3QgYSAnICsgZ2V0dHlwZShmbikpXG4gICAgfVxuXG4gICAgLy8gYWRkIHRoZSBtaWRkbGV3YXJlXG4gICAgZGVidWcoJ3VzZSAlbyAlcycsIHBhdGgsIGZuLm5hbWUgfHwgJzxhbm9ueW1vdXM+JylcblxuICAgIHZhciBsYXllciA9IG5ldyBMYXllcihwYXRoLCB7XG4gICAgICBzZW5zaXRpdmU6IHRoaXMuY2FzZVNlbnNpdGl2ZSxcbiAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICBlbmQ6IGZhbHNlXG4gICAgfSwgZm4pO1xuXG4gICAgbGF5ZXIucm91dGUgPSB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLnN0YWNrLnB1c2gobGF5ZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBSb3V0ZSBmb3IgdGhlIGdpdmVuIHBhdGguXG4gKlxuICogRWFjaCByb3V0ZSBjb250YWlucyBhIHNlcGFyYXRlIG1pZGRsZXdhcmUgc3RhY2sgYW5kIFZFUkIgaGFuZGxlcnMuXG4gKlxuICogU2VlIHRoZSBSb3V0ZSBhcGkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiBhZGRpbmcgaGFuZGxlcnNcbiAqIGFuZCBtaWRkbGV3YXJlIHRvIHJvdXRlcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gcGF0aFxuICogQHJldHVybiB7Um91dGV9XG4gKiBAcHVibGljXG4gKi9cblxucHJvdG8ucm91dGUgPSBmdW5jdGlvbiByb3V0ZShwYXRoKSB7XG4gIHZhciByb3V0ZSA9IG5ldyBSb3V0ZShwYXRoKTtcblxuICB2YXIgbGF5ZXIgPSBuZXcgTGF5ZXIocGF0aCwge1xuICAgIHNlbnNpdGl2ZTogdGhpcy5jYXNlU2Vuc2l0aXZlLFxuICAgIHN0cmljdDogdGhpcy5zdHJpY3QsXG4gICAgZW5kOiB0cnVlXG4gIH0sIHJvdXRlLmRpc3BhdGNoLmJpbmQocm91dGUpKTtcblxuICBsYXllci5yb3V0ZSA9IHJvdXRlO1xuXG4gIHRoaXMuc3RhY2sucHVzaChsYXllcik7XG4gIHJldHVybiByb3V0ZTtcbn07XG5cbi8vIGNyZWF0ZSBSb3V0ZXIjVkVSQiBmdW5jdGlvbnNcbm1ldGhvZHMuY29uY2F0KCdhbGwnKS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCl7XG4gIHByb3RvW21ldGhvZF0gPSBmdW5jdGlvbihwYXRoKXtcbiAgICB2YXIgcm91dGUgPSB0aGlzLnJvdXRlKHBhdGgpXG4gICAgcm91dGVbbWV0aG9kXS5hcHBseShyb3V0ZSwgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn0pO1xuXG4vLyBhcHBlbmQgbWV0aG9kcyB0byBhIGxpc3Qgb2YgbWV0aG9kc1xuZnVuY3Rpb24gYXBwZW5kTWV0aG9kcyhsaXN0LCBhZGRpdGlvbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFkZGl0aW9uLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG1ldGhvZCA9IGFkZGl0aW9uW2ldO1xuICAgIGlmIChsaXN0LmluZGV4T2YobWV0aG9kKSA9PT0gLTEpIHtcbiAgICAgIGxpc3QucHVzaChtZXRob2QpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBnZXQgcGF0aG5hbWUgb2YgcmVxdWVzdFxuZnVuY3Rpb24gZ2V0UGF0aG5hbWUocmVxKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlVXJsKHJlcSkucGF0aG5hbWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLy8gR2V0IGdldCBwcm90b2NvbCArIGhvc3QgZm9yIGEgVVJMXG5mdW5jdGlvbiBnZXRQcm90b2hvc3QodXJsKSB7XG4gIGlmICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJyB8fCB1cmwubGVuZ3RoID09PSAwIHx8IHVybFswXSA9PT0gJy8nKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgdmFyIHNlYXJjaEluZGV4ID0gdXJsLmluZGV4T2YoJz8nKVxuICB2YXIgcGF0aExlbmd0aCA9IHNlYXJjaEluZGV4ICE9PSAtMVxuICAgID8gc2VhcmNoSW5kZXhcbiAgICA6IHVybC5sZW5ndGhcbiAgdmFyIGZxZG5JbmRleCA9IHVybC5zdWJzdHIoMCwgcGF0aExlbmd0aCkuaW5kZXhPZignOi8vJylcblxuICByZXR1cm4gZnFkbkluZGV4ICE9PSAtMVxuICAgID8gdXJsLnN1YnN0cigwLCB1cmwuaW5kZXhPZignLycsIDMgKyBmcWRuSW5kZXgpKVxuICAgIDogdW5kZWZpbmVkXG59XG5cbi8vIGdldCB0eXBlIGZvciBlcnJvciBtZXNzYWdlXG5mdW5jdGlvbiBnZXR0eXBlKG9iaikge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBvYmo7XG5cbiAgaWYgKHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICAvLyBpbnNwZWN0IFtbQ2xhc3NdXSBmb3Igb2JqZWN0c1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopXG4gICAgLnJlcGxhY2Uob2JqZWN0UmVnRXhwLCAnJDEnKTtcbn1cblxuLyoqXG4gKiBNYXRjaCBwYXRoIHRvIGEgbGF5ZXIuXG4gKlxuICogQHBhcmFtIHtMYXllcn0gbGF5ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1hdGNoTGF5ZXIobGF5ZXIsIHBhdGgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gbGF5ZXIubWF0Y2gocGF0aCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBlcnI7XG4gIH1cbn1cblxuLy8gbWVyZ2UgcGFyYW1zIHdpdGggcGFyZW50IHBhcmFtc1xuZnVuY3Rpb24gbWVyZ2VQYXJhbXMocGFyYW1zLCBwYXJlbnQpIHtcbiAgaWYgKHR5cGVvZiBwYXJlbnQgIT09ICdvYmplY3QnIHx8ICFwYXJlbnQpIHtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgLy8gbWFrZSBjb3B5IG9mIHBhcmVudCBmb3IgYmFzZVxuICB2YXIgb2JqID0gbWl4aW4oe30sIHBhcmVudCk7XG5cbiAgLy8gc2ltcGxlIG5vbi1udW1lcmljIG1lcmdpbmdcbiAgaWYgKCEoMCBpbiBwYXJhbXMpIHx8ICEoMCBpbiBwYXJlbnQpKSB7XG4gICAgcmV0dXJuIG1peGluKG9iaiwgcGFyYW1zKTtcbiAgfVxuXG4gIHZhciBpID0gMDtcbiAgdmFyIG8gPSAwO1xuXG4gIC8vIGRldGVybWluZSBudW1lcmljIGdhcHNcbiAgd2hpbGUgKGkgaW4gcGFyYW1zKSB7XG4gICAgaSsrO1xuICB9XG5cbiAgd2hpbGUgKG8gaW4gcGFyZW50KSB7XG4gICAgbysrO1xuICB9XG5cbiAgLy8gb2Zmc2V0IG51bWVyaWMgaW5kaWNlcyBpbiBwYXJhbXMgYmVmb3JlIG1lcmdlXG4gIGZvciAoaS0tOyBpID49IDA7IGktLSkge1xuICAgIHBhcmFtc1tpICsgb10gPSBwYXJhbXNbaV07XG5cbiAgICAvLyBjcmVhdGUgaG9sZXMgZm9yIHRoZSBtZXJnZSB3aGVuIG5lY2Vzc2FyeVxuICAgIGlmIChpIDwgbykge1xuICAgICAgZGVsZXRlIHBhcmFtc1tpXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWl4aW4ob2JqLCBwYXJhbXMpO1xufVxuXG4vLyByZXN0b3JlIG9iaiBwcm9wcyBhZnRlciBmdW5jdGlvblxuZnVuY3Rpb24gcmVzdG9yZShmbiwgb2JqKSB7XG4gIHZhciBwcm9wcyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMik7XG4gIHZhciB2YWxzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAyKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgcHJvcHNbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIHZhbHNbaV0gPSBvYmpbcHJvcHNbaV1dO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAvLyByZXN0b3JlIHZhbHNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmpbcHJvcHNbaV1dID0gdmFsc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuLy8gc2VuZCBhbiBPUFRJT05TIHJlc3BvbnNlXG5mdW5jdGlvbiBzZW5kT3B0aW9uc1Jlc3BvbnNlKHJlcywgb3B0aW9ucywgbmV4dCkge1xuICB0cnkge1xuICAgIHZhciBib2R5ID0gb3B0aW9ucy5qb2luKCcsJyk7XG4gICAgcmVzLnNldCgnQWxsb3cnLCBib2R5KTtcbiAgICByZXMuc2VuZChib2R5KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbmV4dChlcnIpO1xuICB9XG59XG5cbi8vIHdyYXAgYSBmdW5jdGlvblxuZnVuY3Rpb24gd3JhcChvbGQsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBwcm94eSgpIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoICsgMSk7XG5cbiAgICBhcmdzWzBdID0gb2xkO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGFyZ3NbaSArIDFdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cblxuICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9O1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL3JvdXRlci9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gODlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2V4cHJlc3M6cm91dGVyOnJvdXRlJyk7XG52YXIgZmxhdHRlbiA9IHJlcXVpcmUoJ2FycmF5LWZsYXR0ZW4nKTtcbnZhciBMYXllciA9IHJlcXVpcmUoJy4vbGF5ZXInKTtcbnZhciBtZXRob2RzID0gcmVxdWlyZSgnbWV0aG9kcycpO1xuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBSb3V0ZTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGBSb3V0ZWAgd2l0aCB0aGUgZ2l2ZW4gYHBhdGhgLFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gUm91dGUocGF0aCkge1xuICB0aGlzLnBhdGggPSBwYXRoO1xuICB0aGlzLnN0YWNrID0gW107XG5cbiAgZGVidWcoJ25ldyAlbycsIHBhdGgpXG5cbiAgLy8gcm91dGUgaGFuZGxlcnMgZm9yIHZhcmlvdXMgaHR0cCBtZXRob2RzXG4gIHRoaXMubWV0aG9kcyA9IHt9O1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgcm91dGUgaGFuZGxlcyBhIGdpdmVuIG1ldGhvZC5cbiAqIEBwcml2YXRlXG4gKi9cblxuUm91dGUucHJvdG90eXBlLl9oYW5kbGVzX21ldGhvZCA9IGZ1bmN0aW9uIF9oYW5kbGVzX21ldGhvZChtZXRob2QpIHtcbiAgaWYgKHRoaXMubWV0aG9kcy5fYWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbmFtZSA9IG1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmIChuYW1lID09PSAnaGVhZCcgJiYgIXRoaXMubWV0aG9kc1snaGVhZCddKSB7XG4gICAgbmFtZSA9ICdnZXQnO1xuICB9XG5cbiAgcmV0dXJuIEJvb2xlYW4odGhpcy5tZXRob2RzW25hbWVdKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7QXJyYXl9IHN1cHBvcnRlZCBIVFRQIG1ldGhvZHNcbiAqIEBwcml2YXRlXG4gKi9cblxuUm91dGUucHJvdG90eXBlLl9vcHRpb25zID0gZnVuY3Rpb24gX29wdGlvbnMoKSB7XG4gIHZhciBtZXRob2RzID0gT2JqZWN0LmtleXModGhpcy5tZXRob2RzKTtcblxuICAvLyBhcHBlbmQgYXV0b21hdGljIGhlYWRcbiAgaWYgKHRoaXMubWV0aG9kcy5nZXQgJiYgIXRoaXMubWV0aG9kcy5oZWFkKSB7XG4gICAgbWV0aG9kcy5wdXNoKCdoZWFkJyk7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBtYWtlIHVwcGVyIGNhc2VcbiAgICBtZXRob2RzW2ldID0gbWV0aG9kc1tpXS50b1VwcGVyQ2FzZSgpO1xuICB9XG5cbiAgcmV0dXJuIG1ldGhvZHM7XG59O1xuXG4vKipcbiAqIGRpc3BhdGNoIHJlcSwgcmVzIGludG8gdGhpcyByb3V0ZVxuICogQHByaXZhdGVcbiAqL1xuXG5Sb3V0ZS5wcm90b3R5cGUuZGlzcGF0Y2ggPSBmdW5jdGlvbiBkaXNwYXRjaChyZXEsIHJlcywgZG9uZSkge1xuICB2YXIgaWR4ID0gMDtcbiAgdmFyIHN0YWNrID0gdGhpcy5zdGFjaztcbiAgaWYgKHN0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBkb25lKCk7XG4gIH1cblxuICB2YXIgbWV0aG9kID0gcmVxLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICBpZiAobWV0aG9kID09PSAnaGVhZCcgJiYgIXRoaXMubWV0aG9kc1snaGVhZCddKSB7XG4gICAgbWV0aG9kID0gJ2dldCc7XG4gIH1cblxuICByZXEucm91dGUgPSB0aGlzO1xuXG4gIG5leHQoKTtcblxuICBmdW5jdGlvbiBuZXh0KGVycikge1xuICAgIC8vIHNpZ25hbCB0byBleGl0IHJvdXRlXG4gICAgaWYgKGVyciAmJiBlcnIgPT09ICdyb3V0ZScpIHtcbiAgICAgIHJldHVybiBkb25lKCk7XG4gICAgfVxuXG4gICAgLy8gc2lnbmFsIHRvIGV4aXQgcm91dGVyXG4gICAgaWYgKGVyciAmJiBlcnIgPT09ICdyb3V0ZXInKSB7XG4gICAgICByZXR1cm4gZG9uZShlcnIpXG4gICAgfVxuXG4gICAgdmFyIGxheWVyID0gc3RhY2tbaWR4KytdO1xuICAgIGlmICghbGF5ZXIpIHtcbiAgICAgIHJldHVybiBkb25lKGVycik7XG4gICAgfVxuXG4gICAgaWYgKGxheWVyLm1ldGhvZCAmJiBsYXllci5tZXRob2QgIT09IG1ldGhvZCkge1xuICAgICAgcmV0dXJuIG5leHQoZXJyKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyKSB7XG4gICAgICBsYXllci5oYW5kbGVfZXJyb3IoZXJyLCByZXEsIHJlcywgbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxheWVyLmhhbmRsZV9yZXF1ZXN0KHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQWRkIGEgaGFuZGxlciBmb3IgYWxsIEhUVFAgdmVyYnMgdG8gdGhpcyByb3V0ZS5cbiAqXG4gKiBCZWhhdmVzIGp1c3QgbGlrZSBtaWRkbGV3YXJlIGFuZCBjYW4gcmVzcG9uZCBvciBjYWxsIGBuZXh0YFxuICogdG8gY29udGludWUgcHJvY2Vzc2luZy5cbiAqXG4gKiBZb3UgY2FuIHVzZSBtdWx0aXBsZSBgLmFsbGAgY2FsbCB0byBhZGQgbXVsdGlwbGUgaGFuZGxlcnMuXG4gKlxuICogICBmdW5jdGlvbiBjaGVja19zb21ldGhpbmcocmVxLCByZXMsIG5leHQpe1xuICogICAgIG5leHQoKTtcbiAqICAgfTtcbiAqXG4gKiAgIGZ1bmN0aW9uIHZhbGlkYXRlX3VzZXIocmVxLCByZXMsIG5leHQpe1xuICogICAgIG5leHQoKTtcbiAqICAgfTtcbiAqXG4gKiAgIHJvdXRlXG4gKiAgIC5hbGwodmFsaWRhdGVfdXNlcilcbiAqICAgLmFsbChjaGVja19zb21ldGhpbmcpXG4gKiAgIC5nZXQoZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpe1xuICogICAgIHJlcy5zZW5kKCdoZWxsbyB3b3JsZCcpO1xuICogICB9KTtcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBoYW5kbGVyXG4gKiBAcmV0dXJuIHtSb3V0ZX0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblJvdXRlLnByb3RvdHlwZS5hbGwgPSBmdW5jdGlvbiBhbGwoKSB7XG4gIHZhciBoYW5kbGVzID0gZmxhdHRlbihzbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBoYW5kbGUgPSBoYW5kbGVzW2ldO1xuXG4gICAgaWYgKHR5cGVvZiBoYW5kbGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0eXBlID0gdG9TdHJpbmcuY2FsbChoYW5kbGUpO1xuICAgICAgdmFyIG1zZyA9ICdSb3V0ZS5hbGwoKSByZXF1aXJlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGJ1dCBnb3QgYSAnICsgdHlwZVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihtc2cpO1xuICAgIH1cblxuICAgIHZhciBsYXllciA9IExheWVyKCcvJywge30sIGhhbmRsZSk7XG4gICAgbGF5ZXIubWV0aG9kID0gdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5tZXRob2RzLl9hbGwgPSB0cnVlO1xuICAgIHRoaXMuc3RhY2sucHVzaChsYXllcik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbm1ldGhvZHMuZm9yRWFjaChmdW5jdGlvbihtZXRob2Qpe1xuICBSb3V0ZS5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIGhhbmRsZXMgPSBmbGF0dGVuKHNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoYW5kbGUgPSBoYW5kbGVzW2ldO1xuXG4gICAgICBpZiAodHlwZW9mIGhhbmRsZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgdHlwZSA9IHRvU3RyaW5nLmNhbGwoaGFuZGxlKTtcbiAgICAgICAgdmFyIG1zZyA9ICdSb3V0ZS4nICsgbWV0aG9kICsgJygpIHJlcXVpcmVzIGEgY2FsbGJhY2sgZnVuY3Rpb24gYnV0IGdvdCBhICcgKyB0eXBlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfVxuXG4gICAgICBkZWJ1ZygnJXMgJW8nLCBtZXRob2QsIHRoaXMucGF0aClcblxuICAgICAgdmFyIGxheWVyID0gTGF5ZXIoJy8nLCB7fSwgaGFuZGxlKTtcbiAgICAgIGxheWVyLm1ldGhvZCA9IG1ldGhvZDtcblxuICAgICAgdGhpcy5tZXRob2RzW21ldGhvZF0gPSB0cnVlO1xuICAgICAgdGhpcy5zdGFjay5wdXNoKGxheWVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL3JvdXRlci9yb3V0ZS5qc1xuLy8gbW9kdWxlIGlkID0gOTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBwYXRoUmVnZXhwID0gcmVxdWlyZSgncGF0aC10by1yZWdleHAnKTtcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2V4cHJlc3M6cm91dGVyOmxheWVyJyk7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IExheWVyO1xuXG5mdW5jdGlvbiBMYXllcihwYXRoLCBvcHRpb25zLCBmbikge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTGF5ZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBMYXllcihwYXRoLCBvcHRpb25zLCBmbik7XG4gIH1cblxuICBkZWJ1ZygnbmV3ICVvJywgcGF0aClcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHRoaXMuaGFuZGxlID0gZm47XG4gIHRoaXMubmFtZSA9IGZuLm5hbWUgfHwgJzxhbm9ueW1vdXM+JztcbiAgdGhpcy5wYXJhbXMgPSB1bmRlZmluZWQ7XG4gIHRoaXMucGF0aCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5yZWdleHAgPSBwYXRoUmVnZXhwKHBhdGgsIHRoaXMua2V5cyA9IFtdLCBvcHRzKTtcblxuICAvLyBzZXQgZmFzdCBwYXRoIGZsYWdzXG4gIHRoaXMucmVnZXhwLmZhc3Rfc3RhciA9IHBhdGggPT09ICcqJ1xuICB0aGlzLnJlZ2V4cC5mYXN0X3NsYXNoID0gcGF0aCA9PT0gJy8nICYmIG9wdHMuZW5kID09PSBmYWxzZVxufVxuXG4vKipcbiAqIEhhbmRsZSB0aGUgZXJyb3IgZm9yIHRoZSBsYXllci5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICogQHBhcmFtIHtSZXF1ZXN0fSByZXFcbiAqIEBwYXJhbSB7UmVzcG9uc2V9IHJlc1xuICogQHBhcmFtIHtmdW5jdGlvbn0gbmV4dFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuTGF5ZXIucHJvdG90eXBlLmhhbmRsZV9lcnJvciA9IGZ1bmN0aW9uIGhhbmRsZV9lcnJvcihlcnJvciwgcmVxLCByZXMsIG5leHQpIHtcbiAgdmFyIGZuID0gdGhpcy5oYW5kbGU7XG5cbiAgaWYgKGZuLmxlbmd0aCAhPT0gNCkge1xuICAgIC8vIG5vdCBhIHN0YW5kYXJkIGVycm9yIGhhbmRsZXJcbiAgICByZXR1cm4gbmV4dChlcnJvcik7XG4gIH1cblxuICB0cnkge1xuICAgIGZuKGVycm9yLCByZXEsIHJlcywgbmV4dCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIG5leHQoZXJyKTtcbiAgfVxufTtcblxuLyoqXG4gKiBIYW5kbGUgdGhlIHJlcXVlc3QgZm9yIHRoZSBsYXllci5cbiAqXG4gKiBAcGFyYW0ge1JlcXVlc3R9IHJlcVxuICogQHBhcmFtIHtSZXNwb25zZX0gcmVzXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBuZXh0XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5MYXllci5wcm90b3R5cGUuaGFuZGxlX3JlcXVlc3QgPSBmdW5jdGlvbiBoYW5kbGUocmVxLCByZXMsIG5leHQpIHtcbiAgdmFyIGZuID0gdGhpcy5oYW5kbGU7XG5cbiAgaWYgKGZuLmxlbmd0aCA+IDMpIHtcbiAgICAvLyBub3QgYSBzdGFuZGFyZCByZXF1ZXN0IGhhbmRsZXJcbiAgICByZXR1cm4gbmV4dCgpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBmbihyZXEsIHJlcywgbmV4dCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIG5leHQoZXJyKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGlzIHJvdXRlIG1hdGNoZXMgYHBhdGhgLCBpZiBzb1xuICogcG9wdWxhdGUgYC5wYXJhbXNgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuTGF5ZXIucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24gbWF0Y2gocGF0aCkge1xuICB2YXIgbWF0Y2hcblxuICBpZiAocGF0aCAhPSBudWxsKSB7XG4gICAgLy8gZmFzdCBwYXRoIG5vbi1lbmRpbmcgbWF0Y2ggZm9yIC8gKGFueSBwYXRoIG1hdGNoZXMpXG4gICAgaWYgKHRoaXMucmVnZXhwLmZhc3Rfc2xhc2gpIHtcbiAgICAgIHRoaXMucGFyYW1zID0ge31cbiAgICAgIHRoaXMucGF0aCA9ICcnXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIGZhc3QgcGF0aCBmb3IgKiAoZXZlcnl0aGluZyBtYXRjaGVkIGluIGEgcGFyYW0pXG4gICAgaWYgKHRoaXMucmVnZXhwLmZhc3Rfc3Rhcikge1xuICAgICAgdGhpcy5wYXJhbXMgPSB7JzAnOiBkZWNvZGVfcGFyYW0ocGF0aCl9XG4gICAgICB0aGlzLnBhdGggPSBwYXRoXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIG1hdGNoIHRoZSBwYXRoXG4gICAgbWF0Y2ggPSB0aGlzLnJlZ2V4cC5leGVjKHBhdGgpXG4gIH1cblxuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhpcy5wYXJhbXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wYXRoID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHN0b3JlIHZhbHVlc1xuICB0aGlzLnBhcmFtcyA9IHt9O1xuICB0aGlzLnBhdGggPSBtYXRjaFswXVxuXG4gIHZhciBrZXlzID0gdGhpcy5rZXlzO1xuICB2YXIgcGFyYW1zID0gdGhpcy5wYXJhbXM7XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBtYXRjaC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2kgLSAxXTtcbiAgICB2YXIgcHJvcCA9IGtleS5uYW1lO1xuICAgIHZhciB2YWwgPSBkZWNvZGVfcGFyYW0obWF0Y2hbaV0pXG5cbiAgICBpZiAodmFsICE9PSB1bmRlZmluZWQgfHwgIShoYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmFtcywgcHJvcCkpKSB7XG4gICAgICBwYXJhbXNbcHJvcF0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIERlY29kZSBwYXJhbSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGRlY29kZV9wYXJhbSh2YWwpIHtcbiAgaWYgKHR5cGVvZiB2YWwgIT09ICdzdHJpbmcnIHx8IHZhbC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHZhbCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBVUklFcnJvcikge1xuICAgICAgZXJyLm1lc3NhZ2UgPSAnRmFpbGVkIHRvIGRlY29kZSBwYXJhbSBcXCcnICsgdmFsICsgJ1xcJyc7XG4gICAgICBlcnIuc3RhdHVzID0gZXJyLnN0YXR1c0NvZGUgPSA0MDA7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvcm91dGVyL2xheWVyLmpzXG4vLyBtb2R1bGUgaWQgPSA5MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDEzIFJvbWFuIFNodHlsbWFuXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgbWVyZ2UgPSByZXF1aXJlKCd1dGlscy1tZXJnZScpXG52YXIgcGFyc2VVcmwgPSByZXF1aXJlKCdwYXJzZXVybCcpO1xudmFyIHFzID0gcmVxdWlyZSgncXMnKTtcblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcXVlcnkob3B0aW9ucykge1xuICB2YXIgb3B0cyA9IG1lcmdlKHt9LCBvcHRpb25zKVxuICB2YXIgcXVlcnlwYXJzZSA9IHFzLnBhcnNlO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHF1ZXJ5cGFyc2UgPSBvcHRpb25zO1xuICAgIG9wdHMgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAob3B0cyAhPT0gdW5kZWZpbmVkICYmIG9wdHMuYWxsb3dQcm90b3R5cGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBiYWNrLWNvbXBhdCBmb3IgcXMgbW9kdWxlXG4gICAgb3B0cy5hbGxvd1Byb3RvdHlwZXMgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHF1ZXJ5KHJlcSwgcmVzLCBuZXh0KXtcbiAgICBpZiAoIXJlcS5xdWVyeSkge1xuICAgICAgdmFyIHZhbCA9IHBhcnNlVXJsKHJlcSkucXVlcnk7XG4gICAgICByZXEucXVlcnkgPSBxdWVyeXBhcnNlKHZhbCwgb3B0cyk7XG4gICAgfVxuXG4gICAgbmV4dCgpO1xuICB9O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9leHByZXNzL2xpYi9taWRkbGV3YXJlL3F1ZXJ5LmpzXG4vLyBtb2R1bGUgaWQgPSA5MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbi8vIGFsdGVybmF0aXZlIHRvIHVzaW5nIE9iamVjdC5rZXlzIGZvciBvbGQgYnJvd3NlcnNcbmZ1bmN0aW9uIGNvcHlQcm9wcyAoc3JjLCBkc3QpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGRzdFtrZXldID0gc3JjW2tleV1cbiAgfVxufVxuaWYgKEJ1ZmZlci5mcm9tICYmIEJ1ZmZlci5hbGxvYyAmJiBCdWZmZXIuYWxsb2NVbnNhZmUgJiYgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlclxufSBlbHNlIHtcbiAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gcmVxdWlyZSgnYnVmZmVyJylcbiAgY29weVByb3BzKGJ1ZmZlciwgZXhwb3J0cylcbiAgZXhwb3J0cy5CdWZmZXIgPSBTYWZlQnVmZmVyXG59XG5cbmZ1bmN0aW9uIFNhZmVCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIENvcHkgc3RhdGljIG1ldGhvZHMgZnJvbSBCdWZmZXJcbmNvcHlQcm9wcyhCdWZmZXIsIFNhZmVCdWZmZXIpXG5cblNhZmVCdWZmZXIuZnJvbSA9IGZ1bmN0aW9uIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuU2FmZUJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgdmFyIGJ1ZiA9IEJ1ZmZlcihzaXplKVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGJ1Zi5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuZmlsbChmaWxsKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBidWYuZmlsbCgwKVxuICB9XG4gIHJldHVybiBidWZcbn1cblxuU2FmZUJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gQnVmZmVyKHNpemUpXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBidWZmZXIuU2xvd0J1ZmZlcihzaXplKVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3NhZmUtYnVmZmVyL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA5M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIGNvbnRlbnQtZGlzcG9zaXRpb25cbiAqIENvcHlyaWdodChjKSAyMDE0IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnREaXNwb3NpdGlvblxubW9kdWxlLmV4cG9ydHMucGFyc2UgPSBwYXJzZVxuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGJhc2VuYW1lID0gcmVxdWlyZSgncGF0aCcpLmJhc2VuYW1lXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIG5vbiBhdHRyLWNoYXIsICphZnRlciogZW5jb2RlVVJJQ29tcG9uZW50IChpLmUuIG5vdCBpbmNsdWRpbmcgXCIlXCIpXG4gKi9cblxudmFyIEVOQ09ERV9VUkxfQVRUUl9DSEFSX1JFR0VYUCA9IC9bXFx4MDAtXFx4MjBcIicoKSosLzo7PD0+P0BbXFxcXFxcXXt9XFx4N2ZdL2cgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHBlcmNlbnQgZW5jb2RpbmcgZXNjYXBlLlxuICovXG5cbnZhciBIRVhfRVNDQVBFX1JFR0VYUCA9IC8lWzAtOUEtRmEtZl17Mn0vXG52YXIgSEVYX0VTQ0FQRV9SRVBMQUNFX1JFR0VYUCA9IC8lKFswLTlBLUZhLWZdezJ9KS9nXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIG5vbi1sYXRpbjEgY2hhcmFjdGVycy5cbiAqL1xuXG52YXIgTk9OX0xBVElOMV9SRUdFWFAgPSAvW15cXHgyMC1cXHg3ZVxceGEwLVxceGZmXS9nXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHF1b3RlZC1wYWlyIGluIFJGQyAyNjE2XG4gKlxuICogcXVvdGVkLXBhaXIgPSBcIlxcXCIgQ0hBUlxuICogQ0hBUiAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNoYXJhY3RlciAob2N0ZXRzIDAgLSAxMjcpPlxuICovXG5cbnZhciBRRVNDX1JFR0VYUCA9IC9cXFxcKFtcXHUwMDAwLVxcdTAwN2ZdKS9nXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGNoYXJzIHRoYXQgbXVzdCBiZSBxdW90ZWQtcGFpciBpbiBSRkMgMjYxNlxuICovXG5cbnZhciBRVU9URV9SRUdFWFAgPSAvKFtcXFxcXCJdKS9nXG5cbi8qKlxuICogUmVnRXhwIGZvciB2YXJpb3VzIFJGQyAyNjE2IGdyYW1tYXJcbiAqXG4gKiBwYXJhbWV0ZXIgICAgID0gdG9rZW4gXCI9XCIgKCB0b2tlbiB8IHF1b3RlZC1zdHJpbmcgKVxuICogdG9rZW4gICAgICAgICA9IDEqPGFueSBDSEFSIGV4Y2VwdCBDVExzIG9yIHNlcGFyYXRvcnM+XG4gKiBzZXBhcmF0b3JzICAgID0gXCIoXCIgfCBcIilcIiB8IFwiPFwiIHwgXCI+XCIgfCBcIkBcIlxuICogICAgICAgICAgICAgICB8IFwiLFwiIHwgXCI7XCIgfCBcIjpcIiB8IFwiXFxcIiB8IDxcIj5cbiAqICAgICAgICAgICAgICAgfCBcIi9cIiB8IFwiW1wiIHwgXCJdXCIgfCBcIj9cIiB8IFwiPVwiXG4gKiAgICAgICAgICAgICAgIHwgXCJ7XCIgfCBcIn1cIiB8IFNQIHwgSFRcbiAqIHF1b3RlZC1zdHJpbmcgPSAoIDxcIj4gKihxZHRleHQgfCBxdW90ZWQtcGFpciApIDxcIj4gKVxuICogcWR0ZXh0ICAgICAgICA9IDxhbnkgVEVYVCBleGNlcHQgPFwiPj5cbiAqIHF1b3RlZC1wYWlyICAgPSBcIlxcXCIgQ0hBUlxuICogQ0hBUiAgICAgICAgICA9IDxhbnkgVVMtQVNDSUkgY2hhcmFjdGVyIChvY3RldHMgMCAtIDEyNyk+XG4gKiBURVhUICAgICAgICAgID0gPGFueSBPQ1RFVCBleGNlcHQgQ1RMcywgYnV0IGluY2x1ZGluZyBMV1M+XG4gKiBMV1MgICAgICAgICAgID0gW0NSTEZdIDEqKCBTUCB8IEhUIClcbiAqIENSTEYgICAgICAgICAgPSBDUiBMRlxuICogQ1IgICAgICAgICAgICA9IDxVUy1BU0NJSSBDUiwgY2FycmlhZ2UgcmV0dXJuICgxMyk+XG4gKiBMRiAgICAgICAgICAgID0gPFVTLUFTQ0lJIExGLCBsaW5lZmVlZCAoMTApPlxuICogU1AgICAgICAgICAgICA9IDxVUy1BU0NJSSBTUCwgc3BhY2UgKDMyKT5cbiAqIEhUICAgICAgICAgICAgPSA8VVMtQVNDSUkgSFQsIGhvcml6b250YWwtdGFiICg5KT5cbiAqIENUTCAgICAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVyIChvY3RldHMgMCAtIDMxKSBhbmQgREVMICgxMjcpPlxuICogT0NURVQgICAgICAgICA9IDxhbnkgOC1iaXQgc2VxdWVuY2Ugb2YgZGF0YT5cbiAqL1xuXG52YXIgUEFSQU1fUkVHRVhQID0gLztbXFx4MDlcXHgyMF0qKFshIyQlJicqKy4wLTlBLVpeX2BhLXp8fi1dKylbXFx4MDlcXHgyMF0qPVtcXHgwOVxceDIwXSooXCIoPzpbXFx4MjAhXFx4MjMtXFx4NWJcXHg1ZC1cXHg3ZVxceDgwLVxceGZmXXxcXFxcW1xceDIwLVxceDdlXSkqXCJ8WyEjJCUmJyorLjAtOUEtWl5fYGEtenx+LV0rKVtcXHgwOVxceDIwXSovZyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcbnZhciBURVhUX1JFR0VYUCA9IC9eW1xceDIwLVxceDdlXFx4ODAtXFx4ZmZdKyQvXG52YXIgVE9LRU5fUkVHRVhQID0gL15bISMkJSYnKisuMC05QS1aXl9gYS16fH4tXSskL1xuXG4vKipcbiAqIFJlZ0V4cCBmb3IgdmFyaW91cyBSRkMgNTk4NyBncmFtbWFyXG4gKlxuICogZXh0LXZhbHVlICAgICA9IGNoYXJzZXQgIFwiJ1wiIFsgbGFuZ3VhZ2UgXSBcIidcIiB2YWx1ZS1jaGFyc1xuICogY2hhcnNldCAgICAgICA9IFwiVVRGLThcIiAvIFwiSVNPLTg4NTktMVwiIC8gbWltZS1jaGFyc2V0XG4gKiBtaW1lLWNoYXJzZXQgID0gMSptaW1lLWNoYXJzZXRjXG4gKiBtaW1lLWNoYXJzZXRjID0gQUxQSEEgLyBESUdJVFxuICogICAgICAgICAgICAgICAvIFwiIVwiIC8gXCIjXCIgLyBcIiRcIiAvIFwiJVwiIC8gXCImXCJcbiAqICAgICAgICAgICAgICAgLyBcIitcIiAvIFwiLVwiIC8gXCJeXCIgLyBcIl9cIiAvIFwiYFwiXG4gKiAgICAgICAgICAgICAgIC8gXCJ7XCIgLyBcIn1cIiAvIFwiflwiXG4gKiBsYW5ndWFnZSAgICAgID0gKCAyKjNBTFBIQSBbIGV4dGxhbmcgXSApXG4gKiAgICAgICAgICAgICAgIC8gNEFMUEhBXG4gKiAgICAgICAgICAgICAgIC8gNSo4QUxQSEFcbiAqIGV4dGxhbmcgICAgICAgPSAqMyggXCItXCIgM0FMUEhBIClcbiAqIHZhbHVlLWNoYXJzICAgPSAqKCBwY3QtZW5jb2RlZCAvIGF0dHItY2hhciApXG4gKiBwY3QtZW5jb2RlZCAgID0gXCIlXCIgSEVYRElHIEhFWERJR1xuICogYXR0ci1jaGFyICAgICA9IEFMUEhBIC8gRElHSVRcbiAqICAgICAgICAgICAgICAgLyBcIiFcIiAvIFwiI1wiIC8gXCIkXCIgLyBcIiZcIiAvIFwiK1wiIC8gXCItXCIgLyBcIi5cIlxuICogICAgICAgICAgICAgICAvIFwiXlwiIC8gXCJfXCIgLyBcImBcIiAvIFwifFwiIC8gXCJ+XCJcbiAqL1xuXG52YXIgRVhUX1ZBTFVFX1JFR0VYUCA9IC9eKFtBLVphLXowLTkhIyQlJitcXC1eX2B7fX5dKyknKD86W0EtWmEtel17MiwzfSg/Oi1bQS1aYS16XXszfSl7MCwzfXxbQS1aYS16XXs0LDh9fCknKCg/OiVbMC05QS1GYS1mXXsyfXxbQS1aYS16MC05ISMkJisuXl9gfH4tXSkrKSQvXG5cbi8qKlxuICogUmVnRXhwIGZvciB2YXJpb3VzIFJGQyA2MjY2IGdyYW1tYXJcbiAqXG4gKiBkaXNwb3NpdGlvbi10eXBlID0gXCJpbmxpbmVcIiB8IFwiYXR0YWNobWVudFwiIHwgZGlzcC1leHQtdHlwZVxuICogZGlzcC1leHQtdHlwZSAgICA9IHRva2VuXG4gKiBkaXNwb3NpdGlvbi1wYXJtID0gZmlsZW5hbWUtcGFybSB8IGRpc3AtZXh0LXBhcm1cbiAqIGZpbGVuYW1lLXBhcm0gICAgPSBcImZpbGVuYW1lXCIgXCI9XCIgdmFsdWVcbiAqICAgICAgICAgICAgICAgICAgfCBcImZpbGVuYW1lKlwiIFwiPVwiIGV4dC12YWx1ZVxuICogZGlzcC1leHQtcGFybSAgICA9IHRva2VuIFwiPVwiIHZhbHVlXG4gKiAgICAgICAgICAgICAgICAgIHwgZXh0LXRva2VuIFwiPVwiIGV4dC12YWx1ZVxuICogZXh0LXRva2VuICAgICAgICA9IDx0aGUgY2hhcmFjdGVycyBpbiB0b2tlbiwgZm9sbG93ZWQgYnkgXCIqXCI+XG4gKi9cblxudmFyIERJU1BPU0lUSU9OX1RZUEVfUkVHRVhQID0gL14oWyEjJCUmJyorLjAtOUEtWl5fYGEtenx+LV0rKVtcXHgwOVxceDIwXSooPzokfDspLyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcblxuLyoqXG4gKiBDcmVhdGUgYW4gYXR0YWNobWVudCBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZpbGVuYW1lXVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnR5cGU9YXR0YWNobWVudF1cbiAqIEBwYXJhbSB7c3RyaW5nfGJvb2xlYW59IFtvcHRpb25zLmZhbGxiYWNrPXRydWVdXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNvbnRlbnREaXNwb3NpdGlvbiAoZmlsZW5hbWUsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9XG5cbiAgLy8gZ2V0IHR5cGVcbiAgdmFyIHR5cGUgPSBvcHRzLnR5cGUgfHwgJ2F0dGFjaG1lbnQnXG5cbiAgLy8gZ2V0IHBhcmFtZXRlcnNcbiAgdmFyIHBhcmFtcyA9IGNyZWF0ZXBhcmFtcyhmaWxlbmFtZSwgb3B0cy5mYWxsYmFjaylcblxuICAvLyBmb3JtYXQgaW50byBzdHJpbmdcbiAgcmV0dXJuIGZvcm1hdChuZXcgQ29udGVudERpc3Bvc2l0aW9uKHR5cGUsIHBhcmFtcykpXG59XG5cbi8qKlxuICogQ3JlYXRlIHBhcmFtZXRlcnMgb2JqZWN0IGZyb20gZmlsZW5hbWUgYW5kIGZhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmlsZW5hbWVdXG4gKiBAcGFyYW0ge3N0cmluZ3xib29sZWFufSBbZmFsbGJhY2s9dHJ1ZV1cbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZXBhcmFtcyAoZmlsZW5hbWUsIGZhbGxiYWNrKSB7XG4gIGlmIChmaWxlbmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgcGFyYW1zID0ge31cblxuICBpZiAodHlwZW9mIGZpbGVuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpbGVuYW1lIG11c3QgYmUgYSBzdHJpbmcnKVxuICB9XG5cbiAgLy8gZmFsbGJhY2sgZGVmYXVsdHMgdG8gdHJ1ZVxuICBpZiAoZmFsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIGZhbGxiYWNrID0gdHJ1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiBmYWxsYmFjayAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIGZhbGxiYWNrICE9PSAnYm9vbGVhbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmYWxsYmFjayBtdXN0IGJlIGEgc3RyaW5nIG9yIGJvb2xlYW4nKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBmYWxsYmFjayA9PT0gJ3N0cmluZycgJiYgTk9OX0xBVElOMV9SRUdFWFAudGVzdChmYWxsYmFjaykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmYWxsYmFjayBtdXN0IGJlIElTTy04ODU5LTEgc3RyaW5nJylcbiAgfVxuXG4gIC8vIHJlc3RyaWN0IHRvIGZpbGUgYmFzZSBuYW1lXG4gIHZhciBuYW1lID0gYmFzZW5hbWUoZmlsZW5hbWUpXG5cbiAgLy8gZGV0ZXJtaW5lIGlmIG5hbWUgaXMgc3VpdGFibGUgZm9yIHF1b3RlZCBzdHJpbmdcbiAgdmFyIGlzUXVvdGVkU3RyaW5nID0gVEVYVF9SRUdFWFAudGVzdChuYW1lKVxuXG4gIC8vIGdlbmVyYXRlIGZhbGxiYWNrIG5hbWVcbiAgdmFyIGZhbGxiYWNrTmFtZSA9IHR5cGVvZiBmYWxsYmFjayAhPT0gJ3N0cmluZydcbiAgICA/IGZhbGxiYWNrICYmIGdldGxhdGluMShuYW1lKVxuICAgIDogYmFzZW5hbWUoZmFsbGJhY2spXG4gIHZhciBoYXNGYWxsYmFjayA9IHR5cGVvZiBmYWxsYmFja05hbWUgPT09ICdzdHJpbmcnICYmIGZhbGxiYWNrTmFtZSAhPT0gbmFtZVxuXG4gIC8vIHNldCBleHRlbmRlZCBmaWxlbmFtZSBwYXJhbWV0ZXJcbiAgaWYgKGhhc0ZhbGxiYWNrIHx8ICFpc1F1b3RlZFN0cmluZyB8fCBIRVhfRVNDQVBFX1JFR0VYUC50ZXN0KG5hbWUpKSB7XG4gICAgcGFyYW1zWydmaWxlbmFtZSonXSA9IG5hbWVcbiAgfVxuXG4gIC8vIHNldCBmaWxlbmFtZSBwYXJhbWV0ZXJcbiAgaWYgKGlzUXVvdGVkU3RyaW5nIHx8IGhhc0ZhbGxiYWNrKSB7XG4gICAgcGFyYW1zLmZpbGVuYW1lID0gaGFzRmFsbGJhY2tcbiAgICAgID8gZmFsbGJhY2tOYW1lXG4gICAgICA6IG5hbWVcbiAgfVxuXG4gIHJldHVybiBwYXJhbXNcbn1cblxuLyoqXG4gKiBGb3JtYXQgb2JqZWN0IHRvIENvbnRlbnQtRGlzcG9zaXRpb24gaGVhZGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvYmoudHlwZVxuICogQHBhcmFtIHtvYmplY3R9IFtvYmoucGFyYW1ldGVyc11cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZvcm1hdCAob2JqKSB7XG4gIHZhciBwYXJhbWV0ZXJzID0gb2JqLnBhcmFtZXRlcnNcbiAgdmFyIHR5cGUgPSBvYmoudHlwZVxuXG4gIGlmICghdHlwZSB8fCB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycgfHwgIVRPS0VOX1JFR0VYUC50ZXN0KHR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCB0eXBlJylcbiAgfVxuXG4gIC8vIHN0YXJ0IHdpdGggbm9ybWFsaXplZCB0eXBlXG4gIHZhciBzdHJpbmcgPSBTdHJpbmcodHlwZSkudG9Mb3dlckNhc2UoKVxuXG4gIC8vIGFwcGVuZCBwYXJhbWV0ZXJzXG4gIGlmIChwYXJhbWV0ZXJzICYmIHR5cGVvZiBwYXJhbWV0ZXJzID09PSAnb2JqZWN0Jykge1xuICAgIHZhciBwYXJhbVxuICAgIHZhciBwYXJhbXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKS5zb3J0KClcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYXJhbSA9IHBhcmFtc1tpXVxuXG4gICAgICB2YXIgdmFsID0gcGFyYW0uc3Vic3RyKC0xKSA9PT0gJyonXG4gICAgICAgID8gdXN0cmluZyhwYXJhbWV0ZXJzW3BhcmFtXSlcbiAgICAgICAgOiBxc3RyaW5nKHBhcmFtZXRlcnNbcGFyYW1dKVxuXG4gICAgICBzdHJpbmcgKz0gJzsgJyArIHBhcmFtICsgJz0nICsgdmFsXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0cmluZ1xufVxuXG4vKipcbiAqIERlY29kZSBhIFJGQyA2OTg3IGZpZWxkIHZhbHVlIChncmFjZWZ1bGx5KS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBkZWNvZGVmaWVsZCAoc3RyKSB7XG4gIHZhciBtYXRjaCA9IEVYVF9WQUxVRV9SRUdFWFAuZXhlYyhzdHIpXG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgZXh0ZW5kZWQgZmllbGQgdmFsdWUnKVxuICB9XG5cbiAgdmFyIGNoYXJzZXQgPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gIHZhciBlbmNvZGVkID0gbWF0Y2hbMl1cbiAgdmFyIHZhbHVlXG5cbiAgLy8gdG8gYmluYXJ5IHN0cmluZ1xuICB2YXIgYmluYXJ5ID0gZW5jb2RlZC5yZXBsYWNlKEhFWF9FU0NBUEVfUkVQTEFDRV9SRUdFWFAsIHBkZWNvZGUpXG5cbiAgc3dpdGNoIChjaGFyc2V0KSB7XG4gICAgY2FzZSAnaXNvLTg4NTktMSc6XG4gICAgICB2YWx1ZSA9IGdldGxhdGluMShiaW5hcnkpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgIHZhbHVlID0gbmV3IEJ1ZmZlcihiaW5hcnksICdiaW5hcnknKS50b1N0cmluZygndXRmOCcpXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1bnN1cHBvcnRlZCBjaGFyc2V0IGluIGV4dGVuZGVkIGZpZWxkJylcbiAgfVxuXG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIEdldCBJU08tODg1OS0xIHZlcnNpb24gb2Ygc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldGxhdGluMSAodmFsKSB7XG4gIC8vIHNpbXBsZSBVbmljb2RlIC0+IElTTy04ODU5LTEgdHJhbnNmb3JtYXRpb25cbiAgcmV0dXJuIFN0cmluZyh2YWwpLnJlcGxhY2UoTk9OX0xBVElOMV9SRUdFWFAsICc/Jylcbn1cblxuLyoqXG4gKiBQYXJzZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7b2JqZWN0fVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2UgKHN0cmluZykge1xuICBpZiAoIXN0cmluZyB8fCB0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHN0cmluZyBpcyByZXF1aXJlZCcpXG4gIH1cblxuICB2YXIgbWF0Y2ggPSBESVNQT1NJVElPTl9UWVBFX1JFR0VYUC5leGVjKHN0cmluZylcblxuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCB0eXBlIGZvcm1hdCcpXG4gIH1cblxuICAvLyBub3JtYWxpemUgdHlwZVxuICB2YXIgaW5kZXggPSBtYXRjaFswXS5sZW5ndGhcbiAgdmFyIHR5cGUgPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG5cbiAgdmFyIGtleVxuICB2YXIgbmFtZXMgPSBbXVxuICB2YXIgcGFyYW1zID0ge31cbiAgdmFyIHZhbHVlXG5cbiAgLy8gY2FsY3VsYXRlIGluZGV4IHRvIHN0YXJ0IGF0XG4gIGluZGV4ID0gUEFSQU1fUkVHRVhQLmxhc3RJbmRleCA9IG1hdGNoWzBdLnN1YnN0cigtMSkgPT09ICc7J1xuICAgID8gaW5kZXggLSAxXG4gICAgOiBpbmRleFxuXG4gIC8vIG1hdGNoIHBhcmFtZXRlcnNcbiAgd2hpbGUgKChtYXRjaCA9IFBBUkFNX1JFR0VYUC5leGVjKHN0cmluZykpKSB7XG4gICAgaWYgKG1hdGNoLmluZGV4ICE9PSBpbmRleCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXJhbWV0ZXIgZm9ybWF0JylcbiAgICB9XG5cbiAgICBpbmRleCArPSBtYXRjaFswXS5sZW5ndGhcbiAgICBrZXkgPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgdmFsdWUgPSBtYXRjaFsyXVxuXG4gICAgaWYgKG5hbWVzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ludmFsaWQgZHVwbGljYXRlIHBhcmFtZXRlcicpXG4gICAgfVxuXG4gICAgbmFtZXMucHVzaChrZXkpXG5cbiAgICBpZiAoa2V5LmluZGV4T2YoJyonKSArIDEgPT09IGtleS5sZW5ndGgpIHtcbiAgICAgIC8vIGRlY29kZSBleHRlbmRlZCB2YWx1ZVxuICAgICAga2V5ID0ga2V5LnNsaWNlKDAsIC0xKVxuICAgICAgdmFsdWUgPSBkZWNvZGVmaWVsZCh2YWx1ZSlcblxuICAgICAgLy8gb3ZlcndyaXRlIGV4aXN0aW5nIHZhbHVlXG4gICAgICBwYXJhbXNba2V5XSA9IHZhbHVlXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcGFyYW1zW2tleV0gPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmICh2YWx1ZVswXSA9PT0gJ1wiJykge1xuICAgICAgLy8gcmVtb3ZlIHF1b3RlcyBhbmQgZXNjYXBlc1xuICAgICAgdmFsdWUgPSB2YWx1ZVxuICAgICAgICAuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCAtIDIpXG4gICAgICAgIC5yZXBsYWNlKFFFU0NfUkVHRVhQLCAnJDEnKVxuICAgIH1cblxuICAgIHBhcmFtc1trZXldID0gdmFsdWVcbiAgfVxuXG4gIGlmIChpbmRleCAhPT0gLTEgJiYgaW5kZXggIT09IHN0cmluZy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHBhcmFtZXRlciBmb3JtYXQnKVxuICB9XG5cbiAgcmV0dXJuIG5ldyBDb250ZW50RGlzcG9zaXRpb24odHlwZSwgcGFyYW1zKVxufVxuXG4vKipcbiAqIFBlcmNlbnQgZGVjb2RlIGEgc2luZ2xlIGNoYXJhY3Rlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge3N0cmluZ30gaGV4XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwZGVjb2RlIChzdHIsIGhleCkge1xuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChoZXgsIDE2KSlcbn1cblxuLyoqXG4gKiBQZXJjZW50IGVuY29kZSBhIHNpbmdsZSBjaGFyYWN0ZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNoYXJcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBlbmNvZGUgKGNoYXIpIHtcbiAgdmFyIGhleCA9IFN0cmluZyhjaGFyKVxuICAgIC5jaGFyQ29kZUF0KDApXG4gICAgLnRvU3RyaW5nKDE2KVxuICAgIC50b1VwcGVyQ2FzZSgpXG4gIHJldHVybiBoZXgubGVuZ3RoID09PSAxXG4gICAgPyAnJTAnICsgaGV4XG4gICAgOiAnJScgKyBoZXhcbn1cblxuLyoqXG4gKiBRdW90ZSBhIHN0cmluZyBmb3IgSFRUUC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBxc3RyaW5nICh2YWwpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyh2YWwpXG5cbiAgcmV0dXJuICdcIicgKyBzdHIucmVwbGFjZShRVU9URV9SRUdFWFAsICdcXFxcJDEnKSArICdcIidcbn1cblxuLyoqXG4gKiBFbmNvZGUgYSBVbmljb2RlIHN0cmluZyBmb3IgSFRUUCAoUkZDIDU5ODcpLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHVzdHJpbmcgKHZhbCkge1xuICB2YXIgc3RyID0gU3RyaW5nKHZhbClcblxuICAvLyBwZXJjZW50IGVuY29kZSBhcyBVVEYtOFxuICB2YXIgZW5jb2RlZCA9IGVuY29kZVVSSUNvbXBvbmVudChzdHIpXG4gICAgLnJlcGxhY2UoRU5DT0RFX1VSTF9BVFRSX0NIQVJfUkVHRVhQLCBwZW5jb2RlKVxuXG4gIHJldHVybiAnVVRGLThcXCdcXCcnICsgZW5jb2RlZFxufVxuXG4vKipcbiAqIENsYXNzIGZvciBwYXJzZWQgQ29udGVudC1EaXNwb3NpdGlvbiBoZWFkZXIgZm9yIHY4IG9wdGltaXphdGlvblxuICovXG5cbmZ1bmN0aW9uIENvbnRlbnREaXNwb3NpdGlvbiAodHlwZSwgcGFyYW1ldGVycykge1xuICB0aGlzLnR5cGUgPSB0eXBlXG4gIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnNcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb250ZW50LWRpc3Bvc2l0aW9uL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA5NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIGV0YWdcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZXRhZ1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKVxudmFyIFN0YXRzID0gcmVxdWlyZSgnZnMnKS5TdGF0c1xuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcblxuLyoqXG4gKiBHZW5lcmF0ZSBhbiBlbnRpdHkgdGFnLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfHN0cmluZ30gZW50aXR5XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGVudGl0eXRhZyAoZW50aXR5KSB7XG4gIGlmIChlbnRpdHkubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gZmFzdC1wYXRoIGVtcHR5XG4gICAgcmV0dXJuICdcIjAtMmptajdsNXJTdzB5VmIvdmxXQVlrSy9ZQndrXCInXG4gIH1cblxuICAvLyBjb21wdXRlIGhhc2ggb2YgZW50aXR5XG4gIHZhciBoYXNoID0gY3J5cHRvXG4gICAgLmNyZWF0ZUhhc2goJ3NoYTEnKVxuICAgIC51cGRhdGUoZW50aXR5LCAndXRmOCcpXG4gICAgLmRpZ2VzdCgnYmFzZTY0JylcbiAgICAuc3Vic3RyaW5nKDAsIDI3KVxuXG4gIC8vIGNvbXB1dGUgbGVuZ3RoIG9mIGVudGl0eVxuICB2YXIgbGVuID0gdHlwZW9mIGVudGl0eSA9PT0gJ3N0cmluZydcbiAgICA/IEJ1ZmZlci5ieXRlTGVuZ3RoKGVudGl0eSwgJ3V0ZjgnKVxuICAgIDogZW50aXR5Lmxlbmd0aFxuXG4gIHJldHVybiAnXCInICsgbGVuLnRvU3RyaW5nKDE2KSArICctJyArIGhhc2ggKyAnXCInXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgc2ltcGxlIEVUYWcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfFN0YXRzfSBlbnRpdHlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMud2Vha11cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBldGFnIChlbnRpdHksIG9wdGlvbnMpIHtcbiAgaWYgKGVudGl0eSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgZW50aXR5IGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIHN1cHBvcnQgZnMuU3RhdHMgb2JqZWN0XG4gIHZhciBpc1N0YXRzID0gaXNzdGF0cyhlbnRpdHkpXG4gIHZhciB3ZWFrID0gb3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy53ZWFrID09PSAnYm9vbGVhbidcbiAgICA/IG9wdGlvbnMud2Vha1xuICAgIDogaXNTdGF0c1xuXG4gIC8vIHZhbGlkYXRlIGFyZ3VtZW50XG4gIGlmICghaXNTdGF0cyAmJiB0eXBlb2YgZW50aXR5ICE9PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzQnVmZmVyKGVudGl0eSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBlbnRpdHkgbXVzdCBiZSBzdHJpbmcsIEJ1ZmZlciwgb3IgZnMuU3RhdHMnKVxuICB9XG5cbiAgLy8gZ2VuZXJhdGUgZW50aXR5IHRhZ1xuICB2YXIgdGFnID0gaXNTdGF0c1xuICAgID8gc3RhdHRhZyhlbnRpdHkpXG4gICAgOiBlbnRpdHl0YWcoZW50aXR5KVxuXG4gIHJldHVybiB3ZWFrXG4gICAgPyAnVy8nICsgdGFnXG4gICAgOiB0YWdcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgb2JqZWN0IGlzIGEgU3RhdHMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc3N0YXRzIChvYmopIHtcbiAgLy8gZ2VudWluZSBmcy5TdGF0c1xuICBpZiAodHlwZW9mIFN0YXRzID09PSAnZnVuY3Rpb24nICYmIG9iaiBpbnN0YW5jZW9mIFN0YXRzKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8vIHF1YWNrIHF1YWNrXG4gIHJldHVybiBvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiZcbiAgICAnY3RpbWUnIGluIG9iaiAmJiB0b1N0cmluZy5jYWxsKG9iai5jdGltZSkgPT09ICdbb2JqZWN0IERhdGVdJyAmJlxuICAgICdtdGltZScgaW4gb2JqICYmIHRvU3RyaW5nLmNhbGwob2JqLm10aW1lKSA9PT0gJ1tvYmplY3QgRGF0ZV0nICYmXG4gICAgJ2lubycgaW4gb2JqICYmIHR5cGVvZiBvYmouaW5vID09PSAnbnVtYmVyJyAmJlxuICAgICdzaXplJyBpbiBvYmogJiYgdHlwZW9mIG9iai5zaXplID09PSAnbnVtYmVyJ1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGEgdGFnIGZvciBhIHN0YXQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHN0YXRcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3RhdHRhZyAoc3RhdCkge1xuICB2YXIgbXRpbWUgPSBzdGF0Lm10aW1lLmdldFRpbWUoKS50b1N0cmluZygxNilcbiAgdmFyIHNpemUgPSBzdGF0LnNpemUudG9TdHJpbmcoMTYpXG5cbiAgcmV0dXJuICdcIicgKyBzaXplICsgJy0nICsgbXRpbWUgKyAnXCInXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvZXRhZy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gOTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBmcmVzaFxuICogQ29weXJpZ2h0KGMpIDIwMTIgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDE2LTIwMTcgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIFJlZ0V4cCB0byBjaGVjayBmb3Igbm8tY2FjaGUgdG9rZW4gaW4gQ2FjaGUtQ29udHJvbC5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIENBQ0hFX0NPTlRST0xfTk9fQ0FDSEVfUkVHRVhQID0gLyg/Ol58LClcXHMqP25vLWNhY2hlXFxzKj8oPzosfCQpL1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnJlc2hcblxuLyoqXG4gKiBDaGVjayBmcmVzaG5lc3Mgb2YgdGhlIHJlc3BvbnNlIHVzaW5nIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGhlYWRlcnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlcUhlYWRlcnNcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXNIZWFkZXJzXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZyZXNoIChyZXFIZWFkZXJzLCByZXNIZWFkZXJzKSB7XG4gIC8vIGZpZWxkc1xuICB2YXIgbW9kaWZpZWRTaW5jZSA9IHJlcUhlYWRlcnNbJ2lmLW1vZGlmaWVkLXNpbmNlJ11cbiAgdmFyIG5vbmVNYXRjaCA9IHJlcUhlYWRlcnNbJ2lmLW5vbmUtbWF0Y2gnXVxuXG4gIC8vIHVuY29uZGl0aW9uYWwgcmVxdWVzdFxuICBpZiAoIW1vZGlmaWVkU2luY2UgJiYgIW5vbmVNYXRjaCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gQWx3YXlzIHJldHVybiBzdGFsZSB3aGVuIENhY2hlLUNvbnRyb2w6IG5vLWNhY2hlXG4gIC8vIHRvIHN1cHBvcnQgZW5kLXRvLWVuZCByZWxvYWQgcmVxdWVzdHNcbiAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI2MTYjc2VjdGlvbi0xNC45LjRcbiAgdmFyIGNhY2hlQ29udHJvbCA9IHJlcUhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXVxuICBpZiAoY2FjaGVDb250cm9sICYmIENBQ0hFX0NPTlRST0xfTk9fQ0FDSEVfUkVHRVhQLnRlc3QoY2FjaGVDb250cm9sKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLy8gaWYtbm9uZS1tYXRjaFxuICBpZiAobm9uZU1hdGNoICYmIG5vbmVNYXRjaCAhPT0gJyonKSB7XG4gICAgdmFyIGV0YWcgPSByZXNIZWFkZXJzWydldGFnJ11cblxuICAgIGlmICghZXRhZykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgdmFyIGV0YWdTdGFsZSA9IHRydWVcbiAgICB2YXIgbWF0Y2hlcyA9IHBhcnNlVG9rZW5MaXN0KG5vbmVNYXRjaClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBtYXRjaCA9IG1hdGNoZXNbaV1cbiAgICAgIGlmIChtYXRjaCA9PT0gZXRhZyB8fCBtYXRjaCA9PT0gJ1cvJyArIGV0YWcgfHwgJ1cvJyArIG1hdGNoID09PSBldGFnKSB7XG4gICAgICAgIGV0YWdTdGFsZSA9IGZhbHNlXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV0YWdTdGFsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLy8gaWYtbW9kaWZpZWQtc2luY2VcbiAgaWYgKG1vZGlmaWVkU2luY2UpIHtcbiAgICB2YXIgbGFzdE1vZGlmaWVkID0gcmVzSGVhZGVyc1snbGFzdC1tb2RpZmllZCddXG4gICAgdmFyIG1vZGlmaWVkU3RhbGUgPSAhbGFzdE1vZGlmaWVkIHx8ICEocGFyc2VIdHRwRGF0ZShsYXN0TW9kaWZpZWQpIDw9IHBhcnNlSHR0cERhdGUobW9kaWZpZWRTaW5jZSkpXG5cbiAgICBpZiAobW9kaWZpZWRTdGFsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBIVFRQIERhdGUgaW50byBhIG51bWJlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0ZVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZUh0dHBEYXRlIChkYXRlKSB7XG4gIHZhciB0aW1lc3RhbXAgPSBkYXRlICYmIERhdGUucGFyc2UoZGF0ZSlcblxuICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZ3VhcmQgYWdhaW5zdCBkYXRlLmpzIERhdGUucGFyc2UgcGF0Y2hpbmdcbiAgcmV0dXJuIHR5cGVvZiB0aW1lc3RhbXAgPT09ICdudW1iZXInXG4gICAgPyB0aW1lc3RhbXBcbiAgICA6IE5hTlxufVxuXG4vKipcbiAqIFBhcnNlIGEgSFRUUCB0b2tlbiBsaXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VUb2tlbkxpc3QgKHN0cikge1xuICB2YXIgZW5kID0gMFxuICB2YXIgbGlzdCA9IFtdXG4gIHZhciBzdGFydCA9IDBcblxuICAvLyBnYXRoZXIgdG9rZW5zXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBzd2l0Y2ggKHN0ci5jaGFyQ29kZUF0KGkpKSB7XG4gICAgICBjYXNlIDB4MjA6IC8qICAgKi9cbiAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICAgICAgICBzdGFydCA9IGVuZCA9IGkgKyAxXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgMHgyYzogLyogLCAqL1xuICAgICAgICBsaXN0LnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgZW5kKSlcbiAgICAgICAgc3RhcnQgPSBlbmQgPSBpICsgMVxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZW5kID0gaSArIDFcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyBmaW5hbCB0b2tlblxuICBsaXN0LnB1c2goc3RyLnN1YnN0cmluZyhzdGFydCwgZW5kKSlcblxuICByZXR1cm4gbGlzdFxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2ZyZXNoL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA5NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIHJhbmdlLXBhcnNlclxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTUtMjAxNiBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByYW5nZVBhcnNlclxuXG4vKipcbiAqIFBhcnNlIFwiUmFuZ2VcIiBoZWFkZXIgYHN0cmAgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIGZpbGUgYHNpemVgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBzaXplXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiByYW5nZVBhcnNlciAoc2l6ZSwgc3RyLCBvcHRpb25zKSB7XG4gIHZhciBpbmRleCA9IHN0ci5pbmRleE9mKCc9JylcblxuICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgcmV0dXJuIC0yXG4gIH1cblxuICAvLyBzcGxpdCB0aGUgcmFuZ2Ugc3RyaW5nXG4gIHZhciBhcnIgPSBzdHIuc2xpY2UoaW5kZXggKyAxKS5zcGxpdCgnLCcpXG4gIHZhciByYW5nZXMgPSBbXVxuXG4gIC8vIGFkZCByYW5nZXMgdHlwZVxuICByYW5nZXMudHlwZSA9IHN0ci5zbGljZSgwLCBpbmRleClcblxuICAvLyBwYXJzZSBhbGwgcmFuZ2VzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJhbmdlID0gYXJyW2ldLnNwbGl0KCctJylcbiAgICB2YXIgc3RhcnQgPSBwYXJzZUludChyYW5nZVswXSwgMTApXG4gICAgdmFyIGVuZCA9IHBhcnNlSW50KHJhbmdlWzFdLCAxMClcblxuICAgIC8vIC1ubm5cbiAgICBpZiAoaXNOYU4oc3RhcnQpKSB7XG4gICAgICBzdGFydCA9IHNpemUgLSBlbmRcbiAgICAgIGVuZCA9IHNpemUgLSAxXG4gICAgLy8gbm5uLVxuICAgIH0gZWxzZSBpZiAoaXNOYU4oZW5kKSkge1xuICAgICAgZW5kID0gc2l6ZSAtIDFcbiAgICB9XG5cbiAgICAvLyBsaW1pdCBsYXN0LWJ5dGUtcG9zIHRvIGN1cnJlbnQgbGVuZ3RoXG4gICAgaWYgKGVuZCA+IHNpemUgLSAxKSB7XG4gICAgICBlbmQgPSBzaXplIC0gMVxuICAgIH1cblxuICAgIC8vIGludmFsaWQgb3IgdW5zYXRpc2lmaWFibGVcbiAgICBpZiAoaXNOYU4oc3RhcnQpIHx8IGlzTmFOKGVuZCkgfHwgc3RhcnQgPiBlbmQgfHwgc3RhcnQgPCAwKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIGFkZCByYW5nZVxuICAgIHJhbmdlcy5wdXNoKHtcbiAgICAgIHN0YXJ0OiBzdGFydCxcbiAgICAgIGVuZDogZW5kXG4gICAgfSlcbiAgfVxuXG4gIGlmIChyYW5nZXMubGVuZ3RoIDwgMSkge1xuICAgIC8vIHVuc2F0aXNpZmlhYmxlXG4gICAgcmV0dXJuIC0xXG4gIH1cblxuICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmNvbWJpbmVcbiAgICA/IGNvbWJpbmVSYW5nZXMocmFuZ2VzKVxuICAgIDogcmFuZ2VzXG59XG5cbi8qKlxuICogQ29tYmluZSBvdmVybGFwcGluZyAmIGFkamFjZW50IHJhbmdlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29tYmluZVJhbmdlcyAocmFuZ2VzKSB7XG4gIHZhciBvcmRlcmVkID0gcmFuZ2VzLm1hcChtYXBXaXRoSW5kZXgpLnNvcnQoc29ydEJ5UmFuZ2VTdGFydClcblxuICBmb3IgKHZhciBqID0gMCwgaSA9IDE7IGkgPCBvcmRlcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHJhbmdlID0gb3JkZXJlZFtpXVxuICAgIHZhciBjdXJyZW50ID0gb3JkZXJlZFtqXVxuXG4gICAgaWYgKHJhbmdlLnN0YXJ0ID4gY3VycmVudC5lbmQgKyAxKSB7XG4gICAgICAvLyBuZXh0IHJhbmdlXG4gICAgICBvcmRlcmVkWysral0gPSByYW5nZVxuICAgIH0gZWxzZSBpZiAocmFuZ2UuZW5kID4gY3VycmVudC5lbmQpIHtcbiAgICAgIC8vIGV4dGVuZCByYW5nZVxuICAgICAgY3VycmVudC5lbmQgPSByYW5nZS5lbmRcbiAgICAgIGN1cnJlbnQuaW5kZXggPSBNYXRoLm1pbihjdXJyZW50LmluZGV4LCByYW5nZS5pbmRleClcbiAgICB9XG4gIH1cblxuICAvLyB0cmltIG9yZGVyZWQgYXJyYXlcbiAgb3JkZXJlZC5sZW5ndGggPSBqICsgMVxuXG4gIC8vIGdlbmVyYXRlIGNvbWJpbmVkIHJhbmdlXG4gIHZhciBjb21iaW5lZCA9IG9yZGVyZWQuc29ydChzb3J0QnlSYW5nZUluZGV4KS5tYXAobWFwV2l0aG91dEluZGV4KVxuXG4gIC8vIGNvcHkgcmFuZ2VzIHR5cGVcbiAgY29tYmluZWQudHlwZSA9IHJhbmdlcy50eXBlXG5cbiAgcmV0dXJuIGNvbWJpbmVkXG59XG5cbi8qKlxuICogTWFwIGZ1bmN0aW9uIHRvIGFkZCBpbmRleCB2YWx1ZSB0byByYW5nZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1hcFdpdGhJbmRleCAocmFuZ2UsIGluZGV4KSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHJhbmdlLnN0YXJ0LFxuICAgIGVuZDogcmFuZ2UuZW5kLFxuICAgIGluZGV4OiBpbmRleFxuICB9XG59XG5cbi8qKlxuICogTWFwIGZ1bmN0aW9uIHRvIHJlbW92ZSBpbmRleCB2YWx1ZSBmcm9tIHJhbmdlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbWFwV2l0aG91dEluZGV4IChyYW5nZSkge1xuICByZXR1cm4ge1xuICAgIHN0YXJ0OiByYW5nZS5zdGFydCxcbiAgICBlbmQ6IHJhbmdlLmVuZFxuICB9XG59XG5cbi8qKlxuICogU29ydCBmdW5jdGlvbiB0byBzb3J0IHJhbmdlcyBieSBpbmRleC5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc29ydEJ5UmFuZ2VJbmRleCAoYSwgYikge1xuICByZXR1cm4gYS5pbmRleCAtIGIuaW5kZXhcbn1cblxuLyoqXG4gKiBTb3J0IGZ1bmN0aW9uIHRvIHNvcnQgcmFuZ2VzIGJ5IHN0YXJ0IHBvc2l0aW9uLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzb3J0QnlSYW5nZVN0YXJ0IChhLCBiKSB7XG4gIHJldHVybiBhLnN0YXJ0IC0gYi5zdGFydFxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3JhbmdlLXBhcnNlci9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gOTdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBwcm94eS1hZGRyXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE2IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHByb3h5YWRkclxubW9kdWxlLmV4cG9ydHMuYWxsID0gYWxsYWRkcnNcbm1vZHVsZS5leHBvcnRzLmNvbXBpbGUgPSBjb21waWxlXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGZvcndhcmRlZCA9IHJlcXVpcmUoJ2ZvcndhcmRlZCcpXG52YXIgaXBhZGRyID0gcmVxdWlyZSgnaXBhZGRyLmpzJylcblxuLyoqXG4gKiBWYXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBESUdJVF9SRUdFWFAgPSAvXlswLTldKyQvXG52YXIgaXNpcCA9IGlwYWRkci5pc1ZhbGlkXG52YXIgcGFyc2VpcCA9IGlwYWRkci5wYXJzZVxuXG4vKipcbiAqIFByZS1kZWZpbmVkIElQIHJhbmdlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIElQX1JBTkdFUyA9IHtcbiAgbGlua2xvY2FsOiBbJzE2OS4yNTQuMC4wLzE2JywgJ2ZlODA6Oi8xMCddLFxuICBsb29wYmFjazogWycxMjcuMC4wLjEvOCcsICc6OjEvMTI4J10sXG4gIHVuaXF1ZWxvY2FsOiBbJzEwLjAuMC4wLzgnLCAnMTcyLjE2LjAuMC8xMicsICcxOTIuMTY4LjAuMC8xNicsICdmYzAwOjovNyddXG59XG5cbi8qKlxuICogR2V0IGFsbCBhZGRyZXNzZXMgaW4gdGhlIHJlcXVlc3QsIG9wdGlvbmFsbHkgc3RvcHBpbmdcbiAqIGF0IHRoZSBmaXJzdCB1bnRydXN0ZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlcXVlc3RcbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXl8U3RyaW5nfSBbdHJ1c3RdXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gYWxsYWRkcnMgKHJlcSwgdHJ1c3QpIHtcbiAgLy8gZ2V0IGFkZHJlc3Nlc1xuICB2YXIgYWRkcnMgPSBmb3J3YXJkZWQocmVxKVxuXG4gIGlmICghdHJ1c3QpIHtcbiAgICAvLyBSZXR1cm4gYWxsIGFkZHJlc3Nlc1xuICAgIHJldHVybiBhZGRyc1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0cnVzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRydXN0ID0gY29tcGlsZSh0cnVzdClcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWRkcnMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgaWYgKHRydXN0KGFkZHJzW2ldLCBpKSkgY29udGludWVcblxuICAgIGFkZHJzLmxlbmd0aCA9IGkgKyAxXG4gIH1cblxuICByZXR1cm4gYWRkcnNcbn1cblxuLyoqXG4gKiBDb21waWxlIGFyZ3VtZW50IGludG8gdHJ1c3QgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IHZhbFxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb21waWxlICh2YWwpIHtcbiAgaWYgKCF2YWwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBpcyByZXF1aXJlZCcpXG4gIH1cblxuICB2YXIgdHJ1c3RcblxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB0cnVzdCA9IFt2YWxdXG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgdHJ1c3QgPSB2YWwuc2xpY2UoKVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Vuc3VwcG9ydGVkIHRydXN0IGFyZ3VtZW50JylcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJ1c3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YWwgPSB0cnVzdFtpXVxuXG4gICAgaWYgKCFJUF9SQU5HRVMuaGFzT3duUHJvcGVydHkodmFsKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBTcGxpY2UgaW4gcHJlLWRlZmluZWQgcmFuZ2VcbiAgICB2YWwgPSBJUF9SQU5HRVNbdmFsXVxuICAgIHRydXN0LnNwbGljZS5hcHBseSh0cnVzdCwgW2ksIDFdLmNvbmNhdCh2YWwpKVxuICAgIGkgKz0gdmFsLmxlbmd0aCAtIDFcbiAgfVxuXG4gIHJldHVybiBjb21waWxlVHJ1c3QoY29tcGlsZVJhbmdlU3VibmV0cyh0cnVzdCkpXG59XG5cbi8qKlxuICogQ29tcGlsZSBgYXJyYCBlbGVtZW50cyBpbnRvIHJhbmdlIHN1Ym5ldHMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJyXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbXBpbGVSYW5nZVN1Ym5ldHMgKGFycikge1xuICB2YXIgcmFuZ2VTdWJuZXRzID0gbmV3IEFycmF5KGFyci5sZW5ndGgpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICByYW5nZVN1Ym5ldHNbaV0gPSBwYXJzZWlwTm90YXRpb24oYXJyW2ldKVxuICB9XG5cbiAgcmV0dXJuIHJhbmdlU3VibmV0c1xufVxuXG4vKipcbiAqIENvbXBpbGUgcmFuZ2Ugc3VibmV0IGFycmF5IGludG8gdHJ1c3QgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcmFuZ2VTdWJuZXRzXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGNvbXBpbGVUcnVzdCAocmFuZ2VTdWJuZXRzKSB7XG4gIC8vIFJldHVybiBvcHRpbWl6ZWQgZnVuY3Rpb24gYmFzZWQgb24gbGVuZ3RoXG4gIHZhciBsZW4gPSByYW5nZVN1Ym5ldHMubGVuZ3RoXG4gIHJldHVybiBsZW4gPT09IDBcbiAgICA/IHRydXN0Tm9uZVxuICAgIDogbGVuID09PSAxXG4gICAgICA/IHRydXN0U2luZ2xlKHJhbmdlU3VibmV0c1swXSlcbiAgICAgIDogdHJ1c3RNdWx0aShyYW5nZVN1Ym5ldHMpXG59XG5cbi8qKlxuICogUGFyc2UgSVAgbm90YXRpb24gc3RyaW5nIGludG8gcmFuZ2Ugc3VibmV0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBub3RlXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlaXBOb3RhdGlvbiAobm90ZSkge1xuICB2YXIgcG9zID0gbm90ZS5sYXN0SW5kZXhPZignLycpXG4gIHZhciBzdHIgPSBwb3MgIT09IC0xXG4gICAgPyBub3RlLnN1YnN0cmluZygwLCBwb3MpXG4gICAgOiBub3RlXG5cbiAgaWYgKCFpc2lwKHN0cikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIElQIGFkZHJlc3M6ICcgKyBzdHIpXG4gIH1cblxuICB2YXIgaXAgPSBwYXJzZWlwKHN0cilcblxuICBpZiAocG9zID09PSAtMSAmJiBpcC5raW5kKCkgPT09ICdpcHY2JyAmJiBpcC5pc0lQdjRNYXBwZWRBZGRyZXNzKCkpIHtcbiAgICAvLyBTdG9yZSBhcyBJUHY0XG4gICAgaXAgPSBpcC50b0lQdjRBZGRyZXNzKClcbiAgfVxuXG4gIHZhciBtYXggPSBpcC5raW5kKCkgPT09ICdpcHY2J1xuICAgID8gMTI4XG4gICAgOiAzMlxuXG4gIHZhciByYW5nZSA9IHBvcyAhPT0gLTFcbiAgICA/IG5vdGUuc3Vic3RyaW5nKHBvcyArIDEsIG5vdGUubGVuZ3RoKVxuICAgIDogbnVsbFxuXG4gIGlmIChyYW5nZSA9PT0gbnVsbCkge1xuICAgIHJhbmdlID0gbWF4XG4gIH0gZWxzZSBpZiAoRElHSVRfUkVHRVhQLnRlc3QocmFuZ2UpKSB7XG4gICAgcmFuZ2UgPSBwYXJzZUludChyYW5nZSwgMTApXG4gIH0gZWxzZSBpZiAoaXAua2luZCgpID09PSAnaXB2NCcgJiYgaXNpcChyYW5nZSkpIHtcbiAgICByYW5nZSA9IHBhcnNlTmV0bWFzayhyYW5nZSlcbiAgfSBlbHNlIHtcbiAgICByYW5nZSA9IG51bGxcbiAgfVxuXG4gIGlmIChyYW5nZSA8PSAwIHx8IHJhbmdlID4gbWF4KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCByYW5nZSBvbiBhZGRyZXNzOiAnICsgbm90ZSlcbiAgfVxuXG4gIHJldHVybiBbaXAsIHJhbmdlXVxufVxuXG4vKipcbiAqIFBhcnNlIG5ldG1hc2sgc3RyaW5nIGludG8gQ0lEUiByYW5nZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmV0bWFza1xuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZU5ldG1hc2sgKG5ldG1hc2spIHtcbiAgdmFyIGlwID0gcGFyc2VpcChuZXRtYXNrKVxuICB2YXIga2luZCA9IGlwLmtpbmQoKVxuXG4gIHJldHVybiBraW5kID09PSAnaXB2NCdcbiAgICA/IGlwLnByZWZpeExlbmd0aEZyb21TdWJuZXRNYXNrKClcbiAgICA6IG51bGxcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgYWRkcmVzcyBvZiBwcm94aWVkIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlcXVlc3RcbiAqIEBwYXJhbSB7RnVuY3Rpb258QXJyYXl8U3RyaW5nfSB0cnVzdFxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHByb3h5YWRkciAocmVxLCB0cnVzdCkge1xuICBpZiAoIXJlcSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlcSBhcmd1bWVudCBpcyByZXF1aXJlZCcpXG4gIH1cblxuICBpZiAoIXRydXN0KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndHJ1c3QgYXJndW1lbnQgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgdmFyIGFkZHJzID0gYWxsYWRkcnMocmVxLCB0cnVzdClcbiAgdmFyIGFkZHIgPSBhZGRyc1thZGRycy5sZW5ndGggLSAxXVxuXG4gIHJldHVybiBhZGRyXG59XG5cbi8qKlxuICogU3RhdGljIHRydXN0IGZ1bmN0aW9uIHRvIHRydXN0IG5vdGhpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB0cnVzdE5vbmUgKCkge1xuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBDb21waWxlIHRydXN0IGZ1bmN0aW9uIGZvciBtdWx0aXBsZSBzdWJuZXRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHN1Ym5ldHNcbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gdHJ1c3RNdWx0aSAoc3VibmV0cykge1xuICByZXR1cm4gZnVuY3Rpb24gdHJ1c3QgKGFkZHIpIHtcbiAgICBpZiAoIWlzaXAoYWRkcikpIHJldHVybiBmYWxzZVxuXG4gICAgdmFyIGlwID0gcGFyc2VpcChhZGRyKVxuICAgIHZhciBpcGNvbnZcbiAgICB2YXIga2luZCA9IGlwLmtpbmQoKVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdWJuZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3VibmV0ID0gc3VibmV0c1tpXVxuICAgICAgdmFyIHN1Ym5ldGlwID0gc3VibmV0WzBdXG4gICAgICB2YXIgc3VibmV0a2luZCA9IHN1Ym5ldGlwLmtpbmQoKVxuICAgICAgdmFyIHN1Ym5ldHJhbmdlID0gc3VibmV0WzFdXG4gICAgICB2YXIgdHJ1c3RlZCA9IGlwXG5cbiAgICAgIGlmIChraW5kICE9PSBzdWJuZXRraW5kKSB7XG4gICAgICAgIGlmIChzdWJuZXRraW5kID09PSAnaXB2NCcgJiYgIWlwLmlzSVB2NE1hcHBlZEFkZHJlc3MoKSkge1xuICAgICAgICAgIC8vIEluY29tcGF0aWJsZSBJUCBhZGRyZXNzZXNcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpcGNvbnYpIHtcbiAgICAgICAgICAvLyBDb252ZXJ0IElQIHRvIG1hdGNoIHN1Ym5ldCBJUCBraW5kXG4gICAgICAgICAgaXBjb252ID0gc3VibmV0a2luZCA9PT0gJ2lwdjQnXG4gICAgICAgICAgICA/IGlwLnRvSVB2NEFkZHJlc3MoKVxuICAgICAgICAgICAgOiBpcC50b0lQdjRNYXBwZWRBZGRyZXNzKClcbiAgICAgICAgfVxuXG4gICAgICAgIHRydXN0ZWQgPSBpcGNvbnZcbiAgICAgIH1cblxuICAgICAgaWYgKHRydXN0ZWQubWF0Y2goc3VibmV0aXAsIHN1Ym5ldHJhbmdlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogQ29tcGlsZSB0cnVzdCBmdW5jdGlvbiBmb3Igc2luZ2xlIHN1Ym5ldC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3VibmV0XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRydXN0U2luZ2xlIChzdWJuZXQpIHtcbiAgdmFyIHN1Ym5ldGlwID0gc3VibmV0WzBdXG4gIHZhciBzdWJuZXRraW5kID0gc3VibmV0aXAua2luZCgpXG4gIHZhciBzdWJuZXRpc2lwdjQgPSBzdWJuZXRraW5kID09PSAnaXB2NCdcbiAgdmFyIHN1Ym5ldHJhbmdlID0gc3VibmV0WzFdXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHRydXN0IChhZGRyKSB7XG4gICAgaWYgKCFpc2lwKGFkZHIpKSByZXR1cm4gZmFsc2VcblxuICAgIHZhciBpcCA9IHBhcnNlaXAoYWRkcilcbiAgICB2YXIga2luZCA9IGlwLmtpbmQoKVxuXG4gICAgaWYgKGtpbmQgIT09IHN1Ym5ldGtpbmQpIHtcbiAgICAgIGlmIChzdWJuZXRpc2lwdjQgJiYgIWlwLmlzSVB2NE1hcHBlZEFkZHJlc3MoKSkge1xuICAgICAgICAvLyBJbmNvbXBhdGlibGUgSVAgYWRkcmVzc2VzXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBDb252ZXJ0IElQIHRvIG1hdGNoIHN1Ym5ldCBJUCBraW5kXG4gICAgICBpcCA9IHN1Ym5ldGlzaXB2NFxuICAgICAgICA/IGlwLnRvSVB2NEFkZHJlc3MoKVxuICAgICAgICA6IGlwLnRvSVB2NE1hcHBlZEFkZHJlc3MoKVxuICAgIH1cblxuICAgIHJldHVybiBpcC5tYXRjaChzdWJuZXRpcCwgc3VibmV0cmFuZ2UpXG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9wcm94eS1hZGRyL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA5OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBkUHMgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAxMDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faW9iamVjdC5qc1xuLy8gbW9kdWxlIGlkID0gMTAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogY29yZS52ZXJzaW9uLFxuICBtb2RlOiByZXF1aXJlKCcuL19saWJyYXJ5JykgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAxOCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zaGFyZWQuanNcbi8vIG1vZHVsZSBpZCA9IDEwM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gMTA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xubW9kdWxlLmV4cG9ydHMgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2h0bWwuanNcbi8vIG1vZHVsZSBpZCA9IDEwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tb2JqZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAxMDZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZG9uZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmUgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItc3RlcC5qc1xuLy8gbW9kdWxlIGlkID0gMTA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qc1xuLy8gbW9kdWxlIGlkID0gMTA4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgRCkge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qc1xuLy8gbW9kdWxlIGlkID0gMTA5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuL19pbnZva2UnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi9faHRtbCcpO1xudmFyIGNlbCA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgc2V0VGFzayA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXJUYXNrID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaWQgPSArdGhpcztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldFRhc2sgfHwgIWNsZWFyVGFzaykge1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAocmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdGFzay5qc1xuLy8gbW9kdWxlIGlkID0gMTEwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3BlcmZvcm0uanNcbi8vIG1vZHVsZSBpZCA9IDExMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9taXNlLXJlc29sdmUuanNcbi8vIG1vZHVsZSBpZCA9IDExMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciBDID0gdHlwZW9mIGNvcmVbS0VZXSA9PSAnZnVuY3Rpb24nID8gY29yZVtLRVldIDogZ2xvYmFsW0tFWV07XG4gIGlmIChERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSBkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXNwZWNpZXMuanNcbi8vIG1vZHVsZSBpZCA9IDExM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZ2V0SnNvbkRhdGFTeW5jLCB3cml0ZUpzb25EYXRhU3luYyB9ICBmcm9tICcuL2pzb24nO1xuaW1wb3J0IHsgTUVUUklDU19QQVRIIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5mdW5jdGlvbiBzYXZlVGFyZ2V0cyh0YXJnZXRzKSB7XG4gIGxldCBtZXRyaWNzID0gW107XG4gIGZvciAobGV0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgbWV0cmljcy5wdXNoKHNhdmVUYXJnZXQodGFyZ2V0KSk7XG4gIH1cbiAgcmV0dXJuIG1ldHJpY3M7XG59XG5cbmZ1bmN0aW9uIHNhdmVUYXJnZXQodGFyZ2V0KSB7XG4gIC8vY29uc3QgbWQ1ID0gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpXG4gIGNvbnN0IHRhcmdldElkID0gY3J5cHRvLmNyZWF0ZUhhc2goJ21kNScpLnVwZGF0ZShKU09OLnN0cmluZ2lmeSh0YXJnZXQpKS5kaWdlc3QoJ2hleCcpO1xuICBsZXQgZmlsZW5hbWUgPSBwYXRoLmpvaW4oTUVUUklDU19QQVRILCBgJHt0YXJnZXRJZH0uanNvbmApO1xuICB3cml0ZUpzb25EYXRhU3luYyhmaWxlbmFtZSwgdGFyZ2V0KTtcbiAgcmV0dXJuIHRhcmdldElkO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0SWQpIHtcbiAgbGV0IGZpbGVuYW1lID0gcGF0aC5qb2luKE1FVFJJQ1NfUEFUSCwgYCR7dGFyZ2V0SWR9Lmpzb25gKTtcbiAgcmV0dXJuIGdldEpzb25EYXRhU3luYyhmaWxlbmFtZSk7XG59XG5cbmV4cG9ydCB7IHNhdmVUYXJnZXRzLCBnZXRUYXJnZXQgfVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc2VydmljZXMvbWV0cmljcy50cyIsInZhciBTdHJlYW0gPSByZXF1aXJlKFwic3RyZWFtXCIpXG52YXIgd3JpdGVNZXRob2RzID0gW1wid3JpdGVcIiwgXCJlbmRcIiwgXCJkZXN0cm95XCJdXG52YXIgcmVhZE1ldGhvZHMgPSBbXCJyZXN1bWVcIiwgXCJwYXVzZVwiXVxudmFyIHJlYWRFdmVudHMgPSBbXCJkYXRhXCIsIFwiY2xvc2VcIl1cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZVxuXG5tb2R1bGUuZXhwb3J0cyA9IGR1cGxleFxuXG5mdW5jdGlvbiBmb3JFYWNoIChhcnIsIGZuKSB7XG4gICAgaWYgKGFyci5mb3JFYWNoKSB7XG4gICAgICAgIHJldHVybiBhcnIuZm9yRWFjaChmbilcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBmbihhcnJbaV0sIGkpXG4gICAgfVxufVxuXG5mdW5jdGlvbiBkdXBsZXgod3JpdGVyLCByZWFkZXIpIHtcbiAgICB2YXIgc3RyZWFtID0gbmV3IFN0cmVhbSgpXG4gICAgdmFyIGVuZGVkID0gZmFsc2VcblxuICAgIGZvckVhY2god3JpdGVNZXRob2RzLCBwcm94eVdyaXRlcilcblxuICAgIGZvckVhY2gocmVhZE1ldGhvZHMsIHByb3h5UmVhZGVyKVxuXG4gICAgZm9yRWFjaChyZWFkRXZlbnRzLCBwcm94eVN0cmVhbSlcblxuICAgIHJlYWRlci5vbihcImVuZFwiLCBoYW5kbGVFbmQpXG5cbiAgICB3cml0ZXIub24oXCJkcmFpblwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHN0cmVhbS5lbWl0KFwiZHJhaW5cIilcbiAgICB9KVxuXG4gICAgd3JpdGVyLm9uKFwiZXJyb3JcIiwgcmVlbWl0KVxuICAgIHJlYWRlci5vbihcImVycm9yXCIsIHJlZW1pdClcblxuICAgIHN0cmVhbS53cml0YWJsZSA9IHdyaXRlci53cml0YWJsZVxuICAgIHN0cmVhbS5yZWFkYWJsZSA9IHJlYWRlci5yZWFkYWJsZVxuXG4gICAgcmV0dXJuIHN0cmVhbVxuXG4gICAgZnVuY3Rpb24gcHJveHlXcml0ZXIobWV0aG9kTmFtZSkge1xuICAgICAgICBzdHJlYW1bbWV0aG9kTmFtZV0gPSBtZXRob2RcblxuICAgICAgICBmdW5jdGlvbiBtZXRob2QoKSB7XG4gICAgICAgICAgICByZXR1cm4gd3JpdGVyW21ldGhvZE5hbWVdLmFwcGx5KHdyaXRlciwgYXJndW1lbnRzKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJveHlSZWFkZXIobWV0aG9kTmFtZSkge1xuICAgICAgICBzdHJlYW1bbWV0aG9kTmFtZV0gPSBtZXRob2RcblxuICAgICAgICBmdW5jdGlvbiBtZXRob2QoKSB7XG4gICAgICAgICAgICBzdHJlYW0uZW1pdChtZXRob2ROYW1lKVxuICAgICAgICAgICAgdmFyIGZ1bmMgPSByZWFkZXJbbWV0aG9kTmFtZV1cbiAgICAgICAgICAgIGlmIChmdW5jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkocmVhZGVyLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWFkZXIuZW1pdChtZXRob2ROYW1lKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJveHlTdHJlYW0obWV0aG9kTmFtZSkge1xuICAgICAgICByZWFkZXIub24obWV0aG9kTmFtZSwgcmVlbWl0KVxuXG4gICAgICAgIGZ1bmN0aW9uIHJlZW1pdCgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgICAgICAgICBhcmdzLnVuc2hpZnQobWV0aG9kTmFtZSlcbiAgICAgICAgICAgIHN0cmVhbS5lbWl0LmFwcGx5KHN0cmVhbSwgYXJncylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZUVuZCgpIHtcbiAgICAgICAgaWYgKGVuZGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICAgICAgYXJncy51bnNoaWZ0KFwiZW5kXCIpXG4gICAgICAgIHN0cmVhbS5lbWl0LmFwcGx5KHN0cmVhbSwgYXJncylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWVtaXQoZXJyKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0KFwiZXJyb3JcIiwgZXJyKVxuICAgIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9kdXBsZXhlci9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTE1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBNRVRBID0gcmVxdWlyZSgnLi9fdWlkJykoJ21ldGEnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHNldERlc2MgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGlkID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIEZSRUVaRSA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgc2V0RGVzYyhpdCwgTUVUQSwgeyB2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQV0udztcbn07XG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKSBzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogTUVUQSxcbiAgTkVFRDogZmFsc2UsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWs6IGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWV0YS5qc1xuLy8gbW9kdWxlIGlkID0gMTE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRZUEUpIHtcbiAgaWYgKCFpc09iamVjdChpdCkgfHwgaXQuX3QgIT09IFRZUEUpIHRocm93IFR5cGVFcnJvcignSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAnICsgVFlQRSArICcgcmVxdWlyZWQhJyk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3ZhbGlkYXRlLWNvbGxlY3Rpb24uanNcbi8vIG1vZHVsZSBpZCA9IDExN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgKiBhcyBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0ICogYXMgYm9keVBhcnNlciBmcm9tICdib2R5LXBhcnNlcic7XG5cbmltcG9ydCB7IHJvdXRlciBhcyBhbm9tYWxpZXNSb3V0ZXIgfSBmcm9tICcuL3JvdXRlcy9hbm9tYWxpZXMnO1xuaW1wb3J0IHsgcm91dGVyIGFzIHNlZ21lbnRzUm91dGVyIH0gZnJvbSAnLi9yb3V0ZXMvc2VnbWVudHMnO1xuaW1wb3J0IHsgcm91dGVyIGFzIGFsZXJ0c1JvdXRlciB9IGZyb20gJy4vcm91dGVzL2FsZXJ0cyc7XG5cbmNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbmNvbnN0IFBPUlQgPSBwcm9jZXNzLmVudi5IQVNUSUNfUE9SVCB8fCA4MDAwO1xuXG5hcHAudXNlKGJvZHlQYXJzZXIuanNvbigpKTtcbmFwcC51c2UoYm9keVBhcnNlci51cmxlbmNvZGVkKHsgZXh0ZW5kZWQ6IHRydWUgfSkpO1xuXG5hcHAudXNlKGZ1bmN0aW9uIChyZXEsIHJlcywgbmV4dCkge1xuICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCAnKicpO1xuICByZXMuaGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJywgJ0dFVCwgUE9TVCwgUFVULCBERUxFVEUsIFBBVENILCBPUFRJT05TJyk7XG4gIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnLCAnT3JpZ2luLCBYLVJlcXVlc3RlZC1XaXRoLCBDb250ZW50LVR5cGUsIEFjY2VwdCcpO1xuICBuZXh0KCk7XG59KTtcblxuYXBwLnVzZSgnL2Fub21hbGllcycsIGFub21hbGllc1JvdXRlcik7XG5hcHAudXNlKCcvc2VnbWVudHMnLCBzZWdtZW50c1JvdXRlcik7XG5hcHAudXNlKCcvYWxlcnRzJywgYWxlcnRzUm91dGVyKTtcbmFwcC51c2UoJy8nLCAocmVxLCByZXMpID0+IHJlcy5zZW5kKHsgc3RhdHVzOiAnT0snIH0pKTtcblxuYXBwLmxpc3RlbihQT1JULCAoKSA9PiB7XG4gIGNvbnNvbGUubG9nKGBTZXJ2ZXIgaXMgcnVubmluZyBvbiA6JHtQT1JUfWApXG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL2luZGV4LnRzIiwiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGJvZHlQYXJzZXIgPSByZXF1aXJlKCdib2R5LXBhcnNlcicpXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xudmFyIG1peGluID0gcmVxdWlyZSgnbWVyZ2UtZGVzY3JpcHRvcnMnKTtcbnZhciBwcm90byA9IHJlcXVpcmUoJy4vYXBwbGljYXRpb24nKTtcbnZhciBSb3V0ZSA9IHJlcXVpcmUoJy4vcm91dGVyL3JvdXRlJyk7XG52YXIgUm91dGVyID0gcmVxdWlyZSgnLi9yb3V0ZXInKTtcbnZhciByZXEgPSByZXF1aXJlKCcuL3JlcXVlc3QnKTtcbnZhciByZXMgPSByZXF1aXJlKCcuL3Jlc3BvbnNlJyk7XG5cbi8qKlxuICogRXhwb3NlIGBjcmVhdGVBcHBsaWNhdGlvbigpYC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVBcHBsaWNhdGlvbjtcblxuLyoqXG4gKiBDcmVhdGUgYW4gZXhwcmVzcyBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlQXBwbGljYXRpb24oKSB7XG4gIHZhciBhcHAgPSBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICAgIGFwcC5oYW5kbGUocmVxLCByZXMsIG5leHQpO1xuICB9O1xuXG4gIG1peGluKGFwcCwgRXZlbnRFbWl0dGVyLnByb3RvdHlwZSwgZmFsc2UpO1xuICBtaXhpbihhcHAsIHByb3RvLCBmYWxzZSk7XG5cbiAgLy8gZXhwb3NlIHRoZSBwcm90b3R5cGUgdGhhdCB3aWxsIGdldCBzZXQgb24gcmVxdWVzdHNcbiAgYXBwLnJlcXVlc3QgPSBPYmplY3QuY3JlYXRlKHJlcSwge1xuICAgIGFwcDogeyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogYXBwIH1cbiAgfSlcblxuICAvLyBleHBvc2UgdGhlIHByb3RvdHlwZSB0aGF0IHdpbGwgZ2V0IHNldCBvbiByZXNwb25zZXNcbiAgYXBwLnJlc3BvbnNlID0gT2JqZWN0LmNyZWF0ZShyZXMsIHtcbiAgICBhcHA6IHsgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IGFwcCB9XG4gIH0pXG5cbiAgYXBwLmluaXQoKTtcbiAgcmV0dXJuIGFwcDtcbn1cblxuLyoqXG4gKiBFeHBvc2UgdGhlIHByb3RvdHlwZXMuXG4gKi9cblxuZXhwb3J0cy5hcHBsaWNhdGlvbiA9IHByb3RvO1xuZXhwb3J0cy5yZXF1ZXN0ID0gcmVxO1xuZXhwb3J0cy5yZXNwb25zZSA9IHJlcztcblxuLyoqXG4gKiBFeHBvc2UgY29uc3RydWN0b3JzLlxuICovXG5cbmV4cG9ydHMuUm91dGUgPSBSb3V0ZTtcbmV4cG9ydHMuUm91dGVyID0gUm91dGVyO1xuXG4vKipcbiAqIEV4cG9zZSBtaWRkbGV3YXJlXG4gKi9cblxuZXhwb3J0cy5qc29uID0gYm9keVBhcnNlci5qc29uXG5leHBvcnRzLnF1ZXJ5ID0gcmVxdWlyZSgnLi9taWRkbGV3YXJlL3F1ZXJ5Jyk7XG5leHBvcnRzLnN0YXRpYyA9IHJlcXVpcmUoJ3NlcnZlLXN0YXRpYycpO1xuZXhwb3J0cy51cmxlbmNvZGVkID0gYm9keVBhcnNlci51cmxlbmNvZGVkXG5cbi8qKlxuICogUmVwbGFjZSByZW1vdmVkIG1pZGRsZXdhcmUgd2l0aCBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlLlxuICovXG5cbjtbXG4gICdib2R5UGFyc2VyJyxcbiAgJ2NvbXByZXNzJyxcbiAgJ2Nvb2tpZVNlc3Npb24nLFxuICAnc2Vzc2lvbicsXG4gICdsb2dnZXInLFxuICAnY29va2llUGFyc2VyJyxcbiAgJ2Zhdmljb24nLFxuICAncmVzcG9uc2VUaW1lJyxcbiAgJ2Vycm9ySGFuZGxlcicsXG4gICd0aW1lb3V0JyxcbiAgJ21ldGhvZE92ZXJyaWRlJyxcbiAgJ3Zob3N0JyxcbiAgJ2NzcmYnLFxuICAnZGlyZWN0b3J5JyxcbiAgJ2xpbWl0JyxcbiAgJ211bHRpcGFydCcsXG4gICdzdGF0aWNDYWNoZScsXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9zdCBtaWRkbGV3YXJlIChsaWtlICcgKyBuYW1lICsgJykgaXMgbm8gbG9uZ2VyIGJ1bmRsZWQgd2l0aCBFeHByZXNzIGFuZCBtdXN0IGJlIGluc3RhbGxlZCBzZXBhcmF0ZWx5LiBQbGVhc2Ugc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zZW5jaGFsYWJzL2Nvbm5lY3QjbWlkZGxld2FyZS4nKTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL2V4cHJlc3MuanNcbi8vIG1vZHVsZSBpZCA9IDExOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIGRlcGRcbiAqIENvcHlyaWdodChjKSAyMDE0IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNhbGxTaXRlVG9TdHJpbmdcblxuLyoqXG4gKiBGb3JtYXQgYSBDYWxsU2l0ZSBmaWxlIGxvY2F0aW9uIHRvIGEgc3RyaW5nLlxuICovXG5cbmZ1bmN0aW9uIGNhbGxTaXRlRmlsZUxvY2F0aW9uIChjYWxsU2l0ZSkge1xuICB2YXIgZmlsZU5hbWVcbiAgdmFyIGZpbGVMb2NhdGlvbiA9ICcnXG5cbiAgaWYgKGNhbGxTaXRlLmlzTmF0aXZlKCkpIHtcbiAgICBmaWxlTG9jYXRpb24gPSAnbmF0aXZlJ1xuICB9IGVsc2UgaWYgKGNhbGxTaXRlLmlzRXZhbCgpKSB7XG4gICAgZmlsZU5hbWUgPSBjYWxsU2l0ZS5nZXRTY3JpcHROYW1lT3JTb3VyY2VVUkwoKVxuICAgIGlmICghZmlsZU5hbWUpIHtcbiAgICAgIGZpbGVMb2NhdGlvbiA9IGNhbGxTaXRlLmdldEV2YWxPcmlnaW4oKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaWxlTmFtZSA9IGNhbGxTaXRlLmdldEZpbGVOYW1lKClcbiAgfVxuXG4gIGlmIChmaWxlTmFtZSkge1xuICAgIGZpbGVMb2NhdGlvbiArPSBmaWxlTmFtZVxuXG4gICAgdmFyIGxpbmVOdW1iZXIgPSBjYWxsU2l0ZS5nZXRMaW5lTnVtYmVyKClcbiAgICBpZiAobGluZU51bWJlciAhPSBudWxsKSB7XG4gICAgICBmaWxlTG9jYXRpb24gKz0gJzonICsgbGluZU51bWJlclxuXG4gICAgICB2YXIgY29sdW1uTnVtYmVyID0gY2FsbFNpdGUuZ2V0Q29sdW1uTnVtYmVyKClcbiAgICAgIGlmIChjb2x1bW5OdW1iZXIpIHtcbiAgICAgICAgZmlsZUxvY2F0aW9uICs9ICc6JyArIGNvbHVtbk51bWJlclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaWxlTG9jYXRpb24gfHwgJ3Vua25vd24gc291cmNlJ1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIENhbGxTaXRlIHRvIGEgc3RyaW5nLlxuICovXG5cbmZ1bmN0aW9uIGNhbGxTaXRlVG9TdHJpbmcgKGNhbGxTaXRlKSB7XG4gIHZhciBhZGRTdWZmaXggPSB0cnVlXG4gIHZhciBmaWxlTG9jYXRpb24gPSBjYWxsU2l0ZUZpbGVMb2NhdGlvbihjYWxsU2l0ZSlcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGNhbGxTaXRlLmdldEZ1bmN0aW9uTmFtZSgpXG4gIHZhciBpc0NvbnN0cnVjdG9yID0gY2FsbFNpdGUuaXNDb25zdHJ1Y3RvcigpXG4gIHZhciBpc01ldGhvZENhbGwgPSAhKGNhbGxTaXRlLmlzVG9wbGV2ZWwoKSB8fCBpc0NvbnN0cnVjdG9yKVxuICB2YXIgbGluZSA9ICcnXG5cbiAgaWYgKGlzTWV0aG9kQ2FsbCkge1xuICAgIHZhciBtZXRob2ROYW1lID0gY2FsbFNpdGUuZ2V0TWV0aG9kTmFtZSgpXG4gICAgdmFyIHR5cGVOYW1lID0gZ2V0Q29uc3RydWN0b3JOYW1lKGNhbGxTaXRlKVxuXG4gICAgaWYgKGZ1bmN0aW9uTmFtZSkge1xuICAgICAgaWYgKHR5cGVOYW1lICYmIGZ1bmN0aW9uTmFtZS5pbmRleE9mKHR5cGVOYW1lKSAhPT0gMCkge1xuICAgICAgICBsaW5lICs9IHR5cGVOYW1lICsgJy4nXG4gICAgICB9XG5cbiAgICAgIGxpbmUgKz0gZnVuY3Rpb25OYW1lXG5cbiAgICAgIGlmIChtZXRob2ROYW1lICYmIGZ1bmN0aW9uTmFtZS5sYXN0SW5kZXhPZignLicgKyBtZXRob2ROYW1lKSAhPT0gZnVuY3Rpb25OYW1lLmxlbmd0aCAtIG1ldGhvZE5hbWUubGVuZ3RoIC0gMSkge1xuICAgICAgICBsaW5lICs9ICcgW2FzICcgKyBtZXRob2ROYW1lICsgJ10nXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmUgKz0gdHlwZU5hbWUgKyAnLicgKyAobWV0aG9kTmFtZSB8fCAnPGFub255bW91cz4nKVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc0NvbnN0cnVjdG9yKSB7XG4gICAgbGluZSArPSAnbmV3ICcgKyAoZnVuY3Rpb25OYW1lIHx8ICc8YW5vbnltb3VzPicpXG4gIH0gZWxzZSBpZiAoZnVuY3Rpb25OYW1lKSB7XG4gICAgbGluZSArPSBmdW5jdGlvbk5hbWVcbiAgfSBlbHNlIHtcbiAgICBhZGRTdWZmaXggPSBmYWxzZVxuICAgIGxpbmUgKz0gZmlsZUxvY2F0aW9uXG4gIH1cblxuICBpZiAoYWRkU3VmZml4KSB7XG4gICAgbGluZSArPSAnICgnICsgZmlsZUxvY2F0aW9uICsgJyknXG4gIH1cblxuICByZXR1cm4gbGluZVxufVxuXG4vKipcbiAqIEdldCBjb25zdHJ1Y3RvciBuYW1lIG9mIHJldml2ZXIuXG4gKi9cblxuZnVuY3Rpb24gZ2V0Q29uc3RydWN0b3JOYW1lIChvYmopIHtcbiAgdmFyIHJlY2VpdmVyID0gb2JqLnJlY2VpdmVyXG4gIHJldHVybiAocmVjZWl2ZXIuY29uc3RydWN0b3IgJiYgcmVjZWl2ZXIuY29uc3RydWN0b3IubmFtZSkgfHwgbnVsbFxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2RlcGQvbGliL2NvbXBhdC9jYWxsc2l0ZS10b3N0cmluZy5qc1xuLy8gbW9kdWxlIGlkID0gMTIwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogZGVwZFxuICogQ29weXJpZ2h0KGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZXZlbnRMaXN0ZW5lckNvdW50XG5cbi8qKlxuICogR2V0IHRoZSBjb3VudCBvZiBsaXN0ZW5lcnMgb24gYW4gZXZlbnQgZW1pdHRlciBvZiBhIHNwZWNpZmljIHR5cGUuXG4gKi9cblxuZnVuY3Rpb24gZXZlbnRMaXN0ZW5lckNvdW50IChlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVycyh0eXBlKS5sZW5ndGhcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9kZXBkL2xpYi9jb21wYXQvZXZlbnQtbGlzdGVuZXItY291bnQuanNcbi8vIG1vZHVsZSBpZCA9IDEyMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIGJvZHktcGFyc2VyXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBieXRlcyA9IHJlcXVpcmUoJ2J5dGVzJylcbnZhciBjb250ZW50VHlwZSA9IHJlcXVpcmUoJ2NvbnRlbnQtdHlwZScpXG52YXIgY3JlYXRlRXJyb3IgPSByZXF1aXJlKCdodHRwLWVycm9ycycpXG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdib2R5LXBhcnNlcjpqc29uJylcbnZhciByZWFkID0gcmVxdWlyZSgnLi4vcmVhZCcpXG52YXIgdHlwZWlzID0gcmVxdWlyZSgndHlwZS1pcycpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBqc29uXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIHRoZSBmaXJzdCBub24tc3BhY2UgaW4gYSBzdHJpbmcuXG4gKlxuICogQWxsb3dlZCB3aGl0ZXNwYWNlIGlzIGRlZmluZWQgaW4gUkZDIDcxNTk6XG4gKlxuICogICAgd3MgPSAqKFxuICogICAgICAgICAgICAleDIwIC8gICAgICAgICAgICAgIDsgU3BhY2VcbiAqICAgICAgICAgICAgJXgwOSAvICAgICAgICAgICAgICA7IEhvcml6b250YWwgdGFiXG4gKiAgICAgICAgICAgICV4MEEgLyAgICAgICAgICAgICAgOyBMaW5lIGZlZWQgb3IgTmV3IGxpbmVcbiAqICAgICAgICAgICAgJXgwRCApICAgICAgICAgICAgICA7IENhcnJpYWdlIHJldHVyblxuICovXG5cbnZhciBGSVJTVF9DSEFSX1JFR0VYUCA9IC9eW1xceDIwXFx4MDlcXHgwYVxceDBkXSooLikvIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29udHJvbC1yZWdleFxuXG4vKipcbiAqIENyZWF0ZSBhIG1pZGRsZXdhcmUgdG8gcGFyc2UgSlNPTiBib2RpZXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24ganNvbiAob3B0aW9ucykge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge31cblxuICB2YXIgbGltaXQgPSB0eXBlb2Ygb3B0cy5saW1pdCAhPT0gJ251bWJlcidcbiAgICA/IGJ5dGVzLnBhcnNlKG9wdHMubGltaXQgfHwgJzEwMGtiJylcbiAgICA6IG9wdHMubGltaXRcbiAgdmFyIGluZmxhdGUgPSBvcHRzLmluZmxhdGUgIT09IGZhbHNlXG4gIHZhciByZXZpdmVyID0gb3B0cy5yZXZpdmVyXG4gIHZhciBzdHJpY3QgPSBvcHRzLnN0cmljdCAhPT0gZmFsc2VcbiAgdmFyIHR5cGUgPSBvcHRzLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL2pzb24nXG4gIHZhciB2ZXJpZnkgPSBvcHRzLnZlcmlmeSB8fCBmYWxzZVxuXG4gIGlmICh2ZXJpZnkgIT09IGZhbHNlICYmIHR5cGVvZiB2ZXJpZnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gdmVyaWZ5IG11c3QgYmUgZnVuY3Rpb24nKVxuICB9XG5cbiAgLy8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9uXG4gIHZhciBzaG91bGRQYXJzZSA9IHR5cGVvZiB0eXBlICE9PSAnZnVuY3Rpb24nXG4gICAgPyB0eXBlQ2hlY2tlcih0eXBlKVxuICAgIDogdHlwZVxuXG4gIGZ1bmN0aW9uIHBhcnNlIChib2R5KSB7XG4gICAgaWYgKGJvZHkubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBzcGVjaWFsLWNhc2UgZW1wdHkganNvbiBib2R5LCBhcyBpdCdzIGEgY29tbW9uIGNsaWVudC1zaWRlIG1pc3Rha2VcbiAgICAgIC8vIFRPRE86IG1heWJlIG1ha2UgdGhpcyBjb25maWd1cmFibGUgb3IgcGFydCBvZiBcInN0cmljdFwiIG9wdGlvblxuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuXG4gICAgaWYgKHN0cmljdCkge1xuICAgICAgdmFyIGZpcnN0ID0gZmlyc3RjaGFyKGJvZHkpXG5cbiAgICAgIGlmIChmaXJzdCAhPT0gJ3snICYmIGZpcnN0ICE9PSAnWycpIHtcbiAgICAgICAgZGVidWcoJ3N0cmljdCB2aW9sYXRpb24nKVxuICAgICAgICB0aHJvdyBjcmVhdGVTdHJpY3RTeW50YXhFcnJvcihib2R5LCBmaXJzdClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgZGVidWcoJ3BhcnNlIGpzb24nKVxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoYm9keSwgcmV2aXZlcilcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBub3JtYWxpemVKc29uU3ludGF4RXJyb3IoZSwge1xuICAgICAgICBzdGFjazogZS5zdGFja1xuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24ganNvblBhcnNlciAocmVxLCByZXMsIG5leHQpIHtcbiAgICBpZiAocmVxLl9ib2R5KSB7XG4gICAgICBkZWJ1ZygnYm9keSBhbHJlYWR5IHBhcnNlZCcpXG4gICAgICBuZXh0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJlcS5ib2R5ID0gcmVxLmJvZHkgfHwge31cblxuICAgIC8vIHNraXAgcmVxdWVzdHMgd2l0aG91dCBib2RpZXNcbiAgICBpZiAoIXR5cGVpcy5oYXNCb2R5KHJlcSkpIHtcbiAgICAgIGRlYnVnKCdza2lwIGVtcHR5IGJvZHknKVxuICAgICAgbmV4dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBkZWJ1ZygnY29udGVudC10eXBlICVqJywgcmVxLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKVxuXG4gICAgLy8gZGV0ZXJtaW5lIGlmIHJlcXVlc3Qgc2hvdWxkIGJlIHBhcnNlZFxuICAgIGlmICghc2hvdWxkUGFyc2UocmVxKSkge1xuICAgICAgZGVidWcoJ3NraXAgcGFyc2luZycpXG4gICAgICBuZXh0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGFzc2VydCBjaGFyc2V0IHBlciBSRkMgNzE1OSBzZWMgOC4xXG4gICAgdmFyIGNoYXJzZXQgPSBnZXRDaGFyc2V0KHJlcSkgfHwgJ3V0Zi04J1xuICAgIGlmIChjaGFyc2V0LnN1YnN0cigwLCA0KSAhPT0gJ3V0Zi0nKSB7XG4gICAgICBkZWJ1ZygnaW52YWxpZCBjaGFyc2V0JylcbiAgICAgIG5leHQoY3JlYXRlRXJyb3IoNDE1LCAndW5zdXBwb3J0ZWQgY2hhcnNldCBcIicgKyBjaGFyc2V0LnRvVXBwZXJDYXNlKCkgKyAnXCInLCB7XG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIHR5cGU6ICdjaGFyc2V0LnVuc3VwcG9ydGVkJ1xuICAgICAgfSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyByZWFkXG4gICAgcmVhZChyZXEsIHJlcywgbmV4dCwgcGFyc2UsIGRlYnVnLCB7XG4gICAgICBlbmNvZGluZzogY2hhcnNldCxcbiAgICAgIGluZmxhdGU6IGluZmxhdGUsXG4gICAgICBsaW1pdDogbGltaXQsXG4gICAgICB2ZXJpZnk6IHZlcmlmeVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgc3RyaWN0IHZpb2xhdGlvbiBzeW50YXggZXJyb3IgbWF0Y2hpbmcgbmF0aXZlIGVycm9yLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyXG4gKiBAcmV0dXJuIHtFcnJvcn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlU3RyaWN0U3ludGF4RXJyb3IgKHN0ciwgY2hhcikge1xuICB2YXIgaW5kZXggPSBzdHIuaW5kZXhPZihjaGFyKVxuICB2YXIgcGFydGlhbCA9IHN0ci5zdWJzdHJpbmcoMCwgaW5kZXgpICsgJyMnXG5cbiAgdHJ5IHtcbiAgICBKU09OLnBhcnNlKHBhcnRpYWwpOyAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ3N0cmljdCB2aW9sYXRpb24nKVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUpzb25TeW50YXhFcnJvcihlLCB7XG4gICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UucmVwbGFjZSgnIycsIGNoYXIpLFxuICAgICAgc3RhY2s6IGUuc3RhY2tcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZpcnN0Y2hhciAoc3RyKSB7XG4gIHJldHVybiBGSVJTVF9DSEFSX1JFR0VYUC5leGVjKHN0cilbMV1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNoYXJzZXQgb2YgYSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXFcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldENoYXJzZXQgKHJlcSkge1xuICB0cnkge1xuICAgIHJldHVybiAoY29udGVudFR5cGUucGFyc2UocmVxKS5wYXJhbWV0ZXJzLmNoYXJzZXQgfHwgJycpLnRvTG93ZXJDYXNlKClcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIFN5bnRheEVycm9yIGZvciBKU09OLnBhcnNlLlxuICpcbiAqIEBwYXJhbSB7U3ludGF4RXJyb3J9IGVycm9yXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtTeW50YXhFcnJvcn1cbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVKc29uU3ludGF4RXJyb3IgKGVycm9yLCBvYmopIHtcbiAgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnJvcilcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXVxuICAgIGlmIChrZXkgIT09ICdzdGFjaycgJiYga2V5ICE9PSAnbWVzc2FnZScpIHtcbiAgICAgIGRlbGV0ZSBlcnJvcltrZXldXG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3BzID0gT2JqZWN0LmtleXMob2JqKVxuXG4gIGZvciAodmFyIGogPSAwOyBqIDwgcHJvcHMubGVuZ3RoOyBqKyspIHtcbiAgICB2YXIgcHJvcCA9IHByb3BzW2pdXG4gICAgZXJyb3JbcHJvcF0gPSBvYmpbcHJvcF1cbiAgfVxuXG4gIHJldHVybiBlcnJvclxufVxuXG4vKipcbiAqIEdldCB0aGUgc2ltcGxlIHR5cGUgY2hlY2tlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKi9cblxuZnVuY3Rpb24gdHlwZUNoZWNrZXIgKHR5cGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNoZWNrVHlwZSAocmVxKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odHlwZWlzKHJlcSwgdHlwZSkpXG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9saWIvdHlwZXMvanNvbi5qc1xuLy8gbW9kdWxlIGlkID0gMTIyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0ge1wiMTAwXCI6XCJDb250aW51ZVwiLFwiMTAxXCI6XCJTd2l0Y2hpbmcgUHJvdG9jb2xzXCIsXCIxMDJcIjpcIlByb2Nlc3NpbmdcIixcIjIwMFwiOlwiT0tcIixcIjIwMVwiOlwiQ3JlYXRlZFwiLFwiMjAyXCI6XCJBY2NlcHRlZFwiLFwiMjAzXCI6XCJOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvblwiLFwiMjA0XCI6XCJObyBDb250ZW50XCIsXCIyMDVcIjpcIlJlc2V0IENvbnRlbnRcIixcIjIwNlwiOlwiUGFydGlhbCBDb250ZW50XCIsXCIyMDdcIjpcIk11bHRpLVN0YXR1c1wiLFwiMjA4XCI6XCJBbHJlYWR5IFJlcG9ydGVkXCIsXCIyMjZcIjpcIklNIFVzZWRcIixcIjMwMFwiOlwiTXVsdGlwbGUgQ2hvaWNlc1wiLFwiMzAxXCI6XCJNb3ZlZCBQZXJtYW5lbnRseVwiLFwiMzAyXCI6XCJGb3VuZFwiLFwiMzAzXCI6XCJTZWUgT3RoZXJcIixcIjMwNFwiOlwiTm90IE1vZGlmaWVkXCIsXCIzMDVcIjpcIlVzZSBQcm94eVwiLFwiMzA2XCI6XCIoVW51c2VkKVwiLFwiMzA3XCI6XCJUZW1wb3JhcnkgUmVkaXJlY3RcIixcIjMwOFwiOlwiUGVybWFuZW50IFJlZGlyZWN0XCIsXCI0MDBcIjpcIkJhZCBSZXF1ZXN0XCIsXCI0MDFcIjpcIlVuYXV0aG9yaXplZFwiLFwiNDAyXCI6XCJQYXltZW50IFJlcXVpcmVkXCIsXCI0MDNcIjpcIkZvcmJpZGRlblwiLFwiNDA0XCI6XCJOb3QgRm91bmRcIixcIjQwNVwiOlwiTWV0aG9kIE5vdCBBbGxvd2VkXCIsXCI0MDZcIjpcIk5vdCBBY2NlcHRhYmxlXCIsXCI0MDdcIjpcIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkXCIsXCI0MDhcIjpcIlJlcXVlc3QgVGltZW91dFwiLFwiNDA5XCI6XCJDb25mbGljdFwiLFwiNDEwXCI6XCJHb25lXCIsXCI0MTFcIjpcIkxlbmd0aCBSZXF1aXJlZFwiLFwiNDEyXCI6XCJQcmVjb25kaXRpb24gRmFpbGVkXCIsXCI0MTNcIjpcIlBheWxvYWQgVG9vIExhcmdlXCIsXCI0MTRcIjpcIlVSSSBUb28gTG9uZ1wiLFwiNDE1XCI6XCJVbnN1cHBvcnRlZCBNZWRpYSBUeXBlXCIsXCI0MTZcIjpcIlJhbmdlIE5vdCBTYXRpc2ZpYWJsZVwiLFwiNDE3XCI6XCJFeHBlY3RhdGlvbiBGYWlsZWRcIixcIjQxOFwiOlwiSSdtIGEgdGVhcG90XCIsXCI0MjFcIjpcIk1pc2RpcmVjdGVkIFJlcXVlc3RcIixcIjQyMlwiOlwiVW5wcm9jZXNzYWJsZSBFbnRpdHlcIixcIjQyM1wiOlwiTG9ja2VkXCIsXCI0MjRcIjpcIkZhaWxlZCBEZXBlbmRlbmN5XCIsXCI0MjVcIjpcIlVub3JkZXJlZCBDb2xsZWN0aW9uXCIsXCI0MjZcIjpcIlVwZ3JhZGUgUmVxdWlyZWRcIixcIjQyOFwiOlwiUHJlY29uZGl0aW9uIFJlcXVpcmVkXCIsXCI0MjlcIjpcIlRvbyBNYW55IFJlcXVlc3RzXCIsXCI0MzFcIjpcIlJlcXVlc3QgSGVhZGVyIEZpZWxkcyBUb28gTGFyZ2VcIixcIjQ1MVwiOlwiVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnNcIixcIjUwMFwiOlwiSW50ZXJuYWwgU2VydmVyIEVycm9yXCIsXCI1MDFcIjpcIk5vdCBJbXBsZW1lbnRlZFwiLFwiNTAyXCI6XCJCYWQgR2F0ZXdheVwiLFwiNTAzXCI6XCJTZXJ2aWNlIFVuYXZhaWxhYmxlXCIsXCI1MDRcIjpcIkdhdGV3YXkgVGltZW91dFwiLFwiNTA1XCI6XCJIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZFwiLFwiNTA2XCI6XCJWYXJpYW50IEFsc28gTmVnb3RpYXRlc1wiLFwiNTA3XCI6XCJJbnN1ZmZpY2llbnQgU3RvcmFnZVwiLFwiNTA4XCI6XCJMb29wIERldGVjdGVkXCIsXCI1MDlcIjpcIkJhbmR3aWR0aCBMaW1pdCBFeGNlZWRlZFwiLFwiNTEwXCI6XCJOb3QgRXh0ZW5kZWRcIixcIjUxMVwiOlwiTmV0d29yayBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZFwifVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9zdGF0dXNlcy9jb2Rlcy5qc29uXG4vLyBtb2R1bGUgaWQgPSAxMjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gMTI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogVGhpcyBpcyB0aGUgd2ViIGJyb3dzZXIgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICpcbiAqIEV4cG9zZSBgZGVidWcoKWAgYXMgdGhlIG1vZHVsZS5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2RlYnVnJyk7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5zdG9yYWdlID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZVxuICAgICAgICAgICAgICAgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNocm9tZS5zdG9yYWdlXG4gICAgICAgICAgICAgICAgICA/IGNocm9tZS5zdG9yYWdlLmxvY2FsXG4gICAgICAgICAgICAgICAgICA6IGxvY2Fsc3RvcmFnZSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcbiAgJ2xpZ2h0c2VhZ3JlZW4nLFxuICAnZm9yZXN0Z3JlZW4nLFxuICAnZ29sZGVucm9kJyxcbiAgJ2RvZGdlcmJsdWUnLFxuICAnZGFya29yY2hpZCcsXG4gICdjcmltc29uJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG4gIC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcbiAgLy8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2VcbiAgLy8gZXhwbGljaXRseVxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgd2luZG93LnByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gaXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcbiAgLy8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcbiAgcmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG4gICAgLy8gaXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuICAgICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG4gICAgLy8gaXMgZmlyZWZveCA+PSB2MzE/XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG4gICAgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykgJiYgcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCkgPj0gMzEpIHx8XG4gICAgLy8gZG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuICAgICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKSk7XG59XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24odikge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVyci5tZXNzYWdlO1xuICB9XG59O1xuXG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG4gIHZhciB1c2VDb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblxuICBhcmdzWzBdID0gKHVzZUNvbG9ycyA/ICclYycgOiAnJylcbiAgICArIHRoaXMubmFtZXNwYWNlXG4gICAgKyAodXNlQ29sb3JzID8gJyAlYycgOiAnICcpXG4gICAgKyBhcmdzWzBdXG4gICAgKyAodXNlQ29sb3JzID8gJyVjICcgOiAnICcpXG4gICAgKyAnKycgKyBleHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cbiAgaWYgKCF1c2VDb2xvcnMpIHJldHVybjtcblxuICB2YXIgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG4gIGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpXG5cbiAgLy8gdGhlIGZpbmFsIFwiJWNcIiBpcyBzb21ld2hhdCB0cmlja3ksIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXJcbiAgLy8gYXJndW1lbnRzIHBhc3NlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSAlYywgc28gd2UgbmVlZCB0b1xuICAvLyBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGluZGV4IHRvIGluc2VydCB0aGUgQ1NTIGludG9cbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxhc3RDID0gMDtcbiAgYXJnc1swXS5yZXBsYWNlKC8lW2EtekEtWiVdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgaWYgKCclJScgPT09IG1hdGNoKSByZXR1cm47XG4gICAgaW5kZXgrKztcbiAgICBpZiAoJyVjJyA9PT0gbWF0Y2gpIHtcbiAgICAgIC8vIHdlIG9ubHkgYXJlIGludGVyZXN0ZWQgaW4gdGhlICpsYXN0KiAlY1xuICAgICAgLy8gKHRoZSB1c2VyIG1heSBoYXZlIHByb3ZpZGVkIHRoZWlyIG93bilcbiAgICAgIGxhc3RDID0gaW5kZXg7XG4gICAgfVxuICB9KTtcblxuICBhcmdzLnNwbGljZShsYXN0QywgMCwgYyk7XG59XG5cbi8qKlxuICogSW52b2tlcyBgY29uc29sZS5sb2coKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmxvZ2AgaXMgbm90IGEgXCJmdW5jdGlvblwiLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gbG9nKCkge1xuICAvLyB0aGlzIGhhY2tlcnkgaXMgcmVxdWlyZWQgZm9yIElFOC85LCB3aGVyZVxuICAvLyB0aGUgYGNvbnNvbGUubG9nYCBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgJ2FwcGx5J1xuICByZXR1cm4gJ29iamVjdCcgPT09IHR5cGVvZiBjb25zb2xlXG4gICAgJiYgY29uc29sZS5sb2dcbiAgICAmJiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlLmxvZywgY29uc29sZSwgYXJndW1lbnRzKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG4gIHRyeSB7XG4gICAgaWYgKG51bGwgPT0gbmFtZXNwYWNlcykge1xuICAgICAgZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cG9ydHMuc3RvcmFnZS5kZWJ1ZyA9IG5hbWVzcGFjZXM7XG4gICAgfVxuICB9IGNhdGNoKGUpIHt9XG59XG5cbi8qKlxuICogTG9hZCBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSByZXR1cm5zIHRoZSBwcmV2aW91c2x5IHBlcnNpc3RlZCBkZWJ1ZyBtb2Rlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZCgpIHtcbiAgdmFyIHI7XG4gIHRyeSB7XG4gICAgciA9IGV4cG9ydHMuc3RvcmFnZS5kZWJ1ZztcbiAgfSBjYXRjaChlKSB7fVxuXG4gIC8vIElmIGRlYnVnIGlzbid0IHNldCBpbiBMUywgYW5kIHdlJ3JlIGluIEVsZWN0cm9uLCB0cnkgdG8gbG9hZCAkREVCVUdcbiAgaWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG4gICAgciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuICB9XG5cbiAgcmV0dXJuIHI7XG59XG5cbi8qKlxuICogRW5hYmxlIG5hbWVzcGFjZXMgbGlzdGVkIGluIGBsb2NhbFN0b3JhZ2UuZGVidWdgIGluaXRpYWxseS5cbiAqL1xuXG5leHBvcnRzLmVuYWJsZShsb2FkKCkpO1xuXG4vKipcbiAqIExvY2Fsc3RvcmFnZSBhdHRlbXB0cyB0byByZXR1cm4gdGhlIGxvY2Fsc3RvcmFnZS5cbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNhZmFyaSB0aHJvd3NcbiAqIHdoZW4gYSB1c2VyIGRpc2FibGVzIGNvb2tpZXMvbG9jYWxzdG9yYWdlXG4gKiBhbmQgeW91IGF0dGVtcHQgdG8gYWNjZXNzIGl0LlxuICpcbiAqIEByZXR1cm4ge0xvY2FsU3RvcmFnZX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvY2Fsc3RvcmFnZSgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZTtcbiAgfSBjYXRjaCAoZSkge31cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qc1xuLy8gbW9kdWxlIGlkID0gMTI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG52YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBOb2RlLmpzIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqXG4gKiBFeHBvc2UgYGRlYnVnKClgIGFzIHRoZSBtb2R1bGUuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kZWJ1ZycpO1xuZXhwb3J0cy5pbml0ID0gaW5pdDtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gWzYsIDIsIDMsIDQsIDUsIDFdO1xuXG4vKipcbiAqIEJ1aWxkIHVwIHRoZSBkZWZhdWx0IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiAgICQgREVCVUdfQ09MT1JTPW5vIERFQlVHX0RFUFRIPTEwIERFQlVHX1NIT1dfSElEREVOPWVuYWJsZWQgbm9kZSBzY3JpcHQuanNcbiAqL1xuXG5leHBvcnRzLmluc3BlY3RPcHRzID0gT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAvXmRlYnVnXy9pLnRlc3Qoa2V5KTtcbn0pLnJlZHVjZShmdW5jdGlvbiAob2JqLCBrZXkpIHtcbiAgLy8gY2FtZWwtY2FzZVxuICB2YXIgcHJvcCA9IGtleVxuICAgIC5zdWJzdHJpbmcoNilcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9fKFthLXpdKS9nLCBmdW5jdGlvbiAoXywgaykgeyByZXR1cm4gay50b1VwcGVyQ2FzZSgpIH0pO1xuXG4gIC8vIGNvZXJjZSBzdHJpbmcgdmFsdWUgaW50byBKUyB2YWx1ZVxuICB2YXIgdmFsID0gcHJvY2Vzcy5lbnZba2V5XTtcbiAgaWYgKC9eKHllc3xvbnx0cnVlfGVuYWJsZWQpJC9pLnRlc3QodmFsKSkgdmFsID0gdHJ1ZTtcbiAgZWxzZSBpZiAoL14obm98b2ZmfGZhbHNlfGRpc2FibGVkKSQvaS50ZXN0KHZhbCkpIHZhbCA9IGZhbHNlO1xuICBlbHNlIGlmICh2YWwgPT09ICdudWxsJykgdmFsID0gbnVsbDtcbiAgZWxzZSB2YWwgPSBOdW1iZXIodmFsKTtcblxuICBvYmpbcHJvcF0gPSB2YWw7XG4gIHJldHVybiBvYmo7XG59LCB7fSk7XG5cbi8qKlxuICogVGhlIGZpbGUgZGVzY3JpcHRvciB0byB3cml0ZSB0aGUgYGRlYnVnKClgIGNhbGxzIHRvLlxuICogU2V0IHRoZSBgREVCVUdfRkRgIGVudiB2YXJpYWJsZSB0byBvdmVycmlkZSB3aXRoIGFub3RoZXIgdmFsdWUuIGkuZS46XG4gKlxuICogICAkIERFQlVHX0ZEPTMgbm9kZSBzY3JpcHQuanMgMz5kZWJ1Zy5sb2dcbiAqL1xuXG52YXIgZmQgPSBwYXJzZUludChwcm9jZXNzLmVudi5ERUJVR19GRCwgMTApIHx8IDI7XG5cbmlmICgxICE9PSBmZCAmJiAyICE9PSBmZCkge1xuICB1dGlsLmRlcHJlY2F0ZShmdW5jdGlvbigpe30sICdleGNlcHQgZm9yIHN0ZGVycigyKSBhbmQgc3Rkb3V0KDEpLCBhbnkgb3RoZXIgdXNhZ2Ugb2YgREVCVUdfRkQgaXMgZGVwcmVjYXRlZC4gT3ZlcnJpZGUgZGVidWcubG9nIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBsb2cgZnVuY3Rpb24gKGh0dHBzOi8vZ2l0LmlvL2RlYnVnX2ZkKScpKClcbn1cblxudmFyIHN0cmVhbSA9IDEgPT09IGZkID8gcHJvY2Vzcy5zdGRvdXQgOlxuICAgICAgICAgICAgIDIgPT09IGZkID8gcHJvY2Vzcy5zdGRlcnIgOlxuICAgICAgICAgICAgIGNyZWF0ZVdyaXRhYmxlU3RkaW9TdHJlYW0oZmQpO1xuXG4vKipcbiAqIElzIHN0ZG91dCBhIFRUWT8gQ29sb3JlZCBvdXRwdXQgaXMgZW5hYmxlZCB3aGVuIGB0cnVlYC5cbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG4gIHJldHVybiAnY29sb3JzJyBpbiBleHBvcnRzLmluc3BlY3RPcHRzXG4gICAgPyBCb29sZWFuKGV4cG9ydHMuaW5zcGVjdE9wdHMuY29sb3JzKVxuICAgIDogdHR5LmlzYXR0eShmZCk7XG59XG5cbi8qKlxuICogTWFwICVvIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbCBvbiBhIHNpbmdsZSBsaW5lLlxuICovXG5cbmV4cG9ydHMuZm9ybWF0dGVycy5vID0gZnVuY3Rpb24odikge1xuICB0aGlzLmluc3BlY3RPcHRzLmNvbG9ycyA9IHRoaXMudXNlQ29sb3JzO1xuICByZXR1cm4gdXRpbC5pbnNwZWN0KHYsIHRoaXMuaW5zcGVjdE9wdHMpXG4gICAgLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24oc3RyKSB7XG4gICAgICByZXR1cm4gc3RyLnRyaW0oKVxuICAgIH0pLmpvaW4oJyAnKTtcbn07XG5cbi8qKlxuICogTWFwICVvIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbG93aW5nIG11bHRpcGxlIGxpbmVzIGlmIG5lZWRlZC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdHRlcnMuTyA9IGZ1bmN0aW9uKHYpIHtcbiAgdGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcbiAgcmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKTtcbn07XG5cbi8qKlxuICogQWRkcyBBTlNJIGNvbG9yIGVzY2FwZSBjb2RlcyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG4gIHZhciBuYW1lID0gdGhpcy5uYW1lc3BhY2U7XG4gIHZhciB1c2VDb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblxuICBpZiAodXNlQ29sb3JzKSB7XG4gICAgdmFyIGMgPSB0aGlzLmNvbG9yO1xuICAgIHZhciBwcmVmaXggPSAnICBcXHUwMDFiWzMnICsgYyArICc7MW0nICsgbmFtZSArICcgJyArICdcXHUwMDFiWzBtJztcblxuICAgIGFyZ3NbMF0gPSBwcmVmaXggKyBhcmdzWzBdLnNwbGl0KCdcXG4nKS5qb2luKCdcXG4nICsgcHJlZml4KTtcbiAgICBhcmdzLnB1c2goJ1xcdTAwMWJbMycgKyBjICsgJ20rJyArIGV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKSArICdcXHUwMDFiWzBtJyk7XG4gIH0gZWxzZSB7XG4gICAgYXJnc1swXSA9IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKVxuICAgICAgKyAnICcgKyBuYW1lICsgJyAnICsgYXJnc1swXTtcbiAgfVxufVxuXG4vKipcbiAqIEludm9rZXMgYHV0aWwuZm9ybWF0KClgIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMgYW5kIHdyaXRlcyB0byBgc3RyZWFtYC5cbiAqL1xuXG5mdW5jdGlvbiBsb2coKSB7XG4gIHJldHVybiBzdHJlYW0ud3JpdGUodXRpbC5mb3JtYXQuYXBwbHkodXRpbCwgYXJndW1lbnRzKSArICdcXG4nKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2F2ZShuYW1lc3BhY2VzKSB7XG4gIGlmIChudWxsID09IG5hbWVzcGFjZXMpIHtcbiAgICAvLyBJZiB5b3Ugc2V0IGEgcHJvY2Vzcy5lbnYgZmllbGQgdG8gbnVsbCBvciB1bmRlZmluZWQsIGl0IGdldHMgY2FzdCB0byB0aGVcbiAgICAvLyBzdHJpbmcgJ251bGwnIG9yICd1bmRlZmluZWQnLiBKdXN0IGRlbGV0ZSBpbnN0ZWFkLlxuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5ERUJVRztcbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLmVudi5ERUJVRyA9IG5hbWVzcGFjZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuREVCVUc7XG59XG5cbi8qKlxuICogQ29waWVkIGZyb20gYG5vZGUvc3JjL25vZGUuanNgLlxuICpcbiAqIFhYWDogSXQncyBsYW1lIHRoYXQgbm9kZSBkb2Vzbid0IGV4cG9zZSB0aGlzIEFQSSBvdXQtb2YtdGhlLWJveC4gSXQgYWxzb1xuICogcmVsaWVzIG9uIHRoZSB1bmRvY3VtZW50ZWQgYHR0eV93cmFwLmd1ZXNzSGFuZGxlVHlwZSgpYCB3aGljaCBpcyBhbHNvIGxhbWUuXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlV3JpdGFibGVTdGRpb1N0cmVhbSAoZmQpIHtcbiAgdmFyIHN0cmVhbTtcbiAgdmFyIHR0eV93cmFwID0gcHJvY2Vzcy5iaW5kaW5nKCd0dHlfd3JhcCcpO1xuXG4gIC8vIE5vdGUgc3RyZWFtLl90eXBlIGlzIHVzZWQgZm9yIHRlc3QtbW9kdWxlLWxvYWQtbGlzdC5qc1xuXG4gIHN3aXRjaCAodHR5X3dyYXAuZ3Vlc3NIYW5kbGVUeXBlKGZkKSkge1xuICAgIGNhc2UgJ1RUWSc6XG4gICAgICBzdHJlYW0gPSBuZXcgdHR5LldyaXRlU3RyZWFtKGZkKTtcbiAgICAgIHN0cmVhbS5fdHlwZSA9ICd0dHknO1xuXG4gICAgICAvLyBIYWNrIHRvIGhhdmUgc3RyZWFtIG5vdCBrZWVwIHRoZSBldmVudCBsb29wIGFsaXZlLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcyNlxuICAgICAgaWYgKHN0cmVhbS5faGFuZGxlICYmIHN0cmVhbS5faGFuZGxlLnVucmVmKSB7XG4gICAgICAgIHN0cmVhbS5faGFuZGxlLnVucmVmKCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ0ZJTEUnOlxuICAgICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgICAgIHN0cmVhbSA9IG5ldyBmcy5TeW5jV3JpdGVTdHJlYW0oZmQsIHsgYXV0b0Nsb3NlOiBmYWxzZSB9KTtcbiAgICAgIHN0cmVhbS5fdHlwZSA9ICdmcyc7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ1BJUEUnOlxuICAgIGNhc2UgJ1RDUCc6XG4gICAgICB2YXIgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7XG4gICAgICBzdHJlYW0gPSBuZXcgbmV0LlNvY2tldCh7XG4gICAgICAgIGZkOiBmZCxcbiAgICAgICAgcmVhZGFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZJWE1FIFNob3VsZCBwcm9iYWJseSBoYXZlIGFuIG9wdGlvbiBpbiBuZXQuU29ja2V0IHRvIGNyZWF0ZSBhXG4gICAgICAvLyBzdHJlYW0gZnJvbSBhbiBleGlzdGluZyBmZCB3aGljaCBpcyB3cml0YWJsZSBvbmx5LiBCdXQgZm9yIG5vd1xuICAgICAgLy8gd2UnbGwganVzdCBhZGQgdGhpcyBoYWNrIGFuZCBzZXQgdGhlIGByZWFkYWJsZWAgbWVtYmVyIHRvIGZhbHNlLlxuICAgICAgLy8gVGVzdDogLi9ub2RlIHRlc3QvZml4dHVyZXMvZWNoby5qcyA8IC9ldGMvcGFzc3dkXG4gICAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZWFkID0gbnVsbDtcbiAgICAgIHN0cmVhbS5fdHlwZSA9ICdwaXBlJztcblxuICAgICAgLy8gRklYTUUgSGFjayB0byBoYXZlIHN0cmVhbSBub3Qga2VlcCB0aGUgZXZlbnQgbG9vcCBhbGl2ZS5cbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvaXNzdWVzLzE3MjZcbiAgICAgIGlmIChzdHJlYW0uX2hhbmRsZSAmJiBzdHJlYW0uX2hhbmRsZS51bnJlZikge1xuICAgICAgICBzdHJlYW0uX2hhbmRsZS51bnJlZigpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gUHJvYmFibHkgYW4gZXJyb3Igb24gaW4gdXZfZ3Vlc3NfaGFuZGxlKClcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW1wbGVtZW50IG1lLiBVbmtub3duIHN0cmVhbSBmaWxlIHR5cGUhJyk7XG4gIH1cblxuICAvLyBGb3Igc3VwcG9ydGluZyBsZWdhY3kgQVBJIHdlIHB1dCB0aGUgRkQgaGVyZS5cbiAgc3RyZWFtLmZkID0gZmQ7XG5cbiAgc3RyZWFtLl9pc1N0ZGlvID0gdHJ1ZTtcblxuICByZXR1cm4gc3RyZWFtO1xufVxuXG4vKipcbiAqIEluaXQgbG9naWMgZm9yIGBkZWJ1Z2AgaW5zdGFuY2VzLlxuICpcbiAqIENyZWF0ZSBhIG5ldyBgaW5zcGVjdE9wdHNgIG9iamVjdCBpbiBjYXNlIGB1c2VDb2xvcnNgIGlzIHNldFxuICogZGlmZmVyZW50bHkgZm9yIGEgcGFydGljdWxhciBgZGVidWdgIGluc3RhbmNlLlxuICovXG5cbmZ1bmN0aW9uIGluaXQgKGRlYnVnKSB7XG4gIGRlYnVnLmluc3BlY3RPcHRzID0ge307XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhleHBvcnRzLmluc3BlY3RPcHRzKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgZGVidWcuaW5zcGVjdE9wdHNba2V5c1tpXV0gPSBleHBvcnRzLmluc3BlY3RPcHRzW2tleXNbaV1dO1xuICB9XG59XG5cbi8qKlxuICogRW5hYmxlIG5hbWVzcGFjZXMgbGlzdGVkIGluIGBwcm9jZXNzLmVudi5ERUJVR2AgaW5pdGlhbGx5LlxuICovXG5cbmV4cG9ydHMuZW5hYmxlKGxvYWQoKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL25vZGUuanNcbi8vIG1vZHVsZSBpZCA9IDEyNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ0dHlcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwgXCJ0dHlcIlxuLy8gbW9kdWxlIGlkID0gMTI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogcmF3LWJvZHlcbiAqIENvcHlyaWdodChjKSAyMDEzLTIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgYnl0ZXMgPSByZXF1aXJlKCdieXRlcycpXG52YXIgY3JlYXRlRXJyb3IgPSByZXF1aXJlKCdodHRwLWVycm9ycycpXG52YXIgaWNvbnYgPSByZXF1aXJlKCdpY29udi1saXRlJylcbnZhciB1bnBpcGUgPSByZXF1aXJlKCd1bnBpcGUnKVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UmF3Qm9keVxuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBJQ09OVl9FTkNPRElOR19NRVNTQUdFX1JFR0VYUCA9IC9eRW5jb2Rpbmcgbm90IHJlY29nbml6ZWQ6IC9cblxuLyoqXG4gKiBHZXQgdGhlIGRlY29kZXIgZm9yIGEgZ2l2ZW4gZW5jb2RpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kaW5nXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldERlY29kZXIgKGVuY29kaW5nKSB7XG4gIGlmICghZW5jb2RpbmcpIHJldHVybiBudWxsXG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gaWNvbnYuZ2V0RGVjb2RlcihlbmNvZGluZylcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGVycm9yIGdldHRpbmcgZGVjb2RlclxuICAgIGlmICghSUNPTlZfRU5DT0RJTkdfTUVTU0FHRV9SRUdFWFAudGVzdChlLm1lc3NhZ2UpKSB0aHJvdyBlXG5cbiAgICAvLyB0aGUgZW5jb2Rpbmcgd2FzIG5vdCBmb3VuZFxuICAgIHRocm93IGNyZWF0ZUVycm9yKDQxNSwgJ3NwZWNpZmllZCBlbmNvZGluZyB1bnN1cHBvcnRlZCcsIHtcbiAgICAgIGVuY29kaW5nOiBlbmNvZGluZyxcbiAgICAgIHR5cGU6ICdlbmNvZGluZy51bnN1cHBvcnRlZCdcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSByYXcgYm9keSBvZiBhIHN0cmVhbSAodHlwaWNhbGx5IEhUVFApLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHJlYW1cbiAqIEBwYXJhbSB7b2JqZWN0fHN0cmluZ3xmdW5jdGlvbn0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZ2V0UmF3Qm9keSAoc3RyZWFtLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZG9uZSA9IGNhbGxiYWNrXG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fVxuXG4gIGlmIChvcHRpb25zID09PSB0cnVlIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgIC8vIHNob3J0IGN1dCBmb3IgZW5jb2RpbmdcbiAgICBvcHRzID0ge1xuICAgICAgZW5jb2Rpbmc6IG9wdGlvbnNcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkb25lID0gb3B0aW9uc1xuICAgIG9wdHMgPSB7fVxuICB9XG5cbiAgLy8gdmFsaWRhdGUgY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiwgaWYgcHJvdmlkZWRcbiAgaWYgKGRvbmUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZG9uZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpXG4gIH1cblxuICAvLyByZXF1aXJlIHRoZSBjYWxsYmFjayB3aXRob3V0IHByb21pc2VzXG4gIGlmICghZG9uZSAmJiAhZ2xvYmFsLlByb21pc2UpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBjYWxsYmFjayBpcyByZXF1aXJlZCcpXG4gIH1cblxuICAvLyBnZXQgZW5jb2RpbmdcbiAgdmFyIGVuY29kaW5nID0gb3B0cy5lbmNvZGluZyAhPT0gdHJ1ZVxuICAgID8gb3B0cy5lbmNvZGluZ1xuICAgIDogJ3V0Zi04J1xuXG4gIC8vIGNvbnZlcnQgdGhlIGxpbWl0IHRvIGFuIGludGVnZXJcbiAgdmFyIGxpbWl0ID0gYnl0ZXMucGFyc2Uob3B0cy5saW1pdClcblxuICAvLyBjb252ZXJ0IHRoZSBleHBlY3RlZCBsZW5ndGggdG8gYW4gaW50ZWdlclxuICB2YXIgbGVuZ3RoID0gb3B0cy5sZW5ndGggIT0gbnVsbCAmJiAhaXNOYU4ob3B0cy5sZW5ndGgpXG4gICAgPyBwYXJzZUludChvcHRzLmxlbmd0aCwgMTApXG4gICAgOiBudWxsXG5cbiAgaWYgKGRvbmUpIHtcbiAgICAvLyBjbGFzc2ljIGNhbGxiYWNrIHN0eWxlXG4gICAgcmV0dXJuIHJlYWRTdHJlYW0oc3RyZWFtLCBlbmNvZGluZywgbGVuZ3RoLCBsaW1pdCwgZG9uZSlcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiBleGVjdXRvciAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgcmVhZFN0cmVhbShzdHJlYW0sIGVuY29kaW5nLCBsZW5ndGgsIGxpbWl0LCBmdW5jdGlvbiBvblJlYWQgKGVyciwgYnVmKSB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gcmVqZWN0KGVycilcbiAgICAgIHJlc29sdmUoYnVmKVxuICAgIH0pXG4gIH0pXG59XG5cbi8qKlxuICogSGFsdCBhIHN0cmVhbS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc3RyZWFtXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGhhbHQgKHN0cmVhbSkge1xuICAvLyB1bnBpcGUgZXZlcnl0aGluZyBmcm9tIHRoZSBzdHJlYW1cbiAgdW5waXBlKHN0cmVhbSlcblxuICAvLyBwYXVzZSBzdHJlYW1cbiAgaWYgKHR5cGVvZiBzdHJlYW0ucGF1c2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdHJlYW0ucGF1c2UoKVxuICB9XG59XG5cbi8qKlxuICogUmVhZCB0aGUgZGF0YSBmcm9tIHRoZSBzdHJlYW0uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHN0cmVhbVxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge251bWJlcn0gbGltaXRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcmVhZFN0cmVhbSAoc3RyZWFtLCBlbmNvZGluZywgbGVuZ3RoLCBsaW1pdCwgY2FsbGJhY2spIHtcbiAgdmFyIGNvbXBsZXRlID0gZmFsc2VcbiAgdmFyIHN5bmMgPSB0cnVlXG5cbiAgLy8gY2hlY2sgdGhlIGxlbmd0aCBhbmQgbGltaXQgb3B0aW9ucy5cbiAgLy8gbm90ZTogd2UgaW50ZW50aW9uYWxseSBsZWF2ZSB0aGUgc3RyZWFtIHBhdXNlZCxcbiAgLy8gc28gdXNlcnMgc2hvdWxkIGhhbmRsZSB0aGUgc3RyZWFtIHRoZW1zZWx2ZXMuXG4gIGlmIChsaW1pdCAhPT0gbnVsbCAmJiBsZW5ndGggIT09IG51bGwgJiYgbGVuZ3RoID4gbGltaXQpIHtcbiAgICByZXR1cm4gZG9uZShjcmVhdGVFcnJvcig0MTMsICdyZXF1ZXN0IGVudGl0eSB0b28gbGFyZ2UnLCB7XG4gICAgICBleHBlY3RlZDogbGVuZ3RoLFxuICAgICAgbGVuZ3RoOiBsZW5ndGgsXG4gICAgICBsaW1pdDogbGltaXQsXG4gICAgICB0eXBlOiAnZW50aXR5LnRvby5sYXJnZSdcbiAgICB9KSlcbiAgfVxuXG4gIC8vIHN0cmVhbXMxOiBhc3NlcnQgcmVxdWVzdCBlbmNvZGluZyBpcyBidWZmZXIuXG4gIC8vIHN0cmVhbXMyKzogYXNzZXJ0IHRoZSBzdHJlYW0gZW5jb2RpbmcgaXMgYnVmZmVyLlxuICAvLyAgIHN0cmVhbS5fZGVjb2Rlcjogc3RyZWFtczFcbiAgLy8gICBzdGF0ZS5lbmNvZGluZzogc3RyZWFtczJcbiAgLy8gICBzdGF0ZS5kZWNvZGVyOiBzdHJlYW1zMiwgc3BlY2lmaWNhbGx5IDwgMC4xMC42XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZVxuICBpZiAoc3RyZWFtLl9kZWNvZGVyIHx8IChzdGF0ZSAmJiAoc3RhdGUuZW5jb2RpbmcgfHwgc3RhdGUuZGVjb2RlcikpKSB7XG4gICAgLy8gZGV2ZWxvcGVyIGVycm9yXG4gICAgcmV0dXJuIGRvbmUoY3JlYXRlRXJyb3IoNTAwLCAnc3RyZWFtIGVuY29kaW5nIHNob3VsZCBub3QgYmUgc2V0Jywge1xuICAgICAgdHlwZTogJ3N0cmVhbS5lbmNvZGluZy5zZXQnXG4gICAgfSkpXG4gIH1cblxuICB2YXIgcmVjZWl2ZWQgPSAwXG4gIHZhciBkZWNvZGVyXG5cbiAgdHJ5IHtcbiAgICBkZWNvZGVyID0gZ2V0RGVjb2RlcihlbmNvZGluZylcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGRvbmUoZXJyKVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IGRlY29kZXJcbiAgICA/ICcnXG4gICAgOiBbXVxuXG4gIC8vIGF0dGFjaCBsaXN0ZW5lcnNcbiAgc3RyZWFtLm9uKCdhYm9ydGVkJywgb25BYm9ydGVkKVxuICBzdHJlYW0ub24oJ2Nsb3NlJywgY2xlYW51cClcbiAgc3RyZWFtLm9uKCdkYXRhJywgb25EYXRhKVxuICBzdHJlYW0ub24oJ2VuZCcsIG9uRW5kKVxuICBzdHJlYW0ub24oJ2Vycm9yJywgb25FbmQpXG5cbiAgLy8gbWFyayBzeW5jIHNlY3Rpb24gY29tcGxldGVcbiAgc3luYyA9IGZhbHNlXG5cbiAgZnVuY3Rpb24gZG9uZSAoKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcblxuICAgIC8vIGNvcHkgYXJndW1lbnRzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuXG4gICAgLy8gbWFyayBjb21wbGV0ZVxuICAgIGNvbXBsZXRlID0gdHJ1ZVxuXG4gICAgaWYgKHN5bmMpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soaW52b2tlQ2FsbGJhY2spXG4gICAgfSBlbHNlIHtcbiAgICAgIGludm9rZUNhbGxiYWNrKClcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnZva2VDYWxsYmFjayAoKSB7XG4gICAgICBjbGVhbnVwKClcblxuICAgICAgaWYgKGFyZ3NbMF0pIHtcbiAgICAgICAgLy8gaGFsdCB0aGUgc3RyZWFtIG9uIGVycm9yXG4gICAgICAgIGhhbHQoc3RyZWFtKVxuICAgICAgfVxuXG4gICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmdzKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQWJvcnRlZCAoKSB7XG4gICAgaWYgKGNvbXBsZXRlKSByZXR1cm5cblxuICAgIGRvbmUoY3JlYXRlRXJyb3IoNDAwLCAncmVxdWVzdCBhYm9ydGVkJywge1xuICAgICAgY29kZTogJ0VDT05OQUJPUlRFRCcsXG4gICAgICBleHBlY3RlZDogbGVuZ3RoLFxuICAgICAgbGVuZ3RoOiBsZW5ndGgsXG4gICAgICByZWNlaXZlZDogcmVjZWl2ZWQsXG4gICAgICB0eXBlOiAncmVxdWVzdC5hYm9ydGVkJ1xuICAgIH0pKVxuICB9XG5cbiAgZnVuY3Rpb24gb25EYXRhIChjaHVuaykge1xuICAgIGlmIChjb21wbGV0ZSkgcmV0dXJuXG5cbiAgICByZWNlaXZlZCArPSBjaHVuay5sZW5ndGhcblxuICAgIGlmIChsaW1pdCAhPT0gbnVsbCAmJiByZWNlaXZlZCA+IGxpbWl0KSB7XG4gICAgICBkb25lKGNyZWF0ZUVycm9yKDQxMywgJ3JlcXVlc3QgZW50aXR5IHRvbyBsYXJnZScsIHtcbiAgICAgICAgbGltaXQ6IGxpbWl0LFxuICAgICAgICByZWNlaXZlZDogcmVjZWl2ZWQsXG4gICAgICAgIHR5cGU6ICdlbnRpdHkudG9vLmxhcmdlJ1xuICAgICAgfSkpXG4gICAgfSBlbHNlIGlmIChkZWNvZGVyKSB7XG4gICAgICBidWZmZXIgKz0gZGVjb2Rlci53cml0ZShjaHVuaylcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmZmVyLnB1c2goY2h1bmspXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25FbmQgKGVycikge1xuICAgIGlmIChjb21wbGV0ZSkgcmV0dXJuXG4gICAgaWYgKGVycikgcmV0dXJuIGRvbmUoZXJyKVxuXG4gICAgaWYgKGxlbmd0aCAhPT0gbnVsbCAmJiByZWNlaXZlZCAhPT0gbGVuZ3RoKSB7XG4gICAgICBkb25lKGNyZWF0ZUVycm9yKDQwMCwgJ3JlcXVlc3Qgc2l6ZSBkaWQgbm90IG1hdGNoIGNvbnRlbnQgbGVuZ3RoJywge1xuICAgICAgICBleHBlY3RlZDogbGVuZ3RoLFxuICAgICAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICAgICAgcmVjZWl2ZWQ6IHJlY2VpdmVkLFxuICAgICAgICB0eXBlOiAncmVxdWVzdC5zaXplLmludmFsaWQnXG4gICAgICB9KSlcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHN0cmluZyA9IGRlY29kZXJcbiAgICAgICAgPyBidWZmZXIgKyAoZGVjb2Rlci5lbmQoKSB8fCAnJylcbiAgICAgICAgOiBCdWZmZXIuY29uY2F0KGJ1ZmZlcilcbiAgICAgIGRvbmUobnVsbCwgc3RyaW5nKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFudXAgKCkge1xuICAgIGJ1ZmZlciA9IG51bGxcblxuICAgIHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignYWJvcnRlZCcsIG9uQWJvcnRlZClcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBvbkRhdGEpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbkVuZClcbiAgICBzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FbmQpXG4gICAgc3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIGNsZWFudXApXG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9yYXctYm9keS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTI4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogaHR0cC1lcnJvcnNcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBkZXByZWNhdGUgPSByZXF1aXJlKCdkZXBkJykoJ2h0dHAtZXJyb3JzJylcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJ3NldHByb3RvdHlwZW9mJylcbnZhciBzdGF0dXNlcyA9IHJlcXVpcmUoJ3N0YXR1c2VzJylcbnZhciBpbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUVycm9yXG5tb2R1bGUuZXhwb3J0cy5IdHRwRXJyb3IgPSBjcmVhdGVIdHRwRXJyb3JDb25zdHJ1Y3RvcigpXG5cbi8vIFBvcHVsYXRlIGV4cG9ydHMgZm9yIGFsbCBjb25zdHJ1Y3RvcnNcbnBvcHVsYXRlQ29uc3RydWN0b3JFeHBvcnRzKG1vZHVsZS5leHBvcnRzLCBzdGF0dXNlcy5jb2RlcywgbW9kdWxlLmV4cG9ydHMuSHR0cEVycm9yKVxuXG4vKipcbiAqIEdldCB0aGUgY29kZSBjbGFzcyBvZiBhIHN0YXR1cyBjb2RlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb2RlQ2xhc3MgKHN0YXR1cykge1xuICByZXR1cm4gTnVtYmVyKFN0cmluZyhzdGF0dXMpLmNoYXJBdCgwKSArICcwMCcpXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IEhUVFAgRXJyb3IuXG4gKlxuICogQHJldHVybnMge0Vycm9yfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yICgpIHtcbiAgLy8gc28gbXVjaCBhcml0eSBnb2luZyBvbiB+X35cbiAgdmFyIGVyclxuICB2YXIgbXNnXG4gIHZhciBzdGF0dXMgPSA1MDBcbiAgdmFyIHByb3BzID0ge31cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYXJnID0gYXJndW1lbnRzW2ldXG4gICAgaWYgKGFyZyBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBlcnIgPSBhcmdcbiAgICAgIHN0YXR1cyA9IGVyci5zdGF0dXMgfHwgZXJyLnN0YXR1c0NvZGUgfHwgc3RhdHVzXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGVvZiBhcmcpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIG1zZyA9IGFyZ1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgc3RhdHVzID0gYXJnXG4gICAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgICAgZGVwcmVjYXRlKCdub24tZmlyc3QtYXJndW1lbnQgc3RhdHVzIGNvZGU7IHJlcGxhY2Ugd2l0aCBjcmVhdGVFcnJvcignICsgYXJnICsgJywgLi4uKScpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHByb3BzID0gYXJnXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInICYmIChzdGF0dXMgPCA0MDAgfHwgc3RhdHVzID49IDYwMCkpIHtcbiAgICBkZXByZWNhdGUoJ25vbi1lcnJvciBzdGF0dXMgY29kZTsgdXNlIG9ubHkgNHh4IG9yIDV4eCBzdGF0dXMgY29kZXMnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiBzdGF0dXMgIT09ICdudW1iZXInIHx8XG4gICAgKCFzdGF0dXNlc1tzdGF0dXNdICYmIChzdGF0dXMgPCA0MDAgfHwgc3RhdHVzID49IDYwMCkpKSB7XG4gICAgc3RhdHVzID0gNTAwXG4gIH1cblxuICAvLyBjb25zdHJ1Y3RvclxuICB2YXIgSHR0cEVycm9yID0gY3JlYXRlRXJyb3Jbc3RhdHVzXSB8fCBjcmVhdGVFcnJvcltjb2RlQ2xhc3Moc3RhdHVzKV1cblxuICBpZiAoIWVycikge1xuICAgIC8vIGNyZWF0ZSBlcnJvclxuICAgIGVyciA9IEh0dHBFcnJvclxuICAgICAgPyBuZXcgSHR0cEVycm9yKG1zZylcbiAgICAgIDogbmV3IEVycm9yKG1zZyB8fCBzdGF0dXNlc1tzdGF0dXNdKVxuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVyciwgY3JlYXRlRXJyb3IpXG4gIH1cblxuICBpZiAoIUh0dHBFcnJvciB8fCAhKGVyciBpbnN0YW5jZW9mIEh0dHBFcnJvcikgfHwgZXJyLnN0YXR1cyAhPT0gc3RhdHVzKSB7XG4gICAgLy8gYWRkIHByb3BlcnRpZXMgdG8gZ2VuZXJpYyBlcnJvclxuICAgIGVyci5leHBvc2UgPSBzdGF0dXMgPCA1MDBcbiAgICBlcnIuc3RhdHVzID0gZXJyLnN0YXR1c0NvZGUgPSBzdGF0dXNcbiAgfVxuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgIGlmIChrZXkgIT09ICdzdGF0dXMnICYmIGtleSAhPT0gJ3N0YXR1c0NvZGUnKSB7XG4gICAgICBlcnJba2V5XSA9IHByb3BzW2tleV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyXG59XG5cbi8qKlxuICogQ3JlYXRlIEhUVFAgZXJyb3IgYWJzdHJhY3QgYmFzZSBjbGFzcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlSHR0cEVycm9yQ29uc3RydWN0b3IgKCkge1xuICBmdW5jdGlvbiBIdHRwRXJyb3IgKCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2Nhbm5vdCBjb25zdHJ1Y3QgYWJzdHJhY3QgY2xhc3MnKVxuICB9XG5cbiAgaW5oZXJpdHMoSHR0cEVycm9yLCBFcnJvcilcblxuICByZXR1cm4gSHR0cEVycm9yXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY29uc3RydWN0b3IgZm9yIGEgY2xpZW50IGVycm9yLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVDbGllbnRFcnJvckNvbnN0cnVjdG9yIChIdHRwRXJyb3IsIG5hbWUsIGNvZGUpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IG5hbWUubWF0Y2goL0Vycm9yJC8pID8gbmFtZSA6IG5hbWUgKyAnRXJyb3InXG5cbiAgZnVuY3Rpb24gQ2xpZW50RXJyb3IgKG1lc3NhZ2UpIHtcbiAgICAvLyBjcmVhdGUgdGhlIGVycm9yIG9iamVjdFxuICAgIHZhciBtc2cgPSBtZXNzYWdlICE9IG51bGwgPyBtZXNzYWdlIDogc3RhdHVzZXNbY29kZV1cbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKG1zZylcblxuICAgIC8vIGNhcHR1cmUgYSBzdGFjayB0cmFjZSB0byB0aGUgY29uc3RydWN0aW9uIHBvaW50XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZXJyLCBDbGllbnRFcnJvcilcblxuICAgIC8vIGFkanVzdCB0aGUgW1tQcm90b3R5cGVdXVxuICAgIHNldFByb3RvdHlwZU9mKGVyciwgQ2xpZW50RXJyb3IucHJvdG90eXBlKVxuXG4gICAgLy8gcmVkZWZpbmUgdGhlIGVycm9yIG1lc3NhZ2VcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCAnbWVzc2FnZScsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogbXNnLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KVxuXG4gICAgLy8gcmVkZWZpbmUgdGhlIGVycm9yIG5hbWVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCAnbmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGNsYXNzTmFtZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSlcblxuICAgIHJldHVybiBlcnJcbiAgfVxuXG4gIGluaGVyaXRzKENsaWVudEVycm9yLCBIdHRwRXJyb3IpXG5cbiAgQ2xpZW50RXJyb3IucHJvdG90eXBlLnN0YXR1cyA9IGNvZGVcbiAgQ2xpZW50RXJyb3IucHJvdG90eXBlLnN0YXR1c0NvZGUgPSBjb2RlXG4gIENsaWVudEVycm9yLnByb3RvdHlwZS5leHBvc2UgPSB0cnVlXG5cbiAgcmV0dXJuIENsaWVudEVycm9yXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY29uc3RydWN0b3IgZm9yIGEgc2VydmVyIGVycm9yLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTZXJ2ZXJFcnJvckNvbnN0cnVjdG9yIChIdHRwRXJyb3IsIG5hbWUsIGNvZGUpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IG5hbWUubWF0Y2goL0Vycm9yJC8pID8gbmFtZSA6IG5hbWUgKyAnRXJyb3InXG5cbiAgZnVuY3Rpb24gU2VydmVyRXJyb3IgKG1lc3NhZ2UpIHtcbiAgICAvLyBjcmVhdGUgdGhlIGVycm9yIG9iamVjdFxuICAgIHZhciBtc2cgPSBtZXNzYWdlICE9IG51bGwgPyBtZXNzYWdlIDogc3RhdHVzZXNbY29kZV1cbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKG1zZylcblxuICAgIC8vIGNhcHR1cmUgYSBzdGFjayB0cmFjZSB0byB0aGUgY29uc3RydWN0aW9uIHBvaW50XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZXJyLCBTZXJ2ZXJFcnJvcilcblxuICAgIC8vIGFkanVzdCB0aGUgW1tQcm90b3R5cGVdXVxuICAgIHNldFByb3RvdHlwZU9mKGVyciwgU2VydmVyRXJyb3IucHJvdG90eXBlKVxuXG4gICAgLy8gcmVkZWZpbmUgdGhlIGVycm9yIG1lc3NhZ2VcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCAnbWVzc2FnZScsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogbXNnLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KVxuXG4gICAgLy8gcmVkZWZpbmUgdGhlIGVycm9yIG5hbWVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCAnbmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGNsYXNzTmFtZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSlcblxuICAgIHJldHVybiBlcnJcbiAgfVxuXG4gIGluaGVyaXRzKFNlcnZlckVycm9yLCBIdHRwRXJyb3IpXG5cbiAgU2VydmVyRXJyb3IucHJvdG90eXBlLnN0YXR1cyA9IGNvZGVcbiAgU2VydmVyRXJyb3IucHJvdG90eXBlLnN0YXR1c0NvZGUgPSBjb2RlXG4gIFNlcnZlckVycm9yLnByb3RvdHlwZS5leHBvc2UgPSBmYWxzZVxuXG4gIHJldHVybiBTZXJ2ZXJFcnJvclxufVxuXG4vKipcbiAqIFBvcHVsYXRlIHRoZSBleHBvcnRzIG9iamVjdCB3aXRoIGNvbnN0cnVjdG9ycyBmb3IgZXZlcnkgZXJyb3IgY2xhc3MuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBvcHVsYXRlQ29uc3RydWN0b3JFeHBvcnRzIChleHBvcnRzLCBjb2RlcywgSHR0cEVycm9yKSB7XG4gIGNvZGVzLmZvckVhY2goZnVuY3Rpb24gZm9yRWFjaENvZGUgKGNvZGUpIHtcbiAgICB2YXIgQ29kZUVycm9yXG4gICAgdmFyIG5hbWUgPSB0b0lkZW50aWZpZXIoc3RhdHVzZXNbY29kZV0pXG5cbiAgICBzd2l0Y2ggKGNvZGVDbGFzcyhjb2RlKSkge1xuICAgICAgY2FzZSA0MDA6XG4gICAgICAgIENvZGVFcnJvciA9IGNyZWF0ZUNsaWVudEVycm9yQ29uc3RydWN0b3IoSHR0cEVycm9yLCBuYW1lLCBjb2RlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSA1MDA6XG4gICAgICAgIENvZGVFcnJvciA9IGNyZWF0ZVNlcnZlckVycm9yQ29uc3RydWN0b3IoSHR0cEVycm9yLCBuYW1lLCBjb2RlKVxuICAgICAgICBicmVha1xuICAgIH1cblxuICAgIGlmIChDb2RlRXJyb3IpIHtcbiAgICAgIC8vIGV4cG9ydCB0aGUgY29uc3RydWN0b3JcbiAgICAgIGV4cG9ydHNbY29kZV0gPSBDb2RlRXJyb3JcbiAgICAgIGV4cG9ydHNbbmFtZV0gPSBDb2RlRXJyb3JcbiAgICB9XG4gIH0pXG5cbiAgLy8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHlcbiAgZXhwb3J0c1tcIkknbWF0ZWFwb3RcIl0gPSBkZXByZWNhdGUuZnVuY3Rpb24oZXhwb3J0cy5JbUFUZWFwb3QsXG4gICAgJ1wiSVxcJ21hdGVhcG90XCI7IHVzZSBcIkltQVRlYXBvdFwiIGluc3RlYWQnKVxufVxuXG4vKipcbiAqIENvbnZlcnQgYSBzdHJpbmcgb2Ygd29yZHMgdG8gYSBKYXZhU2NyaXB0IGlkZW50aWZpZXIuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRvSWRlbnRpZmllciAoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoJyAnKS5tYXAoZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgcmV0dXJuIHRva2VuLnNsaWNlKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyB0b2tlbi5zbGljZSgxKVxuICB9KS5qb2luKCcnKS5yZXBsYWNlKC9bXiBfMC05YS16XS9naSwgJycpXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvcmF3LWJvZHkvbm9kZV9tb2R1bGVzL2h0dHAtZXJyb3JzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxMjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBkZXBkXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGNhbGxTaXRlVG9TdHJpbmcgPSByZXF1aXJlKCcuL2xpYi9jb21wYXQnKS5jYWxsU2l0ZVRvU3RyaW5nXG52YXIgZXZlbnRMaXN0ZW5lckNvdW50ID0gcmVxdWlyZSgnLi9saWIvY29tcGF0JykuZXZlbnRMaXN0ZW5lckNvdW50XG52YXIgcmVsYXRpdmUgPSByZXF1aXJlKCdwYXRoJykucmVsYXRpdmVcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlcGRcblxuLyoqXG4gKiBHZXQgdGhlIHBhdGggdG8gYmFzZSBmaWxlcyBvbi5cbiAqL1xuXG52YXIgYmFzZVBhdGggPSBwcm9jZXNzLmN3ZCgpXG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIG5hbWVzcGFjZSBpcyBjb250YWluZWQgaW4gdGhlIHN0cmluZy5cbiAqL1xuXG5mdW5jdGlvbiBjb250YWluc05hbWVzcGFjZSAoc3RyLCBuYW1lc3BhY2UpIHtcbiAgdmFyIHZhbCA9IHN0ci5zcGxpdCgvWyAsXSsvKVxuXG4gIG5hbWVzcGFjZSA9IFN0cmluZyhuYW1lc3BhY2UpLnRvTG93ZXJDYXNlKClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgIGlmICghKHN0ciA9IHZhbFtpXSkpIGNvbnRpbnVlXG5cbiAgICAvLyBuYW1lc3BhY2UgY29udGFpbmVkXG4gICAgaWYgKHN0ciA9PT0gJyonIHx8IHN0ci50b0xvd2VyQ2FzZSgpID09PSBuYW1lc3BhY2UpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQ29udmVydCBhIGRhdGEgZGVzY3JpcHRvciB0byBhY2Nlc3NvciBkZXNjcmlwdG9yLlxuICovXG5cbmZ1bmN0aW9uIGNvbnZlcnREYXRhRGVzY3JpcHRvclRvQWNjZXNzb3IgKG9iaiwgcHJvcCwgbWVzc2FnZSkge1xuICB2YXIgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKVxuICB2YXIgdmFsdWUgPSBkZXNjcmlwdG9yLnZhbHVlXG5cbiAgZGVzY3JpcHRvci5nZXQgPSBmdW5jdGlvbiBnZXR0ZXIgKCkgeyByZXR1cm4gdmFsdWUgfVxuXG4gIGlmIChkZXNjcmlwdG9yLndyaXRhYmxlKSB7XG4gICAgZGVzY3JpcHRvci5zZXQgPSBmdW5jdGlvbiBzZXR0ZXIgKHZhbCkgeyByZXR1cm4gKHZhbHVlID0gdmFsKSB9XG4gIH1cblxuICBkZWxldGUgZGVzY3JpcHRvci52YWx1ZVxuICBkZWxldGUgZGVzY3JpcHRvci53cml0YWJsZVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2NyaXB0b3IpXG5cbiAgcmV0dXJuIGRlc2NyaXB0b3Jcbn1cblxuLyoqXG4gKiBDcmVhdGUgYXJndW1lbnRzIHN0cmluZyB0byBrZWVwIGFyaXR5LlxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUFyZ3VtZW50c1N0cmluZyAoYXJpdHkpIHtcbiAgdmFyIHN0ciA9ICcnXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcml0eTsgaSsrKSB7XG4gICAgc3RyICs9ICcsIGFyZycgKyBpXG4gIH1cblxuICByZXR1cm4gc3RyLnN1YnN0cigyKVxufVxuXG4vKipcbiAqIENyZWF0ZSBzdGFjayBzdHJpbmcgZnJvbSBzdGFjay5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVTdGFja1N0cmluZyAoc3RhY2spIHtcbiAgdmFyIHN0ciA9IHRoaXMubmFtZSArICc6ICcgKyB0aGlzLm5hbWVzcGFjZVxuXG4gIGlmICh0aGlzLm1lc3NhZ2UpIHtcbiAgICBzdHIgKz0gJyBkZXByZWNhdGVkICcgKyB0aGlzLm1lc3NhZ2VcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspIHtcbiAgICBzdHIgKz0gJ1xcbiAgICBhdCAnICsgY2FsbFNpdGVUb1N0cmluZyhzdGFja1tpXSlcbiAgfVxuXG4gIHJldHVybiBzdHJcbn1cblxuLyoqXG4gKiBDcmVhdGUgZGVwcmVjYXRlIGZvciBuYW1lc3BhY2UgaW4gY2FsbGVyLlxuICovXG5cbmZ1bmN0aW9uIGRlcGQgKG5hbWVzcGFjZSkge1xuICBpZiAoIW5hbWVzcGFjZSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IG5hbWVzcGFjZSBpcyByZXF1aXJlZCcpXG4gIH1cblxuICB2YXIgc3RhY2sgPSBnZXRTdGFjaygpXG4gIHZhciBzaXRlID0gY2FsbFNpdGVMb2NhdGlvbihzdGFja1sxXSlcbiAgdmFyIGZpbGUgPSBzaXRlWzBdXG5cbiAgZnVuY3Rpb24gZGVwcmVjYXRlIChtZXNzYWdlKSB7XG4gICAgLy8gY2FsbCB0byBzZWxmIGFzIGxvZ1xuICAgIGxvZy5jYWxsKGRlcHJlY2F0ZSwgbWVzc2FnZSlcbiAgfVxuXG4gIGRlcHJlY2F0ZS5fZmlsZSA9IGZpbGVcbiAgZGVwcmVjYXRlLl9pZ25vcmVkID0gaXNpZ25vcmVkKG5hbWVzcGFjZSlcbiAgZGVwcmVjYXRlLl9uYW1lc3BhY2UgPSBuYW1lc3BhY2VcbiAgZGVwcmVjYXRlLl90cmFjZWQgPSBpc3RyYWNlZChuYW1lc3BhY2UpXG4gIGRlcHJlY2F0ZS5fd2FybmVkID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIGRlcHJlY2F0ZS5mdW5jdGlvbiA9IHdyYXBmdW5jdGlvblxuICBkZXByZWNhdGUucHJvcGVydHkgPSB3cmFwcHJvcGVydHlcblxuICByZXR1cm4gZGVwcmVjYXRlXG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIG5hbWVzcGFjZSBpcyBpZ25vcmVkLlxuICovXG5cbmZ1bmN0aW9uIGlzaWdub3JlZCAobmFtZXNwYWNlKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiB0ZXN0ZWQgaW4gYSBjaGlsZCBwcm9jZXNzcyAqL1xuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uKSB7XG4gICAgLy8gLS1uby1kZXByZWNhdGlvbiBzdXBwb3J0XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHZhciBzdHIgPSBwcm9jZXNzLmVudi5OT19ERVBSRUNBVElPTiB8fCAnJ1xuXG4gIC8vIG5hbWVzcGFjZSBpZ25vcmVkXG4gIHJldHVybiBjb250YWluc05hbWVzcGFjZShzdHIsIG5hbWVzcGFjZSlcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgbmFtZXNwYWNlIGlzIHRyYWNlZC5cbiAqL1xuXG5mdW5jdGlvbiBpc3RyYWNlZCAobmFtZXNwYWNlKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiB0ZXN0ZWQgaW4gYSBjaGlsZCBwcm9jZXNzcyAqL1xuICBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgLy8gLS10cmFjZS1kZXByZWNhdGlvbiBzdXBwb3J0XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHZhciBzdHIgPSBwcm9jZXNzLmVudi5UUkFDRV9ERVBSRUNBVElPTiB8fCAnJ1xuXG4gIC8vIG5hbWVzcGFjZSB0cmFjZWRcbiAgcmV0dXJuIGNvbnRhaW5zTmFtZXNwYWNlKHN0ciwgbmFtZXNwYWNlKVxufVxuXG4vKipcbiAqIERpc3BsYXkgZGVwcmVjYXRpb24gbWVzc2FnZS5cbiAqL1xuXG5mdW5jdGlvbiBsb2cgKG1lc3NhZ2UsIHNpdGUpIHtcbiAgdmFyIGhhc2xpc3RlbmVycyA9IGV2ZW50TGlzdGVuZXJDb3VudChwcm9jZXNzLCAnZGVwcmVjYXRpb24nKSAhPT0gMFxuXG4gIC8vIGFib3J0IGVhcmx5IGlmIG5vIGRlc3RpbmF0aW9uXG4gIGlmICghaGFzbGlzdGVuZXJzICYmIHRoaXMuX2lnbm9yZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBjYWxsZXJcbiAgdmFyIGNhbGxGaWxlXG4gIHZhciBjYWxsU2l0ZVxuICB2YXIgaSA9IDBcbiAgdmFyIHNlZW4gPSBmYWxzZVxuICB2YXIgc3RhY2sgPSBnZXRTdGFjaygpXG4gIHZhciBmaWxlID0gdGhpcy5fZmlsZVxuXG4gIGlmIChzaXRlKSB7XG4gICAgLy8gcHJvdmlkZWQgc2l0ZVxuICAgIGNhbGxTaXRlID0gY2FsbFNpdGVMb2NhdGlvbihzdGFja1sxXSlcbiAgICBjYWxsU2l0ZS5uYW1lID0gc2l0ZS5uYW1lXG4gICAgZmlsZSA9IGNhbGxTaXRlWzBdXG4gIH0gZWxzZSB7XG4gICAgLy8gZ2V0IGNhbGwgc2l0ZVxuICAgIGkgPSAyXG4gICAgc2l0ZSA9IGNhbGxTaXRlTG9jYXRpb24oc3RhY2tbaV0pXG4gICAgY2FsbFNpdGUgPSBzaXRlXG4gIH1cblxuICAvLyBnZXQgY2FsbGVyIG9mIGRlcHJlY2F0ZWQgdGhpbmcgaW4gcmVsYXRpb24gdG8gZmlsZVxuICBmb3IgKDsgaSA8IHN0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgY2FsbGVyID0gY2FsbFNpdGVMb2NhdGlvbihzdGFja1tpXSlcbiAgICBjYWxsRmlsZSA9IGNhbGxlclswXVxuXG4gICAgaWYgKGNhbGxGaWxlID09PSBmaWxlKSB7XG4gICAgICBzZWVuID0gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoY2FsbEZpbGUgPT09IHRoaXMuX2ZpbGUpIHtcbiAgICAgIGZpbGUgPSB0aGlzLl9maWxlXG4gICAgfSBlbHNlIGlmIChzZWVuKSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIHZhciBrZXkgPSBjYWxsZXJcbiAgICA/IHNpdGUuam9pbignOicpICsgJ19fJyArIGNhbGxlci5qb2luKCc6JylcbiAgICA6IHVuZGVmaW5lZFxuXG4gIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiBrZXkgaW4gdGhpcy5fd2FybmVkKSB7XG4gICAgLy8gYWxyZWFkeSB3YXJuZWRcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRoaXMuX3dhcm5lZFtrZXldID0gdHJ1ZVxuXG4gIC8vIGdlbmVyYXRlIGF1dG9tYXRpYyBtZXNzYWdlIGZyb20gY2FsbCBzaXRlXG4gIGlmICghbWVzc2FnZSkge1xuICAgIG1lc3NhZ2UgPSBjYWxsU2l0ZSA9PT0gc2l0ZSB8fCAhY2FsbFNpdGUubmFtZVxuICAgICAgPyBkZWZhdWx0TWVzc2FnZShzaXRlKVxuICAgICAgOiBkZWZhdWx0TWVzc2FnZShjYWxsU2l0ZSlcbiAgfVxuXG4gIC8vIGVtaXQgZGVwcmVjYXRpb24gaWYgbGlzdGVuZXJzIGV4aXN0XG4gIGlmIChoYXNsaXN0ZW5lcnMpIHtcbiAgICB2YXIgZXJyID0gRGVwcmVjYXRpb25FcnJvcih0aGlzLl9uYW1lc3BhY2UsIG1lc3NhZ2UsIHN0YWNrLnNsaWNlKGkpKVxuICAgIHByb2Nlc3MuZW1pdCgnZGVwcmVjYXRpb24nLCBlcnIpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBmb3JtYXQgYW5kIHdyaXRlIG1lc3NhZ2VcbiAgdmFyIGZvcm1hdCA9IHByb2Nlc3Muc3RkZXJyLmlzVFRZXG4gICAgPyBmb3JtYXRDb2xvclxuICAgIDogZm9ybWF0UGxhaW5cbiAgdmFyIG1zZyA9IGZvcm1hdC5jYWxsKHRoaXMsIG1lc3NhZ2UsIGNhbGxlciwgc3RhY2suc2xpY2UoaSkpXG4gIHByb2Nlc3Muc3RkZXJyLndyaXRlKG1zZyArICdcXG4nLCAndXRmOCcpXG59XG5cbi8qKlxuICogR2V0IGNhbGwgc2l0ZSBsb2NhdGlvbiBhcyBhcnJheS5cbiAqL1xuXG5mdW5jdGlvbiBjYWxsU2l0ZUxvY2F0aW9uIChjYWxsU2l0ZSkge1xuICB2YXIgZmlsZSA9IGNhbGxTaXRlLmdldEZpbGVOYW1lKCkgfHwgJzxhbm9ueW1vdXM+J1xuICB2YXIgbGluZSA9IGNhbGxTaXRlLmdldExpbmVOdW1iZXIoKVxuICB2YXIgY29sbSA9IGNhbGxTaXRlLmdldENvbHVtbk51bWJlcigpXG5cbiAgaWYgKGNhbGxTaXRlLmlzRXZhbCgpKSB7XG4gICAgZmlsZSA9IGNhbGxTaXRlLmdldEV2YWxPcmlnaW4oKSArICcsICcgKyBmaWxlXG4gIH1cblxuICB2YXIgc2l0ZSA9IFtmaWxlLCBsaW5lLCBjb2xtXVxuXG4gIHNpdGUuY2FsbFNpdGUgPSBjYWxsU2l0ZVxuICBzaXRlLm5hbWUgPSBjYWxsU2l0ZS5nZXRGdW5jdGlvbk5hbWUoKVxuXG4gIHJldHVybiBzaXRlXG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBkZWZhdWx0IG1lc3NhZ2UgZnJvbSB0aGUgc2l0ZS5cbiAqL1xuXG5mdW5jdGlvbiBkZWZhdWx0TWVzc2FnZSAoc2l0ZSkge1xuICB2YXIgY2FsbFNpdGUgPSBzaXRlLmNhbGxTaXRlXG4gIHZhciBmdW5jTmFtZSA9IHNpdGUubmFtZVxuXG4gIC8vIG1ha2UgdXNlZnVsIGFub255bW91cyBuYW1lXG4gIGlmICghZnVuY05hbWUpIHtcbiAgICBmdW5jTmFtZSA9ICc8YW5vbnltb3VzQCcgKyBmb3JtYXRMb2NhdGlvbihzaXRlKSArICc+J1xuICB9XG5cbiAgdmFyIGNvbnRleHQgPSBjYWxsU2l0ZS5nZXRUaGlzKClcbiAgdmFyIHR5cGVOYW1lID0gY29udGV4dCAmJiBjYWxsU2l0ZS5nZXRUeXBlTmFtZSgpXG5cbiAgLy8gaWdub3JlIHVzZWxlc3MgdHlwZSBuYW1lXG4gIGlmICh0eXBlTmFtZSA9PT0gJ09iamVjdCcpIHtcbiAgICB0eXBlTmFtZSA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLy8gbWFrZSB1c2VmdWwgdHlwZSBuYW1lXG4gIGlmICh0eXBlTmFtZSA9PT0gJ0Z1bmN0aW9uJykge1xuICAgIHR5cGVOYW1lID0gY29udGV4dC5uYW1lIHx8IHR5cGVOYW1lXG4gIH1cblxuICByZXR1cm4gdHlwZU5hbWUgJiYgY2FsbFNpdGUuZ2V0TWV0aG9kTmFtZSgpXG4gICAgPyB0eXBlTmFtZSArICcuJyArIGZ1bmNOYW1lXG4gICAgOiBmdW5jTmFtZVxufVxuXG4vKipcbiAqIEZvcm1hdCBkZXByZWNhdGlvbiBtZXNzYWdlIHdpdGhvdXQgY29sb3IuXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0UGxhaW4gKG1zZywgY2FsbGVyLCBzdGFjaykge1xuICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXG5cbiAgdmFyIGZvcm1hdHRlZCA9IHRpbWVzdGFtcCArXG4gICAgJyAnICsgdGhpcy5fbmFtZXNwYWNlICtcbiAgICAnIGRlcHJlY2F0ZWQgJyArIG1zZ1xuXG4gIC8vIGFkZCBzdGFjayB0cmFjZVxuICBpZiAodGhpcy5fdHJhY2VkKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGFjay5sZW5ndGg7IGkrKykge1xuICAgICAgZm9ybWF0dGVkICs9ICdcXG4gICAgYXQgJyArIGNhbGxTaXRlVG9TdHJpbmcoc3RhY2tbaV0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdHRlZFxuICB9XG5cbiAgaWYgKGNhbGxlcikge1xuICAgIGZvcm1hdHRlZCArPSAnIGF0ICcgKyBmb3JtYXRMb2NhdGlvbihjYWxsZXIpXG4gIH1cblxuICByZXR1cm4gZm9ybWF0dGVkXG59XG5cbi8qKlxuICogRm9ybWF0IGRlcHJlY2F0aW9uIG1lc3NhZ2Ugd2l0aCBjb2xvci5cbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRDb2xvciAobXNnLCBjYWxsZXIsIHN0YWNrKSB7XG4gIHZhciBmb3JtYXR0ZWQgPSAnXFx4MWJbMzY7MW0nICsgdGhpcy5fbmFtZXNwYWNlICsgJ1xceDFiWzIyOzM5bScgKyAvLyBib2xkIGN5YW5cbiAgICAnIFxceDFiWzMzOzFtZGVwcmVjYXRlZFxceDFiWzIyOzM5bScgKyAvLyBib2xkIHllbGxvd1xuICAgICcgXFx4MWJbMG0nICsgbXNnICsgJ1xceDFiWzM5bScgLy8gcmVzZXRcblxuICAvLyBhZGQgc3RhY2sgdHJhY2VcbiAgaWYgKHRoaXMuX3RyYWNlZCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvcm1hdHRlZCArPSAnXFxuICAgIFxceDFiWzM2bWF0ICcgKyBjYWxsU2l0ZVRvU3RyaW5nKHN0YWNrW2ldKSArICdcXHgxYlszOW0nIC8vIGN5YW5cbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0dGVkXG4gIH1cblxuICBpZiAoY2FsbGVyKSB7XG4gICAgZm9ybWF0dGVkICs9ICcgXFx4MWJbMzZtJyArIGZvcm1hdExvY2F0aW9uKGNhbGxlcikgKyAnXFx4MWJbMzltJyAvLyBjeWFuXG4gIH1cblxuICByZXR1cm4gZm9ybWF0dGVkXG59XG5cbi8qKlxuICogRm9ybWF0IGNhbGwgc2l0ZSBsb2NhdGlvbi5cbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRMb2NhdGlvbiAoY2FsbFNpdGUpIHtcbiAgcmV0dXJuIHJlbGF0aXZlKGJhc2VQYXRoLCBjYWxsU2l0ZVswXSkgK1xuICAgICc6JyArIGNhbGxTaXRlWzFdICtcbiAgICAnOicgKyBjYWxsU2l0ZVsyXVxufVxuXG4vKipcbiAqIEdldCB0aGUgc3RhY2sgYXMgYXJyYXkgb2YgY2FsbCBzaXRlcy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRTdGFjayAoKSB7XG4gIHZhciBsaW1pdCA9IEVycm9yLnN0YWNrVHJhY2VMaW1pdFxuICB2YXIgb2JqID0ge31cbiAgdmFyIHByZXAgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZVxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJlcGFyZU9iamVjdFN0YWNrVHJhY2VcbiAgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0ID0gTWF0aC5tYXgoMTAsIGxpbWl0KVxuXG4gIC8vIGNhcHR1cmUgdGhlIHN0YWNrXG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKG9iailcblxuICAvLyBzbGljZSB0aGlzIGZ1bmN0aW9uIG9mZiB0aGUgdG9wXG4gIHZhciBzdGFjayA9IG9iai5zdGFjay5zbGljZSgxKVxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJlcFxuICBFcnJvci5zdGFja1RyYWNlTGltaXQgPSBsaW1pdFxuXG4gIHJldHVybiBzdGFja1xufVxuXG4vKipcbiAqIENhcHR1cmUgY2FsbCBzaXRlIHN0YWNrIGZyb20gdjguXG4gKi9cblxuZnVuY3Rpb24gcHJlcGFyZU9iamVjdFN0YWNrVHJhY2UgKG9iaiwgc3RhY2spIHtcbiAgcmV0dXJuIHN0YWNrXG59XG5cbi8qKlxuICogUmV0dXJuIGEgd3JhcHBlZCBmdW5jdGlvbiBpbiBhIGRlcHJlY2F0aW9uIG1lc3NhZ2UuXG4gKi9cblxuZnVuY3Rpb24gd3JhcGZ1bmN0aW9uIChmbiwgbWVzc2FnZSkge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgZm4gbXVzdCBiZSBhIGZ1bmN0aW9uJylcbiAgfVxuXG4gIHZhciBhcmdzID0gY3JlYXRlQXJndW1lbnRzU3RyaW5nKGZuLmxlbmd0aClcbiAgdmFyIGRlcHJlY2F0ZSA9IHRoaXMgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YXIgc3RhY2sgPSBnZXRTdGFjaygpXG4gIHZhciBzaXRlID0gY2FsbFNpdGVMb2NhdGlvbihzdGFja1sxXSlcblxuICBzaXRlLm5hbWUgPSBmbi5uYW1lXG5cbiAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1ldmFsXG4gIHZhciBkZXByZWNhdGVkZm4gPSBldmFsKCcoZnVuY3Rpb24gKCcgKyBhcmdzICsgJykge1xcbicgK1xuICAgICdcInVzZSBzdHJpY3RcIlxcbicgK1xuICAgICdsb2cuY2FsbChkZXByZWNhdGUsIG1lc3NhZ2UsIHNpdGUpXFxuJyArXG4gICAgJ3JldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXFxuJyArXG4gICAgJ30pJylcblxuICByZXR1cm4gZGVwcmVjYXRlZGZuXG59XG5cbi8qKlxuICogV3JhcCBwcm9wZXJ0eSBpbiBhIGRlcHJlY2F0aW9uIG1lc3NhZ2UuXG4gKi9cblxuZnVuY3Rpb24gd3JhcHByb3BlcnR5IChvYmosIHByb3AsIG1lc3NhZ2UpIHtcbiAgaWYgKCFvYmogfHwgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmogIT09ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgb2JqIG11c3QgYmUgb2JqZWN0JylcbiAgfVxuXG4gIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApXG5cbiAgaWYgKCFkZXNjcmlwdG9yKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbXVzdCBjYWxsIHByb3BlcnR5IG9uIG93bmVyIG9iamVjdCcpXG4gIH1cblxuICBpZiAoIWRlc2NyaXB0b3IuY29uZmlndXJhYmxlKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJvcGVydHkgbXVzdCBiZSBjb25maWd1cmFibGUnKVxuICB9XG5cbiAgdmFyIGRlcHJlY2F0ZSA9IHRoaXNcbiAgdmFyIHN0YWNrID0gZ2V0U3RhY2soKVxuICB2YXIgc2l0ZSA9IGNhbGxTaXRlTG9jYXRpb24oc3RhY2tbMV0pXG5cbiAgLy8gc2V0IHNpdGUgbmFtZVxuICBzaXRlLm5hbWUgPSBwcm9wXG5cbiAgLy8gY29udmVydCBkYXRhIGRlc2NyaXB0b3JcbiAgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcikge1xuICAgIGRlc2NyaXB0b3IgPSBjb252ZXJ0RGF0YURlc2NyaXB0b3JUb0FjY2Vzc29yKG9iaiwgcHJvcCwgbWVzc2FnZSlcbiAgfVxuXG4gIHZhciBnZXQgPSBkZXNjcmlwdG9yLmdldFxuICB2YXIgc2V0ID0gZGVzY3JpcHRvci5zZXRcblxuICAvLyB3cmFwIGdldHRlclxuICBpZiAodHlwZW9mIGdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRlc2NyaXB0b3IuZ2V0ID0gZnVuY3Rpb24gZ2V0dGVyICgpIHtcbiAgICAgIGxvZy5jYWxsKGRlcHJlY2F0ZSwgbWVzc2FnZSwgc2l0ZSlcbiAgICAgIHJldHVybiBnZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgIH1cbiAgfVxuXG4gIC8vIHdyYXAgc2V0dGVyXG4gIGlmICh0eXBlb2Ygc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZGVzY3JpcHRvci5zZXQgPSBmdW5jdGlvbiBzZXR0ZXIgKCkge1xuICAgICAgbG9nLmNhbGwoZGVwcmVjYXRlLCBtZXNzYWdlLCBzaXRlKVxuICAgICAgcmV0dXJuIHNldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgZGVzY3JpcHRvcilcbn1cblxuLyoqXG4gKiBDcmVhdGUgRGVwcmVjYXRpb25FcnJvciBmb3IgZGVwcmVjYXRpb25cbiAqL1xuXG5mdW5jdGlvbiBEZXByZWNhdGlvbkVycm9yIChuYW1lc3BhY2UsIG1lc3NhZ2UsIHN0YWNrKSB7XG4gIHZhciBlcnJvciA9IG5ldyBFcnJvcigpXG4gIHZhciBzdGFja1N0cmluZ1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwgJ2NvbnN0cnVjdG9yJywge1xuICAgIHZhbHVlOiBEZXByZWNhdGlvbkVycm9yXG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCAnbWVzc2FnZScsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IG1lc3NhZ2UsXG4gICAgd3JpdGFibGU6IHRydWVcbiAgfSlcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsICduYW1lJywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogJ0RlcHJlY2F0aW9uRXJyb3InLFxuICAgIHdyaXRhYmxlOiB0cnVlXG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCAnbmFtZXNwYWNlJywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogbmFtZXNwYWNlLFxuICAgIHdyaXRhYmxlOiB0cnVlXG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVycm9yLCAnc3RhY2snLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHN0YWNrU3RyaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrU3RyaW5nXG4gICAgICB9XG5cbiAgICAgIC8vIHByZXBhcmUgc3RhY2sgdHJhY2VcbiAgICAgIHJldHVybiAoc3RhY2tTdHJpbmcgPSBjcmVhdGVTdGFja1N0cmluZy5jYWxsKHRoaXMsIHN0YWNrKSlcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0dGVyICh2YWwpIHtcbiAgICAgIHN0YWNrU3RyaW5nID0gdmFsXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBlcnJvclxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3Jhdy1ib2R5L25vZGVfbW9kdWxlcy9kZXBkL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBkZXBkXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBjYWxsU2l0ZVRvU3RyaW5nXG5cbi8qKlxuICogRm9ybWF0IGEgQ2FsbFNpdGUgZmlsZSBsb2NhdGlvbiB0byBhIHN0cmluZy5cbiAqL1xuXG5mdW5jdGlvbiBjYWxsU2l0ZUZpbGVMb2NhdGlvbiAoY2FsbFNpdGUpIHtcbiAgdmFyIGZpbGVOYW1lXG4gIHZhciBmaWxlTG9jYXRpb24gPSAnJ1xuXG4gIGlmIChjYWxsU2l0ZS5pc05hdGl2ZSgpKSB7XG4gICAgZmlsZUxvY2F0aW9uID0gJ25hdGl2ZSdcbiAgfSBlbHNlIGlmIChjYWxsU2l0ZS5pc0V2YWwoKSkge1xuICAgIGZpbGVOYW1lID0gY2FsbFNpdGUuZ2V0U2NyaXB0TmFtZU9yU291cmNlVVJMKClcbiAgICBpZiAoIWZpbGVOYW1lKSB7XG4gICAgICBmaWxlTG9jYXRpb24gPSBjYWxsU2l0ZS5nZXRFdmFsT3JpZ2luKClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZmlsZU5hbWUgPSBjYWxsU2l0ZS5nZXRGaWxlTmFtZSgpXG4gIH1cblxuICBpZiAoZmlsZU5hbWUpIHtcbiAgICBmaWxlTG9jYXRpb24gKz0gZmlsZU5hbWVcblxuICAgIHZhciBsaW5lTnVtYmVyID0gY2FsbFNpdGUuZ2V0TGluZU51bWJlcigpXG4gICAgaWYgKGxpbmVOdW1iZXIgIT0gbnVsbCkge1xuICAgICAgZmlsZUxvY2F0aW9uICs9ICc6JyArIGxpbmVOdW1iZXJcblxuICAgICAgdmFyIGNvbHVtbk51bWJlciA9IGNhbGxTaXRlLmdldENvbHVtbk51bWJlcigpXG4gICAgICBpZiAoY29sdW1uTnVtYmVyKSB7XG4gICAgICAgIGZpbGVMb2NhdGlvbiArPSAnOicgKyBjb2x1bW5OdW1iZXJcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmlsZUxvY2F0aW9uIHx8ICd1bmtub3duIHNvdXJjZSdcbn1cblxuLyoqXG4gKiBGb3JtYXQgYSBDYWxsU2l0ZSB0byBhIHN0cmluZy5cbiAqL1xuXG5mdW5jdGlvbiBjYWxsU2l0ZVRvU3RyaW5nIChjYWxsU2l0ZSkge1xuICB2YXIgYWRkU3VmZml4ID0gdHJ1ZVxuICB2YXIgZmlsZUxvY2F0aW9uID0gY2FsbFNpdGVGaWxlTG9jYXRpb24oY2FsbFNpdGUpXG4gIHZhciBmdW5jdGlvbk5hbWUgPSBjYWxsU2l0ZS5nZXRGdW5jdGlvbk5hbWUoKVxuICB2YXIgaXNDb25zdHJ1Y3RvciA9IGNhbGxTaXRlLmlzQ29uc3RydWN0b3IoKVxuICB2YXIgaXNNZXRob2RDYWxsID0gIShjYWxsU2l0ZS5pc1RvcGxldmVsKCkgfHwgaXNDb25zdHJ1Y3RvcilcbiAgdmFyIGxpbmUgPSAnJ1xuXG4gIGlmIChpc01ldGhvZENhbGwpIHtcbiAgICB2YXIgbWV0aG9kTmFtZSA9IGNhbGxTaXRlLmdldE1ldGhvZE5hbWUoKVxuICAgIHZhciB0eXBlTmFtZSA9IGdldENvbnN0cnVjdG9yTmFtZShjYWxsU2l0ZSlcblxuICAgIGlmIChmdW5jdGlvbk5hbWUpIHtcbiAgICAgIGlmICh0eXBlTmFtZSAmJiBmdW5jdGlvbk5hbWUuaW5kZXhPZih0eXBlTmFtZSkgIT09IDApIHtcbiAgICAgICAgbGluZSArPSB0eXBlTmFtZSArICcuJ1xuICAgICAgfVxuXG4gICAgICBsaW5lICs9IGZ1bmN0aW9uTmFtZVxuXG4gICAgICBpZiAobWV0aG9kTmFtZSAmJiBmdW5jdGlvbk5hbWUubGFzdEluZGV4T2YoJy4nICsgbWV0aG9kTmFtZSkgIT09IGZ1bmN0aW9uTmFtZS5sZW5ndGggLSBtZXRob2ROYW1lLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgbGluZSArPSAnIFthcyAnICsgbWV0aG9kTmFtZSArICddJ1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lICs9IHR5cGVOYW1lICsgJy4nICsgKG1ldGhvZE5hbWUgfHwgJzxhbm9ueW1vdXM+JylcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNDb25zdHJ1Y3Rvcikge1xuICAgIGxpbmUgKz0gJ25ldyAnICsgKGZ1bmN0aW9uTmFtZSB8fCAnPGFub255bW91cz4nKVxuICB9IGVsc2UgaWYgKGZ1bmN0aW9uTmFtZSkge1xuICAgIGxpbmUgKz0gZnVuY3Rpb25OYW1lXG4gIH0gZWxzZSB7XG4gICAgYWRkU3VmZml4ID0gZmFsc2VcbiAgICBsaW5lICs9IGZpbGVMb2NhdGlvblxuICB9XG5cbiAgaWYgKGFkZFN1ZmZpeCkge1xuICAgIGxpbmUgKz0gJyAoJyArIGZpbGVMb2NhdGlvbiArICcpJ1xuICB9XG5cbiAgcmV0dXJuIGxpbmVcbn1cblxuLyoqXG4gKiBHZXQgY29uc3RydWN0b3IgbmFtZSBvZiByZXZpdmVyLlxuICovXG5cbmZ1bmN0aW9uIGdldENvbnN0cnVjdG9yTmFtZSAob2JqKSB7XG4gIHZhciByZWNlaXZlciA9IG9iai5yZWNlaXZlclxuICByZXR1cm4gKHJlY2VpdmVyLmNvbnN0cnVjdG9yICYmIHJlY2VpdmVyLmNvbnN0cnVjdG9yLm5hbWUpIHx8IG51bGxcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9yYXctYm9keS9ub2RlX21vZHVsZXMvZGVwZC9saWIvY29tcGF0L2NhbGxzaXRlLXRvc3RyaW5nLmpzXG4vLyBtb2R1bGUgaWQgPSAxMzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBkZXBkXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBldmVudExpc3RlbmVyQ291bnRcblxuLyoqXG4gKiBHZXQgdGhlIGNvdW50IG9mIGxpc3RlbmVycyBvbiBhbiBldmVudCBlbWl0dGVyIG9mIGEgc3BlY2lmaWMgdHlwZS5cbiAqL1xuXG5mdW5jdGlvbiBldmVudExpc3RlbmVyQ291bnQgKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aFxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3Jhdy1ib2R5L25vZGVfbW9kdWxlcy9kZXBkL2xpYi9jb21wYXQvZXZlbnQtbGlzdGVuZXItY291bnQuanNcbi8vIG1vZHVsZSBpZCA9IDEzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoe19fcHJvdG9fXzpbXX0gaW5zdGFuY2VvZiBBcnJheSA/IHNldFByb3RvT2YgOiBtaXhpblByb3BlcnRpZXMpO1xuXG5mdW5jdGlvbiBzZXRQcm90b09mKG9iaiwgcHJvdG8pIHtcblx0b2JqLl9fcHJvdG9fXyA9IHByb3RvO1xuXHRyZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBtaXhpblByb3BlcnRpZXMob2JqLCBwcm90bykge1xuXHRmb3IgKHZhciBwcm9wIGluIHByb3RvKSB7XG5cdFx0aWYgKCFvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcblx0XHRcdG9ialtwcm9wXSA9IHByb3RvW3Byb3BdO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb2JqO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3Jhdy1ib2R5L25vZGVfbW9kdWxlcy9zZXRwcm90b3R5cGVvZi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTMzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgQk9NQ2hhciA9ICdcXHVGRUZGJztcblxuZXhwb3J0cy5QcmVwZW5kQk9NID0gUHJlcGVuZEJPTVdyYXBwZXJcbmZ1bmN0aW9uIFByZXBlbmRCT01XcmFwcGVyKGVuY29kZXIsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmVuY29kZXIgPSBlbmNvZGVyO1xuICAgIHRoaXMuYWRkQk9NID0gdHJ1ZTtcbn1cblxuUHJlcGVuZEJPTVdyYXBwZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgaWYgKHRoaXMuYWRkQk9NKSB7XG4gICAgICAgIHN0ciA9IEJPTUNoYXIgKyBzdHI7XG4gICAgICAgIHRoaXMuYWRkQk9NID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZW5jb2Rlci53cml0ZShzdHIpO1xufVxuXG5QcmVwZW5kQk9NV3JhcHBlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5jb2Rlci5lbmQoKTtcbn1cblxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnRzLlN0cmlwQk9NID0gU3RyaXBCT01XcmFwcGVyO1xuZnVuY3Rpb24gU3RyaXBCT01XcmFwcGVyKGRlY29kZXIsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmRlY29kZXIgPSBkZWNvZGVyO1xuICAgIHRoaXMucGFzcyA9IGZhbHNlO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG59XG5cblN0cmlwQk9NV3JhcHBlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHtcbiAgICB2YXIgcmVzID0gdGhpcy5kZWNvZGVyLndyaXRlKGJ1Zik7XG4gICAgaWYgKHRoaXMucGFzcyB8fCAhcmVzKVxuICAgICAgICByZXR1cm4gcmVzO1xuXG4gICAgaWYgKHJlc1swXSA9PT0gQk9NQ2hhcikge1xuICAgICAgICByZXMgPSByZXMuc2xpY2UoMSk7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLnN0cmlwQk9NID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0cmlwQk9NKCk7XG4gICAgfVxuXG4gICAgdGhpcy5wYXNzID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG5TdHJpcEJPTVdyYXBwZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmRlY29kZXIuZW5kKCk7XG59XG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2xpYi9ib20taGFuZGxpbmcuanNcbi8vIG1vZHVsZSBpZCA9IDEzNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gVXBkYXRlIHRoaXMgYXJyYXkgaWYgeW91IGFkZC9yZW5hbWUvcmVtb3ZlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5LlxuLy8gV2Ugc3VwcG9ydCBCcm93c2VyaWZ5IGJ5IHNraXBwaW5nIGF1dG9tYXRpYyBtb2R1bGUgZGlzY292ZXJ5IGFuZCByZXF1aXJpbmcgbW9kdWxlcyBkaXJlY3RseS5cbnZhciBtb2R1bGVzID0gW1xuICAgIHJlcXVpcmUoXCIuL2ludGVybmFsXCIpLFxuICAgIHJlcXVpcmUoXCIuL3V0ZjE2XCIpLFxuICAgIHJlcXVpcmUoXCIuL3V0ZjdcIiksXG4gICAgcmVxdWlyZShcIi4vc2Jjcy1jb2RlY1wiKSxcbiAgICByZXF1aXJlKFwiLi9zYmNzLWRhdGFcIiksXG4gICAgcmVxdWlyZShcIi4vc2Jjcy1kYXRhLWdlbmVyYXRlZFwiKSxcbiAgICByZXF1aXJlKFwiLi9kYmNzLWNvZGVjXCIpLFxuICAgIHJlcXVpcmUoXCIuL2RiY3MtZGF0YVwiKSxcbl07XG5cbi8vIFB1dCBhbGwgZW5jb2RpbmcvYWxpYXMvY29kZWMgZGVmaW5pdGlvbnMgdG8gc2luZ2xlIG9iamVjdCBhbmQgZXhwb3J0IGl0LiBcbmZvciAodmFyIGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtb2R1bGUgPSBtb2R1bGVzW2ldO1xuICAgIGZvciAodmFyIGVuYyBpbiBtb2R1bGUpXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kdWxlLCBlbmMpKVxuICAgICAgICAgICAgZXhwb3J0c1tlbmNdID0gbW9kdWxlW2VuY107XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3MvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDEzNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBCdWZmZXIgPSByZXF1aXJlKFwiYnVmZmVyXCIpLkJ1ZmZlcjtcblxuLy8gRXhwb3J0IE5vZGUuanMgaW50ZXJuYWwgZW5jb2RpbmdzLlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAvLyBFbmNvZGluZ3NcbiAgICB1dGY4OiAgIHsgdHlwZTogXCJfaW50ZXJuYWxcIiwgYm9tQXdhcmU6IHRydWV9LFxuICAgIGNlc3U4OiAgeyB0eXBlOiBcIl9pbnRlcm5hbFwiLCBib21Bd2FyZTogdHJ1ZX0sXG4gICAgdW5pY29kZTExdXRmODogXCJ1dGY4XCIsXG5cbiAgICB1Y3MyOiAgIHsgdHlwZTogXCJfaW50ZXJuYWxcIiwgYm9tQXdhcmU6IHRydWV9LFxuICAgIHV0ZjE2bGU6IFwidWNzMlwiLFxuXG4gICAgYmluYXJ5OiB7IHR5cGU6IFwiX2ludGVybmFsXCIgfSxcbiAgICBiYXNlNjQ6IHsgdHlwZTogXCJfaW50ZXJuYWxcIiB9LFxuICAgIGhleDogICAgeyB0eXBlOiBcIl9pbnRlcm5hbFwiIH0sXG5cbiAgICAvLyBDb2RlYy5cbiAgICBfaW50ZXJuYWw6IEludGVybmFsQ29kZWMsXG59O1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBJbnRlcm5hbENvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgICB0aGlzLmVuYyA9IGNvZGVjT3B0aW9ucy5lbmNvZGluZ05hbWU7XG4gICAgdGhpcy5ib21Bd2FyZSA9IGNvZGVjT3B0aW9ucy5ib21Bd2FyZTtcblxuICAgIGlmICh0aGlzLmVuYyA9PT0gXCJiYXNlNjRcIilcbiAgICAgICAgdGhpcy5lbmNvZGVyID0gSW50ZXJuYWxFbmNvZGVyQmFzZTY0O1xuICAgIGVsc2UgaWYgKHRoaXMuZW5jID09PSBcImNlc3U4XCIpIHtcbiAgICAgICAgdGhpcy5lbmMgPSBcInV0ZjhcIjsgLy8gVXNlIHV0ZjggZm9yIGRlY29kaW5nLlxuICAgICAgICB0aGlzLmVuY29kZXIgPSBJbnRlcm5hbEVuY29kZXJDZXN1ODtcblxuICAgICAgICAvLyBBZGQgZGVjb2RlciBmb3IgdmVyc2lvbnMgb2YgTm9kZSBub3Qgc3VwcG9ydGluZyBDRVNVLThcbiAgICAgICAgaWYgKG5ldyBCdWZmZXIoJ2VkYTBiZGVkYjJhOScsICdoZXgnKS50b1N0cmluZygpICE9PSAn8J+SqScpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjb2RlciA9IEludGVybmFsRGVjb2RlckNlc3U4O1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUgPSBpY29udi5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkludGVybmFsQ29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBJbnRlcm5hbEVuY29kZXI7XG5JbnRlcm5hbENvZGVjLnByb3RvdHlwZS5kZWNvZGVyID0gSW50ZXJuYWxEZWNvZGVyO1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBXZSB1c2Ugbm9kZS5qcyBpbnRlcm5hbCBkZWNvZGVyLiBJdHMgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzIG91cnMuXG52YXIgU3RyaW5nRGVjb2RlciA9IHJlcXVpcmUoJ3N0cmluZ19kZWNvZGVyJykuU3RyaW5nRGVjb2RlcjtcblxuaWYgKCFTdHJpbmdEZWNvZGVyLnByb3RvdHlwZS5lbmQpIC8vIE5vZGUgdjAuOCBkb2Vzbid0IGhhdmUgdGhpcyBtZXRob2QuXG4gICAgU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7fTtcblxuXG5mdW5jdGlvbiBJbnRlcm5hbERlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICBTdHJpbmdEZWNvZGVyLmNhbGwodGhpcywgY29kZWMuZW5jKTtcbn1cblxuSW50ZXJuYWxEZWNvZGVyLnByb3RvdHlwZSA9IFN0cmluZ0RlY29kZXIucHJvdG90eXBlO1xuXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbmNvZGVyIGlzIG1vc3RseSB0cml2aWFsXG5cbmZ1bmN0aW9uIEludGVybmFsRW5jb2RlcihvcHRpb25zLCBjb2RlYykge1xuICAgIHRoaXMuZW5jID0gY29kZWMuZW5jO1xufVxuXG5JbnRlcm5hbEVuY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoc3RyLCB0aGlzLmVuYyk7XG59XG5cbkludGVybmFsRW5jb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG59XG5cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4Y2VwdCBiYXNlNjQgZW5jb2Rlciwgd2hpY2ggbXVzdCBrZWVwIGl0cyBzdGF0ZS5cblxuZnVuY3Rpb24gSW50ZXJuYWxFbmNvZGVyQmFzZTY0KG9wdGlvbnMsIGNvZGVjKSB7XG4gICAgdGhpcy5wcmV2U3RyID0gJyc7XG59XG5cbkludGVybmFsRW5jb2RlckJhc2U2NC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICBzdHIgPSB0aGlzLnByZXZTdHIgKyBzdHI7XG4gICAgdmFyIGNvbXBsZXRlUXVhZHMgPSBzdHIubGVuZ3RoIC0gKHN0ci5sZW5ndGggJSA0KTtcbiAgICB0aGlzLnByZXZTdHIgPSBzdHIuc2xpY2UoY29tcGxldGVRdWFkcyk7XG4gICAgc3RyID0gc3RyLnNsaWNlKDAsIGNvbXBsZXRlUXVhZHMpO1xuXG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoc3RyLCBcImJhc2U2NFwiKTtcbn1cblxuSW50ZXJuYWxFbmNvZGVyQmFzZTY0LnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEJ1ZmZlcih0aGlzLnByZXZTdHIsIFwiYmFzZTY0XCIpO1xufVxuXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDRVNVLTggZW5jb2RlciBpcyBhbHNvIHNwZWNpYWwuXG5cbmZ1bmN0aW9uIEludGVybmFsRW5jb2RlckNlc3U4KG9wdGlvbnMsIGNvZGVjKSB7XG59XG5cbkludGVybmFsRW5jb2RlckNlc3U4LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKHN0ci5sZW5ndGggKiAzKSwgYnVmSWR4ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgLy8gTmFpdmUgaW1wbGVtZW50YXRpb24sIGJ1dCBpdCB3b3JrcyBiZWNhdXNlIENFU1UtOCBpcyBlc3BlY2lhbGx5IGVhc3lcbiAgICAgICAgLy8gdG8gY29udmVydCBmcm9tIFVURi0xNiAod2hpY2ggYWxsIEpTIHN0cmluZ3MgYXJlIGVuY29kZWQgaW4pLlxuICAgICAgICBpZiAoY2hhckNvZGUgPCAweDgwKVxuICAgICAgICAgICAgYnVmW2J1ZklkeCsrXSA9IGNoYXJDb2RlO1xuICAgICAgICBlbHNlIGlmIChjaGFyQ29kZSA8IDB4ODAwKSB7XG4gICAgICAgICAgICBidWZbYnVmSWR4KytdID0gMHhDMCArIChjaGFyQ29kZSA+Pj4gNik7XG4gICAgICAgICAgICBidWZbYnVmSWR4KytdID0gMHg4MCArIChjaGFyQ29kZSAmIDB4M2YpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBjaGFyQ29kZSB3aWxsIGFsd2F5cyBiZSA8IDB4MTAwMDAgaW4gamF2YXNjcmlwdC5cbiAgICAgICAgICAgIGJ1ZltidWZJZHgrK10gPSAweEUwICsgKGNoYXJDb2RlID4+PiAxMik7XG4gICAgICAgICAgICBidWZbYnVmSWR4KytdID0gMHg4MCArICgoY2hhckNvZGUgPj4+IDYpICYgMHgzZik7XG4gICAgICAgICAgICBidWZbYnVmSWR4KytdID0gMHg4MCArIChjaGFyQ29kZSAmIDB4M2YpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBidWYuc2xpY2UoMCwgYnVmSWR4KTtcbn1cblxuSW50ZXJuYWxFbmNvZGVyQ2VzdTgucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ0VTVS04IGRlY29kZXIgaXMgbm90IGltcGxlbWVudGVkIGluIE5vZGUgdjQuMCtcblxuZnVuY3Rpb24gSW50ZXJuYWxEZWNvZGVyQ2VzdTgob3B0aW9ucywgY29kZWMpIHtcbiAgICB0aGlzLmFjYyA9IDA7XG4gICAgdGhpcy5jb250Qnl0ZXMgPSAwO1xuICAgIHRoaXMuYWNjQnl0ZXMgPSAwO1xuICAgIHRoaXMuZGVmYXVsdENoYXJVbmljb2RlID0gY29kZWMuZGVmYXVsdENoYXJVbmljb2RlO1xufVxuXG5JbnRlcm5hbERlY29kZXJDZXN1OC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHtcbiAgICB2YXIgYWNjID0gdGhpcy5hY2MsIGNvbnRCeXRlcyA9IHRoaXMuY29udEJ5dGVzLCBhY2NCeXRlcyA9IHRoaXMuYWNjQnl0ZXMsIFxuICAgICAgICByZXMgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY3VyQnl0ZSA9IGJ1ZltpXTtcbiAgICAgICAgaWYgKChjdXJCeXRlICYgMHhDMCkgIT09IDB4ODApIHsgLy8gTGVhZGluZyBieXRlXG4gICAgICAgICAgICBpZiAoY29udEJ5dGVzID4gMCkgeyAvLyBQcmV2aW91cyBjb2RlIGlzIGludmFsaWRcbiAgICAgICAgICAgICAgICByZXMgKz0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGU7XG4gICAgICAgICAgICAgICAgY29udEJ5dGVzID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1ckJ5dGUgPCAweDgwKSB7IC8vIFNpbmdsZS1ieXRlIGNvZGVcbiAgICAgICAgICAgICAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjdXJCeXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyQnl0ZSA8IDB4RTApIHsgLy8gVHdvLWJ5dGUgY29kZVxuICAgICAgICAgICAgICAgIGFjYyA9IGN1ckJ5dGUgJiAweDFGO1xuICAgICAgICAgICAgICAgIGNvbnRCeXRlcyA9IDE7IGFjY0J5dGVzID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyQnl0ZSA8IDB4RjApIHsgLy8gVGhyZWUtYnl0ZSBjb2RlXG4gICAgICAgICAgICAgICAgYWNjID0gY3VyQnl0ZSAmIDB4MEY7XG4gICAgICAgICAgICAgICAgY29udEJ5dGVzID0gMjsgYWNjQnl0ZXMgPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHsgLy8gRm91ciBvciBtb3JlIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBDRVNVLTguXG4gICAgICAgICAgICAgICAgcmVzICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgeyAvLyBDb250aW51YXRpb24gYnl0ZVxuICAgICAgICAgICAgaWYgKGNvbnRCeXRlcyA+IDApIHsgLy8gV2UncmUgd2FpdGluZyBmb3IgaXQuXG4gICAgICAgICAgICAgICAgYWNjID0gKGFjYyA8PCA2KSB8IChjdXJCeXRlICYgMHgzZik7XG4gICAgICAgICAgICAgICAgY29udEJ5dGVzLS07IGFjY0J5dGVzKys7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRCeXRlcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3Igb3ZlcmxvbmcgZW5jb2RpbmcsIGJ1dCBzdXBwb3J0IE1vZGlmaWVkIFVURi04IChlbmNvZGluZyBOVUxMIGFzIEMwIDgwKVxuICAgICAgICAgICAgICAgICAgICBpZiAoYWNjQnl0ZXMgPT09IDIgJiYgYWNjIDwgMHg4MCAmJiBhY2MgPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhY2NCeXRlcyA9PT0gMyAmJiBhY2MgPCAweDgwMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyArPSB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWN0dWFsbHkgYWRkIGNoYXJhY3Rlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFjYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHsgLy8gVW5leHBlY3RlZCBjb250aW51YXRpb24gYnl0ZVxuICAgICAgICAgICAgICAgIHJlcyArPSB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFjYyA9IGFjYzsgdGhpcy5jb250Qnl0ZXMgPSBjb250Qnl0ZXM7IHRoaXMuYWNjQnl0ZXMgPSBhY2NCeXRlcztcbiAgICByZXR1cm4gcmVzO1xufVxuXG5JbnRlcm5hbERlY29kZXJDZXN1OC5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlcyA9IDA7XG4gICAgaWYgKHRoaXMuY29udEJ5dGVzID4gMClcbiAgICAgICAgcmVzICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgIHJldHVybiByZXM7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3MvaW50ZXJuYWwuanNcbi8vIG1vZHVsZSBpZCA9IDEzNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBCdWZmZXIgPSByZXF1aXJlKFwiYnVmZmVyXCIpLkJ1ZmZlcjtcblxuLy8gTm90ZTogVVRGMTYtTEUgKG9yIFVDUzIpIGNvZGVjIGlzIE5vZGUuanMgbmF0aXZlLiBTZWUgZW5jb2RpbmdzL2ludGVybmFsLmpzXG5cbi8vID09IFVURjE2LUJFIGNvZGVjLiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydHMudXRmMTZiZSA9IFV0ZjE2QkVDb2RlYztcbmZ1bmN0aW9uIFV0ZjE2QkVDb2RlYygpIHtcbn1cblxuVXRmMTZCRUNvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmMTZCRUVuY29kZXI7XG5VdGYxNkJFQ29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBVdGYxNkJFRGVjb2RlcjtcblV0ZjE2QkVDb2RlYy5wcm90b3R5cGUuYm9tQXdhcmUgPSB0cnVlO1xuXG5cbi8vIC0tIEVuY29kaW5nXG5cbmZ1bmN0aW9uIFV0ZjE2QkVFbmNvZGVyKCkge1xufVxuXG5VdGYxNkJFRW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihzdHIsICd1Y3MyJyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgdmFyIHRtcCA9IGJ1ZltpXTsgYnVmW2ldID0gYnVmW2krMV07IGJ1ZltpKzFdID0gdG1wO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xufVxuXG5VdGYxNkJFRW5jb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG59XG5cblxuLy8gLS0gRGVjb2RpbmdcblxuZnVuY3Rpb24gVXRmMTZCRURlY29kZXIoKSB7XG4gICAgdGhpcy5vdmVyZmxvd0J5dGUgPSAtMTtcbn1cblxuVXRmMTZCRURlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmKSB7XG4gICAgaWYgKGJ1Zi5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuICcnO1xuXG4gICAgdmFyIGJ1ZjIgPSBuZXcgQnVmZmVyKGJ1Zi5sZW5ndGggKyAxKSxcbiAgICAgICAgaSA9IDAsIGogPSAwO1xuXG4gICAgaWYgKHRoaXMub3ZlcmZsb3dCeXRlICE9PSAtMSkge1xuICAgICAgICBidWYyWzBdID0gYnVmWzBdO1xuICAgICAgICBidWYyWzFdID0gdGhpcy5vdmVyZmxvd0J5dGU7XG4gICAgICAgIGkgPSAxOyBqID0gMjtcbiAgICB9XG5cbiAgICBmb3IgKDsgaSA8IGJ1Zi5sZW5ndGgtMTsgaSArPSAyLCBqKz0gMikge1xuICAgICAgICBidWYyW2pdID0gYnVmW2krMV07XG4gICAgICAgIGJ1ZjJbaisxXSA9IGJ1ZltpXTtcbiAgICB9XG5cbiAgICB0aGlzLm92ZXJmbG93Qnl0ZSA9IChpID09IGJ1Zi5sZW5ndGgtMSkgPyBidWZbYnVmLmxlbmd0aC0xXSA6IC0xO1xuXG4gICAgcmV0dXJuIGJ1ZjIuc2xpY2UoMCwgaikudG9TdHJpbmcoJ3VjczInKTtcbn1cblxuVXRmMTZCRURlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG5cbi8vID09IFVURi0xNiBjb2RlYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZWNvZGVyIGNob29zZXMgYXV0b21hdGljYWxseSBmcm9tIFVURi0xNkxFIGFuZCBVVEYtMTZCRSB1c2luZyBCT00gYW5kIHNwYWNlLWJhc2VkIGhldXJpc3RpYy5cbi8vIERlZmF1bHRzIHRvIFVURi0xNkxFLCBhcyBpdCdzIHByZXZhbGVudCBhbmQgZGVmYXVsdCBpbiBOb2RlLlxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYgYW5kIGh0dHA6Ly9lbmNvZGluZy5zcGVjLndoYXR3Zy5vcmcvI3V0Zi0xNmxlXG4vLyBEZWNvZGVyIGRlZmF1bHQgY2FuIGJlIGNoYW5nZWQ6IGljb252LmRlY29kZShidWYsICd1dGYxNicsIHtkZWZhdWx0RW5jb2Rpbmc6ICd1dGYtMTZiZSd9KTtcblxuLy8gRW5jb2RlciB1c2VzIFVURi0xNkxFIGFuZCBwcmVwZW5kcyBCT00gKHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggYWRkQk9NOiBmYWxzZSkuXG5cbmV4cG9ydHMudXRmMTYgPSBVdGYxNkNvZGVjO1xuZnVuY3Rpb24gVXRmMTZDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gICAgdGhpcy5pY29udiA9IGljb252O1xufVxuXG5VdGYxNkNvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gVXRmMTZFbmNvZGVyO1xuVXRmMTZDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IFV0ZjE2RGVjb2RlcjtcblxuXG4vLyAtLSBFbmNvZGluZyAocGFzcy10aHJvdWdoKVxuXG5mdW5jdGlvbiBVdGYxNkVuY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAob3B0aW9ucy5hZGRCT00gPT09IHVuZGVmaW5lZClcbiAgICAgICAgb3B0aW9ucy5hZGRCT00gPSB0cnVlO1xuICAgIHRoaXMuZW5jb2RlciA9IGNvZGVjLmljb252LmdldEVuY29kZXIoJ3V0Zi0xNmxlJywgb3B0aW9ucyk7XG59XG5cblV0ZjE2RW5jb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gdGhpcy5lbmNvZGVyLndyaXRlKHN0cik7XG59XG5cblV0ZjE2RW5jb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5jb2Rlci5lbmQoKTtcbn1cblxuXG4vLyAtLSBEZWNvZGluZ1xuXG5mdW5jdGlvbiBVdGYxNkRlY29kZXIob3B0aW9ucywgY29kZWMpIHtcbiAgICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICAgIHRoaXMuaW5pdGlhbEJ5dGVzID0gW107XG4gICAgdGhpcy5pbml0aWFsQnl0ZXNMZW4gPSAwO1xuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB0aGlzLmljb252ID0gY29kZWMuaWNvbnY7XG59XG5cblV0ZjE2RGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHtcbiAgICBpZiAoIXRoaXMuZGVjb2Rlcikge1xuICAgICAgICAvLyBDb2RlYyBpcyBub3QgY2hvc2VuIHlldC4gQWNjdW11bGF0ZSBpbml0aWFsIGJ5dGVzLlxuICAgICAgICB0aGlzLmluaXRpYWxCeXRlcy5wdXNoKGJ1Zik7XG4gICAgICAgIHRoaXMuaW5pdGlhbEJ5dGVzTGVuICs9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy5pbml0aWFsQnl0ZXNMZW4gPCAxNikgLy8gV2UgbmVlZCBtb3JlIGJ5dGVzIHRvIHVzZSBzcGFjZSBoZXVyaXN0aWMgKHNlZSBiZWxvdylcbiAgICAgICAgICAgIHJldHVybiAnJztcblxuICAgICAgICAvLyBXZSBoYXZlIGVub3VnaCBieXRlcyAtPiBkZXRlY3QgZW5kaWFubmVzcy5cbiAgICAgICAgdmFyIGJ1ZiA9IEJ1ZmZlci5jb25jYXQodGhpcy5pbml0aWFsQnl0ZXMpLFxuICAgICAgICAgICAgZW5jb2RpbmcgPSBkZXRlY3RFbmNvZGluZyhidWYsIHRoaXMub3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmRlY29kZXIgPSB0aGlzLmljb252LmdldERlY29kZXIoZW5jb2RpbmcsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMuaW5pdGlhbEJ5dGVzLmxlbmd0aCA9IHRoaXMuaW5pdGlhbEJ5dGVzTGVuID0gMDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kZWNvZGVyLndyaXRlKGJ1Zik7XG59XG5cblV0ZjE2RGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmRlY29kZXIpIHtcbiAgICAgICAgdmFyIGJ1ZiA9IEJ1ZmZlci5jb25jYXQodGhpcy5pbml0aWFsQnl0ZXMpLFxuICAgICAgICAgICAgZW5jb2RpbmcgPSBkZXRlY3RFbmNvZGluZyhidWYsIHRoaXMub3B0aW9ucy5kZWZhdWx0RW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmRlY29kZXIgPSB0aGlzLmljb252LmdldERlY29kZXIoZW5jb2RpbmcsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuZGVjb2Rlci53cml0ZShidWYpLFxuICAgICAgICAgICAgdHJhaWwgPSB0aGlzLmRlY29kZXIuZW5kKCk7XG5cbiAgICAgICAgcmV0dXJuIHRyYWlsID8gKHJlcyArIHRyYWlsKSA6IHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGVjb2Rlci5lbmQoKTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0RW5jb2RpbmcoYnVmLCBkZWZhdWx0RW5jb2RpbmcpIHtcbiAgICB2YXIgZW5jID0gZGVmYXVsdEVuY29kaW5nIHx8ICd1dGYtMTZsZSc7XG5cbiAgICBpZiAoYnVmLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIC8vIENoZWNrIEJPTS5cbiAgICAgICAgaWYgKGJ1ZlswXSA9PSAweEZFICYmIGJ1ZlsxXSA9PSAweEZGKSAvLyBVVEYtMTZCRSBCT01cbiAgICAgICAgICAgIGVuYyA9ICd1dGYtMTZiZSc7XG4gICAgICAgIGVsc2UgaWYgKGJ1ZlswXSA9PSAweEZGICYmIGJ1ZlsxXSA9PSAweEZFKSAvLyBVVEYtMTZMRSBCT01cbiAgICAgICAgICAgIGVuYyA9ICd1dGYtMTZsZSc7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8gQk9NIGZvdW5kLiBUcnkgdG8gZGVkdWNlIGVuY29kaW5nIGZyb20gaW5pdGlhbCBjb250ZW50LlxuICAgICAgICAgICAgLy8gTW9zdCBvZiB0aGUgdGltZSwgdGhlIGNvbnRlbnQgaGFzIEFTQ0lJIGNoYXJzIChVKzAwKiopLCBidXQgdGhlIG9wcG9zaXRlIChVKyoqMDApIGlzIHVuY29tbW9uLlxuICAgICAgICAgICAgLy8gU28sIHdlIGNvdW50IEFTQ0lJIGFzIGlmIGl0IHdhcyBMRSBvciBCRSwgYW5kIGRlY2lkZSBmcm9tIHRoYXQuXG4gICAgICAgICAgICB2YXIgYXNjaWlDaGFyc0xFID0gMCwgYXNjaWlDaGFyc0JFID0gMCwgLy8gQ291bnRzIG9mIGNoYXJzIGluIGJvdGggcG9zaXRpb25zXG4gICAgICAgICAgICAgICAgX2xlbiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSAoYnVmLmxlbmd0aCAlIDIpLCA2NCk7IC8vIExlbiBpcyBhbHdheXMgZXZlbi5cblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfbGVuOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnVmW2ldID09PSAwICYmIGJ1ZltpKzFdICE9PSAwKSBhc2NpaUNoYXJzQkUrKztcbiAgICAgICAgICAgICAgICBpZiAoYnVmW2ldICE9PSAwICYmIGJ1ZltpKzFdID09PSAwKSBhc2NpaUNoYXJzTEUrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFzY2lpQ2hhcnNCRSA+IGFzY2lpQ2hhcnNMRSlcbiAgICAgICAgICAgICAgICBlbmMgPSAndXRmLTE2YmUnO1xuICAgICAgICAgICAgZWxzZSBpZiAoYXNjaWlDaGFyc0JFIDwgYXNjaWlDaGFyc0xFKVxuICAgICAgICAgICAgICAgIGVuYyA9ICd1dGYtMTZsZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZW5jO1xufVxuXG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy91dGYxNi5qc1xuLy8gbW9kdWxlIGlkID0gMTM3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoXCJidWZmZXJcIikuQnVmZmVyO1xuXG4vLyBVVEYtNyBjb2RlYywgYWNjb3JkaW5nIHRvIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMTUyXG4vLyBTZWUgYWxzbyBiZWxvdyBhIFVURi03LUlNQVAgY29kZWMsIGFjY29yZGluZyB0byBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTAxI3NlY3Rpb24tNS4xLjNcblxuZXhwb3J0cy51dGY3ID0gVXRmN0NvZGVjO1xuZXhwb3J0cy51bmljb2RlMTF1dGY3ID0gJ3V0ZjcnOyAvLyBBbGlhcyBVTklDT0RFLTEtMS1VVEYtN1xuZnVuY3Rpb24gVXRmN0NvZGVjKGNvZGVjT3B0aW9ucywgaWNvbnYpIHtcbiAgICB0aGlzLmljb252ID0gaWNvbnY7XG59O1xuXG5VdGY3Q29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBVdGY3RW5jb2RlcjtcblV0ZjdDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IFV0ZjdEZWNvZGVyO1xuVXRmN0NvZGVjLnByb3RvdHlwZS5ib21Bd2FyZSA9IHRydWU7XG5cblxuLy8gLS0gRW5jb2RpbmdcblxudmFyIG5vbkRpcmVjdENoYXJzID0gL1teQS1aYS16MC05J1xcKFxcKSwtXFwuXFwvOlxcPyBcXG5cXHJcXHRdKy9nO1xuXG5mdW5jdGlvbiBVdGY3RW5jb2RlcihvcHRpb25zLCBjb2RlYykge1xuICAgIHRoaXMuaWNvbnYgPSBjb2RlYy5pY29udjtcbn1cblxuVXRmN0VuY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgLy8gTmFpdmUgaW1wbGVtZW50YXRpb24uXG4gICAgLy8gTm9uLWRpcmVjdCBjaGFycyBhcmUgZW5jb2RlZCBhcyBcIis8YmFzZTY0Pi1cIjsgc2luZ2xlIFwiK1wiIGNoYXIgaXMgZW5jb2RlZCBhcyBcIistXCIuXG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoc3RyLnJlcGxhY2Uobm9uRGlyZWN0Q2hhcnMsIGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgICAgIHJldHVybiBcIitcIiArIChjaHVuayA9PT0gJysnID8gJycgOiBcbiAgICAgICAgICAgIHRoaXMuaWNvbnYuZW5jb2RlKGNodW5rLCAndXRmMTYtYmUnKS50b1N0cmluZygnYmFzZTY0JykucmVwbGFjZSgvPSskLywgJycpKSBcbiAgICAgICAgICAgICsgXCItXCI7XG4gICAgfS5iaW5kKHRoaXMpKSk7XG59XG5cblV0ZjdFbmNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHtcbn1cblxuXG4vLyAtLSBEZWNvZGluZ1xuXG5mdW5jdGlvbiBVdGY3RGVjb2RlcihvcHRpb25zLCBjb2RlYykge1xuICAgIHRoaXMuaWNvbnYgPSBjb2RlYy5pY29udjtcbiAgICB0aGlzLmluQmFzZTY0ID0gZmFsc2U7XG4gICAgdGhpcy5iYXNlNjRBY2N1bSA9ICcnO1xufVxuXG52YXIgYmFzZTY0UmVnZXggPSAvW0EtWmEtejAtOVxcLytdLztcbnZhciBiYXNlNjRDaGFycyA9IFtdO1xuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKylcbiAgICBiYXNlNjRDaGFyc1tpXSA9IGJhc2U2NFJlZ2V4LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShpKSk7XG5cbnZhciBwbHVzQ2hhciA9ICcrJy5jaGFyQ29kZUF0KDApLCBcbiAgICBtaW51c0NoYXIgPSAnLScuY2hhckNvZGVBdCgwKSxcbiAgICBhbmRDaGFyID0gJyYnLmNoYXJDb2RlQXQoMCk7XG5cblV0ZjdEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1Zikge1xuICAgIHZhciByZXMgPSBcIlwiLCBsYXN0SSA9IDAsXG4gICAgICAgIGluQmFzZTY0ID0gdGhpcy5pbkJhc2U2NCxcbiAgICAgICAgYmFzZTY0QWNjdW0gPSB0aGlzLmJhc2U2NEFjY3VtO1xuXG4gICAgLy8gVGhlIGRlY29kZXIgaXMgbW9yZSBpbnZvbHZlZCBhcyB3ZSBtdXN0IGhhbmRsZSBjaHVua3MgaW4gc3RyZWFtLlxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFpbkJhc2U2NCkgeyAvLyBXZSdyZSBpbiBkaXJlY3QgbW9kZS5cbiAgICAgICAgICAgIC8vIFdyaXRlIGRpcmVjdCBjaGFycyB1bnRpbCAnKydcbiAgICAgICAgICAgIGlmIChidWZbaV0gPT0gcGx1c0NoYXIpIHtcbiAgICAgICAgICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoYnVmLnNsaWNlKGxhc3RJLCBpKSwgXCJhc2NpaVwiKTsgLy8gV3JpdGUgZGlyZWN0IGNoYXJzLlxuICAgICAgICAgICAgICAgIGxhc3RJID0gaSsxO1xuICAgICAgICAgICAgICAgIGluQmFzZTY0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHsgLy8gV2UgZGVjb2RlIGJhc2U2NC5cbiAgICAgICAgICAgIGlmICghYmFzZTY0Q2hhcnNbYnVmW2ldXSkgeyAvLyBCYXNlNjQgZW5kZWQuXG4gICAgICAgICAgICAgICAgaWYgKGkgPT0gbGFzdEkgJiYgYnVmW2ldID09IG1pbnVzQ2hhcikgey8vIFwiKy1cIiAtPiBcIitcIlxuICAgICAgICAgICAgICAgICAgICByZXMgKz0gXCIrXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGI2NHN0ciA9IGJhc2U2NEFjY3VtICsgYnVmLnNsaWNlKGxhc3RJLCBpKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUobmV3IEJ1ZmZlcihiNjRzdHIsICdiYXNlNjQnKSwgXCJ1dGYxNi1iZVwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYnVmW2ldICE9IG1pbnVzQ2hhcikgLy8gTWludXMgaXMgYWJzb3JiZWQgYWZ0ZXIgYmFzZTY0LlxuICAgICAgICAgICAgICAgICAgICBpLS07XG5cbiAgICAgICAgICAgICAgICBsYXN0SSA9IGkrMTtcbiAgICAgICAgICAgICAgICBpbkJhc2U2NCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJhc2U2NEFjY3VtID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWluQmFzZTY0KSB7XG4gICAgICAgIHJlcyArPSB0aGlzLmljb252LmRlY29kZShidWYuc2xpY2UobGFzdEkpLCBcImFzY2lpXCIpOyAvLyBXcml0ZSBkaXJlY3QgY2hhcnMuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGI2NHN0ciA9IGJhc2U2NEFjY3VtICsgYnVmLnNsaWNlKGxhc3RJKS50b1N0cmluZygpO1xuXG4gICAgICAgIHZhciBjYW5CZURlY29kZWQgPSBiNjRzdHIubGVuZ3RoIC0gKGI2NHN0ci5sZW5ndGggJSA4KTsgLy8gTWluaW1hbCBjaHVuazogMiBxdWFkcyAtPiAyeDMgYnl0ZXMgLT4gMyBjaGFycy5cbiAgICAgICAgYmFzZTY0QWNjdW0gPSBiNjRzdHIuc2xpY2UoY2FuQmVEZWNvZGVkKTsgLy8gVGhlIHJlc3Qgd2lsbCBiZSBkZWNvZGVkIGluIGZ1dHVyZS5cbiAgICAgICAgYjY0c3RyID0gYjY0c3RyLnNsaWNlKDAsIGNhbkJlRGVjb2RlZCk7XG5cbiAgICAgICAgcmVzICs9IHRoaXMuaWNvbnYuZGVjb2RlKG5ldyBCdWZmZXIoYjY0c3RyLCAnYmFzZTY0JyksIFwidXRmMTYtYmVcIik7XG4gICAgfVxuXG4gICAgdGhpcy5pbkJhc2U2NCA9IGluQmFzZTY0O1xuICAgIHRoaXMuYmFzZTY0QWNjdW0gPSBiYXNlNjRBY2N1bTtcblxuICAgIHJldHVybiByZXM7XG59XG5cblV0ZjdEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzID0gXCJcIjtcbiAgICBpZiAodGhpcy5pbkJhc2U2NCAmJiB0aGlzLmJhc2U2NEFjY3VtLmxlbmd0aCA+IDApXG4gICAgICAgIHJlcyA9IHRoaXMuaWNvbnYuZGVjb2RlKG5ldyBCdWZmZXIodGhpcy5iYXNlNjRBY2N1bSwgJ2Jhc2U2NCcpLCBcInV0ZjE2LWJlXCIpO1xuXG4gICAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICAgIHRoaXMuYmFzZTY0QWNjdW0gPSAnJztcbiAgICByZXR1cm4gcmVzO1xufVxuXG5cbi8vIFVURi03LUlNQVAgY29kZWMuXG4vLyBSRkMzNTAxIFNlYy4gNS4xLjMgTW9kaWZpZWQgVVRGLTcgKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1MDEjc2VjdGlvbi01LjEuMylcbi8vIERpZmZlcmVuY2VzOlxuLy8gICogQmFzZTY0IHBhcnQgaXMgc3RhcnRlZCBieSBcIiZcIiBpbnN0ZWFkIG9mIFwiK1wiXG4vLyAgKiBEaXJlY3QgY2hhcmFjdGVycyBhcmUgMHgyMC0weDdFLCBleGNlcHQgXCImXCIgKDB4MjYpXG4vLyAgKiBJbiBCYXNlNjQsIFwiLFwiIGlzIHVzZWQgaW5zdGVhZCBvZiBcIi9cIlxuLy8gICogQmFzZTY0IG11c3Qgbm90IGJlIHVzZWQgdG8gcmVwcmVzZW50IGRpcmVjdCBjaGFyYWN0ZXJzLlxuLy8gICogTm8gaW1wbGljaXQgc2hpZnQgYmFjayBmcm9tIEJhc2U2NCAoc2hvdWxkIGFsd2F5cyBlbmQgd2l0aCAnLScpXG4vLyAgKiBTdHJpbmcgbXVzdCBlbmQgaW4gbm9uLXNoaWZ0ZWQgcG9zaXRpb24uXG4vLyAgKiBcIi0mXCIgd2hpbGUgaW4gYmFzZTY0IGlzIG5vdCBhbGxvd2VkLlxuXG5cbmV4cG9ydHMudXRmN2ltYXAgPSBVdGY3SU1BUENvZGVjO1xuZnVuY3Rpb24gVXRmN0lNQVBDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gICAgdGhpcy5pY29udiA9IGljb252O1xufTtcblxuVXRmN0lNQVBDb2RlYy5wcm90b3R5cGUuZW5jb2RlciA9IFV0ZjdJTUFQRW5jb2RlcjtcblV0ZjdJTUFQQ29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBVdGY3SU1BUERlY29kZXI7XG5VdGY3SU1BUENvZGVjLnByb3RvdHlwZS5ib21Bd2FyZSA9IHRydWU7XG5cblxuLy8gLS0gRW5jb2RpbmdcblxuZnVuY3Rpb24gVXRmN0lNQVBFbmNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gICAgdGhpcy5pY29udiA9IGNvZGVjLmljb252O1xuICAgIHRoaXMuaW5CYXNlNjQgPSBmYWxzZTtcbiAgICB0aGlzLmJhc2U2NEFjY3VtID0gbmV3IEJ1ZmZlcig2KTtcbiAgICB0aGlzLmJhc2U2NEFjY3VtSWR4ID0gMDtcbn1cblxuVXRmN0lNQVBFbmNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciBpbkJhc2U2NCA9IHRoaXMuaW5CYXNlNjQsXG4gICAgICAgIGJhc2U2NEFjY3VtID0gdGhpcy5iYXNlNjRBY2N1bSxcbiAgICAgICAgYmFzZTY0QWNjdW1JZHggPSB0aGlzLmJhc2U2NEFjY3VtSWR4LFxuICAgICAgICBidWYgPSBuZXcgQnVmZmVyKHN0ci5sZW5ndGgqNSArIDEwKSwgYnVmSWR4ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB1Q2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoMHgyMCA8PSB1Q2hhciAmJiB1Q2hhciA8PSAweDdFKSB7IC8vIERpcmVjdCBjaGFyYWN0ZXIgb3IgJyYnLlxuICAgICAgICAgICAgaWYgKGluQmFzZTY0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGJhc2U2NEFjY3VtSWR4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBidWZJZHggKz0gYnVmLndyaXRlKGJhc2U2NEFjY3VtLnNsaWNlKDAsIGJhc2U2NEFjY3VtSWR4KS50b1N0cmluZygnYmFzZTY0JykucmVwbGFjZSgvXFwvL2csICcsJykucmVwbGFjZSgvPSskLywgJycpLCBidWZJZHgpO1xuICAgICAgICAgICAgICAgICAgICBiYXNlNjRBY2N1bUlkeCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnVmW2J1ZklkeCsrXSA9IG1pbnVzQ2hhcjsgLy8gV3JpdGUgJy0nLCB0aGVuIGdvIHRvIGRpcmVjdCBtb2RlLlxuICAgICAgICAgICAgICAgIGluQmFzZTY0ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaW5CYXNlNjQpIHtcbiAgICAgICAgICAgICAgICBidWZbYnVmSWR4KytdID0gdUNoYXI7IC8vIFdyaXRlIGRpcmVjdCBjaGFyYWN0ZXJcblxuICAgICAgICAgICAgICAgIGlmICh1Q2hhciA9PT0gYW5kQ2hhcikgIC8vIEFtcGVyc2FuZCAtPiAnJi0nXG4gICAgICAgICAgICAgICAgICAgIGJ1ZltidWZJZHgrK10gPSBtaW51c0NoYXI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHsgLy8gTm9uLWRpcmVjdCBjaGFyYWN0ZXJcbiAgICAgICAgICAgIGlmICghaW5CYXNlNjQpIHtcbiAgICAgICAgICAgICAgICBidWZbYnVmSWR4KytdID0gYW5kQ2hhcjsgLy8gV3JpdGUgJyYnLCB0aGVuIGdvIHRvIGJhc2U2NCBtb2RlLlxuICAgICAgICAgICAgICAgIGluQmFzZTY0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbkJhc2U2NCkge1xuICAgICAgICAgICAgICAgIGJhc2U2NEFjY3VtW2Jhc2U2NEFjY3VtSWR4KytdID0gdUNoYXIgPj4gODtcbiAgICAgICAgICAgICAgICBiYXNlNjRBY2N1bVtiYXNlNjRBY2N1bUlkeCsrXSA9IHVDaGFyICYgMHhGRjtcblxuICAgICAgICAgICAgICAgIGlmIChiYXNlNjRBY2N1bUlkeCA9PSBiYXNlNjRBY2N1bS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmSWR4ICs9IGJ1Zi53cml0ZShiYXNlNjRBY2N1bS50b1N0cmluZygnYmFzZTY0JykucmVwbGFjZSgvXFwvL2csICcsJyksIGJ1ZklkeCk7XG4gICAgICAgICAgICAgICAgICAgIGJhc2U2NEFjY3VtSWR4ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmluQmFzZTY0ID0gaW5CYXNlNjQ7XG4gICAgdGhpcy5iYXNlNjRBY2N1bUlkeCA9IGJhc2U2NEFjY3VtSWR4O1xuXG4gICAgcmV0dXJuIGJ1Zi5zbGljZSgwLCBidWZJZHgpO1xufVxuXG5VdGY3SU1BUEVuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKDEwKSwgYnVmSWR4ID0gMDtcbiAgICBpZiAodGhpcy5pbkJhc2U2NCkge1xuICAgICAgICBpZiAodGhpcy5iYXNlNjRBY2N1bUlkeCA+IDApIHtcbiAgICAgICAgICAgIGJ1ZklkeCArPSBidWYud3JpdGUodGhpcy5iYXNlNjRBY2N1bS5zbGljZSgwLCB0aGlzLmJhc2U2NEFjY3VtSWR4KS50b1N0cmluZygnYmFzZTY0JykucmVwbGFjZSgvXFwvL2csICcsJykucmVwbGFjZSgvPSskLywgJycpLCBidWZJZHgpO1xuICAgICAgICAgICAgdGhpcy5iYXNlNjRBY2N1bUlkeCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBidWZbYnVmSWR4KytdID0gbWludXNDaGFyOyAvLyBXcml0ZSAnLScsIHRoZW4gZ28gdG8gZGlyZWN0IG1vZGUuXG4gICAgICAgIHRoaXMuaW5CYXNlNjQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmLnNsaWNlKDAsIGJ1ZklkeCk7XG59XG5cblxuLy8gLS0gRGVjb2RpbmdcblxuZnVuY3Rpb24gVXRmN0lNQVBEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gICAgdGhpcy5pY29udiA9IGNvZGVjLmljb252O1xuICAgIHRoaXMuaW5CYXNlNjQgPSBmYWxzZTtcbiAgICB0aGlzLmJhc2U2NEFjY3VtID0gJyc7XG59XG5cbnZhciBiYXNlNjRJTUFQQ2hhcnMgPSBiYXNlNjRDaGFycy5zbGljZSgpO1xuYmFzZTY0SU1BUENoYXJzWycsJy5jaGFyQ29kZUF0KDApXSA9IHRydWU7XG5cblV0ZjdJTUFQRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHtcbiAgICB2YXIgcmVzID0gXCJcIiwgbGFzdEkgPSAwLFxuICAgICAgICBpbkJhc2U2NCA9IHRoaXMuaW5CYXNlNjQsXG4gICAgICAgIGJhc2U2NEFjY3VtID0gdGhpcy5iYXNlNjRBY2N1bTtcblxuICAgIC8vIFRoZSBkZWNvZGVyIGlzIG1vcmUgaW52b2x2ZWQgYXMgd2UgbXVzdCBoYW5kbGUgY2h1bmtzIGluIHN0cmVhbS5cbiAgICAvLyBJdCBpcyBmb3JnaXZpbmcsIGNsb3NlciB0byBzdGFuZGFyZCBVVEYtNyAoZm9yIGV4YW1wbGUsICctJyBpcyBvcHRpb25hbCBhdCB0aGUgZW5kKS5cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghaW5CYXNlNjQpIHsgLy8gV2UncmUgaW4gZGlyZWN0IG1vZGUuXG4gICAgICAgICAgICAvLyBXcml0ZSBkaXJlY3QgY2hhcnMgdW50aWwgJyYnXG4gICAgICAgICAgICBpZiAoYnVmW2ldID09IGFuZENoYXIpIHtcbiAgICAgICAgICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoYnVmLnNsaWNlKGxhc3RJLCBpKSwgXCJhc2NpaVwiKTsgLy8gV3JpdGUgZGlyZWN0IGNoYXJzLlxuICAgICAgICAgICAgICAgIGxhc3RJID0gaSsxO1xuICAgICAgICAgICAgICAgIGluQmFzZTY0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHsgLy8gV2UgZGVjb2RlIGJhc2U2NC5cbiAgICAgICAgICAgIGlmICghYmFzZTY0SU1BUENoYXJzW2J1ZltpXV0pIHsgLy8gQmFzZTY0IGVuZGVkLlxuICAgICAgICAgICAgICAgIGlmIChpID09IGxhc3RJICYmIGJ1ZltpXSA9PSBtaW51c0NoYXIpIHsgLy8gXCImLVwiIC0+IFwiJlwiXG4gICAgICAgICAgICAgICAgICAgIHJlcyArPSBcIiZcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYjY0c3RyID0gYmFzZTY0QWNjdW0gKyBidWYuc2xpY2UobGFzdEksIGkpLnRvU3RyaW5nKCkucmVwbGFjZSgvLC9nLCAnLycpO1xuICAgICAgICAgICAgICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUobmV3IEJ1ZmZlcihiNjRzdHIsICdiYXNlNjQnKSwgXCJ1dGYxNi1iZVwiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoYnVmW2ldICE9IG1pbnVzQ2hhcikgLy8gTWludXMgbWF5IGJlIGFic29yYmVkIGFmdGVyIGJhc2U2NC5cbiAgICAgICAgICAgICAgICAgICAgaS0tO1xuXG4gICAgICAgICAgICAgICAgbGFzdEkgPSBpKzE7XG4gICAgICAgICAgICAgICAgaW5CYXNlNjQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBiYXNlNjRBY2N1bSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbkJhc2U2NCkge1xuICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUoYnVmLnNsaWNlKGxhc3RJKSwgXCJhc2NpaVwiKTsgLy8gV3JpdGUgZGlyZWN0IGNoYXJzLlxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBiNjRzdHIgPSBiYXNlNjRBY2N1bSArIGJ1Zi5zbGljZShsYXN0SSkudG9TdHJpbmcoKS5yZXBsYWNlKC8sL2csICcvJyk7XG5cbiAgICAgICAgdmFyIGNhbkJlRGVjb2RlZCA9IGI2NHN0ci5sZW5ndGggLSAoYjY0c3RyLmxlbmd0aCAlIDgpOyAvLyBNaW5pbWFsIGNodW5rOiAyIHF1YWRzIC0+IDJ4MyBieXRlcyAtPiAzIGNoYXJzLlxuICAgICAgICBiYXNlNjRBY2N1bSA9IGI2NHN0ci5zbGljZShjYW5CZURlY29kZWQpOyAvLyBUaGUgcmVzdCB3aWxsIGJlIGRlY29kZWQgaW4gZnV0dXJlLlxuICAgICAgICBiNjRzdHIgPSBiNjRzdHIuc2xpY2UoMCwgY2FuQmVEZWNvZGVkKTtcblxuICAgICAgICByZXMgKz0gdGhpcy5pY29udi5kZWNvZGUobmV3IEJ1ZmZlcihiNjRzdHIsICdiYXNlNjQnKSwgXCJ1dGYxNi1iZVwiKTtcbiAgICB9XG5cbiAgICB0aGlzLmluQmFzZTY0ID0gaW5CYXNlNjQ7XG4gICAgdGhpcy5iYXNlNjRBY2N1bSA9IGJhc2U2NEFjY3VtO1xuXG4gICAgcmV0dXJuIHJlcztcbn1cblxuVXRmN0lNQVBEZWNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVzID0gXCJcIjtcbiAgICBpZiAodGhpcy5pbkJhc2U2NCAmJiB0aGlzLmJhc2U2NEFjY3VtLmxlbmd0aCA+IDApXG4gICAgICAgIHJlcyA9IHRoaXMuaWNvbnYuZGVjb2RlKG5ldyBCdWZmZXIodGhpcy5iYXNlNjRBY2N1bSwgJ2Jhc2U2NCcpLCBcInV0ZjE2LWJlXCIpO1xuXG4gICAgdGhpcy5pbkJhc2U2NCA9IGZhbHNlO1xuICAgIHRoaXMuYmFzZTY0QWNjdW0gPSAnJztcbiAgICByZXR1cm4gcmVzO1xufVxuXG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy91dGY3LmpzXG4vLyBtb2R1bGUgaWQgPSAxMzhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgQnVmZmVyID0gcmVxdWlyZShcImJ1ZmZlclwiKS5CdWZmZXI7XG5cbi8vIFNpbmdsZS1ieXRlIGNvZGVjLiBOZWVkcyBhICdjaGFycycgc3RyaW5nIHBhcmFtZXRlciB0aGF0IGNvbnRhaW5zIDI1NiBvciAxMjggY2hhcnMgdGhhdFxuLy8gY29ycmVzcG9uZCB0byBlbmNvZGVkIGJ5dGVzIChpZiAxMjggLSB0aGVuIGxvd2VyIGhhbGYgaXMgQVNDSUkpLiBcblxuZXhwb3J0cy5fc2JjcyA9IFNCQ1NDb2RlYztcbmZ1bmN0aW9uIFNCQ1NDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gICAgaWYgKCFjb2RlY09wdGlvbnMpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNCQ1MgY29kZWMgaXMgY2FsbGVkIHdpdGhvdXQgdGhlIGRhdGEuXCIpXG4gICAgXG4gICAgLy8gUHJlcGFyZSBjaGFyIGJ1ZmZlciBmb3IgZGVjb2RpbmcuXG4gICAgaWYgKCFjb2RlY09wdGlvbnMuY2hhcnMgfHwgKGNvZGVjT3B0aW9ucy5jaGFycy5sZW5ndGggIT09IDEyOCAmJiBjb2RlY09wdGlvbnMuY2hhcnMubGVuZ3RoICE9PSAyNTYpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbmNvZGluZyAnXCIrY29kZWNPcHRpb25zLnR5cGUrXCInIGhhcyBpbmNvcnJlY3QgJ2NoYXJzJyAobXVzdCBiZSBvZiBsZW4gMTI4IG9yIDI1NilcIik7XG4gICAgXG4gICAgaWYgKGNvZGVjT3B0aW9ucy5jaGFycy5sZW5ndGggPT09IDEyOCkge1xuICAgICAgICB2YXIgYXNjaWlTdHJpbmcgPSBcIlwiO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEyODsgaSsrKVxuICAgICAgICAgICAgYXNjaWlTdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShpKTtcbiAgICAgICAgY29kZWNPcHRpb25zLmNoYXJzID0gYXNjaWlTdHJpbmcgKyBjb2RlY09wdGlvbnMuY2hhcnM7XG4gICAgfVxuXG4gICAgdGhpcy5kZWNvZGVCdWYgPSBuZXcgQnVmZmVyKGNvZGVjT3B0aW9ucy5jaGFycywgJ3VjczInKTtcbiAgICBcbiAgICAvLyBFbmNvZGluZyBidWZmZXIuXG4gICAgdmFyIGVuY29kZUJ1ZiA9IG5ldyBCdWZmZXIoNjU1MzYpO1xuICAgIGVuY29kZUJ1Zi5maWxsKGljb252LmRlZmF1bHRDaGFyU2luZ2xlQnl0ZS5jaGFyQ29kZUF0KDApKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZWNPcHRpb25zLmNoYXJzLmxlbmd0aDsgaSsrKVxuICAgICAgICBlbmNvZGVCdWZbY29kZWNPcHRpb25zLmNoYXJzLmNoYXJDb2RlQXQoaSldID0gaTtcblxuICAgIHRoaXMuZW5jb2RlQnVmID0gZW5jb2RlQnVmO1xufVxuXG5TQkNTQ29kZWMucHJvdG90eXBlLmVuY29kZXIgPSBTQkNTRW5jb2RlcjtcblNCQ1NDb2RlYy5wcm90b3R5cGUuZGVjb2RlciA9IFNCQ1NEZWNvZGVyO1xuXG5cbmZ1bmN0aW9uIFNCQ1NFbmNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gICAgdGhpcy5lbmNvZGVCdWYgPSBjb2RlYy5lbmNvZGVCdWY7XG59XG5cblNCQ1NFbmNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cikge1xuICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKHN0ci5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKVxuICAgICAgICBidWZbaV0gPSB0aGlzLmVuY29kZUJ1ZltzdHIuY2hhckNvZGVBdChpKV07XG4gICAgXG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxuU0JDU0VuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG5cbmZ1bmN0aW9uIFNCQ1NEZWNvZGVyKG9wdGlvbnMsIGNvZGVjKSB7XG4gICAgdGhpcy5kZWNvZGVCdWYgPSBjb2RlYy5kZWNvZGVCdWY7XG59XG5cblNCQ1NEZWNvZGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGJ1Zikge1xuICAgIC8vIFN0cmluZ3MgYXJlIGltbXV0YWJsZSBpbiBKUyAtPiB3ZSB1c2UgdWNzMiBidWZmZXIgdG8gc3BlZWQgdXAgY29tcHV0YXRpb25zLlxuICAgIHZhciBkZWNvZGVCdWYgPSB0aGlzLmRlY29kZUJ1ZjtcbiAgICB2YXIgbmV3QnVmID0gbmV3IEJ1ZmZlcihidWYubGVuZ3RoKjIpO1xuICAgIHZhciBpZHgxID0gMCwgaWR4MiA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWR4MSA9IGJ1ZltpXSoyOyBpZHgyID0gaSoyO1xuICAgICAgICBuZXdCdWZbaWR4Ml0gPSBkZWNvZGVCdWZbaWR4MV07XG4gICAgICAgIG5ld0J1ZltpZHgyKzFdID0gZGVjb2RlQnVmW2lkeDErMV07XG4gICAgfVxuICAgIHJldHVybiBuZXdCdWYudG9TdHJpbmcoJ3VjczInKTtcbn1cblxuU0JDU0RlY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL3NiY3MtY29kZWMuanNcbi8vIG1vZHVsZSBpZCA9IDEzOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gTWFudWFsbHkgYWRkZWQgZGF0YSB0byBiZSB1c2VkIGJ5IHNiY3MgY29kZWMgaW4gYWRkaXRpb24gdG8gZ2VuZXJhdGVkIG9uZS5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgLy8gTm90IHN1cHBvcnRlZCBieSBpY29udiwgbm90IHN1cmUgd2h5LlxuICAgIFwiMTAwMjlcIjogXCJtYWNjZW50ZXVyb1wiLFxuICAgIFwibWFjY2VudGV1cm9cIjoge1xuICAgICAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgICAgICBcImNoYXJzXCI6IFwiw4TEgMSBw4nEhMOWw5zDocSFxIzDpMSNxIbEh8OpxbnFusSOw63Ej8SSxJPElsOzxJfDtMO2w7XDusSaxJvDvOKAoMKwxJjCo8Kn4oCiwrbDn8KuwqnihKLEmcKo4omgxKPErsSvxKriiaTiiaXEq8S24oiC4oiRxYLEu8S8xL3EvsS5xLrFhcWGxYPCrOKImsWExYfiiIbCq8K74oCmwqDFiMWQw5XFkcWM4oCT4oCU4oCc4oCd4oCY4oCZw7fil4rFjcWUxZXFmOKAueKAusWZxZbFl8Wg4oCa4oCexaHFmsWbw4HFpMWlw43FvcW+xarDk8OUxavFrsOaxa/FsMWxxbLFs8Odw73Et8W7xYHFvMSiy4dcIlxuICAgIH0sXG5cbiAgICBcIjgwOFwiOiBcImNwODA4XCIsXG4gICAgXCJpYm04MDhcIjogXCJjcDgwOFwiLFxuICAgIFwiY3A4MDhcIjoge1xuICAgICAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgICAgICBcImNoYXJzXCI6IFwi0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/4paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paA0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/QgdGR0ITRlNCH0ZfQjtGewrDiiJnCt+KImuKEluKCrOKWoMKgXCJcbiAgICB9LFxuXG4gICAgLy8gQWxpYXNlcyBvZiBnZW5lcmF0ZWQgZW5jb2RpbmdzLlxuICAgIFwiYXNjaWk4Yml0XCI6IFwiYXNjaWlcIixcbiAgICBcInVzYXNjaWlcIjogXCJhc2NpaVwiLFxuICAgIFwiYW5zaXgzNFwiOiBcImFzY2lpXCIsXG4gICAgXCJhbnNpeDM0MTk2OFwiOiBcImFzY2lpXCIsXG4gICAgXCJhbnNpeDM0MTk4NlwiOiBcImFzY2lpXCIsXG4gICAgXCJjc2FzY2lpXCI6IFwiYXNjaWlcIixcbiAgICBcImNwMzY3XCI6IFwiYXNjaWlcIixcbiAgICBcImlibTM2N1wiOiBcImFzY2lpXCIsXG4gICAgXCJpc29pcjZcIjogXCJhc2NpaVwiLFxuICAgIFwiaXNvNjQ2dXNcIjogXCJhc2NpaVwiLFxuICAgIFwiaXNvNjQ2aXJ2XCI6IFwiYXNjaWlcIixcbiAgICBcInVzXCI6IFwiYXNjaWlcIixcblxuICAgIFwibGF0aW4xXCI6IFwiaXNvODg1OTFcIixcbiAgICBcImxhdGluMlwiOiBcImlzbzg4NTkyXCIsXG4gICAgXCJsYXRpbjNcIjogXCJpc284ODU5M1wiLFxuICAgIFwibGF0aW40XCI6IFwiaXNvODg1OTRcIixcbiAgICBcImxhdGluNVwiOiBcImlzbzg4NTk5XCIsXG4gICAgXCJsYXRpbjZcIjogXCJpc284ODU5MTBcIixcbiAgICBcImxhdGluN1wiOiBcImlzbzg4NTkxM1wiLFxuICAgIFwibGF0aW44XCI6IFwiaXNvODg1OTE0XCIsXG4gICAgXCJsYXRpbjlcIjogXCJpc284ODU5MTVcIixcbiAgICBcImxhdGluMTBcIjogXCJpc284ODU5MTZcIixcblxuICAgIFwiY3Npc29sYXRpbjFcIjogXCJpc284ODU5MVwiLFxuICAgIFwiY3Npc29sYXRpbjJcIjogXCJpc284ODU5MlwiLFxuICAgIFwiY3Npc29sYXRpbjNcIjogXCJpc284ODU5M1wiLFxuICAgIFwiY3Npc29sYXRpbjRcIjogXCJpc284ODU5NFwiLFxuICAgIFwiY3Npc29sYXRpbmN5cmlsbGljXCI6IFwiaXNvODg1OTVcIixcbiAgICBcImNzaXNvbGF0aW5hcmFiaWNcIjogXCJpc284ODU5NlwiLFxuICAgIFwiY3Npc29sYXRpbmdyZWVrXCIgOiBcImlzbzg4NTk3XCIsXG4gICAgXCJjc2lzb2xhdGluaGVicmV3XCI6IFwiaXNvODg1OThcIixcbiAgICBcImNzaXNvbGF0aW41XCI6IFwiaXNvODg1OTlcIixcbiAgICBcImNzaXNvbGF0aW42XCI6IFwiaXNvODg1OTEwXCIsXG5cbiAgICBcImwxXCI6IFwiaXNvODg1OTFcIixcbiAgICBcImwyXCI6IFwiaXNvODg1OTJcIixcbiAgICBcImwzXCI6IFwiaXNvODg1OTNcIixcbiAgICBcImw0XCI6IFwiaXNvODg1OTRcIixcbiAgICBcImw1XCI6IFwiaXNvODg1OTlcIixcbiAgICBcImw2XCI6IFwiaXNvODg1OTEwXCIsXG4gICAgXCJsN1wiOiBcImlzbzg4NTkxM1wiLFxuICAgIFwibDhcIjogXCJpc284ODU5MTRcIixcbiAgICBcImw5XCI6IFwiaXNvODg1OTE1XCIsXG4gICAgXCJsMTBcIjogXCJpc284ODU5MTZcIixcblxuICAgIFwiaXNvaXIxNFwiOiBcImlzbzY0NmpwXCIsXG4gICAgXCJpc29pcjU3XCI6IFwiaXNvNjQ2Y25cIixcbiAgICBcImlzb2lyMTAwXCI6IFwiaXNvODg1OTFcIixcbiAgICBcImlzb2lyMTAxXCI6IFwiaXNvODg1OTJcIixcbiAgICBcImlzb2lyMTA5XCI6IFwiaXNvODg1OTNcIixcbiAgICBcImlzb2lyMTEwXCI6IFwiaXNvODg1OTRcIixcbiAgICBcImlzb2lyMTQ0XCI6IFwiaXNvODg1OTVcIixcbiAgICBcImlzb2lyMTI3XCI6IFwiaXNvODg1OTZcIixcbiAgICBcImlzb2lyMTI2XCI6IFwiaXNvODg1OTdcIixcbiAgICBcImlzb2lyMTM4XCI6IFwiaXNvODg1OThcIixcbiAgICBcImlzb2lyMTQ4XCI6IFwiaXNvODg1OTlcIixcbiAgICBcImlzb2lyMTU3XCI6IFwiaXNvODg1OTEwXCIsXG4gICAgXCJpc29pcjE2NlwiOiBcInRpczYyMFwiLFxuICAgIFwiaXNvaXIxNzlcIjogXCJpc284ODU5MTNcIixcbiAgICBcImlzb2lyMTk5XCI6IFwiaXNvODg1OTE0XCIsXG4gICAgXCJpc29pcjIwM1wiOiBcImlzbzg4NTkxNVwiLFxuICAgIFwiaXNvaXIyMjZcIjogXCJpc284ODU5MTZcIixcblxuICAgIFwiY3A4MTlcIjogXCJpc284ODU5MVwiLFxuICAgIFwiaWJtODE5XCI6IFwiaXNvODg1OTFcIixcblxuICAgIFwiY3lyaWxsaWNcIjogXCJpc284ODU5NVwiLFxuXG4gICAgXCJhcmFiaWNcIjogXCJpc284ODU5NlwiLFxuICAgIFwiYXJhYmljOFwiOiBcImlzbzg4NTk2XCIsXG4gICAgXCJlY21hMTE0XCI6IFwiaXNvODg1OTZcIixcbiAgICBcImFzbW83MDhcIjogXCJpc284ODU5NlwiLFxuXG4gICAgXCJncmVla1wiIDogXCJpc284ODU5N1wiLFxuICAgIFwiZ3JlZWs4XCIgOiBcImlzbzg4NTk3XCIsXG4gICAgXCJlY21hMTE4XCIgOiBcImlzbzg4NTk3XCIsXG4gICAgXCJlbG90OTI4XCIgOiBcImlzbzg4NTk3XCIsXG5cbiAgICBcImhlYnJld1wiOiBcImlzbzg4NTk4XCIsXG4gICAgXCJoZWJyZXc4XCI6IFwiaXNvODg1OThcIixcblxuICAgIFwidHVya2lzaFwiOiBcImlzbzg4NTk5XCIsXG4gICAgXCJ0dXJraXNoOFwiOiBcImlzbzg4NTk5XCIsXG5cbiAgICBcInRoYWlcIjogXCJpc284ODU5MTFcIixcbiAgICBcInRoYWk4XCI6IFwiaXNvODg1OTExXCIsXG5cbiAgICBcImNlbHRpY1wiOiBcImlzbzg4NTkxNFwiLFxuICAgIFwiY2VsdGljOFwiOiBcImlzbzg4NTkxNFwiLFxuICAgIFwiaXNvY2VsdGljXCI6IFwiaXNvODg1OTE0XCIsXG5cbiAgICBcInRpczYyMDBcIjogXCJ0aXM2MjBcIixcbiAgICBcInRpczYyMDI1MjkxXCI6IFwidGlzNjIwXCIsXG4gICAgXCJ0aXM2MjAyNTMzMFwiOiBcInRpczYyMFwiLFxuXG4gICAgXCIxMDAwMFwiOiBcIm1hY3JvbWFuXCIsXG4gICAgXCIxMDAwNlwiOiBcIm1hY2dyZWVrXCIsXG4gICAgXCIxMDAwN1wiOiBcIm1hY2N5cmlsbGljXCIsXG4gICAgXCIxMDA3OVwiOiBcIm1hY2ljZWxhbmRcIixcbiAgICBcIjEwMDgxXCI6IFwibWFjdHVya2lzaFwiLFxuXG4gICAgXCJjc3BjOGNvZGVwYWdlNDM3XCI6IFwiY3A0MzdcIixcbiAgICBcImNzcGM3NzViYWx0aWNcIjogXCJjcDc3NVwiLFxuICAgIFwiY3NwYzg1MG11bHRpbGluZ3VhbFwiOiBcImNwODUwXCIsXG4gICAgXCJjc3BjcDg1MlwiOiBcImNwODUyXCIsXG4gICAgXCJjc3BjODYybGF0aW5oZWJyZXdcIjogXCJjcDg2MlwiLFxuICAgIFwiY3BnclwiOiBcImNwODY5XCIsXG5cbiAgICBcIm1zZWVcIjogXCJjcDEyNTBcIixcbiAgICBcIm1zY3lybFwiOiBcImNwMTI1MVwiLFxuICAgIFwibXNhbnNpXCI6IFwiY3AxMjUyXCIsXG4gICAgXCJtc2dyZWVrXCI6IFwiY3AxMjUzXCIsXG4gICAgXCJtc3R1cmtcIjogXCJjcDEyNTRcIixcbiAgICBcIm1zaGViclwiOiBcImNwMTI1NVwiLFxuICAgIFwibXNhcmFiXCI6IFwiY3AxMjU2XCIsXG4gICAgXCJ3aW5iYWx0cmltXCI6IFwiY3AxMjU3XCIsXG5cbiAgICBcImNwMjA4NjZcIjogXCJrb2k4clwiLFxuICAgIFwiMjA4NjZcIjogXCJrb2k4clwiLFxuICAgIFwiaWJtODc4XCI6IFwia29pOHJcIixcbiAgICBcImNza29pOHJcIjogXCJrb2k4clwiLFxuXG4gICAgXCJjcDIxODY2XCI6IFwia29pOHVcIixcbiAgICBcIjIxODY2XCI6IFwia29pOHVcIixcbiAgICBcImlibTExNjhcIjogXCJrb2k4dVwiLFxuXG4gICAgXCJzdHJrMTA0ODIwMDJcIjogXCJyazEwNDhcIixcblxuICAgIFwidGN2bjU3MTJcIjogXCJ0Y3ZuXCIsXG4gICAgXCJ0Y3ZuNTcxMjFcIjogXCJ0Y3ZuXCIsXG5cbiAgICBcImdiMTk4ODgwXCI6IFwiaXNvNjQ2Y25cIixcbiAgICBcImNuXCI6IFwiaXNvNjQ2Y25cIixcblxuICAgIFwiY3Npc28xNGppc2M2MjIwcm9cIjogXCJpc282NDZqcFwiLFxuICAgIFwiamlzYzYyMjAxOTY5cm9cIjogXCJpc282NDZqcFwiLFxuICAgIFwianBcIjogXCJpc282NDZqcFwiLFxuXG4gICAgXCJjc2hwcm9tYW44XCI6IFwiaHByb21hbjhcIixcbiAgICBcInI4XCI6IFwiaHByb21hbjhcIixcbiAgICBcInJvbWFuOFwiOiBcImhwcm9tYW44XCIsXG4gICAgXCJ4cm9tYW44XCI6IFwiaHByb21hbjhcIixcbiAgICBcImlibTEwNTFcIjogXCJocHJvbWFuOFwiLFxuXG4gICAgXCJtYWNcIjogXCJtYWNpbnRvc2hcIixcbiAgICBcImNzbWFjaW50b3NoXCI6IFwibWFjaW50b3NoXCIsXG59O1xuXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3Mvc2Jjcy1kYXRhLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIEdlbmVyYXRlZCBkYXRhIGZvciBzYmNzIGNvZGVjLiBEb24ndCBlZGl0IG1hbnVhbGx5LiBSZWdlbmVyYXRlIHVzaW5nIGdlbmVyYXRpb24vZ2VuLXNiY3MuanMgc2NyaXB0LlxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFwiNDM3XCI6IFwiY3A0MzdcIixcbiAgXCI3MzdcIjogXCJjcDczN1wiLFxuICBcIjc3NVwiOiBcImNwNzc1XCIsXG4gIFwiODUwXCI6IFwiY3A4NTBcIixcbiAgXCI4NTJcIjogXCJjcDg1MlwiLFxuICBcIjg1NVwiOiBcImNwODU1XCIsXG4gIFwiODU2XCI6IFwiY3A4NTZcIixcbiAgXCI4NTdcIjogXCJjcDg1N1wiLFxuICBcIjg1OFwiOiBcImNwODU4XCIsXG4gIFwiODYwXCI6IFwiY3A4NjBcIixcbiAgXCI4NjFcIjogXCJjcDg2MVwiLFxuICBcIjg2MlwiOiBcImNwODYyXCIsXG4gIFwiODYzXCI6IFwiY3A4NjNcIixcbiAgXCI4NjRcIjogXCJjcDg2NFwiLFxuICBcIjg2NVwiOiBcImNwODY1XCIsXG4gIFwiODY2XCI6IFwiY3A4NjZcIixcbiAgXCI4NjlcIjogXCJjcDg2OVwiLFxuICBcIjg3NFwiOiBcIndpbmRvd3M4NzRcIixcbiAgXCI5MjJcIjogXCJjcDkyMlwiLFxuICBcIjEwNDZcIjogXCJjcDEwNDZcIixcbiAgXCIxMTI0XCI6IFwiY3AxMTI0XCIsXG4gIFwiMTEyNVwiOiBcImNwMTEyNVwiLFxuICBcIjExMjlcIjogXCJjcDExMjlcIixcbiAgXCIxMTMzXCI6IFwiY3AxMTMzXCIsXG4gIFwiMTE2MVwiOiBcImNwMTE2MVwiLFxuICBcIjExNjJcIjogXCJjcDExNjJcIixcbiAgXCIxMTYzXCI6IFwiY3AxMTYzXCIsXG4gIFwiMTI1MFwiOiBcIndpbmRvd3MxMjUwXCIsXG4gIFwiMTI1MVwiOiBcIndpbmRvd3MxMjUxXCIsXG4gIFwiMTI1MlwiOiBcIndpbmRvd3MxMjUyXCIsXG4gIFwiMTI1M1wiOiBcIndpbmRvd3MxMjUzXCIsXG4gIFwiMTI1NFwiOiBcIndpbmRvd3MxMjU0XCIsXG4gIFwiMTI1NVwiOiBcIndpbmRvd3MxMjU1XCIsXG4gIFwiMTI1NlwiOiBcIndpbmRvd3MxMjU2XCIsXG4gIFwiMTI1N1wiOiBcIndpbmRvd3MxMjU3XCIsXG4gIFwiMTI1OFwiOiBcIndpbmRvd3MxMjU4XCIsXG4gIFwiMjg1OTFcIjogXCJpc284ODU5MVwiLFxuICBcIjI4NTkyXCI6IFwiaXNvODg1OTJcIixcbiAgXCIyODU5M1wiOiBcImlzbzg4NTkzXCIsXG4gIFwiMjg1OTRcIjogXCJpc284ODU5NFwiLFxuICBcIjI4NTk1XCI6IFwiaXNvODg1OTVcIixcbiAgXCIyODU5NlwiOiBcImlzbzg4NTk2XCIsXG4gIFwiMjg1OTdcIjogXCJpc284ODU5N1wiLFxuICBcIjI4NTk4XCI6IFwiaXNvODg1OThcIixcbiAgXCIyODU5OVwiOiBcImlzbzg4NTk5XCIsXG4gIFwiMjg2MDBcIjogXCJpc284ODU5MTBcIixcbiAgXCIyODYwMVwiOiBcImlzbzg4NTkxMVwiLFxuICBcIjI4NjAzXCI6IFwiaXNvODg1OTEzXCIsXG4gIFwiMjg2MDRcIjogXCJpc284ODU5MTRcIixcbiAgXCIyODYwNVwiOiBcImlzbzg4NTkxNVwiLFxuICBcIjI4NjA2XCI6IFwiaXNvODg1OTE2XCIsXG4gIFwid2luZG93czg3NFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKs77+977+977+977+94oCm77+977+977+977+977+977+977+977+977+977+977+94oCY4oCZ4oCc4oCd4oCi4oCT4oCU77+977+977+977+977+977+977+977+9wqDguIHguILguIPguITguIXguIbguIfguIjguInguIrguIvguIzguI3guI7guI/guJDguJHguJLguJPguJTguJXguJbguJfguJjguJnguJrguJvguJzguJ3guJ7guJ/guKDguKHguKLguKPguKTguKXguKbguKfguKjguKnguKrguKvguKzguK3guK7guK/guLDguLHguLLguLPguLTguLXguLbguLfguLjguLnguLrvv73vv73vv73vv73guL/guYDguYHguYLguYPguYTguYXguYbguYfguYjguYnguYrguYvguYzguY3guY7guY/guZDguZHguZLguZPguZTguZXguZbguZfguZjguZnguZrguZvvv73vv73vv73vv71cIlxuICB9LFxuICBcIndpbjg3NFwiOiBcIndpbmRvd3M4NzRcIixcbiAgXCJjcDg3NFwiOiBcIndpbmRvd3M4NzRcIixcbiAgXCJ3aW5kb3dzMTI1MFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKs77+94oCa77+94oCe4oCm4oCg4oCh77+94oCwxaDigLnFmsWkxb3Fue+/veKAmOKAmeKAnOKAneKAouKAk+KAlO+/veKEosWh4oC6xZvFpcW+xbrCoMuHy5jFgcKkxITCpsKnwqjCqcWewqvCrMKtwq7Fu8KwwrHLm8WCwrTCtcK2wrfCuMSFxZ/Cu8S9y53EvsW8xZTDgcOCxILDhMS5xIbDh8SMw4nEmMOLxJrDjcOOxI7EkMWDxYfDk8OUxZDDlsOXxZjFrsOaxbDDnMOdxaLDn8WVw6HDosSDw6TEusSHw6fEjcOpxJnDq8Sbw63DrsSPxJHFhMWIw7PDtMWRw7bDt8WZxa/DusWxw7zDvcWjy5lcIlxuICB9LFxuICBcIndpbjEyNTBcIjogXCJ3aW5kb3dzMTI1MFwiLFxuICBcImNwMTI1MFwiOiBcIndpbmRvd3MxMjUwXCIsXG4gIFwid2luZG93czEyNTFcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItCC0IPigJrRk+KAnuKApuKAoOKAoeKCrOKAsNCJ4oC50IrQjNCL0I/RkuKAmOKAmeKAnOKAneKAouKAk+KAlO+/veKEotGZ4oC60ZrRnNGb0Z/CoNCO0Z7QiMKk0pDCpsKn0IHCqdCEwqvCrMKtwq7Qh8KwwrHQhtGW0pHCtcK2wrfRkeKEltGUwrvRmNCF0ZXRl9CQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGPXCJcbiAgfSxcbiAgXCJ3aW4xMjUxXCI6IFwid2luZG93czEyNTFcIixcbiAgXCJjcDEyNTFcIjogXCJ3aW5kb3dzMTI1MVwiLFxuICBcIndpbmRvd3MxMjUyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzvv73igJrGkuKAnuKApuKAoOKAocuG4oCwxaDigLnFku+/vcW977+977+94oCY4oCZ4oCc4oCd4oCi4oCT4oCUy5zihKLFoeKAusWT77+9xb7FuMKgwqHCosKjwqTCpcKmwqfCqMKpwqrCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5fDmMOZw5rDm8Ocw53DnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMO9w77Dv1wiXG4gIH0sXG4gIFwid2luMTI1MlwiOiBcIndpbmRvd3MxMjUyXCIsXG4gIFwiY3AxMjUyXCI6IFwid2luZG93czEyNTJcIixcbiAgXCJ3aW5kb3dzMTI1M1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKs77+94oCaxpLigJ7igKbigKDigKHvv73igLDvv73igLnvv73vv73vv73vv73vv73igJjigJnigJzigJ3igKLigJPigJTvv73ihKLvv73igLrvv73vv73vv73vv73CoM6FzobCo8KkwqXCpsKnwqjCqe+/vcKrwqzCrcKu4oCVwrDCscKywrPOhMK1wrbCt86IzonOisK7zozCvc6Ozo/OkM6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHvv73Oo86kzqXOps6nzqjOqc6qzqvOrM6tzq7Or86wzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Cz4PPhM+Fz4bPh8+Iz4nPis+Lz4zPjc+O77+9XCJcbiAgfSxcbiAgXCJ3aW4xMjUzXCI6IFwid2luZG93czEyNTNcIixcbiAgXCJjcDEyNTNcIjogXCJ3aW5kb3dzMTI1M1wiLFxuICBcIndpbmRvd3MxMjU0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzvv73igJrGkuKAnuKApuKAoOKAocuG4oCwxaDigLnFku+/ve+/ve+/ve+/veKAmOKAmeKAnOKAneKAouKAk+KAlMuc4oSixaHigLrFk++/ve+/vcW4wqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucK6wrvCvMK9wr7Cv8OAw4HDgsODw4TDhcOGw4fDiMOJw4rDi8OMw43DjsOPxJ7DkcOSw5PDlMOVw5bDl8OYw5nDmsObw5zEsMWew5/DoMOhw6LDo8Okw6XDpsOnw6jDqcOqw6vDrMOtw67Dr8Sfw7HDssOzw7TDtcO2w7fDuMO5w7rDu8O8xLHFn8O/XCJcbiAgfSxcbiAgXCJ3aW4xMjU0XCI6IFwid2luZG93czEyNTRcIixcbiAgXCJjcDEyNTRcIjogXCJ3aW5kb3dzMTI1NFwiLFxuICBcIndpbmRvd3MxMjU1XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzvv73igJrGkuKAnuKApuKAoOKAocuG4oCw77+94oC577+977+977+977+977+94oCY4oCZ4oCc4oCd4oCi4oCT4oCUy5zihKLvv73igLrvv73vv73vv73vv73CoMKhwqLCo+KCqsKlwqbCp8KowqnDl8KrwqzCrcKuwq/CsMKxwrLCs8K0wrXCtsK3wrjCucO3wrvCvMK9wr7Cv9aw1rHWstaz1rTWtda21rfWuNa51rrWu9a81r3Wvta/14DXgdeC14PXsNex17LXs9e077+977+977+977+977+977+977+915DXkdeS15PXlNeV15bXl9eY15nXmteb15zXndee15/XoNeh16LXo9ek16XXpten16jXqdeq77+977+94oCO4oCP77+9XCJcbiAgfSxcbiAgXCJ3aW4xMjU1XCI6IFwid2luZG93czEyNTVcIixcbiAgXCJjcDEyNTVcIjogXCJ3aW5kb3dzMTI1NVwiLFxuICBcIndpbmRvd3MxMjU2XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzZvuKAmsaS4oCe4oCm4oCg4oChy4bigLDZueKAucWS2obamNqI2q/igJjigJnigJzigJ3igKLigJPigJTaqeKEotqR4oC6xZPigIzigI3ausKg2IzCosKjwqTCpcKmwqfCqMKp2r7Cq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnYm8K7wrzCvcK+2J/bgdih2KLYo9ik2KXYptin2KjYqdiq2KvYrNit2K7Yr9iw2LHYstiz2LTYtdi2w5fYt9i42LnYutmA2YHZgtmDw6DZhMOi2YXZhtmH2YjDp8Oow6nDqsOr2YnZisOuw6/Zi9mM2Y3ZjsO02Y/ZkMO32ZHDudmSw7vDvOKAjuKAj9uSXCJcbiAgfSxcbiAgXCJ3aW4xMjU2XCI6IFwid2luZG93czEyNTZcIixcbiAgXCJjcDEyNTZcIjogXCJ3aW5kb3dzMTI1NlwiLFxuICBcIndpbmRvd3MxMjU3XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLigqzvv73igJrvv73igJ7igKbigKDigKHvv73igLDvv73igLnvv73CqMuHwrjvv73igJjigJnigJzigJ3igKLigJPigJTvv73ihKLvv73igLrvv73Cr8ub77+9wqDvv73CosKjwqTvv73CpsKnw5jCqcWWwqvCrMKtwq7DhsKwwrHCssKzwrTCtcK2wrfDuMK5xZfCu8K8wr3CvsOmxITErsSAxIbDhMOFxJjEksSMw4nFucSWxKLEtsSqxLvFoMWDxYXDk8WMw5XDlsOXxbLFgcWaxarDnMW7xb3Dn8SFxK/EgcSHw6TDpcSZxJPEjcOpxbrEl8SjxLfEq8S8xaHFhMWGw7PFjcO1w7bDt8WzxYLFm8Wrw7zFvMW+y5lcIlxuICB9LFxuICBcIndpbjEyNTdcIjogXCJ3aW5kb3dzMTI1N1wiLFxuICBcImNwMTI1N1wiOiBcIndpbmRvd3MxMjU3XCIsXG4gIFwid2luZG93czEyNThcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKCrO+/veKAmsaS4oCe4oCm4oCg4oChy4bigLDvv73igLnFku+/ve+/ve+/ve+/veKAmOKAmeKAnOKAneKAouKAk+KAlMuc4oSi77+94oC6xZPvv73vv73FuMKgwqHCosKjwqTCpcKmwqfCqMKpwqrCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/DgMOBw4LEgsOEw4XDhsOHw4jDicOKw4vMgMONw47Dj8SQw5HMicOTw5TGoMOWw5fDmMOZw5rDm8Ocxq/Mg8Ofw6DDocOixIPDpMOlw6bDp8Oow6nDqsOrzIHDrcOuw6/EkcOxzKPDs8O0xqHDtsO3w7jDucO6w7vDvMaw4oKrw79cIlxuICB9LFxuICBcIndpbjEyNThcIjogXCJ3aW5kb3dzMTI1OFwiLFxuICBcImNwMTI1OFwiOiBcIndpbmRvd3MxMjU4XCIsXG4gIFwiaXNvODg1OTFcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMOdw57Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDt8O4w7nDusO7w7zDvcO+w79cIlxuICB9LFxuICBcImNwMjg1OTFcIjogXCJpc284ODU5MVwiLFxuICBcImlzbzg4NTkyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDEhMuYxYHCpMS9xZrCp8KoxaDFnsWkxbnCrcW9xbvCsMSFy5vFgsK0xL7Fm8uHwrjFocWfxaXFusudxb7FvMWUw4HDgsSCw4TEucSGw4fEjMOJxJjDi8Saw43DjsSOxJDFg8WHw5PDlMWQw5bDl8WYxa7DmsWww5zDncWiw5/FlcOhw6LEg8OkxLrEh8OnxI3DqcSZw6vEm8Otw67Ej8SRxYTFiMOzw7TFkcO2w7fFmcWvw7rFscO8w73Fo8uZXCJcbiAgfSxcbiAgXCJjcDI4NTkyXCI6IFwiaXNvODg1OTJcIixcbiAgXCJpc284ODU5M1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgxKbLmMKjwqTvv73EpMKnwqjEsMWexJ7EtMKt77+9xbvCsMSnwrLCs8K0wrXEpcK3wrjEscWfxJ/EtcK977+9xbzDgMOBw4Lvv73DhMSKxIjDh8OIw4nDisOLw4zDjcOOw4/vv73DkcOSw5PDlMSgw5bDl8Scw5nDmsObw5zFrMWcw5/DoMOhw6Lvv73DpMSLxInDp8Oow6nDqsOrw6zDrcOuw6/vv73DscOyw7PDtMShw7bDt8Sdw7nDusO7w7zFrcWdy5lcIlxuICB9LFxuICBcImNwMjg1OTNcIjogXCJpc284ODU5M1wiLFxuICBcImlzbzg4NTk0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDEhMS4xZbCpMSoxLvCp8KoxaDEksSixabCrcW9wq/CsMSFy5vFl8K0xKnEvMuHwrjFocSTxKPFp8WKxb7Fi8SAw4HDgsODw4TDhcOGxK7EjMOJxJjDi8SWw43DjsSqxJDFhcWMxLbDlMOVw5bDl8OYxbLDmsObw5zFqMWqw5/EgcOhw6LDo8Okw6XDpsSvxI3DqcSZw6vEl8Otw67Eq8SRxYbFjcS3w7TDtcO2w7fDuMWzw7rDu8O8xanFq8uZXCJcbiAgfSxcbiAgXCJjcDI4NTk0XCI6IFwiaXNvODg1OTRcIixcbiAgXCJpc284ODU5NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg0IHQgtCD0ITQhdCG0IfQiNCJ0IrQi9CMwq3QjtCP0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/ihJbRkdGS0ZPRlNGV0ZbRl9GY0ZnRmtGb0ZzCp9Ge0Z9cIlxuICB9LFxuICBcImNwMjg1OTVcIjogXCJpc284ODU5NVwiLFxuICBcImlzbzg4NTk2XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDvv73vv73vv73CpO+/ve+/ve+/ve+/ve+/ve+/ve+/vdiMwq3vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73Ym++/ve+/ve+/vdif77+92KHYotij2KTYpdim2KfYqNip2KrYq9is2K3Yrtiv2LDYsdiy2LPYtNi12LbYt9i42LnYuu+/ve+/ve+/ve+/ve+/vdmA2YHZgtmD2YTZhdmG2YfZiNmJ2YrZi9mM2Y3ZjtmP2ZDZkdmS77+977+977+977+977+977+977+977+977+977+977+977+977+9XCJcbiAgfSxcbiAgXCJjcDI4NTk2XCI6IFwiaXNvODg1OTZcIixcbiAgXCJpc284ODU5N1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg4oCY4oCZwqPigqzigq/CpsKnwqjCqc26wqvCrMKt77+94oCVwrDCscKywrPOhM6FzobCt86IzonOisK7zozCvc6Ozo/OkM6RzpLOk86UzpXOls6XzpjOmc6azpvOnM6dzp7On86gzqHvv73Oo86kzqXOps6nzqjOqc6qzqvOrM6tzq7Or86wzrHOss6zzrTOtc62zrfOuM65zrrOu868zr3Ovs6/z4DPgc+Cz4PPhM+Fz4bPh8+Iz4nPis+Lz4zPjc+O77+9XCJcbiAgfSxcbiAgXCJjcDI4NTk3XCI6IFwiaXNvODg1OTdcIixcbiAgXCJpc284ODU5OFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg77+9wqLCo8KkwqXCpsKnwqjCqcOXwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5w7fCu8K8wr3Cvu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veKAl9eQ15HXkteT15TXldeW15fXmNeZ15rXm9ec153Xntef16DXodei16PXpNel16bXp9eo16nXqu+/ve+/veKAjuKAj++/vVwiXG4gIH0sXG4gIFwiY3AyODU5OFwiOiBcImlzbzg4NTk4XCIsXG4gIFwiaXNvODg1OTlcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/EnsORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMSwxZ7Dn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvxJ/DscOyw7PDtMO1w7bDt8O4w7nDusO7w7zEscWfw79cIlxuICB9LFxuICBcImNwMjg1OTlcIjogXCJpc284ODU5OVwiLFxuICBcImlzbzg4NTkxMFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgxITEksSixKrEqMS2wqfEu8SQxaDFpsW9wq3FqsWKwrDEhcSTxKPEq8SpxLfCt8S8xJHFocWnxb7igJXFq8WLxIDDgcOCw4PDhMOFw4bErsSMw4nEmMOLxJbDjcOOw4/DkMWFxYzDk8OUw5XDlsWow5jFssOaw5vDnMOdw57Dn8SBw6HDosOjw6TDpcOmxK/EjcOpxJnDq8SXw63DrsOvw7DFhsWNw7PDtMO1w7bFqcO4xbPDusO7w7zDvcO+xLhcIlxuICB9LFxuICBcImNwMjg2MDBcIjogXCJpc284ODU5MTBcIixcbiAgXCJpc284ODU5MTFcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoOC4geC4guC4g+C4hOC4heC4huC4h+C4iOC4ieC4iuC4i+C4jOC4jeC4juC4j+C4kOC4keC4kuC4k+C4lOC4leC4luC4l+C4mOC4meC4muC4m+C4nOC4neC4nuC4n+C4oOC4oeC4ouC4o+C4pOC4peC4puC4p+C4qOC4qeC4quC4q+C4rOC4reC4ruC4r+C4sOC4seC4suC4s+C4tOC4teC4tuC4t+C4uOC4ueC4uu+/ve+/ve+/ve+/veC4v+C5gOC5geC5guC5g+C5hOC5heC5huC5h+C5iOC5ieC5iuC5i+C5jOC5jeC5juC5j+C5kOC5keC5kuC5k+C5lOC5leC5luC5l+C5mOC5meC5muC5m++/ve+/ve+/ve+/vVwiXG4gIH0sXG4gIFwiY3AyODYwMVwiOiBcImlzbzg4NTkxMVwiLFxuICBcImlzbzg4NTkxM1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg4oCdwqLCo8Kk4oCewqbCp8OYwqnFlsKrwqzCrcKuw4bCsMKxwrLCs+KAnMK1wrbCt8O4wrnFl8K7wrzCvcK+w6bEhMSuxIDEhsOEw4XEmMSSxIzDicW5xJbEosS2xKrEu8WgxYPFhcOTxYzDlcOWw5fFssWBxZrFqsOcxbvFvcOfxIXEr8SBxIfDpMOlxJnEk8SNw6nFusSXxKPEt8SrxLzFocWExYbDs8WNw7XDtsO3xbPFgsWbxavDvMW8xb7igJlcIlxuICB9LFxuICBcImNwMjg2MDNcIjogXCJpc284ODU5MTNcIixcbiAgXCJpc284ODU5MTRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoOG4guG4g8KjxIrEi+G4isKn4bqAwqnhuoLhuIvhu7LCrcKuxbjhuJ7huJ/EoMSh4bmA4bmBwrbhuZbhuoHhuZfhuoPhuaDhu7PhuoThuoXhuaHDgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8W0w5HDksOTw5TDlcOW4bmqw5jDmcOaw5vDnMOdxbbDn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvxbXDscOyw7PDtMO1w7bhuavDuMO5w7rDu8O8w73Ft8O/XCJcbiAgfSxcbiAgXCJjcDI4NjA0XCI6IFwiaXNvODg1OTE0XCIsXG4gIFwiaXNvODg1OTE1XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDCocKiwqPigqzCpcWgwqfFocKpwqrCq8Kswq3CrsKvwrDCscKywrPFvcK1wrbCt8W+wrnCusK7xZLFk8W4wr/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5fDmMOZw5rDm8Ocw53DnsOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMO9w77Dv1wiXG4gIH0sXG4gIFwiY3AyODYwNVwiOiBcImlzbzg4NTkxNVwiLFxuICBcImlzbzg4NTkxNlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8KgxITEhcWB4oKs4oCexaDCp8WhwqnImMKrxbnCrcW6xbvCsMKxxIzFgsW94oCdwrbCt8W+xI3ImcK7xZLFk8W4xbzDgMOBw4LEgsOExIbDhsOHw4jDicOKw4vDjMONw47Dj8SQxYPDksOTw5TFkMOWxZrFsMOZw5rDm8OcxJjImsOfw6DDocOixIPDpMSHw6bDp8Oow6nDqsOrw6zDrcOuw6/EkcWEw7LDs8O0xZHDtsWbxbHDucO6w7vDvMSZyJvDv1wiXG4gIH0sXG4gIFwiY3AyODYwNlwiOiBcImlzbzg4NTkxNlwiLFxuICBcImNwNDM3XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDh8O8w6nDosOkw6DDpcOnw6rDq8Oow6/DrsOsw4TDhcOJw6bDhsO0w7bDssO7w7nDv8OWw5zCosKjwqXigqfGksOhw63Ds8O6w7HDkcKqwrrCv+KMkMKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgM6xw5/Ok8+AzqPPg8K1z4TOps6YzqnOtOKIns+GzrXiiKniiaHCseKJpeKJpOKMoOKMocO34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIlxuICB9LFxuICBcImlibTQzN1wiOiBcImNwNDM3XCIsXG4gIFwiY3NpYm00MzdcIjogXCJjcDQzN1wiLFxuICBcImNwNzM3XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLOkc6SzpPOlM6VzpbOl86YzpnOms6bzpzOnc6ezp/OoM6hzqPOpM6lzqbOp86ozqnOsc6yzrPOtM61zrbOt864zrnOus67zrzOvc6+zr/PgM+Bz4PPgs+Ez4XPhs+Hz4jilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDPic6szq3Ors+Kzq/PjM+Nz4vPjs6GzojOic6KzozOjs6PwrHiiaXiiaTOqs6rw7fiiYjCsOKImcK34oia4oG/wrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtNzM3XCI6IFwiY3A3MzdcIixcbiAgXCJjc2libTczN1wiOiBcImNwNzM3XCIsXG4gIFwiY3A3NzVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsSGw7zDqcSBw6TEo8OlxIfFgsSTxZbFl8SrxbnDhMOFw4nDpsOGxY3DtsSiwqLFmsWbw5bDnMO4wqPDmMOXwqTEgMSqw7PFu8W8xbrigJ3CpsKpwq7CrMK9wrzFgcKrwrvilpHilpLilpPilILilKTEhMSMxJjEluKVo+KVkeKVl+KVncSuxaDilJDilJTilLTilKzilJzilIDilLzFssWq4pWa4pWU4pWp4pWm4pWg4pWQ4pWsxb3EhcSNxJnEl8SvxaHFs8Wrxb7ilJjilIzilojiloTilozilpDiloDDk8OfxYzFg8O1w5XCtcWExLbEt8S7xLzFhsSSxYXigJnCrcKx4oCcwr7CtsKnw7figJ7CsOKImcK3wrnCs8Ky4pagwqBcIlxuICB9LFxuICBcImlibTc3NVwiOiBcImNwNzc1XCIsXG4gIFwiY3NpYm03NzVcIjogXCJjcDc3NVwiLFxuICBcImNwODUwXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDh8O8w6nDosOkw6DDpcOnw6rDq8Oow6/DrsOsw4TDhcOJw6bDhsO0w7bDssO7w7nDv8OWw5zDuMKjw5jDl8aSw6HDrcOzw7rDscORwqrCusK/wq7CrMK9wrzCocKrwrvilpHilpLilpPilILilKTDgcOCw4DCqeKVo+KVkeKVl+KVncKiwqXilJDilJTilLTilKzilJzilIDilLzDo8OD4pWa4pWU4pWp4pWm4pWg4pWQ4pWswqTDsMOQw4rDi8OIxLHDjcOOw4/ilJjilIzilojiloTCpsOM4paAw5PDn8OUw5LDtcOVwrXDvsOew5rDm8OZw73DncKvwrTCrcKx4oCXwr7CtsKnw7fCuMKwwqjCt8K5wrPCsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NTBcIjogXCJjcDg1MFwiLFxuICBcImNzaWJtODUwXCI6IFwiY3A4NTBcIixcbiAgXCJjcDg1MlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4fDvMOpw6LDpMWvxIfDp8WCw6vFkMWRw67FucOExIbDicS5xLrDtMO2xL3EvsWaxZvDlsOcxaTFpcWBw5fEjcOhw63Ds8O6xITEhcW9xb7EmMSZwqzFusSMxZ/Cq8K74paR4paS4paT4pSC4pSkw4HDgsSaxZ7ilaPilZHilZfilZ3Fu8W84pSQ4pSU4pS04pSs4pSc4pSA4pS8xILEg+KVmuKVlOKVqeKVpuKVoOKVkOKVrMKkxJHEkMSOw4vEj8WHw43DjsSb4pSY4pSM4paI4paExaLFruKWgMOTw5/DlMWDxYTFiMWgxaHFlMOaxZXFsMO9w53Fo8K0wq3Lncuby4fLmMKnw7fCuMKwwqjLmcWxxZjFmeKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NTJcIjogXCJjcDg1MlwiLFxuICBcImNzaWJtODUyXCI6IFwiY3A4NTJcIixcbiAgXCJjcDg1NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0ZLQgtGT0IPRkdCB0ZTQhNGV0IXRltCG0ZfQh9GY0IjRmdCJ0ZrQitGb0IvRnNCM0Z7QjtGf0I/RjtCu0YrQqtCw0JDQsdCR0YbQptC00JTQtdCV0YTQpNCz0JPCq8K74paR4paS4paT4pSC4pSk0YXQpdC40JjilaPilZHilZfilZ3QudCZ4pSQ4pSU4pS04pSs4pSc4pSA4pS80LrQmuKVmuKVlOKVqeKVpuKVoOKVkOKVrMKk0LvQm9C80JzQvdCd0L7QntC/4pSY4pSM4paI4paE0J/Rj+KWgNCv0YDQoNGB0KHRgtCi0YPQo9C20JbQstCS0YzQrOKElsKt0YvQq9C30JfRiNCo0Y3QrdGJ0KnRh9CnwqfilqDCoFwiXG4gIH0sXG4gIFwiaWJtODU1XCI6IFwiY3A4NTVcIixcbiAgXCJjc2libTg1NVwiOiBcImNwODU1XCIsXG4gIFwiY3A4NTZcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIteQ15HXkteT15TXldeW15fXmNeZ15rXm9ec153Xntef16DXodei16PXpNel16bXp9eo16nXqu+/vcKj77+9w5fvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73CrsKswr3CvO+/vcKrwrvilpHilpLilpPilILilKTvv73vv73vv73CqeKVo+KVkeKVl+KVncKiwqXilJDilJTilLTilKzilJzilIDilLzvv73vv73ilZrilZTilanilabilaDilZDilazCpO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veKUmOKUjOKWiOKWhMKm77+94paA77+977+977+977+977+977+9wrXvv73vv73vv73vv73vv73vv73vv73Cr8K0wq3CseKAl8K+wrbCp8O3wrjCsMKowrfCucKzwrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtODU2XCI6IFwiY3A4NTZcIixcbiAgXCJjc2libTg1NlwiOiBcImNwODU2XCIsXG4gIFwiY3A4NTdcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOHw7zDqcOiw6TDoMOlw6fDqsOrw6jDr8OuxLHDhMOFw4nDpsOGw7TDtsOyw7vDucSww5bDnMO4wqPDmMWexZ/DocOtw7PDusOxw5HEnsSfwr/CrsKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpMOBw4LDgMKp4pWj4pWR4pWX4pWdwqLCpeKUkOKUlOKUtOKUrOKUnOKUgOKUvMOjw4PilZrilZTilanilabilaDilZDilazCpMK6wqrDisOLw4jvv73DjcOOw4/ilJjilIzilojiloTCpsOM4paAw5PDn8OUw5LDtcOVwrXvv73Dl8Oaw5vDmcOsw7/Cr8K0wq3Cse+/vcK+wrbCp8O3wrjCsMKowrfCucKzwrLilqDCoFwiXG4gIH0sXG4gIFwiaWJtODU3XCI6IFwiY3A4NTdcIixcbiAgXCJjc2libTg1N1wiOiBcImNwODU3XCIsXG4gIFwiY3A4NThcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOHw7zDqcOiw6TDoMOlw6fDqsOrw6jDr8Ouw6zDhMOFw4nDpsOGw7TDtsOyw7vDucO/w5bDnMO4wqPDmMOXxpLDocOtw7PDusOxw5HCqsK6wr/CrsKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpMOBw4LDgMKp4pWj4pWR4pWX4pWdwqLCpeKUkOKUlOKUtOKUrOKUnOKUgOKUvMOjw4PilZrilZTilanilabilaDilZDilazCpMOww5DDisOLw4jigqzDjcOOw4/ilJjilIzilojiloTCpsOM4paAw5PDn8OUw5LDtcOVwrXDvsOew5rDm8OZw73DncKvwrTCrcKx4oCXwr7CtsKnw7fCuMKwwqjCt8K5wrPCsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NThcIjogXCJjcDg1OFwiLFxuICBcImNzaWJtODU4XCI6IFwiY3A4NThcIixcbiAgXCJjcDg2MFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4fDvMOpw6LDo8Ogw4HDp8Oqw4rDqMONw5TDrMODw4LDicOAw4jDtMO1w7LDmsO5w4zDlcOcwqLCo8OZ4oKnw5PDocOtw7PDusOxw5HCqsK6wr/DksKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgM6xw5/Ok8+AzqPPg8K1z4TOps6YzqnOtOKIns+GzrXiiKniiaHCseKJpeKJpOKMoOKMocO34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIlxuICB9LFxuICBcImlibTg2MFwiOiBcImNwODYwXCIsXG4gIFwiY3NpYm04NjBcIjogXCJjcDg2MFwiLFxuICBcImNwODYxXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDh8O8w6nDosOkw6DDpcOnw6rDq8Oow5DDsMOew4TDhcOJw6bDhsO0w7bDvsO7w53DvcOWw5zDuMKjw5jigqfGksOhw63Ds8O6w4HDjcOTw5rCv+KMkMKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgM6xw5/Ok8+AzqPPg8K1z4TOps6YzqnOtOKIns+GzrXiiKniiaHCseKJpeKJpOKMoOKMocO34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIlxuICB9LFxuICBcImlibTg2MVwiOiBcImNwODYxXCIsXG4gIFwiY3NpYm04NjFcIjogXCJjcDg2MVwiLFxuICBcImNwODYyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLXkNeR15LXk9eU15XXlteX15jXmdea15vXnNed157Xn9eg16HXotej16TXpdem16fXqNep16rCosKjwqXigqfGksOhw63Ds8O6w7HDkcKqwrrCv+KMkMKswr3CvMKhwqvCu+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgM6xw5/Ok8+AzqPPg8K1z4TOps6YzqnOtOKIns+GzrXiiKniiaHCseKJpeKJpOKMoOKMocO34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIlxuICB9LFxuICBcImlibTg2MlwiOiBcImNwODYyXCIsXG4gIFwiY3NpYm04NjJcIjogXCJjcDg2MlwiLFxuICBcImNwODYzXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDh8O8w6nDosOCw6DCtsOnw6rDq8Oow6/DruKAl8OAwqfDicOIw4rDtMOLw4/Du8O5wqTDlMOcwqLCo8OZw5vGksKmwrTDs8O6wqjCuMKzwq/DjuKMkMKswr3CvMK+wqvCu+KWkeKWkuKWk+KUguKUpOKVoeKVouKVluKVleKVo+KVkeKVl+KVneKVnOKVm+KUkOKUlOKUtOKUrOKUnOKUgOKUvOKVnuKVn+KVmuKVlOKVqeKVpuKVoOKVkOKVrOKVp+KVqOKVpOKVpeKVmeKVmOKVkuKVk+KVq+KVquKUmOKUjOKWiOKWhOKWjOKWkOKWgM6xw5/Ok8+AzqPPg8K1z4TOps6YzqnOtOKIns+GzrXiiKniiaHCseKJpeKJpOKMoOKMocO34omIwrDiiJnCt+KImuKBv8Ky4pagwqBcIlxuICB9LFxuICBcImlibTg2M1wiOiBcImNwODYzXCIsXG4gIFwiY3NpYm04NjNcIjogXCJjcDg2M1wiLFxuICBcImNwODY0XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJNmqJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/wrDCt+KImeKImuKWkuKUgOKUguKUvOKUpOKUrOKUnOKUtOKUkOKUjOKUlOKUmM6y4oiez4bCscK9wrziiYjCq8K777u377u477+977+977u777u877+9wqDCre+6gsKjwqTvuoTvv73vv73vuo7vuo/vupXvupnYjO+6ne+6oe+6pdmg2aHZotmj2aTZpdmm2afZqNmp77uR2JvvurHvurXvurnYn8Ki77qA77qB77qD77qF77uK77qL77qN77qR77qT77qX77qb77qf77qj77qn77qp77qr77qt77qv77qz77q377q777q/77uB77uF77uL77uPwqbCrMO3w5fvu4nZgO+7k++7l++7m++7n++7o++7p++7q++7re+7r++7s++6ve+7jO+7ju+7je+7oe+5vdmR77ul77up77us77uw77uy77uQ77uV77u177u277ud77uZ77ux4pag77+9XCJcbiAgfSxcbiAgXCJpYm04NjRcIjogXCJjcDg2NFwiLFxuICBcImNzaWJtODY0XCI6IFwiY3A4NjRcIixcbiAgXCJjcDg2NVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4fDvMOpw6LDpMOgw6XDp8Oqw6vDqMOvw67DrMOEw4XDicOmw4bDtMO2w7LDu8O5w7/DlsOcw7jCo8OY4oKnxpLDocOtw7PDusOxw5HCqsK6wr/ijJDCrMK9wrzCocKrwqTilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDOscOfzpPPgM6jz4PCtc+EzqbOmM6pzrTiiJ7Phs614oip4omhwrHiiaXiiaTijKDijKHDt+KJiMKw4oiZwrfiiJrigb/CsuKWoMKgXCJcbiAgfSxcbiAgXCJpYm04NjVcIjogXCJjcDg2NVwiLFxuICBcImNzaWJtODY1XCI6IFwiY3A4NjVcIixcbiAgXCJjcDg2NlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/4paR4paS4paT4pSC4pSk4pWh4pWi4pWW4pWV4pWj4pWR4pWX4pWd4pWc4pWb4pSQ4pSU4pS04pSs4pSc4pSA4pS84pWe4pWf4pWa4pWU4pWp4pWm4pWg4pWQ4pWs4pWn4pWo4pWk4pWl4pWZ4pWY4pWS4pWT4pWr4pWq4pSY4pSM4paI4paE4paM4paQ4paA0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGO0Y/QgdGR0ITRlNCH0ZfQjtGewrDiiJnCt+KImuKElsKk4pagwqBcIlxuICB9LFxuICBcImlibTg2NlwiOiBcImNwODY2XCIsXG4gIFwiY3NpYm04NjZcIjogXCJjcDg2NlwiLFxuICBcImNwODY5XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLvv73vv73vv73vv73vv73vv73Ohu+/vcK3wqzCpuKAmOKAmc6I4oCVzonOis6qzozvv73vv73Ojs6rwqnOj8KywrPOrMKjzq3Ors6vz4rOkM+Mz43Okc6SzpPOlM6VzpbOl8K9zpjOmcKrwrvilpHilpLilpPilILilKTOms6bzpzOneKVo+KVkeKVl+KVnc6ezp/ilJDilJTilLTilKzilJzilIDilLzOoM6h4pWa4pWU4pWp4pWm4pWg4pWQ4pWszqPOpM6lzqbOp86ozqnOsc6yzrPilJjilIzilojiloTOtM614paAzrbOt864zrnOus67zrzOvc6+zr/PgM+Bz4PPgs+EzoTCrcKxz4XPhs+HwqfPiM6FwrDCqM+Jz4vOsM+O4pagwqBcIlxuICB9LFxuICBcImlibTg2OVwiOiBcImNwODY5XCIsXG4gIFwiY3NpYm04NjlcIjogXCJjcDg2OVwiLFxuICBcImNwOTIyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDCocKiwqPCpMKlwqbCp8KowqnCqsKrwqzCrcKu4oC+wrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8Wgw5HDksOTw5TDlcOWw5fDmMOZw5rDm8Ocw53FvcOfw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/FocOxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMO9xb7Dv1wiXG4gIH0sXG4gIFwiaWJtOTIyXCI6IFwiY3A5MjJcIixcbiAgXCJjc2libTkyMlwiOiBcImNwOTIyXCIsXG4gIFwiY3AxMDQ2XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLvuojDl8O376O276O176O076O377mxwojilqDilILilIDilJDilIzilJTilJjvubnvubvvub3vub/vubfvuorvu7Dvu7Pvu7Lvu47vu4/vu5Dvu7bvu7jvu7rvu7zCoO+juu+jue+juMKk76O777qL77qR77qX77qb77qf77qj2IzCre+6p++6s9mg2aHZotmj2aTZpdmm2afZqNmp77q32Jvvurvvur/vu4rYn++7i9ih2KLYo9ik2KXYptin2KjYqdiq2KvYrNit2K7Yr9iw2LHYstiz2LTYtdi22Lfvu4fYudi677uM77qC77qE77qO77uT2YDZgdmC2YPZhNmF2YbZh9mI2YnZitmL2YzZjdmO2Y/ZkNmR2ZLvu5fvu5vvu5/vo7zvu7Xvu7fvu7nvu7vvu6Pvu6fvu6zvu6nvv71cIlxuICB9LFxuICBcImlibTEwNDZcIjogXCJjcDEwNDZcIixcbiAgXCJjc2libTEwNDZcIjogXCJjcDEwNDZcIixcbiAgXCJjcDExMjRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoNCB0ILSkNCE0IXQhtCH0IjQidCK0IvQjMKt0I7Qj9CQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP4oSW0ZHRktKR0ZTRldGW0ZfRmNGZ0ZrRm9GcwqfRntGfXCJcbiAgfSxcbiAgXCJpYm0xMTI0XCI6IFwiY3AxMTI0XCIsXG4gIFwiY3NpYm0xMTI0XCI6IFwiY3AxMTI0XCIsXG4gIFwiY3AxMTI1XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLQkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/ilpHilpLilpPilILilKTilaHilaLilZbilZXilaPilZHilZfilZ3ilZzilZvilJDilJTilLTilKzilJzilIDilLzilZ7ilZ/ilZrilZTilanilabilaDilZDilazilafilajilaTilaXilZnilZjilZLilZPilavilarilJjilIzilojiloTilozilpDiloDRgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj9CB0ZHSkNKR0ITRlNCG0ZbQh9GXwrfiiJrihJbCpOKWoMKgXCJcbiAgfSxcbiAgXCJpYm0xMTI1XCI6IFwiY3AxMTI1XCIsXG4gIFwiY3NpYm0xMTI1XCI6IFwiY3AxMTI1XCIsXG4gIFwiY3AxMTI5XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDCocKiwqPCpMKlwqbCp8WTwqnCqsKrwqzCrcKuwq/CsMKxwrLCs8W4wrXCtsK3xZLCucK6wrvCvMK9wr7Cv8OAw4HDgsSCw4TDhcOGw4fDiMOJw4rDi8yAw43DjsOPxJDDkcyJw5PDlMagw5bDl8OYw5nDmsObw5zGr8yDw5/DoMOhw6LEg8Okw6XDpsOnw6jDqcOqw6vMgcOtw67Dr8SRw7HMo8Ozw7TGocO2w7fDuMO5w7rDu8O8xrDigqvDv1wiXG4gIH0sXG4gIFwiaWJtMTEyOVwiOiBcImNwMTEyOVwiLFxuICBcImNzaWJtMTEyOVwiOiBcImNwMTEyOVwiLFxuICBcImNwMTEzM1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgcKCwoPChMKFwobCh8KIwonCisKLwozCjcKOwo/CkMKRwpLCk8KUwpXClsKXwpjCmcKawpvCnMKdwp7Cn8Kg4LqB4LqC4LqE4LqH4LqI4Lqq4LqK4LqN4LqU4LqV4LqW4LqX4LqZ4Lqa4Lqb4Lqc4Lqd4Lqe4Lqf4Lqh4Lqi4Lqj4Lql4Lqn4Lqr4Lqt4Lqu77+977+977+94Lqv4Lqw4Lqy4Lqz4Lq04Lq14Lq24Lq34Lq44Lq54Lq84Lqx4Lq74Lq977+977+977+94LuA4LuB4LuC4LuD4LuE4LuI4LuJ4LuK4LuL4LuM4LuN4LuG77+94Luc4Lud4oKt77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+94LuQ4LuR4LuS4LuT4LuU4LuV4LuW4LuX4LuY4LuZ77+977+9wqLCrMKm77+9XCJcbiAgfSxcbiAgXCJpYm0xMTMzXCI6IFwiY3AxMTMzXCIsXG4gIFwiY3NpYm0xMTMzXCI6IFwiY3AxMTMzXCIsXG4gIFwiY3AxMTYxXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLvv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73guYjguIHguILguIPguITguIXguIbguIfguIjguInguIrguIvguIzguI3guI7guI/guJDguJHguJLguJPguJTguJXguJbguJfguJjguJnguJrguJvguJzguJ3guJ7guJ/guKDguKHguKLguKPguKTguKXguKbguKfguKjguKnguKrguKvguKzguK3guK7guK/guLDguLHguLLguLPguLTguLXguLbguLfguLjguLnguLrguYnguYrguYvigqzguL/guYDguYHguYLguYPguYTguYXguYbguYfguYjguYnguYrguYvguYzguY3guY7guY/guZDguZHguZLguZPguZTguZXguZbguZfguZjguZnguZrguZvCosKswqbCoFwiXG4gIH0sXG4gIFwiaWJtMTE2MVwiOiBcImNwMTE2MVwiLFxuICBcImNzaWJtMTE2MVwiOiBcImNwMTE2MVwiLFxuICBcImNwMTE2MlwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi4oKswoHCgsKDwoTigKbChsKHwojCicKKwovCjMKNwo7Cj8KQ4oCY4oCZ4oCc4oCd4oCi4oCT4oCUwpjCmcKawpvCnMKdwp7Cn8Kg4LiB4LiC4LiD4LiE4LiF4LiG4LiH4LiI4LiJ4LiK4LiL4LiM4LiN4LiO4LiP4LiQ4LiR4LiS4LiT4LiU4LiV4LiW4LiX4LiY4LiZ4Lia4Lib4Lic4Lid4Lie4Lif4Lig4Lih4Lii4Lij4Lik4Lil4Lim4Lin4Lio4Lip4Liq4Lir4Lis4Lit4Liu4Liv4Liw4Lix4Liy4Liz4Li04Li14Li24Li34Li44Li54Li677+977+977+977+94Li/4LmA4LmB4LmC4LmD4LmE4LmF4LmG4LmH4LmI4LmJ4LmK4LmL4LmM4LmN4LmO4LmP4LmQ4LmR4LmS4LmT4LmU4LmV4LmW4LmX4LmY4LmZ4Lma4Lmb77+977+977+977+9XCJcbiAgfSxcbiAgXCJpYm0xMTYyXCI6IFwiY3AxMTYyXCIsXG4gIFwiY3NpYm0xMTYyXCI6IFwiY3AxMTYyXCIsXG4gIFwiY3AxMTYzXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDCocKiwqPigqzCpcKmwqfFk8KpwqrCq8Kswq3CrsKvwrDCscKywrPFuMK1wrbCt8WSwrnCusK7wrzCvcK+wr/DgMOBw4LEgsOEw4XDhsOHw4jDicOKw4vMgMONw47Dj8SQw5HMicOTw5TGoMOWw5fDmMOZw5rDm8Ocxq/Mg8Ofw6DDocOixIPDpMOlw6bDp8Oow6nDqsOrzIHDrcOuw6/EkcOxzKPDs8O0xqHDtsO3w7jDucO6w7vDvMaw4oKrw79cIlxuICB9LFxuICBcImlibTExNjNcIjogXCJjcDExNjNcIixcbiAgXCJjc2libTExNjNcIjogXCJjcDExNjNcIixcbiAgXCJtYWNjcm9hdGlhblwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4TDhcOHw4nDkcOWw5zDocOgw6LDpMOjw6XDp8Opw6jDqsOrw63DrMOuw6/DscOzw7LDtMO2w7XDusO5w7vDvOKAoMKwwqLCo8Kn4oCiwrbDn8KuxaDihKLCtMKo4omgxb3DmOKInsKx4omk4oml4oiGwrXiiILiiJHiiI/FoeKIq8KqwrrihKbFvsO4wr/CocKs4oiaxpLiiYjEhsKrxIzigKbCoMOAw4PDlcWSxZPEkOKAlOKAnOKAneKAmOKAmcO34peK77+9wqnigYTCpOKAueKAusOGwrvigJPCt+KAmuKAnuKAsMOCxIfDgcSNw4jDjcOOw4/DjMOTw5TEkcOSw5rDm8OZxLHLhsucwq/PgMOLy5rCuMOKw6bLh1wiXG4gIH0sXG4gIFwibWFjY3lyaWxsaWNcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItCQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/igKDCsMKiwqPCp+KAosK20IbCrsKp4oSi0ILRkuKJoNCD0ZPiiJ7CseKJpOKJpdGWwrXiiILQiNCE0ZTQh9GX0InRmdCK0ZrRmNCFwqziiJrGkuKJiOKIhsKrwrvigKbCoNCL0ZvQjNGc0ZXigJPigJTigJzigJ3igJjigJnDt+KAntCO0Z7Qj9Gf4oSW0IHRkdGP0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7CpFwiXG4gIH0sXG4gIFwibWFjZ3JlZWtcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOEwrnCssOJwrPDlsOczoXDoMOiw6TOhMKow6fDqcOow6rDq8Kj4oSiw67Dr+KAosK94oCww7TDtsKmwq3DucO7w7zigKDOk86UzpjOm86ezqDDn8KuwqnOo86qwqfiiaDCsM6HzpHCseKJpOKJpcKlzpLOlc6WzpfOmc6azpzOps6rzqjOqc6szp3CrM6fzqHiiYjOpMKrwrvigKbCoM6lzqfOhs6IxZPigJPigJXigJzigJ3igJjigJnDt86JzorOjM6Ozq3Ors6vz4zOj8+NzrHOss+IzrTOtc+GzrPOt865zr7Ous67zrzOvc6/z4DPjs+Bz4PPhM64z4nPgs+Hz4XOts+Kz4vOkM6w77+9XCJcbiAgfSxcbiAgXCJtYWNpY2VsYW5kXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDhMOFw4fDicORw5bDnMOhw6DDosOkw6PDpcOnw6nDqMOqw6vDrcOsw67Dr8Oxw7PDssO0w7bDtcO6w7nDu8O8w53CsMKiwqPCp+KAosK2w5/CrsKp4oSiwrTCqOKJoMOGw5jiiJ7CseKJpOKJpcKlwrXiiILiiJHiiI/PgOKIq8KqwrrihKbDpsO4wr/CocKs4oiaxpLiiYjiiIbCq8K74oCmwqDDgMODw5XFksWT4oCT4oCU4oCc4oCd4oCY4oCZw7fil4rDv8W44oGEwqTDkMOww57DvsO9wrfigJrigJ7igLDDgsOKw4HDi8OIw43DjsOPw4zDk8OU77+9w5LDmsObw5nEscuGy5zCr8uYy5nLmsK4y53Lm8uHXCJcbiAgfSxcbiAgXCJtYWNyb21hblwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4TDhcOHw4nDkcOWw5zDocOgw6LDpMOjw6XDp8Opw6jDqsOrw63DrMOuw6/DscOzw7LDtMO2w7XDusO5w7vDvOKAoMKwwqLCo8Kn4oCiwrbDn8KuwqnihKLCtMKo4omgw4bDmOKInsKx4omk4omlwqXCteKIguKIkeKIj8+A4oirwqrCuuKEpsOmw7jCv8KhwqziiJrGkuKJiOKIhsKrwrvigKbCoMOAw4PDlcWSxZPigJPigJTigJzigJ3igJjigJnDt+KXisO/xbjigYTCpOKAueKAuu+sge+sguKAocK34oCa4oCe4oCww4LDisOBw4vDiMONw47Dj8OMw5PDlO+/vcOSw5rDm8OZxLHLhsucwq/LmMuZy5rCuMudy5vLh1wiXG4gIH0sXG4gIFwibWFjcm9tYW5pYVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiw4TDhcOHw4nDkcOWw5zDocOgw6LDpMOjw6XDp8Opw6jDqsOrw63DrMOuw6/DscOzw7LDtMO2w7XDusO5w7vDvOKAoMKwwqLCo8Kn4oCiwrbDn8KuwqnihKLCtMKo4omgxILFnuKInsKx4omk4omlwqXCteKIguKIkeKIj8+A4oirwqrCuuKEpsSDxZ/Cv8KhwqziiJrGkuKJiOKIhsKrwrvigKbCoMOAw4PDlcWSxZPigJPigJTigJzigJ3igJjigJnDt+KXisO/xbjigYTCpOKAueKAusWixaPigKHCt+KAmuKAnuKAsMOCw4rDgcOLw4jDjcOOw4/DjMOTw5Tvv73DksOaw5vDmcSxy4bLnMKvy5jLmcuawrjLncuby4dcIlxuICB9LFxuICBcIm1hY3RoYWlcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKrwrvigKbvoozvoo/vopLvopXvopjvoovvoo7vopHvopTvopfigJzigJ3vopnvv73igKLvooTvoonvooXvoobvoofvoojvoorvoo3vopDvopPvopbigJjigJnvv73CoOC4geC4guC4g+C4hOC4heC4huC4h+C4iOC4ieC4iuC4i+C4jOC4jeC4juC4j+C4kOC4keC4kuC4k+C4lOC4leC4luC4l+C4mOC4meC4muC4m+C4nOC4neC4nuC4n+C4oOC4oeC4ouC4o+C4pOC4peC4puC4p+C4qOC4qeC4quC4q+C4rOC4reC4ruC4r+C4sOC4seC4suC4s+C4tOC4teC4tuC4t+C4uOC4ueC4uu+7v+KAi+KAk+KAlOC4v+C5gOC5geC5guC5g+C5hOC5heC5huC5h+C5iOC5ieC5iuC5i+C5jOC5jeKEouC5j+C5kOC5keC5kuC5k+C5lOC5leC5luC5l+C5mOC5mcKuwqnvv73vv73vv73vv71cIlxuICB9LFxuICBcIm1hY3R1cmtpc2hcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsOEw4XDh8OJw5HDlsOcw6HDoMOiw6TDo8Olw6fDqcOow6rDq8Otw6zDrsOvw7HDs8Oyw7TDtsO1w7rDucO7w7zigKDCsMKiwqPCp+KAosK2w5/CrsKp4oSiwrTCqOKJoMOGw5jiiJ7CseKJpOKJpcKlwrXiiILiiJHiiI/PgOKIq8KqwrrihKbDpsO4wr/CocKs4oiaxpLiiYjiiIbCq8K74oCmwqDDgMODw5XFksWT4oCT4oCU4oCc4oCd4oCY4oCZw7fil4rDv8W4xJ7En8SwxLHFnsWf4oChwrfigJrigJ7igLDDgsOKw4HDi8OIw43DjsOPw4zDk8OU77+9w5LDmsObw5nvv73Lhsucwq/LmMuZy5rCuMudy5vLh1wiXG4gIH0sXG4gIFwibWFjdWtyYWluZVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0JDQkdCS0JPQlNCV0JbQl9CY0JnQmtCb0JzQndCe0J/QoNCh0KLQo9Ck0KXQptCn0KjQqdCq0KvQrNCt0K7Qr+KAoMKw0pDCo8Kn4oCiwrbQhsKuwqnihKLQgtGS4omg0IPRk+KInsKx4omk4oml0ZbCtdKR0IjQhNGU0IfRl9CJ0ZnQitGa0ZjQhcKs4oiaxpLiiYjiiIbCq8K74oCmwqDQi9Gb0IzRnNGV4oCT4oCU4oCc4oCd4oCY4oCZw7figJ7QjtGe0I/Rn+KEltCB0ZHRj9Cw0LHQstCz0LTQtdC20LfQuNC50LrQu9C80L3QvtC/0YDRgdGC0YPRhNGF0YbRh9GI0YnRitGL0YzRjdGOwqRcIlxuICB9LFxuICBcImtvaThyXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLilIDilILilIzilJDilJTilJjilJzilKTilKzilLTilLziloDiloTilojilozilpDilpHilpLilpPijKDilqDiiJniiJriiYjiiaTiiaXCoOKMocKwwrLCt8O34pWQ4pWR4pWS0ZHilZPilZTilZXilZbilZfilZjilZnilZrilZvilZzilZ3ilZ7ilZ/ilaDilaHQgeKVouKVo+KVpOKVpeKVpuKVp+KVqOKVqeKVquKVq+KVrMKp0Y7QsNCx0YbQtNC10YTQs9GF0LjQudC60LvQvNC90L7Qv9GP0YDRgdGC0YPQttCy0YzRi9C30YjRjdGJ0YfRitCu0JDQkdCm0JTQldCk0JPQpdCY0JnQmtCb0JzQndCe0J/Qr9Cg0KHQotCj0JbQktCs0KvQl9Co0K3QqdCn0KpcIlxuICB9LFxuICBcImtvaTh1XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLilIDilILilIzilJDilJTilJjilJzilKTilKzilLTilLziloDiloTilojilozilpDilpHilpLilpPijKDilqDiiJniiJriiYjiiaTiiaXCoOKMocKwwrLCt8O34pWQ4pWR4pWS0ZHRlOKVlNGW0ZfilZfilZjilZnilZrilZvSkeKVneKVnuKVn+KVoOKVodCB0ITilaPQhtCH4pWm4pWn4pWo4pWp4pWq0pDilazCqdGO0LDQsdGG0LTQtdGE0LPRhdC40LnQutC70LzQvdC+0L/Rj9GA0YHRgtGD0LbQstGM0YvQt9GI0Y3RidGH0YrQrtCQ0JHQptCU0JXQpNCT0KXQmNCZ0JrQm9Cc0J3QntCf0K/QoNCh0KLQo9CW0JLQrNCr0JfQqNCt0KnQp9CqXCJcbiAgfSxcbiAgXCJrb2k4cnVcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIuKUgOKUguKUjOKUkOKUlOKUmOKUnOKUpOKUrOKUtOKUvOKWgOKWhOKWiOKWjOKWkOKWkeKWkuKWk+KMoOKWoOKImeKImuKJiOKJpOKJpcKg4oyhwrDCssK3w7filZDilZHilZLRkdGU4pWU0ZbRl+KVl+KVmOKVmeKVmuKVm9KR0Z7ilZ7ilZ/ilaDilaHQgdCE4pWj0IbQh+KVpuKVp+KVqOKVqeKVqtKQ0I7CqdGO0LDQsdGG0LTQtdGE0LPRhdC40LnQutC70LzQvdC+0L/Rj9GA0YHRgtGD0LbQstGM0YvQt9GI0Y3RidGH0YrQrtCQ0JHQptCU0JXQpNCT0KXQmNCZ0JrQm9Cc0J3QntCf0K/QoNCh0KLQo9CW0JLQrNCr0JfQqNCt0KnQp9CqXCJcbiAgfSxcbiAgXCJrb2k4dFwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi0pvSk+KAmtKS4oCe4oCm4oCg4oCh77+94oCw0rPigLnSstK30rbvv73SmuKAmOKAmeKAnOKAneKAouKAk+KAlO+/veKEou+/veKAuu+/ve+/ve+/ve+/ve+/vdOv067RkcKk06PCpsKn77+977+977+9wqvCrMKtwq7vv73CsMKxwrLQge+/vdOiwrbCt++/veKElu+/vcK777+977+977+9wqnRjtCw0LHRhtC00LXRhNCz0YXQuNC50LrQu9C80L3QvtC/0Y/RgNGB0YLRg9C20LLRjNGL0LfRiNGN0YnRh9GK0K7QkNCR0KbQlNCV0KTQk9Cl0JjQmdCa0JvQnNCd0J7Qn9Cv0KDQodCi0KPQltCS0KzQq9CX0KjQrdCp0KfQqlwiXG4gIH0sXG4gIFwiYXJtc2NpaThcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIsKAwoHCgsKDwoTChcKGwofCiMKJworCi8KMwo3CjsKPwpDCkcKSwpPClMKVwpbCl8KYwpnCmsKbwpzCncKewp/CoO+/vdaH1okpKMK7wqvigJQu1Z0sLdaK4oCm1ZzVm9We1LHVodSy1aLUs9Wj1LTVpNS11aXUttWm1LfVp9S41ajUudWp1LrVqtS71avUvNWs1L3VrdS+1a7Uv9Wv1YDVsNWB1bHVgtWy1YPVs9WE1bTVhdW11YbVttWH1bfViNW41YnVudWK1brVi9W71YzVvNWN1b3VjtW+1Y/Vv9WQ1oDVkdaB1ZLWgtWT1oPVlNaE1ZXWhdWW1obVmu+/vVwiXG4gIH0sXG4gIFwicmsxMDQ4XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLQgtCD4oCa0ZPigJ7igKbigKDigKHigqzigLDQieKAudCK0prSutCP0ZLigJjigJnigJzigJ3igKLigJPigJTvv73ihKLRmeKAutGa0pvSu9GfwqDSsNKx05jCpNOowqbCp9CBwqnSksKrwqzCrcKu0q7CsMKx0IbRltOpwrXCtsK30ZHihJbSk8K705nSotKj0q/QkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L/RgNGB0YLRg9GE0YXRhtGH0YjRidGK0YvRjNGN0Y7Rj1wiXG4gIH0sXG4gIFwidGN2blwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiXFx1MDAwMMOa4bukXFx1MDAwM+G7quG7rOG7rlxcdTAwMDdcXGJcXHRcXG5cXHUwMDBiXFxmXFxyXFx1MDAwZVxcdTAwMGZcXHUwMDEw4buo4buw4buy4bu24bu4w53hu7RcXHUwMDE4XFx1MDAxOVxcdTAwMWFcXHUwMDFiXFx1MDAxY1xcdTAwMWRcXHUwMDFlXFx1MDAxZiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f8OA4bqiw4PDgeG6oOG6tuG6rMOI4bq64bq8w4nhurjhu4bDjOG7iMSow43hu4rDkuG7jsOVw5Phu4zhu5jhu5zhu57hu6Dhu5rhu6LDmeG7psWowqDEgsOCw4rDlMagxq/EkMSDw6LDqsO0xqHGsMSR4bqwzIDMicyDzIHMo8Og4bqjw6PDoeG6oeG6suG6seG6s+G6teG6r+G6tOG6ruG6puG6qOG6quG6pOG7gOG6t+G6p+G6qeG6q+G6peG6rcOo4buC4bq74bq9w6nhurnhu4Hhu4Phu4Xhur/hu4fDrOG7ieG7hOG6vuG7ksSpw63hu4vDsuG7lOG7j8O1w7Phu43hu5Phu5Xhu5fhu5Hhu5nhu53hu5/hu6Hhu5vhu6PDueG7luG7p8Wpw7rhu6Xhu6vhu63hu6/hu6nhu7Hhu7Phu7fhu7nDveG7teG7kFwiXG4gIH0sXG4gIFwiZ2VvcmdpYW5hY2FkZW15XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKB4oCaxpLigJ7igKbigKDigKHLhuKAsMWg4oC5xZLCjcKOwo/CkOKAmOKAmeKAnOKAneKAouKAk+KAlMuc4oSixaHigLrFk8Kdwp7FuMKgwqHCosKjwqTCpcKmwqfCqMKpwqrCq8Kswq3CrsKvwrDCscKywrPCtMK1wrbCt8K4wrnCusK7wrzCvcK+wr/hg5Dhg5Hhg5Lhg5Phg5Thg5Xhg5bhg5fhg5jhg5nhg5rhg5vhg5zhg53hg57hg5/hg6Dhg6Hhg6Lhg6Phg6Thg6Xhg6bhg6fhg6jhg6nhg6rhg6vhg6zhg63hg67hg6/hg7Dhg7Hhg7Lhg7Phg7Thg7Xhg7bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMO9w77Dv1wiXG4gIH0sXG4gIFwiZ2VvcmdpYW5wc1wiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwiwoDCgeKAmsaS4oCe4oCm4oCg4oChy4bigLDFoOKAucWSwo3CjsKPwpDigJjigJnigJzigJ3igKLigJPigJTLnOKEosWh4oC6xZPCncKexbjCoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/4YOQ4YOR4YOS4YOT4YOU4YOV4YOW4YOx4YOX4YOY4YOZ4YOa4YOb4YOc4YOy4YOd4YOe4YOf4YOg4YOh4YOi4YOz4YOj4YOk4YOl4YOm4YOn4YOo4YOp4YOq4YOr4YOs4YOt4YOu4YO04YOv4YOw4YO1w6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMO9w77Dv1wiXG4gIH0sXG4gIFwicHQxNTRcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcItKW0pLTrtKT4oCe4oCm0rbSrtKy0q/SoNOi0qLSmtK60rjSl+KAmOKAmeKAnOKAneKAouKAk+KAlNKz0rfSodOj0qPSm9K70rnCoNCO0Z7QiNOo0pjSsMKn0IHCqdOYwqvCrNOvwq7SnMKw0rHQhtGW0pnTqcK2wrfRkeKEltOZwrvRmNKq0qvSndCQ0JHQktCT0JTQldCW0JfQmNCZ0JrQm9Cc0J3QntCf0KDQodCi0KPQpNCl0KbQp9Co0KnQqtCr0KzQrdCu0K/QsNCx0LLQs9C00LXQttC30LjQudC60LvQvNC90L7Qv9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGPXCJcbiAgfSxcbiAgXCJ2aXNjaWlcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIlxcdTAwMDBcXHUwMDAx4bqyXFx1MDAwM1xcdTAwMDThurThuqpcXHUwMDA3XFxiXFx0XFxuXFx1MDAwYlxcZlxcclxcdTAwMGVcXHUwMDBmXFx1MDAxMFxcdTAwMTFcXHUwMDEyXFx1MDAxM+G7tlxcdTAwMTVcXHUwMDE2XFx1MDAxN1xcdTAwMTjhu7hcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFk4bu0XFx1MDAxZiAhXFxcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f+G6oOG6ruG6sOG6tuG6pOG6puG6qOG6rOG6vOG6uOG6vuG7gOG7guG7hOG7huG7kOG7kuG7lOG7luG7mOG7ouG7muG7nOG7nuG7iuG7juG7jOG7iOG7psWo4buk4buyw5Xhuq/hurHhurfhuqXhuqfhuqnhuq3hur3hurnhur/hu4Hhu4Phu4Xhu4fhu5Hhu5Phu5Xhu5fhu6DGoOG7meG7neG7n+G7i+G7sOG7qOG7quG7rMah4bubxq/DgMOBw4LDg+G6osSC4bqz4bq1w4jDicOK4bq6w4zDjcSo4buzxJDhu6nDksOTw5ThuqHhu7fhu6vhu63DmcOa4bu54bu1w53hu6HGsMOgw6HDosOj4bqjxIPhu6/huqvDqMOpw6rhurvDrMOtxKnhu4nEkeG7scOyw7PDtMO14buP4buN4bulw7nDusWp4bunw73hu6Phu65cIlxuICB9LFxuICBcImlzbzY0NmNuXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjwqUlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8feKAvn/vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv71cIlxuICB9LFxuICBcImlzbzY0NmpwXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCJcXHUwMDAwXFx1MDAwMVxcdTAwMDJcXHUwMDAzXFx1MDAwNFxcdTAwMDVcXHUwMDA2XFx1MDAwN1xcYlxcdFxcblxcdTAwMGJcXGZcXHJcXHUwMDBlXFx1MDAwZlxcdTAwMTBcXHUwMDExXFx1MDAxMlxcdTAwMTNcXHUwMDE0XFx1MDAxNVxcdTAwMTZcXHUwMDE3XFx1MDAxOFxcdTAwMTlcXHUwMDFhXFx1MDAxYlxcdTAwMWNcXHUwMDFkXFx1MDAxZVxcdTAwMWYgIVxcXCIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWlvCpV1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8feKAvn/vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv73vv71cIlxuICB9LFxuICBcImhwcm9tYW44XCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLCgMKBwoLCg8KEwoXChsKHwojCicKKwovCjMKNwo7Cj8KQwpHCksKTwpTClcKWwpfCmMKZwprCm8Kcwp3CnsKfwqDDgMOCw4jDisOLw47Dj8K0y4vLhsKoy5zDmcOb4oKkwq/DncO9wrDDh8Onw5HDscKhwr/CpMKjwqXCp8aSwqLDosOqw7TDu8Ohw6nDs8O6w6DDqMOyw7nDpMOrw7bDvMOFw67DmMOGw6XDrcO4w6bDhMOsw5bDnMOJw6/Dn8OUw4HDg8Ojw5DDsMONw4zDk8OSw5XDtcWgxaHDmsW4w7/DnsO+wrfCtcK2wr7igJTCvMK9wqrCusKr4pagwrvCse+/vVwiXG4gIH0sXG4gIFwibWFjaW50b3NoXCI6IHtcbiAgICBcInR5cGVcIjogXCJfc2Jjc1wiLFxuICAgIFwiY2hhcnNcIjogXCLDhMOFw4fDicORw5bDnMOhw6DDosOkw6PDpcOnw6nDqMOqw6vDrcOsw67Dr8Oxw7PDssO0w7bDtcO6w7nDu8O84oCgwrDCosKjwqfigKLCtsOfwq7CqeKEosK0wqjiiaDDhsOY4oiewrHiiaTiiaXCpcK14oiC4oiR4oiPz4DiiKvCqsK64oSmw6bDuMK/wqHCrOKImsaS4omI4oiGwqvCu+KApsKgw4DDg8OVxZLFk+KAk+KAlOKAnOKAneKAmOKAmcO34peKw7/FuOKBhMKk4oC54oC676yB76yC4oChwrfigJrigJ7igLDDgsOKw4HDi8OIw43DjsOPw4zDk8OU77+9w5LDmsObw5nEscuGy5zCr8uYy5nLmsK4y53Lm8uHXCJcbiAgfSxcbiAgXCJhc2NpaVwiOiB7XG4gICAgXCJ0eXBlXCI6IFwiX3NiY3NcIixcbiAgICBcImNoYXJzXCI6IFwi77+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+977+9XCJcbiAgfSxcbiAgXCJ0aXM2MjBcIjoge1xuICAgIFwidHlwZVwiOiBcIl9zYmNzXCIsXG4gICAgXCJjaGFyc1wiOiBcIu+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/veC4geC4guC4g+C4hOC4heC4huC4h+C4iOC4ieC4iuC4i+C4jOC4jeC4juC4j+C4kOC4keC4kuC4k+C4lOC4leC4luC4l+C4mOC4meC4muC4m+C4nOC4neC4nuC4n+C4oOC4oeC4ouC4o+C4pOC4peC4puC4p+C4qOC4qeC4quC4q+C4rOC4reC4ruC4r+C4sOC4seC4suC4s+C4tOC4teC4tuC4t+C4uOC4ueC4uu+/ve+/ve+/ve+/veC4v+C5gOC5geC5guC5g+C5hOC5heC5huC5h+C5iOC5ieC5iuC5i+C5jOC5jeC5juC5j+C5kOC5keC5kuC5k+C5lOC5leC5luC5l+C5mOC5meC5muC5m++/ve+/ve+/ve+/vVwiXG4gIH1cbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3Mvc2Jjcy1kYXRhLWdlbmVyYXRlZC5qc1xuLy8gbW9kdWxlIGlkID0gMTQxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoXCJidWZmZXJcIikuQnVmZmVyO1xuXG4vLyBNdWx0aWJ5dGUgY29kZWMuIEluIHRoaXMgc2NoZW1lLCBhIGNoYXJhY3RlciBpcyByZXByZXNlbnRlZCBieSAxIG9yIG1vcmUgYnl0ZXMuXG4vLyBPdXIgY29kZWMgc3VwcG9ydHMgVVRGLTE2IHN1cnJvZ2F0ZXMsIGV4dGVuc2lvbnMgZm9yIEdCMTgwMzAgYW5kIHVuaWNvZGUgc2VxdWVuY2VzLlxuLy8gVG8gc2F2ZSBtZW1vcnkgYW5kIGxvYWRpbmcgdGltZSwgd2UgcmVhZCB0YWJsZSBmaWxlcyBvbmx5IHdoZW4gcmVxdWVzdGVkLlxuXG5leHBvcnRzLl9kYmNzID0gREJDU0NvZGVjO1xuXG52YXIgVU5BU1NJR05FRCA9IC0xLFxuICAgIEdCMTgwMzBfQ09ERSA9IC0yLFxuICAgIFNFUV9TVEFSVCAgPSAtMTAsXG4gICAgTk9ERV9TVEFSVCA9IC0xMDAwLFxuICAgIFVOQVNTSUdORURfTk9ERSA9IG5ldyBBcnJheSgweDEwMCksXG4gICAgREVGX0NIQVIgPSAtMTtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCAweDEwMDsgaSsrKVxuICAgIFVOQVNTSUdORURfTk9ERVtpXSA9IFVOQVNTSUdORUQ7XG5cblxuLy8gQ2xhc3MgREJDU0NvZGVjIHJlYWRzIGFuZCBpbml0aWFsaXplcyBtYXBwaW5nIHRhYmxlcy5cbmZ1bmN0aW9uIERCQ1NDb2RlYyhjb2RlY09wdGlvbnMsIGljb252KSB7XG4gICAgdGhpcy5lbmNvZGluZ05hbWUgPSBjb2RlY09wdGlvbnMuZW5jb2RpbmdOYW1lO1xuICAgIGlmICghY29kZWNPcHRpb25zKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEQkNTIGNvZGVjIGlzIGNhbGxlZCB3aXRob3V0IHRoZSBkYXRhLlwiKVxuICAgIGlmICghY29kZWNPcHRpb25zLnRhYmxlKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbmNvZGluZyAnXCIgKyB0aGlzLmVuY29kaW5nTmFtZSArIFwiJyBoYXMgbm8gZGF0YS5cIik7XG5cbiAgICAvLyBMb2FkIHRhYmxlcy5cbiAgICB2YXIgbWFwcGluZ1RhYmxlID0gY29kZWNPcHRpb25zLnRhYmxlKCk7XG5cblxuICAgIC8vIERlY29kZSB0YWJsZXM6IE1CQ1MgLT4gVW5pY29kZS5cblxuICAgIC8vIGRlY29kZVRhYmxlcyBpcyBhIHRyaWUsIGVuY29kZWQgYXMgYW4gYXJyYXkgb2YgYXJyYXlzIG9mIGludGVnZXJzLiBJbnRlcm5hbCBhcnJheXMgYXJlIHRyaWUgbm9kZXMgYW5kIGFsbCBoYXZlIGxlbiA9IDI1Ni5cbiAgICAvLyBUcmllIHJvb3QgaXMgZGVjb2RlVGFibGVzWzBdLlxuICAgIC8vIFZhbHVlczogPj0gIDAgLT4gdW5pY29kZSBjaGFyYWN0ZXIgY29kZS4gY2FuIGJlID4gMHhGRkZGXG4gICAgLy8gICAgICAgICA9PSBVTkFTU0lHTkVEIC0+IHVua25vd24vdW5hc3NpZ25lZCBzZXF1ZW5jZS5cbiAgICAvLyAgICAgICAgID09IEdCMTgwMzBfQ09ERSAtPiB0aGlzIGlzIHRoZSBlbmQgb2YgYSBHQjE4MDMwIDQtYnl0ZSBzZXF1ZW5jZS5cbiAgICAvLyAgICAgICAgIDw9IE5PREVfU1RBUlQgLT4gaW5kZXggb2YgdGhlIG5leHQgbm9kZSBpbiBvdXIgdHJpZSB0byBwcm9jZXNzIG5leHQgYnl0ZS5cbiAgICAvLyAgICAgICAgIDw9IFNFUV9TVEFSVCAgLT4gaW5kZXggb2YgdGhlIHN0YXJ0IG9mIGEgY2hhcmFjdGVyIGNvZGUgc2VxdWVuY2UsIGluIGRlY29kZVRhYmxlU2VxLlxuICAgIHRoaXMuZGVjb2RlVGFibGVzID0gW107XG4gICAgdGhpcy5kZWNvZGVUYWJsZXNbMF0gPSBVTkFTU0lHTkVEX05PREUuc2xpY2UoMCk7IC8vIENyZWF0ZSByb290IG5vZGUuXG5cbiAgICAvLyBTb21ldGltZXMgYSBNQkNTIGNoYXIgY29ycmVzcG9uZHMgdG8gYSBzZXF1ZW5jZSBvZiB1bmljb2RlIGNoYXJzLiBXZSBzdG9yZSB0aGVtIGFzIGFycmF5cyBvZiBpbnRlZ2VycyBoZXJlLiBcbiAgICB0aGlzLmRlY29kZVRhYmxlU2VxID0gW107XG5cbiAgICAvLyBBY3R1YWwgbWFwcGluZyB0YWJsZXMgY29uc2lzdCBvZiBjaHVua3MuIFVzZSB0aGVtIHRvIGZpbGwgdXAgZGVjb2RlIHRhYmxlcy5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcHBpbmdUYWJsZS5sZW5ndGg7IGkrKylcbiAgICAgICAgdGhpcy5fYWRkRGVjb2RlQ2h1bmsobWFwcGluZ1RhYmxlW2ldKTtcblxuICAgIHRoaXMuZGVmYXVsdENoYXJVbmljb2RlID0gaWNvbnYuZGVmYXVsdENoYXJVbmljb2RlO1xuXG4gICAgXG4gICAgLy8gRW5jb2RlIHRhYmxlczogVW5pY29kZSAtPiBEQkNTLlxuXG4gICAgLy8gYGVuY29kZVRhYmxlYCBpcyBhcnJheSBtYXBwaW5nIGZyb20gdW5pY29kZSBjaGFyIHRvIGVuY29kZWQgY2hhci4gQWxsIGl0cyB2YWx1ZXMgYXJlIGludGVnZXJzIGZvciBwZXJmb3JtYW5jZS5cbiAgICAvLyBCZWNhdXNlIGl0IGNhbiBiZSBzcGFyc2UsIGl0IGlzIHJlcHJlc2VudGVkIGFzIGFycmF5IG9mIGJ1Y2tldHMgYnkgMjU2IGNoYXJzIGVhY2guIEJ1Y2tldCBjYW4gYmUgbnVsbC5cbiAgICAvLyBWYWx1ZXM6ID49ICAwIC0+IGl0IGlzIGEgbm9ybWFsIGNoYXIuIFdyaXRlIHRoZSB2YWx1ZSAoaWYgPD0yNTYgdGhlbiAxIGJ5dGUsIGlmIDw9NjU1MzYgdGhlbiAyIGJ5dGVzLCBldGMuKS5cbiAgICAvLyAgICAgICAgID09IFVOQVNTSUdORUQgLT4gbm8gY29udmVyc2lvbiBmb3VuZC4gT3V0cHV0IGEgZGVmYXVsdCBjaGFyLlxuICAgIC8vICAgICAgICAgPD0gU0VRX1NUQVJUICAtPiBpdCdzIGFuIGluZGV4IGluIGVuY29kZVRhYmxlU2VxLCBzZWUgYmVsb3cuIFRoZSBjaGFyYWN0ZXIgc3RhcnRzIGEgc2VxdWVuY2UuXG4gICAgdGhpcy5lbmNvZGVUYWJsZSA9IFtdO1xuICAgIFxuICAgIC8vIGBlbmNvZGVUYWJsZVNlcWAgaXMgdXNlZCB3aGVuIGEgc2VxdWVuY2Ugb2YgdW5pY29kZSBjaGFyYWN0ZXJzIGlzIGVuY29kZWQgYXMgYSBzaW5nbGUgY29kZS4gV2UgdXNlIGEgdHJlZSBvZlxuICAgIC8vIG9iamVjdHMgd2hlcmUga2V5cyBjb3JyZXNwb25kIHRvIGNoYXJhY3RlcnMgaW4gc2VxdWVuY2UgYW5kIGxlYWZzIGFyZSB0aGUgZW5jb2RlZCBkYmNzIHZhbHVlcy4gQSBzcGVjaWFsIERFRl9DSEFSIGtleVxuICAgIC8vIG1lYW5zIGVuZCBvZiBzZXF1ZW5jZSAobmVlZGVkIHdoZW4gb25lIHNlcXVlbmNlIGlzIGEgc3RyaWN0IHN1YnNlcXVlbmNlIG9mIGFub3RoZXIpLlxuICAgIC8vIE9iamVjdHMgYXJlIGtlcHQgc2VwYXJhdGVseSBmcm9tIGVuY29kZVRhYmxlIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlLlxuICAgIHRoaXMuZW5jb2RlVGFibGVTZXEgPSBbXTtcblxuICAgIC8vIFNvbWUgY2hhcnMgY2FuIGJlIGRlY29kZWQsIGJ1dCBuZWVkIG5vdCBiZSBlbmNvZGVkLlxuICAgIHZhciBza2lwRW5jb2RlQ2hhcnMgPSB7fTtcbiAgICBpZiAoY29kZWNPcHRpb25zLmVuY29kZVNraXBWYWxzKVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvZGVjT3B0aW9ucy5lbmNvZGVTa2lwVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHZhbCA9IGNvZGVjT3B0aW9ucy5lbmNvZGVTa2lwVmFsc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICBza2lwRW5jb2RlQ2hhcnNbdmFsXSA9IHRydWU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IHZhbC5mcm9tOyBqIDw9IHZhbC50bzsgaisrKVxuICAgICAgICAgICAgICAgICAgICBza2lwRW5jb2RlQ2hhcnNbal0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgIC8vIFVzZSBkZWNvZGUgdHJpZSB0byByZWN1cnNpdmVseSBmaWxsIG91dCBlbmNvZGUgdGFibGVzLlxuICAgIHRoaXMuX2ZpbGxFbmNvZGVUYWJsZSgwLCAwLCBza2lwRW5jb2RlQ2hhcnMpO1xuXG4gICAgLy8gQWRkIG1vcmUgZW5jb2RpbmcgcGFpcnMgd2hlbiBuZWVkZWQuXG4gICAgaWYgKGNvZGVjT3B0aW9ucy5lbmNvZGVBZGQpIHtcbiAgICAgICAgZm9yICh2YXIgdUNoYXIgaW4gY29kZWNPcHRpb25zLmVuY29kZUFkZClcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29kZWNPcHRpb25zLmVuY29kZUFkZCwgdUNoYXIpKVxuICAgICAgICAgICAgICAgIHRoaXMuX3NldEVuY29kZUNoYXIodUNoYXIuY2hhckNvZGVBdCgwKSwgY29kZWNPcHRpb25zLmVuY29kZUFkZFt1Q2hhcl0pO1xuICAgIH1cblxuICAgIHRoaXMuZGVmQ2hhclNCICA9IHRoaXMuZW5jb2RlVGFibGVbMF1baWNvbnYuZGVmYXVsdENoYXJTaW5nbGVCeXRlLmNoYXJDb2RlQXQoMCldO1xuICAgIGlmICh0aGlzLmRlZkNoYXJTQiA9PT0gVU5BU1NJR05FRCkgdGhpcy5kZWZDaGFyU0IgPSB0aGlzLmVuY29kZVRhYmxlWzBdWyc/J107XG4gICAgaWYgKHRoaXMuZGVmQ2hhclNCID09PSBVTkFTU0lHTkVEKSB0aGlzLmRlZkNoYXJTQiA9IFwiP1wiLmNoYXJDb2RlQXQoMCk7XG5cblxuICAgIC8vIExvYWQgJiBjcmVhdGUgR0IxODAzMCB0YWJsZXMgd2hlbiBuZWVkZWQuXG4gICAgaWYgKHR5cGVvZiBjb2RlY09wdGlvbnMuZ2IxODAzMCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLmdiMTgwMzAgPSBjb2RlY09wdGlvbnMuZ2IxODAzMCgpOyAvLyBMb2FkIEdCMTgwMzAgcmFuZ2VzLlxuXG4gICAgICAgIC8vIEFkZCBHQjE4MDMwIGRlY29kZSB0YWJsZXMuXG4gICAgICAgIHZhciB0aGlyZEJ5dGVOb2RlSWR4ID0gdGhpcy5kZWNvZGVUYWJsZXMubGVuZ3RoO1xuICAgICAgICB2YXIgdGhpcmRCeXRlTm9kZSA9IHRoaXMuZGVjb2RlVGFibGVzW3RoaXJkQnl0ZU5vZGVJZHhdID0gVU5BU1NJR05FRF9OT0RFLnNsaWNlKDApO1xuXG4gICAgICAgIHZhciBmb3VydGhCeXRlTm9kZUlkeCA9IHRoaXMuZGVjb2RlVGFibGVzLmxlbmd0aDtcbiAgICAgICAgdmFyIGZvdXJ0aEJ5dGVOb2RlID0gdGhpcy5kZWNvZGVUYWJsZXNbZm91cnRoQnl0ZU5vZGVJZHhdID0gVU5BU1NJR05FRF9OT0RFLnNsaWNlKDApO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAweDgxOyBpIDw9IDB4RkU7IGkrKykge1xuICAgICAgICAgICAgdmFyIHNlY29uZEJ5dGVOb2RlSWR4ID0gTk9ERV9TVEFSVCAtIHRoaXMuZGVjb2RlVGFibGVzWzBdW2ldO1xuICAgICAgICAgICAgdmFyIHNlY29uZEJ5dGVOb2RlID0gdGhpcy5kZWNvZGVUYWJsZXNbc2Vjb25kQnl0ZU5vZGVJZHhdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDB4MzA7IGogPD0gMHgzOTsgaisrKVxuICAgICAgICAgICAgICAgIHNlY29uZEJ5dGVOb2RlW2pdID0gTk9ERV9TVEFSVCAtIHRoaXJkQnl0ZU5vZGVJZHg7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IDB4ODE7IGkgPD0gMHhGRTsgaSsrKVxuICAgICAgICAgICAgdGhpcmRCeXRlTm9kZVtpXSA9IE5PREVfU1RBUlQgLSBmb3VydGhCeXRlTm9kZUlkeDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDB4MzA7IGkgPD0gMHgzOTsgaSsrKVxuICAgICAgICAgICAgZm91cnRoQnl0ZU5vZGVbaV0gPSBHQjE4MDMwX0NPREVcbiAgICB9ICAgICAgICBcbn1cblxuREJDU0NvZGVjLnByb3RvdHlwZS5lbmNvZGVyID0gREJDU0VuY29kZXI7XG5EQkNTQ29kZWMucHJvdG90eXBlLmRlY29kZXIgPSBEQkNTRGVjb2RlcjtcblxuLy8gRGVjb2RlciBoZWxwZXJzXG5EQkNTQ29kZWMucHJvdG90eXBlLl9nZXREZWNvZGVUcmllTm9kZSA9IGZ1bmN0aW9uKGFkZHIpIHtcbiAgICB2YXIgYnl0ZXMgPSBbXTtcbiAgICBmb3IgKDsgYWRkciA+IDA7IGFkZHIgPj49IDgpXG4gICAgICAgIGJ5dGVzLnB1c2goYWRkciAmIDB4RkYpO1xuICAgIGlmIChieXRlcy5sZW5ndGggPT0gMClcbiAgICAgICAgYnl0ZXMucHVzaCgwKTtcblxuICAgIHZhciBub2RlID0gdGhpcy5kZWNvZGVUYWJsZXNbMF07XG4gICAgZm9yICh2YXIgaSA9IGJ5dGVzLmxlbmd0aC0xOyBpID4gMDsgaS0tKSB7IC8vIFRyYXZlcnNlIG5vZGVzIGRlZXBlciBpbnRvIHRoZSB0cmllLlxuICAgICAgICB2YXIgdmFsID0gbm9kZVtieXRlc1tpXV07XG5cbiAgICAgICAgaWYgKHZhbCA9PSBVTkFTU0lHTkVEKSB7IC8vIENyZWF0ZSBuZXcgbm9kZS5cbiAgICAgICAgICAgIG5vZGVbYnl0ZXNbaV1dID0gTk9ERV9TVEFSVCAtIHRoaXMuZGVjb2RlVGFibGVzLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuZGVjb2RlVGFibGVzLnB1c2gobm9kZSA9IFVOQVNTSUdORURfTk9ERS5zbGljZSgwKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsIDw9IE5PREVfU1RBUlQpIHsgLy8gRXhpc3Rpbmcgbm9kZS5cbiAgICAgICAgICAgIG5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1tOT0RFX1NUQVJUIC0gdmFsXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPdmVyd3JpdGUgYnl0ZSBpbiBcIiArIHRoaXMuZW5jb2RpbmdOYW1lICsgXCIsIGFkZHI6IFwiICsgYWRkci50b1N0cmluZygxNikpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbn1cblxuXG5EQkNTQ29kZWMucHJvdG90eXBlLl9hZGREZWNvZGVDaHVuayA9IGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgLy8gRmlyc3QgZWxlbWVudCBvZiBjaHVuayBpcyB0aGUgaGV4IG1iY3MgY29kZSB3aGVyZSB3ZSBzdGFydC5cbiAgICB2YXIgY3VyQWRkciA9IHBhcnNlSW50KGNodW5rWzBdLCAxNik7XG5cbiAgICAvLyBDaG9vc2UgdGhlIGRlY29kaW5nIG5vZGUgd2hlcmUgd2UnbGwgd3JpdGUgb3VyIGNoYXJzLlxuICAgIHZhciB3cml0ZVRhYmxlID0gdGhpcy5fZ2V0RGVjb2RlVHJpZU5vZGUoY3VyQWRkcik7XG4gICAgY3VyQWRkciA9IGN1ckFkZHIgJiAweEZGO1xuXG4gICAgLy8gV3JpdGUgYWxsIG90aGVyIGVsZW1lbnRzIG9mIHRoZSBjaHVuayB0byB0aGUgdGFibGUuXG4gICAgZm9yICh2YXIgayA9IDE7IGsgPCBjaHVuay5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgcGFydCA9IGNodW5rW2tdO1xuICAgICAgICBpZiAodHlwZW9mIHBhcnQgPT09IFwic3RyaW5nXCIpIHsgLy8gU3RyaW5nLCB3cml0ZSBhcy1pcy5cbiAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgcGFydC5sZW5ndGg7KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNvZGUgPSBwYXJ0LmNoYXJDb2RlQXQobCsrKTtcbiAgICAgICAgICAgICAgICBpZiAoMHhEODAwIDw9IGNvZGUgJiYgY29kZSA8IDB4REMwMCkgeyAvLyBEZWNvZGUgc3Vycm9nYXRlXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2RlVHJhaWwgPSBwYXJ0LmNoYXJDb2RlQXQobCsrKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKDB4REMwMCA8PSBjb2RlVHJhaWwgJiYgY29kZVRyYWlsIDwgMHhFMDAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUYWJsZVtjdXJBZGRyKytdID0gMHgxMDAwMCArIChjb2RlIC0gMHhEODAwKSAqIDB4NDAwICsgKGNvZGVUcmFpbCAtIDB4REMwMCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluY29ycmVjdCBzdXJyb2dhdGUgcGFpciBpbiBcIiAgKyB0aGlzLmVuY29kaW5nTmFtZSArIFwiIGF0IGNodW5rIFwiICsgY2h1bmtbMF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICgweDBGRjAgPCBjb2RlICYmIGNvZGUgPD0gMHgwRkZGKSB7IC8vIENoYXJhY3RlciBzZXF1ZW5jZSAob3VyIG93biBlbmNvZGluZyB1c2VkKVxuICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gMHhGRkYgLSBjb2RlICsgMjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlcSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtID0gMDsgbSA8IGxlbjsgbSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VxLnB1c2gocGFydC5jaGFyQ29kZUF0KGwrKykpOyAvLyBTaW1wbGUgdmFyaWF0aW9uOiBkb24ndCBzdXBwb3J0IHN1cnJvZ2F0ZXMgb3Igc3Vic2VxdWVuY2VzIGluIHNlcS5cblxuICAgICAgICAgICAgICAgICAgICB3cml0ZVRhYmxlW2N1ckFkZHIrK10gPSBTRVFfU1RBUlQgLSB0aGlzLmRlY29kZVRhYmxlU2VxLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNvZGVUYWJsZVNlcS5wdXNoKHNlcSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVUYWJsZVtjdXJBZGRyKytdID0gY29kZTsgLy8gQmFzaWMgY2hhclxuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgcGFydCA9PT0gXCJudW1iZXJcIikgeyAvLyBJbnRlZ2VyLCBtZWFuaW5nIGluY3JlYXNpbmcgc2VxdWVuY2Ugc3RhcnRpbmcgd2l0aCBwcmV2IGNoYXJhY3Rlci5cbiAgICAgICAgICAgIHZhciBjaGFyQ29kZSA9IHdyaXRlVGFibGVbY3VyQWRkciAtIDFdICsgMTtcbiAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgcGFydDsgbCsrKVxuICAgICAgICAgICAgICAgIHdyaXRlVGFibGVbY3VyQWRkcisrXSA9IGNoYXJDb2RlKys7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5jb3JyZWN0IHR5cGUgJ1wiICsgdHlwZW9mIHBhcnQgKyBcIicgZ2l2ZW4gaW4gXCIgICsgdGhpcy5lbmNvZGluZ05hbWUgKyBcIiBhdCBjaHVuayBcIiArIGNodW5rWzBdKTtcbiAgICB9XG4gICAgaWYgKGN1ckFkZHIgPiAweEZGKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbmNvcnJlY3QgY2h1bmsgaW4gXCIgICsgdGhpcy5lbmNvZGluZ05hbWUgKyBcIiBhdCBhZGRyIFwiICsgY2h1bmtbMF0gKyBcIjogdG9vIGxvbmdcIiArIGN1ckFkZHIpO1xufVxuXG4vLyBFbmNvZGVyIGhlbHBlcnNcbkRCQ1NDb2RlYy5wcm90b3R5cGUuX2dldEVuY29kZUJ1Y2tldCA9IGZ1bmN0aW9uKHVDb2RlKSB7XG4gICAgdmFyIGhpZ2ggPSB1Q29kZSA+PiA4OyAvLyBUaGlzIGNvdWxkIGJlID4gMHhGRiBiZWNhdXNlIG9mIGFzdHJhbCBjaGFyYWN0ZXJzLlxuICAgIGlmICh0aGlzLmVuY29kZVRhYmxlW2hpZ2hdID09PSB1bmRlZmluZWQpXG4gICAgICAgIHRoaXMuZW5jb2RlVGFibGVbaGlnaF0gPSBVTkFTU0lHTkVEX05PREUuc2xpY2UoMCk7IC8vIENyZWF0ZSBidWNrZXQgb24gZGVtYW5kLlxuICAgIHJldHVybiB0aGlzLmVuY29kZVRhYmxlW2hpZ2hdO1xufVxuXG5EQkNTQ29kZWMucHJvdG90eXBlLl9zZXRFbmNvZGVDaGFyID0gZnVuY3Rpb24odUNvZGUsIGRiY3NDb2RlKSB7XG4gICAgdmFyIGJ1Y2tldCA9IHRoaXMuX2dldEVuY29kZUJ1Y2tldCh1Q29kZSk7XG4gICAgdmFyIGxvdyA9IHVDb2RlICYgMHhGRjtcbiAgICBpZiAoYnVja2V0W2xvd10gPD0gU0VRX1NUQVJUKVxuICAgICAgICB0aGlzLmVuY29kZVRhYmxlU2VxW1NFUV9TVEFSVC1idWNrZXRbbG93XV1bREVGX0NIQVJdID0gZGJjc0NvZGU7IC8vIFRoZXJlJ3MgYWxyZWFkeSBhIHNlcXVlbmNlLCBzZXQgYSBzaW5nbGUtY2hhciBzdWJzZXF1ZW5jZSBvZiBpdC5cbiAgICBlbHNlIGlmIChidWNrZXRbbG93XSA9PSBVTkFTU0lHTkVEKVxuICAgICAgICBidWNrZXRbbG93XSA9IGRiY3NDb2RlO1xufVxuXG5EQkNTQ29kZWMucHJvdG90eXBlLl9zZXRFbmNvZGVTZXF1ZW5jZSA9IGZ1bmN0aW9uKHNlcSwgZGJjc0NvZGUpIHtcbiAgICBcbiAgICAvLyBHZXQgdGhlIHJvb3Qgb2YgY2hhcmFjdGVyIHRyZWUgYWNjb3JkaW5nIHRvIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgc2VxdWVuY2UuXG4gICAgdmFyIHVDb2RlID0gc2VxWzBdO1xuICAgIHZhciBidWNrZXQgPSB0aGlzLl9nZXRFbmNvZGVCdWNrZXQodUNvZGUpO1xuICAgIHZhciBsb3cgPSB1Q29kZSAmIDB4RkY7XG5cbiAgICB2YXIgbm9kZTtcbiAgICBpZiAoYnVja2V0W2xvd10gPD0gU0VRX1NUQVJUKSB7XG4gICAgICAgIC8vIFRoZXJlJ3MgYWxyZWFkeSBhIHNlcXVlbmNlIHdpdGggIC0gdXNlIGl0LlxuICAgICAgICBub2RlID0gdGhpcy5lbmNvZGVUYWJsZVNlcVtTRVFfU1RBUlQtYnVja2V0W2xvd11dO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gVGhlcmUgd2FzIG5vIHNlcXVlbmNlIG9iamVjdCAtIGFsbG9jYXRlIGEgbmV3IG9uZS5cbiAgICAgICAgbm9kZSA9IHt9O1xuICAgICAgICBpZiAoYnVja2V0W2xvd10gIT09IFVOQVNTSUdORUQpIG5vZGVbREVGX0NIQVJdID0gYnVja2V0W2xvd107IC8vIElmIGEgY2hhciB3YXMgc2V0IGJlZm9yZSAtIG1ha2UgaXQgYSBzaW5nbGUtY2hhciBzdWJzZXF1ZW5jZS5cbiAgICAgICAgYnVja2V0W2xvd10gPSBTRVFfU1RBUlQgLSB0aGlzLmVuY29kZVRhYmxlU2VxLmxlbmd0aDtcbiAgICAgICAgdGhpcy5lbmNvZGVUYWJsZVNlcS5wdXNoKG5vZGUpO1xuICAgIH1cblxuICAgIC8vIFRyYXZlcnNlIHRoZSBjaGFyYWN0ZXIgdHJlZSwgYWxsb2NhdGluZyBuZXcgbm9kZXMgYXMgbmVlZGVkLlxuICAgIGZvciAodmFyIGogPSAxOyBqIDwgc2VxLmxlbmd0aC0xOyBqKyspIHtcbiAgICAgICAgdmFyIG9sZFZhbCA9IG5vZGVbdUNvZGVdO1xuICAgICAgICBpZiAodHlwZW9mIG9sZFZhbCA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICBub2RlID0gb2xkVmFsO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlW3VDb2RlXSA9IHt9XG4gICAgICAgICAgICBpZiAob2xkVmFsICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgbm9kZVtERUZfQ0hBUl0gPSBvbGRWYWxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCB0aGUgbGVhZiB0byBnaXZlbiBkYmNzQ29kZS5cbiAgICB1Q29kZSA9IHNlcVtzZXEubGVuZ3RoLTFdO1xuICAgIG5vZGVbdUNvZGVdID0gZGJjc0NvZGU7XG59XG5cbkRCQ1NDb2RlYy5wcm90b3R5cGUuX2ZpbGxFbmNvZGVUYWJsZSA9IGZ1bmN0aW9uKG5vZGVJZHgsIHByZWZpeCwgc2tpcEVuY29kZUNoYXJzKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLmRlY29kZVRhYmxlc1tub2RlSWR4XTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDB4MTAwOyBpKyspIHtcbiAgICAgICAgdmFyIHVDb2RlID0gbm9kZVtpXTtcbiAgICAgICAgdmFyIG1iQ29kZSA9IHByZWZpeCArIGk7XG4gICAgICAgIGlmIChza2lwRW5jb2RlQ2hhcnNbbWJDb2RlXSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmICh1Q29kZSA+PSAwKVxuICAgICAgICAgICAgdGhpcy5fc2V0RW5jb2RlQ2hhcih1Q29kZSwgbWJDb2RlKTtcbiAgICAgICAgZWxzZSBpZiAodUNvZGUgPD0gTk9ERV9TVEFSVClcbiAgICAgICAgICAgIHRoaXMuX2ZpbGxFbmNvZGVUYWJsZShOT0RFX1NUQVJUIC0gdUNvZGUsIG1iQ29kZSA8PCA4LCBza2lwRW5jb2RlQ2hhcnMpO1xuICAgICAgICBlbHNlIGlmICh1Q29kZSA8PSBTRVFfU1RBUlQpXG4gICAgICAgICAgICB0aGlzLl9zZXRFbmNvZGVTZXF1ZW5jZSh0aGlzLmRlY29kZVRhYmxlU2VxW1NFUV9TVEFSVCAtIHVDb2RlXSwgbWJDb2RlKTtcbiAgICB9XG59XG5cblxuXG4vLyA9PSBFbmNvZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBEQkNTRW5jb2RlcihvcHRpb25zLCBjb2RlYykge1xuICAgIC8vIEVuY29kZXIgc3RhdGVcbiAgICB0aGlzLmxlYWRTdXJyb2dhdGUgPSAtMTtcbiAgICB0aGlzLnNlcU9iaiA9IHVuZGVmaW5lZDtcbiAgICBcbiAgICAvLyBTdGF0aWMgZGF0YVxuICAgIHRoaXMuZW5jb2RlVGFibGUgPSBjb2RlYy5lbmNvZGVUYWJsZTtcbiAgICB0aGlzLmVuY29kZVRhYmxlU2VxID0gY29kZWMuZW5jb2RlVGFibGVTZXE7XG4gICAgdGhpcy5kZWZhdWx0Q2hhclNpbmdsZUJ5dGUgPSBjb2RlYy5kZWZDaGFyU0I7XG4gICAgdGhpcy5nYjE4MDMwID0gY29kZWMuZ2IxODAzMDtcbn1cblxuREJDU0VuY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgdmFyIG5ld0J1ZiA9IG5ldyBCdWZmZXIoc3RyLmxlbmd0aCAqICh0aGlzLmdiMTgwMzAgPyA0IDogMykpLCBcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IHRoaXMubGVhZFN1cnJvZ2F0ZSxcbiAgICAgICAgc2VxT2JqID0gdGhpcy5zZXFPYmosIG5leHRDaGFyID0gLTEsXG4gICAgICAgIGkgPSAwLCBqID0gMDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIC8vIDAuIEdldCBuZXh0IGNoYXJhY3Rlci5cbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAtMSkge1xuICAgICAgICAgICAgaWYgKGkgPT0gc3RyLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgICAgICB2YXIgdUNvZGUgPSBzdHIuY2hhckNvZGVBdChpKyspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIHVDb2RlID0gbmV4dENoYXI7XG4gICAgICAgICAgICBuZXh0Q2hhciA9IC0xOyAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDEuIEhhbmRsZSBzdXJyb2dhdGVzLlxuICAgICAgICBpZiAoMHhEODAwIDw9IHVDb2RlICYmIHVDb2RlIDwgMHhFMDAwKSB7IC8vIENoYXIgaXMgb25lIG9mIHN1cnJvZ2F0ZXMuXG4gICAgICAgICAgICBpZiAodUNvZGUgPCAweERDMDApIHsgLy8gV2UndmUgZ290IGxlYWQgc3Vycm9nYXRlLlxuICAgICAgICAgICAgICAgIGlmIChsZWFkU3Vycm9nYXRlID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gdUNvZGU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxlYWRTdXJyb2dhdGUgPSB1Q29kZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG91YmxlIGxlYWQgc3Vycm9nYXRlIGZvdW5kLlxuICAgICAgICAgICAgICAgICAgICB1Q29kZSA9IFVOQVNTSUdORUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHsgLy8gV2UndmUgZ290IHRyYWlsIHN1cnJvZ2F0ZS5cbiAgICAgICAgICAgICAgICBpZiAobGVhZFN1cnJvZ2F0ZSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdUNvZGUgPSAweDEwMDAwICsgKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDApICogMHg0MDAgKyAodUNvZGUgLSAweERDMDApO1xuICAgICAgICAgICAgICAgICAgICBsZWFkU3Vycm9nYXRlID0gLTE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW5jb21wbGV0ZSBzdXJyb2dhdGUgcGFpciAtIG9ubHkgdHJhaWwgc3Vycm9nYXRlIGZvdW5kLlxuICAgICAgICAgICAgICAgICAgICB1Q29kZSA9IFVOQVNTSUdORUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBJbmNvbXBsZXRlIHN1cnJvZ2F0ZSBwYWlyIC0gb25seSBsZWFkIHN1cnJvZ2F0ZSBmb3VuZC5cbiAgICAgICAgICAgIG5leHRDaGFyID0gdUNvZGU7IHVDb2RlID0gVU5BU1NJR05FRDsgLy8gV3JpdGUgYW4gZXJyb3IsIHRoZW4gY3VycmVudCBjaGFyLlxuICAgICAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gQ29udmVydCB1Q29kZSBjaGFyYWN0ZXIuXG4gICAgICAgIHZhciBkYmNzQ29kZSA9IFVOQVNTSUdORUQ7XG4gICAgICAgIGlmIChzZXFPYmogIT09IHVuZGVmaW5lZCAmJiB1Q29kZSAhPSBVTkFTU0lHTkVEKSB7IC8vIFdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzZXF1ZW5jZVxuICAgICAgICAgICAgdmFyIHJlc0NvZGUgPSBzZXFPYmpbdUNvZGVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXNDb2RlID09PSAnb2JqZWN0JykgeyAvLyBTZXF1ZW5jZSBjb250aW51ZXMuXG4gICAgICAgICAgICAgICAgc2VxT2JqID0gcmVzQ29kZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzQ29kZSA9PSAnbnVtYmVyJykgeyAvLyBTZXF1ZW5jZSBmaW5pc2hlZC4gV3JpdGUgaXQuXG4gICAgICAgICAgICAgICAgZGJjc0NvZGUgPSByZXNDb2RlO1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc0NvZGUgPT0gdW5kZWZpbmVkKSB7IC8vIEN1cnJlbnQgY2hhcmFjdGVyIGlzIG5vdCBwYXJ0IG9mIHRoZSBzZXF1ZW5jZS5cblxuICAgICAgICAgICAgICAgIC8vIFRyeSBkZWZhdWx0IGNoYXJhY3RlciBmb3IgdGhpcyBzZXF1ZW5jZVxuICAgICAgICAgICAgICAgIHJlc0NvZGUgPSBzZXFPYmpbREVGX0NIQVJdO1xuICAgICAgICAgICAgICAgIGlmIChyZXNDb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGJjc0NvZGUgPSByZXNDb2RlOyAvLyBGb3VuZC4gV3JpdGUgaXQuXG4gICAgICAgICAgICAgICAgICAgIG5leHRDaGFyID0gdUNvZGU7IC8vIEN1cnJlbnQgY2hhcmFjdGVyIHdpbGwgYmUgd3JpdHRlbiB0b28gaW4gdGhlIG5leHQgaXRlcmF0aW9uLlxuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogV2hhdCBpZiB3ZSBoYXZlIG5vIGRlZmF1bHQ/IChyZXNDb2RlID09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlbiwgd2Ugc2hvdWxkIHdyaXRlIGZpcnN0IGNoYXIgb2YgdGhlIHNlcXVlbmNlIGFzLWlzIGFuZCB0cnkgdGhlIHJlc3QgcmVjdXJzaXZlbHkuXG4gICAgICAgICAgICAgICAgICAgIC8vIERpZG4ndCBkbyBpdCBmb3Igbm93IGJlY2F1c2Ugbm8gZW5jb2RpbmcgaGFzIHRoaXMgc2l0dWF0aW9uIHlldC5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ3VycmVudGx5LCBqdXN0IHNraXAgdGhlIHNlcXVlbmNlIGFuZCB3cml0ZSBjdXJyZW50IGNoYXIuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VxT2JqID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVDb2RlID49IDApIHsgIC8vIFJlZ3VsYXIgY2hhcmFjdGVyXG4gICAgICAgICAgICB2YXIgc3VidGFibGUgPSB0aGlzLmVuY29kZVRhYmxlW3VDb2RlID4+IDhdO1xuICAgICAgICAgICAgaWYgKHN1YnRhYmxlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgZGJjc0NvZGUgPSBzdWJ0YWJsZVt1Q29kZSAmIDB4RkZdO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZGJjc0NvZGUgPD0gU0VRX1NUQVJUKSB7IC8vIFNlcXVlbmNlIHN0YXJ0XG4gICAgICAgICAgICAgICAgc2VxT2JqID0gdGhpcy5lbmNvZGVUYWJsZVNlcVtTRVFfU1RBUlQtZGJjc0NvZGVdO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGJjc0NvZGUgPT0gVU5BU1NJR05FRCAmJiB0aGlzLmdiMTgwMzApIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgR0IxODAzMCBhbGdvcml0aG0gdG8gZmluZCBjaGFyYWN0ZXIocykgdG8gd3JpdGUuXG4gICAgICAgICAgICAgICAgdmFyIGlkeCA9IGZpbmRJZHgodGhpcy5nYjE4MDMwLnVDaGFycywgdUNvZGUpO1xuICAgICAgICAgICAgICAgIGlmIChpZHggIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRiY3NDb2RlID0gdGhpcy5nYjE4MDMwLmdiQ2hhcnNbaWR4XSArICh1Q29kZSAtIHRoaXMuZ2IxODAzMC51Q2hhcnNbaWR4XSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0J1ZltqKytdID0gMHg4MSArIE1hdGguZmxvb3IoZGJjc0NvZGUgLyAxMjYwMCk7IGRiY3NDb2RlID0gZGJjc0NvZGUgJSAxMjYwMDtcbiAgICAgICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSAweDMwICsgTWF0aC5mbG9vcihkYmNzQ29kZSAvIDEyNjApOyBkYmNzQ29kZSA9IGRiY3NDb2RlICUgMTI2MDtcbiAgICAgICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSAweDgxICsgTWF0aC5mbG9vcihkYmNzQ29kZSAvIDEwKTsgZGJjc0NvZGUgPSBkYmNzQ29kZSAlIDEwO1xuICAgICAgICAgICAgICAgICAgICBuZXdCdWZbaisrXSA9IDB4MzAgKyBkYmNzQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gMy4gV3JpdGUgZGJjc0NvZGUgY2hhcmFjdGVyLlxuICAgICAgICBpZiAoZGJjc0NvZGUgPT09IFVOQVNTSUdORUQpXG4gICAgICAgICAgICBkYmNzQ29kZSA9IHRoaXMuZGVmYXVsdENoYXJTaW5nbGVCeXRlO1xuICAgICAgICBcbiAgICAgICAgaWYgKGRiY3NDb2RlIDwgMHgxMDApIHtcbiAgICAgICAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGJjc0NvZGUgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlID4+IDg7ICAgLy8gaGlnaCBieXRlXG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlICYgMHhGRjsgLy8gbG93IGJ5dGVcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGUgPj4gMTY7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IChkYmNzQ29kZSA+PiA4KSAmIDB4RkY7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlICYgMHhGRjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VxT2JqID0gc2VxT2JqO1xuICAgIHRoaXMubGVhZFN1cnJvZ2F0ZSA9IGxlYWRTdXJyb2dhdGU7XG4gICAgcmV0dXJuIG5ld0J1Zi5zbGljZSgwLCBqKTtcbn1cblxuREJDU0VuY29kZXIucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLmxlYWRTdXJyb2dhdGUgPT09IC0xICYmIHRoaXMuc2VxT2JqID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybjsgLy8gQWxsIGNsZWFuLiBNb3N0IG9mdGVuIGNhc2UuXG5cbiAgICB2YXIgbmV3QnVmID0gbmV3IEJ1ZmZlcigxMCksIGogPSAwO1xuXG4gICAgaWYgKHRoaXMuc2VxT2JqKSB7IC8vIFdlJ3JlIGluIHRoZSBzZXF1ZW5jZS5cbiAgICAgICAgdmFyIGRiY3NDb2RlID0gdGhpcy5zZXFPYmpbREVGX0NIQVJdO1xuICAgICAgICBpZiAoZGJjc0NvZGUgIT09IHVuZGVmaW5lZCkgeyAvLyBXcml0ZSBiZWdpbm5pbmcgb2YgdGhlIHNlcXVlbmNlLlxuICAgICAgICAgICAgaWYgKGRiY3NDb2RlIDwgMHgxMDApIHtcbiAgICAgICAgICAgICAgICBuZXdCdWZbaisrXSA9IGRiY3NDb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSBkYmNzQ29kZSA+PiA4OyAgIC8vIGhpZ2ggYnl0ZVxuICAgICAgICAgICAgICAgIG5ld0J1ZltqKytdID0gZGJjc0NvZGUgJiAweEZGOyAvLyBsb3cgYnl0ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2VlIHRvZG8gYWJvdmUuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXFPYmogPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVhZFN1cnJvZ2F0ZSAhPT0gLTEpIHtcbiAgICAgICAgLy8gSW5jb21wbGV0ZSBzdXJyb2dhdGUgcGFpciAtIG9ubHkgbGVhZCBzdXJyb2dhdGUgZm91bmQuXG4gICAgICAgIG5ld0J1ZltqKytdID0gdGhpcy5kZWZhdWx0Q2hhclNpbmdsZUJ5dGU7XG4gICAgICAgIHRoaXMubGVhZFN1cnJvZ2F0ZSA9IC0xO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gbmV3QnVmLnNsaWNlKDAsIGopO1xufVxuXG4vLyBFeHBvcnQgZm9yIHRlc3RpbmdcbkRCQ1NFbmNvZGVyLnByb3RvdHlwZS5maW5kSWR4ID0gZmluZElkeDtcblxuXG4vLyA9PSBEZWNvZGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5mdW5jdGlvbiBEQkNTRGVjb2RlcihvcHRpb25zLCBjb2RlYykge1xuICAgIC8vIERlY29kZXIgc3RhdGVcbiAgICB0aGlzLm5vZGVJZHggPSAwO1xuICAgIHRoaXMucHJldkJ1ZiA9IG5ldyBCdWZmZXIoMCk7XG5cbiAgICAvLyBTdGF0aWMgZGF0YVxuICAgIHRoaXMuZGVjb2RlVGFibGVzID0gY29kZWMuZGVjb2RlVGFibGVzO1xuICAgIHRoaXMuZGVjb2RlVGFibGVTZXEgPSBjb2RlYy5kZWNvZGVUYWJsZVNlcTtcbiAgICB0aGlzLmRlZmF1bHRDaGFyVW5pY29kZSA9IGNvZGVjLmRlZmF1bHRDaGFyVW5pY29kZTtcbiAgICB0aGlzLmdiMTgwMzAgPSBjb2RlYy5nYjE4MDMwO1xufVxuXG5EQkNTRGVjb2Rlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHtcbiAgICB2YXIgbmV3QnVmID0gbmV3IEJ1ZmZlcihidWYubGVuZ3RoKjIpLFxuICAgICAgICBub2RlSWR4ID0gdGhpcy5ub2RlSWR4LCBcbiAgICAgICAgcHJldkJ1ZiA9IHRoaXMucHJldkJ1ZiwgcHJldkJ1Zk9mZnNldCA9IHRoaXMucHJldkJ1Zi5sZW5ndGgsXG4gICAgICAgIHNlcVN0YXJ0ID0gLXRoaXMucHJldkJ1Zi5sZW5ndGgsIC8vIGlkeCBvZiB0aGUgc3RhcnQgb2YgY3VycmVudCBwYXJzZWQgc2VxdWVuY2UuXG4gICAgICAgIHVDb2RlO1xuXG4gICAgaWYgKHByZXZCdWZPZmZzZXQgPiAwKSAvLyBNYWtlIHByZXYgYnVmIG92ZXJsYXAgYSBsaXR0bGUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gc2xpY2UgbGF0ZXIuXG4gICAgICAgIHByZXZCdWYgPSBCdWZmZXIuY29uY2F0KFtwcmV2QnVmLCBidWYuc2xpY2UoMCwgMTApXSk7XG4gICAgXG4gICAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjdXJCeXRlID0gKGkgPj0gMCkgPyBidWZbaV0gOiBwcmV2QnVmW2kgKyBwcmV2QnVmT2Zmc2V0XTtcblxuICAgICAgICAvLyBMb29rdXAgaW4gY3VycmVudCB0cmllIG5vZGUuXG4gICAgICAgIHZhciB1Q29kZSA9IHRoaXMuZGVjb2RlVGFibGVzW25vZGVJZHhdW2N1ckJ5dGVdO1xuXG4gICAgICAgIGlmICh1Q29kZSA+PSAwKSB7IFxuICAgICAgICAgICAgLy8gTm9ybWFsIGNoYXJhY3RlciwganVzdCB1c2UgaXQuXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodUNvZGUgPT09IFVOQVNTSUdORUQpIHsgLy8gVW5rbm93biBjaGFyLlxuICAgICAgICAgICAgLy8gVE9ETzogQ2FsbGJhY2sgd2l0aCBzZXEuXG4gICAgICAgICAgICAvL3ZhciBjdXJTZXEgPSAoc2VxU3RhcnQgPj0gMCkgPyBidWYuc2xpY2Uoc2VxU3RhcnQsIGkrMSkgOiBwcmV2QnVmLnNsaWNlKHNlcVN0YXJ0ICsgcHJldkJ1Zk9mZnNldCwgaSsxICsgcHJldkJ1Zk9mZnNldCk7XG4gICAgICAgICAgICBpID0gc2VxU3RhcnQ7IC8vIFRyeSB0byBwYXJzZSBhZ2FpbiwgYWZ0ZXIgc2tpcHBpbmcgZmlyc3QgYnl0ZSBvZiB0aGUgc2VxdWVuY2UgKCdpJyB3aWxsIGJlIGluY3JlbWVudGVkIGJ5ICdmb3InIGN5Y2xlKS5cbiAgICAgICAgICAgIHVDb2RlID0gdGhpcy5kZWZhdWx0Q2hhclVuaWNvZGUuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh1Q29kZSA9PT0gR0IxODAzMF9DT0RFKSB7XG4gICAgICAgICAgICB2YXIgY3VyU2VxID0gKHNlcVN0YXJ0ID49IDApID8gYnVmLnNsaWNlKHNlcVN0YXJ0LCBpKzEpIDogcHJldkJ1Zi5zbGljZShzZXFTdGFydCArIHByZXZCdWZPZmZzZXQsIGkrMSArIHByZXZCdWZPZmZzZXQpO1xuICAgICAgICAgICAgdmFyIHB0ciA9IChjdXJTZXFbMF0tMHg4MSkqMTI2MDAgKyAoY3VyU2VxWzFdLTB4MzApKjEyNjAgKyAoY3VyU2VxWzJdLTB4ODEpKjEwICsgKGN1clNlcVszXS0weDMwKTtcbiAgICAgICAgICAgIHZhciBpZHggPSBmaW5kSWR4KHRoaXMuZ2IxODAzMC5nYkNoYXJzLCBwdHIpO1xuICAgICAgICAgICAgdUNvZGUgPSB0aGlzLmdiMTgwMzAudUNoYXJzW2lkeF0gKyBwdHIgLSB0aGlzLmdiMTgwMzAuZ2JDaGFyc1tpZHhdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVDb2RlIDw9IE5PREVfU1RBUlQpIHsgLy8gR28gdG8gbmV4dCB0cmllIG5vZGUuXG4gICAgICAgICAgICBub2RlSWR4ID0gTk9ERV9TVEFSVCAtIHVDb2RlO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodUNvZGUgPD0gU0VRX1NUQVJUKSB7IC8vIE91dHB1dCBhIHNlcXVlbmNlIG9mIGNoYXJzLlxuICAgICAgICAgICAgdmFyIHNlcSA9IHRoaXMuZGVjb2RlVGFibGVTZXFbU0VRX1NUQVJUIC0gdUNvZGVdO1xuICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBzZXEubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICAgICAgICAgICAgdUNvZGUgPSBzZXFba107XG4gICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSB1Q29kZSAmIDB4RkY7XG4gICAgICAgICAgICAgICAgbmV3QnVmW2orK10gPSB1Q29kZSA+PiA4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdUNvZGUgPSBzZXFbc2VxLmxlbmd0aC0xXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpY29udi1saXRlIGludGVybmFsIGVycm9yOiBpbnZhbGlkIGRlY29kaW5nIHRhYmxlIHZhbHVlIFwiICsgdUNvZGUgKyBcIiBhdCBcIiArIG5vZGVJZHggKyBcIi9cIiArIGN1ckJ5dGUpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBjaGFyYWN0ZXIgdG8gYnVmZmVyLCBoYW5kbGluZyBoaWdoZXIgcGxhbmVzIHVzaW5nIHN1cnJvZ2F0ZSBwYWlyLlxuICAgICAgICBpZiAodUNvZGUgPiAweEZGRkYpIHsgXG4gICAgICAgICAgICB1Q29kZSAtPSAweDEwMDAwO1xuICAgICAgICAgICAgdmFyIHVDb2RlTGVhZCA9IDB4RDgwMCArIE1hdGguZmxvb3IodUNvZGUgLyAweDQwMCk7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IHVDb2RlTGVhZCAmIDB4RkY7XG4gICAgICAgICAgICBuZXdCdWZbaisrXSA9IHVDb2RlTGVhZCA+PiA4O1xuXG4gICAgICAgICAgICB1Q29kZSA9IDB4REMwMCArIHVDb2RlICUgMHg0MDA7XG4gICAgICAgIH1cbiAgICAgICAgbmV3QnVmW2orK10gPSB1Q29kZSAmIDB4RkY7XG4gICAgICAgIG5ld0J1ZltqKytdID0gdUNvZGUgPj4gODtcblxuICAgICAgICAvLyBSZXNldCB0cmllIG5vZGUuXG4gICAgICAgIG5vZGVJZHggPSAwOyBzZXFTdGFydCA9IGkrMTtcbiAgICB9XG5cbiAgICB0aGlzLm5vZGVJZHggPSBub2RlSWR4O1xuICAgIHRoaXMucHJldkJ1ZiA9IChzZXFTdGFydCA+PSAwKSA/IGJ1Zi5zbGljZShzZXFTdGFydCkgOiBwcmV2QnVmLnNsaWNlKHNlcVN0YXJ0ICsgcHJldkJ1Zk9mZnNldCk7XG4gICAgcmV0dXJuIG5ld0J1Zi5zbGljZSgwLCBqKS50b1N0cmluZygndWNzMicpO1xufVxuXG5EQkNTRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJldCA9ICcnO1xuXG4gICAgLy8gVHJ5IHRvIHBhcnNlIGFsbCByZW1haW5pbmcgY2hhcnMuXG4gICAgd2hpbGUgKHRoaXMucHJldkJ1Zi5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFNraXAgMSBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlci5cbiAgICAgICAgcmV0ICs9IHRoaXMuZGVmYXVsdENoYXJVbmljb2RlO1xuICAgICAgICB2YXIgYnVmID0gdGhpcy5wcmV2QnVmLnNsaWNlKDEpO1xuXG4gICAgICAgIC8vIFBhcnNlIHJlbWFpbmluZyBhcyB1c3VhbC5cbiAgICAgICAgdGhpcy5wcmV2QnVmID0gbmV3IEJ1ZmZlcigwKTtcbiAgICAgICAgdGhpcy5ub2RlSWR4ID0gMDtcbiAgICAgICAgaWYgKGJ1Zi5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0ICs9IHRoaXMud3JpdGUoYnVmKTtcbiAgICB9XG5cbiAgICB0aGlzLm5vZGVJZHggPSAwO1xuICAgIHJldHVybiByZXQ7XG59XG5cbi8vIEJpbmFyeSBzZWFyY2ggZm9yIEdCMTgwMzAuIFJldHVybnMgbGFyZ2VzdCBpIHN1Y2ggdGhhdCB0YWJsZVtpXSA8PSB2YWwuXG5mdW5jdGlvbiBmaW5kSWR4KHRhYmxlLCB2YWwpIHtcbiAgICBpZiAodGFibGVbMF0gPiB2YWwpXG4gICAgICAgIHJldHVybiAtMTtcblxuICAgIHZhciBsID0gMCwgciA9IHRhYmxlLmxlbmd0aDtcbiAgICB3aGlsZSAobCA8IHItMSkgeyAvLyBhbHdheXMgdGFibGVbbF0gPD0gdmFsIDwgdGFibGVbcl1cbiAgICAgICAgdmFyIG1pZCA9IGwgKyBNYXRoLmZsb29yKChyLWwrMSkvMik7XG4gICAgICAgIGlmICh0YWJsZVttaWRdIDw9IHZhbClcbiAgICAgICAgICAgIGwgPSBtaWQ7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHIgPSBtaWQ7XG4gICAgfVxuICAgIHJldHVybiBsO1xufVxuXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3MvZGJjcy1jb2RlYy5qc1xuLy8gbW9kdWxlIGlkID0gMTQyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyBEZXNjcmlwdGlvbiBvZiBzdXBwb3J0ZWQgZG91YmxlIGJ5dGUgZW5jb2RpbmdzIGFuZCBhbGlhc2VzLlxuLy8gVGFibGVzIGFyZSBub3QgcmVxdWlyZSgpLWQgdW50aWwgdGhleSBhcmUgbmVlZGVkIHRvIHNwZWVkIHVwIGxpYnJhcnkgbG9hZC5cbi8vIHJlcXVpcmUoKS1zIGFyZSBkaXJlY3QgdG8gc3VwcG9ydCBCcm93c2VyaWZ5LlxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBcbiAgICAvLyA9PSBKYXBhbmVzZS9TaGlmdEpJUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQWxsIGphcGFuZXNlIGVuY29kaW5ncyBhcmUgYmFzZWQgb24gSklTIFggc2V0IG9mIHN0YW5kYXJkczpcbiAgICAvLyBKSVMgWCAwMjAxIC0gU2luZ2xlLWJ5dGUgZW5jb2Rpbmcgb2YgQVNDSUkgKyDCpSArIEthbmEgY2hhcnMgYXQgMHhBMS0weERGLlxuICAgIC8vIEpJUyBYIDAyMDggLSBNYWluIHNldCBvZiA2ODc5IGNoYXJhY3RlcnMsIHBsYWNlZCBpbiA5NHg5NCBwbGFuZSwgdG8gYmUgZW5jb2RlZCBieSAyIGJ5dGVzLiBcbiAgICAvLyAgICAgICAgICAgICAgSGFzIHNldmVyYWwgdmFyaWF0aW9ucyBpbiAxOTc4LCAxOTgzLCAxOTkwIGFuZCAxOTk3LlxuICAgIC8vIEpJUyBYIDAyMTIgLSBTdXBwbGVtZW50YXJ5IHBsYW5lIG9mIDYwNjcgY2hhcnMgaW4gOTR4OTQgcGxhbmUuIDE5OTAuIEVmZmVjdGl2ZWx5IGRlYWQuXG4gICAgLy8gSklTIFggMDIxMyAtIEV4dGVuc2lvbiBhbmQgbW9kZXJuIHJlcGxhY2VtZW50IG9mIDAyMDggYW5kIDAyMTIuIFRvdGFsIGNoYXJzOiAxMTIzMy5cbiAgICAvLyAgICAgICAgICAgICAgMiBwbGFuZXMsIGZpcnN0IGlzIHN1cGVyc2V0IG9mIDAyMDgsIHNlY29uZCAtIHJldmlzZWQgMDIxMi5cbiAgICAvLyAgICAgICAgICAgICAgSW50cm9kdWNlZCBpbiAyMDAwLCByZXZpc2VkIDIwMDQuIFNvbWUgY2hhcmFjdGVycyBhcmUgaW4gVW5pY29kZSBQbGFuZSAyICgweDJ4eHh4KVxuXG4gICAgLy8gQnl0ZSBlbmNvZGluZ3MgYXJlOlxuICAgIC8vICAqIFNoaWZ0X0pJUzogQ29tcGF0aWJsZSB3aXRoIDAyMDEsIHVzZXMgbm90IGRlZmluZWQgY2hhcnMgaW4gdG9wIGhhbGYgYXMgbGVhZCBieXRlcyBmb3IgZG91YmxlLWJ5dGVcbiAgICAvLyAgICAgICAgICAgICAgIGVuY29kaW5nIG9mIDAyMDguIExlYWQgYnl0ZSByYW5nZXM6IDB4ODEtMHg5RiwgMHhFMC0weEVGOyBUcmFpbCBieXRlIHJhbmdlczogMHg0MC0weDdFLCAweDgwLTB4OUUsIDB4OUYtMHhGQy5cbiAgICAvLyAgICAgICAgICAgICAgIFdpbmRvd3MgQ1A5MzIgaXMgYSBzdXBlcnNldCBvZiBTaGlmdF9KSVMuIFNvbWUgY29tcGFuaWVzIGFkZGVkIG1vcmUgY2hhcnMsIG5vdGFibHkgS0RESS5cbiAgICAvLyAgKiBFVUMtSlA6ICAgIFVwIHRvIDMgYnl0ZXMgcGVyIGNoYXJhY3Rlci4gVXNlZCBtb3N0bHkgb24gKm5peGVzLlxuICAgIC8vICAgICAgICAgICAgICAgMHgwMC0weDdGICAgICAgIC0gbG93ZXIgcGFydCBvZiAwMjAxXG4gICAgLy8gICAgICAgICAgICAgICAweDhFLCAweEExLTB4REYgLSB1cHBlciBwYXJ0IG9mIDAyMDFcbiAgICAvLyAgICAgICAgICAgICAgICgweEExLTB4RkUpeDIgICAtIDAyMDggcGxhbmUgKDk0eDk0KS5cbiAgICAvLyAgICAgICAgICAgICAgIDB4OEYsICgweEExLTB4RkUpeDIgLSAwMjEyIHBsYW5lICg5NHg5NCkuXG4gICAgLy8gICogSklTIFggMjA4OiA3LWJpdCwgZGlyZWN0IGVuY29kaW5nIG9mIDAyMDguIEJ5dGUgcmFuZ2VzOiAweDIxLTB4N0UgKDk0IHZhbHVlcykuIFVuY29tbW9uLlxuICAgIC8vICAgICAgICAgICAgICAgVXNlZCBhcy1pcyBpbiBJU08yMDIyIGZhbWlseS5cbiAgICAvLyAgKiBJU08yMDIyLUpQOiBTdGF0ZWZ1bCBlbmNvZGluZywgd2l0aCBlc2NhcGUgc2VxdWVuY2VzIHRvIHN3aXRjaCBiZXR3ZWVuIEFTQ0lJLCBcbiAgICAvLyAgICAgICAgICAgICAgICAwMjAxLTE5NzYgUm9tYW4sIDAyMDgtMTk3OCwgMDIwOC0xOTgzLlxuICAgIC8vICAqIElTTzIwMjItSlAtMTogQWRkcyBlc2Mgc2VxIGZvciAwMjEyLTE5OTAuXG4gICAgLy8gICogSVNPMjAyMi1KUC0yOiBBZGRzIGVzYyBzZXEgZm9yIEdCMjMxMy0xOTgwLCBLU1gxMDAxLTE5OTIsIElTTzg4NTktMSwgSVNPODg1OS03LlxuICAgIC8vICAqIElTTzIwMjItSlAtMzogQWRkcyBlc2Mgc2VxIGZvciAwMjAxLTE5NzYgS2FuYSBzZXQsIDAyMTMtMjAwMCBQbGFuZXMgMSwgMi5cbiAgICAvLyAgKiBJU08yMDIyLUpQLTIwMDQ6IEFkZHMgMDIxMy0yMDA0IFBsYW5lIDEuXG4gICAgLy9cbiAgICAvLyBBZnRlciBKSVMgWCAwMjEzIGFwcGVhcmVkLCBTaGlmdF9KSVMtMjAwNCwgRVVDLUpJU1gwMjEzIGFuZCBJU08yMDIyLUpQLTIwMDQgZm9sbG93ZWQsIHdpdGgganVzdCBjaGFuZ2luZyB0aGUgcGxhbmVzLlxuICAgIC8vXG4gICAgLy8gT3ZlcmFsbCwgaXQgc2VlbXMgdGhhdCBpdCdzIGEgbWVzcyA6KCBodHRwOi8vd3d3OC5wbGFsYS5vci5qcC90a3Vib3RhMS91bmljb2RlLXN5bWJvbHMtbWFwMi5odG1sXG5cbiAgICAnc2hpZnRqaXMnOiB7XG4gICAgICAgIHR5cGU6ICdfZGJjcycsXG4gICAgICAgIHRhYmxlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHJlcXVpcmUoJy4vdGFibGVzL3NoaWZ0amlzLmpzb24nKSB9LFxuICAgICAgICBlbmNvZGVBZGQ6IHsnXFx1MDBhNSc6IDB4NUMsICdcXHUyMDNFJzogMHg3RX0sXG4gICAgICAgIGVuY29kZVNraXBWYWxzOiBbe2Zyb206IDB4RUQ0MCwgdG86IDB4Rjk0MH1dLFxuICAgIH0sXG4gICAgJ2Nzc2hpZnRqaXMnOiAnc2hpZnRqaXMnLFxuICAgICdtc2thbmppJzogJ3NoaWZ0amlzJyxcbiAgICAnc2ppcyc6ICdzaGlmdGppcycsXG4gICAgJ3dpbmRvd3MzMWonOiAnc2hpZnRqaXMnLFxuICAgICdtczMxaic6ICdzaGlmdGppcycsXG4gICAgJ3hzamlzJzogJ3NoaWZ0amlzJyxcbiAgICAnd2luZG93czkzMic6ICdzaGlmdGppcycsXG4gICAgJ21zOTMyJzogJ3NoaWZ0amlzJyxcbiAgICAnOTMyJzogJ3NoaWZ0amlzJyxcbiAgICAnY3A5MzInOiAnc2hpZnRqaXMnLFxuXG4gICAgJ2V1Y2pwJzoge1xuICAgICAgICB0eXBlOiAnX2RiY3MnLFxuICAgICAgICB0YWJsZTogZnVuY3Rpb24oKSB7IHJldHVybiByZXF1aXJlKCcuL3RhYmxlcy9ldWNqcC5qc29uJykgfSxcbiAgICAgICAgZW5jb2RlQWRkOiB7J1xcdTAwYTUnOiAweDVDLCAnXFx1MjAzRSc6IDB4N0V9LFxuICAgIH0sXG5cbiAgICAvLyBUT0RPOiBLRERJIGV4dGVuc2lvbiB0byBTaGlmdF9KSVNcbiAgICAvLyBUT0RPOiBJQk0gQ0NTSUQgOTQyID0gQ1A5MzIsIGJ1dCBGMC1GOSBjdXN0b20gY2hhcnMgYW5kIG90aGVyIGNoYXIgY2hhbmdlcy5cbiAgICAvLyBUT0RPOiBJQk0gQ0NTSUQgOTQzID0gU2hpZnRfSklTID0gQ1A5MzIgd2l0aCBvcmlnaW5hbCBTaGlmdF9KSVMgbG93ZXIgMTI4IGNoYXJzLlxuXG5cbiAgICAvLyA9PSBDaGluZXNlL0dCSyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HQktcbiAgICAvLyBXZSBtb3N0bHkgaW1wbGVtZW50IFczQyByZWNvbW1lbmRhdGlvbjogaHR0cHM6Ly93d3cudzMub3JnL1RSL2VuY29kaW5nLyNnYmstZW5jb2RlclxuXG4gICAgLy8gT2xkZXN0IEdCMjMxMiAoMTk4MSwgfjc2MDAgY2hhcnMpIGlzIGEgc3Vic2V0IG9mIENQOTM2XG4gICAgJ2diMjMxMic6ICdjcDkzNicsXG4gICAgJ2diMjMxMjgwJzogJ2NwOTM2JyxcbiAgICAnZ2IyMzEyMTk4MCc6ICdjcDkzNicsXG4gICAgJ2NzZ2IyMzEyJzogJ2NwOTM2JyxcbiAgICAnY3Npc281OGdiMjMxMjgwJzogJ2NwOTM2JyxcbiAgICAnZXVjY24nOiAnY3A5MzYnLFxuXG4gICAgLy8gTWljcm9zb2Z0J3MgQ1A5MzYgaXMgYSBzdWJzZXQgYW5kIGFwcHJveGltYXRpb24gb2YgR0JLLlxuICAgICd3aW5kb3dzOTM2JzogJ2NwOTM2JyxcbiAgICAnbXM5MzYnOiAnY3A5MzYnLFxuICAgICc5MzYnOiAnY3A5MzYnLFxuICAgICdjcDkzNic6IHtcbiAgICAgICAgdHlwZTogJ19kYmNzJyxcbiAgICAgICAgdGFibGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gcmVxdWlyZSgnLi90YWJsZXMvY3A5MzYuanNvbicpIH0sXG4gICAgfSxcblxuICAgIC8vIEdCSyAofjIyMDAwIGNoYXJzKSBpcyBhbiBleHRlbnNpb24gb2YgQ1A5MzYgdGhhdCBhZGRlZCB1c2VyLW1hcHBlZCBjaGFycyBhbmQgc29tZSBvdGhlci5cbiAgICAnZ2JrJzoge1xuICAgICAgICB0eXBlOiAnX2RiY3MnLFxuICAgICAgICB0YWJsZTogZnVuY3Rpb24oKSB7IHJldHVybiByZXF1aXJlKCcuL3RhYmxlcy9jcDkzNi5qc29uJykuY29uY2F0KHJlcXVpcmUoJy4vdGFibGVzL2diay1hZGRlZC5qc29uJykpIH0sXG4gICAgfSxcbiAgICAneGdiayc6ICdnYmsnLFxuICAgICdpc29pcjU4JzogJ2diaycsXG5cbiAgICAvLyBHQjE4MDMwIGlzIGFuIGFsZ29yaXRobWljIGV4dGVuc2lvbiBvZiBHQksuXG4gICAgLy8gTWFpbiBzb3VyY2U6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9lbmNvZGluZy8jZ2JrLWVuY29kZXJcbiAgICAvLyBodHRwOi8vaWN1LXByb2plY3Qub3JnL2RvY3MvcGFwZXJzL2diMTgwMzAuaHRtbFxuICAgIC8vIGh0dHA6Ly9zb3VyY2UuaWN1LXByb2plY3Qub3JnL3JlcG9zL2ljdS9kYXRhL3RydW5rL2NoYXJzZXQvZGF0YS94bWwvZ2ItMTgwMzAtMjAwMC54bWxcbiAgICAvLyBodHRwOi8vd3d3LmtobmdhaS5jb20vY2hpbmVzZS9jaGFybWFwL3RibGdiay5waHA/cGFnZT0wXG4gICAgJ2diMTgwMzAnOiB7XG4gICAgICAgIHR5cGU6ICdfZGJjcycsXG4gICAgICAgIHRhYmxlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHJlcXVpcmUoJy4vdGFibGVzL2NwOTM2Lmpzb24nKS5jb25jYXQocmVxdWlyZSgnLi90YWJsZXMvZ2JrLWFkZGVkLmpzb24nKSkgfSxcbiAgICAgICAgZ2IxODAzMDogZnVuY3Rpb24oKSB7IHJldHVybiByZXF1aXJlKCcuL3RhYmxlcy9nYjE4MDMwLXJhbmdlcy5qc29uJykgfSxcbiAgICAgICAgZW5jb2RlU2tpcFZhbHM6IFsweDgwXSxcbiAgICAgICAgZW5jb2RlQWRkOiB7J+KCrCc6IDB4QTJFM30sXG4gICAgfSxcblxuICAgICdjaGluZXNlJzogJ2diMTgwMzAnLFxuXG5cbiAgICAvLyA9PSBLb3JlYW4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRVVDLUtSLCBLU19DXzU2MDEgYW5kIEtTIFggMTAwMSBhcmUgZXhhY3RseSB0aGUgc2FtZS5cbiAgICAnd2luZG93czk0OSc6ICdjcDk0OScsXG4gICAgJ21zOTQ5JzogJ2NwOTQ5JyxcbiAgICAnOTQ5JzogJ2NwOTQ5JyxcbiAgICAnY3A5NDknOiB7XG4gICAgICAgIHR5cGU6ICdfZGJjcycsXG4gICAgICAgIHRhYmxlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHJlcXVpcmUoJy4vdGFibGVzL2NwOTQ5Lmpzb24nKSB9LFxuICAgIH0sXG5cbiAgICAnY3NldWNrcic6ICdjcDk0OScsXG4gICAgJ2Nza3NjNTYwMTE5ODcnOiAnY3A5NDknLFxuICAgICdldWNrcic6ICdjcDk0OScsXG4gICAgJ2lzb2lyMTQ5JzogJ2NwOTQ5JyxcbiAgICAna29yZWFuJzogJ2NwOTQ5JyxcbiAgICAna3NjNTYwMTE5ODcnOiAnY3A5NDknLFxuICAgICdrc2M1NjAxMTk4OSc6ICdjcDk0OScsXG4gICAgJ2tzYzU2MDEnOiAnY3A5NDknLFxuXG5cbiAgICAvLyA9PSBCaWc1L1RhaXdhbi9Ib25nIEtvbmcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gVGhlcmUgYXJlIGxvdHMgb2YgdGFibGVzIGZvciBCaWc1IGFuZCBjcDk1MC4gUGxlYXNlIHNlZSB0aGUgZm9sbG93aW5nIGxpbmtzIGZvciBoaXN0b3J5OlxuICAgIC8vIGh0dHA6Ly9tb3p0dy5vcmcvZG9jcy9iaWc1LyAgaHR0cDovL3d3dy5oYWlibGUuZGUvYnJ1bm8vY2hhcnNldHMvY29udmVyc2lvbi10YWJsZXMvQmlnNS5odG1sXG4gICAgLy8gVmFyaWF0aW9ucywgaW4gcm91Z2hseSBudW1iZXIgb2YgZGVmaW5lZCBjaGFyczpcbiAgICAvLyAgKiBXaW5kb3dzIENQIDk1MDogTWljcm9zb2Z0IHZhcmlhbnQgb2YgQmlnNS4gQ2Fub25pY2FsOiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQOTUwLlRYVFxuICAgIC8vICAqIFdpbmRvd3MgQ1AgOTUxOiBNaWNyb3NvZnQgdmFyaWFudCBvZiBCaWc1LUhLU0NTLTIwMDEuIFNlZW1zIHRvIGJlIG5ldmVyIHB1YmxpYy4gaHR0cDovL21lLmFiZWxjaGV1bmcub3JnL2FydGljbGVzL3Jlc2VhcmNoL3doYXQtaXMtY3A5NTEvXG4gICAgLy8gICogQmlnNS0yMDAzIChUYWl3YW4gc3RhbmRhcmQpIGFsbW9zdCBzdXBlcnNldCBvZiBjcDk1MC5cbiAgICAvLyAgKiBVbmljb2RlLWF0LW9uIChVQU8pIC8gTW96aWxsYSAxLjguIEZhbGxpbmcgb3V0IG9mIHVzZSBvbiB0aGUgV2ViLiBOb3Qgc3VwcG9ydGVkIGJ5IG90aGVyIGJyb3dzZXJzLlxuICAgIC8vICAqIEJpZzUtSEtTQ1MgKC0yMDAxLCAtMjAwNCwgLTIwMDgpLiBIb25nIEtvbmcgc3RhbmRhcmQuIFxuICAgIC8vICAgIG1hbnkgdW5pY29kZSBjb2RlIHBvaW50cyBtb3ZlZCBmcm9tIFBVQSB0byBTdXBwbGVtZW50YXJ5IHBsYW5lIChVKzJYWFhYKSBvdmVyIHRoZSB5ZWFycy5cbiAgICAvLyAgICBQbHVzLCBpdCBoYXMgNCBjb21iaW5pbmcgc2VxdWVuY2VzLlxuICAgIC8vICAgIFNlZW1zIHRoYXQgTW96aWxsYSByZWZ1c2VkIHRvIHN1cHBvcnQgaXQgZm9yIDEwIHlycy4gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTYyNDMxIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTMxMDI5OVxuICAgIC8vICAgIGJlY2F1c2UgYmlnNS1oa3NjcyBpcyB0aGUgb25seSBlbmNvZGluZyB0byBpbmNsdWRlIGFzdHJhbCBjaGFyYWN0ZXJzIGluIG5vbi1hbGdvcml0aG1pYyB3YXkuXG4gICAgLy8gICAgSW1wbGVtZW50YXRpb25zIGFyZSBub3QgY29uc2lzdGVudCB3aXRoaW4gYnJvd3NlcnM7IHNvbWV0aW1lcyBsYWJlbGVkIGFzIGp1c3QgYmlnNS5cbiAgICAvLyAgICBNUyBJbnRlcm5ldCBFeHBsb3JlciBzd2l0Y2hlcyBmcm9tIGJpZzUgdG8gYmlnNS1oa3NjcyB3aGVuIGEgcGF0Y2ggYXBwbGllZC5cbiAgICAvLyAgICBHcmVhdCBkaXNjdXNzaW9uICYgcmVjYXAgb2Ygd2hhdCdzIGdvaW5nIG9uIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTkxMjQ3MCNjMzFcbiAgICAvLyAgICBJbiB0aGUgZW5jb2RlciwgaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBzdXBwb3J0IGVuY29kaW5nIG9sZCBQVUEgbWFwcGluZ3MgdG8gQmlnNSBieXRlcyBzZXEtcy5cbiAgICAvLyAgICBPZmZpY2lhbCBzcGVjOiBodHRwOi8vd3d3Lm9nY2lvLmdvdi5oay9lbi9idXNpbmVzcy90ZWNoX3Byb21vdGlvbi9jY2xpL3Rlcm1zL2RvYy8yMDAzY21wXzIwMDgudHh0XG4gICAgLy8gICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5vZ2Npby5nb3YuaGsvdGMvYnVzaW5lc3MvdGVjaF9wcm9tb3Rpb24vY2NsaS90ZXJtcy9kb2MvaGtzY3MtMjAwOC1iaWc1LWlzby50eHRcbiAgICAvLyBcbiAgICAvLyBDdXJyZW50IHVuZGVyc3RhbmRpbmcgb2YgaG93IHRvIGRlYWwgd2l0aCBCaWc1KC1IS1NDUykgaXMgaW4gdGhlIEVuY29kaW5nIFN0YW5kYXJkLCBodHRwOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnLyNiaWc1LWVuY29kZXJcbiAgICAvLyBVbmljb2RlIG1hcHBpbmcgKGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL09CU09MRVRFL0VBU1RBU0lBL09USEVSL0JJRzUuVFhUKSBpcyBzYWlkIHRvIGJlIHdyb25nLlxuXG4gICAgJ3dpbmRvd3M5NTAnOiAnY3A5NTAnLFxuICAgICdtczk1MCc6ICdjcDk1MCcsXG4gICAgJzk1MCc6ICdjcDk1MCcsXG4gICAgJ2NwOTUwJzoge1xuICAgICAgICB0eXBlOiAnX2RiY3MnLFxuICAgICAgICB0YWJsZTogZnVuY3Rpb24oKSB7IHJldHVybiByZXF1aXJlKCcuL3RhYmxlcy9jcDk1MC5qc29uJykgfSxcbiAgICB9LFxuXG4gICAgLy8gQmlnNSBoYXMgbWFueSB2YXJpYXRpb25zIGFuZCBpcyBhbiBleHRlbnNpb24gb2YgY3A5NTAuIFdlIHVzZSBFbmNvZGluZyBTdGFuZGFyZCdzIGFzIGEgY29uc2Vuc3VzLlxuICAgICdiaWc1JzogJ2JpZzVoa3NjcycsXG4gICAgJ2JpZzVoa3Njcyc6IHtcbiAgICAgICAgdHlwZTogJ19kYmNzJyxcbiAgICAgICAgdGFibGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gcmVxdWlyZSgnLi90YWJsZXMvY3A5NTAuanNvbicpLmNvbmNhdChyZXF1aXJlKCcuL3RhYmxlcy9iaWc1LWFkZGVkLmpzb24nKSkgfSxcbiAgICAgICAgZW5jb2RlU2tpcFZhbHM6IFsweGEyY2NdLFxuICAgIH0sXG5cbiAgICAnY25iaWc1JzogJ2JpZzVoa3NjcycsXG4gICAgJ2NzYmlnNSc6ICdiaWc1aGtzY3MnLFxuICAgICd4eGJpZzUnOiAnYmlnNWhrc2NzJyxcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3MvZGJjcy1kYXRhLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBbW1wiMFwiLFwiXFx1MDAwMFwiLDEyOF0sW1wiYTFcIixcIu+9oVwiLDYyXSxbXCI4MTQwXCIsXCLjgIDjgIHjgILvvIzvvI7jg7vvvJrvvJvvvJ/vvIHjgpvjgpzCtO+9gMKo77y+77+j77y/44O944O+44Kd44Ke44CD5Lud44CF44CG44CH44O84oCV4oCQ77yP77y8772e4oil772c4oCm4oCl4oCY4oCZ4oCc4oCd77yI77yJ44CU44CV77y777y9772b772d44CIXCIsOSxcIu+8i++8jcKxw5dcIl0sW1wiODE4MFwiLFwiw7fvvJ3iiaDvvJzvvJ7iiabiiafiiJ7iiLTimYLimYDCsOKAsuKAs+KEg++/pe+8hO+/oO+/oe+8he+8g++8hu+8iu+8oMKn4piG4piF4peL4peP4peO4peH4peG4pah4pag4paz4pay4pa94pa84oC744CS4oaS4oaQ4oaR4oaT44CTXCJdLFtcIjgxYjhcIixcIuKIiOKIi+KKhuKKh+KKguKKg+KIquKIqVwiXSxbXCI4MWM4XCIsXCLiiKfiiKjvv6Lih5Lih5TiiIDiiINcIl0sW1wiODFkYVwiLFwi4oig4oql4oyS4oiC4oiH4omh4omS4omq4omr4oia4oi94oid4oi14oir4oisXCJdLFtcIjgxZjBcIixcIuKEq+KAsOKZr+KZreKZquKAoOKAocK2XCJdLFtcIjgxZmNcIixcIuKXr1wiXSxbXCI4MjRmXCIsXCLvvJBcIiw5XSxbXCI4MjYwXCIsXCLvvKFcIiwyNV0sW1wiODI4MVwiLFwi772BXCIsMjVdLFtcIjgyOWZcIixcIuOBgVwiLDgyXSxbXCI4MzQwXCIsXCLjgqFcIiw2Ml0sW1wiODM4MFwiLFwi44OgXCIsMjJdLFtcIjgzOWZcIixcIs6RXCIsMTYsXCLOo1wiLDZdLFtcIjgzYmZcIixcIs6xXCIsMTYsXCLPg1wiLDZdLFtcIjg0NDBcIixcItCQXCIsNSxcItCB0JZcIiwyNV0sW1wiODQ3MFwiLFwi0LBcIiw1LFwi0ZHQtlwiLDddLFtcIjg0ODBcIixcItC+XCIsMTddLFtcIjg0OWZcIixcIuKUgOKUguKUjOKUkOKUmOKUlOKUnOKUrOKUpOKUtOKUvOKUgeKUg+KUj+KUk+KUm+KUl+KUo+KUs+KUq+KUu+KVi+KUoOKUr+KUqOKUt+KUv+KUneKUsOKUpeKUuOKVglwiXSxbXCI4NzQwXCIsXCLikaBcIiwxOSxcIuKFoFwiLDldLFtcIjg3NWZcIixcIuONieOMlOOMouONjeOMmOOMp+OMg+OMtuONkeONl+OMjeOMpuOMo+OMq+ONiuOMu+OOnOOOneOOnuOOjuOOj+OPhOOOoVwiXSxbXCI4NzdlXCIsXCLjjbtcIl0sW1wiODc4MFwiLFwi44Cd44Cf4oSW44+N4oSh44qkXCIsNCxcIuOIseOIsuOIueONvuONveONvOKJkuKJoeKIq+KIruKIkeKImuKKpeKIoOKIn+KKv+KIteKIqeKIqlwiXSxbXCI4ODlmXCIsXCLkupzllJblqIPpmL/lk4DmhJvmjKjlp7bpgKLokbXojJznqZDmgqrmj6HmuKXml63okaboiqbpr7XmopPlnKfmlqHmibHlrpvlp5Dombvpo7TntaLntr7pro7miJbnsp/oorflronlurXmjInmmpfmoYjpl4fpno3mnY/ku6XkvIrkvY3kvp3lgYnlm7LlpLflp5TlqIHlsInmg5/mhI/mhbDmmJPmpIXngrrnlY/nlbDnp7vntq3nt6/og4PokI7ooaPorILpgZXpgbrljLvkupXkuqXln5/ogrLpg4Hno6/kuIDlo7HmuqLpgLjnqLLojKjoiovpsK/lhYHljbDlkr3lk6Hlm6Dlp7vlvJXpo7Lmt6vog6TolK1cIl0sW1wiODk0MFwiLFwi6Zmi6Zmw6Zqg6Z+75ZCL5Y+z5a6H54OP57696L+C6Zuo5Y2v6bWc56q65LiR56KT6Ie85rim5ZiY5ZSE5qyd6JSa6bC75ael5Y6p5rWm55Oc6ZaP5ZmC5LqR6YGL6Zuy6I2P6aSM5Y+h5Za25ayw5b2x5pig5puz5qCE5rC45rOz5rSp55Gb55uI56mO6aC06Iux6KGb6Kmg6Yut5ray55ar55uK6aeF5oKm6KyB6LaK6Zay5qaO5Y6t5YaGXCJdLFtcIjg5ODBcIixcIuWckuWgsOWlhOWutOW7tuaAqOaOqeaPtOayv+a8lOeCjueElOeFmeeHleeMv+e4geiJtuiLkeiWl+mBoOmJm+m0m+WhqeaWvOaxmueUpeWHueWkruWlpeW+gOW/nOaKvOaXuuaoquasp+autOeOi+e/geillum0rOm0jum7hOWyoeayluiNu+WEhOWxi+aGtuiHhuahtueJoeS5meS/uuWNuOaBqea4qeepj+mfs+S4i+WMluS7ruS9leS8veS+oeS9s+WKoOWPr+WYieWkj+WrgeWutuWvoeenkeaah+aenOaetuatjOays+eBq+ePguemjeemvueovOeuh+iKseiLm+iMhOiNt+iPr+iPk+idpuiqsuWYqeiyqOi/pumBjumcnuiaiuS/hOWzqOaIkeeJmeeUu+iHpeiKveibvuizgOmbhemkk+mnleS7i+S8muino+WbnuWhiuWjiuW7u+W/q+aAquaClOaBouaHkOaIkuaLkOaUuVwiXSxbXCI4YTQwXCIsXCLprYHmmabmorDmtbfngbDnlYznmobntbXoiqXon7nplovpmo7osp3lh7Hlir7lpJblkrPlrrPltJbmhajmpoLmtq/noo3ok4vooZfoqbLpjqfpqrjmtazppqjom5nlnqPmn7/om47piI7lioPlmoflkITlu5Pmi6HmkrnmoLzmoLjmrrvnjbLnorrnqavopprop5LotavovIPpg63plqPpmpTpnanlrablsrPmpb3poY3poY7mjpvnrKDmqKtcIl0sW1wiOGE4MFwiLFwi5qm/5qK26bCN5r2f5Ymy5Zad5oGw5ous5rS75riH5ruR6JGb6KSQ6L2E5LiU6bC55Y+25qSb5qi66Z6E5qCq5YWc56uD6JKy6Yec6Y6M5Zmb6bSo5qCi6IyF6JCx57Kl5YiI6IuF55Om5Lm+5L6D5Yag5a+S5YiK5YuY5Yun5be75Zaa5aCq5aem5a6M5a6Y5a+b5bmy5bm55oKj5oSf5oWj5oa+5o+b5pWi5p+R5qGT5qO65qy+5q2T5rGX5ryi5r6X5r2F55Kw55SY55uj55yL56u/566h57Ch57ep57y257+w6IKd6Imm6I6e6Kaz6KuM6LKr6YKE6ZGR6ZaT6ZaR6Zai6Zml6Z+T6aSo6IiY5Li45ZCr5bK45beM546p55mM55y85bKp57+r6LSL6ZuB6aCR6aGU6aGY5LyB5LyO5Y2x5Zac5Zmo5Z+65aWH5ayJ5a+E5bKQ5biM5bm+5b+M5o+u5py65peX5pei5pyf5qOL5qOEXCJdLFtcIjhiNDBcIixcIuapn+W4sOavheawl+axveeVv+eliOWto+eogOe0gOW+veimj+iomOiytOi1t+i7jOi8nemjoumojumsvOS6gOWBveWEgOWmk+WunOaIr+aKgOaTrOasuueKoOeWkeelh+e+qeifu+iqvOitsOaOrOiPiumeoOWQieWQg+WWq+ahlOapmOipsOegp+adtem7jeWNtOWuouiEmuiZkOmAhuS4mOS5heS7h+S8keWPiuWQuOWuruW8k+aApeaVkVwiXSxbXCI4YjgwXCIsXCLmnL3msYLmsbLms6PngbjnkIPnqbbnqq7nrIjntJrns77ntabml6fniZvljrvlsYXlt6jmi5Lmi6DmjJnmuKDomZroqLHot53pi7jmvIHnpqbprZrkuqjkuqvkuqzkvpvkvqDlg5HlhYfnq7blhbHlh7bljZTljKHljb/lj6vllqzlooPls6HlvLflvYrmgK/mgZDmga3mjJ/mlZnmqYvms4Hni4Lni63nn6/og7johIXoiIjolY7pg7fpj6Hpn7/ppZfpqZrku7Dlh53lsK3mmoHmpa3lsYDmm7LmpbXnjonmoZDnsoHlg4Xli6TlnYflt77pjKbmlqTmrKPmrL3nkLTnpoHnpr3nrYvnt4roirnoj4zoob/opZ/orLnov5Hph5HlkJ/pioDkuZ3lgLblj6XljLrni5fnjpbnn6noi6bouq/pp4bpp4jpp5LlhbfmhJromZ7llrDnqbrlgbblr5PpgYfpmoXkuLLmq5vph6flsZHlsYhcIl0sW1wiOGM0MFwiLFwi5o6Y56qf5rKT6Z206L2h56qq54aK6ZqI57KC5qCX57mw5qGR6Y2s5Yuy5ZCb6Jar6KiT576k6LuN6YOh5Y2m6KKI56WB5L+C5YK+5YiR5YWE5ZWT5Zyt54+q5Z6L5aWR5b2i5b6E5oG15oW25oWn5oap5o6y5pC65pWs5pmv5qGC5riT55Wm56i957O757WM57aZ57mL572r6IyO6I2K6JuN6KiI6Kmj6K2m6Lu96aCa6baP6Iq46L+O6a+oXCJdLFtcIjhjODBcIixcIuWKh+aIn+aSg+a/gOmameahgeWCkeasoOaxuua9lOeptOe1kOihgOioo+aciOS7tuWAueWApuWBpeWFvOWIuOWJo+WWp+Wcj+WgheWrjOW7uuaGsuaHuOaLs+aNsuaknOaoqeeJveeKrOeMrueglOehr+e1ueecjOiCqeimi+ismeizoui7kumBo+mNtemZuumhlemok+m5uOWFg+WOn+WOs+W5u+W8pua4m+a6kOeOhOePvue1g+iIt+iogOiruumZkOS5juWAi+WPpOWRvOWbuuWnkeWtpOW3seW6q+W8p+aIuOaVheaer+a5lueLkOeziuiitOiCoeiDoeiPsOiZjuiqh+i3qOmIt+mbh+mhp+m8k+S6lOS6kuS8jeWNiOWRieWQvuWor+W+jOW+oeaCn+aip+aqjueRmueigeiqnuiqpOitt+mGkOS5numvieS6pOS9vOS+r+WAmeWAluWFieWFrOWKn+WKueWLvuWOmuWPo+WQkVwiXSxbXCI4ZDQwXCIsXCLlkI7llonlnZHlnqLlpb3lrZTlrZ3lro/lt6Xlt6flt7flubjluoPluprlurflvJjmgZLmhYzmipfmi5jmjqfmlLvmmILmmYPmm7Tmna3moKHmopfmp4vmsZ/mtKrmtanmuK/mup3nlLLnmofnoaznqL/ns6DntIXntJjntZ7ntrHogJXogIPogq/ogrHohZToho/oiKrojZLooYzooaHorJvosqLos7zpg4rphbXpibHnoL/pi7zplqTpmY1cIl0sW1wiOGQ4MFwiLFwi6aCF6aaZ6auY6bS75Ymb5Yqr5Y+35ZCI5aOV5ou35r+g6LGq6L2f6bq55YWL5Yi75ZGK5Zu956mA6YW36bWg6buS542E5ryJ6IWw55SR5b+95oOa6aqo54ub6L685q2k6aCD5LuK5Zuw5Z2k5aK+5ama5oGo5oeH5piP5piG5qC55qKx5re355eV57S66Imu6a2C5Lqb5L2Q5Y+J5ZSG5bWv5bem5beu5p+75rKZ55Gz56CC6KmQ6Y6W6KOf5Z2Q5bqn5oyr5YK15YKs5YaN5pyA5ZOJ5aGe5aa75a6w5b2p5omN5o6h5qC95q2z5riI54G96YeH54qA56CV56Cm56Wt5paO57Sw6I+c6KOB6LyJ6Zqb5Ymk5Zyo5p2Q572q6LKh5Ya05Z2C6Ziq5aC65qaK6IK05ZKy5bSO5Z+856KV6be65L2c5YmK5ZKL5pC+5pio5pyU5p+156qE562W57Si6Yyv5qGc6a6t56y55YyZ5YaK5Yi3XCJdLFtcIjhlNDBcIixcIuWvn+aLtuaSruaTpuacreauuuiWqembkeeakOmvluaNjOmMhumuq+eav+aZkuS4ieWCmOWPguWxseaDqOaSkuaVo+ahn+eHpuePiueUo+eul+e6guialeiug+izm+mFuOmkkOaWrOaaq+aui+S7leS7lOS8uuS9v+WIuuWPuOWPsuWXo+Wbm+Wjq+Wni+WnieWnv+WtkOWxjeW4guW4q+W/l+aAneaMh+aUr+WtnOaWr+aWveaXqOaeneatolwiXSxbXCI4ZTgwXCIsXCLmrbvmsI/njYXnpYnnp4Hns7jntJnntKvogqLohILoh7PoppboqZ7oqanoqaboqozoq67os4fos5zpm4zpo7zmra/kuovkvLzkvo3lhZDlrZflr7rmhYjmjIHmmYLmrKHmu4vmsrvniL7nkr3nl5Tno4HnpLrogIzogLPoh6rokpTovp7msZDpub/lvI/orZjptKvnq7rou7jlro3pm6vkuIPlj7Hln7flpLHlq4nlrqTmgonmub/mvIbnlr7os6rlrp/olIDnr6DlgbLmn7Toip3lsaHolYrnuJ7oiI7lhpnlsITmjajotabmlpznha7npL7ntJfogIXorJ3ou4rpga7om4fpgqrlgJ/li7rlsLrmnZPngbzniLXphYzph4jpjKvoi6Xlr4LlvLHmg7nkuLvlj5blrojmiYvmnLHmrorni6nnj6DnqK7ohavotqPphZLpppblhJLlj5flkarlr7/mjojmqLnntqzpnIDlm5rlj47lkahcIl0sW1wiOGY0MFwiLFwi5a6X5bCx5bee5L+u5oSB5ou+5rSy56eA56eL57WC57mN57+S6Iet6Iif6JKQ6KGG6KWy6K6Q6Lm06Lyv6YCx6YWL6YWs6ZuG6Yac5LuA5L2P5YWF5Y2B5b6T5oiO5p+U5rGB5riL542j57im6YeN6YqD5Y+U5aSZ5a6/5reR56Wd57iu57Kb5aG+54af5Ye66KGT6L+w5L+K5bO75pil556s56uj6Iic6ae/5YeG5b6q5pes5qWv5q6J5rezXCJdLFtcIjhmODBcIixcIua6lua9pOebvue0lOW3oemBtemGh+mghuWHpuWIneaJgOaakeabmea4muW6tue3kue9suabuOiWr+iXt+iruOWKqeWPmeWls+W6j+W+kOaBlemLpOmZpOWCt+WEn+WLneWMoOWNh+WPrOWTqOWVhuWUseWYl+WlqOWmvuWovOWuteWwhuWwj+WwkeWwmuW6hOW6iuW7oOW9sOaJv+aKhOaLm+aOjOaNt+aYh+aYjOaYreaZtuadvuaiouaon+aoteayvOa2iOa4iea5mOeEvOeEpueFp+eXh+ecgeehneekgeelpeensOeroOeskeeyp+e0ueiCluiPluiSi+iVieihneijs+ion+iovOiplOips+ixoeiznumGpOmJpumNvumQmOmanOmemOS4iuS4iOS4nuS5l+WGl+WJsOWfjuWgtOWjjOWsouW4uOaDheaTvuadoeadlua1hOeKtueVs+epo+iSuOitsumGuOmMoOWYseWftOmjvlwiXSxbXCI5MDQwXCIsXCLmi63mpI3mrpbnh63nuZTogbfoibLop6bpo5/onZXovrHlsLvkvLjkv6HkvrXllIflqKDlr53lr6nlv4PmhY7mjK/mlrDmmYvmo67mppvmtbjmt7HnlLPnlrnnnJ/npZ7np6bntLPoh6Poiq/olqropqroqLrouqvovpvpgLLph53pnIfkurrku4HliIPlobXlo6zlsIvnlJrlsL3ohY7oqIrov4XpmaPpna3nrKXoq4/poIjphaLlm7PljqhcIl0sW1wiOTA4MFwiLFwi6YCX5ZC55Z6C5bil5o6o5rC054KK552h57KL57+g6KGw6YGC6YWU6YyQ6YyY6ZqP55Ge6auE5bSH5bWp5pWw5p6i6Lao6Zub5o2u5p2J5qSZ6I+F6aCX6ZuA6KO+5r6E5pG65a+45LiW54Cs55Wd5piv5YeE5Yi25Yui5aeT5b6B5oCn5oiQ5pS/5pW05pif5pm05qOy5qCW5q2j5riF54my55Sf55ub57K+6IGW5aOw6KO96KW/6Kqg6KqT6KuL6YCd6YaS6Z2S6Z2Z5paJ56iO6ISG6Zq75bit5oOc5oia5pal5piU5p6Q55+z56mN57GN57i+6ISK6LKs6LWk6Leh6Lmf56Kp5YiH5ouZ5o6l5pGC5oqY6Kit56qD56+A6Kqs6Zuq57W26IiM6J2J5LuZ5YWI5Y2D5Y2g5a6j5bCC5bCW5bed5oim5omH5pKw5qCT5qC05rOJ5rWF5rSX5p+T5r2c54WO54W95peL56m/566t57eaXCJdLFtcIjkxNDBcIixcIue5iue+qOiFuuiIm+iIueiWpuipruizjui3temBuOmBt+mKremKkemWg+muruWJjeWWhOa8uOeEtuWFqOemhee5leiGs+ezjuWZjOWhkeWyqOaOquabvuabvealmueLmeeWj+eWjuekjuelluenn+eyl+e0oOe1hOiYh+iotOmYu+mBoem8oOWDp+WJteWPjOWPouWAieWWquWjruWlj+eIveWui+WxpOWMneaDo+aDs+aNnOaOg+aMv+aOu1wiXSxbXCI5MTgwXCIsXCLmk43ml6nmm7nlt6Pmp43mp73mvJXnh6Xkuonnl6nnm7jnqpPns5/nt4/ntpzogaHojYnojZjokazokrzol7voo4XotbDpgIHpga3pjpfpnJzpqJLlg4/lopfmho7oh5PolLXotIjpgKDkv4PlgbTliYfljbPmga/mjYnmnZ/muKzotrPpgJ/kv5flsZ7os4rml4/ntprljZLoopblhbbmj4PlrZjlravlsIrmkI3mnZHpgZzku5blpJrlpKrmsbDoqZHllL7loJXlpqXmg7DmiZPmn4HoiLXmpZXpmYDpp4TpqKjkvZPloIblr77ogJDlsrHluK/lvoXmgKDmhYvmiLTmm7/ms7Dmu57og47ohb/oi5TooovosrjpgIDpgK7pmorpu5vpr5vku6Plj7DlpKfnrKzpho3poYzpt7nmu53ngKfljZPllYTlroXmiZjmip7mi5PmsqLmv6/nkKLoqJfpkLjmv4Hoq77ojLjlh6fom7jlj6pcIl0sW1wiOTI0MFwiLFwi5Y+p5L2G6YGU6L6w5aWq6ISx5be956uq6L6/5qOa6LC354u46bGI5qi96Kqw5Li55Y2Y5ZiG5Z2m5ouF5o6i5pem5q2O5reh5rmb54Kt55+t56uv566q57a76IC96IOG6JuL6KqV6Y2b5Zuj5aOH5by+5pat5pqW5qqA5q6155S36KuH5YCk55+l5Zyw5byb5oGl5pm65rGg55e056ia572u6Ie06JyY6YGF6aaz56+J55Wc56u5562R6JOEXCJdLFtcIjkyODBcIixcIumAkOenqeeqkuiMtuWroeedgOS4reS7suWumeW/oOaKveaYvOafseazqOiZq+iht+iou+mFjumLs+mnkOaol+eApueMquiLp+iRl+iyr+S4geWFhuWHi+WWi+WvteW4luW4s+W6geW8lOW8teW9q+W+tOaHsuaMkeaaouacnea9rueJkueUuuecuuiBtOiEueiFuOidtuiqv+irnOi2hei3s+mKmumVt+mggumzpeWLheaNl+ebtOacleayiOePjeizg+mOrumZs+a0peWinOakjuanjOi/vemOmueXm+mAmuWhmuagguaOtOanu+S9g+a8rOafmOi+u+iUpue2tOmNlOakv+a9sOWdquWjt+WsrOe0rOeIquWQiumHo+m2tOS6reS9juWBnOWBteWJg+iynuWRiOWgpOWumuW4neW6leW6reW7t+W8n+aCjOaKteaMuuaPkOair+axgOeih+emjueoi+e3oOiJh+ioguirpui5hOmAk1wiXSxbXCI5MzQwXCIsXCLpgrjphK3ph5jpvI7ms6XmkZjmk6LmlbXmu7TnmoTnrJvpganpj5Hmurrlk7LlvrnmkqTovY3ov63piYTlhbjloavlpKnlsZXlupfmt7vnuo/nlJzosrzou6LpoZvngrnkvJ3mrr/mvrHnlLDpm7vlhY7lkJDloLXloZflpqzlsaDlvpLmlpfmnZzmuKHnmbvoj5/os63pgJTpg73pjY3noKXnoLrliqrluqblnJ/lpbTmgJLlgJLlhZrlhqxcIl0sW1wiOTM4MFwiLFwi5YeN5YiA5ZSQ5aGU5aGY5aWX5a6V5bO25baL5oK85oqV5pCt5p2x5qGD5qK85qOf55uX5reY5rmv5rab54Gv54eI5b2T55eY56W3562J562U562S57OW57Wx5Yiw6JGj6JWp6Jek6KiO6KyE6LGG6LiP6YCD6YCP6ZCZ6Zm26aCt6aiw6ZeY5YON5YuV5ZCM5aCC5bCO5oan5pKe5rSe556z56ul6IO06JCE6YGT6YqF5bOg6bSH5Yy/5b6X5b6z5rac54m5552j56a/56+k5q+S54us6Kqt5qCD5qmh5Ye456qB5qS05bGK6bO26Iur5a+F6YWJ54Ce5Zm45bGv5oOH5pWm5rKM6LGa6YGB6aCT5ZGR5puH6YiN5aWI6YKj5YaF5LmN5Yeq6JaZ6KyO54GY5o266Y2L5qWi6aa057iE55W35Y2X5qWg6Luf6Zuj5rGd5LqM5bC85byQ6L+p5YyC6LOR6IKJ6Jm55bu/5pel5Lmz5YWlXCJdLFtcIjk0NDBcIixcIuWmguWwv+mfruS7u+WmiuW/jeiqjea/oeemsOelouWvp+iRseeMq+eGseW5tOW/teaNu+aSmueHg+eymOS5g+W7vOS5i+WfnOWaouaCqea/g+e0jeiDveiEs+iGv+i+suiml+iapOW3tOaKiuaSreimh+adt+azoua0vueQtuegtOWphue9teiKremmrOS/s+W7g+aLneaOkuaVl+adr+ebg+eJjOiDjOiCuui8qemFjeWAjeWfueWqkuaihVwiXSxbXCI5NDgwXCIsXCLmpbPnhaTni73osrflo7Los6DpmarpgJnonb/np6Tnn6fokKnkvK/liaXljZrmi43mn4/ms4rnmb3nrpTnspXoiLboloTov6vmm53mvKDniIbnuJvojqvpp4Hpuqblh73nrrHnobLnrrjogofnrYjmq6jluaHogoznlZHnlaDlhavpiaLmuoznmbrphpfpq6rkvJDnvbDmipznrY/plqXps6nlmbrloZnom6TpmrzkvLTliKTljYrlj43lj5vluIbmkKzmlpHmnb/msL7msY7niYjniq/nj63nlZTnuYHoiKzol6nosqnnr4Tph4bnhanpoJLpo6/mjL3mmannlarnm6Tno5DolYPom67ljKrljZHlkKblpoPluoflvbzmgrLmiYnmibnmiqvmlpDmr5Tms4znlrLnmq7nopHnp5jnt4vnvbfogqXooqvoqrnosrvpgb/pnZ7po5vmqIvnsLjlgpnlsL7lvq7mnofmr5jnkLXnnInnvo5cIl0sW1wiOTU0MFwiLFwi6by75p+K56iX5Yy555aL6aut5b2m6Iad6I+x6IKY5by85b+F55Wi562G6YC85qGn5aer5aqb57SQ55m+6Kys5L+15b2q5qiZ5rC35ryC55Oi56Wo6KGo6KmV6LG55buf5o+P55eF56eS6IuX6Yyo6Yuy6JKc6Jut6bCt5ZOB5b2s5paM5rWc54CV6LKn6LOT6aC75pWP55O25LiN5LuY5Z+g5aSr5amm5a+M5Yao5biD5bqc5oCW5om25pW3XCJdLFtcIjk1ODBcIixcIuaWp+aZrua1rueItuespuiFkOiGmuiKmeitnOiyoOizpui1tOmYnOmZhOS+ruaSq+atpuiInuiRoeiVqumDqOWwgealk+miqOiRuuiVl+S8j+WJr+W+qeW5heacjeemj+iFueikh+imhua3teW8l+aJleayuOS7j+eJqemukuWIhuWQu+WZtOWis+aGpOaJrueEmuWlrueyieeznue0m+mbsOaWh+iBnuS4meS9teWFteWhgOW5o+W5s+W8iuafhOS4puiUvemWiemZm+exs+mggeWDu+WjgeeZlueip+WIpeeepeiUkeeuhuWBj+WkieeJh+evh+e3qOi+uui/lOmBjeS+v+WLieWoqeW8gemereS/neiIl+mLquWcg+aNleatqeeUq+ijnOi8lOepguWLn+Wik+aFleaIiuaaruavjeewv+iPqeWAo+S/uOWMheWRhuWgseWlieWuneWzsOWzr+W0qeW6luaKseaNp+aUvuaWueaci1wiXSxbXCI5NjQwXCIsXCLms5Xms6Hng7nnoLLnuKvog57oirPokIzok6zonILopJLoqKrosYrpgqbpi5Lpo73ps7PptazkuY/kuqHlgo3liZblnYrlpqjluL3lv5jlv5nmiL/mmrTmnJvmn5Dmo5LlhpLntKHogqrohqjorIDosozosr/pib7pmLLlkKDpoKzljJflg5XljZzloqjmkrLmnLTniafnnabnqYbph6bli4PmsqHmrobloIDluYzlpZTmnKznv7vlh6Hnm4ZcIl0sW1wiOTY4MFwiLFwi5pGp56Oo6a2U6bq75Z+L5aa55pin5p6a5q+O5ZOp5qeZ5bmV6Iac5p6V6a6q5p++6bGS5qGd5Lqm5L+j5Y+I5oq55pyr5rKr6L+E5L6t57mt6bq/5LiH5oWi5rqA5ryr6JST5ZGz5pyq6a2F5bez566V5bKs5a+G6Jyc5rmK6JOR56iU6ISI5aaZ57KN5rCR55yg5YuZ5aSi54Sh54mf55+b6Zyn6bWh5qSL5am/5aiY5Yal5ZCN5ZG95piO55uf6L+36YqY6bO05aeq54md5ruF5YWN5qOJ57a/57es6Z2i6bq65pG45qih6IyC5aaE5a2f5q+b54yb55uy57ay6ICX6JKZ5YSy5pyo6buZ55uu5p2i5Yu/6aSF5bCk5oi757G+6LKw5ZWP5oK257SL6ZaA5YyB5Lmf5Ya25aSc54i66IC26YeO5byl55+i5Y6E5b2557SE6Jas6Kiz6LqN6Z2W5p+z6Jau6ZGT5oSJ5oSI5rK555mSXCJdLFtcIjk3NDBcIixcIuirrei8uOWUr+S9keWEquWLh+WPi+WupeW5veaCoOaGguaPluacieafmua5p+a2jOeMtueMt+eUseelkOijleiqmOmBiumCkemDtembhOiejeWkleS6iOS9meS4juiqiei8v+mgkOWCreW5vOWmluWuueW6uOaPmuaPuuaTgeabnOaliuanmOa0i+a6tueGlOeUqOeqr+e+iuiAgOiRieiTieimgeisoei4iumBpemZvemkiuaFvuaKkeasslwiXSxbXCI5NzgwXCIsXCLmsoPmtbTnv4znv7zmt4DnvoXonrroo7jmnaXojrHpoLzpm7fmtJvntaHokL3pharkubHljbXltZDmrITmv6vol43omK3opqfliKnlkI/lsaXmnY7moqjnkIbnkoPnl6Loo4/oo6Hph4zpm6Lpmbjlvovnjofnq4vokY7mjqDnlaXlionmtYHmupznkInnlZnnoavnspLpmobnq5zpvo3kvrbmha7ml4XomZzkuobkuq7lg5rkuKHlh4zlr67mlpnmooHmtrznjJ/nmYLnnq3nqJzns6foia/oq5Lpgbzph4/pmbXpoJjlipvnt5HlgKvljpjmnpfmt4vnh5DnkLPoh6jovKrpmqPpsZfpup/nkaDloYHmtpnntK/poZ7ku6TkvLbkvovlhrflirHltrrmgJznjrLnpLzoi5PpiLTpmrfpm7bpnIrpupfpvaLmmqbmrbTliJfliqPng4joo4Llu4nmgYvmhpDmvKPnhYnnsL7nt7Toga9cIl0sW1wiOTg0MFwiLFwi6JOu6YCj6Yys5ZGC6a2v5quT54KJ6LOC6Lev6Zyy5Yq05amB5buK5byE5pyX5qW85qaU5rWq5ryP54mi54u856+t6ICB6IG+6J2L6YOO5YWt6bqT56aE6IKL6Yyy6KuW5YCt5ZKM6Kmx5q2q6LOE6ISH5oOR5p6g6bey5LqZ5LqY6bCQ6Kmr6JeB6JWo5qSA5rm+56KX6IWVXCJdLFtcIjk4OWZcIixcIuW8jOS4kOS4leS4quS4seS4tuS4vOS4v+S5guS5luS5mOS6guS6heixq+S6iuiIkuW8jeS6juS6nuS6n+S6oOS6ouS6sOS6s+S6tuS7juS7jeS7hOS7huS7guS7l+S7nuS7reS7n+S7t+S8ieS9muS8sOS9m+S9neS9l+S9h+S9tuS+iOS+j+S+mOS9u+S9qeS9sOS+keS9r+S+huS+luWEmOS/lOS/n+S/juS/mOS/m+S/keS/muS/kOS/pOS/peWAmuWAqOWAlOWAquWApeWAheS8nOS/tuWAoeWAqeWArOS/vuS/r+WAkeWAhuWBg+WBh+acg+WBleWBkOWBiOWBmuWBluWBrOWBuOWCgOWCmuWCheWCtOWCslwiXSxbXCI5OTQwXCIsXCLlg4nlg4rlgrPlg4Llg5blg57lg6Xlg63lg6Plg67lg7nlg7XlhInlhIHlhILlhJblhJXlhJTlhJrlhKHlhLrlhLflhLzlhLvlhL/lhYDlhZLlhYzlhZTlhaLnq7jlhanlharlha7lhoDlhoLlm5jlhozlhonlho/lhpHlhpPlhpXlhpblhqTlhqblhqLlhqnlhqrlhqvlhrPlhrHlhrLlhrDlhrXlhr3lh4Xlh4nlh5vlh6DomZXlh6nlh61cIl0sW1wiOTk4MFwiLFwi5Yew5Ye15Ye+5YiE5YiL5YiU5YiO5Yin5Yiq5Yiu5Yiz5Yi55YmP5YmE5YmL5YmM5Yme5YmU5Ymq5Ym05Ymp5Ymz5Ym/5Ym95YqN5YqU5YqS5Ymx5YqI5YqR6L6o6L6n5Yqs5Yqt5Yq85Yq15YuB5YuN5YuX5Yue5Yuj5Yum6aOt5Yug5Yuz5Yu15Yu45Yu55YyG5YyI55S45YyN5YyQ5YyP5YyV5Yya5Yyj5Yyv5Yyx5Yyz5Yy45Y2A5Y2G5Y2F5LiX5Y2J5Y2N5YeW5Y2e5Y2p5Y2u5aSY5Y275Y235Y6C5Y6W5Y6g5Y6m5Y6l5Y6u5Y6w5Y625Y+D57CS6ZuZ5Y+f5pu854eu5Y+u5Y+o5Y+t5Y+65ZCB5ZC95ZGA5ZCs5ZCt5ZC85ZCu5ZC25ZCp5ZCd5ZGO5ZKP5ZG15ZKO5ZGf5ZGx5ZG35ZGw5ZKS5ZG75ZKA5ZG25ZKE5ZKQ5ZKG5ZOH5ZKi5ZK45ZKl5ZKs5ZOE5ZOI5ZKoXCJdLFtcIjlhNDBcIixcIuWSq+WTguWSpOWSvuWSvOWTmOWTpeWTpuWUj+WUlOWTveWTruWTreWTuuWTouWUueWVgOWVo+WVjOWUruWVnOWVheWVluWVl+WUuOWUs+WVneWWmeWWgOWSr+WWiuWWn+WVu+WVvuWWmOWWnuWWruWVvOWWg+WWqeWWh+WWqOWXmuWXheWXn+WXhOWXnOWXpOWXlOWYlOWXt+WYluWXvuWXveWYm+WXueWZjuWZkOeHn+WYtOWYtuWYsuWYuFwiXSxbXCI5YTgwXCIsXCLlmavlmaTlmK/lmazlmarlmoblmoDlmorlmqDlmpTlmo/lmqXlmq7lmrblmrTlm4Llmrzlm4Hlm4Plm4Dlm4jlm47lm5Hlm5Plm5flm67lm7nlnIDlm7/lnITlnInlnIjlnIvlnI3lnJPlnJjlnJbll4flnJzlnKblnLflnLjlnY7lnLvlnYDlnY/lnanln4DlnojlnaHlnb/lnonlnpPlnqDlnrPlnqTlnqrlnrDln4Pln4bln5Tln5Lln5PloIrln5bln6PloIvloJnloJ3lobLloKHloaLloYvlobDmr4DloZLloL3lobnlooXlornlop/loqvlorrlo57lorvlorjloq7lo4Xlo5Plo5Hlo5flo5nlo5jlo6Xlo5zlo6Tlo5/lo6/lo7rlo7nlo7vlo7zlo73lpILlpIrlpJDlpJvmoqblpKXlpKzlpK3lpLLlpLjlpL7nq5LlpZXlpZDlpY7lpZrlpZjlpaLlpaDlpaflpazlpalcIl0sW1wiOWI0MFwiLFwi5aW45aaB5aad5L2e5L6r5aaj5aay5aeG5aeo5aec5aaN5aeZ5aea5ail5aif5aiR5aic5aiJ5aia5amA5ams5amJ5ai15ai25ami5amq5aqa5aq85aq+5auL5auC5aq95auj5auX5aum5aup5auW5au65au75ayM5ayL5ayW5ayy5auQ5ayq5ay25ay+5a2D5a2F5a2A5a2R5a2V5a2a5a2b5a2l5a2p5a2w5a2z5a215a245paI5a265a6AXCJdLFtcIjliODBcIixcIuWug+WupuWuuOWvg+Wvh+WvieWvlOWvkOWvpOWvpuWvouWvnuWvpeWvq+WvsOWvtuWvs+WwheWwh+WwiOWwjeWwk+WwoOWwouWwqOWwuOWwueWxgeWxhuWxjuWxk+WxkOWxj+WtseWxrOWxruS5ouWxtuWxueWyjOWykeWylOWmm+Wyq+Wyu+WytuWyvOWyt+WzheWyvuWzh+WzmeWzqeWzveWzuuWzreW2jOWzquW0i+W0leW0l+W1nOW0n+W0m+W0keW0lOW0ouW0muW0meW0mOW1jOW1kuW1juW1i+W1rOW1s+W1tuW2h+W2hOW2guW2ouW2neW2rOW2ruW2veW2kOW2t+W2vOW3ieW3jeW3k+W3kuW3luW3m+W3q+W3suW3teW4i+W4muW4meW4keW4m+W4tuW4t+W5hOW5g+W5gOW5juW5l+W5lOW5n+W5ouW5pOW5h+W5teW5tuW5uum6vOW5v+W6oOW7geW7guW7iOW7kOW7j1wiXSxbXCI5YzQwXCIsXCLlu5blu6Plu53lu5rlu5vlu6Llu6Hlu6jlu6nlu6zlu7Hlu7Plu7Dlu7Tlu7jlu77lvIPlvInlvZ3lvZzlvIvlvJHlvJblvKnlvK3lvLjlvYHlvYjlvYzlvY7lvK/lvZHlvZblvZflvZnlvaHlva3lvbPlvbflvoPlvoLlvb/lvorlvojlvpHlvoflvp7lvpnlvpjlvqDlvqjlvq3lvrzlv5blv7vlv6Tlv7jlv7Hlv53mgrPlv7/mgKHmgaBcIl0sW1wiOWM4MFwiLFwi5oCZ5oCQ5oCp5oCO5oCx5oCb5oCV5oCr5oCm5oCP5oC65oGa5oGB5oGq5oG35oGf5oGK5oGG5oGN5oGj5oGD5oGk5oGC5oGs5oGr5oGZ5oKB5oKN5oOn5oKD5oKa5oKE5oKb5oKW5oKX5oKS5oKn5oKL5oOh5oK45oOg5oOT5oK05b+w5oK95oOG5oK15oOY5oWN5oSV5oSG5oO25oO35oSA5oO05oO65oSD5oSh5oO75oOx5oSN5oSO5oWH5oS+5oSo5oSn5oWK5oS/5oS85oSs5oS05oS95oWC5oWE5oWz5oW35oWY5oWZ5oWa5oWr5oW05oWv5oWl5oWx5oWf5oWd5oWT5oW15oaZ5oaW5oaH5oas5oaU5oaa5oaK5oaR5oar5oau5oeM5oeK5oeJ5oe35oeI5oeD5oeG5oa65oeL57255oeN5oem5oej5oe25oe65oe05oe/5oe95oe85oe+5oiA5oiI5oiJ5oiN5oiM5oiU5oibXCJdLFtcIjlkNDBcIixcIuaInuaIoeaIquaIruaIsOaIsuaIs+aJgeaJjuaJnuaJo+aJm+aJoOaJqOaJvOaKguaKieaJvuaKkuaKk+aKluaLlOaKg+aKlOaLl+aLkeaKu+aLj+aLv+aLhuaTlOaLiOaLnOaLjOaLiuaLguaLh+aKm+aLieaMjOaLruaLseaMp+aMguaMiOaLr+aLteaNkOaMvuaNjeaQnOaNj+aOluaOjuaOgOaOq+aNtuaOo+aOj+aOieaOn+aOteaNq1wiXSxbXCI5ZDgwXCIsXCLmjanmjr7mj6nmj4Dmj4bmj6Pmj4nmj5Lmj7bmj4TmkJbmkLTmkIbmkJPmkKbmkLbmlJ3mkJfmkKjmkI/mkafmka/mkbbmkY7mlKrmkpXmkpPmkqXmkqnmkojmkrzmk5rmk5Lmk4Xmk4fmkrvmk5jmk4Lmk7Hmk6foiInmk6Dmk6Hmiqzmk6Pmk6/mlKzmk7bmk7Tmk7Lmk7rmlIDmk73mlJjmlJzmlIXmlKTmlKPmlKvmlLTmlLXmlLfmlLbmlLjnlYvmlYjmlZbmlZXmlY3mlZjmlZ7mlZ3mlbLmlbjmloLmloPorormlpvmlp/mlqvmlrfml4Pml4bml4Hml4Tml4zml5Lml5vml5nml6Dml6Hml7HmnbLmmIrmmIPml7vmnbPmmLXmmLbmmLTmmJzmmY/mmYTmmYnmmYHmmZ7mmZ3mmaTmmafmmajmmZ/mmaLmmbDmmoPmmojmmo7mmonmmoTmmpjmmp3mm4Hmmrnmm4nmmr7mmrxcIl0sW1wiOWU0MFwiLFwi5puE5pq45puW5pua5pug5pi/5pum5pup5puw5pu15pu35pyP5pyW5pye5pym5pyn6Zy45pyu5py/5py25p2B5py45py35p2G5p2e5p2g5p2Z5p2j5p2k5p6J5p2w5p6p5p285p2q5p6M5p6L5p6m5p6h5p6F5p635p+v5p605p+s5p6z5p+p5p645p+k5p+e5p+d5p+i5p+u5p655p+O5p+G5p+n5qqc5qCe5qGG5qCp5qGA5qGN5qCy5qGOXCJdLFtcIjllODBcIixcIuais+agq+ahmeaho+aht+ahv+ain+aij+aireailOaineaim+aig+aqruaiueahtOaiteaioOaiuuakj+aijeahvuakgeajiuakiOajmOakouakpuajoeakjOajjeajlOajp+ajleaktuakkuakhOajl+ajo+akpeajueajoOajr+akqOakquakmuako+akoeajhualuealt+alnOaluOalq+allOalvualruakuealtOakvealmeaksOaloealnualneamgealquamsuamruankOamv+angeank+amvuanjuWvqOaniuanneamu+ang+amp+aoruamkeamoOamnOamleamtOannuanqOaoguaom+anv+asiuanueansuanp+aoheamseaonuanreaolOanq+aoiuaokuargeaoo+aok+aphOaojOapsuaotuapuOaph+apouapmeappuapiOaouOaoouaqkOaqjeaqoOaqhOaqouaqo1wiXSxbXCI5ZjQwXCIsXCLmqpfomJfmqrvmq4Pmq4LmqrjmqrPmqqzmq57mq5Hmq5/mqqrmq5rmq6rmq7vmrIXomJbmq7rmrJLmrJbprLHmrJ/mrLjmrLfnm5zmrLnpo67mrYfmrYPmrYnmrZDmrZnmrZTmrZvmrZ/mraHmrbjmrbnmrb/mroDmroTmroPmro3mrpjmrpXmrp7mrqTmrqrmrqvmrq/mrrLmrrHmrrPmrrfmrrzmr4bmr4vmr5Pmr5/mr6zmr6vmr7Pmr69cIl0sW1wiOWY4MFwiLFwi6bq+5rCI5rCT5rCU5rCb5rCk5rCj5rGe5rGV5rGi5rGq5rKC5rKN5rKa5rKB5rKb5rG+5rGo5rGz5rKS5rKQ5rOE5rOx5rOT5rK95rOX5rOF5rOd5rKu5rKx5rK+5rK65rOb5rOv5rOZ5rOq5rSf6KGN5rS25rSr5rS95rS45rSZ5rS15rSz5rSS5rSM5rWj5raT5rWk5rWa5rW55rWZ5raO5raV5r+k5raF5re55riV5riK5ra15reH5rem5ra45reG5res5ree5reM5reo5reS5reF5re65reZ5rek5reV5req5reu5rit5rmu5riu5riZ5rmy5rmf5ri+5rij5rmr5rir5rm25rmN5rif5rmD5ri65rmO5rik5ru/5rid5ri45rqC5rqq5rqY5ruJ5rq35ruT5rq95rqv5ruE5rqy5ruU5ruV5rqP5rql5ruC5rqf5r2B5ryR54GM5rus5ru45ru+5ry/5ruy5ryx5ruv5ryy5ruMXCJdLFtcImUwNDBcIixcIua8vua8k+a7t+a+hua9uua9uOa+gea+gOa9r+a9m+a/s+a9rea+gua9vOa9mOa+jua+kea/gua9pua+s+a+o+a+oea+pOa+uea/hua+qua/n+a/lea/rOa/lOa/mOa/sea/rua/m+eAieeAi+a/uueAkeeAgeeAj+a/vueAm+eAmua9tOeAneeAmOeAn+eAsOeAvueAsueBkeeBo+eCmeeCkueCr+eDseeCrOeCuOeCs+eCrueDn+eDi+eDnVwiXSxbXCJlMDgwXCIsXCLng5nnhInng73nhJznhJnnhaXnhZXnhojnhabnhaLnhYznhZbnhaznho/nh7vnhoTnhpXnhqjnhqznh5fnhrnnhr7nh5Lnh4nnh5Tnh47nh6Dnh6znh6fnh7Xnh7znh7nnh7/niI3niJDniJvniKjniK3niKzniLDniLLniLvniLzniL/niYDniYbniYvniZjnibTnib7nioLnioHniofnipLnipbniqLniqfnirnnirLni4Pni4bni4Tni47ni5Lni6Lni6Dni6Hni7nni7flgI/njJfnjIrnjJznjJbnjJ3njLTnjK/njKnnjKXnjL7njY7njY/pu5jnjZfnjarnjajnjbDnjbjnjbXnjbvnjbrnj4jnjrPnj47njrvnj4Dnj6Xnj67nj57nkqLnkIXnka/nkKXnj7jnkLLnkLrnkZXnkL/nkZ/nkZnnkYHnkZznkannkbDnkaPnkarnkbbnkb7nkovnkp7nkqfnk4rnk4/nk5Tnj7FcIl0sW1wiZTE0MFwiLFwi55Og55Oj55On55Op55Ou55Oy55Ow55Ox55O455O355SE55SD55SF55SM55SO55SN55SV55ST55Se55Sm55Ss55S855WE55WN55WK55WJ55Wb55WG55Wa55Wp55Wk55Wn55Wr55Wt55W455W255aG55aH55W055aK55aJ55aC55aU55aa55ad55al55aj55eC55az55eD55a155a955a455a855ax55eN55eK55eS55eZ55ej55ee55e+55e/XCJdLFtcImUxODBcIixcIueXvOeYgeeXsOeXuueXsueXs+eYi+eYjeeYieeYn+eYp+eYoOeYoeeYoueYpOeYtOeYsOeYu+eZh+eZiOeZhueZnOeZmOeZoeeZoueZqOeZqeeZqueZp+eZrOeZsOeZsueZtueZuOeZvOeagOeag+eaiOeai+eajuealueak+eameeamueasOeatOeauOeaueeauuebguebjeebluebkuebnueboeebpeebp+ebquiYr+ebu+eciOech+echOecqeecpOecnuecpeecpuecm+ect+ecuOedh+edmuedqOedq+edm+edpeedv+edvuedueeejueei+eekeeeoOeenueesOeetueeueeev+eevOeeveeeu+efh+efjeefl+efmuefnOefo+efruefvOegjOegkuekpuegoOekquehheeijuehtOeihuehvOeimueijOeio+eiteeiqueir+ejkeejhueji+ejlOeivueivOejheejiuejrFwiXSxbXCJlMjQwXCIsXCLno6fno5rno73no7TnpIfnpJLnpJHnpJnnpKznpKvnpYDnpaDnpZfnpZ/npZrnpZXnpZPnpbrnpb/npornpp3npqfpvYvnpqrnpq7nprPnprnnprrnp4nnp5Xnp6fnp6znp6Hnp6PnqIjnqI3nqJjnqJnnqKDnqJ/npoDnqLHnqLvnqL7nqLfnqYPnqZfnqYnnqaHnqaLnqanpvp3nqbDnqbnnqb3nqojnqpfnqpXnqpjnqpbnqqnnq4jnqrBcIl0sW1wiZTI4MFwiLFwi56q256uF56uE56q/6YKD56uH56uK56uN56uP56uV56uT56uZ56ua56ud56uh56ui56um56ut56uw56yC56yP56yK56yG56yz56yY56yZ56ye56y156yo56y2562Q562656yE562N56yL562M562F5621562l5620562n562w562x562s562u566d566Y566f566N566c566a566L566S566P562d566Z56+L56+B56+M56+P566056+G56+d56+p57CR57CU56+m56+l57Gg57CA57CH57CT56+z56+357CX57CN56+257Cj57Cn57Cq57Cf57C357Cr57C957GM57GD57GU57GP57GA57GQ57GY57Gf57Gk57GW57Gl57Gs57G157KD57KQ57Kk57Kt57Ki57Kr57Kh57Ko57Kz57Ky57Kx57Ku57K557K957OA57OF57OC57OY57OS57Oc57Oi6ay757Ov57Oy57O057O257O657SGXCJdLFtcImUzNDBcIixcIue0gue0nOe0lee0iue1hee1i+e0rue0sue0v+e0tee1hue1s+e1lue1jue1sue1qOe1rue1j+e1o+e2k+e2iee1m+e2j+e1vee2m+e2uue2rue2o+e2tee3h+e2vee2q+e4vee2oue2r+e3nOe2uOe2n+e2sOe3mOe3nee3pOe3nue3u+e3sue3oee4hee4iue4o+e4oee4kue4see4n+e4iee4i+e4oue5hue5pue4u+e4tee4uee5g+e4t1wiXSxbXCJlMzgwXCIsXCLnuLLnuLrnuafnuZ3nuZbnuZ7nuZnnuZrnubnnuarnuannubznubvnuoPnt5Xnub3ovq7nub/nuojnuonnuoznupLnupDnupPnupTnupbnuo7nupvnupznvLjnvLrnvYXnvYznvY3nvY7nvZDnvZHnvZXnvZTnvZjnvZ/nvaDnvajnvannvafnvbjnvoLnvobnvoPnvojnvofnvoznvpTnvp7nvp3nvprnvqPnvq/nvrLnvrnnvq7nvrbnvrjorbHnv4Xnv4bnv4rnv5Xnv5Tnv6Hnv6bnv6nnv7Pnv7npo5zogIbogITogIvogJLogJjogJnogJzogKHogKjogL/ogLvogYrogYbogZLogZjogZrogZ/ogaLogajogbPogbLogbDogbbogbnogb3ogb/ogoTogobogoXogpvogpPogprogq3lhpDogqzog5vog6Xog5nog53og4Tog5rog5bohInog6/og7HohJvohKnohKPohK/ohYtcIl0sW1wiZTQ0MFwiLFwi6ZqL6IWG6IS+6IWT6IWR6IO86IWx6IWu6IWl6IWm6IW06IaD6IaI6IaK6IaA6IaC6Iag6IaV6Iak6Iaj6IWf6IaT6Iap6Iaw6Ia16Ia+6Ia46Ia96IeA6IeC6Ia66IeJ6IeN6IeR6IeZ6IeY6IeI6Iea6Ief6Ieg6Ien6Ie66Ie76Ie+6IiB6IiC6IiF6IiH6IiK6IiN6IiQ6IiW6Iip6Iir6Ii46Iiz6ImA6ImZ6ImY6Imd6Ima6Imf6ImkXCJdLFtcImU0ODBcIixcIuiJouiJqOiJquiJq+iIruiJseiJt+iJuOiJvuiKjeiKkuiKq+iKn+iKu+iKrOiLoeiLo+iLn+iLkuiLtOiLs+iLuuiOk+iMg+iLu+iLueiLnuiMhuiLnOiMieiLmeiMteiMtOiMluiMsuiMseiNgOiMueiNkOiNheiMr+iMq+iMl+iMmOiOheiOmuiOquiOn+iOouiOluiMo+iOjuiOh+iOiuiNvOiOteiNs+iNteiOoOiOieiOqOiPtOiQk+iPq+iPjuiPveiQg+iPmOiQi+iPgeiPt+iQh+iPoOiPsuiQjeiQouiQoOiOveiQuOiUhuiPu+iRreiQquiQvOiVmuiShOiRt+iRq+iSreiRruiSguiRqeiRhuiQrOiRr+iRueiQteiTiuiRouiSueiSv+iSn+iTmeiTjeiSu+iTmuiTkOiTgeiThuiTluiSoeiUoeiTv+iTtOiUl+iUmOiUrOiUn+iUleiUlOiTvOiVgOiVo+iVmOiViFwiXSxbXCJlNTQwXCIsXCLolYHomILolYvolZXoloDolqTolojolpHolorolqjola3olpTolpvol6rolofolpzolbfolb7olpDol4nolrrol4/olrnol5Dol5Xol53ol6Xol5zol7nomIromJPomIvol77ol7romIbomKLomJromLDomL/omY3kuZXomZTomZ/omafombHompPomqPomqnomqromovomozomrbomq/om4Tom4bomrDom4nooKPomqvom5Tom57om6nom6xcIl0sW1wiZTU4MFwiLFwi6Juf6Jub6Juv6JyS6JyG6JyI6JyA6JyD6Ju76JyR6JyJ6JyN6Ju56JyK6Jy06Jy/6Jy36Jy76Jyl6Jyp6Jya6J2g6J2f6J246J2M6J2O6J206J2X6J2o6J2u6J2Z6J2T6J2j6J2q6KCF6J6i6J6f6J6C6J6v6J+L6J696J+A6J+Q6ZuW6J6r6J+E6J6z6J+H6J+G6J676J+v6J+y6J+g6KCP6KCN6J++6J+26J+36KCO6J+S6KCR6KCW6KCV6KCi6KCh6KCx6KC26KC56KCn6KC76KGE6KGC6KGS6KGZ6KGe6KGi6KGr6KKB6KG+6KKe6KG16KG96KK16KGy6KKC6KKX6KKS6KKu6KKZ6KKi6KKN6KKk6KKw6KK/6KKx6KOD6KOE6KOU6KOY6KOZ6KOd6KO56KSC6KO86KO06KOo6KOy6KSE6KSM6KSK6KST6KWD6KSe6KSl6KSq6KSr6KWB6KWE6KS76KS26KS46KWM6KSd6KWg6KWeXCJdLFtcImU2NDBcIixcIuilpuilpOilreilquilr+iltOilt+ilvuimg+imiOimiuimk+immOimoeimqeimpuimrOimr+imsuimuuimveimv+ingOinmuinnOinneinp+intOinuOiog+ioluiokOiojOiom+ioneiopeiotuipgeipm+ipkuiphuipiOipvOipreiprOipouiqheiqguiqhOiqqOiqoeiqkeiqpeiqpuiqmuiqo+irhOirjeirguirmuirq+irs+irp1wiXSxbXCJlNjgwXCIsXCLoq6Toq7HorJToq6Doq6Loq7foq57oq5vorIzorIforJroq6HorJborJDorJforKDorLPpnqvorKborKvorL7orKjorYHorYzorY/orY7orYnorZborZvorZroravorZ/orazora/orbTorb3oroDorozoro7orpLorpPorpborpnorprosLrosYHosL/osYjosYzosY7osZDosZXosaLosazosbjosbrosoLosonosoXosoroso3oso7ospTosbzospjmiJ3osq3osqrosr3osrLosrPosq7osrbos4jos4Hos6Tos6Pos5ros73os7ros7votITotIXotIrotIfotI/otI3otJDpvY7otJPos43otJTotJbotafota3otbHotbPotoHotpnot4Lotr7otrrot4/ot5rot5bot4zot5vot4vot6rot6vot5/ot6Pot7zouIjouInot7/ouJ3ouJ7ouJDouJ/ouYLouLXouLDouLTouYpcIl0sW1wiZTc0MFwiLFwi6LmH6LmJ6LmM6LmQ6LmI6LmZ6Lmk6Lmg6Liq6Lmj6LmV6Lm26Lmy6Lm86LqB6LqH6LqF6LqE6LqL6LqK6LqT6LqR6LqU6LqZ6Lqq6Lqh6Lqs6Lqw6LuG6Lqx6Lq+6LuF6LuI6LuL6Lub6Luj6Lu86Lu76Lur6Lu+6LyK6LyF6LyV6LyS6LyZ6LyT6Lyc6Lyf6Lyb6LyM6Lym6Lyz6Ly76Ly56L2F6L2C6Ly+6L2M6L2J6L2G6L2O6L2X6L2cXCJdLFtcImU3ODBcIixcIui9oui9o+i9pOi+nOi+n+i+o+i+rei+r+i+t+i/mui/pei/oui/qui/r+mCh+i/tOmAhei/uei/uumAkemAlemAoemAjemAnumAlumAi+mAp+mAtumAtemAuei/uOmBj+mBkOmBkemBkumAjumBiemAvumBlumBmOmBnumBqOmBr+mBtumaqOmBsumCgumBvemCgemCgOmCiumCiemCj+mCqOmCr+mCsemCtemDoumDpOaJiOmDm+mEgumEkumEmemEsumEsOmFiumFlumFmOmFo+mFpemFqemFs+mFsumGi+mGiemGgumGoumGq+mGr+mGqumGtemGtOmGuumHgOmHgemHiemHi+mHkOmHlumHn+mHoemHm+mHvOmHtemHtumInumHv+mIlOmIrOmIlemIkemJnumJl+mJhemJiemJpOmJiOmKlemIv+mJi+mJkOmKnOmKlumKk+mKm+mJmumLj+mKuemKt+mLqemMj+mLuumNhOmMrlwiXSxbXCJlODQwXCIsXCLpjJnpjKLpjJrpjKPpjLrpjLXpjLvpjZzpjaDpjbzpja7pjZbpjrDpjqzpjq3pjpTpjrnpj5bpj5fpj6jpj6Xpj5jpj4Ppj53pj5Dpj4jpj6TpkJrpkJTpkJPpkIPpkIfpkJDpkLbpkKvpkLXpkKHpkLrpkYHpkZLpkYTpkZvpkaDpkaLpkZ7pkarpiKnpkbDpkbXpkbfpkb3pkZrpkbzpkb7pkoHpkb/ploLplofplorplpTplpbplpjplplcIl0sW1wiZTg4MFwiLFwi6Zag6Zao6Zan6Zat6Za86Za76Za56Za+6ZeK5r+26ZeD6ZeN6ZeM6ZeV6ZeU6ZeW6Zec6Zeh6Zel6Zei6Zih6Zio6Ziu6Ziv6ZmC6ZmM6ZmP6ZmL6Zm36Zmc6Zme6Zmd6Zmf6Zmm6Zmy6Zms6ZqN6ZqY6ZqV6ZqX6Zqq6Zqn6Zqx6Zqy6Zqw6Zq06Zq26Zq46Zq56ZuO6ZuL6ZuJ6ZuN6KWN6Zuc6ZyN6ZuV6Zu56ZyE6ZyG6ZyI6ZyT6ZyO6ZyR6ZyP6ZyW6ZyZ6Zyk6Zyq6Zyw6Zy56Zy96Zy+6Z2E6Z2G6Z2I6Z2C6Z2J6Z2c6Z2g6Z2k6Z2m6Z2o5YuS6Z2r6Z2x6Z256Z6F6Z286Z6B6Z266Z6G6Z6L6Z6P6Z6Q6Z6c6Z6o6Z6m6Z6j6Z6z6Z606Z+D6Z+G6Z+I6Z+L6Z+c6Z+t6b2P6Z+y56uf6Z+26Z+16aCP6aCM6aC46aCk6aCh6aC36aC96aGG6aGP6aGL6aGr6aGv6aGwXCJdLFtcImU5NDBcIixcIumhsemhtOmhs+miqumir+misemitumjhOmjg+mjhumjqemjq+mkg+mkiemkkumklOmkmOmkoemknemknumkpOmkoOmkrOmkrumkvemkvumlgumliemlhemlkOmli+mlkemlkumljOmllemml+mmmOmmpemmremmrummvOmnn+mnm+mnnemnmOmnkemnremnrumnsemnsumnu+mnuOmogemoj+mohemnoumomemoq+mot+mphempgumpgOmpg1wiXSxbXCJlOTgwXCIsXCLpqL7pqZXpqY3pqZvpqZfpqZ/pqaLpqaXpqaTpqanpqavpqarpqq3pqrDpqrzpq4Dpq4/pq5Hpq5Ppq5Tpq57pq5/pq6Lpq6Ppq6bpq6/pq6vpq67pq7Tpq7Hpq7fpq7vprIbprJjprJrprJ/prKLprKPprKXprKfprKjprKnprKrprK7prK/prLLprYTprYPprY/prY3prY7prZHprZjprbTprpPproPprpHprpbprpfprp/prqDprqjprrTpr4Dpr4rprrnpr4bpr4/pr5Hpr5Lpr6Ppr6Lpr6Tpr5Tpr6HpsLrpr7Lpr7Hpr7DpsJXpsJTpsInpsJPpsIzpsIbpsIjpsJLpsIrpsITpsK7psJvpsKXpsKTpsKHpsLDpsYfpsLLpsYbpsL7psZrpsaDpsafpsbbpsbjps6fps6zps7DptInptIjps6vptIPptIbptKrptKbptq/ptKPptJ/ptYTptJXptJLptYHptL/ptL7ptYbptYhcIl0sW1wiZWE0MFwiLFwi6bWd6bWe6bWk6bWR6bWQ6bWZ6bWy6baJ6baH6bar6bWv6bW66baa6bak6bap6bay6beE6beB6ba76ba46ba66beG6beP6beC6beZ6beT6be46bem6bet6bev6be96bia6bib6bie6bm16bm56bm96bqB6bqI6bqL6bqM6bqS6bqV6bqR6bqd6bql6bqp6bq46bqq6bqt6Z2h6buM6buO6buP6buQ6buU6buc6bue6bud6bug6bul6buo6buvXCJdLFtcImVhODBcIixcIum7tOm7tum7t+m7uem7u+m7vOm7vem8h+m8iOeat+m8lem8oem8rOm8vum9ium9kum9lOm9o+m9n+m9oOm9oem9pum9p+m9rOm9qum9t+m9sum9tum+lem+nOm+oOWgr+anh+mBmeeRpOWHnOeGmVwiXSxbXCJlZDQwXCIsXCLnuoropJzpjYjpiojok5zkv4nngrvmmLHmo4jpi7nmm7vlvYXkuKjku6Hku7zkvIDkvIPkvLnkvZbkvpLkvorkvprkvpTkv43lgYDlgKLkv7/lgJ7lgYblgbDlgYLlgpTlg7Tlg5jlhYrlhaTlhp3lhr7lh6zliJXlipzliqbli4Dli5vljIDljIfljKTljbLljpPljrLlj53vqI7lkpzlkorlkqnlk7/lloblnZnlnaXlnqzln4jln4fvqI9cIl0sW1wiZWQ4MFwiLFwi76iQ5aKe5aKy5aSL5aWT5aWb5aWd5aWj5aak5aa65a2W5a+A55Sv5a+Y5a+s5bCe5bKm5bK65bO15bSn5bWT76iR5bWC5bWt5ba45ba55beQ5byh5by05b2n5b635b+e5oGd5oKF5oKK5oOe5oOV5oSg5oOy5oSR5oS35oSw5oaY5oiT5oqm5o+15pGg5pKd5pOO5pWO5piA5piV5pi75piJ5piu5pie5pik5pml5pmX5pmZ76iS5pmz5pqZ5pqg5pqy5pq/5pu65pyO76Sp5p2m5p675qGS5p+A5qCB5qGE5qOP76iT5qWo76iU5qaY5qei5qiw5qmr5qmG5qmz5qm+5qui5quk5q+W5rC/5rGc5rKG5rGv5rOa5rSE5raH5rWv5raW5ras5reP5re45rey5re85ri55rmc5rin5ri85rq/5r6I5r615r+154CF54CH54Co54KF54Kr54SP54SE54Wc54WG54WH76iV54eB54e+54qxXCJdLFtcImVlNDBcIixcIueKvueMpO+olueNt+eOveePieePluePo+ePkueQh+ePteeQpueQqueQqeeQrueRoueSieeSn+eUgeeVr+eagueanOeanueam+eapu+ol+edhuWKr+egoeehjuehpOehuueksO+omO+ome+omuemlO+om+emm+erkeerp++onOerq+eunu+onee1iOe1nOe2t+e2oOe3lue5kue9h+e+oe+onuiMgeiNouiNv+iPh+iPtuiRiOiStOiVk+iVmVwiXSxbXCJlZTgwXCIsXCLolavvqJ/olrDvqKDvqKHooIfoo7XoqJLoqLfoqbnoqqfoqr7oq5/vqKLoq7borZPorb/os7Dos7TotJLotbbvqKPou4/vqKTvqKXpgafpg57vqKbphJXphKfph5rph5fph57ph63ph67ph6Tph6XpiIbpiJDpiIrpiLrpiYDpiLzpiY7piZnpiZHpiLnpiafpiqfpibfpibjpi6fpi5fpi5npi5DvqKfpi5Xpi6Dpi5PpjKXpjKHpi7vvqKjpjJ7pi7/pjJ3pjILpjbDpjZfpjqTpj4bpj57pj7jpkLHpkYXpkYjplpLvp5zvqKnpmp3pmq/pnLPpnLvpnYPpnY3pnY/pnZHpnZXpoZfpoaXvqKrvqKvppKfvqKzppp7pqY7pq5npq5zprbXprbLpro/prrHprrvpsIDptbDptavvqK3puJnpu5FcIl0sW1wiZWVlZlwiLFwi4oWwXCIsOSxcIu+/ou+/pO+8h++8glwiXSxbXCJmMDQwXCIsXCLugIBcIiw2Ml0sW1wiZjA4MFwiLFwi7oC/XCIsMTI0XSxbXCJmMTQwXCIsXCLugrxcIiw2Ml0sW1wiZjE4MFwiLFwi7oO7XCIsMTI0XSxbXCJmMjQwXCIsXCLuhbhcIiw2Ml0sW1wiZjI4MFwiLFwi7oa3XCIsMTI0XSxbXCJmMzQwXCIsXCLuiLRcIiw2Ml0sW1wiZjM4MFwiLFwi7omzXCIsMTI0XSxbXCJmNDQwXCIsXCLui7BcIiw2Ml0sW1wiZjQ4MFwiLFwi7oyvXCIsMTI0XSxbXCJmNTQwXCIsXCLujqxcIiw2Ml0sW1wiZjU4MFwiLFwi7o+rXCIsMTI0XSxbXCJmNjQwXCIsXCLukahcIiw2Ml0sW1wiZjY4MFwiLFwi7pKnXCIsMTI0XSxbXCJmNzQwXCIsXCLulKRcIiw2Ml0sW1wiZjc4MFwiLFwi7pWjXCIsMTI0XSxbXCJmODQwXCIsXCLul6BcIiw2Ml0sW1wiZjg4MFwiLFwi7pifXCIsMTI0XSxbXCJmOTQwXCIsXCLumpxcIl0sW1wiZmE0MFwiLFwi4oWwXCIsOSxcIuKFoFwiLDksXCLvv6Lvv6TvvIfvvILjiLHihJbihKHiiLXnuoropJzpjYjpiojok5zkv4nngrvmmLHmo4jpi7nmm7vlvYXkuKjku6Hku7zkvIDkvIPkvLnkvZbkvpLkvorkvprkvpTkv43lgYDlgKLkv7/lgJ7lgYblgbDlgYLlgpTlg7Tlg5jlhYpcIl0sW1wiZmE4MFwiLFwi5YWk5Yad5Ya+5Yes5YiV5Yqc5Yqm5YuA5Yub5YyA5YyH5Yyk5Y2y5Y6T5Y6y5Y+d76iO5ZKc5ZKK5ZKp5ZO/5ZaG5Z2Z5Z2l5Z6s5Z+I5Z+H76iP76iQ5aKe5aKy5aSL5aWT5aWb5aWd5aWj5aak5aa65a2W5a+A55Sv5a+Y5a+s5bCe5bKm5bK65bO15bSn5bWT76iR5bWC5bWt5ba45ba55beQ5byh5by05b2n5b635b+e5oGd5oKF5oKK5oOe5oOV5oSg5oOy5oSR5oS35oSw5oaY5oiT5oqm5o+15pGg5pKd5pOO5pWO5piA5piV5pi75piJ5piu5pie5pik5pml5pmX5pmZ76iS5pmz5pqZ5pqg5pqy5pq/5pu65pyO76Sp5p2m5p675qGS5p+A5qCB5qGE5qOP76iT5qWo76iU5qaY5qei5qiw5qmr5qmG5qmz5qm+5qui5quk5q+W5rC/5rGc5rKG5rGv5rOa5rSE5raH5rWvXCJdLFtcImZiNDBcIixcIua2lua2rOa3j+a3uOa3sua3vOa4uea5nOa4p+a4vOa6v+a+iOa+tea/teeAheeAh+eAqOeCheeCq+eEj+eEhOeFnOeFhueFh++oleeHgeeHvueKseeKvueMpO+olueNt+eOveePieePluePo+ePkueQh+ePteeQpueQqueQqeeQrueRoueSieeSn+eUgeeVr+eagueanOeanueam+eapu+ol+edhuWKr+egoeehjuehpOehuueksO+omO+omVwiXSxbXCJmYjgwXCIsXCLvqJrnppTvqJvnppvnq5Hnq6fvqJznq6vnrp7vqJ3ntYjntZzntrfntqDnt5bnuZLnvYfnvqHvqJ7ojIHojaLojb/oj4foj7bokYjokrTolZPolZnolavvqJ/olrDvqKDvqKHooIfoo7XoqJLoqLfoqbnoqqfoqr7oq5/vqKLoq7borZPorb/os7Dos7TotJLotbbvqKPou4/vqKTvqKXpgafpg57vqKbphJXphKfph5rph5fph57ph63ph67ph6Tph6XpiIbpiJDpiIrpiLrpiYDpiLzpiY7piZnpiZHpiLnpiafpiqfpibfpibjpi6fpi5fpi5npi5DvqKfpi5Xpi6Dpi5PpjKXpjKHpi7vvqKjpjJ7pi7/pjJ3pjILpjbDpjZfpjqTpj4bpj57pj7jpkLHpkYXpkYjplpLvp5zvqKnpmp3pmq/pnLPpnLvpnYPpnY3pnY/pnZHpnZXpoZfpoaXvqKrvqKvppKfvqKzppp7pqY7pq5lcIl0sW1wiZmM0MFwiLFwi6auc6a216a2y6a6P6a6x6a676bCA6bWw6bWr76it6biZ6buRXCJdXVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy90YWJsZXMvc2hpZnRqaXMuanNvblxuLy8gbW9kdWxlIGlkID0gMTQ0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gW1tcIjBcIixcIlxcdTAwMDBcIiwxMjddLFtcIjhlYTFcIixcIu+9oVwiLDYyXSxbXCJhMWExXCIsXCLjgIDjgIHjgILvvIzvvI7jg7vvvJrvvJvvvJ/vvIHjgpvjgpzCtO+9gMKo77y+77+j77y/44O944O+44Kd44Ke44CD5Lud44CF44CG44CH44O84oCV4oCQ77yP77y8772e4oil772c4oCm4oCl4oCY4oCZ4oCc4oCd77yI77yJ44CU44CV77y777y9772b772d44CIXCIsOSxcIu+8i++8jcKxw5fDt++8neKJoO+8nO+8nuKJpuKJp+KInuKItOKZguKZgMKw4oCy4oCz4oSD77+l77yE77+g77+h77yF77yD77yG77yK77ygwqfimIbimIXil4vil4/il47il4dcIl0sW1wiYTJhMVwiLFwi4peG4pah4pag4paz4pay4pa94pa84oC744CS4oaS4oaQ4oaR4oaT44CTXCJdLFtcImEyYmFcIixcIuKIiOKIi+KKhuKKh+KKguKKg+KIquKIqVwiXSxbXCJhMmNhXCIsXCLiiKfiiKjvv6Lih5Lih5TiiIDiiINcIl0sW1wiYTJkY1wiLFwi4oig4oql4oyS4oiC4oiH4omh4omS4omq4omr4oia4oi94oid4oi14oir4oisXCJdLFtcImEyZjJcIixcIuKEq+KAsOKZr+KZreKZquKAoOKAocK2XCJdLFtcImEyZmVcIixcIuKXr1wiXSxbXCJhM2IwXCIsXCLvvJBcIiw5XSxbXCJhM2MxXCIsXCLvvKFcIiwyNV0sW1wiYTNlMVwiLFwi772BXCIsMjVdLFtcImE0YTFcIixcIuOBgVwiLDgyXSxbXCJhNWExXCIsXCLjgqFcIiw4NV0sW1wiYTZhMVwiLFwizpFcIiwxNixcIs6jXCIsNl0sW1wiYTZjMVwiLFwizrFcIiwxNixcIs+DXCIsNl0sW1wiYTdhMVwiLFwi0JBcIiw1LFwi0IHQllwiLDI1XSxbXCJhN2QxXCIsXCLQsFwiLDUsXCLRkdC2XCIsMjVdLFtcImE4YTFcIixcIuKUgOKUguKUjOKUkOKUmOKUlOKUnOKUrOKUpOKUtOKUvOKUgeKUg+KUj+KUk+KUm+KUl+KUo+KUs+KUq+KUu+KVi+KUoOKUr+KUqOKUt+KUv+KUneKUsOKUpeKUuOKVglwiXSxbXCJhZGExXCIsXCLikaBcIiwxOSxcIuKFoFwiLDldLFtcImFkYzBcIixcIuONieOMlOOMouONjeOMmOOMp+OMg+OMtuONkeONl+OMjeOMpuOMo+OMq+ONiuOMu+OOnOOOneOOnuOOjuOOj+OPhOOOoVwiXSxbXCJhZGRmXCIsXCLjjbvjgJ3jgJ/ihJbjj43ihKHjiqRcIiw0LFwi44ix44iy44i5442+442944284omS4omh4oir4oiu4oiR4oia4oql4oig4oif4oq/4oi14oip4oiqXCJdLFtcImIwYTFcIixcIuS6nOWUluWog+mYv+WTgOaEm+aMqOWntumAouiRteiMnOepkOaCquaPoea4peaXreiRpuiKpumvteaik+Wcp+aWoeaJseWum+WnkOiZu+mjtOe1oue2vumujuaIlueyn+iit+WuieW6teaMieaal+ahiOmXh+mejeadj+S7peS8iuS9jeS+neWBieWbsuWkt+WnlOWogeWwieaDn+aEj+aFsOaYk+akheeCuueVj+eVsOenu+e2ree3r+iDg+iQjuiho+isgumBlemBuuWMu+S6leS6peWfn+iCsumDgeejr+S4gOWjsea6oumAuOeosuiMqOiKi+mwr+WFgeWNsOWSveWToeWboOWnu+W8lemjsua3q+iDpOiUrVwiXSxbXCJiMWExXCIsXCLpmaLpmbDpmqDpn7vlkIvlj7Plrofng4/nvr3ov4Lpm6jlja/ptZznqrrkuJHnopPoh7zmuKblmJjllITmrJ3olJrpsLvlp6Xljqnmtabnk5zplo/lmYLkupHpgYvpm7LojY/ppIzlj6HllrblrLDlvbHmmKDmm7PmoITmsLjms7PmtKnnkZvnm4jnqY7poLToi7HooZvoqaDpi63mtrLnlqvnm4rpp4XmgqborIHotorplrLmpo7ljq3lhoblnJLloLDlpYTlrrTlu7bmgKjmjqnmj7Tmsr/mvJTngo7nhJTnhZnnh5XnjL/nuIHoibboi5HolpfpgaDpiZvptJvloanmlrzmsZrnlKXlh7nlpK7lpaXlvoDlv5xcIl0sW1wiYjJhMVwiLFwi5oq85pe65qiq5qyn5q60546L57+B6KWW6bSs6bSO6buE5bKh5rKW6I275YSE5bGL5oa26IeG5qG254mh5LmZ5L+65Y245oGp5rip56mP6Z+z5LiL5YyW5Luu5L2V5Ly95L6h5L2z5Yqg5Y+v5ZiJ5aSP5auB5a625a+h56eR5pqH5p6c5p625q2M5rKz54Gr54+C56aN56a+56i8566H6Iqx6Iub6IyE6I236I+v6I+T6J2m6Kqy5Zip6LKo6L+m6YGO6Zye6JqK5L+E5bOo5oiR54mZ55S76Iel6Iq96Ju+6LOA6ZuF6aST6aeV5LuL5Lya6Kej5Zue5aGK5aOK5bu75b+r5oCq5oKU5oGi5oeQ5oiS5ouQ5pS5XCJdLFtcImIzYTFcIixcIumtgeaZpuaisOa1t+eBsOeVjOeahue1teiKpeifuemWi+majuiyneWHseWKvuWkluWSs+Wus+W0luaFqOamgua2r+eijeiTi+ihl+ipsumOp+mquOa1rOmmqOibmeWeo+afv+ibjumIjuWKg+Wah+WQhOW7k+aLoeaSueagvOaguOauu+eNsueiuuepq+immuinkui1q+i8g+mDremWo+malOmdqeWtpuWys+alvemhjemhjuaOm+esoOaoq+apv+aitumwjea9n+WJsuWWneaBsOaLrOa0u+a4h+a7keiRm+ikkOi9hOS4lOmwueWPtuakm+aouumehOagquWFnOerg+iSsumHnOmOjOWZm+m0qOagouiMheiQsVwiXSxbXCJiNGExXCIsXCLnsqXliIjoi4Xnk6bkub7kvoPlhqDlr5LliIrli5jli6flt7vllprloKrlp6blrozlrpjlr5vlubLlubnmgqPmhJ/mhaPmhr7mj5vmlaLmn5HmoZPmo7rmrL7mrZPmsZfmvKLmvpfmvYXnkrDnlJjnm6PnnIvnq7/nrqHnsKHnt6nnvLbnv7Dogp3oiabojp7oprPoq4zosqvpgoTpkZHplpPplpHplqLpmaXpn5PppKjoiJjkuLjlkKvlsrjlt4znjqnnmYznnLzlsqnnv6votIvpm4HpoJHpoZTpoZjkvIHkvI7ljbHllpzlmajln7rlpYflrInlr4TlspDluIzlub7lv4zmj67mnLrml5fml6LmnJ/mo4vmo4RcIl0sW1wiYjVhMVwiLFwi5qmf5biw5q+F5rCX5rG955W/56WI5a2j56iA57SA5b696KaP6KiY6LK06LW36LuM6Lyd6aOi6aiO6ay85LqA5YG95YSA5aaT5a6c5oiv5oqA5pOs5qy654qg55aR56WH576p6J+76Kq86K2w5o6s6I+K6Z6g5ZCJ5ZCD5Zar5qGU5qmY6Kmw56Cn5p216buN5Y205a6i6ISa6JmQ6YCG5LiY5LmF5LuH5LyR5Y+K5ZC45a6u5byT5oCl5pWR5py95rGC5rGy5rOj54G455CD56m256qu56yI57Sa57O+57Wm5pen54mb5Y675bGF5beo5ouS5oug5oyZ5rig6Jma6Kix6Led6Yu45ryB56am6a2a5Lqo5Lqr5LqsXCJdLFtcImI2YTFcIixcIuS+m+S+oOWDkeWFh+ertuWFseWHtuWNlOWMoeWNv+WPq+WWrOWig+WzoeW8t+W9iuaAr+aBkOaBreaMn+aVmeapi+azgeeLgueLreefr+iDuOiEheiIiOiVjumDt+mPoemfv+mll+mpmuS7sOWHneWwreaagealreWxgOabsualteeOieahkOeygeWDheWLpOWdh+W3vumMpuaWpOaso+asveeQtOemgeemveeti+e3iuiKueiPjOihv+iln+isuei/kemHkeWQn+mKgOS5neWAtuWPpeWMuueLl+eOluefqeiLpui6r+mnhumniOmnkuWFt+aEmuiZnuWWsOepuuWBtuWvk+mBh+maheS4suarm+mHp+WxkeWxiFwiXSxbXCJiN2ExXCIsXCLmjpjnqp/mspPpnbTovaHnqqrnhorpmojnsoLmoJfnubDmoZHpjazli7LlkJvolqvoqJPnvqTou43pg6HljabooojnpYHkv4Llgr7liJHlhYTllZPlnK3nj6rlnovlpZHlvaLlvoTmgbXmhbbmhafmhqnmjrLmkLrmlazmma/moYLmuJPnlabnqL3ns7vntYzntpnnuYvnvavojI7ojYrom43oqIjoqaPorabou73poJrpto/oirjov47pr6jliofmiJ/mkoPmv4DpmpnmoYHlgpHmrKDmsbrmvZTnqbTntZDooYDoqKPmnIjku7blgLnlgKblgaXlhbzliLjliaPllqflnI/loIXlq4zlu7rmhrLmh7jmi7PmjbJcIl0sW1wiYjhhMVwiLFwi5qSc5qip54m954qs54yu56CU56Gv57W555yM6IKp6KaL6KyZ6LOi6LuS6YGj6Y216Zm66aGV6aiT6bm45YWD5Y6f5Y6z5bm75bym5rib5rqQ546E54++57WD6Ii36KiA6Ku66ZmQ5LmO5YCL5Y+k5ZG85Zu65aeR5a2k5bex5bqr5byn5oi45pWF5p6v5rmW54uQ57OK6KK06IKh6IOh6I+w6JmO6KqH6Leo6Yi36ZuH6aGn6byT5LqU5LqS5LyN5Y2I5ZGJ5ZC+5aiv5b6M5b6h5oKf5qKn5qqO55Ga56KB6Kqe6Kqk6K236YaQ5Lme6a+J5Lqk5L285L6v5YCZ5YCW5YWJ5YWs5Yqf5Yq55Yu+5Y6a5Y+j5ZCRXCJdLFtcImI5YTFcIixcIuWQjuWWieWdkeWeouWlveWtlOWtneWuj+W3peW3p+W3t+W5uOW6g+W6muW6t+W8mOaBkuaFjOaKl+aLmOaOp+aUu+aYguaZg+abtOadreagoeail+ani+axn+a0qua1qea4r+a6neeUsueah+ehrOeov+ezoOe0hee0mOe1nue2seiAleiAg+iCr+iCseiFlOiGj+iIquiNkuihjOihoeism+iyouizvOmDiumFtemJseegv+mLvOmWpOmZjemghemmmemrmOm0u+WJm+WKq+WPt+WQiOWjleaLt+a/oOixqui9n+m6ueWFi+WIu+WRiuWbveepgOmFt+m1oOm7kueNhOa8ieiFsOeUkeW/veaDmumqqOeLm+i+vFwiXSxbXCJiYWExXCIsXCLmraTpoIPku4rlm7DlnaTlor7lqZrmgajmh4fmmI/mmIbmoLnmorHmt7fnl5XntLroia7prYLkupvkvZDlj4nllIblta/lt6blt67mn7vmspnnkbPnoILoqZDpjpboo5/lnZDluqfmjKvlgrXlgqzlho3mnIDlk4nloZ7lprvlrrDlvanmiY3mjqHmoL3mrbPmuIjngb3ph4fnioDnoJXnoKbnpa3mlo7ntLDoj5zoo4HovInpmpvliaTlnKjmnZDnvarosqHlhrTlnYLpmKrloLrmporogrTlkrLltI7ln7znopXpt7rkvZzliYrlkovmkL7mmKjmnJTmn7XnqoTnrZbntKLpjK/moZzprq3nrLnljJnlhorliLdcIl0sW1wiYmJhMVwiLFwi5a+f5ou25pKu5pOm5pyt5q666Jap6ZuR55qQ6a+W5o2M6YyG6a6r55q/5pmS5LiJ5YKY5Y+C5bGx5oOo5pKS5pWj5qGf54em54+K55Sj566X57qC6JqV6K6D6LOb6YW46aSQ5pas5pqr5q6L5LuV5LuU5Ly65L2/5Yi65Y+45Y+y5Zej5Zub5aOr5aeL5aeJ5ae/5a2Q5bGN5biC5bir5b+X5oCd5oyH5pSv5a2c5pav5pa95peo5p6d5q2i5q275rCP542F56WJ56eB57O457SZ57Sr6IKi6ISC6Iez6KaW6Kme6Kmp6Kmm6KqM6Kuu6LOH6LOc6ZuM6aO85q2v5LqL5Ly85L6N5YWQ5a2X5a+65oWI5oyB5pmCXCJdLFtcImJjYTFcIixcIuasoea7i+ayu+eIvueSveeXlOejgeekuuiAjOiAs+iHquiSlOi+nuaxkOm5v+W8j+itmOm0q+eruui7uOWujembq+S4g+WPseWft+WkseWrieWupOaCiea5v+a8hueWvuizquWun+iUgOevoOWBsuaftOiKneWxoeiViue4nuiIjuWGmeWwhOaNqOi1puaWnOeFruekvue0l+iAheisnei7iumBruibh+mCquWAn+WLuuWwuuadk+eBvOeItemFjOmHiOmMq+iLpeWvguW8seaDueS4u+WPluWuiOaJi+acseauiueLqeePoOeoruiFq+i2o+mFkummluWEkuWPl+WRquWvv+aOiOaouee2rOmcgOWbmuWPjuWRqFwiXSxbXCJiZGExXCIsXCLlrpflsLHlt57kv67mhIHmi77mtLLnp4Dnp4vntYLnuY3nv5Loh63oiJ/okpDooYbopbLorpDoubTovK/pgLHphYvphazpm4bphpzku4DkvY/lhYXljYHlvpPmiI7mn5TmsYHmuIvnjaPnuKbph43pioPlj5TlpJnlrr/mt5HnpZ3nuK7nspvlob7nhp/lh7rooZPov7Dkv4rls7vmmKXnnqznq6PoiJzpp7/lh4blvqrml6zmpa/mronmt7PmupbmvaTnm77ntJTlt6HpgbXphofpoIblh6bliJ3miYDmmpHmm5nmuJrlurbnt5LnvbLmm7jolq/ol7foq7jliqnlj5nlpbPluo/lvpDmgZXpi6TpmaTlgrflhJ9cIl0sW1wiYmVhMVwiLFwi5Yud5Yyg5Y2H5Y+s5ZOo5ZWG5ZSx5ZiX5aWo5aa+5ai85a615bCG5bCP5bCR5bCa5bqE5bqK5bug5b2w5om/5oqE5oub5o6M5o235piH5piM5pit5pm25p2+5qKi5qif5qi15rK85raI5riJ5rmY54S854Sm54Wn55eH55yB56Gd56SB56Wl56ew56ug56yR57Kn57S56IKW6I+W6JKL6JWJ6KGd6KOz6Kif6Ki86KmU6Kmz6LGh6LOe6Yak6Ymm6Y2+6ZCY6Zqc6Z6Y5LiK5LiI5Lie5LmX5YaX5Ymw5Z+O5aC05aOM5ayi5bi45oOF5pO+5p2h5p2W5rWE54q255Wz56mj6JK46K2y6Ya46Yyg5Zix5Z+06aO+XCJdLFtcImJmYTFcIixcIuaLreakjeaulueHree5lOiBt+iJsuinpumjn+idlei+seWwu+S8uOS/oeS+teWUh+WooOWvneWvqeW/g+aFjuaMr+aWsOaZi+ajruamm+a1uOa3seeUs+eWueecn+elnuenpue0s+iHo+iKr+iWquimquiouui6q+i+m+mAsumHnemch+S6uuS7geWIg+WhteWjrOWwi+eUmuWwveiFjuioiui/hemZo+mdreespeirj+mgiOmFouWbs+WOqOmAl+WQueWeguW4peaOqOawtOeCiuedoeeyi+e/oOihsOmBgumFlOmMkOmMmOmaj+eRnumrhOW0h+W1qeaVsOaeoui2qOmbm+aNruadieakmeiPhemgl+mbgOijvlwiXSxbXCJjMGExXCIsXCLmvoTmkbrlr7jkuJbngKznlZ3mmK/lh4TliLbli6Llp5PlvoHmgKfmiJDmlL/mlbTmmJ/mmbTmo7LmoJbmraPmuIXnibLnlJ/nm5vnsr7ogZblo7Doo73opb/oqqDoqpPoq4vpgJ3phpLpnZLpnZnmlonnqI7ohIbpmrvluK3mg5zmiJrmlqXmmJTmnpDnn7PnqY3nsY3nuL7ohIrosqzotaTot6HouZ/noqnliIfmi5nmjqXmkYLmipjoqK3nqoPnr4Doqqzpm6rntbboiIzonYnku5nlhYjljYPljaDlrqPlsILlsJblt53miKbmiYfmkrDmoJPmoLTms4nmtYXmtJfmn5PmvZznhY7nhb3ml4vnqb/nrq3nt5pcIl0sW1wiYzFhMVwiLFwi57mK576o6IW66Iib6Ii56Jam6Kmu6LOO6Le16YG46YG36Yqt6YqR6ZaD6a6u5YmN5ZaE5ry454S25YWo56aF57mV6Iaz57OO5ZmM5aGR5bKo5o6q5pu+5pu95qWa54uZ55aP55aO56SO56WW56ef57KX57Sg57WE6JiH6Ki06Zi76YGh6byg5YOn5Ym15Y+M5Y+i5YCJ5Zaq5aOu5aWP54i95a6L5bGk5Yyd5oOj5oOz5o2c5o6D5oy/5o675pON5pep5pu55bej5qeN5qe95ryV54el5LqJ55ep55u456qT57Of57eP57ac6IGh6I2J6I2Y6JGs6JK86Je76KOF6LWw6YCB6YGt6Y6X6Zyc6aiS5YOP5aKX5oaOXCJdLFtcImMyYTFcIixcIuiHk+iUtei0iOmAoOS/g+WBtOWJh+WNs+aBr+aNieadn+a4rOi2s+mAn+S/l+WxnuiziuaXj+e2muWNkuiiluWFtuaPg+WtmOWtq+WwiuaQjeadkemBnOS7luWkmuWkquaxsOipkeWUvuWgleWmpeaDsOaJk+afgeiIteallemZgOmnhOmoqOS9k+WghuWvvuiAkOWyseW4r+W+heaAoOaFi+aItOabv+azsOa7nuiDjuiFv+iLlOiii+iyuOmAgOmArumaium7m+mvm+S7o+WPsOWkp+esrOmGjemhjOm3uea7neeAp+WNk+WVhOWuheaJmOaKnuaLk+ayoua/r+eQouiol+mQuOa/geirvuiMuOWHp+ibuOWPqlwiXSxbXCJjM2ExXCIsXCLlj6nkvYbpgZTovrDlparohLHlt73nq6rovr/mo5rosLfni7jpsYjmqL3oqrDkuLnljZjlmIblnabmi4XmjqLml6bmrY7mt6HmuZvngq3nn63nq6/nrqrntrvogL3og4bom4voqpXpjZvlm6Plo4flvL7mlq3mmpbmqoDmrrXnlLfoq4flgKTnn6XlnLDlvJvmgaXmmbrmsaDnl7TnqJrnva7oh7TonJjpgYXpprPnr4nnlZznq7nnrZHok4TpgJDnp6nnqpLojLblq6HnnYDkuK3ku7Llrpnlv6Dmir3mmLzmn7Hms6jomavoobfoqLvphY7pi7Ppp5DmqJfngKbnjKroi6fokZfosq/kuIHlhYblh4vllovlr7VcIl0sW1wiYzRhMVwiLFwi5biW5biz5bqB5byU5by15b2r5b605oey5oyR5pqi5pyd5r2u54mS55S655y66IG06IS56IW46J226Kq/6Kuc6LaF6Lez6Yqa6ZW36aCC6bOl5YuF5o2X55u05pyV5rKI54+N6LOD6Y6u6Zmz5rSl5aKc5qSO5qeM6L+96Y6a55eb6YCa5aGa5qCC5o605qe75L2D5rys5p+Y6L676JSm57a06Y2U5qS/5r2w5Z2q5aO35ays57Ss54iq5ZCK6Yej6ba05Lqt5L2O5YGc5YG15YmD6LKe5ZGI5aCk5a6a5bid5bqV5bqt5bu35byf5oKM5oq15oy65o+Q5qKv5rGA56KH56aO56iL57eg6ImH6KiC6Kum6LmE6YCTXCJdLFtcImM1YTFcIixcIumCuOmEremHmOm8juazpeaRmOaTouaVtea7tOeahOesm+mBqemPkea6uuWTsuW+ueaSpOi9jei/remJhOWFuOWhq+WkqeWxleW6l+a3u+e6j+eUnOiyvOi7oumhm+eCueS8neauv+a+seeUsOmbu+WFjuWQkOWgteWhl+WmrOWxoOW+kuaWl+adnOa4oeeZu+iPn+izremAlOmDvemNjeegpeeguuWKquW6puWcn+WltOaAkuWAkuWFmuWGrOWHjeWIgOWUkOWhlOWhmOWll+WuleWztuW2i+aCvOaKleaQreadseahg+aivOajn+ebl+a3mOa5r+a2m+eBr+eHiOW9k+eXmOelt+etieetlOetkuezlue1seWIsFwiXSxbXCJjNmExXCIsXCLokaPolanol6ToqI7orITosYbouI/pgIPpgI/pkJnpmbbpoK3pqLDpl5jlg43li5XlkIzloILlsI7mhqfmkp7mtJ7nnrPnq6Xog7TokITpgZPpioXls6DptIfljL/lvpflvrPmtpznibnnnaPnpr/nr6Tmr5Lni6zoqq3moIPmqaHlh7jnqoHmpLTlsYrps7boi6vlr4XphYnngJ7lmbjlsa/mg4fmlabmsozosZrpgYHpoJPlkZHmm4fpiI3lpYjpgqPlhoXkuY3lh6rolpnorI7ngZjmjbrpjYvmpaLpprTnuITnlbfljZfmpaDou5/pm6PmsZ3kuozlsLzlvJDov6nljILos5Hogonombnlu7/ml6XkubPlhaVcIl0sW1wiYzdhMVwiLFwi5aaC5bC/6Z+u5Lu75aaK5b+N6KqN5r+h56aw56Wi5a+n6JGx54yr54ax5bm05b+15o275pKa54eD57KY5LmD5bu85LmL5Z+c5Zqi5oKp5r+D57SN6IO96ISz6Ia/6L6y6KaX6Jqk5be05oqK5pKt6KaH5p235rOi5rS+55C256C05amG57216Iqt6aas5L+z5buD5oud5o6S5pWX5p2v55uD54mM6IOM6IK66Lyp6YWN5YCN5Z+55aqS5qKF5qWz54Wk54u96LK35aOy6LOg6Zmq6YCZ6J2/56ek55+n6JCp5Lyv5Yml5Y2a5ouN5p+P5rOK55m9566U57KV6Ii26JaE6L+r5pud5ryg54iG57ib6I6r6aeB6bqmXCJdLFtcImM4YTFcIixcIuWHveeuseehsueuuOiCh+etiOarqOW5oeiCjOeVkeeVoOWFq+mJoua6jOeZuumGl+mrquS8kOe9sOaKnOetj+mWpemzqeWZuuWhmeibpOmavOS8tOWIpOWNiuWPjeWPm+W4huaQrOaWkeadv+awvuaxjueJiOeKr+ePreeVlOe5geiIrOiXqeiyqeevhOmHhueFqemgkumjr+aMveaZqeeVquebpOejkOiVg+ibruWMquWNkeWQpuWmg+W6h+W9vOaCsuaJieaJueaKq+aWkOavlOazjOeWsuearueikeenmOe3i+e9t+iCpeiiq+iqueiyu+mBv+mdnumjm+aoi+ewuOWCmeWwvuW+ruaeh+avmOeQteeciee+jlwiXSxbXCJjOWExXCIsXCLpvLvmn4rnqJfljLnnlovpq63lvabohp3oj7HogpjlvLzlv4XnlaLnrYbpgLzmoaflp6vlqpvntJDnmb7orKzkv7XlvarmqJnmsLfmvILnk6LnpajooajoqZXosbnlu5/mj4/nl4Xnp5Loi5fpjKjpi7Lokpzom63psK3lk4HlvazmlozmtZzngJXosqfos5PpoLvmlY/nk7bkuI3ku5jln6DlpKvlqablr4zlhqjluIPlupzmgJbmibbmlbfmlqfmma7mta7niLbnrKbohZDohproipnorZzosqDos6botbTpmJzpmYTkvq7mkqvmraboiJ7okaHolarpg6jlsIHmpZPpoqjokbrolZfkvI/lia/lvqnluYXmnI1cIl0sW1wiY2FhMVwiLFwi56aP6IW56KSH6KaG5re15byX5omV5rK45LuP54mp6a6S5YiG5ZC75Zm05aKz5oak5omu54Sa5aWu57KJ57Oe57Sb6Zuw5paH6IGe5LiZ5L215YW15aGA5bmj5bmz5byK5p+E5Lim6JS96ZaJ6Zmb57Gz6aCB5YO75aOB55mW56Kn5Yil556l6JSR566G5YGP5aSJ54mH56+H57eo6L666L+U6YGN5L6/5YuJ5aip5byB6Z6t5L+d6IiX6Yuq5ZyD5o2V5q2p55Sr6KOc6LyU56mC5Yuf5aKT5oWV5oiK5pqu5q+N57C/6I+p5YCj5L+45YyF5ZGG5aCx5aWJ5a6d5bOw5bOv5bSp5bqW5oqx5o2n5pS+5pa55pyLXCJdLFtcImNiYTFcIixcIuazleazoeeDueegsue4q+iDnuiKs+iQjOiTrOicguikkuioquixiumCpumLkumjvemzs+m1rOS5j+S6oeWCjeWJluWdiuWmqOW4veW/mOW/meaIv+aatOacm+afkOajkuWGkue0oeiCquiGqOisgOiyjOiyv+mJvumYsuWQoOmgrOWMl+WDleWNnOWiqOaSsuactOeJp+edpuephumHpuWLg+ayoeauhuWggOW5jOWllOacrOe/u+WHoeebhuaRqeejqOmtlOm6u+Wfi+WmueaYp+aemuavjuWTqeanmeW5leiGnOaelemuquafvumxkuahneS6puS/o+WPiOaKueacq+ayq+i/hOS+ree5rem6v+S4h+aFoua6gFwiXSxbXCJjY2ExXCIsXCLmvKvolJPlkbPmnKrprYXlt7PnrpXlsqzlr4bonJzmuYrok5HnqJTohIjlppnnso3msJHnnKDli5nlpKLnhKHniZ/nn5vpnKfptaHmpIvlqb/lqJjlhqXlkI3lkb3mmI7nm5/ov7fpipjps7Tlp6rniZ3mu4XlhY3mo4nntr/nt6zpnaLpurrmkbjmqKHojILlpoTlrZ/mr5vnjJvnm7LntrLogJfokpnlhLLmnKjpu5nnm67mnaLli7/ppIXlsKTmiLvnsb7osrDllY/mgrbntIvploDljIHkuZ/lhrblpJzniLrogLbph47lvKXnn6LljoTlvbnntITolqzoqLPouo3pnZbmn7Polq7pkZPmhInmhIjmsrnnmZJcIl0sW1wiY2RhMVwiLFwi6Kut6Ly45ZSv5L2R5YSq5YuH5Y+L5a6l5bm95oKg5oaC5o+W5pyJ5p+a5rmn5raM54y254y355Sx56WQ6KOV6KqY6YGK6YKR6YO16ZuE6J6N5aSV5LqI5L2Z5LiO6KqJ6Ly/6aCQ5YKt5bm85aaW5a655bq45o+a5o+65pOB5puc5qWK5qeY5rSL5rq254aU55So56qv576K6ICA6JGJ6JOJ6KaB6Kyh6LiK6YGl6Zm96aSK5oW+5oqR5qyy5rKD5rW057+M57+85reA576F6J666KO45p2l6I6x6aC86Zu35rSb57Wh6JC96YWq5Lmx5Y215bWQ5qyE5r+r6JeN6Jit6Kan5Yip5ZCP5bGl5p2O5qKo55CG55KDXCJdLFtcImNlYTFcIixcIueXouijj+ijoemHjOmboumZuOW+i+eOh+eri+iRjuaOoOeVpeWKiea1gea6nOeQieeVmeehq+eykumahuernOm+jeS+tuaFruaXheiZnOS6huS6ruWDmuS4oeWHjOWvruaWmeaigea2vOeMn+eZgueereeonOezp+iJr+irkumBvOmHj+mZtemgmOWKm+e3keWAq+WOmOael+a3i+eHkOeQs+iHqOi8qumao+mxl+m6n+eRoOWhgea2mee0r+mhnuS7pOS8tuS+i+WGt+WKseW2uuaAnOeOsuekvOiLk+mItOmat+mbtumcium6l+m9ouaapuattOWIl+WKo+eDiOijguW7ieaBi+aGkOa8o+eFieewvue3tOiBr1wiXSxbXCJjZmExXCIsXCLok67pgKPpjKzlkYLpra/mq5Pngonos4Lot6/pnLLlirTlqYHlu4rlvITmnJfmpbzmppTmtarmvI/niaLni7znr63ogIHogb7onYvpg47lha3pupPnpoTogovpjLLoq5blgK3lkozoqbHmraros4TohIfmg5HmnqDpt7LkupnkupjpsJDoqavol4HolajmpIDmub7nopfohZVcIl0sW1wiZDBhMVwiLFwi5byM5LiQ5LiV5Liq5Lix5Li25Li85Li/5LmC5LmW5LmY5LqC5LqF6LGr5LqK6IiS5byN5LqO5Lqe5Lqf5Lqg5Lqi5Lqw5Lqz5Lq25LuO5LuN5LuE5LuG5LuC5LuX5Lue5Lut5Luf5Lu35LyJ5L2a5Lyw5L2b5L2d5L2X5L2H5L225L6I5L6P5L6Y5L275L2p5L2w5L6R5L2v5L6G5L6W5YSY5L+U5L+f5L+O5L+Y5L+b5L+R5L+a5L+Q5L+k5L+l5YCa5YCo5YCU5YCq5YCl5YCF5Lyc5L+25YCh5YCp5YCs5L++5L+v5YCR5YCG5YGD5YGH5pyD5YGV5YGQ5YGI5YGa5YGW5YGs5YG45YKA5YKa5YKF5YK05YKyXCJdLFtcImQxYTFcIixcIuWDieWDiuWCs+WDguWDluWDnuWDpeWDreWDo+WDruWDueWDteWEieWEgeWEguWEluWEleWElOWEmuWEoeWEuuWEt+WEvOWEu+WEv+WFgOWFkuWFjOWFlOWFoueruOWFqeWFquWFruWGgOWGguWbmOWGjOWGieWGj+WGkeWGk+WGleWGluWGpOWGpuWGouWGqeWGquWGq+WGs+WGseWGsuWGsOWGteWGveWHheWHieWHm+WHoOiZleWHqeWHreWHsOWHteWHvuWIhOWIi+WIlOWIjuWIp+WIquWIruWIs+WIueWJj+WJhOWJi+WJjOWJnuWJlOWJquWJtOWJqeWJs+WJv+WJveWKjeWKlOWKkuWJseWKiOWKkei+qFwiXSxbXCJkMmExXCIsXCLovqfliqzliq3lirzlirXli4Hli43li5fli57li6Pli6bpo63li6Dli7Pli7Xli7jli7nljIbljIjnlLjljI3ljJDljI/ljJXljJrljKPljK/ljLHljLPljLjljYDljYbljYXkuJfljYnljY3lh5bljZ7ljanlja7lpJjljbvljbfljoLljpbljqDljqbljqXljq7ljrDljrblj4PnsJLpm5nlj5/mm7znh67lj67lj6jlj63lj7rlkIHlkL3lkYDlkKzlkK3lkLzlkK7lkLblkKnlkJ3lkY7lko/lkbXlko7lkZ/lkbHlkbflkbDlkpLlkbvlkoDlkbblkoTlkpDlkoblk4flkqLlkrjlkqXlkqzlk4Tlk4jlkqhcIl0sW1wiZDNhMVwiLFwi5ZKr5ZOC5ZKk5ZK+5ZK85ZOY5ZOl5ZOm5ZSP5ZSU5ZO95ZOu5ZOt5ZO65ZOi5ZS55ZWA5ZWj5ZWM5ZSu5ZWc5ZWF5ZWW5ZWX5ZS45ZSz5ZWd5ZaZ5ZaA5ZKv5ZaK5Zaf5ZW75ZW+5ZaY5Zae5Zau5ZW85ZaD5Zap5ZaH5Zao5Zea5ZeF5Zef5ZeE5Zec5Zek5ZeU5ZiU5Ze35ZiW5Ze+5Ze95Zib5Ze55ZmO5ZmQ54ef5Zi05Zi25Ziy5Zi45Zmr5Zmk5Ziv5Zms5Zmq5ZqG5ZqA5ZqK5Zqg5ZqU5ZqP5Zql5Zqu5Zq25Zq05ZuC5Zq85ZuB5ZuD5ZuA5ZuI5ZuO5ZuR5ZuT5ZuX5Zuu5Zu55ZyA5Zu/5ZyE5ZyJXCJdLFtcImQ0YTFcIixcIuWciOWci+WcjeWck+WcmOWcluWXh+WcnOWcpuWct+WcuOWdjuWcu+WdgOWdj+WdqeWfgOWeiOWdoeWdv+WeieWek+WeoOWes+WepOWequWesOWfg+WfhuWflOWfkuWfk+WgiuWfluWfo+Wgi+WgmeWgneWhsuWgoeWhouWhi+WhsOavgOWhkuWgveWhueWiheWiueWin+Wiq+WiuuWjnuWiu+WiuOWiruWjheWjk+WjkeWjl+WjmeWjmOWjpeWjnOWjpOWjn+Wjr+WjuuWjueWju+WjvOWjveWkguWkiuWkkOWkm+aipuWkpeWkrOWkreWksuWkuOWkvuerkuWlleWlkOWljuWlmuWlmOWlouWloOWlp+WlrOWlqVwiXSxbXCJkNWExXCIsXCLlpbjlpoHlpp3kvZ7kvqvlpqPlprLlp4blp6jlp5zlpo3lp5nlp5rlqKXlqJ/lqJHlqJzlqInlqJrlqYDlqazlqYnlqLXlqLblqaLlqarlqprlqrzlqr7lq4vlq4Llqr3lq6Plq5flq6blq6nlq5blq7rlq7vlrIzlrIvlrJblrLLlq5DlrKrlrLblrL7lrYPlrYXlrYDlrZHlrZXlrZrlrZvlraXlranlrbDlrbPlrbXlrbjmlojlrbrlroDlroPlrqblrrjlr4Plr4flr4nlr5Tlr5Dlr6Tlr6blr6Llr57lr6Xlr6vlr7Dlr7blr7PlsIXlsIflsIjlsI3lsJPlsKDlsKLlsKjlsLjlsLnlsYHlsYblsY7lsZNcIl0sW1wiZDZhMVwiLFwi5bGQ5bGP5a2x5bGs5bGu5Lmi5bG25bG55bKM5bKR5bKU5aab5bKr5bK75bK25bK85bK35bOF5bK+5bOH5bOZ5bOp5bO95bO65bOt5baM5bOq5bSL5bSV5bSX5bWc5bSf5bSb5bSR5bSU5bSi5bSa5bSZ5bSY5bWM5bWS5bWO5bWL5bWs5bWz5bW25baH5baE5baC5bai5bad5bas5bau5ba95baQ5ba35ba85beJ5beN5beT5beS5beW5beb5ber5bey5be15biL5bia5biZ5biR5bib5bi25bi35bmE5bmD5bmA5bmO5bmX5bmU5bmf5bmi5bmk5bmH5bm15bm25bm66bq85bm/5bqg5buB5buC5buI5buQ5buPXCJdLFtcImQ3YTFcIixcIuW7luW7o+W7neW7muW7m+W7ouW7oeW7qOW7qeW7rOW7seW7s+W7sOW7tOW7uOW7vuW8g+W8ieW9neW9nOW8i+W8keW8luW8qeW8reW8uOW9geW9iOW9jOW9juW8r+W9keW9luW9l+W9meW9oeW9reW9s+W9t+W+g+W+guW9v+W+iuW+iOW+keW+h+W+nuW+meW+mOW+oOW+qOW+reW+vOW/luW/u+W/pOW/uOW/seW/neaCs+W/v+aAoeaBoOaAmeaAkOaAqeaAjuaAseaAm+aAleaAq+aApuaAj+aAuuaBmuaBgeaBquaBt+aBn+aBiuaBhuaBjeaBo+aBg+aBpOaBguaBrOaBq+aBmeaCgeaCjeaDp+aCg+aCmlwiXSxbXCJkOGExXCIsXCLmgoTmgpvmgpbmgpfmgpLmgqfmgovmg6Hmgrjmg6Dmg5PmgrTlv7Dmgr3mg4bmgrXmg5jmhY3mhJXmhIbmg7bmg7fmhIDmg7Tmg7rmhIPmhKHmg7vmg7HmhI3mhI7mhYfmhL7mhKjmhKfmhYrmhL/mhLzmhKzmhLTmhL3mhYLmhYTmhbPmhbfmhZjmhZnmhZrmhavmhbTmha/mhaXmhbHmhZ/mhZ3mhZPmhbXmhpnmhpbmhofmhqzmhpTmhprmhormhpHmhqvmhq7mh4zmh4rmh4nmh7fmh4jmh4Pmh4bmhrrmh4vnvbnmh43mh6bmh6Pmh7bmh7rmh7Tmh7/mh73mh7zmh77miIDmiIjmiInmiI3miIzmiJTmiJtcIl0sW1wiZDlhMVwiLFwi5oie5oih5oiq5oiu5oiw5oiy5oiz5omB5omO5ome5omj5omb5omg5omo5om85oqC5oqJ5om+5oqS5oqT5oqW5ouU5oqD5oqU5ouX5ouR5oq75ouP5ou/5ouG5pOU5ouI5ouc5ouM5ouK5ouC5ouH5oqb5ouJ5oyM5ouu5oux5oyn5oyC5oyI5ouv5ou15o2Q5oy+5o2N5pCc5o2P5o6W5o6O5o6A5o6r5o225o6j5o6P5o6J5o6f5o615o2r5o2p5o6+5o+p5o+A5o+G5o+j5o+J5o+S5o+25o+E5pCW5pC05pCG5pCT5pCm5pC25pSd5pCX5pCo5pCP5pGn5pGv5pG25pGO5pSq5pKV5pKT5pKl5pKp5pKI5pK8XCJdLFtcImRhYTFcIixcIuaTmuaTkuaTheaTh+aSu+aTmOaTguaTseaTp+iIieaToOaToeaKrOaTo+aTr+aUrOaTtuaTtOaTsuaTuuaUgOaTveaUmOaUnOaUheaUpOaUo+aUq+aUtOaUteaUt+aUtuaUuOeVi+aViOaVluaVleaVjeaVmOaVnuaVneaVsuaVuOaWguaWg+iuiuaWm+aWn+aWq+aWt+aXg+aXhuaXgeaXhOaXjOaXkuaXm+aXmeaXoOaXoeaXseadsuaYiuaYg+aXu+ads+aYteaYtuaYtOaYnOaZj+aZhOaZieaZgeaZnuaZneaZpOaZp+aZqOaZn+aZouaZsOaag+aaiOaajuaaieaahOaamOaaneabgeaaueabieaavuaavFwiXSxbXCJkYmExXCIsXCLmm4Tmmrjmm5bmm5rmm6DmmL/mm6bmm6nmm7Dmm7Xmm7fmnI/mnJbmnJ7mnKbmnKfpnLjmnK7mnL/mnLbmnYHmnLjmnLfmnYbmnZ7mnaDmnZnmnaPmnaTmnonmnbDmnqnmnbzmnarmnozmnovmnqbmnqHmnoXmnrfmn6/mnrTmn6zmnrPmn6nmnrjmn6Tmn57mn53mn6Lmn67mnrnmn47mn4bmn6fmqpzmoJ7moYbmoKnmoYDmoY3moLLmoY7morPmoKvmoZnmoaPmobfmob/mop/moo/moq3mopTmop3mopvmooPmqq7mornmobTmorXmoqDmorrmpI/moo3mob7mpIHmo4rmpIjmo5jmpKLmpKbmo6HmpIzmo41cIl0sW1wiZGNhMVwiLFwi5qOU5qOn5qOV5qS25qSS5qSE5qOX5qOj5qSl5qO55qOg5qOv5qSo5qSq5qSa5qSj5qSh5qOG5qW55qW35qWc5qW45qWr5qWU5qW+5qWu5qS55qW05qS95qWZ5qSw5qWh5qWe5qWd5qaB5qWq5qay5qau5qeQ5qa/5qeB5qeT5qa+5qeO5a+o5qeK5qed5qa75qeD5qan5qiu5qaR5qag5qac5qaV5qa05qee5qeo5qiC5qib5qe/5qyK5qe55qey5qen5qiF5qax5qie5qet5qiU5qer5qiK5qiS5quB5qij5qiT5qmE5qiM5qmy5qi25qm45qmH5qmi5qmZ5qmm5qmI5qi45qii5qqQ5qqN5qqg5qqE5qqi5qqjXCJdLFtcImRkYTFcIixcIuaql+iYl+aqu+arg+arguaquOaqs+aqrOarnuarkearn+aqquarmuarquaru+asheiYluaruuaskuaslumsseasn+asuOast+ebnOasuemjruath+atg+atieatkOatmeatlOatm+atn+atoeatuOatueatv+augOauhOaug+aujeaumOauleaunuaupOauquauq+aur+ausuauseaus+aut+auvOavhuavi+avk+avn+avrOavq+avs+avr+m6vuawiOawk+awlOawm+awpOawo+axnuaxleaxouaxquayguayjeaymuaygeaym+axvuaxqOaxs+aykuaykOazhOazseazk+ayveazl+azheazneayruayseayvlwiXSxbXCJkZWExXCIsXCLmsrrms5vms6/ms5nms6rmtJ/ooY3mtLbmtKvmtL3mtLjmtJnmtLXmtLPmtJLmtIzmtaPmtpPmtaTmtZrmtbnmtZnmto7mtpXmv6TmtoXmt7nmuJXmuIrmtrXmt4fmt6bmtrjmt4bmt6zmt57mt4zmt6jmt5Lmt4Xmt7rmt5nmt6Tmt5Xmt6rmt67muK3mua7muK7muJnmubLmuZ/muL7muKPmuavmuKvmubbmuY3muJ/muYPmuLrmuY7muKTmu7/muJ3muLjmuoLmuqrmupjmu4nmurfmu5Pmur3muq/mu4TmurLmu5Tmu5Xmuo/muqXmu4Lmup/mvYHmvJHngYzmu6zmu7jmu77mvL/mu7LmvLHmu6/mvLLmu4xcIl0sW1wiZGZhMVwiLFwi5ry+5ryT5ru35r6G5r265r245r6B5r6A5r2v5r2b5r+z5r2t5r6C5r285r2Y5r6O5r6R5r+C5r2m5r6z5r6j5r6h5r6k5r655r+G5r6q5r+f5r+V5r+s5r+U5r+Y5r+x5r+u5r+b54CJ54CL5r+654CR54CB54CP5r++54Cb54Ca5r2054Cd54CY54Cf54Cw54C+54Cy54GR54Gj54KZ54KS54Kv54Ox54Ks54K454Kz54Ku54Of54OL54Od54OZ54SJ54O954Sc54SZ54Wl54WV54aI54Wm54Wi54WM54WW54Ws54aP54e754aE54aV54ao54as54eX54a554a+54eS54eJ54eU54eO54eg54es54en54e154e8XCJdLFtcImUwYTFcIixcIueHueeHv+eIjeeIkOeIm+eIqOeIreeIrOeIsOeIsueIu+eIvOeIv+eJgOeJhueJi+eJmOeJtOeJvueKgueKgeeKh+eKkueKlueKoueKp+eKueeKsueLg+eLhueLhOeLjueLkueLoueLoOeLoeeLueeLt+WAj+eMl+eMiueMnOeMlueMneeMtOeMr+eMqeeMpeeMvueNjueNj+m7mOeNl+eNqueNqOeNsOeNuOeNteeNu+eNuuePiOeOs+ePjueOu+ePgOePpeePruePnueSoueQheeRr+eQpeePuOeQsueQuueRleeQv+eRn+eRmeeRgeeRnOeRqeeRsOeRo+eRqueRtueRvueSi+eSnueSp+eTiueTj+eTlOePsVwiXSxbXCJlMWExXCIsXCLnk6Dnk6Pnk6fnk6nnk67nk7Lnk7Dnk7Hnk7jnk7fnlITnlIPnlIXnlIznlI7nlI3nlJXnlJPnlJ7nlKbnlKznlLznlYTnlY3nlYrnlYnnlZvnlYbnlZrnlannlaTnlafnlavnla3nlbjnlbbnlobnlofnlbTnlornlonnloLnlpTnlprnlp3nlqXnlqPnl4LnlrPnl4PnlrXnlr3nlrjnlrznlrHnl43nl4rnl5Lnl5nnl6Pnl57nl77nl7/nl7znmIHnl7Dnl7rnl7Lnl7PnmIvnmI3nmInnmJ/nmKfnmKDnmKHnmKLnmKTnmLTnmLDnmLvnmYfnmYjnmYbnmZznmZjnmaHnmaLnmajnmannmarnmafnmaznmbBcIl0sW1wiZTJhMVwiLFwi55my55m255m455m855qA55qD55qI55qL55qO55qW55qT55qZ55qa55qw55q055q455q555q655uC55uN55uW55uS55ue55uh55ul55un55uq6Jiv55u755yI55yH55yE55yp55yk55ye55yl55ym55yb55y355y4552H552a552o552r552b552l552/552+5525556O556L556R556g556e556w55625565556/55685569556755+H55+N55+X55+a55+c55+j55+u55+856CM56CS56Sm56Cg56Sq56GF56KO56G056KG56G856Ka56KM56Kj56K156Kq56Kv56OR56OG56OL56OU56K+56K856OF56OK56OsXCJdLFtcImUzYTFcIixcIuejp+ejmuejveejtOekh+ekkuekkeekmeekrOekq+elgOeloOell+eln+elmuelleelk+eluuelv+emiuemneemp+m9i+emquemruems+emueemuuenieenleenp+enrOenoeeno+eoiOeojeeomOeomeeooOeon+emgOeoseeou+eovueot+epg+epl+epieepoeepouepqem+neepsOepueepveeqiOeql+eqleeqmOeqlueqqeeriOeqsOeqtuerheerhOeqv+mCg+erh+eriuerjeerj+erleerk+ermeermuerneeroeerouerpuerreersOesguesj+esiueshuess+esmOesmeesnuesteesqOestuetkFwiXSxbXCJlNGExXCIsXCLnrbrnrITnrY3nrIvnrYznrYXnrbXnraXnrbTnrafnrbDnrbHnraznra7nrp3nrpjnrp/nro3nrpznrprnrovnrpLnro/nrZ3nrpnnr4vnr4Hnr4znr4/nrrTnr4bnr53nr6nnsJHnsJTnr6bnr6XnsaDnsIDnsIfnsJPnr7Pnr7fnsJfnsI3nr7bnsKPnsKfnsKrnsJ/nsLfnsKvnsL3nsYznsYPnsZTnsY/nsYDnsZDnsZjnsZ/nsaTnsZbnsaXnsaznsbXnsoPnspDnsqTnsq3nsqLnsqvnsqHnsqjnsrPnsrLnsrHnsq7nsrnnsr3ns4Dns4Xns4Lns5jns5Lns5zns6LprLvns6/ns7Lns7Tns7bns7rntIZcIl0sW1wiZTVhMVwiLFwi57SC57Sc57SV57SK57WF57WL57Su57Sy57S/57S157WG57Wz57WW57WO57Wy57Wo57Wu57WP57Wj57aT57aJ57Wb57aP57W957ab57a657au57aj57a157eH57a957ar57i957ai57av57ec57a457af57aw57eY57ed57ek57ee57e757ey57eh57iF57iK57ij57ih57iS57ix57if57iJ57iL57ii57mG57mm57i757i157i557mD57i357iy57i657mn57md57mW57me57mZ57ma57m557mq57mp57m857m757qD57eV57m96L6u57m/57qI57qJ57qM57qS57qQ57qT57qU57qW57qO57qb57qc57y457y6XCJdLFtcImU2YTFcIixcIue9hee9jOe9jee9jue9kOe9kee9lee9lOe9mOe9n+e9oOe9qOe9qee9p+e9uOe+gue+hue+g+e+iOe+h+e+jOe+lOe+nue+nee+mue+o+e+r+e+sue+uee+rue+tue+uOitsee/hee/hue/iue/lee/lOe/oee/pue/qee/s+e/uemjnOiAhuiAhOiAi+iAkuiAmOiAmeiAnOiAoeiAqOiAv+iAu+iBiuiBhuiBkuiBmOiBmuiBn+iBouiBqOiBs+iBsuiBsOiBtuiBueiBveiBv+iChOiChuiCheiCm+iCk+iCmuiCreWGkOiCrOiDm+iDpeiDmeiDneiDhOiDmuiDluiEieiDr+iDseiEm+iEqeiEo+iEr+iFi1wiXSxbXCJlN2ExXCIsXCLpmovohYbohL7ohZPohZHog7zohbHoha7ohaXohabohbTohoPohojohorohoDohoLohqDohpXohqTohqPohZ/ohpPohqnohrDohrXohr7ohrjohr3oh4Doh4Lohrroh4noh43oh5Hoh5noh5joh4joh5roh5/oh6Doh6foh7roh7voh77oiIHoiILoiIXoiIfoiIroiI3oiJDoiJboiKnoiKvoiLjoiLPoiYDoiZnoiZjoiZ3oiZroiZ/oiaToiaLoiajoiaroiavoiK7oibHoibfoibjoib7oio3oipLoiqvoip/oirvoiqzoi6Hoi6Poi5/oi5Loi7Toi7Poi7rojpPojIPoi7voi7noi57ojIboi5zojInoi5lcIl0sW1wiZThhMVwiLFwi6Iy16Iy06IyW6Iyy6Iyx6I2A6Iy56I2Q6I2F6Iyv6Iyr6IyX6IyY6I6F6I6a6I6q6I6f6I6i6I6W6Iyj6I6O6I6H6I6K6I286I616I2z6I216I6g6I6J6I6o6I+06JCT6I+r6I+O6I+96JCD6I+Y6JCL6I+B6I+36JCH6I+g6I+y6JCN6JCi6JCg6I696JC46JSG6I+76JGt6JCq6JC86JWa6JKE6JG36JGr6JKt6JGu6JKC6JGp6JGG6JCs6JGv6JG56JC16JOK6JGi6JK56JK/6JKf6JOZ6JON6JK76JOa6JOQ6JOB6JOG6JOW6JKh6JSh6JO/6JO06JSX6JSY6JSs6JSf6JSV6JSU6JO86JWA6JWj6JWY6JWIXCJdLFtcImU5YTFcIixcIuiVgeiYguiVi+iVleiWgOiWpOiWiOiWkeiWiuiWqOiVreiWlOiWm+iXquiWh+iWnOiVt+iVvuiWkOiXieiWuuiXj+iWueiXkOiXleiXneiXpeiXnOiXueiYiuiYk+iYi+iXvuiXuuiYhuiYouiYmuiYsOiYv+iZjeS5leiZlOiZn+iZp+iZseiak+iao+iaqeiaquiai+iajOiatuiar+ibhOibhuiasOibieigo+iaq+iblOibnuibqeibrOibn+ibm+ibr+ickuichuiciOicgOicg+ibu+ickeicieicjeibueiciuictOicv+ict+icu+icpeicqeicmuidoOidn+iduOidjOidjuidtOidl+idqOidruidmVwiXSxbXCJlYWExXCIsXCLonZPonaPonarooIXonqLonp/onoLonq/on4vonr3on4Don5Dpm5bonqvon4TonrPon4fon4bonrvon6/on7Lon6DooI/ooI3on77on7bon7fooI7on5LooJHooJbooJXooKLooKHooLHooLbooLnooKfooLvooYTooYLooZLooZnooZ7ooaLooavoooHoob7oop7oobXoob3oorXoobLoooLoopfoopLooq7oopnooqLooo3ooqToorDoor/oorHoo4Poo4Too5Too5joo5noo53oo7nopILoo7zoo7Too6joo7LopITopIzopIropJPopYPopJ7opKXopKropKvopYHopYTopLvopLbopLjopYzopJ3opaDopZ5cIl0sW1wiZWJhMVwiLFwi6KWm6KWk6KWt6KWq6KWv6KW06KW36KW+6KaD6KaI6KaK6KaT6KaY6Kah6Kap6Kam6Kas6Kav6Kay6Ka66Ka96Ka/6KeA6Kea6Kec6Ked6Ken6Ke06Ke46KiD6KiW6KiQ6KiM6Kib6Kid6Kil6Ki26KmB6Kmb6KmS6KmG6KmI6Km86Kmt6Kms6Kmi6KqF6KqC6KqE6Kqo6Kqh6KqR6Kql6Kqm6Kqa6Kqj6KuE6KuN6KuC6Kua6Kur6Kuz6Kun6Kuk6Kux6KyU6Kug6Kui6Ku36Kue6Kub6KyM6KyH6Kya6Kuh6KyW6KyQ6KyX6Kyg6Kyz6Z6r6Kym6Kyr6Ky+6Kyo6K2B6K2M6K2P6K2O6K2J6K2W6K2b6K2a6K2rXCJdLFtcImVjYTFcIixcIuitn+itrOitr+ittOitveiugOiujOiujuiukuiuk+iuluiumeiumuiwuuixgeiwv+ixiOixjOixjuixkOixleixouixrOixuOixuuiyguiyieiyheiyiuiyjeiyjuiylOixvOiymOaIneiyreiyquiyveiysuiys+iyruiytuiziOizgeizpOizo+izmuizveizuuizu+i0hOi0hei0iui0h+i0j+i0jei0kOm9jui0k+izjei0lOi0lui1p+i1rei1sei1s+i2gei2mei3gui2vui2uui3j+i3mui3lui3jOi3m+i3i+i3qui3q+i3n+i3o+i3vOi4iOi4iei3v+i4nei4nui4kOi4n+i5gui4tei4sOi4tOi5ilwiXSxbXCJlZGExXCIsXCLouYfouYnouYzouZDouYjouZnouaTouaDouKrouaPouZXoubboubLoubzouoHouofouoXouoTouovouoroupPoupHoupToupnouqrouqHouqzourDou4bourHour7ou4Xou4jou4vou5vou6Pou7zou7vou6vou77ovIrovIXovJXovJLovJnovJPovJzovJ/ovJvovIzovKbovLPovLvovLnovYXovYLovL7ovYzovYnovYbovY7ovZfovZzovaLovaPovaTovpzovp/ovqPovq3ovq/ovrfov5rov6Xov6Lov6rov6/pgofov7TpgIXov7nov7rpgJHpgJXpgKHpgI3pgJ7pgJbpgIvpgKfpgLbpgLXpgLnov7hcIl0sW1wiZWVhMVwiLFwi6YGP6YGQ6YGR6YGS6YCO6YGJ6YC+6YGW6YGY6YGe6YGo6YGv6YG26Zqo6YGy6YKC6YG96YKB6YKA6YKK6YKJ6YKP6YKo6YKv6YKx6YK16YOi6YOk5omI6YOb6YSC6YSS6YSZ6YSy6YSw6YWK6YWW6YWY6YWj6YWl6YWp6YWz6YWy6YaL6YaJ6YaC6Yai6Yar6Yav6Yaq6Ya16Ya06Ya66YeA6YeB6YeJ6YeL6YeQ6YeW6Yef6Yeh6Yeb6Ye86Ye16Ye26Yie6Ye/6YiU6Yis6YiV6YiR6Yme6YmX6YmF6YmJ6Ymk6YmI6YqV6Yi/6YmL6YmQ6Yqc6YqW6YqT6Yqb6Yma6YuP6Yq56Yq36Yup6YyP6Yu66Y2E6YyuXCJdLFtcImVmYTFcIixcIumMmemMoumMmumMo+mMuumMtemMu+mNnOmNoOmNvOmNrumNlumOsOmOrOmOremOlOmOuemPlumPl+mPqOmPpemPmOmPg+mPnemPkOmPiOmPpOmQmumQlOmQk+mQg+mQh+mQkOmQtumQq+mQtemQoemQuumRgemRkumRhOmRm+mRoOmRoumRnumRqumIqemRsOmRtemRt+mRvemRmumRvOmRvumSgemRv+mWgumWh+mWiumWlOmWlumWmOmWmemWoOmWqOmWp+mWremWvOmWu+mWuemWvumXiua/tumXg+mXjemXjOmXlemXlOmXlumXnOmXoemXpemXoumYoemYqOmYrumYr+mZgumZjOmZj+mZi+mZt+mZnOmZnlwiXSxbXCJmMGExXCIsXCLpmZ3pmZ/pmabpmbLpmazpmo3pmpjpmpXpmpfpmqrpmqfpmrHpmrLpmrDpmrTpmrbpmrjpmrnpm47pm4vpm4npm43opY3pm5zpnI3pm5Xpm7npnITpnIbpnIjpnJPpnI7pnJHpnI/pnJbpnJnpnKTpnKrpnLDpnLnpnL3pnL7pnYTpnYbpnYjpnYLpnYnpnZzpnaDpnaTpnabpnajli5LpnavpnbHpnbnpnoXpnbzpnoHpnbrpnobpnovpno/pnpDpnpzpnqjpnqbpnqPpnrPpnrTpn4Ppn4bpn4jpn4vpn5zpn63pvY/pn7Lnq5/pn7bpn7XpoI/poIzpoLjpoKTpoKHpoLfpoL3poYbpoY/poYvpoavpoa/pobBcIl0sW1wiZjFhMVwiLFwi6aGx6aG06aGz6aKq6aKv6aKx6aK26aOE6aOD6aOG6aOp6aOr6aSD6aSJ6aSS6aSU6aSY6aSh6aSd6aSe6aSk6aSg6aSs6aSu6aS96aS+6aWC6aWJ6aWF6aWQ6aWL6aWR6aWS6aWM6aWV6aaX6aaY6aal6aat6aau6aa86aef6aeb6aed6aeY6aeR6aet6aeu6aex6aey6ae76ae46aiB6aiP6aiF6aei6aiZ6air6ai36amF6amC6amA6amD6ai+6amV6amN6amb6amX6amf6ami6aml6amk6amp6amr6amq6aqt6aqw6aq86auA6auP6auR6auT6auU6aue6auf6aui6auj6aum6auv6aur6auu6au06aux6au3XCJdLFtcImYyYTFcIixcIumru+mshumsmOmsmumsn+msoumso+mspemsp+msqOmsqemsqumsrumsr+mssumthOmtg+mtj+mtjemtjumtkemtmOmttOmuk+mug+mukemulumul+mun+muoOmuqOmutOmvgOmviumuuemvhumvj+mvkemvkumvo+mvoumvpOmvlOmvoemwuumvsumvsemvsOmwlemwlOmwiemwk+mwjOmwhumwiOmwkumwiumwhOmwrumwm+mwpemwpOmwoemwsOmxh+mwsumxhumwvumxmumxoOmxp+mxtumxuOmzp+mzrOmzsOm0iem0iOmzq+m0g+m0hum0qum0pum2r+m0o+m0n+m1hOm0lem0kum1gem0v+m0vum1hum1iFwiXSxbXCJmM2ExXCIsXCLptZ3ptZ7ptaTptZHptZDptZnptbLptonptofptqvpta/ptbrptprptqTptqnptrLpt4Tpt4Hptrvptrjptrrpt4bpt4/pt4Lpt5npt5Ppt7jpt6bpt63pt6/pt73puJrpuJvpuJ7pubXpubnpub3puoHpuojpuovpuozpupLpupXpupHpup3puqXpuqnpurjpuqrpuq3pnaHpu4zpu47pu4/pu5Dpu5Tpu5zpu57pu53pu6Dpu6Xpu6jpu6/pu7Tpu7bpu7fpu7npu7vpu7zpu73pvIfpvIjnmrfpvJXpvKHpvKzpvL7pvYrpvZLpvZTpvaPpvZ/pvaDpvaHpvabpvafpvazpvarpvbfpvbLpvbbpvpXpvpzpvqBcIl0sW1wiZjRhMVwiLFwi5aCv5qeH6YGZ55Gk5Yec54aZXCJdLFtcImY5YTFcIixcIue6iuiknOmNiOmKiOiTnOS/ieeCu+aYseajiOmLueabu+W9heS4qOS7oeS7vOS8gOS8g+S8ueS9luS+kuS+iuS+muS+lOS/jeWBgOWAouS/v+WAnuWBhuWBsOWBguWClOWDtOWDmOWFiuWFpOWGneWGvuWHrOWIleWKnOWKpuWLgOWLm+WMgOWMh+WMpOWNsuWOk+WOsuWPne+ojuWSnOWSiuWSqeWTv+WWhuWdmeWdpeWerOWfiOWfh++oj++okOWinuWisuWki+Wlk+Wlm+WlneWlo+WmpOWmuuWtluWvgOeUr+WvmOWvrOWwnuWypuWyuuWzteW0p+W1k++okeW1guW1reW2uOW2ueW3kOW8oeW8tOW9p+W+t1wiXSxbXCJmYWExXCIsXCLlv57mgZ3mgoXmgormg57mg5XmhKDmg7LmhJHmhLfmhLDmhpjmiJPmiqbmj7XmkaDmkp3mk47mlY7mmIDmmJXmmLvmmInmmK7mmJ7mmKTmmaXmmZfmmZnvqJLmmbPmmpnmmqDmmrLmmr/mm7rmnI7vpKnmnabmnrvmoZLmn4DmoIHmoYTmo4/vqJPmpajvqJTmppjmp6LmqLDmqavmqYbmqbPmqb7mq6Lmq6Tmr5bmsL/msZzmsobmsa/ms5rmtITmtofmta/mtpbmtqzmt4/mt7jmt7Lmt7zmuLnmuZzmuKfmuLzmur/mvojmvrXmv7XngIXngIfngKjngoXngqvnhI/nhITnhZznhYbnhYfvqJXnh4Hnh77nirFcIl0sW1wiZmJhMVwiLFwi54q+54yk76iW5423546954+J54+W54+j54+S55CH54+155Cm55Cq55Cp55Cu55Gi55KJ55Kf55SB55Wv55qC55qc55qe55qb55qm76iX552G5Yqv56Ch56GO56Gk56G656Sw76iY76iZ76ia56aU76ib56ab56uR56un76ic56ur566e76id57WI57Wc57a357ag57eW57mS572H576h76ie6IyB6I2i6I2/6I+H6I+26JGI6JK06JWT6JWZ6JWr76if6Jaw76ig76ih6KCH6KO16KiS6Ki36Km56Kqn6Kq+6Kuf76ii6Ku26K2T6K2/6LOw6LO06LSS6LW276ij6LuP76ik76il6YGn6YOe76im6YSV6YSn6YeaXCJdLFtcImZjYTFcIixcIumHl+mHnumHremHrumHpOmHpemIhumIkOmIiumIuumJgOmIvOmJjumJmemJkemIuemJp+mKp+mJt+mJuOmLp+mLl+mLmemLkO+op+mLlemLoOmLk+mMpemMoemLu++oqOmMnumLv+mMnemMgumNsOmNl+mOpOmPhumPnumPuOmQsemRhemRiOmWku+nnO+oqemanemar+mcs+mcu+mdg+mdjemdj+mdkemdlemhl+mhpe+oqu+oq+mkp++orOmmnumpjumrmemrnOmttemtsumuj+musemuu+mwgOm1sOm1q++orem4mem7kVwiXSxbXCJmY2YxXCIsXCLihbBcIiw5LFwi77+i77+k77yH77yCXCJdLFtcIjhmYTJhZlwiLFwiy5jLh8K4y5nLncKvy5vLmu+9ns6EzoVcIl0sW1wiOGZhMmMyXCIsXCLCocKmwr9cIl0sW1wiOGZhMmViXCIsXCLCusKqwqnCruKEosKk4oSWXCJdLFtcIjhmYTZlMVwiLFwizobOiM6JzorOqlwiXSxbXCI4ZmE2ZTdcIixcIs6MXCJdLFtcIjhmYTZlOVwiLFwizo7Oq1wiXSxbXCI4ZmE2ZWNcIixcIs6PXCJdLFtcIjhmYTZmMVwiLFwizqzOrc6uzq/Pis6Qz4zPgs+Nz4vOsM+OXCJdLFtcIjhmYTdjMlwiLFwi0IJcIiwxMCxcItCO0I9cIl0sW1wiOGZhN2YyXCIsXCLRklwiLDEwLFwi0Z7Rn1wiXSxbXCI4ZmE5YTFcIixcIsOGxJBcIl0sW1wiOGZhOWE0XCIsXCLEplwiXSxbXCI4ZmE5YTZcIixcIsSyXCJdLFtcIjhmYTlhOFwiLFwixYHEv1wiXSxbXCI4ZmE5YWJcIixcIsWKw5jFklwiXSxbXCI4ZmE5YWZcIixcIsWmw55cIl0sW1wiOGZhOWMxXCIsXCLDpsSRw7DEp8SxxLPEuMWCxYDFicWLw7jFk8OfxafDvlwiXSxbXCI4ZmFhYTFcIixcIsOBw4DDhMOCxILHjcSAxITDhcODxIbEiMSMw4fEisSOw4nDiMOLw4rEmsSWxJLEmFwiXSxbXCI4ZmFhYmFcIixcIsScxJ7EosSgxKTDjcOMw4/DjsePxLDEqsSuxKjEtMS2xLnEvcS7xYPFh8WFw5HDk8OSw5bDlMeRxZDFjMOVxZTFmMWWxZrFnMWgxZ7FpMWiw5rDmcOcw5vFrMeTxbDFqsWyxa7FqMeXx5vHmceVxbTDncW4xbbFucW9xbtcIl0sW1wiOGZhYmExXCIsXCLDocOgw6TDosSDx47EgcSFw6XDo8SHxInEjcOnxIvEj8Opw6jDq8OqxJvEl8STxJnHtcSdxJ9cIl0sW1wiOGZhYmJkXCIsXCLEocSlw63DrMOvw67HkFwiXSxbXCI4ZmFiYzVcIixcIsSrxK/EqcS1xLfEusS+xLzFhMWIxYbDscOzw7LDtsO0x5LFkcWNw7XFlcWZxZfFm8WdxaHFn8WlxaPDusO5w7zDu8Wtx5TFscWrxbPFr8Wpx5jHnMeax5bFtcO9w7/Ft8W6xb7FvFwiXSxbXCI4ZmIwYTFcIixcIuS4guS4hOS4heS4jOS4kuS4n+S4o+S4pOS4qOS4q+S4ruS4r+S4sOS4teS5gOS5geS5hOS5h+S5keS5muS5nOS5o+S5qOS5qeS5tOS5teS5ueS5v+S6jeS6luS6l+S6neS6r+S6ueS7g+S7kOS7muS7m+S7oOS7oeS7ouS7qOS7r+S7seS7s+S7teS7veS7vuS7v+S8gOS8guS8g+S8iOS8i+S8jOS8kuS8leS8luS8l+S8meS8ruS8seS9oOS8s+S8teS8t+S8ueS8u+S8vuS9gOS9guS9iOS9ieS9i+S9jOS9kuS9lOS9luS9mOS9n+S9o+S9quS9rOS9ruS9seS9t+S9uOS9ueS9uuS9veS9vuS+geS+guS+hFwiXSxbXCI4ZmIxYTFcIixcIuS+heS+ieS+iuS+jOS+juS+kOS+kuS+k+S+lOS+l+S+meS+muS+nuS+n+S+suS+t+S+ueS+u+S+vOS+veS+vuS/gOS/geS/heS/huS/iOS/ieS/i+S/jOS/jeS/j+S/kuS/nOS/oOS/ouS/sOS/suS/vOS/veS/v+WAgOWAgeWAhOWAh+WAiuWAjOWAjuWAkOWAk+WAl+WAmOWAm+WAnOWAneWAnuWAouWAp+WAruWAsOWAsuWAs+WAteWBgOWBgeWBguWBheWBhuWBiuWBjOWBjuWBkeWBkuWBk+WBl+WBmeWBn+WBoOWBouWBo+WBpuWBp+WBquWBreWBsOWBseWAu+WCgeWCg+WChOWChuWCiuWCjuWCj+WCkFwiXSxbXCI4ZmIyYTFcIixcIuWCkuWCk+WClOWCluWCm+WCnOWCnlwiLDQsXCLlgqrlgq/lgrDlgrnlgrrlgr3lg4Dlg4Plg4Tlg4flg4zlg47lg5Dlg5Plg5Tlg5jlg5zlg53lg5/lg6Llg6Tlg6blg6jlg6nlg6/lg7Hlg7blg7rlg77lhIPlhIblhIflhIjlhIvlhIzlhI3lhI7lg7LlhJDlhJflhJnlhJvlhJzlhJ3lhJ7lhKPlhKflhKjlhKzlhK3lhK/lhLHlhLPlhLTlhLXlhLjlhLnlhYLlhYrlhY/lhZPlhZXlhZflhZjlhZ/lhaTlhablhb7lhoPlhoTlhovlho7lhpjlhp3lhqHlhqPlhq3lhrjlhrrlhrzlhr7lhr/lh4JcIl0sW1wiOGZiM2ExXCIsXCLlh4jlh4/lh5Hlh5Llh5Plh5Xlh5jlh57lh6Llh6Xlh67lh7Llh7Plh7Tlh7fliIHliILliIXliJLliJPliJXliJbliJjliKLliKjliLHliLLliLXliLzliYXliYnliZXliZfliZjliZrliZzliZ/liaDliaHliablia7libflibjlibnlioDlioLlioXliorliozlipPlipXlipblipflipjliprlipzliqTliqXliqbliqfliq/lirDlirblirflirjlirrlirvlir3li4Dli4Tli4bli4jli4zli4/li5Hli5Tli5bli5vli5zli6Hli6Xli6jli6nli6rli6zli7Dli7Hli7Tli7bli7fljIDljIPljIrljItcIl0sW1wiOGZiNGExXCIsXCLljIzljJHljJPljJjljJvljJzljJ7ljJ/ljKXljKfljKjljKnljKvljKzljK3ljLDljLLljLXljLzljL3ljL7ljYLljYzljYvljZnljZvljaHljaPljaXljazlja3ljbLljbnljb7ljoPljofljojljo7ljpPljpTljpnljp3ljqHljqTljqrljqvljq/ljrLljrTljrXljrfljrjljrrljr3lj4Dlj4Xlj4/lj5Llj5Plj5Xlj5rlj53lj57lj6Dlj6blj6flj7XlkILlkJPlkJrlkKHlkKflkKjlkKrlkK/lkLHlkLTlkLXlkYPlkYTlkYflkY3lkY/lkZ7lkaLlkaTlkablkaflkanlkavlka3lka7lkbTlkb9cIl0sW1wiOGZiNWExXCIsXCLlkoHlkoPlkoXlkojlkonlko3lkpHlkpXlkpblkpzlkp/lkqHlkqblkqflkqnlkqrlkq3lkq7lkrHlkrflkrnlkrrlkrvlkr/lk4blk4rlk43lk47lk6Dlk6rlk6zlk6/lk7blk7zlk77lk7/llIDllIHllIXllIjllInllIzllI3llI7llJXllKrllKvllLLllLXllLbllLvllLzllL3llYHllYfllYnllYrllY3llZDllZHllZjllZrllZvllZ7llaDllaHllaTllabllb/lloHlloLllobllojllo7llo/llpHllpLllpPllpTllpfllqPllqTllq3llrLllr/ll4Hll4Pll4bll4nll4vll4zll47ll5Hll5JcIl0sW1wiOGZiNmExXCIsXCLll5Pll5fll5jll5vll57ll6Lll6nll7bll7/lmIXlmIjlmIrlmI1cIiw1LFwi5ZiZ5Zis5Ziw5Ziz5Zi15Zi35Zi55Zi75Zi85Zi95Zi/5ZmA5ZmB5ZmD5ZmE5ZmG5ZmJ5ZmL5ZmN5ZmP5ZmU5Zme5Zmg5Zmh5Zmi5Zmj5Zmm5Zmp5Zmt5Zmv5Zmx5Zmy5Zm15ZqE5ZqF5ZqI5ZqL5ZqM5ZqV5ZqZ5Zqa5Zqd5Zqe5Zqf5Zqm5Zqn5Zqo5Zqp5Zqr5Zqs5Zqt5Zqx5Zqz5Zq35Zq+5ZuF5ZuJ5ZuK5ZuL5ZuP5ZuQ5ZuM5ZuN5ZuZ5Zuc5Zud5Zuf5Zuh5ZukXCIsNCxcIuWbseWbq+WbrVwiXSxbXCI4ZmI3YTFcIixcIuWbtuWbt+WcgeWcguWch+WciuWcjOWckeWcleWcmuWcm+WcneWcoOWcouWco+WcpOWcpeWcqeWcquWcrOWcruWcr+Wcs+WctOWcveWcvuWcv+WdheWdhuWdjOWdjeWdkuWdouWdpeWdp+WdqOWdq+WdrVwiLDQsXCLlnbPlnbTlnbXlnbflnbnlnbrlnbvlnbzlnb7lnoHlnoPlnozlnpTlnpflnpnlnprlnpzlnp3lnp7lnp/lnqHlnpXlnqflnqjlnqnlnqzlnrjlnr3ln4fln4jln4zln4/ln5Xln53ln57ln6Tln6bln6fln6nln63ln7Dln7Xln7bln7jln73ln77ln7/loIPloITloIjloInln6FcIl0sW1wiOGZiOGExXCIsXCLloIzloI3loJvloJ7loJ/loKDloKbloKfloK3loLLloLnloL/loYnloYzloY3loY/loZDloZXloZ/loaHloaTloafloajlobjlobzlob/looDlooHloofloojloonloorloozloo3loo/lopDlopTlopblop3loqDloqHloqLloqbloqnlorHlorLlo4Tlorzlo4Llo4jlo43lo47lo5Dlo5Llo5Tlo5blo5rlo53lo6Hlo6Llo6nlo7PlpIXlpIblpIvlpIzlpJLlpJPlpJTomYHlpJ3lpKHlpKPlpKTlpKjlpK/lpLDlpLPlpLXlpLblpL/lpYPlpYblpZLlpZPlpZnlpZvlpZ3lpZ7lpZ/lpaHlpaPlpavlpa1cIl0sW1wiOGZiOWExXCIsXCLlpa/lpbLlpbXlpbblpbnlpbvlpbzlpovlpozlpo7lppLlppXlppflpp/lpqTlpqflpq3lpq7lpq/lprDlprPlprflprrlprzlp4Hlp4Plp4Tlp4jlp4rlp43lp5Llp53lp57lp5/lp6Plp6Tlp6flp67lp6/lp7Hlp7Llp7Tlp7flqIDlqITlqIzlqI3lqI7lqJLlqJPlqJ7lqKPlqKTlqKflqKjlqKrlqK3lqLDlqYTlqYXlqYflqYjlqYzlqZDlqZXlqZ7lqaPlqaXlqaflqa3lqbflqbrlqbvlqb7lqovlqpDlqpPlqpblqpnlqpzlqp7lqp/lqqDlqqLlqqflqqzlqrHlqrLlqrPlqrXlqrjlqrrlqrvlqr9cIl0sW1wiOGZiYWExXCIsXCLlq4Tlq4blq4jlq4/lq5rlq5zlq6Dlq6Xlq6rlq67lq7Xlq7blq73lrIDlrIHlrIjlrJflrLTlrJnlrJvlrJ3lrKHlrKXlrK3lrLjlrYHlrYvlrYzlrZLlrZblrZ7lrajlra7lra/lrbzlrb3lrb7lrb/lroHlroTlroblrorlro7lrpDlrpHlrpPlrpTlrpblrqjlrqnlrqzlrq3lrq/lrrHlrrLlrrflrrrlrrzlr4Dlr4Hlr43lr4/lr5ZcIiw0LFwi5a+g5a+v5a+x5a+05a+95bCM5bCX5bCe5bCf5bCj5bCm5bCp5bCr5bCs5bCu5bCw5bCy5bC15bC25bGZ5bGa5bGc5bGi5bGj5bGn5bGo5bGpXCJdLFtcIjhmYmJhMVwiLFwi5bGt5bGw5bG05bG15bG65bG75bG85bG95bKH5bKI5bKK5bKP5bKS5bKd5bKf5bKg5bKi5bKj5bKm5bKq5bKy5bK05bK15bK65bOJ5bOL5bOS5bOd5bOX5bOu5bOx5bOy5bO05bSB5bSG5bSN5bSS5bSr5bSj5bSk5bSm5bSn5bSx5bS05bS55bS95bS/5bWC5bWD5bWG5bWI5bWV5bWR5bWZ5bWK5bWf5bWg5bWh5bWi5bWk5bWq5bWt5bWw5bW55bW65bW+5bW/5baB5baD5baI5baK5baS5baT5baU5baV5baZ5bab5baf5bag5ban5bar5baw5ba05ba45ba55beD5beH5beL5beQ5beO5beY5beZ5beg5bekXCJdLFtcIjhmYmNhMVwiLFwi5bep5be45be55biA5biH5biN5biS5biU5biV5biY5bif5big5biu5bio5biy5bi15bi+5bmL5bmQ5bmJ5bmR5bmW5bmY5bmb5bmc5bme5bmo5bmqXCIsNCxcIuW5sOW6gOW6i+W6juW6ouW6pOW6peW6qOW6quW6rOW6seW6s+W6veW6vuW6v+W7huW7jOW7i+W7juW7keW7kuW7lOW7leW7nOW7nuW7peW7q+W8guW8huW8h+W8iOW8juW8meW8nOW8neW8oeW8ouW8o+W8pOW8qOW8q+W8rOW8ruW8sOW8tOW8tuW8u+W8veW8v+W9gOW9hOW9heW9h+W9jeW9kOW9lOW9mOW9m+W9oOW9o+W9pOW9p1wiXSxbXCI4ZmJkYTFcIixcIuW9r+W9suW9tOW9teW9uOW9uuW9veW9vuW+ieW+jeW+j+W+luW+nOW+neW+ouW+p+W+q+W+pOW+rOW+r+W+sOW+seW+uOW/hOW/h+W/iOW/ieW/i+W/kFwiLDQsXCLlv57lv6Hlv6Llv6jlv6nlv6rlv6zlv63lv67lv6/lv7Llv7Plv7blv7rlv7zmgIfmgIrmgI3mgJPmgJTmgJfmgJjmgJrmgJ/mgKTmgK3mgLPmgLXmgYDmgYfmgYjmgYnmgYzmgZHmgZTmgZbmgZfmgZ3mgaHmgafmgbHmgb7mgb/mgoLmgobmgojmgormgo7mgpHmgpPmgpXmgpjmgp3mgp7mgqLmgqTmgqXmgqjmgrDmgrHmgrdcIl0sW1wiOGZiZWExXCIsXCLmgrvmgr7mg4Lmg4Tmg4jmg4nmg4rmg4vmg47mg4/mg5Tmg5Xmg5nmg5vmg53mg57mg6Lmg6Xmg7Lmg7Xmg7jmg7zmg73mhILmhIfmhIrmhIzmhJBcIiw0LFwi5oSW5oSX5oSZ5oSc5oSe5oSi5oSq5oSr5oSw5oSx5oS15oS25oS35oS55oWB5oWF5oWG5oWJ5oWe5oWg5oWs5oWy5oW45oW75oW85oW/5oaA5oaB5oaD5oaE5oaL5oaN5oaS5oaT5oaX5oaY5oac5oad5oaf5oag5oal5oao5oaq5oat5oa45oa55oa85oeA5oeB5oeC5oeO5oeP5oeV5oec5oed5oee5oef5oeh5oei5oen5oep5oelXCJdLFtcIjhmYmZhMVwiLFwi5oes5oet5oev5oiB5oiD5oiE5oiH5oiT5oiV5oic5oig5oii5oij5oin5oip5oir5oi55oi95omC5omD5omE5omG5omM5omQ5omR5omS5omU5omW5oma5omc5omk5omt5omv5omz5om65om95oqN5oqO5oqP5oqQ5oqm5oqo5oqz5oq25oq35oq65oq+5oq/5ouE5ouO5ouV5ouW5oua5ouq5ouy5ou05ou85ou95oyD5oyE5oyK5oyL5oyN5oyQ5oyT5oyW5oyY5oyp5oyq5oyt5oy15oy25oy55oy85o2B5o2C5o2D5o2E5o2G5o2K5o2L5o2O5o2S5o2T5o2U5o2Y5o2b5o2l5o2m5o2s5o2t5o2x5o205o21XCJdLFtcIjhmYzBhMVwiLFwi5o245o285o295o2/5o6C5o6E5o6H5o6K5o6Q5o6U5o6V5o6Z5o6a5o6e5o6k5o6m5o6t5o6u5o6v5o695o+B5o+F5o+I5o+O5o+R5o+T5o+U5o+V5o+c5o+g5o+l5o+q5o+s5o+y5o+z5o+15o+45o+55pCJ5pCK5pCQ5pCS5pCU5pCY5pCe5pCg5pCi5pCk5pCl5pCp5pCq5pCv5pCw5pC15pC95pC/5pGL5pGP5pGR5pGS5pGT5pGU5pGa5pGb5pGc5pGd5pGf5pGg5pGh5pGj5pGt5pGz5pG05pG75pG95pKF5pKH5pKP5pKQ5pKR5pKY5pKZ5pKb5pKd5pKf5pKh5pKj5pKm5pKo5pKs5pKz5pK95pK+5pK/XCJdLFtcIjhmYzFhMVwiLFwi5pOE5pOJ5pOK5pOL5pOM5pOO5pOQ5pOR5pOV5pOX5pOk5pOl5pOp5pOq5pOt5pOw5pO15pO35pO75pO/5pSB5pSE5pSI5pSJ5pSK5pSP5pST5pSU5pSW5pSZ5pSb5pSe5pSf5pSi5pSm5pSp5pSu5pSx5pS65pS85pS95pWD5pWH5pWJ5pWQ5pWS5pWU5pWf5pWg5pWn5pWr5pW65pW95paB5paF5paK5paS5paV5paY5pad5pag5paj5pam5pau5pay5paz5pa05pa/5peC5peI5peJ5peO5peQ5peU5peW5peY5pef5pew5pey5pe05pe15pe55pe+5pe/5piA5piE5piI5piJ5piN5piR5piS5piV5piW5pidXCJdLFtcIjhmYzJhMVwiLFwi5pie5pih5pii5pij5pik5pim5pip5piq5pir5pis5piu5piw5pix5piz5pi55pi35pmA5pmF5pmG5pmK5pmM5pmR5pmO5pmX5pmY5pmZ5pmb5pmc5pmg5pmh5pu75pmq5pmr5pms5pm+5pmz5pm15pm/5pm35pm45pm55pm75pqA5pm85pqL5pqM5pqN5pqQ5pqS5pqZ5pqa5pqb5pqc5pqf5pqg5pqk5pqt5pqx5pqy5pq15pq75pq/5puA5puC5puD5puI5puM5puO5puP5puU5pub5puf5puo5pur5pus5puu5pu65pyF5pyH5pyO5pyT5pyZ5pyc5pyg5pyi5pyz5py+5p2F5p2H5p2I5p2M5p2U5p2V5p2dXCJdLFtcIjhmYzNhMVwiLFwi5p2m5p2s5p2u5p205p225p275p6B5p6E5p6O5p6P5p6R5p6T5p6W5p6Y5p6Z5p6b5p6w5p6x5p6y5p615p675p685p695p+55p+A5p+C5p+D5p+F5p+I5p+J5p+S5p+X5p+Z5p+c5p+h5p+m5p+w5p+y5p+25p+35qGS5qCU5qCZ5qCd5qCf5qCo5qCn5qCs5qCt5qCv5qCw5qCx5qCz5qC75qC/5qGE5qGF5qGK5qGM5qGV5qGX5qGY5qGb5qGr5qGuXCIsNCxcIuahteahueahuuahu+ahvOaiguaihOaihuaiiOailuaimOaimuainOaioeaio+aipeaiqeaiquairuaisuaiu+ajheajiOajjOajj1wiXSxbXCI4ZmM0YTFcIixcIuajkOajkeajk+ajluajmeajnOajneajpeajqOajquajq+ajrOajreajsOajseajteajtuaju+ajvOajveakhuakieakiuakkOakkeakk+akluakl+akseaks+akteakuOaku+algualhealiealjuall+alm+alo+alpOalpealpualqOalqealrOalsOalsealsualuualu+alv+amgOamjeamkuamluammOamoeampeampuamqOamq+amreamr+amt+amuOamuuamvOanheaniOankeanluanl+anouanpeanruanr+anseans+anteanvuaogOaogeaog+aoj+aokeaoleaomuaoneaooOaopOaoqOaosOaoslwiXSxbXCI4ZmM1YTFcIixcIuaotOaot+aou+aovuaov+apheaphuapieapiuapjuapkOapkeapkuapleapluapm+appOapp+apquapseaps+apvuaqgeaqg+aqhuaqh+aqieaqi+aqkeaqm+aqneaqnuaqn+aqpeaqq+aqr+aqsOaqseaqtOaqveaqvuaqv+arhuarieariOarjOarkOarlOarlearluarnOarnearpOarp+arrOarsOarsearsuarvOarveasguasg+ashuash+asieasj+askOaskeasl+asm+asnuaspOasqOasq+asrOasr+asteastuasu+asv+athuatiuatjeatkuatluatmOatneatoOatp+atq+atruatsOatteatvVwiXSxbXCI4ZmM2YTFcIixcIuatvuauguauheaul+aum+aun+auoOauouauo+auqOauqeaurOaureauruausOauuOauueauveauvuavg+avhOavieavjOavluavmuavoeavo+avpuavp+avruavseavt+avueavv+awguawhOawheawieawjeawjuawkOawkuawmeawn+awpuawp+awqOawrOawruaws+awteawtuawuuawu+awv+axiuaxi+axjeaxj+axkuaxlOaxmeaxm+axnOaxq+axreaxr+axtOaxtuaxuOaxueaxu+ayheayhuayh+ayieaylOayleayl+aymOaynOayn+aysOaysuaytOazguazhuazjeazj+azkOazkeazkuazlOazllwiXSxbXCI4ZmM3YTFcIixcIuazmuaznOazoOazp+azqeazq+azrOazruazsuaztOa0hOa0h+a0iua0jua0j+a0kea0k+a0mua0pua0p+a0qOaxp+a0rua0r+a0sea0uea0vOa0v+a1l+a1nua1n+a1oea1pea1p+a1r+a1sOa1vOa2gua2h+a2kea2kua2lOa2lua2l+a2mOa2qua2rOa2tOa2t+a2uea2vea2v+a3hOa3iOa3iua3jua3j+a3lua3m+a3nea3n+a3oOa3oua3pea3qea3r+a3sOa3tOa3tua3vOa4gOa4hOa4nua4oua4p+a4sua4tua4uea4u+a4vOa5hOa5hea5iOa5iea5i+a5j+a5kea5kua5k+a5lOa5l+a5nOa5nea5nlwiXSxbXCI4ZmM4YTFcIixcIua5oua5o+a5qOa5s+a5u+a5vea6jea6k+a6mea6oOa6p+a6rea6rua6sea6s+a6u+a6v+a7gOa7gea7g+a7h+a7iOa7iua7jea7jua7j+a7q+a7rea7rua7uea7u+a7vea8hOa8iOa8iua8jOa8jea8lua8mOa8mua8m+a8pua8qea8qua8r+a8sOa8s+a8tua8u+a8vOa8rea9j+a9kea9kua9k+a9l+a9mea9mua9nea9nua9oea9oua9qOa9rOa9vea9vua+g+a+h+a+iOa+i+a+jOa+jea+kOa+kua+k+a+lOa+lua+mua+n+a+oOa+pea+pua+p+a+qOa+rua+r+a+sOa+tea+tua+vOa/hea/h+a/iOa/ilwiXSxbXCI4ZmM5YTFcIixcIua/mua/nua/qOa/qea/sOa/tea/uea/vOa/veeAgOeAheeAhueAh+eAjeeAl+eAoOeAo+eAr+eAtOeAt+eAueeAvOeBg+eBhOeBiOeBieeBiueBi+eBlOeBleeBneeBnueBjueBpOeBpeeBrOeBrueBteeBtueBvueCgeeCheeChueClFwiLDQsXCLngpvngqTngqvngrDngrHngrTngrfng4rng5Hng5Png5Tng5Xng5bng5jng5zng6Tng7rnhINcIiw0LFwi54SL54SM54SP54Se54Sg54Sr54St54Sv54Sw54Sx54S454WB54WF54WG54WH54WK54WL54WQ54WS54WX54Wa54Wc54We54WgXCJdLFtcIjhmY2FhMVwiLFwi54Wo54W554aA54aF54aH54aM54aS54aa54ab54ag54ai54av54aw54ay54az54a654a/54eA54eB54eE54eL54eM54eT54eW54eZ54ea54ec54e454e+54iA54iH54iI54iJ54iT54iX54ia54id54if54ik54ir54iv54i054i454i554mB54mC54mD54mF54mO54mP54mQ54mT54mV54mW54ma54mc54me54mg54mj54mo54mr54mu54mv54mx54m354m454m754m854m/54qE54qJ54qN54qO54qT54qb54qo54qt54qu54qx54q054q+54uB54uH54uJ54uM54uV54uW54uY54uf54ul54uz54u054u654u7XCJdLFtcIjhmY2JhMVwiLFwi54u+54yC54yE54yF54yH54yL54yN54yS54yT54yY54yZ54ye54yi54yk54yn54yo54ys54yx54yy54y154y654y754y9542D542N542Q542S542W542Y542d542e542f542g542m542n542p542r542s542u542v542x542354255428546A546B546D546F546G546O546Q546T546V546X546Y546c546e546f546g546i546l546m546q546r546t54615463546554685469546/54+F54+G54+J54+L54+M54+P54+S54+T54+W54+Z54+d54+h54+j54+m54+n54+p54+054+154+354+554+654+754+9XCJdLFtcIjhmY2NhMVwiLFwi54+/55CA55CB55CE55CH55CK55CR55Ca55Cb55Ck55Cm55CoXCIsOSxcIueQueeRgOeRg+eRhOeRhueRh+eRi+eRjeeRkeeRkueRl+eRneeRoueRpueRp+eRqOeRq+eRreeRrueRseeRsueSgOeSgeeSheeShueSh+eSieeSj+eSkOeSkeeSkueSmOeSmeeSmueSnOeSn+eSoOeSoeeSo+eSpueSqOeSqeeSqueSq+eSrueSr+eSseeSsueSteeSueeSu+eSv+eTiOeTieeTjOeTkOeTk+eTmOeTmueTm+eTnueTn+eTpOeTqOeTqueTq+eTr+eTtOeTuueTu+eTvOeTv+eUhlwiXSxbXCI4ZmNkYTFcIixcIueUkueUlueUl+eUoOeUoeeUpOeUp+eUqeeUqueUr+eUtueUueeUveeUvueUv+eVgOeVg+eVh+eViOeVjueVkOeVkueVl+eVnueVn+eVoeeVr+eVseeVuVwiLDUsXCLnloHnloXnlpDnlpLnlpPnlpXnlpnnlpznlqLnlqTnlrTnlrrnlr/nl4Dnl4Hnl4Tnl4bnl4znl47nl4/nl5fnl5znl5/nl6Dnl6Hnl6Tnl6fnl6znl67nl6/nl7Hnl7nnmIDnmILnmIPnmITnmIfnmIjnmIrnmIznmI/nmJLnmJPnmJXnmJbnmJnnmJvnmJznmJ3nmJ7nmKPnmKXnmKbnmKnnmK3nmLLnmLPnmLXnmLjnmLlcIl0sW1wiOGZjZWExXCIsXCLnmLrnmLznmYrnmYDnmYHnmYPnmYTnmYXnmYnnmYvnmZXnmZnnmZ/nmaTnmaXnma3nma7nma/nmbHnmbTnmoHnmoXnmoznmo3nmpXnmpvnmpznmp3nmp/nmqDnmqJcIiw2LFwi55qq55qt55q955uB55uF55uJ55uL55uM55uO55uU55uZ55ug55um55uo55us55uw55ux55u255u555u855yA55yG55yK55yO55yS55yU55yV55yX55yZ55ya55yc55yi55yo55yt55yu55yv55y055y155y255y555y955y+552C552F552G552K552N552O552P552S552W552X552c552e552f552g552iXCJdLFtcIjhmY2ZhMVwiLFwi552k552n552q552s552w552y552z552055265529556A556E556M556N556U556V556W556a556f556i556n556q556u556v556x5561556+55+D55+J55+R55+S55+V55+Z55+e55+f55+g55+k55+m55+q55+s55+w55+x55+055+455+756CF56CG56CJ56CN56CO56CR56Cd56Ch56Ci56Cj56Ct56Cu56Cw56C156C356GD56GE56GH56GI56GM56GO56GS56Gc56Ge56Gg56Gh56Gj56Gk56Go56Gq56Gu56G656G+56KK56KP56KU56KY56Kh56Kd56Ke56Kf56Kk56Ko56Ks56Kt56Kw56Kx56Ky56KzXCJdLFtcIjhmZDBhMVwiLFwi56K756K956K/56OH56OI56OJ56OM56OO56OS56OT56OV56OW56Ok56Ob56Of56Og56Oh56Om56Oq56Oy56Oz56SA56O256O356O656O756O/56SG56SM56SQ56Sa56Sc56Se56Sf56Sg56Sl56Sn56Sp56St56Sx56S056S156S756S956S/56WE56WF56WG56WK56WL56WP56WR56WU56WY56Wb56Wc56Wn56Wp56Wr56Wy56W556W756W856W+56aL56aM56aR56aT56aU56aV56aW56aY56ab56ac56ah56ao56ap56ar56av56ax56a056a456a756eC56eE56eH56eI56eK56eP56eU56eW56ea56ed56eeXCJdLFtcIjhmZDFhMVwiLFwi56eg56ei56el56eq56er56et56ex56e456e856iC56iD56iH56iJ56iK56iM56iR56iV56ib56ie56ih56in56ir56it56iv56iw56i056i156i456i556i656mE56mF56mH56mI56mM56mV56mW56mZ56mc56md56mf56mg56ml56mn56mq56mt56m156m456m+56qA56qC56qF56qG56qK56qL56qQ56qR56qU56qe56qg56qj56qs56qz56q156q556q756q856uG56uJ56uM56uO56uR56ub56uo56up56ur56us56ux56u056u756u956u+56yH56yU56yf56yj56yn56yp56yq56yr56yt56yu56yv56ywXCJdLFtcIjhmZDJhMVwiLFwi56yx56y056y956y/562A562B562H562O562V562g562k562m562p562q562t562v562y562z5623566E566J566O566Q566R566W566b566e566g566l566s566v566w566y56615662566656675668566956+C56+F56+I56+K56+U56+W56+X56+Z56+a56+b56+o56+q56+y56+056+156+456+556+656+856++57CB57CC57CD57CE57CG57CJ57CL57CM57CO57CP57CZ57Cb57Cg57Cl57Cm57Co57Cs57Cx57Cz57C057C257C557C657GG57GK57GV57GR57GS57GT57GZXCIsNV0sW1wiOGZkM2ExXCIsXCLnsaHnsaPnsafnsannsa3nsa7nsbDnsbLnsbnnsbznsb3nsobnsofnso/nspTnsp7nsqDnsqbnsrDnsrbnsrfnsrrnsrvnsrznsr/ns4Tns4fns4jns4nns43ns4/ns5Pns5Tns5Xns5fns5nns5rns53ns6bns6nns6vns7XntIPntIfntIjntInntI/ntJHntJLntJPntJbntJ3ntJ7ntKPntKbntKrntK3ntLHntLzntL3ntL7ntYDntYHntYfntYjntY3ntZHntZPntZfntZnntZrntZzntZ3ntaXntafntarntbDntbjntbrntbvntb/ntoHntoLntoPntoXntobntojntovntoznto3ntpHntpbntpfntp1cIl0sW1wiOGZkNGExXCIsXCLntp7ntqbntqfntqrntrPntrbntrfntrnnt4JcIiw0LFwi57eM57eN57eO57eX57eZ57iA57ei57el57em57eq57er57et57ex57e157e257e557e657iI57iQ57iR57iV57iX57ic57id57ig57in57io57is57it57iv57iz57i257i/57mE57mF57mH57mO57mQ57mS57mY57mf57mh57mi57ml57mr57mu57mv57mz57m457m+57qB57qG57qH57qK57qN57qR57qV57qY57qa57qd57qe57y857y757y957y+57y/572D572E572H572P572S572T572b572c572d572h572j572k572l572m572tXCJdLFtcIjhmZDVhMVwiLFwi572x5729572+572/576A576L576N576P576Q576R576W576X576c576h576i576m576q576t57605768576/57+A57+D57+I57+O57+P57+b57+f57+j57+l57+o57+s57+u57+v57+y57+657+957++57+/6ICH6ICI6ICK6ICN6ICO6ICP6ICR6ICT6ICU6ICW6ICd6ICe6ICf6ICg6ICk6ICm6ICs6ICu6ICw6IC06IC16IC36IC56IC66IC86IC+6IGA6IGE6IGg6IGk6IGm6IGt6IGx6IG16IKB6IKI6IKO6IKc6IKe6IKm6IKn6IKr6IK46IK56IOI6ION6IOP6IOS6IOU6IOV6IOX6IOY6IOg6IOt6IOuXCJdLFtcIjhmZDZhMVwiLFwi6IOw6IOy6IOz6IO26IO56IO66IO+6ISD6ISL6ISW6ISX6ISY6ISc6ISe6ISg6ISk6ISn6ISs6ISw6IS16IS66IS86IWF6IWH6IWK6IWM6IWS6IWX6IWg6IWh6IWn6IWo6IWp6IWt6IWv6IW36IaB6IaQ6IaE6IaF6IaG6IaL6IaO6IaW6IaY6Iab6Iae6Iai6Iau6Iay6Ia06Ia76IeL6IeD6IeF6IeK6IeO6IeP6IeV6IeX6Ieb6Ied6Iee6Ieh6Iek6Ier6Ies6Iew6Iex6Iey6Ie16Ie26Ie46Ie56Ie96Ie/6IiA6IiD6IiP6IiT6IiU6IiZ6Iia6Iid6Iih6Iii6Iio6Iiy6Ii06Ii66ImD6ImE6ImF6ImGXCJdLFtcIjhmZDdhMVwiLFwi6ImL6ImO6ImP6ImR6ImW6Imc6Img6Imj6Imn6Imt6Im06Im76Im96Im/6IqA6IqB6IqD6IqE6IqH6IqJ6IqK6IqO6IqR6IqU6IqW6IqY6Iqa6Iqb6Iqg6Iqh6Iqj6Iqk6Iqn6Iqo6Iqp6Iqq6Iqu6Iqw6Iqy6Iq06Iq36Iq66Iq86Iq+6Iq/6IuG6IuQ6IuV6Iua6Iug6Iui6Iuk6Iuo6Iuq6Iut6Iuv6Iu26Iu36Iu96Iu+6IyA6IyB6IyH6IyI6IyK6IyL6I2U6Iyb6Iyd6Iye6Iyf6Iyh6Iyi6Iys6Iyt6Iyu6Iyw6Iyz6Iy36Iy66Iy86Iy96I2C6I2D6I2E6I2H6I2N6I2O6I2R6I2V6I2W6I2X6I2w6I24XCJdLFtcIjhmZDhhMVwiLFwi6I296I2/6I6A6I6C6I6E6I6G6I6N6I6S6I6U6I6V6I6Y6I6Z6I6b6I6c6I6d6I6m6I6n6I6p6I6s6I6+6I6/6I+A6I+H6I+J6I+P6I+Q6I+R6I+U6I+d6I2T6I+o6I+q6I+26I+46I+56I+86JCB6JCG6JCK6JCP6JCR6JCV6JCZ6I6t6JCv6JC56JGF6JGH6JGI6JGK6JGN6JGP6JGR6JGS6JGW6JGY6JGZ6JGa6JGc6JGg6JGk6JGl6JGn6JGq6JGw6JGz6JG06JG26JG46JG86JG96JKB6JKF6JKS6JKT6JKV6JKe6JKm6JKo6JKp6JKq6JKv6JKx6JK06JK66JK96JK+6JOA6JOC6JOH6JOI6JOM6JOP6JOTXCJdLFtcIjhmZDlhMVwiLFwi6JOc6JOn6JOq6JOv6JOw6JOx6JOy6JO36JSy6JO66JO76JO96JSC6JSD6JSH6JSM6JSO6JSQ6JSc6JSe6JSi6JSj6JSk6JSl6JSn6JSq6JSr6JSv6JSz6JS06JS26JS/6JWG6JWPXCIsNCxcIuiVluiVmeiVnFwiLDYsXCLolaTolavola/olbnolbrolbvolb3olb/oloHoloXolobolonolovolozolo/olpPolpjolp3olp/olqDolqLolqXolqfolrTolrbolrfolrjolrzolr3olr7olr/ol4Lol4fol4rol4vol47olq3ol5jol5rol5/ol6Dol6bol6jol63ol7Pol7bol7xcIl0sW1wiOGZkYWExXCIsXCLol7/omIDomITomIXomI3omI7omJDomJHomJLomJjomJnomJvomJ7omKHomKfomKnomLbomLjomLromLzomL3omYDomYLomYbomZLomZPomZbomZfomZjomZnomZ3omaBcIiw0LFwi6Jmp6Jms6Jmv6Jm16Jm26Jm36Jm66JqN6JqR6JqW6JqY6Jqa6Jqc6Jqh6Jqm6Jqn6Jqo6Jqt6Jqx6Jqz6Jq06Jq16Jq36Jq46Jq56Jq/6JuA6JuB6JuD6JuF6JuR6JuS6JuV6JuX6Jua6Juc6Jug6Juj6Jul6Jun6JqI6Ju66Ju86Ju96JyE6JyF6JyH6JyL6JyO6JyP6JyQ6JyT6JyU6JyZ6Jye6Jyf6Jyh6JyjXCJdLFtcIjhmZGJhMVwiLFwi6Jyo6Jyu6Jyv6Jyx6Jyy6Jy56Jy66Jy86Jy96Jy+6J2A6J2D6J2F6J2N6J2Y6J2d6J2h6J2k6J2l6J2v6J2x6J2y6J276J6DXCIsNixcIuiei+iejOiekOiek+ieleiel+iemOiemeienuieoOieo+iep+ierOiereieruieseieteievuiev+ifgeifiOifieifiuifjuifleifluifmeifmuifnOifn+ifouifo+ifpOifquifq+ifreifseifs+ifuOifuuifv+iggeigg+ighuigieigiuigi+igkOigmeigkuigk+iglOigmOigmuigm+ignOignuign+igqOigreigruigsOigsuigtVwiXSxbXCI4ZmRjYTFcIixcIuiguuigvOihgeihg+ihheihiOihieihiuihi+ihjuihkeihleihluihmOihmuihnOihn+ihoOihpOihqeihseihueihu+iigOiimOiimuiim+iinOiin+iioOiiqOiiquiiuuiiveiivuijgOijilwiLDQsXCLoo5Hoo5Loo5Poo5voo57oo6foo6/oo7Doo7Hoo7Xoo7fopIHopIbopI3opI7opI/opJXopJbopJjopJnopJropJzopKDopKbopKfopKjopLDopLHopLLopLXopLnopLropL7opYDopYLopYXopYbopYnopY/opZLopZfopZropZvopZzopaHopaLopaPopavopa7opbDopbPopbXopbpcIl0sW1wiOGZkZGExXCIsXCLopbvopbzopb3oponopo3oppDoppToppXoppvoppzopp/opqDopqXoprDoprToprXoprboprfoprzop5RcIiw0LFwi6Kel6Kep6Ker6Ket6Kex6Kez6Ke26Ke56Ke96Ke/6KiE6KiF6KiH6KiP6KiR6KiS6KiU6KiV6Kie6Kig6Kii6Kik6Kim6Kir6Kis6Kiv6Ki16Ki36Ki96Ki+6KmA6KmD6KmF6KmH6KmJ6KmN6KmO6KmT6KmW6KmX6KmY6Kmc6Kmd6Kmh6Kml6Kmn6Km16Km26Km36Km56Km66Km76Km+6Km/6KqA6KqD6KqG6KqL6KqP6KqQ6KqS6KqW6KqX6KqZ6Kqf6Kqn6Kqp6Kqu6Kqv6KqzXCJdLFtcIjhmZGVhMVwiLFwi6Kq26Kq36Kq76Kq+6KuD6KuG6KuI6KuJ6KuK6KuR6KuT6KuU6KuV6KuX6Kud6Kuf6Kus6Kuw6Ku06Ku16Ku26Ku86Ku/6KyF6KyG6KyL6KyR6Kyc6Kye6Kyf6KyK6Kyt6Kyw6Ky36Ky86K2CXCIsNCxcIuitiOitkuitk+itlOitmeitjeitnuito+itreittuituOitueitvOitvuiugeiuhOiuheiui+iujeiuj+iulOiuleiunOiunuiun+iwuOiwueiwveiwvuixheixh+ixieixi+ixj+ixkeixk+ixlOixl+ixmOixm+ixneixmeixo+ixpOixpuixqOixqeixreixs+ixteixtuixu+ixvuiyhlwiXSxbXCI4ZmRmYTFcIixcIuiyh+iyi+iykOiykuiyk+iymeiym+iynOiypOiyueiyuuizheizhuizieizi+izj+izluizleizmeizneizoeizqOizrOizr+izsOizsuizteizt+izuOizvuizv+i0gei0g+i0iei0kui0l+i0m+i1pei1qei1rOi1rui1v+i2gui2hOi2iOi2jei2kOi2kei2lei2nui2n+i2oOi2pui2q+i2rOi2r+i2sui2tei2t+i2uei2u+i3gOi3hei3hui3h+i3iOi3iui3jui3kei3lOi3lei3l+i3mei3pOi3pei3p+i3rOi3sOi2vOi3sei3sui3tOi3vei4gei4hOi4hei4hui4i+i4kei4lOi4lui4oOi4oei4olwiXSxbXCI4ZmUwYTFcIixcIui4o+i4pui4p+i4sei4s+i4tui4t+i4uOi4uei4vei5gOi5gei5i+i5jei5jui5j+i5lOi5m+i5nOi5nei5nui5oei5oui5qei5rOi5rei5r+i5sOi5sei5uei5uui5u+i6gui6g+i6iei6kOi6kui6lei6mui6m+i6nei6nui6oui6p+i6qei6rei6rui6s+i6tei6uui6u+i7gOi7gei7g+i7hOi7h+i7j+i7kei7lOi7nOi7qOi7rui7sOi7sei7t+i7uei7uui7rei8gOi8gui8h+i8iOi8j+i8kOi8lui8l+i8mOi8nui8oOi8oei8o+i8pei8p+i8qOi8rOi8rei8rui8tOi8tei8tui8t+i8uui9gOi9gVwiXSxbXCI4ZmUxYTFcIixcIui9g+i9h+i9j+i9kVwiLDQsXCLovZjovZ3ovZ7ovaXovp3ovqDovqHovqTovqXovqbovrXovrbovrjovr7ov4Dov4Hov4bov4rov4vov43ov5Dov5Lov5Pov5Xov6Dov6Pov6Tov6jov67ov7Hov7Xov7bov7vov77pgILpgITpgIjpgIzpgJjpgJvpgKjpgKnpgK/pgKrpgKzpgK3pgLPpgLTpgLfpgL/pgYPpgYTpgYzpgZvpgZ3pgaLpgabpgafpgazpgbDpgbTpgbnpgoXpgojpgovpgozpgo7pgpDpgpXpgpfpgpjpgpnpgpvpgqDpgqHpgqLpgqXpgrDpgrLpgrPpgrTpgrbpgr3pg4zpgr7pg4NcIl0sW1wiOGZlMmExXCIsXCLpg4Tpg4Xpg4fpg4jpg5Xpg5fpg5jpg5npg5zpg53pg5/pg6Xpg5Lpg7bpg6vpg6/pg7Dpg7Tpg77pg7/phIDphITphIXphIbphIjphI3phJDphJTphJbphJfphJjphJrphJzphJ7phKDphKXphKLphKPphKfphKnphK7phK/phLHphLTphLbphLfphLnphLrphLzphL3phYPphYfphYjphY/phZPphZfphZnphZrphZvphaHphaTphafpha3phbTphbnphbrphbvphoHphoPphoXphobphorpho7phpHphpPphpTphpXphpjphp7phqHphqbphqjphqzphq3phq7phrDphrHphrLphrPphrbphrvphrzphr3phr9cIl0sW1wiOGZlM2ExXCIsXCLph4Lph4Pph4Xph5Pph5Tph5fph5nph5rph57ph6Tph6Xph6nph6rph6xcIiw1LFwi6Ye36Ye56Ye76Ye96YiA6YiB6YiE6YiF6YiG6YiH6YiJ6YiK6YiM6YiQ6YiS6YiT6YiW6YiY6Yic6Yid6Yij6Yik6Yil6Yim6Yio6Yiu6Yiv6Yiw6Yiz6Yi16Yi26Yi46Yi56Yi66Yi86Yi+6YmA6YmC6YmD6YmG6YmH6YmK6YmN6YmO6YmP6YmR6YmY6YmZ6Ymc6Ymd6Ymg6Ymh6Yml6Ymn6Ymo6Ymp6Ymu6Ymv6Ymw6Ym1XCIsNCxcIumJu+mJvOmJvemJv+mKiOmKiemKiumKjemKjumKkumKl1wiXSxbXCI4ZmU0YTFcIixcIumKmemKn+mKoOmKpOmKpemKp+mKqOmKq+mKr+mKsumKtumKuOmKuumKu+mKvOmKvemKv1wiLDQsXCLpi4Xpi4bpi4fpi4jpi4vpi4zpi43pi47pi5Dpi5Ppi5Xpi5fpi5jpi5npi5zpi53pi5/pi6Dpi6Hpi6Ppi6Xpi6fpi6jpi6zpi67pi7Dpi7npi7vpi7/pjIDpjILpjIjpjI3pjJHpjJTpjJXpjJzpjJ3pjJ7pjJ/pjKHpjKTpjKXpjKfpjKnpjKrpjLPpjLTpjLbpjLfpjYfpjYjpjYnpjZDpjZHpjZLpjZXpjZfpjZjpjZrpjZ7pjaTpjaXpjafpjanpjarpja3pja/pjbDpjbHpjbPpjbTpjbZcIl0sW1wiOGZlNWExXCIsXCLpjbrpjb3pjb/pjoDpjoHpjoLpjojpjorpjovpjo3pjo/pjpLpjpXpjpjpjpvpjp7pjqHpjqPpjqTpjqbpjqjpjqvpjrTpjrXpjrbpjrrpjqnpj4Hpj4Tpj4Xpj4bpj4fpj4lcIiw0LFwi6Y+T6Y+Z6Y+c6Y+e6Y+f6Y+i6Y+m6Y+n6Y+56Y+36Y+46Y+66Y+76Y+96ZCB6ZCC6ZCE6ZCI6ZCJ6ZCN6ZCO6ZCP6ZCV6ZCW6ZCX6ZCf6ZCu6ZCv6ZCx6ZCy6ZCz6ZC06ZC76ZC/6ZC96ZGD6ZGF6ZGI6ZGK6ZGM6ZGV6ZGZ6ZGc6ZGf6ZGh6ZGj6ZGo6ZGr6ZGt6ZGu6ZGv6ZGx6ZGy6ZKE6ZKD6ZW46ZW5XCJdLFtcIjhmZTZhMVwiLFwi6ZW+6ZaE6ZaI6ZaM6ZaN6ZaO6Zad6Zae6Zaf6Zah6Zam6Zap6Zar6Zas6Za06Za26Za66Za96Za/6ZeG6ZeI6ZeJ6ZeL6ZeQ6ZeR6ZeS6ZeT6ZeZ6Zea6Zed6Zee6Zef6Zeg6Zek6Zem6Zid6Zie6Zii6Zik6Zil6Zim6Zis6Zix6Ziz6Zi36Zi46Zi56Zi66Zi86Zi96ZmB6ZmS6ZmU6ZmW6ZmX6ZmY6Zmh6Zmu6Zm06Zm76Zm86Zm+6Zm/6ZqB6ZqC6ZqD6ZqE6ZqJ6ZqR6ZqW6Zqa6Zqd6Zqf6Zqk6Zql6Zqm6Zqp6Zqu6Zqv6Zqz6Zq66ZuK6ZuS5bay6ZuY6Zua6Zud6Zue6Zuf6Zup6Zuv6Zux6Zu66ZyCXCJdLFtcIjhmZTdhMVwiLFwi6ZyD6ZyF6ZyJ6Zya6Zyb6Zyd6Zyh6Zyi6Zyj6Zyo6Zyx6Zyz6Z2B6Z2D6Z2K6Z2O6Z2P6Z2V6Z2X6Z2Y6Z2a6Z2b6Z2j6Z2n6Z2q6Z2u6Z2z6Z226Z236Z246Z276Z296Z2/6Z6A6Z6J6Z6V6Z6W6Z6X6Z6Z6Z6a6Z6e6Z6f6Z6i6Z6s6Z6u6Z6x6Z6y6Z616Z626Z646Z656Z666Z686Z6+6Z6/6Z+B6Z+E6Z+F6Z+H6Z+J6Z+K6Z+M6Z+N6Z+O6Z+Q6Z+R6Z+U6Z+X6Z+Y6Z+Z6Z+d6Z+e6Z+g6Z+b6Z+h6Z+k6Z+v6Z+x6Z+06Z+36Z+46Z+66aCH6aCK6aCZ6aCN6aCO6aCU6aCW6aCc6aCe6aCg6aCj6aCmXCJdLFtcIjhmZThhMVwiLFwi6aCr6aCu6aCv6aCw6aCy6aCz6aC16aCl6aC+6aGE6aGH6aGK6aGR6aGS6aGT6aGW6aGX6aGZ6aGa6aGi6aGj6aGl6aGm6aGq6aGs6aKr6aKt6aKu6aKw6aK06aK36aK46aK66aK76aK/6aOC6aOF6aOI6aOM6aOh6aOj6aOl6aOm6aOn6aOq6aOz6aO26aSC6aSH6aSI6aSR6aSV6aSW6aSX6aSa6aSb6aSc6aSf6aSi6aSm6aSn6aSr6aSxXCIsNCxcIumkuemkuumku+mkvOmlgOmlgemlhumlh+mliOmljemljumllOmlmOmlmemlm+mlnOmlnumln+mloOmmm+mmnemmn+mmpummsOmmsemmsummtVwiXSxbXCI4ZmU5YTFcIixcIummuemmuummvemmv+mng+mniemnk+mnlOmnmemnmumnnOmnnumnp+mnqumnq+mnrOmnsOmntOmntemnuemnvemnvumogumog+mohOmoi+mojOmokOmokemolumonumooOmooumoo+mopOmop+moremorumos+motemotumouOmph+mpgemphOmpiumpi+mpjOmpjumpkemplOmplumpnemqqumqrOmqrumqr+mqsumqtOmqtemqtumquemqu+mqvumqv+mrgemrg+mrhumriOmrjumrkOmrkumrlemrlumrl+mrm+mrnOmroOmrpOmrpemrp+mrqemrrOmrsumrs+mrtemruemruumrvemrv1wiLDRdLFtcIjhmZWFhMVwiLFwi6ayE6ayF6ayI6ayJ6ayL6ayM6ayN6ayO6ayQ6ayS6ayW6ayZ6ayb6ayc6ayg6aym6ayr6ayt6ayz6ay06ay16ay36ay56ay66ay96a2I6a2L6a2M6a2V6a2W6a2X6a2b6a2e6a2h6a2j6a2l6a2m6a2o6a2qXCIsNCxcIumts+mttemtt+mtuOmtuemtv+mugOmuhOmuhemuhumuh+muiemuiumui+mujemuj+mukOmulOmumumunemunumupumup+muqemurOmusOmusemusumut+muuOmuu+muvOmuvumuv+mvgemvh+mviOmvjumvkOmvl+mvmOmvnemvn+mvpemvp+mvqumvq+mvr+mvs+mvt+mvuFwiXSxbXCI4ZmViYTFcIixcIumvuemvuumvvemvv+mwgOmwgumwi+mwj+mwkemwlumwmOmwmemwmumwnOmwnumwoumwo+mwplwiLDQsXCLpsLHpsLXpsLbpsLfpsL3psYHpsYPpsYTpsYXpsYnpsYrpsY7psY/psZDpsZPpsZTpsZbpsZjpsZvpsZ3psZ7psZ/psaPpsanpsarpsZzpsavpsajpsa7psbDpsbLpsbXpsbfpsbvps6bps7Lps7fps7nptIvptILptJHptJfptJjptJzptJ3ptJ7ptK/ptLDptLLptLPptLTptLrptLzptYXptL3ptYLptYPptYfptYrptZPptZTptZ/ptaPptaLptaXptanptarptavptbDptbbptbfptbtcIl0sW1wiOGZlY2ExXCIsXCLptbzptb7ptoPptoTptobptorpto3pto7ptpLptpPptpXptpbptpfptpjptqHptqrptqzptq7ptrHptrXptrnptrzptr/pt4Ppt4fpt4npt4rpt5Tpt5Xpt5bpt5fpt5rpt57pt5/pt6Dpt6Xpt6fpt6npt6vpt67pt7Dpt7Ppt7Tpt77puIrpuILpuIfpuI7puJDpuJHpuJLpuJXpuJbpuJnpuJzpuJ3pubrpubvpubzpuoDpuoLpuoPpuoTpuoXpuofpuo7puo/pupbpupjpupvpup7puqTpuqjpuqzpuq7puq/purDpurPpurTpurXpu4bpu4jpu4vpu5Xpu5/pu6Tpu6fpu6zpu63pu67pu7Dpu7Hpu7Lpu7VcIl0sW1wiOGZlZGExXCIsXCLpu7jpu7/pvILpvIPpvInpvI/pvJDpvJHpvJLpvJTpvJbpvJfpvJnpvJrpvJvpvJ/pvKLpvKbpvKrpvKvpvK/pvLHpvLLpvLTpvLfpvLnpvLrpvLzpvL3pvL/pvYHpvYNcIiw0LFwi6b2T6b2V6b2W6b2X6b2Y6b2a6b2d6b2e6b2o6b2p6b2tXCIsNCxcIum9s+m9tem9uum9vem+j+m+kOm+kem+kum+lOm+lum+l+m+num+oem+oum+o+m+pVwiXV1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3MvdGFibGVzL2V1Y2pwLmpzb25cbi8vIG1vZHVsZSBpZCA9IDE0NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHtcInVDaGFyc1wiOlsxMjgsMTY1LDE2OSwxNzgsMTg0LDIxNiwyMjYsMjM1LDIzOCwyNDQsMjQ4LDI1MSwyNTMsMjU4LDI3NiwyODQsMzAwLDMyNSwzMjksMzM0LDM2NCw0NjMsNDY1LDQ2Nyw0NjksNDcxLDQ3Myw0NzUsNDc3LDUwNiw1OTQsNjEwLDcxMiw3MTYsNzMwLDkzMCw5MzgsOTYyLDk3MCwxMDI2LDExMDQsMTEwNiw4MjA5LDgyMTUsODIxOCw4MjIyLDgyMzEsODI0MSw4MjQ0LDgyNDYsODI1Miw4MzY1LDg0NTIsODQ1NCw4NDU4LDg0NzEsODQ4Miw4NTU2LDg1NzAsODU5Niw4NjAyLDg3MTMsODcyMCw4NzIyLDg3MjYsODczMSw4NzM3LDg3NDAsODc0Miw4NzQ4LDg3NTEsODc2MCw4NzY2LDg3NzcsODc4MSw4Nzg3LDg4MDIsODgwOCw4ODE2LDg4NTQsODg1OCw4ODcwLDg4OTYsODk3OSw5MzIyLDkzNzIsOTU0OCw5NTg4LDk2MTYsOTYyMiw5NjM0LDk2NTIsOTY2Miw5NjcyLDk2NzYsOTY4MCw5NzAyLDk3MzUsOTczOCw5NzkzLDk3OTUsMTE5MDYsMTE5MDksMTE5MTMsMTE5MTcsMTE5MjgsMTE5NDQsMTE5NDcsMTE5NTEsMTE5NTYsMTE5NjAsMTE5NjQsMTE5NzksMTIyODQsMTIyOTIsMTIzMTIsMTIzMTksMTIzMzAsMTIzNTEsMTI0MzYsMTI0NDcsMTI1MzUsMTI1NDMsMTI1ODYsMTI4NDIsMTI4NTAsMTI5NjQsMTMyMDAsMTMyMTUsMTMyMTgsMTMyNTMsMTMyNjMsMTMyNjcsMTMyNzAsMTMzODQsMTM0MjgsMTM3MjcsMTM4MzksMTM4NTEsMTQ2MTcsMTQ3MDMsMTQ4MDEsMTQ4MTYsMTQ5NjQsMTUxODMsMTU0NzEsMTU1ODUsMTY0NzEsMTY3MzYsMTcyMDgsMTczMjUsMTczMzAsMTczNzQsMTc2MjMsMTc5OTcsMTgwMTgsMTgyMTIsMTgyMTgsMTgzMDEsMTgzMTgsMTg3NjAsMTg4MTEsMTg4MTQsMTg4MjAsMTg4MjMsMTg4NDQsMTg4NDgsMTg4NzIsMTk1NzYsMTk2MjAsMTk3MzgsMTk4ODcsNDA4NzAsNTkyNDQsNTkzMzYsNTkzNjcsNTk0MTMsNTk0MTcsNTk0MjMsNTk0MzEsNTk0MzcsNTk0NDMsNTk0NTIsNTk0NjAsNTk0NzgsNTk0OTMsNjM3ODksNjM4NjYsNjM4OTQsNjM5NzYsNjM5ODYsNjQwMTYsNjQwMTgsNjQwMjEsNjQwMjUsNjQwMzQsNjQwMzcsNjQwNDIsNjUwNzQsNjUwOTMsNjUxMDcsNjUxMTIsNjUxMjcsNjUxMzIsNjUzNzUsNjU1MTAsNjU1MzZdLFwiZ2JDaGFyc1wiOlswLDM2LDM4LDQ1LDUwLDgxLDg5LDk1LDk2LDEwMCwxMDMsMTA0LDEwNSwxMDksMTI2LDEzMywxNDgsMTcyLDE3NSwxNzksMjA4LDMwNiwzMDcsMzA4LDMwOSwzMTAsMzExLDMxMiwzMTMsMzQxLDQyOCw0NDMsNTQ0LDU0NSw1NTgsNzQxLDc0Miw3NDksNzUwLDgwNSw4MTksODIwLDc5MjIsNzkyNCw3OTI1LDc5MjcsNzkzNCw3OTQzLDc5NDQsNzk0NSw3OTUwLDgwNjIsODE0OCw4MTQ5LDgxNTIsODE2NCw4MTc0LDgyMzYsODI0MCw4MjYyLDgyNjQsODM3NCw4MzgwLDgzODEsODM4NCw4Mzg4LDgzOTAsODM5Miw4MzkzLDgzOTQsODM5Niw4NDAxLDg0MDYsODQxNiw4NDE5LDg0MjQsODQzNyw4NDM5LDg0NDUsODQ4Miw4NDg1LDg0OTYsODUyMSw4NjAzLDg5MzYsODk0Niw5MDQ2LDkwNTAsOTA2Myw5MDY2LDkwNzYsOTA5Miw5MTAwLDkxMDgsOTExMSw5MTEzLDkxMzEsOTE2Miw5MTY0LDkyMTgsOTIxOSwxMTMyOSwxMTMzMSwxMTMzNCwxMTMzNiwxMTM0NiwxMTM2MSwxMTM2MywxMTM2NiwxMTM3MCwxMTM3MiwxMTM3NSwxMTM4OSwxMTY4MiwxMTY4NiwxMTY4NywxMTY5MiwxMTY5NCwxMTcxNCwxMTcxNiwxMTcyMywxMTcyNSwxMTczMCwxMTczNiwxMTk4MiwxMTk4OSwxMjEwMiwxMjMzNiwxMjM0OCwxMjM1MCwxMjM4NCwxMjM5MywxMjM5NSwxMjM5NywxMjUxMCwxMjU1MywxMjg1MSwxMjk2MiwxMjk3MywxMzczOCwxMzgyMywxMzkxOSwxMzkzMywxNDA4MCwxNDI5OCwxNDU4NSwxNDY5OCwxNTU4MywxNTg0NywxNjMxOCwxNjQzNCwxNjQzOCwxNjQ4MSwxNjcyOSwxNzEwMiwxNzEyMiwxNzMxNSwxNzMyMCwxNzQwMiwxNzQxOCwxNzg1OSwxNzkwOSwxNzkxMSwxNzkxNSwxNzkxNiwxNzkzNiwxNzkzOSwxNzk2MSwxODY2NCwxODcwMywxODgxNCwxODk2MiwxOTA0MywzMzQ2OSwzMzQ3MCwzMzQ3MSwzMzQ4NCwzMzQ4NSwzMzQ5MCwzMzQ5NywzMzUwMSwzMzUwNSwzMzUxMywzMzUyMCwzMzUzNiwzMzU1MCwzNzg0NSwzNzkyMSwzNzk0OCwzODAyOSwzODAzOCwzODA2NCwzODA2NSwzODA2NiwzODA2OSwzODA3NSwzODA3NiwzODA3OCwzOTEwOCwzOTEwOSwzOTExMywzOTExNCwzOTExNSwzOTExNiwzOTI2NSwzOTM5NCwxODkwMDBdfVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2VuY29kaW5ncy90YWJsZXMvZ2IxODAzMC1yYW5nZXMuanNvblxuLy8gbW9kdWxlIGlkID0gMTQ2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gW1tcIjBcIixcIlxcdTAwMDBcIiwxMjddLFtcIjgxNDFcIixcIuqwguqwg+qwheqwhuqwi1wiLDQsXCLqsJjqsJ7qsJ/qsKHqsKLqsKPqsKVcIiw2LFwi6rCu6rCy6rCz6rC0XCJdLFtcIjgxNjFcIixcIuqwteqwtuqwt+qwuuqwu+qwveqwvuqwv+qxgVwiLDksXCLqsYzqsY5cIiw1LFwi6rGVXCJdLFtcIjgxODFcIixcIuqxluqxl+qxmeqxmuqxm+qxnVwiLDE4LFwi6rGy6rGz6rG16rG26rG56rG7XCIsNCxcIuqyguqyh+qyiOqyjeqyjuqyj+qykeqykuqyk+qylVwiLDYsXCLqsp7qsqJcIiw1LFwi6rKr6rKt6rKu6rKxXCIsNixcIuqyuuqyvuqyv+qzgOqzguqzg+qzheqzhuqzh+qzieqziuqzi+qzjVwiLDcsXCLqs5bqs5hcIiw3LFwi6rOi6rOj6rOl6rOm6rOp6rOr6rOt6rOu6rOy6rO06rO3XCIsNCxcIuqzvuqzv+q0geq0guq0g+q0heq0h1wiLDQsXCLqtI7qtJDqtJLqtJNcIl0sW1wiODI0MVwiLFwi6rSU6rSV6rSW6rSX6rSZ6rSa6rSb6rSd6rSe6rSf6rShXCIsNyxcIuq0quq0q+q0rlwiLDVdLFtcIjgyNjFcIixcIuq0tuq0t+q0ueq0uuq0u+q0vVwiLDYsXCLqtYbqtYjqtYpcIiw1LFwi6rWR6rWS6rWT6rWV6rWW6rWXXCJdLFtcIjgyODFcIixcIuq1mVwiLDcsXCLqtaLqtaRcIiw3LFwi6rWu6rWv6rWx6rWy6rW36rW46rW56rW66rW+6raA6raDXCIsNCxcIuq2iuq2i+q2jeq2juq2j+q2kVwiLDEwLFwi6raeXCIsNSxcIuq2pVwiLDE3LFwi6ra4XCIsNyxcIuq3guq3g+q3heq3huq3h+q3iVwiLDYsXCLqt5Lqt5RcIiw3LFwi6red6ree6ref6reh6rei6rej6relXCIsMThdLFtcIjgzNDFcIixcIuq3uuq3u+q3veq3vuq4glwiLDUsXCLquIrquIzquI5cIiw1LFwi6riVXCIsN10sW1wiODM2MVwiLFwi6ridXCIsMTgsXCLquLLquLPquLXquLbquLnquLvquLxcIl0sW1wiODM4MVwiLFwi6ri96ri+6ri/6rmC6rmE6rmH6rmI6rmJ6rmL6rmP6rmR6rmS6rmT6rmV6rmXXCIsNCxcIuq5nuq5ouq5o+q5pOq5puq5p+q5quq5q+q5req5ruq5r+q5sVwiLDYsXCLqubrqub5cIiw1LFwi6rqGXCIsNSxcIuq6jVwiLDQ2LFwi6rq/6ruB6ruC6ruD6ruFXCIsNixcIuq7juq7klwiLDUsXCLqu5rqu5vqu51cIiw4XSxbXCI4NDQxXCIsXCLqu6bqu6fqu6nqu6rqu6zqu65cIiw1LFwi6ru16ru26ru36ru56ru66ru76ru9XCIsOF0sW1wiODQ2MVwiLFwi6ryG6ryJ6ryK6ryL6ryM6ryO6ryP6ryRXCIsMThdLFtcIjg0ODFcIixcIuq8pFwiLDcsXCLqvK7qvK/qvLHqvLPqvLVcIiw2LFwi6ry+6r2A6r2E6r2F6r2G6r2H6r2KXCIsNSxcIuq9kVwiLDEwLFwi6r2eXCIsNSxcIuq9plwiLDE4LFwi6r26XCIsNSxcIuq+geq+guq+g+q+heq+huq+h+q+iVwiLDYsXCLqvpLqvpPqvpTqvpZcIiw1LFwi6r6dXCIsMjYsXCLqvrrqvrvqvr3qvr5cIl0sW1wiODU0MVwiLFwi6r6/6r+BXCIsNSxcIuq/iuq/jOq/j1wiLDQsXCLqv5VcIiw2LFwi6r+dXCIsNF0sW1wiODU2MVwiLFwi6r+iXCIsNSxcIuq/qlwiLDUsXCLqv7Lqv7Pqv7Xqv7bqv7fqv7lcIiw2LFwi64CC64CDXCJdLFtcIjg1ODFcIixcIuuAhVwiLDYsXCLrgI3rgI7rgI/rgJHrgJLrgJPrgJVcIiw2LFwi64CeXCIsOSxcIuuAqVwiLDI2LFwi64GG64GH64GJ64GL64GN64GP64GQ64GR64GS64GW64GY64Ga64Gb64Gc64GeXCIsMjksXCLrgb7rgb/rgoHrgoLrgoPrgoVcIiw2LFwi64KO64KQ64KSXCIsNSxcIuuCm+uCneuCnuuCo+uCpFwiXSxbXCI4NjQxXCIsXCLrgqXrgqbrgqfrgqrrgrDrgrLrgrbrgrfrgrnrgrrrgrvrgr1cIiw2LFwi64OG64OKXCIsNSxcIuuDklwiXSxbXCI4NjYxXCIsXCLrg5Prg5Xrg5brg5frg5lcIiw2LFwi64Oh64Oi64Oj64Ok64OmXCIsMTBdLFtcIjg2ODFcIixcIuuDsVwiLDIyLFwi64SK64SN64SO64SP64SR64SU64SV64SW64SX64Sa64SeXCIsNCxcIuuEpuuEp+uEqeuEquuEq+uErVwiLDYsXCLrhLbrhLpcIiw1LFwi64WC64WD64WF64WG64WH64WJXCIsNixcIuuFkuuFk+uFluuFl+uFmeuFmuuFm+uFneuFnuuFn+uFoVwiLDIyLFwi64W664W764W964W+64W/64aB64aDXCIsNCxcIuuGiuuGjOuGjuuGj+uGkOuGkeuGleuGluuGl+uGmeuGmuuGm+uGnVwiXSxbXCI4NzQxXCIsXCLrhp5cIiw5LFwi64apXCIsMTVdLFtcIjg3NjFcIixcIuuGuVwiLDE4LFwi64eN64eO64eP64eR64eS64eT64eVXCJdLFtcIjg3ODFcIixcIuuHllwiLDUsXCLrh57rh6BcIiw3LFwi64eq64er64et64eu64ev64exXCIsNyxcIuuHuuuHvOuHvlwiLDUsXCLriIbriIfriInriIrriI1cIiw2LFwi64iW64iY64iaXCIsNSxcIuuIoVwiLDE4LFwi64i1XCIsNixcIuuIvVwiLDI2LFwi64mZ64ma64mb64md64me64mf64mhXCIsNixcIuuJqlwiLDRdLFtcIjg4NDFcIixcIuuJr1wiLDQsXCLribZcIiw1LFwi64m9XCIsNixcIuuKhuuKh+uKiOuKilwiLDRdLFtcIjg4NjFcIixcIuuKj+uKkuuKk+uKleuKluuKl+uKm1wiLDQsXCLriqLriqTriqfriqjriqnriqvriq3riq7riq/rirHrirLrirPrirXrirbrirdcIl0sW1wiODg4MVwiLFwi64q4XCIsMTUsXCLri4rri4vri43ri47ri4/ri5Hri5NcIiw0LFwi64ua64uc64ue64uf64ug64uh64uj64un64up64uq64uw64ux64uy64u264u864u964u+64yC64yD64yF64yG64yH64yJXCIsNixcIuuMkuuMllwiLDUsXCLrjJ1cIiw1NCxcIuuNl+uNmeuNmuuNneuNoOuNoeuNouuNo1wiXSxbXCI4OTQxXCIsXCLrjabrjajrjarrjazrja3rja/rjbLrjbPrjbXrjbbrjbfrjblcIiw2LFwi646C646GXCIsNSxcIuuOjVwiXSxbXCI4OTYxXCIsXCLrjo7rjo/rjpHrjpLrjpPrjpVcIiwxMCxcIuuOolwiLDUsXCLrjqnrjqrrjqvrjq1cIl0sW1wiODk4MVwiLFwi646uXCIsMjEsXCLrj4brj4frj4nrj4rrj43rj4/rj5Hrj5Lrj5Prj5brj5jrj5rrj5zrj57rj5/rj6Hrj6Lrj6Prj6Xrj6brj6frj6lcIiwxOCxcIuuPvVwiLDE4LFwi65CRXCIsNixcIuuQmeuQmuuQm+uQneuQnuuQn+uQoVwiLDYsXCLrkKrrkKxcIiw3LFwi65C1XCIsMTVdLFtcIjhhNDFcIixcIuuRhVwiLDEwLFwi65GS65GT65GV65GW65GX65GZXCIsNixcIuuRouuRpOuRplwiXSxbXCI4YTYxXCIsXCLrkadcIiw0LFwi65GtXCIsMTgsXCLrkoHrkoJcIl0sW1wiOGE4MVwiLFwi65KDXCIsNCxcIuuSiVwiLDE5LFwi65KeXCIsNSxcIuuSpeuSpuuSp+uSqeuSquuSq+uSrVwiLDcsXCLrkrbrkrjrkrpcIiw1LFwi65OB65OC65OD65OF65OG65OH65OJXCIsNixcIuuTkeuTkuuTk+uTlOuTllwiLDUsXCLrk57rk5/rk6Hrk6Lrk6Xrk6dcIiw0LFwi65Ou65Ow65OyXCIsNSxcIuuTuVwiLDI2LFwi65SW65SX65SZ65Sa65SdXCJdLFtcIjhiNDFcIixcIuuUnlwiLDUsXCLrlKbrlKtcIiw0LFwi65Sy65Sz65S165S265S365S5XCIsNixcIuuVguuVhlwiXSxbXCI4YjYxXCIsXCLrlYfrlYjrlYnrlYrrlY7rlY/rlZHrlZLrlZPrlZVcIiw2LFwi65We65WiXCIsOF0sW1wiOGI4MVwiLFwi65WrXCIsNTIsXCLrlqLrlqPrlqXrlqbrlqfrlqnrlqzrlq3rlq7rlq/rlrLrlrZcIiw0LFwi65a+65a/65eB65eC65eD65eFXCIsNixcIuuXjuuXklwiLDUsXCLrl5lcIiwxOCxcIuuXrVwiLDE4XSxbXCI4YzQxXCIsXCLrmIBcIiwxNSxcIuuYkuuYk+uYleuYluuYl+uYmVwiLDRdLFtcIjhjNjFcIixcIuuYnlwiLDYsXCLrmKZcIiw1LFwi65itXCIsNixcIuuYtVwiLDVdLFtcIjhjODFcIixcIuuYu1wiLDEyLFwi65mJXCIsMjYsXCLrmaXrmabrmafrmalcIiw1MCxcIuuanuuan+uaoeuaouuao+uapVwiLDUsXCLrmq3rmq7rmq/rmrDrmrJcIiwxNl0sW1wiOGQ0MVwiLFwi65uDXCIsMTYsXCLrm5VcIiw4XSxbXCI4ZDYxXCIsXCLrm55cIiwxNyxcIuubseubsuubs+ubteubtuubt+ubueubulwiXSxbXCI4ZDgxXCIsXCLrm7tcIiw0LFwi65yC65yD65yE65yGXCIsMzMsXCLrnKrrnKvrnK3rnK7rnLFcIiw2LFwi65y665y8XCIsNyxcIuudheudhuudh+udieudiuudi+udjVwiLDYsXCLrnZZcIiw5LFwi652h652i652j652l652m652n652pXCIsNixcIuudsuudtOudtlwiLDUsXCLrnb7rnb/rnoHrnoLrnoPrnoVcIiw2LFwi656O656T656U656V656a656b656d656eXCJdLFtcIjhlNDFcIixcIuuen+ueoVwiLDYsXCLrnqrrnq5cIiw1LFwi656265636565XCIsOF0sW1wiOGU2MVwiLFwi65+CXCIsNCxcIuufiOufilwiLDE5XSxbXCI4ZTgxXCIsXCLrn55cIiwxMyxcIuufruufr+ufseufsuufs+uftVwiLDYsXCLrn77roIJcIiw0LFwi66CK66CL66CN66CO66CP66CRXCIsNixcIuugmuugnOugnlwiLDUsXCLroKbroKfroKnroKrroKvroK1cIiw2LFwi66C266C6XCIsNSxcIuuhgeuhguuhg+uhhVwiLDExLFwi66GS66GUXCIsNyxcIuuhnuuhn+uhoeuhouuho+uhpVwiLDYsXCLroa7robDrobJcIiw1LFwi66G566G666G766G9XCIsN10sW1wiOGY0MVwiLFwi66KFXCIsNyxcIuuijlwiLDE3XSxbXCI4ZjYxXCIsXCLroqBcIiw3LFwi66KpXCIsNixcIuuiseuisuuis+uiteuituuit+uiuVwiLDRdLFtcIjhmODFcIixcIuuivuuiv+ujguujhOujhlwiLDUsXCLro43ro47ro4/ro5Hro5Lro5Pro5VcIiw3LFwi66Oe66Og66OiXCIsNSxcIuujquujq+ujreujruujr+ujsVwiLDYsXCLro7rro7zro75cIiw1LFwi66SFXCIsMTgsXCLrpJlcIiw2LFwi66ShXCIsMjYsXCLrpL7rpL/rpYHrpYLrpYPrpYVcIiw2LFwi66WN66WO66WQ66WSXCIsNV0sW1wiOTA0MVwiLFwi66Wa66Wb66Wd66We66Wf66WhXCIsNixcIuulquulrOulrlwiLDUsXCLrpbbrpbfrpbnrpbrrpbvrpb1cIl0sW1wiOTA2MVwiLFwi66W+XCIsNSxcIuumhuumiOumi+umjOumj1wiLDE1XSxbXCI5MDgxXCIsXCLrpp9cIiwxMixcIuumruumr+umseumsuums+umtVwiLDYsXCLrpr7rp4Drp4JcIiw1LFwi66eK66eL66eN66eTXCIsNCxcIuunmuunnOunn+unoOunouunpuunp+unqeunquunq+unrVwiLDYsXCLrp7brp7tcIiw0LFwi66iCXCIsNSxcIuuoiVwiLDExLFwi66iWXCIsMzMsXCLrqLrrqLvrqL3rqL7rqL/rqYHrqYPrqYTrqYXrqYZcIl0sW1wiOTE0MVwiLFwi66mH66mK66mM66mP66mQ66mR66mS66mW66mX66mZ66ma66mb66mdXCIsNixcIuuppuupqlwiLDVdLFtcIjkxNjFcIixcIuupsuups+upteuptuupt+upuVwiLDksXCLrqobrqojrqonrqorrqovrqo1cIiw1XSxbXCI5MTgxXCIsXCLrqpNcIiwyMCxcIuuqquuqreuqruuqr+uqseuqs1wiLDQsXCLrqrrrqrzrqr5cIiw1LFwi66uF66uG66uH66uJXCIsMTQsXCLrq5pcIiwzMyxcIuurveurvuurv+usgeusguusg+ushVwiLDcsXCLrrI7rrJDrrJJcIiw1LFwi66yZ66ya66yb66yd66ye66yf66yhXCIsNl0sW1wiOTI0MVwiLFwi66yo66yq66ysXCIsNyxcIuust+usueusuuusv1wiLDQsXCLrrYbrrYjrrYrrrYvrrYzrrY7rrZHrrZJcIl0sW1wiOTI2MVwiLFwi662T662V662W662X662ZXCIsNyxcIuutouutpFwiLDcsXCLrra1cIiw0XSxbXCI5MjgxXCIsXCLrrbJcIiwyMSxcIuuuieuuiuuui+uujeuujuuuj+uukVwiLDE4LFwi666l666m666n666p666q666r666tXCIsNixcIuuuteuutuuuuFwiLDcsXCLrr4Hrr4Lrr4Prr4Xrr4brr4frr4lcIiw2LFwi66+R66+S66+UXCIsMzUsXCLrr7rrr7vrr73rr77rsIFcIl0sW1wiOTM0MVwiLFwi67CDXCIsNCxcIuuwiuuwjuuwkOuwkuuwk+uwmeuwmuuwoOuwoeuwouuwo+uwpuuwqOuwquuwq+uwrOuwruuwr+uwsuuws+uwtVwiXSxbXCI5MzYxXCIsXCLrsLbrsLfrsLlcIiw2LFwi67GC67GG67GH67GI67GK67GL67GO67GP67GRXCIsOF0sW1wiOTM4MVwiLFwi67Ga67Gb67Gc67GeXCIsMzcsXCLrsobrsofrsonrsorrso3rso9cIiw0LFwi67KW67KY67KbXCIsNCxcIuuyouuyo+uypeuypuuyqVwiLDYsXCLrsrLrsrZcIiw1LFwi67K+67K/67OB67OC67OD67OFXCIsNyxcIuuzjuuzkuuzk+uzlOuzluuzl+uzmeuzmuuzm+uznVwiLDIyLFwi67O367O567O667O767O9XCJdLFtcIjk0NDFcIixcIuuzvlwiLDUsXCLrtIbrtIjrtIpcIiw1LFwi67SR67SS67ST67SVXCIsOF0sW1wiOTQ2MVwiLFwi67SeXCIsNSxcIuu0pVwiLDYsXCLrtK1cIiwxMl0sW1wiOTQ4MVwiLFwi67S6XCIsNSxcIuu1gVwiLDYsXCLrtYrrtYvrtY3rtY7rtY/rtZFcIiw2LFwi67WaXCIsOSxcIuu1peu1puu1p+u1qVwiLDIyLFwi67aC67aD67aF67aG67aLXCIsNCxcIuu2kuu2lOu2luu2l+u2mOu2m+u2nVwiLDYsXCLrtqVcIiwxMCxcIuu2sVwiLDYsXCLrtrlcIiwyNF0sW1wiOTU0MVwiLFwi67eS67eT67eW67eX67eZ67ea67eb67edXCIsMTEsXCLrt6pcIiw1LFwi67exXCJdLFtcIjk1NjFcIixcIuu3suu3s+u3teu3tuu3t+u3uVwiLDYsXCLruIHruILruITruIZcIiw1LFwi67iO67iP67iR67iS67iTXCJdLFtcIjk1ODFcIixcIuu4lVwiLDYsXCLruJ7ruKBcIiwzNSxcIuu5huu5h+u5ieu5iuu5i+u5jeu5j1wiLDQsXCLruZbruZjruZzruZ3ruZ7ruZ/ruaLruaPruaXruabruafruanruatcIiw0LFwi67my67m2XCIsNCxcIuu5vuu5v+u6geu6guu6g+u6hVwiLDYsXCLruo7rupJcIiw1LFwi67qaXCIsMTMsXCLruqlcIiwxNF0sW1wiOTY0MVwiLFwi67q4XCIsMjMsXCLru5Lru5NcIl0sW1wiOTY2MVwiLFwi67uV67uW67uZXCIsNixcIuu7oeu7ouu7plwiLDUsXCLru61cIiw4XSxbXCI5NjgxXCIsXCLru7ZcIiwxMCxcIuu8glwiLDUsXCLrvIpcIiwxMyxcIuu8muu8nlwiLDMzLFwi672C672D672F672G672H672JXCIsNixcIuu9kuu9k+u9lOu9llwiLDQ0XSxbXCI5NzQxXCIsXCLrvoNcIiwxNixcIuu+lVwiLDhdLFtcIjk3NjFcIixcIuu+nlwiLDE3LFwi676xXCIsN10sW1wiOTc4MVwiLFwi6765XCIsMTEsXCLrv4ZcIiw1LFwi67+O67+P67+R67+S67+T67+VXCIsNixcIuu/neu/nuu/oOu/olwiLDg5LFwi7IC97IC+7IC/XCJdLFtcIjk4NDFcIixcIuyBgFwiLDE2LFwi7IGSXCIsNSxcIuyBmeyBmuyBm1wiXSxbXCI5ODYxXCIsXCLsgZ3sgZ7sgZ/sgaFcIiw2LFwi7IGqXCIsMTVdLFtcIjk4ODFcIixcIuyBulwiLDIxLFwi7IKS7IKT7IKV7IKW7IKX7IKZXCIsNixcIuyCouyCpOyCplwiLDUsXCLsgq7sgrHsgrLsgrdcIiw0LFwi7IK+7IOC7IOD7IOE7IOG7IOH7IOK7IOL7ION7IOO7IOP7IORXCIsNixcIuyDmuyDnlwiLDUsXCLsg6bsg6fsg6nsg6rsg6vsg61cIiw2LFwi7IO27IO47IO6XCIsNSxcIuyEgeyEguyEg+yEheyEhuyEh+yEiVwiLDYsXCLshJHshJLshJPshJTshJZcIiw1LFwi7ISh7ISi7ISl7ISo7ISp7ISq7ISr7ISuXCJdLFtcIjk5NDFcIixcIuyEsuyEs+yEtOyEteyEt+yEuuyEu+yEveyEvuyEv+yFgVwiLDYsXCLshYrshY5cIiw1LFwi7IWW7IWXXCJdLFtcIjk5NjFcIixcIuyFmeyFmuyFm+yFnVwiLDYsXCLshabshapcIiw1LFwi7IWx7IWy7IWz7IW17IW27IW37IW57IW67IW7XCJdLFtcIjk5ODFcIixcIuyFvFwiLDgsXCLshoZcIiw1LFwi7IaP7IaR7IaS7IaT7IaV7IaXXCIsNCxcIuyGnuyGoOyGouyGo+yGpOyGpuyGp+yGquyGq+yGreyGruyGr+yGsVwiLDExLFwi7Ia+XCIsNSxcIuyHheyHhuyHh+yHieyHiuyHi+yHjVwiLDYsXCLsh5Xsh5bsh5lcIiw2LFwi7Ieh7Iei7Iej7Iel7Iem7Ien7IepXCIsNixcIuyHsuyHtFwiLDcsXCLsh77sh7/siIHsiILsiIPsiIVcIiw2LFwi7IiO7IiQ7IiSXCIsNSxcIuyImuyIm+yIneyInuyIoeyIouyIo1wiXSxbXCI5YTQxXCIsXCLsiKTsiKXsiKbsiKfsiKrsiKzsiK7siLDsiLPsiLVcIiwxNl0sW1wiOWE2MVwiLFwi7ImG7ImH7ImJXCIsNixcIuyJkuyJk+yJleyJluyJl+yJmVwiLDYsXCLsiaHsiaLsiaPsiaTsiaZcIl0sW1wiOWE4MVwiLFwi7ImnXCIsNCxcIuyJruyJr+yJseyJsuyJs+yJtVwiLDYsXCLsib7sioDsioJcIiw1LFwi7IqKXCIsNSxcIuyKkVwiLDYsXCLsipnsiprsipzsip5cIiw1LFwi7Iqm7Iqn7Iqp7Iqq7Iqr7IquXCIsNSxcIuyKtuyKuOyKulwiLDMzLFwi7Iue7Iuf7Iuh7Iui7IulXCIsNSxcIuyLruyLsOyLsuyLs+yLtOyLteyLt+yLuuyLveyLvuyLv+yMgVwiLDYsXCLsjIrsjIvsjI7sjI9cIl0sW1wiOWI0MVwiLFwi7IyQ7IyR7IyS7IyW7IyX7IyZ7Iya7Iyb7IydXCIsNixcIuyMpuyMp+yMqlwiLDhdLFtcIjliNjFcIixcIuyMs1wiLDE3LFwi7I2GXCIsN10sW1wiOWI4MVwiLFwi7I2OXCIsMjUsXCLsjarsjavsja3sja7sja/sjbHsjbNcIiw0LFwi7I267I277I2+XCIsNSxcIuyOheyOhuyOh+yOieyOiuyOi+yOjVwiLDUwLFwi7I+BXCIsMjIsXCLsj5pcIl0sW1wiOWM0MVwiLFwi7I+b7I+d7I+e7I+h7I+jXCIsNCxcIuyPquyPq+yPrOyPrlwiLDUsXCLsj7bsj7fsj7lcIiw1XSxbXCI5YzYxXCIsXCLsj79cIiw4LFwi7JCJXCIsNixcIuyQkVwiLDldLFtcIjljODFcIixcIuyQm1wiLDgsXCLskKVcIiw2LFwi7JCt7JCu7JCv7JCx7JCy7JCz7JC1XCIsNixcIuyQvlwiLDksXCLskYlcIiwyNixcIuyRpuyRp+yRqeyRquyRq+yRrVwiLDYsXCLskbbskbfskbjskbpcIiw1LFwi7JKBXCIsMTgsXCLskpVcIiw2LFwi7JKdXCIsMTJdLFtcIjlkNDFcIixcIuySqlwiLDEzLFwi7JK57JK67JK77JK9XCIsOF0sW1wiOWQ2MVwiLFwi7JOGXCIsMjVdLFtcIjlkODFcIixcIuyToFwiLDgsXCLsk6pcIiw1LFwi7JOy7JOz7JO17JO27JO37JO57JO77JO87JO97JO+7JSCXCIsOSxcIuyUjeyUjuyUj+yUkeyUkuyUk+yUlVwiLDYsXCLslJ1cIiwxMCxcIuyUquyUq+yUreyUruyUr+yUsVwiLDYsXCLslLrslLzslL5cIiw1LFwi7JWG7JWH7JWL7JWP7JWQ7JWR7JWS7JWW7JWa7JWb7JWc7JWf7JWi7JWj7JWl7JWm7JWn7JWpXCIsNixcIuyVsuyVtlwiLDUsXCLslb7slb/sloHsloLsloPsloXslobslojslonslorslovslo7slpDslpLslpPslpRcIl0sW1wiOWU0MVwiLFwi7JaW7JaZ7Jaa7Jab7Jad7Jae7Jaf7JahXCIsNyxcIuyWqlwiLDksXCLslrZcIl0sW1wiOWU2MVwiLFwi7Ja37Ja67Ja/XCIsNCxcIuyXi+yXjeyXj+yXkuyXk+yXleyXluyXl+yXmVwiLDYsXCLsl6Lsl6Tsl6bsl6dcIl0sW1wiOWU4MVwiLFwi7Jeo7Jep7Jeq7Jer7Jev7Jex7Jey7Jez7Je17Je47Je57Je67Je77JiC7JiD7JiE7JiJ7JiK7JiL7JiN7JiO7JiP7JiRXCIsNixcIuyYmuyYnVwiLDYsXCLsmKbsmKfsmKnsmKrsmKvsmK/smLHsmLLsmLbsmLjsmLrsmLzsmL3smL7smL/smYLsmYPsmYXsmYbsmYfsmYlcIiw2LFwi7JmS7JmWXCIsNSxcIuyZnuyZn+yZoVwiLDEwLFwi7Jmt7Jmu7Jmw7JmyXCIsNSxcIuyZuuyZu+yZveyZvuyZv+yagVwiLDYsXCLsmorsmozsmo5cIiw1LFwi7JqW7JqX7JqZ7Jqa7Jqb7JqdXCIsNixcIuyaplwiXSxbXCI5ZjQxXCIsXCLsmqjsmqpcIiw1LFwi7Jqy7Jqz7Jq17Jq27Jq37Jq7XCIsNCxcIuybguybhOybhlwiLDUsXCLsm45cIl0sW1wiOWY2MVwiLFwi7JuP7JuR7JuS7JuT7JuVXCIsNixcIuybnuybn+ybolwiLDUsXCLsm6rsm6vsm63sm67sm6/sm7Hsm7JcIl0sW1wiOWY4MVwiLFwi7JuzXCIsNCxcIuybuuybu+ybvOybvlwiLDUsXCLsnIbsnIfsnInsnIrsnIvsnI1cIiw2LFwi7JyW7JyY7JyaXCIsNSxcIuycouyco+ycpeycpuycp+ycqVwiLDYsXCLsnLLsnLTsnLbsnLjsnLnsnLrsnLvsnL7snL/snYHsnYLsnYPsnYVcIiw0LFwi7J2L7J2O7J2Q7J2Z7J2a7J2b7J2d7J2e7J2f7J2hXCIsNixcIuydqeydquydrFwiLDcsXCLsnbbsnbfsnbnsnbrsnbvsnb/snoDsnoHsnoLsnobsnovsnozsno3sno/snpLsnpPsnpXsnpnsnptcIiw0LFwi7J6i7J6nXCIsNCxcIuyeruyer+yeseyesuyes+yeteyetuyet1wiXSxbXCJhMDQxXCIsXCLsnrjsnrnsnrrsnrvsnr7sn4JcIiw1LFwi7J+K7J+L7J+N7J+P7J+RXCIsNixcIuyfmeyfmuyfm+yfnFwiXSxbXCJhMDYxXCIsXCLsn55cIiw1LFwi7J+l7J+m7J+n7J+p7J+q7J+r7J+tXCIsMTNdLFtcImEwODFcIixcIuyfu1wiLDQsXCLsoILsoIPsoIXsoIbsoIfsoInsoItcIiw0LFwi7KCS7KCU7KCXXCIsNCxcIuygnuygn+ygoeygouygo+ygpVwiLDYsXCLsoK7soLDsoLJcIiw1LFwi7KC57KC67KC77KC97KC+7KC/7KGBXCIsNixcIuyhiuyhi+yhjlwiLDUsXCLsoZVcIiwyNixcIuyhsuyhs+yhteyhtuyht+yhueyhu1wiLDQsXCLsooLsooTsoojsoonsoorsoo5cIiw1LFwi7KKVXCIsNyxcIuyinuyioOyiouyio+yipFwiXSxbXCJhMTQxXCIsXCLsoqXsoqbsoqfsoqlcIiwxOCxcIuyivuyiv+yjgOyjgVwiXSxbXCJhMTYxXCIsXCLso4Lso4Pso4Xso4bso4fso4nso4rso4vso41cIiw2LFwi7KOW7KOY7KOaXCIsNSxcIuyjouyjo+yjpVwiXSxbXCJhMTgxXCIsXCLso6ZcIiwxNCxcIuyjtlwiLDUsXCLso77so7/spIHspILspIPspIdcIiw0LFwi7KSO44CA44CB44CCwrfigKXigKbCqOOAg8Kt4oCV4oil77y84oi84oCY4oCZ4oCc4oCd44CU44CV44CIXCIsOSxcIsKxw5fDt+KJoOKJpOKJpeKInuKItMKw4oCy4oCz4oSD4oSr77+g77+h77+l4pmC4pmA4oig4oql4oyS4oiC4oiH4omh4omSwqfigLvimIbimIXil4vil4/il47il4fil4bilqHilqDilrPilrLilr3ilrzihpLihpDihpHihpPihpTjgJPiiariiaviiJriiL3iiJ3iiLXiiKviiKziiIjiiIviiobiiofiioLiioPiiKriiKniiKfiiKjvv6JcIl0sW1wiYTI0MVwiLFwi7KSQ7KSSXCIsNSxcIuykmVwiLDE4XSxbXCJhMjYxXCIsXCLspK1cIiw2LFwi7KS1XCIsMThdLFtcImEyODFcIixcIuyliFwiLDcsXCLspZLspZPspZXspZbspZfspZlcIiw2LFwi7KWi7KWkXCIsNyxcIuylreylruylr+KHkuKHlOKIgOKIg8K0772ey4fLmMudy5rLmcK4y5vCocK/y5DiiK7iiJHiiI/CpOKEieKAsOKXgeKXgOKWt+KWtuKZpOKZoOKZoeKZpeKZp+KZo+KKmeKXiOKWo+KXkOKXkeKWkuKWpOKWpeKWqOKWp+KWpuKWqeKZqOKYj+KYjuKYnOKYnsK24oCg4oCh4oaV4oaX4oaZ4oaW4oaY4pmt4pmp4pmq4pms44m/44ic4oSW44+H4oSi44+C44+Y4oSh4oKswq5cIl0sW1wiYTM0MVwiLFwi7KWx7KWy7KWz7KW1XCIsNixcIuylvVwiLDEwLFwi7KaK7KaL7KaN7KaO7KaPXCJdLFtcImEzNjFcIixcIuymkVwiLDYsXCLspprsppzspp5cIiwxNl0sW1wiYTM4MVwiLFwi7KavXCIsMTYsXCLsp4Lsp4Psp4Xsp4bsp4nsp4tcIiw0LFwi7KeS7KeU7KeX7KeY7Keb77yBXCIsNTgsXCLvv6bvvL1cIiwzMixcIu+/o1wiXSxbXCJhNDQxXCIsXCLsp57sp5/sp6Hsp6Psp6Xsp6bsp6jsp6nsp6rsp6vsp67sp7JcIiw1LFwi7Ke67Ke77Ke97Ke+7Ke/7KiB7KiC7KiD7KiEXCJdLFtcImE0NjFcIixcIuyoheyohuyoh+yoiuyojlwiLDUsXCLsqJXsqJbsqJfsqJlcIiwxMl0sW1wiYTQ4MVwiLFwi7Kim7Kin7Kio7KiqXCIsMjgsXCLjhLFcIiw5M10sW1wiYTU0MVwiLFwi7KmHXCIsNCxcIuypjuypj+ypkeypkuypk+yplVwiLDYsXCLsqZ7sqaJcIiw1LFwi7Kmp7KmqXCJdLFtcImE1NjFcIixcIuypq1wiLDE3LFwi7Km+XCIsNSxcIuyqheyqhlwiXSxbXCJhNTgxXCIsXCLsqodcIiwxNixcIuyqmVwiLDE0LFwi4oWwXCIsOV0sW1wiYTViMFwiLFwi4oWgXCIsOV0sW1wiYTVjMVwiLFwizpFcIiwxNixcIs6jXCIsNl0sW1wiYTVlMVwiLFwizrFcIiwxNixcIs+DXCIsNl0sW1wiYTY0MVwiLFwi7KqoXCIsMTksXCLsqr7sqr/sq4Hsq4Lsq4Psq4VcIl0sW1wiYTY2MVwiLFwi7KuGXCIsNSxcIuyrjuyrkOyrkuyrlOyrleyrluyrl+yrmlwiLDUsXCLsq6FcIiw2XSxbXCJhNjgxXCIsXCLsq6jsq6nsq6rsq6vsq61cIiw2LFwi7Ku1XCIsMTgsXCLsrInsrIrilIDilILilIzilJDilJjilJTilJzilKzilKTilLTilLzilIHilIPilI/ilJPilJvilJfilKPilLPilKvilLvilYvilKDilK/ilKjilLfilL/ilJ3ilLDilKXilLjilYLilJLilJHilJrilJnilJbilJXilI7ilI3ilJ7ilJ/ilKHilKLilKbilKfilKnilKrilK3ilK7ilLHilLLilLXilLbilLnilLrilL3ilL7ilYDilYHilYNcIiw3XSxbXCJhNzQxXCIsXCLsrItcIiw0LFwi7KyR7KyS7KyT7KyV7KyW7KyX7KyZXCIsNixcIuysolwiLDddLFtcImE3NjFcIixcIuysqlwiLDIyLFwi7K2C7K2D7K2EXCJdLFtcImE3ODFcIixcIuytheythuyth+ytiuyti+ytjeytjuytj+ytkVwiLDYsXCLsrZrsrZvsrZzsrZ5cIiw1LFwi7K2lXCIsNyxcIuOOleOOluOOl+KEk+OOmOOPhOOOo+OOpOOOpeOOpuOOmVwiLDksXCLjj4rjjo3jjo7jjo/jj4/jjojjjonjj4jjjqfjjqjjjrBcIiw5LFwi446AXCIsNCxcIuOOulwiLDUsXCLjjpBcIiw0LFwi4oSm44+A44+B446K446L446M44+W44+F446t446u446v44+b446p446q446r446s44+d44+Q44+T44+D44+J44+c44+GXCJdLFtcImE4NDFcIixcIuytrVwiLDEwLFwi7K26XCIsMTRdLFtcImE4NjFcIixcIuyuiVwiLDE4LFwi7K6dXCIsNl0sW1wiYTg4MVwiLFwi7K6kXCIsMTksXCLsrrlcIiwxMSxcIsOGw5DCqsSmXCJdLFtcImE4YTZcIixcIsSyXCJdLFtcImE4YThcIixcIsS/xYHDmMWSwrrDnsWmxYpcIl0sW1wiYThiMVwiLFwi44mgXCIsMjcsXCLik5BcIiwyNSxcIuKRoFwiLDE0LFwiwr3ihZPihZTCvMK+4oWb4oWc4oWd4oWeXCJdLFtcImE5NDFcIixcIuyvhVwiLDE0LFwi7K+VXCIsMTBdLFtcImE5NjFcIixcIuyvoOyvoeyvouyvo+yvpeyvpuyvqOyvqlwiLDE4XSxbXCJhOTgxXCIsXCLsr71cIiwxNCxcIuywjuywj+ywkeywkuywk+ywlVwiLDYsXCLssJ7ssJ/ssKDssKPssKTDpsSRw7DEp8SxxLPEuMWAxYLDuMWTw5/DvsWnxYvFieOIgFwiLDI3LFwi4pKcXCIsMjUsXCLikbRcIiwxNCxcIsK5wrLCs+KBtOKBv+KCgeKCguKCg+KChFwiXSxbXCJhYTQxXCIsXCLssKXssKbssKrssKvssK3ssK/ssLFcIiw2LFwi7LC67LC/XCIsNCxcIuyxhuyxh+yxieyxiuyxi+yxjeyxjlwiXSxbXCJhYTYxXCIsXCLssY9cIiw0LFwi7LGW7LGaXCIsNSxcIuyxoeyxouyxo+yxpeyxp+yxqVwiLDYsXCLssbHssbJcIl0sW1wiYWE4MVwiLFwi7LGz7LG07LG2XCIsMjksXCLjgYFcIiw4Ml0sW1wiYWI0MVwiLFwi7LKU7LKV7LKW7LKX7LKa7LKb7LKd7LKe7LKf7LKhXCIsNixcIuyyquyyrlwiLDUsXCLssrbssrfssrlcIl0sW1wiYWI2MVwiLFwi7LK67LK77LK9XCIsNixcIuyzhuyziOyzilwiLDUsXCLss5Hss5Lss5Pss5VcIiw1XSxbXCJhYjgxXCIsXCLss5tcIiw4LFwi7LOlXCIsNixcIuyzreyzruyzr+yzsVwiLDEyLFwi44KhXCIsODVdLFtcImFjNDFcIixcIuyzvuyzv+y0gOy0glwiLDUsXCLstIrstIvstI3stI7stI/stJFcIiw2LFwi7LSa7LSc7LSe7LSf7LSgXCJdLFtcImFjNjFcIixcIuy0oey0ouy0o+y0pey0puy0p+y0qey0quy0q+y0rVwiLDExLFwi7LS6XCIsNF0sW1wiYWM4MVwiLFwi7LS/XCIsMjgsXCLstZ3stZ7stZ/QkFwiLDUsXCLQgdCWXCIsMjVdLFtcImFjZDFcIixcItCwXCIsNSxcItGR0LZcIiwyNV0sW1wiYWQ0MVwiLFwi7LWh7LWi7LWj7LWlXCIsNixcIuy1ruy1sOy1slwiLDUsXCLstblcIiw3XSxbXCJhZDYxXCIsXCLstoFcIiw2LFwi7LaJXCIsMTAsXCLstpbstpfstpnstprstpvstp3stp7stp9cIl0sW1wiYWQ4MVwiLFwi7Lag7Lah7Lai7Laj7Lam7Lao7LaqXCIsNSxcIuy2sVwiLDE4LFwi7LeFXCJdLFtcImFlNDFcIixcIuy3hlwiLDUsXCLst43st47st4/st5FcIiwxNl0sW1wiYWU2MVwiLFwi7LeiXCIsNSxcIuy3qey3quy3q+y3rey3ruy3r+y3sVwiLDYsXCLst7rst7zst75cIiw0XSxbXCJhZTgxXCIsXCLsuIPsuIXsuIbsuIfsuInsuIrsuIvsuI1cIiw2LFwi7LiV7LiW7LiX7LiY7LiaXCIsNSxcIuy4ouy4o+y4pey4puy4p+y4qey4quy4q1wiXSxbXCJhZjQxXCIsXCLsuKzsuK3suK7suK/suLLsuLTsuLZcIiwxOV0sW1wiYWY2MVwiLFwi7LmKXCIsMTMsXCLsuZrsuZvsuZ3suZ7suaJcIiw1LFwi7Lmq7LmsXCJdLFtcImFmODFcIixcIuy5rlwiLDUsXCLsubbsubfsubnsubrsubvsub1cIiw2LFwi7LqG7LqI7LqKXCIsNSxcIuy6kuy6k+y6ley6luy6l+y6mVwiXSxbXCJiMDQxXCIsXCLsuppcIiw1LFwi7Lqi7LqmXCIsNSxcIuy6rlwiLDEyXSxbXCJiMDYxXCIsXCLsurtcIiw1LFwi7LuCXCIsMTldLFtcImIwODFcIixcIuy7llwiLDEzLFwi7Lum7Lun7Lup7Luq7LutXCIsNixcIuy7tuy7ulwiLDUsXCLqsIDqsIHqsITqsIfqsIjqsInqsIrqsJBcIiw3LFwi6rCZXCIsNCxcIuqwoOqwpOqwrOqwreqwr+qwsOqwseqwuOqwueqwvOqxgOqxi+qxjeqxlOqxmOqxnOqxsOqxseqxtOqxt+qxuOqxuuqygOqygeqyg+qyhOqyheqyhuqyieqyiuqyi+qyjOqykOqylOqynOqyneqyn+qyoOqyoeqyqOqyqeqyquqyrOqyr+qysOqyuOqyueqyu+qyvOqyveqzgeqzhOqziOqzjOqzleqzl+qzoOqzoeqzpOqzp+qzqOqzquqzrOqzr+qzsOqzseqzs+qzteqztuqzvOqzveq0gOq0hOq0hlwiXSxbXCJiMTQxXCIsXCLsvILsvIPsvIXsvIbsvIfsvIlcIiw2LFwi7LyS7LyU7LyWXCIsNSxcIuy8ney8nuy8n+y8oey8ouy8o1wiXSxbXCJiMTYxXCIsXCLsvKVcIiw2LFwi7Lyu7LyyXCIsNSxcIuy8uVwiLDExXSxbXCJiMTgxXCIsXCLsvYVcIiwxNCxcIuy9luy9l+y9mey9muy9m+y9nVwiLDYsXCLsvabsvajsvarsvavsvazqtIzqtI3qtI/qtJHqtJjqtJzqtKDqtKnqtKzqtK3qtLTqtLXqtLjqtLzqtYTqtYXqtYfqtYnqtZDqtZTqtZjqtaHqtaPqtazqta3qtbDqtbPqtbTqtbXqtbbqtbvqtbzqtb3qtb/qtoHqtoLqtojqtonqtozqtpDqtpzqtp3qtqTqtrfqt4Dqt4Hqt4Tqt4jqt5Dqt5Hqt5Pqt5zqt6Dqt6Tqt7jqt7nqt7zqt7/quIDquIHquIjquInquIvquI3quJTquLDquLHquLTquLfquLjquLrquYDquYHquYPquYXquYbquYrquYzquY3quY7quZDquZTquZbquZzquZ3quZ/quaDquaHquaXquajquanquazqubDqubhcIl0sW1wiYjI0MVwiLFwi7L2t7L2u7L2v7L2y7L2z7L217L227L237L25XCIsNixcIuy+gey+guy+g+y+hOy+hlwiLDUsXCLsvo1cIl0sW1wiYjI2MVwiLFwi7L6OXCIsMTgsXCLsvqJcIiw1LFwi7L6pXCJdLFtcImIyODFcIixcIuy+qlwiLDUsXCLsvrFcIiwxOCxcIuy/hVwiLDYsXCLqubnqubvqubzqub3quoTquoXquozqurzqur3qur7qu4Dqu4Tqu4zqu43qu4/qu5Dqu5Hqu5jqu5nqu5zqu6jqu6vqu63qu7Tqu7jqu7zqvIfqvIjqvI3qvJDqvKzqvK3qvLDqvLLqvLTqvLzqvL3qvL/qvYHqvYLqvYPqvYjqvYnqvZDqvZzqvZ3qvaTqvaXqvbnqvoDqvoTqvojqvpDqvpHqvpXqvpzqvrjqvrnqvrzqv4Dqv4fqv4jqv4nqv4vqv43qv47qv5Tqv5zqv6jqv6nqv7Dqv7Hqv7Tqv7jrgIDrgIHrgITrgIzrgJDrgJTrgJzrgJ3rgKjrgYTrgYXrgYjrgYrrgYzrgY7rgZPrgZTrgZXrgZfrgZlcIl0sW1wiYjM0MVwiLFwi7L+MXCIsMTksXCLsv6Lsv6Psv6Xsv6bsv6fsv6lcIl0sW1wiYjM2MVwiLFwi7L+qXCIsNSxcIuy/suy/tOy/tlwiLDUsXCLsv73sv77sv7/tgIHtgILtgIPtgIVcIiw1XSxbXCJiMzgxXCIsXCLtgItcIiw1LFwi7YCSXCIsNSxcIu2AmVwiLDE5LFwi64Gd64G864G964KA64KE64KM64KN64KP64KR64KY64KZ64Ka64Kc64Kf64Kg64Kh64Ki64Ko64Kp64KrXCIsNCxcIuuCseuCs+uCtOuCteuCuOuCvOuDhOuDheuDh+uDiOuDieuDkOuDkeuDlOuDmOuDoOuDpeuEiOuEieuEi+uEjOuEkOuEkuuEk+uEmOuEmeuEm+uEnOuEneuEo+uEpOuEpeuEqOuErOuEtOuEteuEt+uEuOuEueuFgOuFgeuFhOuFiOuFkOuFkeuFlOuFleuFmOuFnOuFoOuFuOuFueuFvOuGgOuGguuGiOuGieuGi+uGjeuGkuuGk+uGlOuGmOuGnOuGqOuHjOuHkOuHlOuHnOuHnVwiXSxbXCJiNDQxXCIsXCLtgK5cIiw1LFwi7YC27YC37YC57YC67YC77YC9XCIsNixcIu2Bhu2BiO2BilwiLDVdLFtcImI0NjFcIixcIu2Bke2Bku2Bk+2Ble2Blu2Bl+2BmVwiLDYsXCLtgaFcIiwxMCxcIu2Bru2Br1wiXSxbXCJiNDgxXCIsXCLtgbHtgbLtgbPtgbVcIiw2LFwi7YG+7YG/7YKA7YKCXCIsMTgsXCLrh5/rh6jrh6nrh6zrh7Drh7nrh7vrh73riITriIXriIjriIvriIzriJTriJXriJfriJnriKDriLTriLzriZjriZzriaDriajrianribTribXribzrioTrioXrionripDripHripTripjripnriprriqDriqHriqPriqXriqbriqrriqzrirDrirTri4jri4nri4zri5Dri5Lri5jri5nri5vri53ri6Lri6Tri6Xri6bri6jri6tcIiw0LFwi64uz64u064u164u3XCIsNCxcIuuLv+uMgOuMgeuMhOuMiOuMkOuMkeuMk+uMlOuMleuMnOuNlOuNleuNluuNmOuNm+uNnOuNnuuNn+uNpOuNpVwiXSxbXCJiNTQxXCIsXCLtgpVcIiwxNCxcIu2Cpu2Cp+2Cqe2Cqu2Cq+2CrVwiLDVdLFtcImI1NjFcIixcIu2Cs+2Ctu2CuO2CulwiLDUsXCLtg4Ltg4Ptg4Xtg4btg4ftg4pcIiw1LFwi7YOS7YOWXCIsNF0sW1wiYjU4MVwiLFwi7YOb7YOe7YOf7YOh7YOi7YOj7YOlXCIsNixcIu2Dru2DslwiLDUsXCLtg7lcIiwxMSxcIuuNp+uNqeuNq+uNruuNsOuNseuNtOuNuOuOgOuOgeuOg+uOhOuOheuOjOuOkOuOlOuOoOuOoeuOqOuOrOuPhOuPheuPiOuPi+uPjOuPjuuPkOuPlOuPleuPl+uPmeuPm+uPneuPoOuPpOuPqOuPvOuQkOuQmOuQnOuQoOuQqOuQqeuQq+uQtOuRkOuRkeuRlOuRmOuRoOuRoeuRo+uRpeuRrOuSgOuSiOuSneuSpOuSqOuSrOuSteuSt+uSueuTgOuThOuTiOuTkOuTleuTnOuTneuToOuTo+uTpOuTpuuTrOuTreuTr+uTseuTuOuUlOuUleuUmOuUm+uUnOuUpOuUpeuUp+uUqOuUqeuUquuUsOuUseuUtOuUuFwiXSxbXCJiNjQxXCIsXCLthIVcIiw3LFwi7YSOXCIsMTddLFtcImI2NjFcIixcIu2EoFwiLDE1LFwi7YSy7YSz7YS17YS27YS37YS57YS77YS87YS97YS+XCJdLFtcImI2ODFcIixcIu2Ev+2Fgu2FhlwiLDUsXCLthY7thY/thZHthZLthZPthZVcIiw2LFwi7YWe7YWg7YWiXCIsNSxcIu2Fqe2Fqu2Fq+2FreuVgOuVgeuVg+uVhOuVheuVi+uVjOuVjeuVkOuVlOuVnOuVneuVn+uVoOuVoeuWoOuWoeuWpOuWqOuWquuWq+uWsOuWseuWs+uWtOuWteuWu+uWvOuWveuXgOuXhOuXjOuXjeuXj+uXkOuXkeuXmOuXrOuYkOuYkeuYlOuYmOuYpeuYrOuYtOuZiOuZpOuZqOuanOuaneuaoOuapOuaq+uarOuaseublOubsOubtOubuOucgOucgeucheucqOucqeucrOucr+ucsOucuOucueucu+udhOudiOudjOudlOudleudoOudpOudqOudsOudseuds+udteudvOudveuegOuehOuejOuejeuej+uekOuekeuekuueluuel1wiXSxbXCJiNzQxXCIsXCLtha5cIiwxMyxcIu2FvVwiLDYsXCLthoXthobthofthonthopcIl0sW1wiYjc2MVwiLFwi7YaLXCIsMjAsXCLthqLthqPthqXthqbthqdcIl0sW1wiYjc4MVwiLFwi7YapXCIsNixcIu2Gsu2GtO2Gtu2Gt+2GuO2Gue2Gu+2Gve2Gvu2Gv+2HgVwiLDE0LFwi656Y656Z656c656g656o656p656r656s656t65606561656465+H65+J65+s65+t65+w65+065+865+965+/66CA66CB66CH66CI66CJ66CM66CQ66CY66CZ66Cb66Cd66Ck66Cl66Co66Cs66C066C166C366C466C566GA66GE66GR66GT66Gc66Gd66Gg66Gk66Gs66Gt66Gv66Gx66G466G866KN66Ko66Kw66K066K466OA66OB66OD66OF66OM66OQ66OU66Od66Of66Oh66Oo66Op66Os66Ow66O466O566O766O966SE66SY66Sg66S866S966WA66WE66WM66WP66WR66WY66WZ66Wc66Wg66Wo66WpXCJdLFtcImI4NDFcIixcIu2HkFwiLDcsXCLth5lcIiwxN10sW1wiYjg2MVwiLFwi7YerXCIsOCxcIu2Hte2Htu2Ht+2HuVwiLDEzXSxbXCJiODgxXCIsXCLtiIjtiIpcIiw1LFwi7YiRXCIsMjQsXCLrpavrpa3rpbTrpbXrpbjrpbzrpoTrpoXrpofrponrporrpo3rpo7rpqzrpq3rprDrprTrprzrpr3rpr/rp4Hrp4jrp4nrp4zrp45cIiw0LFwi66eY66eZ66eb66ed66ee66eh66ej66ek66el66eo66es66e066e166e366e466e566e666iA66iB66iI66iV66i466i566i866mA66mC66mI66mJ66mL66mN66mO66mT66mU66mV66mY66mc66mk66ml66mn66mo66mp66mw66mx66m066m466qD66qE66qF66qH66qM66qo66qp66qr66qs66qw66qy66q466q566q766q966uE66uI66uY66uZ66u8XCJdLFtcImI5NDFcIixcIu2Iqu2Iq+2Iru2Ir+2Ise2Isu2Is+2ItVwiLDYsXCLtiL7tiYDtiYJcIiw1LFwi7YmJ7YmK7YmL7YmMXCJdLFtcImI5NjFcIixcIu2JjVwiLDE0LFwi7YmdXCIsNixcIu2Jpe2Jpu2Jp+2JqFwiXSxbXCJiOTgxXCIsXCLtialcIiwyMixcIu2Kgu2Kg+2Khe2Khu2Kh+2Kie2Kiu2Ki+2KjOusgOushOusjeusj+uskeusmOusnOusoOusqeusq+ustOusteustuusuOusu+usvOusveusvuuthOutheuth+utieutjeutj+utkOutlOutmOutoeuto+utrOuuiOuujOuukOuupOuuqOuurOuutOuut+uvgOuvhOuviOuvkOuvk+uvuOuvueuvvOuvv+uwgOuwguuwiOuwieuwi+uwjOuwjeuwj+uwkeuwlFwiLDQsXCLrsJtcIiw0LFwi67Ck67Cl67Cn67Cp67Ct67Cw67Cx67C067C467GA67GB67GD67GE67GF67GJ67GM67GN67GQ67Gd67KE67KF67KI67KL67KM67KO67KU67KV67KXXCJdLFtcImJhNDFcIixcIu2Kje2Kju2Kj+2Kku2Kk+2KlO2KllwiLDUsXCLtip3tip7tip/tiqHtiqLtiqPtiqVcIiw2LFwi7YqtXCJdLFtcImJhNjFcIixcIu2Kru2Kr+2KsO2KslwiLDUsXCLtirrtirvtir3tir7ti4Hti4NcIiw0LFwi7YuK7YuMXCIsNV0sW1wiYmE4MVwiLFwi7YuS7YuT7YuV7YuW7YuX7YuZ7Yua7Yub7YudXCIsNixcIu2LplwiLDksXCLti7Lti7Pti7Xti7bti7fti7nti7rrspnrsprrsqDrsqHrsqTrsqfrsqjrsrDrsrHrsrPrsrTrsrXrsrzrsr3rs4Drs4Trs43rs4/rs5Drs5Hrs5Xrs5jrs5zrs7Trs7Xrs7brs7jrs7zrtITrtIXrtIfrtInrtJDrtJTrtKTrtKzrtYDrtYjrtYnrtYzrtZDrtZjrtZnrtaTrtajrtoDrtoHrtoTrtofrtojrtonrtorrtpDrtpHrtpPrtpXrtpnrtprrtpzrtqTrtrDrtrjrt5Trt5Xrt5jrt5zrt6nrt7Drt7Trt7jruIDruIPruIXruIzruI3ruJDruJTruJzruJ3ruJ/ruYTruYXruYjruYzruY7ruZTruZXruZfruZnruZrruZvruaDruaHruaRcIl0sW1wiYmI0MVwiLFwi7Yu7XCIsNCxcIu2Mgu2MhO2MhlwiLDUsXCLtjI/tjJHtjJLtjJPtjJXtjJdcIiw0LFwi7Yye7Yyi7YyjXCJdLFtcImJiNjFcIixcIu2MpO2Mpu2Mp+2Mqu2Mq+2Mre2Mru2Mr+2MsVwiLDYsXCLtjLrtjL5cIiw1LFwi7Y2G7Y2H7Y2I7Y2JXCJdLFtcImJiODFcIixcIu2NilwiLDMxLFwi67mo67mq67mw67mx67mz67m067m167m767m867m967qA67qE67qM67qN67qP67qQ67qR67qY67qZ67qo67uQ67uR67uU67uX67uY67ug67uj67uk67ul67us67yB67yI67yJ67yY67yZ67yb67yc67yd672A672B672E672I672Q672R672V676U676w67+F67+M67+N67+Q67+U67+c67+f67+h7IC87IGR7IGY7IGc7IGg7IGo7IGp7IKQ7IKR7IKU7IKY7IKg7IKh7IKj7IKl7IKs7IKt7IKv7IKw7IKz7IK07IK17IK27IK87IK97IK/7IOA7IOB7IOF7IOI7IOJ7IOM7IOQ7IOY7IOZ7IOb7IOc7IOd7IOkXCJdLFtcImJjNDFcIixcIu2NqlwiLDE3LFwi7Y2+7Y2/7Y6B7Y6C7Y6D7Y6F7Y6G7Y6HXCJdLFtcImJjNjFcIixcIu2OiO2Oie2Oiu2Oi+2Oju2OklwiLDUsXCLtjprtjpvtjp3tjp7tjp/tjqFcIiw2LFwi7Y6q7Y6s7Y6uXCJdLFtcImJjODFcIixcIu2Or1wiLDQsXCLtjrXtjrbtjrftjrntjrrtjrvtjr1cIiw2LFwi7Y+G7Y+H7Y+KXCIsNSxcIu2PkVwiLDUsXCLsg6Xsg6jsg6zsg7Tsg7Xsg7fsg7nshIDshITshIjshJDshJXshJxcIiw0LFwi7ISj7ISk7ISm7ISn7ISs7ISt7ISv7ISw7ISx7IS27IS47IS57IS87IWA7IWI7IWJ7IWL7IWM7IWN7IWU7IWV7IWY7IWc7IWk7IWl7IWn7IWo7IWp7IWw7IW07IW47IaF7IaM7IaN7IaO7IaQ7IaU7IaW7Iac7Iad7Iaf7Iah7Ial7Iao7Iap7Ias7Iaw7Ia97IeE7IeI7IeM7IeU7IeX7IeY7Ieg7Iek7Ieo7Iew7Iex7Iez7Ie87Ie97IiA7IiE7IiM7IiN7IiP7IiR7IiY7IiZ7Iic7Iif7Iig7Iio7Iip7Iir7IitXCJdLFtcImJkNDFcIixcIu2Pl+2PmVwiLDcsXCLtj6Ltj6RcIiw3LFwi7Y+u7Y+v7Y+x7Y+y7Y+z7Y+17Y+27Y+3XCJdLFtcImJkNjFcIixcIu2PuO2Pue2Puu2Pu+2Pvu2QgO2QglwiLDUsXCLtkIlcIiwxM10sW1wiYmQ4MVwiLFwi7ZCXXCIsNSxcIu2QnlwiLDI1LFwi7Iiv7Iix7Iiy7Ii07ImI7ImQ7ImR7ImU7ImY7Img7Iml7Ims7Imt7Imw7Im07Im87Im97Im/7IqB7IqI7IqJ7IqQ7IqY7Iqb7Iqd7Iqk7Iql7Iqo7Iqs7Iqt7Iq07Iq17Iq37Iq57Iuc7Iud7Iug7Iuj7Iuk7Iur7Ius7Iut7Iuv7Iux7Iu27Iu47Iu57Iu77Iu87IyA7IyI7IyJ7IyM7IyN7IyT7IyU7IyV7IyY7Iyc7Iyk7Iyl7Iyo7Iyp7I2F7I2o7I2p7I2s7I2w7I2y7I247I257I287I297I6E7I6I7I6M7I+A7I+Y7I+Z7I+c7I+f7I+g7I+i7I+o7I+p7I+t7I+07I+17I+47JCI7JCQ7JCk7JCs7JCwXCJdLFtcImJlNDFcIixcIu2QuFwiLDcsXCLtkYHtkYLtkYPtkYVcIiwxNF0sW1wiYmU2MVwiLFwi7ZGUXCIsNyxcIu2Rne2Rnu2Rn+2Roe2Rou2Ro+2RpVwiLDcsXCLtka7tkbDtkbHtkbJcIl0sW1wiYmU4MVwiLFwi7ZGzXCIsNCxcIu2Ruu2Ru+2Rve2Rvu2Sge2Sg1wiLDQsXCLtkortkoztko5cIiw1LFwi7ZKVXCIsOCxcIuyQtOyQvOyQveyRiOyRpOyRpeyRqOyRrOyRtOyRteyRueySgOySlOySnOySuOySvOyTqeyTsOyTseyTtOyTuOyTuuyTv+yUgOyUgeyUjOyUkOyUlOyUnOyUqOyUqeyUrOyUsOyUuOyUueyUu+yUveyVhOyVheyViOyVieyViuyVjOyVjeyVjuyVk+yVlOyVleyVl+yVmOyVmeyVneyVnuyVoOyVoeyVpOyVqOyVsOyVseyVs+yVtOyVteyVvOyVveyWgOyWhOyWh+yWjOyWjeyWj+yWkeyWleyWl+yWmOyWnOyWoOyWqeyWtOyWteyWuOyWueyWu+yWvOyWveyWvuyXhFwiLDYsXCLsl4zsl45cIl0sW1wiYmY0MVwiLFwi7ZKeXCIsMTAsXCLtkqpcIiwxNF0sW1wiYmY2MVwiLFwi7ZK5XCIsMTgsXCLtk43tk47tk4/tk5Htk5Ltk5Ptk5VcIl0sW1wiYmY4MVwiLFwi7ZOWXCIsNSxcIu2Tne2Tnu2ToFwiLDcsXCLtk6ntk6rtk6vtk63tk67tk6/tk7FcIiw2LFwi7ZO57ZO67ZO87JeQ7JeR7JeU7JeY7Jeg7Jeh7Jej7Jel7Jes7Jet7Jeu7Jew7Je07Je27Je37Je8XCIsNSxcIuyYheyYhuyYh+yYiOyYjOyYkOyYmOyYmeyYm+yYnOyYpOyYpeyYqOyYrOyYreyYruyYsOyYs+yYtOyYteyYt+yYueyYu+yZgOyZgeyZhOyZiOyZkOyZkeyZk+yZlOyZleyZnOyZneyZoOyZrOyZr+yZseyZuOyZueyZvOyagOyaiOyaieyai+yajeyalOyaleyamOyanOyapOyapeyap+yaqeyasOyaseyatOyauOyaueyauuybgOybgeybg+ybheybjOybjeybkOyblOybnOybneyboOyboeybqFwiXSxbXCJjMDQxXCIsXCLtk75cIiw1LFwi7ZSF7ZSG7ZSH7ZSJ7ZSK7ZSL7ZSNXCIsNixcIu2Ulu2UmFwiLDVdLFtcImMwNjFcIixcIu2UnlwiLDI1XSxbXCJjMDgxXCIsXCLtlLjtlLntlLrtlLvtlL7tlL/tlYHtlYLtlYPtlYVcIiw2LFwi7ZWO7ZWQ7ZWSXCIsNSxcIu2Vmu2Vm+2Vne2Vnu2Vn+2Voe2Vou2Vo+ybqeybrOybsOybuOybueybveychOycheyciOycjOyclOycleycl+ycmeycoOycoeycpOycqOycsOycseycs+ycteyct+ycvOycveydgOydhOydiuydjOydjeydj+ydkVwiLDcsXCLsnZzsnaDsnajsnavsnbTsnbXsnbjsnbzsnb3snb7snoPsnoTsnoXsnofsnojsnonsnorsno7snpDsnpHsnpTsnpbsnpfsnpjsnprsnqDsnqHsnqPsnqTsnqXsnqbsnqzsnq3snrDsnrTsnrzsnr3snr/sn4Dsn4Hsn4jsn4nsn4zsn47sn5Dsn5jsn53sn6Tsn6jsn6zsoIDsoIHsoITsoIjsoIpcIl0sW1wiYzE0MVwiLFwi7ZWk7ZWm7ZWn7ZWq7ZWs7ZWuXCIsNSxcIu2Vtu2Vt+2Vue2Vuu2Vu+2VvVwiLDYsXCLtlobtlortlotcIl0sW1wiYzE2MVwiLFwi7ZaM7ZaN7ZaO7ZaP7ZaRXCIsMTksXCLtlqbtlqdcIl0sW1wiYzE4MVwiLFwi7ZaoXCIsMzEsXCLsoJDsoJHsoJPsoJXsoJbsoJzsoJ3soKDsoKTsoKzsoK3soK/soLHsoLjsoLzsoYDsoYjsoYnsoYzsoY3soZTsobDsobHsobTsobjsobrsooDsooHsooPsooXsoobsoofsoovsoozsoo3sopTsop3sop/soqHsoqjsorzsor3so4Tso4jso4zso5Tso5Xso5fso5nso6Dso6Hso6Tso7Xso7zso73spIDspITspIXspIbspIzspI3spI/spJHspJjspKzspLTspZDspZHspZTspZjspaDspaHspaPspazspbDspbTspbzspojsponspozsppDsppjsppnsppvspp3sp4Dsp4Hsp4Tsp4fsp4jsp4rsp5Dsp5Hsp5NcIl0sW1wiYzI0MVwiLFwi7ZeK7ZeL7ZeN7ZeO7ZeP7ZeR7ZeTXCIsNCxcIu2Xmu2XnO2XnlwiLDUsXCLtl6btl6ftl6ntl6rtl6vtl63tl65cIl0sW1wiYzI2MVwiLFwi7ZevXCIsNCxcIu2Xtu2XuO2XulwiLDUsXCLtmILtmIPtmIXtmIbtmIftmIlcIiw2LFwi7ZiSXCJdLFtcImMyODFcIixcIu2YllwiLDUsXCLtmJ3tmJ7tmJ/tmKHtmKLtmKPtmKVcIiw3LFwi7ZiuXCIsOSxcIu2Yuu2Yu+ynleynluynmeynmuynnOynneynoOynouynpOynp+ynrOynreynr+ynsOynseynuOynueynvOyogOyoiOyoieyoi+yojOyojeyolOyomOyoqeypjOypjeypkOyplOypnOypneypn+ypoOypoeypqOypveyqhOyqmOyqvOyqveyrgOyrhOyrjOyrjeyrj+yrkeyrk+yrmOyrmeyroOyrrOyrtOysiOyskOyslOysmOysoOysoeytgeytiOytieytjOytkOytmOytmeytneytpOytuOytueyunOyuuOyvlOyvpOyvp+yvqeywjOywjeywkOywlOywnOywneywoeywouywp+ywqOywqeywrOywruywsOywuOywueywu1wiXSxbXCJjMzQxXCIsXCLtmL3tmL7tmL/tmYHtmYLtmYPtmYTtmYbtmYftmYrtmYztmY7tmY/tmZDtmZLtmZPtmZbtmZftmZntmZrtmZvtmZ1cIiw0XSxbXCJjMzYxXCIsXCLtmaJcIiw0LFwi7Zmo7ZmqXCIsNSxcIu2Zsu2Zs+2ZtVwiLDExXSxbXCJjMzgxXCIsXCLtmoHtmoLtmoTtmoZcIiw1LFwi7ZqO7ZqP7ZqR7ZqS7ZqT7ZqVXCIsNyxcIu2anu2aoO2aolwiLDUsXCLtmqntmqrssLzssL3ssL7ssYTssYXssYjssYzssZTssZXssZfssZjssZnssaDssaTssabssajssbDssbXsspjsspnsspzssqDssqjssqnssqvssqzssq3ssrTssrXssrjssrzss4Tss4Xss4fss4nss5Dss5Tss6Tss6zss7DstIHstIjstInstIzstJDstJjstJnstJvstJ3stKTstKjstKzstLnstZzstaDstaTstazsta3sta/stbHstbjstojstpTstpXstpjstpzstqTstqXstqfstqnstrDst4Tst4zst5Dst6jst6zst7Dst7jst7nst7vst73suITsuIjsuIzsuJTsuJnsuKDsuKHsuKTsuKjsuLDsuLHsuLPsuLVcIl0sW1wiYzQ0MVwiLFwi7Zqr7Zqt7Zqu7Zqv7ZqxXCIsNyxcIu2auu2avFwiLDcsXCLtm4btm4ftm4ntm4rtm4tcIl0sW1wiYzQ2MVwiLFwi7ZuN7ZuO7ZuP7ZuQ7ZuS7ZuT7ZuV7ZuW7ZuY7ZuaXCIsNSxcIu2boe2bou2bo+2bpe2bpu2bp+2bqVwiLDRdLFtcImM0ODFcIixcIu2bru2br+2bse2bsu2bs+2btO2btlwiLDUsXCLtm77tm7/tnIHtnILtnIPtnIVcIiwxMSxcIu2cku2ck+2clOy5mOy5mey5nOy5n+y5oOy5oey5qOy5qey5q+y5rey5tOy5tey5uOy5vOy6hOy6hey6h+y6iey6kOy6key6lOy6mOy6oOy6oey6o+y6pOy6pey6rOy6rey7gey7pOy7pey7qOy7q+y7rOy7tOy7tey7t+y7uOy7uey8gOy8gey8hOy8iOy8kOy8key8k+y8ley8nOy8oOy8pOy8rOy8rey8r+y8sOy8sey8uOy9lOy9ley9mOy9nOy9pOy9pey9p+y9qey9sOy9sey9tOy9uOy+gOy+hey+jOy+oey+qOy+sOy/hOy/oOy/oey/pOy/qOy/sOy/sey/s+y/tey/vO2AgO2AhO2Ake2AmO2Are2AtO2Ate2AuO2AvFwiXSxbXCJjNTQxXCIsXCLtnJXtnJbtnJftnJrtnJvtnJ3tnJ7tnJ/tnKFcIiw2LFwi7Zyq7Zys7ZyuXCIsNSxcIu2ctu2ct+2cuVwiXSxbXCJjNTYxXCIsXCLtnLrtnLvtnL1cIiw2LFwi7Z2F7Z2G7Z2I7Z2KXCIsNSxcIu2dku2dk+2dle2dmlwiLDRdLFtcImM1ODFcIixcIu2dn+2dou2dpO2dpu2dp+2dqO2dqu2dq+2dre2dru2dr+2dse2dsu2ds+2dtVwiLDYsXCLtnb7tnb/tnoDtnoJcIiw1LFwi7Z6K7Z6L7YGE7YGF7YGH7YGJ7YGQ7YGU7YGY7YGg7YGs7YGt7YGw7YG07YG87YG97YKB7YKk7YKl7YKo7YKs7YK07YK17YK37YK57YOA7YOB7YOE7YOI7YOJ7YOQ7YOR7YOT7YOU7YOV7YOc7YOd7YOg7YOk7YOs7YOt7YOv7YOw7YOx7YO47YSN7YSw7YSx7YS07YS47YS67YWA7YWB7YWD7YWE7YWF7YWM7YWN7YWQ7YWU7YWc7YWd7YWf7YWh7YWo7YWs7YW87YaE7YaI7Yag7Yah7Yak7Yao7Yaw7Yax7Yaz7Ya17Ya67Ya87YeA7YeY7Ye07Ye47YiH7YiJ7YiQ7Yis7Yit7Yiw7Yi07Yi87Yi97Yi/7YmB7YmI7YmcXCJdLFtcImM2NDFcIixcIu2eje2eju2ej+2ekVwiLDYsXCLtnprtnpztnp5cIiw1XSxbXCJjNmExXCIsXCLtiaTtioDtioHtioTtiojtipDtipHtipXtipztiqDtiqTtiqztirHtirjtirntirztir/ti4Dti4Lti4jti4nti4vti5Tti5jti5zti6Tti6Xti7Dti7Hti7Tti7jtjIDtjIHtjIPtjIXtjIztjI3tjI7tjJDtjJTtjJbtjJztjJ3tjJ/tjKDtjKHtjKXtjKjtjKntjKztjLDtjLjtjLntjLvtjLztjL3tjYTtjYXtjbztjb3tjoDtjoTtjoztjo3tjo/tjpDtjpHtjpjtjpntjpztjqDtjqjtjqntjqvtjq3tjrTtjrjtjrztj4Ttj4Xtj4jtj4ntj5Dtj5jtj6Htj6Ptj6ztj63tj7Dtj7Ttj7ztj73tj7/tkIFcIl0sW1wiYzdhMVwiLFwi7ZCI7ZCd7ZGA7ZGE7ZGc7ZGg7ZGk7ZGt7ZGv7ZG47ZG57ZG87ZG/7ZKA7ZKC7ZKI7ZKJ7ZKL7ZKN7ZKU7ZKp7ZOM7ZOQ7ZOU7ZOc7ZOf7ZOo7ZOs7ZOw7ZO47ZO77ZO97ZSE7ZSI7ZSM7ZSU7ZSV7ZSX7ZS87ZS97ZWA7ZWE7ZWM7ZWN7ZWP7ZWR7ZWY7ZWZ7ZWc7ZWg7ZWl7ZWo7ZWp7ZWr7ZWt7ZW07ZW17ZW47ZW87ZaE7ZaF7ZaH7ZaI7ZaJ7ZaQ7Zal7ZeI7ZeJ7ZeM7ZeQ7ZeS7ZeY7ZeZ7Zeb7Zed7Zek7Zel7Zeo7Zes7Ze07Ze17Ze37Ze57ZiA7ZiB7ZiE7ZiI7ZiQ7ZiR7ZiT7ZiU7ZiV7Zic7ZigXCJdLFtcImM4YTFcIixcIu2YpO2Yre2YuO2Yue2YvO2ZgO2Zhe2ZiO2Zie2Zi+2Zje2Zke2ZlO2Zle2ZmO2ZnO2Zp+2Zqe2ZsO2Zse2ZtO2ag+2ahe2ajO2aje2akO2alO2ane2an+2aoe2aqO2arO2asO2aue2au+2bhO2bhe2biO2bjO2bke2blO2bl+2bme2boO2bpO2bqO2bsO2bte2bvO2bve2cgO2chO2cke2cmO2cme2cnO2coO2cqO2cqe2cq+2cre2ctO2cte2cuO2cvO2dhO2dh+2die2dkO2dke2dlO2dlu2dl+2dmO2dme2doO2doe2do+2dpe2dqe2drO2dsO2dtO2dvO2dve2ege2eiO2eie2ejO2ekO2emO2eme2em+2enVwiXSxbXCJjYWExXCIsXCLkvL3kvbPlgYflg7nliqDlj6/lkbXlk6XlmInlq4Hlrrbmmofmnrbmnrfmn6/mrYznj4Lnl4LnqLzoi5vojITooZfooojoqLbos4jot4/ou7vov6bpp5XliLvljbTlkITmgarmhaTmrrznj4/ohJroprrop5LplqPkvoPliIrlor7lpbjlp6blubLlubnmh4fmj4DmnYbmn6zmob/mvpfnmY7nnIvno7XnqIjnq7/nsKHogp3oia7oibHoq6vplpPkuavllp3mm7fmuLTnoqPnq63okZvopJDonY7pnqjli5jlnY7loKrltYzmhJ/mhr7miKHmlaLmn5HmqYTmuJvnlJjnlrPnm6PnnrDntLrpgq/pkZHpkZLpvpVcIl0sW1wiY2JhMVwiLFwi5Yyj5bKs55Sy6IOb6YmA6ZaY5Ymb5aCI5aec5bKh5bSX5bq35by65b2K5oW35rGf55W655aG57Og57Wz57ax576M6IWU6Iih6JaR6KWB6Kyb6Yu86ZmN6bGH5LuL5Lu35YCL5Yex5aGP5oS35oS+5oWo5pS55qeq5ryR55al55qG55uW566H6Iql6JOL76SA6Y6n6ZaL5ZaA5a6i5Z2R76SB57Kz57656Ya15YCo5Y675bGF5beo5ouS5o2u5pOa5pOn5rig54Ks56Wb6Led6Lie76SC6YG96YmF6Yu45Lm+5Lu25YGl5be+5bu65oSG5qWX6IWx6JmU6LmH6Y216air5Lme5YKR5p2w5qGA5YSJ5YqN5YqS5qqiXCJdLFtcImNjYTFcIixcIueevOmIkOm7lOWKq+aAr+i/suWBiOaGqeaPreaTiuagvOaqhOa/gOiGiOimoemalOWgheeJveeKrOeUhOe1uee5reiCqeimi+ittOmBo+m1keaKieaxuua9lOe1kOe8uuioo+WFvOaFiueuneismemJl+mOjOS6rOS/k+WAnuWCvuWEhuWLgeWLjeWNv+WdsOWig+W6muW+keaFtuaGrOaTjuaVrOaZr+aau+abtOail+a2h+eCheeDseeSn+eSpeeTiueXmeehrOejrOern+ertue1hee2k+iAleiAv+iEm+iOluitpui8lemAlemPoemgg+mguOmpmumvqOS/guWVk+WguuWlkeWto+WxhuaCuOaIkuahguaisFwiXSxbXCJjZGExXCIsXCLmo6jmuqrnlYznmbjno47nqL3ns7vnuavnubzoqIjoqqHosL/pmo7pt4Tlj6Tlj6nlkYrlkbHlm7rlp5HlraTlsLvluqvmi7fmlLfmlYXmlbLmmqDmnq/mp4Hmsr3nl7znmpDnnb7nqL/nvpTogIPogqHoho/oi6boi73oj7Dol4HooLHoorToqqXvpIPovpzpjK7pm4fpoafpq5jpvJPlk63mlpvmm7Lmoo/nqYDosLfptaDlm7DlnaTltJHmmIbmorHmo43mu77nkKjoop7pr6TmsajvpITpqqjkvpvlhazlhbHlip/lrZTlt6XmgZDmga3mi7HmjqfmlLvnj5nnqbromqPosqLpno/kuLLlr6HmiIjmnpznk5xcIl0sW1wiY2VhMVwiLFwi56eR6I+T6KqH6Kqy6Leo6YGO6Y2L6aGG5buT5qeo6Je/6YOt76SF5Yag5a6Y5a+s5oWj5qO65qy+54GM55Cv55OY566h572Q6I+F6KeA6LKr6Zec6aSo5Yiu5oGd5ous6YCC5L6K5YWJ5Yyh5aOZ5buj5pug5rS454Ka54uC54+W562Q6IOx6ZGb5Y2m5o6b572r5LmW5YKA5aGK5aOe5oCq5oSn5ouQ5qeQ6a2B5a6P57SY6IKx6L2f5Lqk5YOR5ZKs5Zas5ayM5bag5ben5pSq5pWO5qCh5qmL54uh55qO55+v57We57+56Iag6JWO6Juf6LyD6L2O6YOK6aSD6amV6a6r5LiY5LmF5Lmd5LuH5L+x5YW35Yu+XCJdLFtcImNmYTFcIixcIuWNgOWPo+WPpeWSjuWYlOWdteWeouWvh+W2h+W7kOaHvOaLmOaVkeaeuOafqeani+atkOavhuavrOaxgua6neeBuOeLl+eOlueQg+eev+efqeeptue1v+iAieiHvOiIheiIiuiLn+ihouiss+izvOi7gOmAkemCsemJpOmKtumnkumphemzqem3l+m+nOWci+WxgOiPiumeoOmeq+m6tOWQm+eqmOe+pOijmei7jemDoeWggOWxiOaOmOeqn+WuruW8k+epueeqruiKjui6rOWApuWIuOWLuOWNt+WciOaLs+aNsuasiua3g+ect+WOpeeNl+iVqOi5tumXleacuuarg+a9sOiprei7jOmli++khuaZt+atuOiytFwiXSxbXCJkMGExXCIsXCLprLzvpIflj6vlnK3lpY7mj4bmp7vnj6rnoYXnqrrnq4Xns77okbXopo/otbPpgLXplqjli7vlnYfnlYfnraDoj4zpiJ7vpIjmqZjlhYvliYvliofmiJ/mo5jmpbXpmpnlg4XliqTli6Tmh4PmlqTmoLnmp7/nkb7nrYvoirnoj6voprLorLnov5HppYnvpInku4rlppfmk5LmmJHmqo7nkLTnpoHnpr3oiqnoob7oob/opZ/vpIrpjKbkvIvlj4rmgKXmibHmsbLntJrntabkupjlhaLnn5zogq/kvIHkvI7lhbblhoDll5zlmajlnLvln7rln7zlpJTlpYflppPlr4TlspDltI7lt7Hlub7lv4zmioDml5fml6NcIl0sW1wiZDFhMVwiLFwi5pye5pyf5p2e5qOL5qOE5qmf5qy65rCj5rG95rKC5reH546Y55Cm55Cq55KC55Kj55W455W/56KB56Ov56WB56WH56WI56W6566V57SA57a6576I6ICG6ICt6IKM6KiY6K2P6LGI6LW36Yyh6Yyk6aOi6aWR6aiO6aiP6aml6bqS57eK5L225ZCJ5ouu5qGU6YeR5Zar5YS676SL76SM5aic5oem76SN5ouP5ou/76SOXCIsNSxcIumCo++klFwiLDQsXCLoq77vpJnvpJrvpJvvpJzmmpbvpJ3nhZbvpJ7vpJ/pm6PvpKDmjY/mjbrljZfvpKHmno/mpaDmubPvpKLnlLfvpKPvpKTvpKVcIl0sW1wiZDJhMVwiLFwi57SN76Sm76Sn6KGy5ZuK5aiY76SoXCIsNCxcIuS5g++kreWFp+WliOafsOiAkO+kruWls+W5tOaSmueniuW/teaBrOaLiOaNu+Wvp+Wvl+WKqu+kr+WltOW8qeaAku+ksO+kse+ksueRme+ks1wiLDUsXCLpp5HvpLlcIiwxMCxcIua/g++lhO+lheiGv+i+suaDse+lhu+lh+iFpu+liO+lieWwv++lilwiLDcsXCLlq6noqKXmnbvntJDvpZJcIiw1LFwi6IO976WY76WZ5bC85rOl5Yy/5rq65aSa6Iy2XCJdLFtcImQzYTFcIixcIuS4ueS6tuS9huWWruWcmOWjh+W9luaWt+aXpuaqgOautea5jeefreerr+ewnue3nuibi+iikumEsumNm+aSu+a+vueNuueWuOmBlOWVluWdjeaGuuaTlOabh+a3oea5m+a9rea+ueeXsOiBg+iGveiVgeimg+irh+itmumMn+ayk+eVk+etlOi4j+mBneWUkOWgguWhmOW5ouaIh+aSnuajoOeVtuezluies+m7qOS7o+WeiOWdruWkp+WwjeWyseW4tuW+heaItOaToeeOs+iHuuiii+iyuOmaium7m+WuheW+t+aCs+WAkuWIgOWIsOWcluWgteWhl+WwjuWxoOWztuW2i+W6puW+kuaCvOaMkeaOieaQl+ahg1wiXSxbXCJkNGExXCIsXCLmo7nmq4Lmt5jmuKHmu5Tmv6Tnh77nm5znnbnnprHnqLvokITopqnos63ot7PouYjpgIPpgJTpgZPpg73pjY3pmbbpn5zmr5LngIbniZjniqLnjajnnaPnpr/nr6TnupvoroDloqnmg4fmlabml73mmr7msoznhJ7nh4nosZrpoJPkua3nqoHku53lhqzlh43li5XlkIzmhqfmnbHmoZDmo5/mtJ7mvbznlrznnrPnq6Xog7TokaPpioXlhZzmlpfmnZzmnpPnl5jnq4fojbPvpZrosYbpgJfpoK3lsa/oh4DoiprpgYHpga/piI3lvpfltp3mqZnnh4jnmbvnrYnol6TorITphKfpqLDllofmh7bvpZvnmannvoVcIl0sW1wiZDVhMVwiLFwi6Ji/6J666KO46YKP76Wc5rSb54OZ54+e57Wh6JC976Wd6YWq6aex76We5LqC5Y215qyE5qyS54C+54ib6Jit6bie5YmM6L6j5bWQ5pOl5pSs5qyW5r+r57GD57qc6JeN6KWk6Ka95ouJ6IeY6KCf5buK5pyX5rWq54u855CF55Gv6J6C6YOe5L6G5bSN5b6g6JCK5Ya35o6g55Wl5Lqu5YCG5YWp5YeJ5qKB5qiR57Ku57Kx57On6Imv6KuS6Lyb6YeP5L625YS35Yu15ZGC5bus5oWu5oi+5peF5qua5r++56Sq6Jec6KCj6Zat6ami6amq6bqX6buO5Yqb5puG5q2354Cd56Sr6L2i6Z2C5oaQ5oiA5pSj5ryjXCJdLFtcImQ2YTFcIixcIueFieeSiee3tOiBr+iTrui8pumAo+mNiuWGveWIl+WKo+a0jOeDiOijguW7ieaWguaurua/guewvueNteS7pOS8tuWbue+ln+WyuuW2uuaAnOeOsuesree+mue/juiBhumAnumItOmbtumdiOmgmOm9oeS+i+a+p+emrumGtOmat+WLnu+loOaSiOaThOark+a9nueAmOeIkOebp+iAgeiYhuiZnOi3r+i8hemcsumtr+m3uum5teeijOelv+e2oOiPiemMhOm5v+m6k+irluWjn+W8hOacp+eAp+eTj+exoOiBvuWEoeeAqOeJouejiuizguizmuiztOmbt+S6huWDmuWvruW7luaWmeeHjueZgueereiBiuiTvFwiXSxbXCJkN2ExXCIsXCLpgbzprKfpvo3lo5jlqYHlsaLmqJPmt5rmvI/nmLvntK/nuLfolJ7opLjpj6TpmYvlionml5Lmn7PmprTmtYHmupzngI/nkInnkaDnlZnnmKTnoavorKzpoZ7lha3miK7pmbjkvpblgKvltJnmt6rntrjovKrlvovmhYTmoJfvpaHpmobli5Logovlh5zlh4zmpZ7nqJzntr7oj7HpmbXkv5rliKnljpjlkI/llI7lsaXmgqfmnY7moqjmtaznioHni7jnkIbnkoPvpaLnl6Lnsaznvbnnvrjojonoo4/oo6Hph4zph5Dpm6Lpr4nlkJ3mvb7nh5Dnkpjol7rouqrpmqPpsZfpup/mnpfmt4vnkLPoh6jpnJbnoKxcIl0sW1wiZDhhMVwiLFwi56uL56yg57KS5pGp55Gq55ey56K856Oo6aas6a2U6bq75a+e5bmV5ryg6Iac6I6r6YKI5LiH5Y2N5aip5beS5b2O5oWi5oy95pmp5pu85ru/5ryr54Gj556e6JCs6JST6KC76LyT6aWF6bC75ZSc5oq55pyr5rKr6IyJ6KWq6Z265Lqh5aaE5b+Y5b+Z5pyb57ay572U6IqS6Iyr6I696Lye6YKZ5Z+L5aa55aqS5a+Q5pin5p6a5qKF5q+P54Wk57216LK36LOj6YKB6a2F6ISI6LKK6ZmM6amA6bql5a2f5rCT54yb55uy55uf6JCM5Yaq6KaT5YWN5YaV5YuJ5qOJ5rKU55yE55yg57a/57es6Z2i6bq15ruFXCJdLFtcImQ5YTFcIixcIuiUkeWGpeWQjeWRveaYjuaaneakp+a6n+eav+eekeiMl+iTguien+mFqemKmOmztOiiguS+ruWGkuWLn+WnhuW4veaFleaRuOaRueaaruafkOaooeavjeavm+eJn+eJoeeRgeecuOefm+iAl+iKvOiMheisgOisqOiyjOacqOaykOeJp+ebruedpuephum2qeatv+aykuWkouacpuiSmeWNr+Wik+WmmeW7n+aPj+aYtOads+a4uueMq+erl+iLl+mMqOWLmeW3q+aGruaHi+aIiuaLh+aSq+aXoOalmeatpuavi+eEoeePt+eVnee5huiInuiMguiVquiqo+iyv+mcp+m1oeWiqOm7mOWAkeWIjuWQu+WVj+aWh1wiXSxbXCJkYWExXCIsXCLmsbbntIrntIvogZ7omorploDpm6/li7/mspXnianlkbPlqprlsL7ltYvlvYzlvq7mnKrmorbmpaPmuLzmuYTnnInnsbPnvo7oloforI7ov7fpnaHpu7TlsrfmgrbmhI3mhqvmlY/ml7vml7zmsJHms6/njp/nj4nnt6HplpTlr4bonJzorJDliZ3ljZrmi43mkI/mkrLmnLTmqLjms4rnj4Dnkp7nrpTnspXnuJvohoroiLboloTov6vpm7npp4HkvLTljYrlj43lj5vmi4zmkKzmlIDmlpHmp4Pms67mvZjnj63nlZTnmKLnm6Tnm7zno5Dno7vnpKzntYboiKzon6Dov5TpoJLpo6/li4Pmi5TmkqXmuKTmvZFcIl0sW1wiZGJhMVwiLFwi55m86LeL6Yax6Ymi6auu6a2D5YCj5YKN5Z2K5aao5bCo5bmH5b235oi/5pS+5pa55peB5piJ5p6L5qac5ruC56OF57Sh6IKq6IaA6Iir6Iqz6JKh6JqM6Kiq6KyX6YKm6Ziy6b6Q5YCN5L+z76Wj5Z+55b6Y5ouc5o6S5p2v5rmD54SZ55uD6IOM6IOa6KO06KO16KSZ6LOg6Lyp6YWN6Zmq5Lyv5L2w5bib5p+P5qCi55m955m+6a2E5bmh5qiK54Wp54eU55Wq76Wk57mB6JWD6Jep6aOc5LyQ562P572w6Zal5Yeh5biG5qK15rC+5rGO5rOb54qv56+E6IyD5rOV55C65YO75YqI5aOB5pOY5qqX55Kn55mWXCJdLFtcImRjYTFcIixcIueip+iYl+mXoumcue+lpeWNnuW8geiuiui+qOi+r+mCiuWIpeeepemxiem8iOS4meWAguWFteWxm+W5t+aYnuaYuuafhOajheeCs+eUgeeXheenieernei8p+mkoOmoiOS/neWgoeWgseWvtuaZruatpea0kea5uua9veePpOeUq+iPqeijnOikk+itnOi8lOS8j+WDleWMkOWNnOWuk+W+qeacjeemj+iFueiMr+iUlOikh+imhui8uei8u+mmpemwkuacrOS5tuS/uOWlieWwgeWzr+WzsOaNp+ajkueDveeGoueQq+e4q+iTrOicgumAoumLkumzs+S4jeS7mOS/r+WCheWJluWJr+WQpuWSkOWfoOWkq+WpplwiXSxbXCJkZGExXCIsXCLlrZrlrbXlr4zlupzvpabmibbmlbfmlqfmta7muqXniLbnrKbnsL/nvLbohZDohZHohproiYDoipnojqnoqIPosqDos6bos7votbTotrrpg6jph5zpmJzpmYTpp5nps6fljJfliIblkKnlmbTlorPlpZTlpa7lv7/mhqTmia7mmJDmsb7nhJrnm4bnsonns57ntJvoiqzos4Hpm7DvpafkvZvlvJflvb/mi4LltKnmnIvmo5rnobznuYPptazkuJXlgpnljJXljKrljZHlpoPlqaLluofmgrLmhormiYnmibnmlpDmnofmpqfmr5Tmr5bmr5fmr5jmsrjvpajnkLXnl7rnoJLnopHnp5Xnp5jnsoPnt4vnv6HogqVcIl0sW1wiZGVhMVwiLFwi6IS+6IeC6I+y6Jya6KOo6Kq56K2s6LK76YSZ6Z2e6aOb6by75Zqs5ayq5b2s5paM5qqz5q6v5rWc5r+x54CV54md546t6LKn6LOT6aC75oaR5rC36IGY6aiB5LmN5LqL5Lqb5LuV5Ly65Ly85L2/5L+f5YO/5Y+y5Y+45ZSG5Zej5Zub5aOr5aWi5aiR5a+r5a+65bCE5bez5bir5b6Z5oCd5o2o5pac5pav5p+25p+75qKt5q275rKZ5rOX5rij54CJ542F56CC56S+56WA56Wg56eB56+p57SX57Wy6IKG6IiN6I6O6JOR6JuH6KOf6KmQ6Kme6Kyd6LOc6LWm6L6t6YKq6aO86aef6bqd5YmK76Wp5pyU76WqXCJdLFtcImRmYTFcIixcIuWCmOWIquWxseaVo+axleePiueUo+eWneeul+iSnOmFuOmcsOS5t+aSkuauuueFnuiWqeS4ie+lq+adieajrua4l+iKn+iUmOihq+aPt+a+gemIkumir+S4iuWCt+WDj+WEn+WVhuWWquWYl+WtgOWwmeWzoOW4uOW6iuW6oOW7guaDs+ahkeapoea5mOeIveeJgOeLgOebuOelpeeusee/lOijs+intOips+ixoeiznumcnOWhnueSveizveWXh++lrOepoee0ouiJsueJsueUn+eUpe+lreesmeWiheWju+W2vOW6j+W6tuW+kOaBleaKkuaNv+aVjeaakeabmeabuOagluajsueKgOeRnuetrue1rue3lue9slwiXSxbXCJlMGExXCIsXCLog6XoiJLolq/opb/oqpPpgJ3pi6Tpu43pvKDlpJXlpa3luK3mg5zmmJTmmbPmnpDmsZDmt4XmvZ/nn7Pnoqnok4bph4vpjKvku5nlg4rlhYjlloTlrIvlrqPmiYfmlb7ml4vmuLLnhb3nkIHnkYTnkofnkr/nmaznpqrnt5rnuZXnvqjohbrohrPoiLnomJron6zoqbXot6PpgbjpipHpkKXppY3prq7ljajlsZHmpZTms4TmtKnmuKvoiIzolpvopLvoqK3oqqrpm6rpvafliaHmmrnmrrLnupbon77otI3ploPpmZ3mlJ3mtonnh67vpa7ln47lp5PlrqzmgKfmg7rmiJDmmJ/mmZ/njKnnj7nnm5vnnIHnraxcIl0sW1wiZTFhMVwiLFwi6IGW6IGy6IWl6Kqg6YaS5LiW5Yui5q2y5rSX56iF56y557Sw76Wv6LKw5Y+s5Ziv5aGR5a615bCP5bCR5bei5omA5o6D5pCU5pit5qKz5rK85raI5rqv54Cf54Kk54eS55Sm55aP55aO55iZ56yR56+g57Cr57Sg57S56JSs6JWt6JiH6Ki06YCN6YGh6YK16Yq36Z+26ai35L+X5bGs5p2f5raR57Kf57qM6KyW6LSW6YCf5a2r5be95pCN6JOA6YGc6aOh546H5a6L5oKa5p2+5ree6Kif6Kqm6YCB6aCM5Yi376Ww54GR56KO6Y6W6KGw6YeX5L+u5Y+X5Ze95Zua5Z6C5aO95auC5a6I5bKr5bOA5bil5oSBXCJdLFtcImUyYTFcIixcIuaIjeaJi+aOiOaQnOaUtuaVuOaoueauiuawtOa0mea8seeHp+eLqeeNuOeQh+eSsueYpuedoeengOepl+erqueyuee2j+e2rOe5oee+nuiEqeiMseiSkOiTmuiXquiiluiqsOiukOi8uOmBgumCg+mFrOmKlumKuemai+map+maqOmblumcgOmgiOmmlumrk+msmuWPlOWhvuWkmeWtsOWuv+a3kea9mueGn+eQoeeSueiCheiPveW3oeW+h+W+quaBguaXrOagkualr+apk+auiea0tea3s+ePo+ebvueerOetjee0lOiEo+iInOiNgOiTtOiVo+ipouirhOmGh+mMnumghummtOaIjOihk+i/sOmJpeW0h+W0p1wiXSxbXCJlM2ExXCIsXCLltannkZ/ohp3onajmv5Xmi77nv5LopLbopbLkuJ7kuZjlg6fli53ljYfmib/mmIfnuanooIXpmZ7kvo3ljJnlmLblp4vlqqTlsLjlsY7lsY3luILlvJHmgYPmlr3mmK/mmYLmnr7mn7TnjJznn6LnpLrnv4XokpTok43oppboqaboqanoq6HosZXosbrln7Tlr5TlvI/mga/mi63mpI3mrpbmuZznhoTnr5LonZXorZjou77po5/po77kvLjkvoHkv6HlkbvlqKDlrrjmhLzmlrDmmajnh7znlLPnpZ7ntLPohY7oh6Pojpjolqrol47onIPoqIrouqvovpvvpbHov4XlpLHlrqTlr6bmgonlr6nlsIvlv4PmsoFcIl0sW1wiZTRhMVwiLFwi76Wy5rex54CL55Sa6Iqv6Ku25LuA5Y2B76Wz6ZuZ5rCP5Lqe5L+E5YWS5ZWe5ail5bOo5oiR54mZ6Iq96I6q6Ju+6KGZ6Kid6Zi/6ZuF6aST6bSJ6bWd5aCK5bKz5ba95bmE5oOh5oSV5o+h5qiC5ril6YSC6Y2U6aGO6bCQ6b235a6J5bK45oyJ5pmP5qGI55y86ZuB6Z6N6aGU6a6f5pah6KyB6LuL6Za85ZS15bKp5beW5bq15pqX55mM6I+06ZeH5aOT5oq854uO6bSo5Luw5aSu5oCP5pi75q6D56en6bSm5Y6T5ZOA5Z+D5bSW5oSb5puW5rav56KN6Im+6ZqY6Z2E5Y6E5om85o6W5ray57iK6IWL6aGNXCJdLFtcImU1YTFcIixcIuaru+e9jOm2r+m4muS5n+WAu+WGtuWknOaDueaPtuaksOeIuuiAtu+ltOmHjuW8se+lte+ltue0hOiLpeiRr+iSu+iXpei6je+lt+S9r++luO+lueWjpOWtg+aBmeaPmuaUmOaVreaamO+luualiuaoo+a0i+eAgeeFrOeXkueYjeems+epsO+lu+e+iu+lvOilhO+lveiuk+mHgOmZve+lvumkiuWchOW+oeaWvOa8geeYgOempuiqnummremtmum9rOWEhOaGtuaKkeaqjeiHhuWBg+WgsOW9pueEieiogOiruuWtvOiYluS/uuWEvOWatOWlhOaOqea3ueW2qualreWGhuS6iOS9me+lv++mgO+mgeWmgu+mglwiXSxbXCJlNmExXCIsXCLvpoPmrZ/msZ3vpoTnkrXnpJbvpoXoiIfoiYXojLnovL/ovZ3vpobppJjvpofvpojvponkuqbvporln5/lvbnmmJPvpovvpoznlqvnubnora/vpo3pgIbpqZvlmqXloKflp7jlqJ/lrrTvpo7lu7bvpo/vppDmjZDmjLvvppHmpL3msofmsr/mto7mtpPmt7XmvJTvppLng5/nhLbnhZnvppPnh4Pnh5XvppTnoY/noa/vppXnrbXnt6PvppbnuK/vppfooY3ou5/vppjvppnvpprpiZvvppvps7bvppzvpp3vpp7mgoXmtoXvpp/nhrHvpqDvpqHplrHljq3vpqLvpqPvpqTmn5PvpqXngo7nhLDnkLDoibboi5JcIl0sW1wiZTdhMVwiLFwi76am6Za76aul6bm95puE76an54eB6JGJ76ao76ap5aGL76aq76ar5ba45b2x76as5pig5pqO5qW55qau5rC45rOz5ri25r2B5r+a54Cb54Cv54WQ54ef542w76at55Gb76au55OU55uI56mO57qT76av76aw6Iux6Kmg6L+O76ax6Y2I76ay6ZyZ76az76a05LmC5YCq76a15YiI5Y+h5puz5rGt5r+K54yK552/56mi6Iqu6Jed6JiC76a26KOU6Kmj6K296LGr76a36Yqz76a46ZyT6aCQ5LqU5LyN5L+J5YKy5Y2I5ZC+5ZCz5Zea5aGi5aK65aWn5aib5a+k5oKf76a55oeK5pWW5pe/5pmk5qKn5rGa5r6zXCJdLFtcImU4YTFcIixcIueDj+eGrOeNkuetveiciOiqpOmwsum8h+Wxi+ayg+eNhOeOiemIuua6q+eRpeeYn+epqee4leiYiuWFgOWjheaTgeeTrueUleeZsOe/gemClembjemllOa4pueTpueqqeeqquiHpeibmeiduOiom+WpieWujOWum+aioeakgOa1o+eOqeeQk+eQrOeil+e3qee/q+iEmOiFleiOnuixjOmYrumgkeabsOW+gOaXuuaeieaxqueOi+WAreWog+atquefruWkluW1rOW3jeeMpeeVj++muu+mu+WDpeWHueWgr+WkreWmluWnmuWvpe+mvO+mveW2ouaLl+aQluaSk+aTvu+mvuabnO+mv+apiO+ngOeHv+eRpO+ngVwiXSxbXCJlOWExXCIsXCLnqojnqq/nuYfnuZ7ogIDohbDvp4Lon6/opoHorKDpgZnvp4PpgoDppZLmhb7mrLLmtbTnuJ/opKXovrHkv5Hlgq3lhpfli4fln4floonlrrnlurjmhYLmppXmtozmuafmurbnhpTnkaLnlKjnlKzogbPojLjok4nouIrpjpTpj57vp4Tkuo7kvZHlgbblhKrlj4jlj4vlj7Plroflr5PlsKTmhJrmhoLml7TniZvnjpfnkYDnm4LnpZDnppHnprnntIbnvr3oiovol5XomZ7ov4LpgYfpg7Xph6rpmoXpm6jpm6nli5blvafml63mmLHmoK/nhZznqLbpg4HpoIrkupHvp4XmqZLmrp7mvpDnhonogJjoirjolZNcIl0sW1wiZWFhMVwiLFwi6YGL6ZqV6Zuy6Z+76JSa6ayx5LqQ54aK6ZuE5YWD5Y6f5ZOh5ZyT5ZyS5Z6j5aqb5auE5a+D5oCo5oS/5o+05rKF5rS55rmy5rqQ54iw54y/55GX6IuR6KKB6L2F6YGg76eG6Zmi6aGY6bSb5pyI6LaK6Yme5L2N5YGJ5YOe5Y2x5ZyN5aeU5aiB5bCJ5oWw5pqQ5rit54iy55GL57ev6IOD6JCO6JGm6JS/6J2f6KGb6KSY6KyC6YGV6Z+L6a2P5Lmz5L6R5YSS5YWq76eH5ZSv5Zap5a265a6l5bm85bm95bq+5oKg5oOf5oSI5oSJ5o+E5pS45pyJ76eI5p+U5p+a76eJ5qWh5qWi5rK55rSn76eK5ri476eLXCJdLFtcImViYTFcIixcIua/oeeMtueMt++njOeRnOeUse+njeeZku+nju+nj+e2reiHvuiQuOijleiqmOirm+irrei4sOi5gumBiumAvumBuumFiemHiemNru+nkO+nkeWgie+nkuavk+iCieiCsu+nk++nlOWFgeWlq+Wwue+nle+nlua9pOeOp+iDpOi0h++nl+mIl+mWj++nmO+nme+nmu+nm+iBv+aIjueAnOe1qOieje+nnOWeoOaBqeaFh+aut+iqvumKgOmaseS5meWQn+a3q+iUremZsOmfs+mjruaPluazo+mCkeWHneaHieiGuum3ueS+neWAmuWEgOWunOaEj+aHv+aTrOakheavheeWkeefo+e+qeiJpOiWj+ifu+iho+iqvFwiXSxbXCJlY2ExXCIsXCLorbDphqvkuozku6XkvIrvp53vp57lpLflp6jvp5/lt7LlvJvlvZvmgKHvp6Dvp6Hvp6Lvp6PniL7nj6Xvp6TnlbDnl43vp6Xnp7vvp6bogIzogLPogoToi6HojZHvp6fvp6josr3osrPpgofvp6nvp6rpo7TppIzvp6vvp6zngLfnm4rnv4rnv4znv7zorJrkurrku4HliIPljbDvp63lkr3lm6Dlp7vlr4XlvJXlv43mua7vp67vp6/ntarojLXvp7DompPoqo3vp7Hpna3pnbfvp7Lvp7PkuIDkvZrkvb7lo7nml6XmuqLpgLjpjrDpprnku7vlo6zlporlp5nmgYHvp7Tvp7XnqJTvp7bojY/os4PlhaXljYRcIl0sW1wiZWRhMVwiLFwi76e376e476e55LuN5Ymp5a2V6Iq/5LuU5Yi65ZKo5aeJ5ae/5a2Q5a2X5a2c5oGj5oWI5ruL54KZ54Wu546G55O355a156OB57Sr6ICF6Ieq6Iyo6JSX6JeJ6Kuu6LOH6ZuM5L2c5Yu65Zq85par5pio54G854K454i157a96IqN6YWM6ZuA6bWy5a2x5qOn5q6Y5r2655ue5bKR5pqr5r2b566057Cq6KC26Zuc5LiI5LuX5Yyg5aC05aK75aOv5aWs5bCH5biz5bqE5by15o6M5pqy5p2W5qif5qqj5qyM5ry/54mG76e6542Q55KL56ug57Kn6IW46Ief6Ien6I6K6JGs6JSj6JaU6JeP6KOd6LST6Yas6ZW3XCJdLFtcImVlYTFcIixcIumanOWGjeWTieWcqOWusOaJjeadkOagveaik+a4vea7k+eBvee4oeijgeiyoei8iem9i+m9jueIreeuj+irjemMmuS9h+S9juWEsuWSgOWnkOW6leaKteadtealruaol+ayrua4mueLmeeMqueWveeuuOe0teiLp+iPueiRl+iXt+ipm+iyr+i6h+mAmemCuOmbjum9n+WLo+WQiuWroeWvguaRmOaVtea7tOeLhO+nu+eahOepjeesm+exjee4vue/n+iNu+isq+iziui1pOi3oei5n+i/qui/uemBqemPkeS9g+S9uuWCs+WFqOWFuOWJjeWJquWhoeWhvOWloOWwiOWxleW7m+aCm+aIsOagk+auv+awiOa+sVwiXSxbXCJlZmExXCIsXCLnhY7nkKDnlLDnlLjnlZHnmbLnrYznrovnrq3nr4bnuo/oqa7ovL7ovYnpiL/pipPpjKLpkKvpm7vpoZrpoavppJ7liIfmiKrmipjmtZnnmaTnq4rnr4DntbbljaDlsr7lupfmvLjngrnnspjpnJHpro7pu57mjqXmkbronbbkuIHkupXkuq3lgZzlgbXlkYjlp4PlrprluYDluq3lu7flvoHmg4XmjLrmlL/mlbTml4zmmbbmmbjmn77mpajmqonmraPmsYDmt4Dmt6jmuJ/muZ7ngJ7ngqHnjo7nj73nlLrnnZvnoofnpo7nqIvnqb3nsr7nto7oiYfoqILoq6rosp7phK3phYrph5jpiabpi4zpjKDpnIbpnZZcIl0sW1wiZjBhMVwiLFwi6Z2c6aCC6byO5Yi25YqR5ZW85aCk5bid5byf5oKM5o+Q5qKv5r+f56Wt56ys6IeN6Ja66KO96Ku46LmE6YaN6Zmk6Zqb6Zy96aGM6b2K5L+O5YWG5YeL5Yqp5Ziy5byU5b2r5o6q5pON5pep5pmB5pu65pu55pyd5qKd5qOX5qe95ryV5r2u54Wn54el54iq55Kq55y656WW56Wa56ef56ig56qV57KX57Of57WE57mw6IKH6Je76Jqk6KmU6Kq/6LaZ6LqB6YCg6YGt6Yej6Zi76ZuV6bOl5peP57CH6Laz6Y+D5a2Y5bCK5Y2S5ouZ54yd5YCn5a6X5b6e5oKw5oWr5qOV5reZ55Cu56iu57WC57ac57ix6IWrXCJdLFtcImYxYTFcIixcIui4qui4temNvumQmOS9kOWdkOW3puW6p+aMq+e9quS4u+S9j+S+j+WBmuWnneiDhOWRquWRqOWXvuWlj+WumeW3nuW7muaZneacseafseagquazqOa0sua5iua+jeeCt+ePoOeWh+exjOe0gue0rOe2ouiIn+ibm+iou+iqhei1sOi6iui8s+mAsemFjumFkumRhOmnkOerueeypeS/iuWEgeWHhuWfiOWvr+Wzu+aZmeaovea1mua6lua/rOeEjOeVr+ero+igoumAoemBtembi+mnv+iMgeS4reS7suihhumHjeWNvearm+alq+axgeiRuuWinuaGjuabvuaLr+eDneeUkeeXh+e5kuiSuOitiei0iOS5i+WPqlwiXSxbXCJmMmExXCIsXCLlkqvlnLDlnYDlv5fmjIHmjIfmka/mlK/ml6jmmbrmnp3mnrPmraLmsaDmsprmvKznn6XnoKXnpYnnpZfntJnogqLohILoh7Poip3oirfonJjoqozvp7zotITotr7pgbLnm7TnqJnnqLfnuZTogbfllIfll5TlobXmjK/mkKLmmYnmmYvmoa3mppvmroTmtKXmurHnj43nkajnkqHnlZvnlrnnm6HnnJ7nnovnp6bnuInnuJ3oh7volK/oopfoqLros5Hou6vovrDpgLLpjq3pmaPpmbPpnIfkvoTlj7Hlp6rlq4nluJnmoY7nk4bnlr7np6nnqpLohqPom63os6rot4zov63mlp/mnJXvp73ln7fmvZfnt53ovK9cIl0sW1wiZjNhMVwiLFwi6Y+26ZuG5b615oey5r6E5LiU5L6Y5YCf5Y+J5Zef5bWv5beu5qyh5q2k56OL566a76e+6LmJ6LuK6YGu5o2J5pC+552A56qE6Yyv6ZG/6b2q5pKw5r6v54em55Ko55Oa56uE57CS57qC57Ky57qY6K6a6LSK6ZG96aSQ6aWM5Yi55a+f5pOm5pyt57Su5YOt5Y+D5aG55oWY5oWZ5oe65pas56uZ6K6S6K6W5YCJ5YCh5Ym15ZSx5ai85bug5b2w5oS05pWe5piM5pi25pqi5qeN5ruE5ryy54yW55ih56qT6IS56ImZ6I+W6JK85YK15Z+w5a+A5a+o5b2p5o6h56Cm57a16I+c6JSh6YeH6Ye15YaK5p+1562WXCJdLFtcImY0YTFcIixcIuiyrOWHhOWmu+aCveiZleWAnO+nv+WJlOWwuuaFveaImuaLk+aTsuaWpea7jOeYoOiEiui5oOmZn+mau+S7n+WNg+WWmOWkqeW3neaTheaziea3uueOlOepv+iIm+iWpuizpOi4kOmBt+mHp+mXoemYoemfhuWHuOWTsuWWhuW+ueaSpOa+iOe2tOi8n+i9jemQteWDieWwluayvua3u+eUm+eeu+ewveexpOipueirguWgnuWmvuW4luaNt+eJkueWiuedq+irnOiyvOi8kuW7s+aZtOa3uOiBveiPgeiri+mdkemvlu+ogOWJg+abv+a2lea7r+e3oOirpumArumBnumrlOWIneWJv+WTqOaGlOaKhOaLm+aiolwiXSxbXCJmNWExXCIsXCLmpJLmpZrmqLXngpLnhKbnoZ3npIHnpI7np5LnqI3ogpboibjoi5XojYnolYnosoLotoXphaLphovphq7kv4Plm5Hnh63nn5fonIDop7jlr7jlv5bmnZHpgqjlj6LloZrlr7XmgqTmhoHmkaDnuL3ogbDolKXpioPmkq7lgqzltJTmnIDlopzmir3mjqjmpI7mpbjmqJ7muavnmrrnp4voirvokKnoq4/otqjov73phJLphYvphpzpjJDpjJjpjprpm5vpqLbpsI3kuJHnlZznpZ3nq7rnrZHnr4nnuK7ok4TouZnoubTou7jpgJDmmKXmpL/nkYPlh7rmnK7pu5zlhYXlv6Dmspbon7LooZ3oobfmgrTohrXokINcIl0sW1wiZjZhMVwiLFwi6LSF5Y+W5ZC55Zi05ai25bCx54KK57+g6IGa6ISG6Iet6Laj6YaJ6amf6bey5YG05LuE5Y6g5oO75ris5bGk5L6I5YCk5Zek5bOZ5bmf5oGl5qKU5rK75reE54a+55eU55e055mh56ia56mJ57eH57e7572u6Ie06Jqp6Lyc6ZuJ6aaz6b2S5YmH5YuF6aOt6Kaq5LiD5p+S5ryG5L615a+i5p6V5rKI5rW455Cb56Cn6Yed6Y286J+E56ek56ix5b+r5LuW5ZKk5ZS+5aKu5aal5oOw5omT5ouW5py25qWV6Ii16ZmA6aax6aed5YCs5Y2T5ZWE5Z2876iB5omY76iC5pOi5pmr5p+d5r+B5r+v55Ci55C46KiXXCJdLFtcImY3YTFcIixcIumQuOWRkeWYhuWdpuW9iOaGmuatjueBmOeCree2u+iqleWlquiEq+aOoueciOiAveiyquWhlOaQreamu+WuleW4kea5r++og+iVqeWFjOWPsOWkquaAoOaFi+auhuaxsOazsOesnuiDjuiLlOi3humCsOmise+ohOaTh+a+pOaSkeaUhOWFjuWQkOWcn+iojuaFn+ahtu+oheeXm+etkue1semAmuWghuanjOiFv+ikqumAgOmgueWBuOWll+WmrOaKlemAj+msquaFneeJuemXluWdoeWphuW3tOaKiuaSreaTuuadt+azoua0vueIrOeQtuegtOe9t+iKrei3m+mgl+WIpOWdguadv+eJiOeTo+iyqei+pumIkVwiXSxbXCJmOGExXCIsXCLpmKrlhavlj63mjYzkvanllITmgpbmlZfmspvmtb/niYzni73nqJfopofosp3lva3mvo7ng7nohqjmhI7kvr/lgY/miYHniYfnr4fnt6jnv6npgY3pnq3pqJnosrblnarlubPmnrDokI3oqZXlkKDlrJbluaPlu6LlvIrmloPogrrolL3plonpmZvkvYjljIXljI3ljI/lkoblk7rlnIPluIPmgJbmipvmirHmjZXvqIbms6HmtabnlrHnoLLog57ohK/oi57okaHokrLooo3opJLpgIvpi6rpo73prpHluYXmmrTmm53ngJHniIbvqIfkv7Xlib3lvarmhZPmnZPmqJnmvILnk6Lnpajooajosbnpo4fpo4TpqYNcIl0sW1wiZjlhMVwiLFwi5ZOB56if5qWT6Ku36LGK6aKo6aau5b285oqr55ay55qu6KKr6YG/6ZmC5Yy55by85b+F5rOM54+M55Wi55aL562G6Iu+6aad5LmP6YC85LiL5L2V5Y6m5aSP5buI5piw5rKz55GV6I236J2m6LOA6YGQ6Zye6bCV5aOR5a246JmQ6KyU6ba05a+S5oGo5oKN5pex5rGX5ryi5r6j54Ca572V57+w6ZaR6ZaS6ZmQ6Z+T5Ymy6L2E5Ye95ZCr5ZK45ZWj5ZaK5qq75ra157eY6Imm6Yqc6Zm36bm55ZCI5ZOI55uS6Juk6Zak6ZeU6Zmc5Lqi5LyJ5aeu5aum5be35oGS5oqX5p2t5qGB5rKG5riv57y46IKb6IiqXCJdLFtcImZhYTFcIixcIu+oiO+oiemgheS6peWBleWSs+Wek+WlmuWtqeWus+aHiOalt+a1t+eAo+ifueino+ipsuirp+mCgumnremquOWKvuaguOWAluW5uOadj+iNh+ihjOS6q+WQkeWaruePpumElemfv+mkiemll+mmmeWZk+Win+iZm+ioseaGsuartueNu+i7kuath+maqumpl+WlleeIgOi1q+mdqeS/lOWztOW8puaHuOaZm+azq+eCq+eOhOeOueePvuecqeedjee1g+e1oue4o+iIt+ihku+oiuizoumJiemhr+WtkeeptOihgOmggeWrjOS/oOWNlOWkvuWzveaMvua1ueeLueiEheiEh+iOoumLj+mgsOS6qOWFhOWIkeWei1wiXSxbXCJmYmExXCIsXCLlvaLms4Lmu47ngIXngZDngq/nhpLnj6nnkanojYronqLooaHpgIjpgqLpjqPppqjlha7lvZfmg6DmhafmmrPolZnouYrphq/pnovkuY7kupLlkbzlo5Xlo7rlpb3lsrXlvKfmiLbmiYjmmIrmmafmr6vmtanmt4/muZbmu7jmvpTmv6Dmv6nngZ3ni5DnkKXnkZrnk6DnmpPnpZzns4rnuJ7og6Hoiqbokavokr/omY7omZ/onbTorbfosarpjqzpoIDpoaXmg5HmiJbphbflqZrmmI/mt7fmuL7nkL/prYLlv73mg5rnrI/lk4TlvJjmsZ7ms5PmtKrng5jntIXombnoqIzptLvljJblkozlrIXmqLrngavnlbVcIl0sW1wiZmNhMVwiLFwi56aN56a+6Iqx6I+v6Kmx6K2B6LKo6Z2076iL5pO05pSr56K656K756mr5Li45Zaa5aWQ5a6m5bm75oKj5o+b5q2h5pml5qGT5riZ54Wl55Kw57SI6YKE6amp6bCl5rS75ruR54y+6LGB6ZeK5Yew5bmM5b6o5oGN5oO25oSw5oWM5pmD5pmE5qal5rOB5rmf5ruJ5r2i54WM55Kc55qH56+B57Cn6I2S6J2X6YGR6ZqN6buD5Yyv5Zue5bu75b6K5oGi5oKU5oe35pmm5pyD5qqc5reu5r6u54Gw542q57mq6Ia+6Iy06JuU6Kqo6LOE5YqD542y5a6W5qmr6ZCE5ZOu5ZqG5a2d5pWI5paF5puJ5qKf5raN5reGXCJdLFtcImZkYTFcIixcIueIu+iCtOmFtempjeS+r+WAmeWOmuWQjuWQvOWWieWXheW4v+W+jOacveeFpuePnemAheWLm+WLs+WhpOWjjueEhOeGj+eHu+iWsOiok+aaiOiWqOWWp+aahOeFiuiQseWNieWWmeavgeW9meW+veaPruaaieeFh+irsei8nem6vuS8keaQuueDi+eVpuiZp+aBpOitjum3uOWFh+WHtuWMiOa0tuiDuOm7keaYleaso+eCmOeXleWQg+Wxuee0h+ioluasoOasveathuWQuOaBsOa0vee/leiIiOWDluWHnuWWnOWZq+WbjeWnrOWsieW4jOaGmeaGmOaIseaZnuabpueGmeeGueeGuueKp+emp+eogOe+suipsFwiXV1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvaWNvbnYtbGl0ZS9lbmNvZGluZ3MvdGFibGVzL2NwOTQ5Lmpzb25cbi8vIG1vZHVsZSBpZCA9IDE0N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFtbXCI4NzQwXCIsXCLkj7DksLLkmIPklqbklbjwp4mn5LW35Jaz8KeyseSzovCns4XjrpXknLbknYTksYfksYDwpIq/8KOYl/CnjZLwprqL8KeDkuSxl/CqjZHknY/kl5rksoXwp7Gs5LSH5Kqk5Jqh8Kaso+eIpfClqZTwoamj8KO4hvCjvaHmmY3lm7tcIl0sW1wiODc2N1wiLFwi57aV5aSd8KiuueO3tOmctPCnr6/lr5vwobWe5aqk45il8Km6sOWrkeWut+WzvOadruiWk/CppYXnkaHnkp3jobXwobWT8KOanvCmgKHju6xcIl0sW1wiODdhMVwiLFwi8KWjnuOrteervOm+l/CkhaHwqKSN8KOHqvCgqorwo4me5IyK6JKE6b6W6ZCv5KSw6JiT5aKW6Z2K6YiY56eQ56iy5pmg5qip6KKd55GM56+F5p6C56is5YmP6YGG45Om54+E8KW2ueeThum/h+Wes+Skr+WRjOSEsfCjmo7loJjnqbLwp62l6K6P5Jqu8Ka6iOSGgfCltpnnrq7wopK86b+I8KKTgfCik4nwopOM6b+J6JSE8KOWu+SCtOm/iuSTofCqt7/mi4Hnga7pv4tcIl0sW1wiODg0MFwiLFwi44eAXCIsNCxcIvCghIzjh4XwoIOR8KCDjeOHhuOHh/Cgg4vwob+o44eI8KCDiuOHieOHiuOHi+OHjPCghI7jh43jh47EgMOBx43DgMSSw4nEmsOIxYzDk8eRw5Lgv7/DisyE4bq+4L+/w4rMjOG7gMOKxIHDoceOw6DJkcSTw6nEm8OoxKvDrceQw6zFjcOzx5LDssWrw7rHlMO5x5bHmMeaXCJdLFtcIjg4YTFcIixcIsecw7zgv7/DqsyE4bq/4L+/w6rMjOG7gcOqyaHij5rij5tcIl0sW1wiODk0MFwiLFwi8KqOqfChhYVcIl0sW1wiODk0M1wiLFwi5pSKXCJdLFtcIjg5NDZcIixcIuS4vea7nem1jumHn1wiXSxbXCI4OTRjXCIsXCLwp5y15pKR5Lya5Lyo5L6o5YWW5YW05Yac5Yek5Yqh5Yqo5Yy75Y2O5Y+R5Y+Y5Zui5aOw5aSE5aSH5aSy5aS05a2m5a6e5a6f5bKa5bqG5oC75paJ5p++5qCE5qGl5rWO54K855S157qk57qs57q657uH57uP57uf57yG57y36Im66IuP6I2v6KeG6K6+6K+i6L2m6L2n6L2uXCJdLFtcIjg5YTFcIixcIueQkeezvOe3jealhuerieWIp1wiXSxbXCI4OWFiXCIsXCLphoznorjphZ7ogrxcIl0sW1wiODliMFwiLFwi6LSL6IO28KCnp1wiXSxbXCI4OWI1XCIsXCLogp/pu4fks43pt4npuIzksL7wqbe28KeAjum4ivCqhLPjl4FcIl0sW1wiODljMVwiLFwi5rqa6Ii+55SZXCJdLFtcIjg5YzVcIixcIuSkkemprOmqj+m+meemh/CokazwobeK8KCXkPCiq6bkuKTkuoHkuoDkuofkur/ku6vkvLfjkYzkvr3juYjlgIPlgojjkb3jkpPjkqXlhoblpIXlh5vlh7zliIXkuonlibnlipDljKfjl4fljqnjlZHljrDjlZPlj4LlkKPjla3jlbLjmoHlkpPlkqPlkrTlkrnlk5Dlk6/llJjllKPllKjjlpjllL/jlqXjlr/ll5fjl4VcIl0sW1wiOGE0MFwiLFwi8Ke2hOWUpVwiXSxbXCI4YTQzXCIsXCLwoLGC8KC0lfClhKvllpDworOG46es8KCNgei5hvCktrjwqZOl5IGT8KiCvueduvCisLjjqLTkn5XwqIWd8KansvCkt6rmk53woLW88KC+tPCgs5XwoYO05pKN6Lm+8KC6lvCgsIvwoL2k8KKyqfCoiZbwpJOTXCJdLFtcIjhhNjRcIixcIvCgtYbwqamN8KiDqeSftPCkuqfworOC6aqy46mn8KmXtOO/reOUhvCli4fwqZ+U8KejiPCitYTpta7poJVcIl0sW1wiOGE3NlwiLFwi5I+Z8KaCpeaStOWTo/CitYzwoq+K8KGBt+Onu/Chga9cIl0sW1wiOGFhMVwiLFwi8KabmvCmnJbwp6ag5pOq8KWBkvCgsYPouajwooah8KitjPCgnLFcIl0sW1wiOGFhY1wiLFwi5KCL8KCGqeO/uuWhs/Cito1cIl0sW1wiOGFiMlwiLFwi8KSXiPCgk7zwpoKX8KC9jPCgtpbllbnkgrvkjrpcIl0sW1wiOGFiYlwiLFwi5Kq08KKppvChgp3ohqrpo7XwoLac5o2546e+8KKdtei3gOWaoeaRvOO5g1wiXSxbXCI4YWM5XCIsXCLwqpiB8KC4ifCiq4/worOJXCJdLFtcIjhhY2VcIixcIvChg4jwo6eC46aS46iG8KiKm+OVuPCluYnwooOH5ZmS8KC8sfCisrLwqZyg45K85rC98KS4u1wiXSxbXCI4YWRmXCIsXCLwp5W08KK6i/CiiIjwqpmb8KizjfCgubrwoLC08KagnOe+k/Chg4/woqCD8KKkueOXu/Clh6PwoLqM8KC+jfCguqrjvpPwoLyw8KC1h/ChhY/woLmMXCJdLFtcIjhhZjZcIixcIvCguqvwoK6p8KC1iPChg4DwoYS947+58KKaluaQsvCgvq1cIl0sW1wiOGI0MFwiLFwi8KOPtPCnmLnwoq+O8KC1vvCgtb/worGR8KKxleOomPCgupjwoYOH8KC8rvCqmLLwpq2Q8KizkvCotpnwqLOK6Zaq5ZOM6IuE5Za5XCJdLFtcIjhiNTVcIixcIvCpu4PpsKbpqrbwp52e8KK3rueFgOiFreiDrOWwnPCmlbLohLTjnpfljZ/wqIK96Ya28KC7uvCguI/woLm38KC7u+OXnfCkt6vjmInwoLOW5Zqv8KKetfChg4nwoLiQ8KC5uPChgbjwoYWI8KiIh/ChkZXwoLm58KS5kPCitqTlqZTwoYCd8KGAnvChg7XwoYO25Z6c8KC4kVwiXSxbXCI4YmExXCIsXCLwp5qU8KiLjfCgvrXwoLm78KWFvuOcg/CgvrbwoYaA8KWLmPCqir3wpKea8KGguvCkhbfwqIm85aKZ5Ymo45ia8KWcveeusuWtqOSggOSsrOm8p+Snp+mwn+mujfClrbTwo4S95Ze745ey5ZqJ5Lio5aSC8KGvgfCvobjpnZHwoIKG5Lmb5Lq745S+5bCj5b2R5b+E46O65omM5pS15q265rC15rC654Gs54ir5Lis54qt8KSjqee9kueku+ezuee9k/Cmiarjk4FcIl0sW1wiOGJkZVwiLFwi8KaNi+iAguiCgPCmmJLwpqWR5Y2d6KGk6KeB8KeisuiuoOi0nemShemVuOmVv+mXqPCouI/pn6bpobXpo47po57ppaPwqaCQ6bG86bif6buE5q2v76SH5Li38KCCh+mYneaIt+mSolwiXSxbXCI4YzQwXCIsXCLlgLvmt77wqbGz6b6m47eJ6KKP8KSFjueBt+WzteSsoPClh43jlZnwpbSw5oSi8Kiosui+p+mHtueGkeacmeeOuvCjioHwqoSH47KL8KGmgOSskOejpOeQguWGrvConI/kgInmqaPwqoq65Iij6JiP8KCpr+eoqvCppYfwqKuq6Z2V54GN5Yyk8KKBvumPtOebmfCop6Ppvqfnn53kuqPkv7DlgrzkuK/kvJfpvqjlkLTntovlopLlo5Dwoba25bqS5bqZ5b+C8KKckuaWi1wiXSxbXCI4Y2ExXCIsXCLwo4+55qSZ5qmD8KOxo+azv1wiXSxbXCI4Y2E3XCIsXCLniIDwpJSF546M47ub8KSok+WsleeSueiug/ClsqTwpZqV56qT56+s57OD57ms6Iu46JaX6b6p6KKQ6b6q6Lq56b6r6L+P6JWf6aeg6Yih6b6s8Ki2ufChkL/kgbHkiqLlqJpcIl0sW1wiOGNjOVwiLFwi6aGo5p2r5Im25Zy9XCJdLFtcIjhjY2VcIixcIuiXlvCkpbvoir/wp4SN5LKB8Ka1tOW1u/CmrJXwpr6+6b6t6b6u5a6W6b6v5pun57mb5rmX56eK47aI5JOD8KOJlvCinpbkjprklLZcIl0sW1wiOGNlNlwiLFwi5bOV8KOsmuirueWxuOO0kvCjlZHltbjpvrLnhZfklZjwpIOs8KG4o+Sxt+OluOORivCghqTwprGB6KuM5L608KCIueWmv+iFrOmhlvCpo7rlvLtcIl0sW1wiOGQ0MFwiLFwi8KCun1wiXSxbXCI4ZDQyXCIsXCLwooeB8KilreSEguSau/CpgbnjvIfpvrPwqoa15IO445+W5Ju38KaxhuSFvPComrLwp4+/5JWt46OU8KWSmuSVoeSUm+S2ieSxu+S1tuSXquO/iPCkrI/jmaHkk57kkr3kh63ltL7ltYjltZbjt7zjoI/ltqTltrnjoKDjoLjluYLlur3lvKXlvoPjpIjjpJTjpL/jpY3mg5fmhL3ls6Xjponmhrfmhrnmh4/jprjmiKzmipDmi6XmjJjjp7jlmrFcIl0sW1wiOGRhMVwiLFwi46iD5o+i5o+75pCH5pGa46mL5pOA5bSV5Zih6b6f46qX5paG46q95pe/5pmT46uy5pqS46yi5pyW462C5p6k5qCA462Y5qGK5qKE462y462x46275qSJ5qWD54mc5qWk5qaf5qaF46685qeW46+d5qml5qm05qmx5qqC46+s5qqZ46+y5qqr5qq15quU5qu25q6B5q+B5q+q5rG15rKq47OL5rSC5rSG5rSm5raB47Ov5rak5rax5riV5riY5rip5rqG8KingOa6u+a7oua7mum9v+a7qOa7qea8pOa8tOO1hvCjvYHmvoHmvr7jtarjtbXnhrflspnjtorngKzjtpHngZDngZTnga/ngb/ngonwoIyl5I+B45ex8KC7mFwiXSxbXCI4ZTQwXCIsXCLwo7uX5Z6+8Ka7k+eEvvCln6DjmY7mpqLwqK+p5a2056mJ8KWjofCpk5nnqaXnqb3wpaas56q756qw56uC56uD54eR8KaSjeSHiuermuerneerquSHr+WSsvClsIHnrIvnrZXnrKnwpYyO8KWzvueuouetr+iOnPClrrTwprG/56+Q6JCh566S56648KW0oOO2rfClsaXokpLnr7rnsIbnsLXwpbOB57GE57KD8KSigueypuaZvfCklbjns4nns4fns6bnsbTns7Pns7Xns45cIl0sW1wiOGVhMVwiLFwi57mn5JSd8Ka5hOe1nfCmu5bnko3ntonntqvnhLXntrPnt5LwpIGX8KaAqee3pOO0k+e3tfChn7nnt6XwqI2t57id8KaEofCmhZrnua7nupLkjKvpkaznuKfnvYDnvYHnvYfnpLbwpouQ6aeh576X8KaNkee+o/ChmaHwoIGo5JWc8KOdpuSUg/CojLrnv7rwppKJ6ICF6ICI6ICd6ICo6ICv8KqCh/Cms4PogLvogLzogaHwopyU5KaJ8KaYpvCjt6Pwppuo5pyl6IKn8KipiOiEh+iEmuWisPCim7bmsb/wppKY8KS+uOaTp/ChkoroiJjwoaGe5qmT8KSppfCkqpXkkbroiKnwoKyN8KapkvCjtb7kv7nwoZO96JOi6I2i8KasivCkpqfwo5Sw8KGds/Cjt7joiqrmpJvwr6aU5IebXCJdLFtcIjhmNDBcIixcIuiVi+iLkOiMmvCguJbwoZ6045uB8KOFvfCjlZroibvoi6LojJjwo7qL8Ka2o/CmrIXwpq6X8KOXjuO2v+iMneWXrOiOheSUi/CmtqXojqzoj4Hoj5Pjkb7wpruU5qmX6JWa45KW8Ka5gvCiu6/okZjwpa+k6JGx47eT5JOk5qqn6JGK8KOyteelmOiSqPCmrpbwprm38Ka5g+iTnuiQj+iOkeSSoOiSk+iTpPClspHkiYDwpbOA5JWD6JS05auy8Ka6meSUp+iVs+SUluaev+iYllwiXSxbXCI4ZmExXCIsXCLwqJil8KiYu+iXgfCngojomILwoZaC8KeDjfCvprLklaromKjjmYjwoaKi5Y+38KeOmuiZvuidsfCqg7jon67worCn6J6x6J+a6KCP5Zmh6Jms5qGW5JiP6KGF6KGG8KeXoPCjtrnwp5ek6KGe6KKc5Jmb6KK06KK15o+B6KOF55238Kecj+imh+imiuimpuimqeimp+imvPCoqKXop6fwp6Sk8KeqveiqnOeek+mHvuiqkPCnqZnnq6nwp6y68KO+j+Sck/CnrLjnhbzorIzorJ/wpZCw8KWVpeisv+itjOitjeiqqfCkqbrorpDorpvoqq/woZuf5JiV6KGP6LKb8Ke1lPCnto/wr6eU45yl8Ke1k+izlvCntpjwp7a96LSS6LSD8KGkkOizm+eBnOi0kfCks4nju5DotbdcIl0sW1wiOTA0MFwiLFwi6Lap8KiAgvChgJTwpKaK46288KiGvPCnhIznq6fouq3ourbou4Ppi5TovJnovK3wqI2l8KiQkui+pemMg/Cqip/woKmQ6L6z5KSq8KinnvColL3wo7a75bu48KOJoui/ufCqgJTwqJq88KiUgfCijKXjpoDwpruX6YC38KiUvPCnqr7pgaHwqJWs8KiYi+mCqPConJPpg4TwqJum6YKu6YO96YWn46uw6Yap6YeE57Ks8Kiks/ChuonpiI7msp/piYHpiaLwpZa56Yq58KirhvCjspvwqKyM8KWXm1wiXSxbXCI5MGExXCIsXCLwoLSx6Yys6Y2r8KirofCor6vngo/lq4PwqKui8KirpeSlpemJhPCor6zwqLC58Kivv+mNs+mRm+i6vOmWhemWpumQpumWoOa/tuSKufCimbrwqJuY8KGJvPCjuK7kp5/msJzpmbvpmpbkhazpmqPwpruV5oea6Zq256O18KiroOmaveWPjOSmofCmsrjwoIm08KaQkPCpgq/wqYOl8KSrkfChpJXwo4yK6Zyx6JmC6Zy25KiP5JS95JaF8KSrqeeBteWtgemcm+mdnPCph5XpnZflrYrwqYer6Z2f6ZCl5YOQ8KOCt/Cjgrzpnonpnp/pnrHpnr7pn4Dpn5Lpn6DwpZGs6Z+u55Cc8KmQs+mfv+mftfCpkJ3wp6W65KuR6aC06aCz6aGL6aGm46yO8KeFteO1kfCgmLDwpIWcXCJdLFtcIjkxNDBcIixcIvClnIbpo4rporfpo4jpo4fkq7/wprSn8KGbk+WWsOmjoemjpumjrOmNuOmkufCkqKnkrbLwqaGX8KmkhemntemojOmou+mokOmpmPClnKXjm4TwqYKx8KmvlemroOmrovCprIXpq7TksI7prJTprK3wqJiA5YC06ay08KamqOOjg/Cjgb3prZDprYDwqbS+5amF8KGho+mujvCkiYvpsILpr7/psIzwqbmo6beU8Km+t/CqhpLwqoar8KqDofCqhKPwqoef6bW+6baD8KqEtOm4juaiiFwiXSxbXCI5MWExXCIsXCLpt4TwooWb8KqGk/CqiKDwoaS78KqIs+m0ufCqgrnwqoq06bqQ6bqV6bqe6bqi5LS06bqq6bqv8KSNpOm7geOtoOOnpeO0neS8suOevvCosKvpvILpvIjkrpbpkKTwprai6byX6byW6by55Zqf5ZqK6b2F6aa48KmCi+mfsuiRv+m9oum9qeernOm+jueIluSuvvCkpbXwpKa754W38KSnuPCkjYjwpKmR546e8KivmvCho7rnpp/wqKW+8Ki4tumNqemPs/CoqYTpi6zpjoHpj4vwqKWs8KSSueeIl+O7q+edsuepg+eDkPCkkbPwpI+454W+8KGfr+eCo/Chor7wo5aZ47uH8KGihfClkK/woZ+445yi8KGbu/ChoLnjm6HwoZ208KGjkfClvYvjnKPwoZuA5Z2b8KSopfChj77woYqoXCJdLFtcIjkyNDBcIixcIvChj4bwoZK26JSD8KOapuiUg+iRlfCkppTwp4Wl8KO4sfCllZzwo7u78KeBkuSTtPCjm67wqaad8Ka8puafueOcs+OwleO3p+WhrPChpKLmoJDkgZfwo5y/8KSDofCkgovwpISP8KawoeWTi+WanvCmmrHlmpLwoL+f8KCuqPCguI3pj4bwqKyT6Y6c5Lu45YSr46CZ8KSQtuS6vPCgkaXwoI2/5L2L5L6K8KWZkeWpqPCghqvwoI+L46aZ8KCMivCgkJTjkLXkvKnwoIuA8Ki6s/CgibXoq5rwoIiM5LqYXCJdLFtcIjkyYTFcIixcIuWDjeWEjeS+ouS8g/CkqI7wo7qK5L2C5YCu5YGs5YKB5L+M5L+l5YGY5YO85YWZ5YWb5YWd5YWe5rm28KOWlfCjuLnwo7q/5rWy8KGihPCjuonlhqjlh4PwoJeg5JOd8KCSo/CgkpLwoJKR6LW68KiqnPCgnI7liZnliqTwoKGz5Yuh6Y2u5Jm654aM8KSOjPCgsKDwpKas8KGDpOankfCguJ3nkbnju57nkpnnkJTnkZbnjpjkro7wpKq88KSCjeWPkOOWhOeIj/Ckg4nllrTwoI2F5ZON8KCvhuWcnemJnembtOmNpuWfneWejeWdv+OYvuWji+WqmfCoqYbwoZu68KGdr/ChnJDlqKzlprjpio/lqb7lq4/lqJLwpaWG8KGns/ChoaHwpIqV45u15rSF55GD5aih8KW6g1wiXSxbXCI5MzQwXCIsXCLlqoHwqK+X8KCQk+mPoOeSjPChjIPnhIXkpbLpkIjwqKe76Y69456g5bCe5bKe5bme5bmI8KGmlvChpbzwo6uu5buN5a2P8KGkg/ChpITjnIHwoaKg45ud8KGbvuObk+iEqvCoqYfwoba68KORsvCopqjlvIzlvI7woaSn8KGeq+Wpq/ChnLvlrYTomJTwp5e96KGg5oG+8KKhoPCimKvlv5vjurjwopav8KKWvvCpgojwpr2z5oeA8KCAvvCggYbwopib5oaZ5oaY5oG18KKym/CitIfwpJuU8KmFjVwiXSxbXCI5M2ExXCIsXCLmkbHwpJml8KKtquOoqfCirKLwo5GQ8KmjqvCiubjmjLfwqpGb5pK25oyx5o+R8KSno/CitafmiqTworKh5pC75pWr5qWy46+08KOCjvCjiq3wpKaJ8KOKq+WUjfCji6DwoaOZ8KmQv+abjvCjionwo4az46ug5IaQ8KWWhPCorKLwpZaP8KGbvPCllZvwpZCl56Ou8KOEg/ChoKrwo4i045Gk8KOIj/CjhoLwpIuJ5pqO8Ka0pOaZq+Suk+aYsPCnobDwober5pmj8KOLkvCji6HmmJ7wpaGy46OR8KOguvCjnrzjrpnwo56i8KOPvueTkOOuluaej/CkmKrmorbmoJ7jr4Tmqr7joaPwo5+V8KSSh+aos+apkuarieashfChpJLmlJHmopjmqYzjr5fmqbrmrZfwo7+A8KOymumOoOmLsvCor6rwqKuLXCJdLFtcIjk0NDBcIixcIumKifCogJ7wqKec6ZGn5ral5ryL8KSnrOa1p/Cjvb/jto/muITwpIC85ai95riK5aGH5rSk56GC54S78KSMmvCkibbng7HniZDniofnipTwpJ6P8KScpeWFufCkqqTwoJer55G68KO7uPCjmZ/wpKmK8KSkl/Clv6HjvIbjurHwpKuf8Kiwo/CjvLXmgqfju7Pnk4znkLzpjofnkLfkkp/wpreq5JWR55aD472j8KSzmfCktIbjvZjnlZXnmbPwqpeG46yZ55Go8KirjPCkpqvwpKaO46u7XCJdLFtcIjk0YTFcIixcIuO3jfCkqY7ju7/wpKeF8KSjs+mHuuWcsumNgvCoq6PwoaGk5YOf8KWIofClh6fnnbjwo4iy55yO55yP55278KSal/CjnoHjqZ7wpKOw55C455Kb47q/8KSquvCkq4fkg4jwpKqW8KaGrumMh/ClloHnoJ7noo3noojno5Lnj5DnpZnwp52B8KWbo+SEjuemm+iSluempeaorfCju7rnqLrnp7Tkha7woZum5ISy6Yi156ex8KC1jPCkpozwoIqZ8KO2uvChna7jlpfllavjlbDjmqrwoIeU8KCwjeerouWpmfCim7Xwpaqv8KWqnOWojfCgiZvno7DlqKrwpa+G56u+5Ie557Gd57Gt5IiR8KWus/Clurzwpbqm57ON8KSnufChnrDnso7nsbznsq7mqrLnt5znuIfnt5PnvY7wpomhXCJdLFtcIjk1NDBcIixcIvCmhZzwp62I57aX8KW6guSJqvCmrbXwoKSW5p+W8KCBjvCjl4/ln4TwppCS8KaPuPCkpaLnv53nrKfwoKCs8KWrqfCltYPnrIzwpbiO6aem6JmF6amj5qic8KOQv+OnovCkp7fwppat6aif8KaWoOiSgPCnhKfwprOR5JOq6IS35JCC6IOG6ISJ6IWC8KaetOmjg/CmqYLoiaLoiaXwpqmR6JGT8Ka2p+iYkPCniJvlqobkhb/woaGA5ayr8KGioeWrpPCho5jomqDwr6a88KO2j+igrfCnkKLlqIJcIl0sW1wiOTVhMVwiLFwi6KGu5L2F6KKH6KK/6KOm6KWl6KWN8KWag+illPCnnoXwp56E8KivtfCor5nwqK6c8KinueO6reiSo+SbteSbj+OfsuioveionPCpkYjlvY3piKvwpIqE5peU54Sp54OE8KGhhem1reiyn+izqfCnt5zlpprnn4Plp7Dkja7jm5TouKrouqfwpLCJ6Lyw6L2K5Iu05rGY5r678KKMoeSim+a9uea6i/Chn5rpr6njmrXwpKSv6YK76YKX5ZWx5KSG6Ya76ZCE8Kipi+SBovCoq7zpkKfwqLCd8Kiwu+iTpeioq+mWmemWp+mWl+mWlvCotLTnkYXju4LwpKO/8KSpgvCkj6rju6fwo4il6ZqP8Ki7p/CouabwqLml47uM8KSnrfCkqbjwo7+u55CS55Gr47u86Z2B8KmCsFwiXSxbXCI5NjQwXCIsXCLmoYfkqJ3wqYKT8KWfn+mdnemNqPCoponwqLCm8Kisr/Cmjr7pirrlrJHorankpLznj7nwpIib6Z6b6Z2x6aS48KC8puW3gfCor4XwpKqy6aCf8KmTmumLtvCpl5fph6Xkk4DwqK2Q8KSpp/CoraTpo5zwqKmF47yA6Yiq5KSl6JCU6aS76aWN8KeshuO3vemmm+Str+mmqumpnPCoraXwpaOI5qqP6aih5au+6aiv8KmjseSukPCppYjpprzkrr3krpfpjb3lobLwoYyC5aCi8KSmuFwiXSxbXCI5NmExXCIsXCLwoZOo56GE8KKcn/Cjtrjmo4Xjtb3pkZjjpKfmhZDwop6B8KKlq+aEh+mxj+mxk+mxu+mwtemwkOmtv+mvj/CpuK3prp/wqoe18KqDvum0oeSyrvCkhITpuJjksrDptIzwqoa08KqDrfCqg7PwqaSv6bal6JK98Ka4kvCmv5/wpq6C6Je85JSz8Ka2pPCmuoTwprew6JCg6Jeu8Ka4gPCjn5fwpoGk56ei8KOWnPCjmYDkpK3wpKee47Wi6Y+b6Yq+6Y2I8KCKv+eiuemJt+mRjeS/pOORgOmBpPCllZ3noL3noZTnorbnoYvwoZ2X8KOHifCkpYHjmprkvbLmv5rmv5nngJ7ngJ7lkJTwpIa15Z675aOz5Z6K6bSW5Z+X54S045Kv8KSGrOeHq/CmsYDwpL6X5ayo8KGetfCoqYlcIl0sW1wiOTc0MFwiLFwi5oSM5auO5aiL5Iq88KSSiOOcrOStu/Cop7zpjrvpjrjwoaOW8KC8neiRsvCms4DwoZCT8KSLuvCisKbwpI+B5aaU8KO2t/CmnYHntqjwpoWb8KaCpPCkprnwpKaL8KinuumLpeePouO7qeeStPCoraPwoaKf47uh8KSqs+armOePs+ePu+O7lvCkqL7wpKqU8KGfmfCkqabwoI6n8KGQpPCkp6XnkYjwpKSW54Kl8KSltumKhOePpumNn/Cgk77pjLHwqKuO8KiolumOhvCor6fwpZeV5KS18KiqgueFq1wiXSxbXCI5N2ExXCIsXCLwpKWD8KCzv+WapPCgmJrwoK+r8KCyuOWUguenhPChn7rnt77woZuC8KSpkPChoZLklK7pkIHjnIrwqKuA8KSmreWmsPChor/woaKD8KeShOWqoeObovCjtZvjmrDpiZ/lqbnwqKqB8KGhoumNtOOzjfCgqrTkqpbjporlg7TjtanjtYzwoY6c54W15Iu78KiImOa4j/Cpg6Tkk6vmtZfwp7mP54Gn5rKv47OW8KO/rfCjuK3muILmvIzjta/woI+155WR45q845OI5JqA47ua5KGx5aeE6Ymu5KS+6L2B8KiwnPCmr4DloJLln4jjm5bwoZGS54O+8KSNovCkqbHwor+j8KGKsPCijr3mornmpafwoY6Y8KOTpfCnr7Two5uf8Kiqg/Cjn5bwo4+68KSyn+aomvCjmq3wprK36JC+5JOf5JOOXCJdLFtcIjk4NDBcIixcIvCmtKbwprWR8KaygvCmv57mvJfwp4SJ6Iy98KGcuuiPrfCmsoDwp4GT8KGfm+WmieWqgvChnrPlqaHlqbHwoaSF8KSHvOOcreWnr/ChnLzjm4fnho7pjpDmmprwpIql5amu5air8KSKk+aoq/Cju7nwp5y28KSRm/Cki4rnhJ3wpImZ8KinoeS+sPCmtKjls4LwpJOO8Ke5jfCkjr3mqIzwpImW8KGMhOeCpueEs/Ckj6njtqXms5/wr6Cl8KSpj+e5peWnq+W0r+O3s+W9nPCkqZ3woZ+f57ak6JCmXCJdLFtcIjk4YTFcIixcIuWShfCjq7rwo4yA8KCIlOWdvvCgo5XwoJiZ47+l8KG+nvCqirbngIPwqYWb5bWw546P57OT8KipmfCpkKDkv4jnv6fni43njJDwp6u054y454y58KWbtueNgeeNiOO6qfCnrJjpgaznh7XwpKOy54+h6Ie247uK55yM47uR5rKi5Zu955CZ55Ce55Cf47ui47uw47u047u655OT47yO472T55WC55Wt55Wy55aN472855eI55ec47+A55mN47+X55m047+c55m68KS9nOeGiOWYo+imgOWhqeSAneedg+SAueadoeSBheOXm+eemOSBquSBr+Wxnueevuefi+WjsuegmOeCueegnOSCqOegueehh+ehkeehpuiRiPCllLXnpLPmoIPnpLLkhINcIl0sW1wiOTk0MFwiLFwi5ISJ56aR56aZ6L6756iG6L685IWn56qR5Iay56q86Im55IeE56uP56ub5IeP5Lih562i562s562757CS57Cb5Img5Im657G757Kc5IqM57K45IqU57Ot6L6T54OA8KCzj+e3j+e3lOe3kOe3vee+rue+tOeKn+SOl+iAoOiApeesueiAruiAseiBlOO3jOWetOeCoOiCt+iDqeSPreiEjOeMquiEjuiEkueVoOiElOSQgeOsueiFluiFmeiFmlwiXSxbXCI5OWExXCIsXCLkkJPloLrohbzohoTkkKXohpPkkK3ohqXln6/oh4Hoh6ToiZTkko/oiqboibboi4roi5joi7/kkrDojZfpmanmporokIXng7XokaTmg6PokojklITokr7ok6Hok7jolJDolLjolZLklLvola/olbDol6DklbfombLompLomrLom6/pmYXonovkmIbkmJfooq7oo7/opKTopYfoppHwp6Wn6Kip6Ki46KqU6Kq06LGR6LOU6LOy6LSc5J6Y5aGf6LeD5J+t5Luu6Li65ZeY5Z2U6Lmx5Ze16Lqw5KC36LuO6Lui6Luk6Lut6Luy6L636L+B6L+K6L+M6YCz6aeE5KKt6aOg6YiT5KSe6Yio6YmY6Ymr6Yqx6Yqu6Yq/XCJdLFtcIjlhNDBcIixcIumLo+mLq+mLs+mLtOmLvemNg+mOhOmOreSlheSlkem6v+mQl+WMgemQnemQremQvuSlqumRlOmRuemUremWouSmp+mXtOmYs+SnpeaeoOSopOmdgOSotemesumfguWZlOSrpOaDqOmiueSsmemjseWhhOmkjumkmeWGtOmknOmkt+mlgumlnemlouStsOmnheSunemovOmsj+eqg+mtqemugemvnemvsemvtOSxremwoOOdr/Chr4LptYnpsLpcIl0sW1wiOWFhMVwiLFwi6bu+5ZmQ6baT6ba96beA6be86ZO26L626bm76bqs6bqx6bq96buG6ZOc6bui6bux6bu456uI6b2E8KCClPCgirfwoI6g5qSa6ZOD5aas8KCTl+WhgOmTgeOeufCgl5XwoJiV8KCZtvChmrrlnZfnhbPwoKuC8KCrjfCgrr/lkarwr6C78KCvi+WSnvCgr7vwoLC78KCxk/CgsaXwoLG85oOn8KCyjeWZuvCgsrXwoLOd8KCzrfCgta/woLay8KC3iOallemwr+iepfCguITwoLiO8KC7l/CgvpDwoLyt8KC5s+WwoPCgvrzluIvwoYGc8KGBj/ChgbbmnJ7woYG78KGCiPChgpbjmYfwoYK/8KGDk/ChhK/woYS75Y2k6JKt8KGLo/ChjbXwoYy26K6B8KGVt/ChmJnwoZ+D8KGfh+S5uOeCu/ChoK3woaWqXCJdLFtcIjliNDBcIixcIvChqK3woamF8KGwqvChsbDwobKs8KG7iOaLg/Chu5XwobyV54aY5qGV8KKBheanqeObiPCiibzwoo+X8KKPuvCinKrwoqGx8KKlj+iLvfCipafwoqaT8KKrleimpfCiq6jovqDwoqyO6Z648KKsv+mhh+mqvfCisYxcIl0sW1wiOWI2MlwiLFwi8KKyiPCisrfwpa+o8KK0iPCitJLwora38KK2lfCiuYLwor208KK/jPCjgLPwo4Gm8KOMn/Cjj57lvrHmmYjmmr/wp6m58KOVp/Cjl7PniIHwpKa655+X8KOYmvCjnJbnuofwoI2G5aK15pyOXCJdLFtcIjliYTFcIixcIuakmPCjqqfwp5mX8KW/ovCjuJHwo7q58KeXvvCigprko5DkqrjwpISZ8KiqmvCki67wpIyN8KSAu/CkjLTwpI6W8KSphfCgl4rlh5LwoJiR5aaf8KG6qOOuvvCjs7/wpJCE8KSTluWeiPCkmbTjppvwpJyv8KiXqPCpp4njnaLwooeD6K2e8KitjumnlvCkoJLwpKO78KSoleeIifCkq4DwoLG45aWl8KS6pfCkvobwoJ256Lua8KWArOWKj+Wcv+eFsfClipnwpZCZ8KO9ivCkqqfllrzwpZGG8KWRrvCmrZLph5TjkbPwpZS/8KeYsvCllZ7knJjwpZWi8KWVpvCln4fwpKS/8KWhneWBpuOTu/Cjj4zmg57wpaSD5J288KiliPClqq7wpa6J8KWwhvChtpDlnqHnhZHmvrbwpoSC8KewkumBlvCmhrLwpL6a6K2i8KaQgvCmkYpcIl0sW1wiOWM0MFwiLFwi5bWb8Kavt+i8tvCmkoTwoaSc6Kuq8KSntvCmkojwo7+v8KaUkuSvgPCmlr/wppq18KKcm+mRpfCln6HmhpXlqKfwr6ON5L675Zq58KSUofCmm7zkuarwpKS06ZmW5raP8KayveOYmOilt/CmnpnwpqGu8KaQkfCmoZ7nh5/wpqOH562C8KmDgPCgqJHwpqSm6YSE8Kakueephem3sPCmp7rpqKbwpqit45mf8KaRqfCggKHnpoPwpqi08Katm+W0rPCjlJnoj4/wpq6d5JuQ8KaypOeUu+ihpfCmtq7lorZcIl0sW1wiOWNhMVwiLFwi45yc8KKWjfCngYvwp4eN47GU8KeKgPCnioXpioHwooW68KeKi+mMsPCni6bwpKeQ5rC56ZKf8KeRkPCgu7jooKfoo7XwoqSm8KiRs/ChnrHmurjwpKiq8KGgoOOmpOOaueWwkOeno+SUv+aatvCpsq3wqaKk6KWD8KefjPCnoZjlm5bkg5/woZiK46ah8KOcr/Cog6jwoY+F54at6I2m8KennfCphqjlqafksrfwp4Kv8Kimq/Cnp73wp6iK8Kesi/CntabwpIW6562D56W+8KiAiea+tfCqi5/mqIPwqIyY5Y6i8Ka4h+mOv+agtumdnfCoha/wqICj8KamtfChj63wo4iv8KiBiOW2hfCosLDwqIKD5ZyV6aCj8KilieW2q/Ckpojmlr7mp5Xlj5LwpKql8KO+geOwkeactvCogpDwqIO08KiErvChvqHwqIWPXCJdLFtcIjlkNDBcIixcIvCohonwqIav8KiImvCojIbwqIyv8KiOiuOXivCokajwqJqq5KO65o+m8KilluegiOmJlfCoprjkj7LwqKen5I+f8KinqPCorYbwqK+U5ae48Kiwiei8i/Cov4XwqYOs562R8KmEkPCphLzjt7fwqYWe8KSriui/kOeKj+Wai/Cpk6fwqZep8KmWsPCplrjwqZyy8KmjkfCppYnwqaWq8Kmng/CpqKjwqayO8Km1mvCptpvnup/wqbu48Km8o+SypOmVh/CqipPnhqLwqou/5LaR6YCS8KqXi+S2nPCgspzovr7ll4FcIl0sW1wiOWRhMVwiLFwi6L668KKSsOi+ufCkqpPklInnub/mvZbmqrHku6rjk6TwqKys8KeineOcuui6gPChn7XwqICk8KitrPCorpnwp6i+8Kaar+O3q/CnmZXwo7K38KWYtfClpZbkuprwpbqB8KaJmOWav/Cgua3ouI7lra3wo7qI8KSynuaPnuaLkPChn7bwoaG75pSw5Zit8KWxiuWQmvCljJHjt4bwqbaY5LG95Zii5Zie572J8KW7mOWltfCjtYDonbDkuJzwoL+q8KC1ifCjmrrohJfptZ7otJjnmLvpsYXnmY7nnrnpjYXlkLLohYjoi7flmKXohLLokJjogr3ll6rnpaLlmYPlkJbwoLqd45eO5ZiF5Zex5pux8KiLouOYreeUtOWXsOWWuuWSl+WVsvCgsYHwoLKW5buQ8KWFiPCgubbworGiXCJdLFtcIjllNDBcIixcIvCguqLpuqvntZrll57woYG15oqd6Z2t5ZKU6LON54e26YW25o+85o655o++5ZWp8KKtg+mxsvCiurPlhprjk5/woLan5Yan5ZGN5ZSe5ZST55mm6Lit8KaiiueWseiCtuighOiehuijh+iGtuiQnPChg4Hkk6znjITwpJyG5a6Q6IyL8Kaik+WZu/Cim7Twp7Sv8KSGo/CntbPwpruQ8KeKtumFsPChh5npiIjwo7O88KqaqfCguqzwoLu554mm8KGyouSdjvCkv4Lwp7+58KC/q+SDulwiXSxbXCI5ZWExXCIsXCLpsZ3mlJ/worag5KOz8KSfoPCptbzwoL+s8KC4iuaBovCnlqPwoL+tXCJdLFtcIjllYWRcIixcIvCmgYjwoYaH54aj57qO6bWQ5Lia5LiE45W35ayN5rKy5Y2n45qs46ec5Y2945ql8KSYmOWimvCkra7oiK3lkYvlnqrwpaqV8KCluVwiXSxbXCI5ZWM1XCIsXCLjqZLwopGl54208Km6rOS0iemvrfCjs77wqbyw5LGb8KS+qfCplp7wqb+e6JGc8KO2tvCnirLwpp6z8KOcoOaMrue0pfCju7fwo7is46iq6YCI5YuM47m045m65Jep8KCSjueZgOWrsPCgurbnobrwp7yu5aKn5IK/5Zm86a6L5bW055mU8KqQtOm6heSzoeeXueOfu+aEmfCjg5rwpI+yXCJdLFtcIjllZjVcIixcIuWZnfChiqnlnqfwpKWj8Km4huWItPCngq7jlq3msYrptbxcIl0sW1wiOWY0MFwiLFwi57GW6ay55Z+e8KGdrOWxk+aTk/Cpk5Dwpoy18KeFpOiarfCgtKjwprSi8KSrovCgtbFcIl0sW1wiOWY0ZlwiLFwi5Ye+8KG8j+W2jumcg/Cht5HpuoHpgYznrJ/prILls5HnrqPmiajmjLXpq7/nr4/prKrnsb7prK7nsYLnsobpsJXnr7zprInpvJfpsJvwpKS+6b2a5ZWz5a+D5L+96bqY5L+y5Ymg47iG5YuR5Z2n5YGW5aa35biS6Z+I6bar6L2c5ZGp6Z606aWA6Z665Yys5oSwXCJdLFtcIjlmYTFcIixcIuakrOWPmumwium0guSwu+mZgeamgOWCpueVhvChna3pp5rlibNcIl0sW1wiOWZhZVwiLFwi6YWZ6ZqB6YWcXCJdLFtcIjlmYjJcIixcIumFkfCoupfmjb/wprSj5quK5ZiR6YaO55W65oqF8KCPvOeNj+exsPClsKHwo7O9XCJdLFtcIjlmYzFcIixcIvCkpJnnm5bprp3kuKrwoLOU6I6+6KGCXCJdLFtcIjlmYzlcIixcIuWxiuangOWDreWduuWIn+W3teS7juawsfCgh7LkvLnlkpzlk5rliprotoLjl77lvIzjl7NcIl0sW1wiOWZkYlwiLFwi5q2S6YW86b6l6a6X6aCu6aK06aq66bqo6bqE54W656yUXCJdLFtcIjlmZTdcIixcIuavuuigmOe9uFwiXSxbXCI5ZmViXCIsXCLlmKDwqpmK6Lm36b2TXCJdLFtcIjlmZjBcIixcIui3lOi5j+m4nOi4geaKgvCojb3ouKjoubXnq5PwpKm356i+56OY5rOq6Kmn55iHXCJdLFtcImEwNDBcIixcIvCoqZrpvKbms47on5bnl4Pwqoqy56GT8K+hgOi0jOeLoueNseisreeMgueTseizq/CkqrvomK/lvrrooqDkkrdcIl0sW1wiYTA1NVwiLFwi8KGgu/CmuIVcIl0sW1wiYTA1OFwiLFwi6Km+8KKUm1wiXSxbXCJhMDViXCIsXCLmg73nmafpq5fptYTpja7pro/on7VcIl0sW1wiYTA2M1wiLFwi6KCP6LO354ys6Zyh6a6w45eW54qy5LCH57GR6aWK8KaFmeaFmeSwhOm6luaFvVwiXSxbXCJhMDczXCIsXCLlnZ/mha/miqbmiLnmi47jqZzmh6Lljqrwo4+15o2k5qCC45eSXCJdLFtcImEwYTFcIixcIuW1l/Cor4Lov5rwqLi5XCJdLFtcImEwYTZcIixcIuWDmfChtYbnpIbljLLpmLjwoLy75IGlXCJdLFtcImEwYWVcIixcIuefvlwiXSxbXCJhMGIwXCIsXCLns4Lwpbya57Oa56it6IGm6IGj57WN55SF55Oy6KaU6Iia5pyM6IGi8KeShuiBm+eTsOiEg+ecpOimifCmn4znlZPwpruR6J6p6J+O6IeI6J6M6KmJ6LKt6K2D55yr55O46JOa45i15qay6LamXCJdLFtcImEwZDRcIixcIuimqeeRqOa2ueifgfCkgJHnk6fjt5vnhbbmgqTmhpzjs5HnhaLmgbdcIl0sW1wiYTBlMlwiLFwi572x8KisreeJkOaDqeStvuWIoOOwmPCjs4fwpbuX8KeZlvCllLHwoaWE8KGLvvCppIPwprec8KeCreWzgfCmhq3wqKiP8KOZt/Cgg67wpqGG8KS8juSVouWsn/CmjYzpvZDpuqbwpomrXCJdLFtcImEzYzBcIixcIuKQgFwiLDMxLFwi4pChXCJdLFtcImM2YTFcIixcIuKRoFwiLDksXCLikbRcIiw5LFwi4oWwXCIsOSxcIuS4tuS4v+S6heS6oOWGguWGluWGq+WLueWMuOWNqeWOtuWkiuWugOW3m+K8s+W5v+W7tOW9kOW9oeaUtOaXoOeWkueZtui+tematsKoy4bjg73jg77jgp3jgp7jgIPku53jgIXjgIbjgIfjg7zvvLvvvL3inL3jgYFcIiwyM10sW1wiYzc0MFwiLFwi44GZXCIsNTgsXCLjgqHjgqLjgqPjgqRcIl0sW1wiYzdhMVwiLFwi44KlXCIsODEsXCLQkFwiLDUsXCLQgdCWXCIsNF0sW1wiYzg0MFwiLFwi0JtcIiwyNixcItGR0LZcIiwyNSxcIuKHp+KGuOKGueOHj/Cgg4zkuZrwoIKK5YiC5JKRXCJdLFtcImM4YTFcIixcIum+sOWGiOm+sfCnmIdcIl0sW1wiYzhjZFwiLFwi77+i77+k77yH77yC44ix4oSW4oSh44Kb44Kc4rqA4rqE4rqG4rqH4rqI4rqK4rqM4rqN4rqV4rqc4rqd4rql4rqn4rqq4rqs4rqu4rq24rq84rq+4ruG4ruK4ruM4ruN4ruP4ruW4ruX4rue4rujXCJdLFtcImM4ZjVcIixcIsqDyZDJm8mUybXFk8O4xYvKismqXCJdLFtcImY5ZmVcIixcIu+/rVwiXSxbXCJmYTQwXCIsXCLwoJWH6Yub8KCXn/Cjv4XolYzkirXnj6/lhrXjmYnwpKWC8KinpOmNhPChp5voi67wo7OI56C85p2E5ouf8KSks/CopqrwoIqg8Kaus/ChjIXkvqvwopOt5YCI8Ka0qfCnqoTwo5iA8KSqsfCilJPlgKnwoI2+5b6k8KCOgPCgjYfmu5vwoJCf5YG95YSB45G65YSO6aGs452D6JCW8KSmpPCgkoflhaDwo4605YWq8KCvv/Cig7zwoIul8KKUsPCglo7wo4iz8KGmg+WuguidvfCglrPwo7KZ5Yay5Ya4XCJdLFtcImZhYTFcIixcIum0tOWHieWHj+WHkeOznOWHk/CkqqblhrPlh6LljYLlh63oj43mpL7wo5yt5b275YiL5Yim5Yi85Yq15YmX5YqU5Yq55YuF57CV6JWC5Yug6JiN8Kask+WMhfCoq57llYnmu5nwo76A8KCllPCjv6zljLPljYTwoK+i5rOL8KGcpuagm+ePleaBiuO6quOjjPChm6jnh53kkqLlja3ljbTwqJqr5Y2+5Y2/8KGWlvChmJPnn6bljpPwqKqb5Y6g5Y6r5Y6u546n8KWdsuO9meeOnOWPgeWPheaxieS5ieWfvuWPmeOqq/Cgro/lj6Dwo7+r8KK2o+WPtvCgsbflkJPngbnllKvmmZfmtZvlka3wpq2T8KC1tOWVneWSj+WSpOSepvChnI3woLud47a08KC1jVwiXSxbXCJmYjQwXCIsXCLwqKa88KKamOWVh+SzreWQr+eQl+WWhuWWqeWYhfCho5fwpIC65JWS8KSQteaas/ChgrTlmLfmm43wo4qK5pqk5pqt5ZmN5ZmP56Ox5Zux6Z6H5Y++5ZyA5Zuv5Zut8KitpuOYo/ChiY/lnYbwpIal5rGu54KL5Z2C45qx8KaxvuWfpvChkJbloIPwoZGU8KSNo+WgpvCkr7XloZzloqrjlaHlo6Dlo5zwoYi85aO75a+/5Z2D8KqFkPCkibjpj5PjlqHlpJ/moqbjm4PmuZlcIl0sW1wiZmJhMVwiLFwi8KGYvuWopOWVk/ChmpLolIXlp4nwoLWO8KaygfCmtKrwoZ+c5aeZ8KGfu/ChnrLwpram5rWx8KGgqPChm5Xlp7nwprmF5aqr5amj45um8KSmqeWpt+OciOWqlueRpeWrk/CmvqHwopWU47aF8KGkkeOcsvChmrjluoPli5Dlrbbmlojlrbzwp6iO5ICE5KGd8KCIhOWvleaFoPChqLTwpaeM8KCWpeWvs+WuneS0kOWwhfChrYTlsJPnj47lsJTwobKl8KasqOWxieSjneWyheWzqeWzr+W2i/Cht7nwobi35bSQ5bSY5bWG8KG6pOWyuuW3l+iLvOOgrfCkpIHwooGJ8KKFs+iKh+OgtuOvguW4ruaqiuW5teW5uvCkkrzwoLOT5Y6m5Lq35buQ5Y6o8KGdseW4ieW7tPCokoJcIl0sW1wiZmM0MFwiLFwi5bu55bu746Kg5bu85qC+6ZCb5byN8KCHgfCvopTjq57koq7woYy65by68KaiiPCij5DlvZjwopGx5b2j6Z698Ka5ruW9sumNgPCoqLblvqfltrbjtZ/wpYmQ8KG9qvCng7jwopmo6YeW8KCKnvCoqKnmgLHmmoXwoaG346Wj47eH45i55Z6Q8KKetOelseO5gOaCnuaCpOaCs/CkpoLwpKaP8Kepk+eSpOWDoeWqoOaFpOiQpOaFgvCvoqbwpruS5oaB5Ye08KCZluaGh+WuqvCjvrdcIl0sW1wiZmNhMVwiLFwi8KKhn+aHk/Corp3wqaWd5oeQ46Sy8KKmgPCio4HmgKPmhZzmlJ7mjovwoISY5ouF8KGdsOaLlfCiuI3mjazwpKef46iX5pC45o+48KGOjvChn7zmkpDmvorwori26aCU8KSCjPClnJ3mk6Hmk6XpkbvjqabmkLrjqZfmlY3mvJbwpKio8KSoo+aWheaVreaVn/Cjgb7mlrXwpKWA5Ky35peR5IOY8KGgqeaXoOaXo+W/n/CjkIDmmJjwo4e38KOHuOaZhPCjhqTwo4al5pmL8KC5teaZp/Clh6bmmbPmmbTwobi98KOIsfCol7Two4eI8KWMk+efhfCio7fppqTmnILwpI6c8KSooeOsq+anuvCjn4LmnZ7mnafmnaLwpIeN8KmDreafl+STqeagoua5kOmIvOaggfCjj6bwprag5qGdXCJdLFtcImZkNDBcIixcIvCjka/mp6HmqIvwqKuf5qWz5qOD8KOXjeakgeakgOO0suOogfCjmLzjroDmnqzmpaHwqKmK5Iu85qS25qaY466h8KCPieiNo+WCkOanufCjmZnwooSq5qmF8KOcg+aqneOvs+aeseariPCphpzjsI3mrJ3woKSj5oOe5qy15q208KKfjea6tfCjq5vwoI618KGlmOOdgOWQofCjrZrmr6Hwo7u85q+c5rC38KKSi/Cko7Hwpq2R5rGa6Iim5rG58KO2vOSThfCjtr3wpIak8KSkjPCkpIBcIl0sW1wiZmRhMVwiLFwi8KOzieObpeOzq/CgtLLproPwo4e58KKSkee+j+agt/CmtKXwprah8Ka3q+a2lua1nOa5vOa8hPCkpb/wpIKF8Ka5suiUs/CmvbTlh4fmspzmuJ3okK7wqKyh5riv8KO4r+eRk/CjvoLnp4zmuY/lqpHwo4GL5r+445yN5r6d8KO4sOa7uvChkpfwpIC95JWV6Y+w5r2E5r2c47WO5r208KmFsOO0u+a+n/CkhYTmv5PwpIKR8KSFlfCkgLnwo7+w8KO+tPCkhL/lh5/wpIWW8KSFl/CkhYDwpoed54GL54G+54Kn54KB54OM54OV54OW54Of5ISE47eo54a054aW8KSJt+eEq+eFheWqiOeFiueFruWynPCkjaXnhY/pjaLwpIuB54Ss8KSRmvCkqKfwpKii54a68KivqOeCveeIjlwiXSxbXCJmZTQwXCIsXCLpkYLniJXlpJHpkYPniKTpjYHwpZiF54iu54mA8KSltOaiveeJleeJl+O5lfCjgYTmoI3mvL3nioLnjKrnjKvwpKCj8Kigq+SjrfCooITnjKjnjK7nj4/njqrwoLC68KaoruePieeRifCkh6LwoZun8KSopOaYo+ObhfCkprfwpKaN8KSnu+ePt+eQleakg/CkqKbnkLnwoJeD47uX55Gc8KKireeRoPCourLnkYfnj6TnkbbojrnnkazjnLDnkbTpj7HmqKznkoLkpZPwpKqMXCJdLFtcImZlYTFcIixcIvCkhZ/wpKm58Kiuj+WthvCosIPwoaKe55OI8KGmiOeUjueTqeeUnvCou5nwoamL5a+X8Ki6rOmOheeVjeeViueVp+eVrvCkvoLjvITwpLST55aO55Gd55ae55a055iC55is55mR55mP55mv55m28KaPteeakOiHr+OfuPCmpJHwpqSO55qh55ql55q355uM8Ka+n+iRovClgp3wpYW98KG4nOecnuecpuedgOaSr/CliKDnnZjwo4qs556v8KilpPCopajwoZuB55+056CJ8KGNtvCkqJLmo4rnoq/no4fno5PpmqXnpK7wpZeg56OX56S056Kx8KeYjOi+uOiihPCorKvwpoKD8KKYnOemhuikgOakguemgPCloZfnpp3wp6y556S856ap5riq8KeEpuO6qOenhvCphI3np5RcIl1dXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2ljb252LWxpdGUvZW5jb2RpbmdzL3RhYmxlcy9iaWc1LWFkZGVkLmpzb25cbi8vIG1vZHVsZSBpZCA9IDE0OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoXCJidWZmZXJcIikuQnVmZmVyLFxuICAgIFRyYW5zZm9ybSA9IHJlcXVpcmUoXCJzdHJlYW1cIikuVHJhbnNmb3JtO1xuXG5cbi8vID09IEV4cG9ydHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGljb252KSB7XG4gICAgXG4gICAgLy8gQWRkaXRpb25hbCBQdWJsaWMgQVBJLlxuICAgIGljb252LmVuY29kZVN0cmVhbSA9IGZ1bmN0aW9uIGVuY29kZVN0cmVhbShlbmNvZGluZywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEljb252TGl0ZUVuY29kZXJTdHJlYW0oaWNvbnYuZ2V0RW5jb2RlcihlbmNvZGluZywgb3B0aW9ucyksIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGljb252LmRlY29kZVN0cmVhbSA9IGZ1bmN0aW9uIGRlY29kZVN0cmVhbShlbmNvZGluZywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEljb252TGl0ZURlY29kZXJTdHJlYW0oaWNvbnYuZ2V0RGVjb2RlcihlbmNvZGluZywgb3B0aW9ucyksIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGljb252LnN1cHBvcnRzU3RyZWFtcyA9IHRydWU7XG5cblxuICAgIC8vIE5vdCBwdWJsaXNoZWQgeWV0LlxuICAgIGljb252Lkljb252TGl0ZUVuY29kZXJTdHJlYW0gPSBJY29udkxpdGVFbmNvZGVyU3RyZWFtO1xuICAgIGljb252Lkljb252TGl0ZURlY29kZXJTdHJlYW0gPSBJY29udkxpdGVEZWNvZGVyU3RyZWFtO1xuICAgIGljb252Ll9jb2xsZWN0ID0gSWNvbnZMaXRlRGVjb2RlclN0cmVhbS5wcm90b3R5cGUuY29sbGVjdDtcbn07XG5cblxuLy8gPT0gRW5jb2RlciBzdHJlYW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZnVuY3Rpb24gSWNvbnZMaXRlRW5jb2RlclN0cmVhbShjb252LCBvcHRpb25zKSB7XG4gICAgdGhpcy5jb252ID0gY29udjtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLmRlY29kZVN0cmluZ3MgPSBmYWxzZTsgLy8gV2UgYWNjZXB0IG9ubHkgc3RyaW5ncywgc28gd2UgZG9uJ3QgbmVlZCB0byBkZWNvZGUgdGhlbS5cbiAgICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuSWNvbnZMaXRlRW5jb2RlclN0cmVhbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFRyYW5zZm9ybS5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogSWNvbnZMaXRlRW5jb2RlclN0cmVhbSB9XG59KTtcblxuSWNvbnZMaXRlRW5jb2RlclN0cmVhbS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uKGNodW5rLCBlbmNvZGluZywgZG9uZSkge1xuICAgIGlmICh0eXBlb2YgY2h1bmsgIT0gJ3N0cmluZycpXG4gICAgICAgIHJldHVybiBkb25lKG5ldyBFcnJvcihcIkljb252IGVuY29kaW5nIHN0cmVhbSBuZWVkcyBzdHJpbmdzIGFzIGl0cyBpbnB1dC5cIikpO1xuICAgIHRyeSB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLmNvbnYud3JpdGUoY2h1bmspO1xuICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGgpIHRoaXMucHVzaChyZXMpO1xuICAgICAgICBkb25lKCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGRvbmUoZSk7XG4gICAgfVxufVxuXG5JY29udkxpdGVFbmNvZGVyU3RyZWFtLnByb3RvdHlwZS5fZmx1c2ggPSBmdW5jdGlvbihkb25lKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuY29udi5lbmQoKTtcbiAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoKSB0aGlzLnB1c2gocmVzKTtcbiAgICAgICAgZG9uZSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBkb25lKGUpO1xuICAgIH1cbn1cblxuSWNvbnZMaXRlRW5jb2RlclN0cmVhbS5wcm90b3R5cGUuY29sbGVjdCA9IGZ1bmN0aW9uKGNiKSB7XG4gICAgdmFyIGNodW5rcyA9IFtdO1xuICAgIHRoaXMub24oJ2Vycm9yJywgY2IpO1xuICAgIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykgeyBjaHVua3MucHVzaChjaHVuayk7IH0pO1xuICAgIHRoaXMub24oJ2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBjYihudWxsLCBCdWZmZXIuY29uY2F0KGNodW5rcykpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xufVxuXG5cbi8vID09IERlY29kZXIgc3RyZWFtID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmZ1bmN0aW9uIEljb252TGl0ZURlY29kZXJTdHJlYW0oY29udiwgb3B0aW9ucykge1xuICAgIHRoaXMuY29udiA9IGNvbnY7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5lbmNvZGluZyA9IHRoaXMuZW5jb2RpbmcgPSAndXRmOCc7IC8vIFdlIG91dHB1dCBzdHJpbmdzLlxuICAgIFRyYW5zZm9ybS5jYWxsKHRoaXMsIG9wdGlvbnMpO1xufVxuXG5JY29udkxpdGVEZWNvZGVyU3RyZWFtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoVHJhbnNmb3JtLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBJY29udkxpdGVEZWNvZGVyU3RyZWFtIH1cbn0pO1xuXG5JY29udkxpdGVEZWNvZGVyU3RyZWFtLnByb3RvdHlwZS5fdHJhbnNmb3JtID0gZnVuY3Rpb24oY2h1bmssIGVuY29kaW5nLCBkb25lKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoY2h1bmspKVxuICAgICAgICByZXR1cm4gZG9uZShuZXcgRXJyb3IoXCJJY29udiBkZWNvZGluZyBzdHJlYW0gbmVlZHMgYnVmZmVycyBhcyBpdHMgaW5wdXQuXCIpKTtcbiAgICB0cnkge1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5jb252LndyaXRlKGNodW5rKTtcbiAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoKSB0aGlzLnB1c2gocmVzLCB0aGlzLmVuY29kaW5nKTtcbiAgICAgICAgZG9uZSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBkb25lKGUpO1xuICAgIH1cbn1cblxuSWNvbnZMaXRlRGVjb2RlclN0cmVhbS5wcm90b3R5cGUuX2ZsdXNoID0gZnVuY3Rpb24oZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICAgIHZhciByZXMgPSB0aGlzLmNvbnYuZW5kKCk7XG4gICAgICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCkgdGhpcy5wdXNoKHJlcywgdGhpcy5lbmNvZGluZyk7ICAgICAgICAgICAgICAgIFxuICAgICAgICBkb25lKCk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGRvbmUoZSk7XG4gICAgfVxufVxuXG5JY29udkxpdGVEZWNvZGVyU3RyZWFtLnByb3RvdHlwZS5jb2xsZWN0ID0gZnVuY3Rpb24oY2IpIHtcbiAgICB2YXIgcmVzID0gJyc7XG4gICAgdGhpcy5vbignZXJyb3InLCBjYik7XG4gICAgdGhpcy5vbignZGF0YScsIGZ1bmN0aW9uKGNodW5rKSB7IHJlcyArPSBjaHVuazsgfSk7XG4gICAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGNiKG51bGwsIHJlcyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG59XG5cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9pY29udi1saXRlL2xpYi9zdHJlYW1zLmpzXG4vLyBtb2R1bGUgaWQgPSAxNDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgQnVmZmVyID0gcmVxdWlyZShcImJ1ZmZlclwiKS5CdWZmZXI7XG5cbi8vID09IEV4dGVuZCBOb2RlIHByaW1pdGl2ZXMgdG8gdXNlIGljb252LWxpdGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGljb252KSB7XG4gICAgdmFyIG9yaWdpbmFsID0gdW5kZWZpbmVkOyAvLyBQbGFjZSB0byBrZWVwIG9yaWdpbmFsIG1ldGhvZHMuXG5cbiAgICAvLyBOb2RlIGF1dGhvcnMgcmV3cm90ZSBCdWZmZXIgaW50ZXJuYWxzIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoXG4gICAgLy8gVWludDhBcnJheSBhbmQgd2UgY2Fubm90IHBhdGNoIGtleSBmdW5jdGlvbnMgc2luY2UgdGhlbi5cbiAgICBpY29udi5zdXBwb3J0c05vZGVFbmNvZGluZ3NFeHRlbnNpb24gPSAhKG5ldyBCdWZmZXIoMCkgaW5zdGFuY2VvZiBVaW50OEFycmF5KTtcblxuICAgIGljb252LmV4dGVuZE5vZGVFbmNvZGluZ3MgPSBmdW5jdGlvbiBleHRlbmROb2RlRW5jb2RpbmdzKCkge1xuICAgICAgICBpZiAob3JpZ2luYWwpIHJldHVybjtcbiAgICAgICAgb3JpZ2luYWwgPSB7fTtcblxuICAgICAgICBpZiAoIWljb252LnN1cHBvcnRzTm9kZUVuY29kaW5nc0V4dGVuc2lvbikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkFDVElPTiBORUVERUQ6IHJlcXVpcmUoJ2ljb252LWxpdGUnKS5leHRlbmROb2RlRW5jb2RpbmdzKCkgaXMgbm90IHN1cHBvcnRlZCBpbiB5b3VyIHZlcnNpb24gb2YgTm9kZVwiKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTZWUgbW9yZSBpbmZvIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hc2h0dWNoa2luL2ljb252LWxpdGUvd2lraS9Ob2RlLXY0LWNvbXBhdGliaWxpdHlcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm9kZU5hdGl2ZUVuY29kaW5ncyA9IHtcbiAgICAgICAgICAgICdoZXgnOiB0cnVlLCAndXRmOCc6IHRydWUsICd1dGYtOCc6IHRydWUsICdhc2NpaSc6IHRydWUsICdiaW5hcnknOiB0cnVlLCBcbiAgICAgICAgICAgICdiYXNlNjQnOiB0cnVlLCAndWNzMic6IHRydWUsICd1Y3MtMic6IHRydWUsICd1dGYxNmxlJzogdHJ1ZSwgJ3V0Zi0xNmxlJzogdHJ1ZSxcbiAgICAgICAgfTtcblxuICAgICAgICBCdWZmZXIuaXNOYXRpdmVFbmNvZGluZyA9IGZ1bmN0aW9uKGVuYykge1xuICAgICAgICAgICAgcmV0dXJuIGVuYyAmJiBub2RlTmF0aXZlRW5jb2RpbmdzW2VuYy50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tIFNsb3dCdWZmZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgdmFyIFNsb3dCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5TbG93QnVmZmVyO1xuXG4gICAgICAgIG9yaWdpbmFsLlNsb3dCdWZmZXJUb1N0cmluZyA9IFNsb3dCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgICAgICBTbG93QnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gICAgICAgICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIFVzZSBuYXRpdmUgY29udmVyc2lvbiB3aGVuIHBvc3NpYmxlXG4gICAgICAgICAgICBpZiAoQnVmZmVyLmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5TbG93QnVmZmVyVG9TdHJpbmcuY2FsbCh0aGlzLCBlbmNvZGluZywgc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdXNlIG91ciBkZWNvZGluZyBtZXRob2QuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHN0YXJ0ID09ICd1bmRlZmluZWQnKSBzdGFydCA9IDA7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVuZCA9PSAndW5kZWZpbmVkJykgZW5kID0gdGhpcy5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gaWNvbnYuZGVjb2RlKHRoaXMuc2xpY2Uoc3RhcnQsIGVuZCksIGVuY29kaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9yaWdpbmFsLlNsb3dCdWZmZXJXcml0ZSA9IFNsb3dCdWZmZXIucHJvdG90eXBlLndyaXRlO1xuICAgICAgICBTbG93QnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gICAgICAgICAgICAvLyBTdXBwb3J0IGJvdGggKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKVxuICAgICAgICAgICAgLy8gYW5kIHRoZSBsZWdhY3kgKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoKVxuICAgICAgICAgICAgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBsZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgeyAgLy8gbGVnYWN5XG4gICAgICAgICAgICAgICAgdmFyIHN3YXAgPSBlbmNvZGluZztcbiAgICAgICAgICAgICAgICBlbmNvZGluZyA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBsZW5ndGg7XG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gc3dhcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb2Zmc2V0ID0gK29mZnNldCB8fCAwO1xuICAgICAgICAgICAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxlbmd0aCA9ICtsZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcgfHwgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAvLyBVc2UgbmF0aXZlIGNvbnZlcnNpb24gd2hlbiBwb3NzaWJsZVxuICAgICAgICAgICAgaWYgKEJ1ZmZlci5pc05hdGl2ZUVuY29kaW5nKGVuY29kaW5nKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuU2xvd0J1ZmZlcldyaXRlLmNhbGwodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpO1xuXG4gICAgICAgICAgICBpZiAoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2F0dGVtcHQgdG8gd3JpdGUgYmV5b25kIGJ1ZmZlciBib3VuZHMnKTtcblxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB1c2Ugb3VyIGVuY29kaW5nIG1ldGhvZC5cbiAgICAgICAgICAgIHZhciBidWYgPSBpY29udi5lbmNvZGUoc3RyaW5nLCBlbmNvZGluZyk7XG4gICAgICAgICAgICBpZiAoYnVmLmxlbmd0aCA8IGxlbmd0aCkgbGVuZ3RoID0gYnVmLmxlbmd0aDtcbiAgICAgICAgICAgIGJ1Zi5jb3B5KHRoaXMsIG9mZnNldCwgMCwgbGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAtLSBCdWZmZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgICAgb3JpZ2luYWwuQnVmZmVySXNFbmNvZGluZyA9IEJ1ZmZlci5pc0VuY29kaW5nO1xuICAgICAgICBCdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpIHx8IGljb252LmVuY29kaW5nRXhpc3RzKGVuY29kaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9yaWdpbmFsLkJ1ZmZlckJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgQnVmZmVyLmJ5dGVMZW5ndGggPSBTbG93QnVmZmVyLmJ5dGVMZW5ndGggPSBmdW5jdGlvbihzdHIsIGVuY29kaW5nKSB7XG4gICAgICAgICAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZyB8fCAndXRmOCcpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIFVzZSBuYXRpdmUgY29udmVyc2lvbiB3aGVuIHBvc3NpYmxlXG4gICAgICAgICAgICBpZiAoQnVmZmVyLmlzTmF0aXZlRW5jb2RpbmcoZW5jb2RpbmcpKVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5CdWZmZXJCeXRlTGVuZ3RoLmNhbGwodGhpcywgc3RyLCBlbmNvZGluZyk7XG5cbiAgICAgICAgICAgIC8vIFNsb3csIEkga25vdywgYnV0IHdlIGRvbid0IGhhdmUgYSBiZXR0ZXIgd2F5IHlldC5cbiAgICAgICAgICAgIHJldHVybiBpY29udi5lbmNvZGUoc3RyLCBlbmNvZGluZykubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgb3JpZ2luYWwuQnVmZmVyVG9TdHJpbmcgPSBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgICAgICBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgLy8gVXNlIG5hdGl2ZSBjb252ZXJzaW9uIHdoZW4gcG9zc2libGVcbiAgICAgICAgICAgIGlmIChCdWZmZXIuaXNOYXRpdmVFbmNvZGluZyhlbmNvZGluZykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLkJ1ZmZlclRvU3RyaW5nLmNhbGwodGhpcywgZW5jb2RpbmcsIHN0YXJ0LCBlbmQpO1xuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHVzZSBvdXIgZGVjb2RpbmcgbWV0aG9kLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzdGFydCA9PSAndW5kZWZpbmVkJykgc3RhcnQgPSAwO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbmQgPT0gJ3VuZGVmaW5lZCcpIGVuZCA9IHRoaXMubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIGljb252LmRlY29kZSh0aGlzLnNsaWNlKHN0YXJ0LCBlbmQpLCBlbmNvZGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBvcmlnaW5hbC5CdWZmZXJXcml0ZSA9IEJ1ZmZlci5wcm90b3R5cGUud3JpdGU7XG4gICAgICAgIEJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAgICAgICAgICAgdmFyIF9vZmZzZXQgPSBvZmZzZXQsIF9sZW5ndGggPSBsZW5ndGgsIF9lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgICAgICAgICAgLy8gU3VwcG9ydCBib3RoIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZylcbiAgICAgICAgICAgIC8vIGFuZCB0aGUgbGVnYWN5IChzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aClcbiAgICAgICAgICAgIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShsZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gbGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHsgIC8vIGxlZ2FjeVxuICAgICAgICAgICAgICAgIHZhciBzd2FwID0gZW5jb2Rpbmc7XG4gICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gbGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxlbmd0aCA9IHN3YXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nIHx8ICd1dGY4JykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgLy8gVXNlIG5hdGl2ZSBjb252ZXJzaW9uIHdoZW4gcG9zc2libGVcbiAgICAgICAgICAgIGlmIChCdWZmZXIuaXNOYXRpdmVFbmNvZGluZyhlbmNvZGluZykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLkJ1ZmZlcldyaXRlLmNhbGwodGhpcywgc3RyaW5nLCBfb2Zmc2V0LCBfbGVuZ3RoLCBfZW5jb2RpbmcpO1xuXG4gICAgICAgICAgICBvZmZzZXQgPSArb2Zmc2V0IHx8IDA7XG4gICAgICAgICAgICB2YXIgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXQ7XG4gICAgICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGVuZ3RoID0gK2xlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHJlbWFpbmluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignYXR0ZW1wdCB0byB3cml0ZSBiZXlvbmQgYnVmZmVyIGJvdW5kcycpO1xuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIHVzZSBvdXIgZW5jb2RpbmcgbWV0aG9kLlxuICAgICAgICAgICAgdmFyIGJ1ZiA9IGljb252LmVuY29kZShzdHJpbmcsIGVuY29kaW5nKTtcbiAgICAgICAgICAgIGlmIChidWYubGVuZ3RoIDwgbGVuZ3RoKSBsZW5ndGggPSBidWYubGVuZ3RoO1xuICAgICAgICAgICAgYnVmLmNvcHkodGhpcywgb2Zmc2V0LCAwLCBsZW5ndGgpO1xuICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDtcblxuICAgICAgICAgICAgLy8gVE9ETzogU2V0IF9jaGFyc1dyaXR0ZW4uXG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIC0tIFJlYWRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgaWYgKGljb252LnN1cHBvcnRzU3RyZWFtcykge1xuICAgICAgICAgICAgdmFyIFJlYWRhYmxlID0gcmVxdWlyZSgnc3RyZWFtJykuUmVhZGFibGU7XG5cbiAgICAgICAgICAgIG9yaWdpbmFsLlJlYWRhYmxlU2V0RW5jb2RpbmcgPSBSZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2Rpbmc7XG4gICAgICAgICAgICBSZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBmdW5jdGlvbiBzZXRFbmNvZGluZyhlbmMsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2Ugb3VyIG93biBkZWNvZGVyLCBpdCBoYXMgdGhlIHNhbWUgaW50ZXJmYWNlLlxuICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCB1c2Ugb3JpZ2luYWwgZnVuY3Rpb24gYXMgaXQgZG9lc24ndCBoYW5kbGUgQk9NLXMuXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVhZGFibGVTdGF0ZS5kZWNvZGVyID0gaWNvbnYuZ2V0RGVjb2RlcihlbmMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5jb2RpbmcgPSBlbmM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFJlYWRhYmxlLnByb3RvdHlwZS5jb2xsZWN0ID0gaWNvbnYuX2NvbGxlY3Q7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgaWNvbnYtbGl0ZSBOb2RlIHByaW1pdGl2ZSBleHRlbnNpb25zLlxuICAgIGljb252LnVuZG9FeHRlbmROb2RlRW5jb2RpbmdzID0gZnVuY3Rpb24gdW5kb0V4dGVuZE5vZGVFbmNvZGluZ3MoKSB7XG4gICAgICAgIGlmICghaWNvbnYuc3VwcG9ydHNOb2RlRW5jb2RpbmdzRXh0ZW5zaW9uKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoIW9yaWdpbmFsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVxdWlyZSgnaWNvbnYtbGl0ZScpLnVuZG9FeHRlbmROb2RlRW5jb2RpbmdzKCk6IE5vdGhpbmcgdG8gdW5kbzsgZXh0ZW5kTm9kZUVuY29kaW5ncygpIGlzIG5vdCBjYWxsZWQuXCIpXG5cbiAgICAgICAgZGVsZXRlIEJ1ZmZlci5pc05hdGl2ZUVuY29kaW5nO1xuXG4gICAgICAgIHZhciBTbG93QnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuU2xvd0J1ZmZlcjtcblxuICAgICAgICBTbG93QnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IG9yaWdpbmFsLlNsb3dCdWZmZXJUb1N0cmluZztcbiAgICAgICAgU2xvd0J1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBvcmlnaW5hbC5TbG93QnVmZmVyV3JpdGU7XG5cbiAgICAgICAgQnVmZmVyLmlzRW5jb2RpbmcgPSBvcmlnaW5hbC5CdWZmZXJJc0VuY29kaW5nO1xuICAgICAgICBCdWZmZXIuYnl0ZUxlbmd0aCA9IG9yaWdpbmFsLkJ1ZmZlckJ5dGVMZW5ndGg7XG4gICAgICAgIEJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBvcmlnaW5hbC5CdWZmZXJUb1N0cmluZztcbiAgICAgICAgQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IG9yaWdpbmFsLkJ1ZmZlcldyaXRlO1xuXG4gICAgICAgIGlmIChpY29udi5zdXBwb3J0c1N0cmVhbXMpIHtcbiAgICAgICAgICAgIHZhciBSZWFkYWJsZSA9IHJlcXVpcmUoJ3N0cmVhbScpLlJlYWRhYmxlO1xuXG4gICAgICAgICAgICBSZWFkYWJsZS5wcm90b3R5cGUuc2V0RW5jb2RpbmcgPSBvcmlnaW5hbC5SZWFkYWJsZVNldEVuY29kaW5nO1xuICAgICAgICAgICAgZGVsZXRlIFJlYWRhYmxlLnByb3RvdHlwZS5jb2xsZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgb3JpZ2luYWwgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2ljb252LWxpdGUvbGliL2V4dGVuZC1ub2RlLmpzXG4vLyBtb2R1bGUgaWQgPSAxNTBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBlZS1maXJzdFxuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZpcnN0XG5cbi8qKlxuICogR2V0IHRoZSBmaXJzdCBldmVudCBpbiBhIHNldCBvZiBldmVudCBlbWl0dGVycyBhbmQgZXZlbnQgcGFpcnMuXG4gKlxuICogQHBhcmFtIHthcnJheX0gc3R1ZmZcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGRvbmVcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmaXJzdChzdHVmZiwgZG9uZSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3R1ZmYpKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZyBtdXN0IGJlIGFuIGFycmF5IG9mIFtlZSwgZXZlbnRzLi4uXSBhcnJheXMnKVxuXG4gIHZhciBjbGVhbnVwcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHVmZi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBhcnIgPSBzdHVmZltpXVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycikgfHwgYXJyLmxlbmd0aCA8IDIpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlYWNoIGFycmF5IG1lbWJlciBtdXN0IGJlIFtlZSwgZXZlbnRzLi4uXScpXG5cbiAgICB2YXIgZWUgPSBhcnJbMF1cblxuICAgIGZvciAodmFyIGogPSAxOyBqIDwgYXJyLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgZXZlbnQgPSBhcnJbal1cbiAgICAgIHZhciBmbiA9IGxpc3RlbmVyKGV2ZW50LCBjYWxsYmFjaylcblxuICAgICAgLy8gbGlzdGVuIHRvIHRoZSBldmVudFxuICAgICAgZWUub24oZXZlbnQsIGZuKVxuICAgICAgLy8gcHVzaCB0aGlzIGxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIGNsZWFudXBzXG4gICAgICBjbGVhbnVwcy5wdXNoKHtcbiAgICAgICAgZWU6IGVlLFxuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIGZuOiBmbixcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgY2xlYW51cCgpXG4gICAgZG9uZS5hcHBseShudWxsLCBhcmd1bWVudHMpXG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIHZhciB4XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGVhbnVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgeCA9IGNsZWFudXBzW2ldXG4gICAgICB4LmVlLnJlbW92ZUxpc3RlbmVyKHguZXZlbnQsIHguZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdGh1bmsoZm4pIHtcbiAgICBkb25lID0gZm5cbiAgfVxuXG4gIHRodW5rLmNhbmNlbCA9IGNsZWFudXBcblxuICByZXR1cm4gdGh1bmtcbn1cblxuLyoqXG4gKiBDcmVhdGUgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsaXN0ZW5lcihldmVudCwgZG9uZSkge1xuICByZXR1cm4gZnVuY3Rpb24gb25ldmVudChhcmcxKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcbiAgICB2YXIgZWUgPSB0aGlzXG4gICAgdmFyIGVyciA9IGV2ZW50ID09PSAnZXJyb3InXG4gICAgICA/IGFyZzFcbiAgICAgIDogbnVsbFxuXG4gICAgLy8gY29weSBhcmdzIHRvIHByZXZlbnQgYXJndW1lbnRzIGVzY2FwaW5nIHNjb3BlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuXG4gICAgZG9uZShlcnIsIGVlLCBldmVudCwgYXJncylcbiAgfVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2VlLWZpcnN0L2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxNTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBtZWRpYS10eXBlclxuICogQ29weXJpZ2h0KGMpIDIwMTQgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoICooIFwiO1wiIHBhcmFtZXRlciApIGluIFJGQyAyNjE2IHNlYyAzLjdcbiAqXG4gKiBwYXJhbWV0ZXIgICAgID0gdG9rZW4gXCI9XCIgKCB0b2tlbiB8IHF1b3RlZC1zdHJpbmcgKVxuICogdG9rZW4gICAgICAgICA9IDEqPGFueSBDSEFSIGV4Y2VwdCBDVExzIG9yIHNlcGFyYXRvcnM+XG4gKiBzZXBhcmF0b3JzICAgID0gXCIoXCIgfCBcIilcIiB8IFwiPFwiIHwgXCI+XCIgfCBcIkBcIlxuICogICAgICAgICAgICAgICB8IFwiLFwiIHwgXCI7XCIgfCBcIjpcIiB8IFwiXFxcIiB8IDxcIj5cbiAqICAgICAgICAgICAgICAgfCBcIi9cIiB8IFwiW1wiIHwgXCJdXCIgfCBcIj9cIiB8IFwiPVwiXG4gKiAgICAgICAgICAgICAgIHwgXCJ7XCIgfCBcIn1cIiB8IFNQIHwgSFRcbiAqIHF1b3RlZC1zdHJpbmcgPSAoIDxcIj4gKihxZHRleHQgfCBxdW90ZWQtcGFpciApIDxcIj4gKVxuICogcWR0ZXh0ICAgICAgICA9IDxhbnkgVEVYVCBleGNlcHQgPFwiPj5cbiAqIHF1b3RlZC1wYWlyICAgPSBcIlxcXCIgQ0hBUlxuICogQ0hBUiAgICAgICAgICA9IDxhbnkgVVMtQVNDSUkgY2hhcmFjdGVyIChvY3RldHMgMCAtIDEyNyk+XG4gKiBURVhUICAgICAgICAgID0gPGFueSBPQ1RFVCBleGNlcHQgQ1RMcywgYnV0IGluY2x1ZGluZyBMV1M+XG4gKiBMV1MgICAgICAgICAgID0gW0NSTEZdIDEqKCBTUCB8IEhUIClcbiAqIENSTEYgICAgICAgICAgPSBDUiBMRlxuICogQ1IgICAgICAgICAgICA9IDxVUy1BU0NJSSBDUiwgY2FycmlhZ2UgcmV0dXJuICgxMyk+XG4gKiBMRiAgICAgICAgICAgID0gPFVTLUFTQ0lJIExGLCBsaW5lZmVlZCAoMTApPlxuICogU1AgICAgICAgICAgICA9IDxVUy1BU0NJSSBTUCwgc3BhY2UgKDMyKT5cbiAqIFNIVCAgICAgICAgICAgPSA8VVMtQVNDSUkgSFQsIGhvcml6b250YWwtdGFiICg5KT5cbiAqIENUTCAgICAgICAgICAgPSA8YW55IFVTLUFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVyIChvY3RldHMgMCAtIDMxKSBhbmQgREVMICgxMjcpPlxuICogT0NURVQgICAgICAgICA9IDxhbnkgOC1iaXQgc2VxdWVuY2Ugb2YgZGF0YT5cbiAqL1xudmFyIHBhcmFtUmVnRXhwID0gLzsgKihbISMkJSYnXFwqXFwrXFwtXFwuMC05QS1aXFxeX2BhLXpcXHx+XSspICo9ICooXCIoPzpbICFcXHUwMDIzLVxcdTAwNWJcXHUwMDVkLVxcdTAwN2VcXHUwMDgwLVxcdTAwZmZdfFxcXFxbXFx1MDAyMC1cXHUwMDdlXSkqXCJ8WyEjJCUmJ1xcKlxcK1xcLVxcLjAtOUEtWlxcXl9gYS16XFx8fl0rKSAqL2c7XG52YXIgdGV4dFJlZ0V4cCA9IC9eW1xcdTAwMjAtXFx1MDA3ZVxcdTAwODAtXFx1MDBmZl0rJC9cbnZhciB0b2tlblJlZ0V4cCA9IC9eWyEjJCUmJ1xcKlxcK1xcLVxcLjAtOUEtWlxcXl9gYS16XFx8fl0rJC9cblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggcXVvdGVkLXBhaXIgaW4gUkZDIDI2MTZcbiAqXG4gKiBxdW90ZWQtcGFpciA9IFwiXFxcIiBDSEFSXG4gKiBDSEFSICAgICAgICA9IDxhbnkgVVMtQVNDSUkgY2hhcmFjdGVyIChvY3RldHMgMCAtIDEyNyk+XG4gKi9cbnZhciBxZXNjUmVnRXhwID0gL1xcXFwoW1xcdTAwMDAtXFx1MDA3Zl0pL2c7XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGNoYXJzIHRoYXQgbXVzdCBiZSBxdW90ZWQtcGFpciBpbiBSRkMgMjYxNlxuICovXG52YXIgcXVvdGVSZWdFeHAgPSAvKFtcXFxcXCJdKS9nO1xuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCB0eXBlIGluIFJGQyA2ODM4XG4gKlxuICogdHlwZS1uYW1lID0gcmVzdHJpY3RlZC1uYW1lXG4gKiBzdWJ0eXBlLW5hbWUgPSByZXN0cmljdGVkLW5hbWVcbiAqIHJlc3RyaWN0ZWQtbmFtZSA9IHJlc3RyaWN0ZWQtbmFtZS1maXJzdCAqMTI2cmVzdHJpY3RlZC1uYW1lLWNoYXJzXG4gKiByZXN0cmljdGVkLW5hbWUtZmlyc3QgID0gQUxQSEEgLyBESUdJVFxuICogcmVzdHJpY3RlZC1uYW1lLWNoYXJzICA9IEFMUEhBIC8gRElHSVQgLyBcIiFcIiAvIFwiI1wiIC9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBcIiRcIiAvIFwiJlwiIC8gXCItXCIgLyBcIl5cIiAvIFwiX1wiXG4gKiByZXN0cmljdGVkLW5hbWUtY2hhcnMgPS8gXCIuXCIgOyBDaGFyYWN0ZXJzIGJlZm9yZSBmaXJzdCBkb3QgYWx3YXlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgc3BlY2lmeSBhIGZhY2V0IG5hbWVcbiAqIHJlc3RyaWN0ZWQtbmFtZS1jaGFycyA9LyBcIitcIiA7IENoYXJhY3RlcnMgYWZ0ZXIgbGFzdCBwbHVzIGFsd2F5c1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IHNwZWNpZnkgYSBzdHJ1Y3R1cmVkIHN5bnRheCBzdWZmaXhcbiAqIEFMUEhBID0gICV4NDEtNUEgLyAleDYxLTdBICAgOyBBLVogLyBhLXpcbiAqIERJR0lUID0gICV4MzAtMzkgICAgICAgICAgICAgOyAwLTlcbiAqL1xudmFyIHN1YnR5cGVOYW1lUmVnRXhwID0gL15bQS1aYS16MC05XVtBLVphLXowLTkhIyQmXl8uLV17MCwxMjZ9JC9cbnZhciB0eXBlTmFtZVJlZ0V4cCA9IC9eW0EtWmEtejAtOV1bQS1aYS16MC05ISMkJl5fLV17MCwxMjZ9JC9cbnZhciB0eXBlUmVnRXhwID0gL14gKihbQS1aYS16MC05XVtBLVphLXowLTkhIyQmXl8tXXswLDEyNn0pXFwvKFtBLVphLXowLTldW0EtWmEtejAtOSEjJCZeXy4rLV17MCwxMjZ9KSAqJC87XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXQgPSBmb3JtYXRcbmV4cG9ydHMucGFyc2UgPSBwYXJzZVxuXG4vKipcbiAqIEZvcm1hdCBvYmplY3QgdG8gbWVkaWEgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcm1hdChvYmopIHtcbiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBvYmogaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgdmFyIHBhcmFtZXRlcnMgPSBvYmoucGFyYW1ldGVyc1xuICB2YXIgc3VidHlwZSA9IG9iai5zdWJ0eXBlXG4gIHZhciBzdWZmaXggPSBvYmouc3VmZml4XG4gIHZhciB0eXBlID0gb2JqLnR5cGVcblxuICBpZiAoIXR5cGUgfHwgIXR5cGVOYW1lUmVnRXhwLnRlc3QodHlwZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHR5cGUnKVxuICB9XG5cbiAgaWYgKCFzdWJ0eXBlIHx8ICFzdWJ0eXBlTmFtZVJlZ0V4cC50ZXN0KHN1YnR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBzdWJ0eXBlJylcbiAgfVxuXG4gIC8vIGZvcm1hdCBhcyB0eXBlL3N1YnR5cGVcbiAgdmFyIHN0cmluZyA9IHR5cGUgKyAnLycgKyBzdWJ0eXBlXG5cbiAgLy8gYXBwZW5kICtzdWZmaXhcbiAgaWYgKHN1ZmZpeCkge1xuICAgIGlmICghdHlwZU5hbWVSZWdFeHAudGVzdChzdWZmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHN1ZmZpeCcpXG4gICAgfVxuXG4gICAgc3RyaW5nICs9ICcrJyArIHN1ZmZpeFxuICB9XG5cbiAgLy8gYXBwZW5kIHBhcmFtZXRlcnNcbiAgaWYgKHBhcmFtZXRlcnMgJiYgdHlwZW9mIHBhcmFtZXRlcnMgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIHBhcmFtXG4gICAgdmFyIHBhcmFtcyA9IE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLnNvcnQoKVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhcmFtID0gcGFyYW1zW2ldXG5cbiAgICAgIGlmICghdG9rZW5SZWdFeHAudGVzdChwYXJhbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXJhbWV0ZXIgbmFtZScpXG4gICAgICB9XG5cbiAgICAgIHN0cmluZyArPSAnOyAnICsgcGFyYW0gKyAnPScgKyBxc3RyaW5nKHBhcmFtZXRlcnNbcGFyYW1dKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHJpbmdcbn1cblxuLyoqXG4gKiBQYXJzZSBtZWRpYSB0eXBlIHRvIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHN0cmluZ1xuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHJpbmcpIHtcbiAgaWYgKCFzdHJpbmcpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzdHJpbmcgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgLy8gc3VwcG9ydCByZXEvcmVzLWxpa2Ugb2JqZWN0cyBhcyBhcmd1bWVudFxuICBpZiAodHlwZW9mIHN0cmluZyA9PT0gJ29iamVjdCcpIHtcbiAgICBzdHJpbmcgPSBnZXRjb250ZW50dHlwZShzdHJpbmcpXG4gIH1cblxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzdHJpbmcgaXMgcmVxdWlyZWQgdG8gYmUgYSBzdHJpbmcnKVxuICB9XG5cbiAgdmFyIGluZGV4ID0gc3RyaW5nLmluZGV4T2YoJzsnKVxuICB2YXIgdHlwZSA9IGluZGV4ICE9PSAtMVxuICAgID8gc3RyaW5nLnN1YnN0cigwLCBpbmRleClcbiAgICA6IHN0cmluZ1xuXG4gIHZhciBrZXlcbiAgdmFyIG1hdGNoXG4gIHZhciBvYmogPSBzcGxpdFR5cGUodHlwZSlcbiAgdmFyIHBhcmFtcyA9IHt9XG4gIHZhciB2YWx1ZVxuXG4gIHBhcmFtUmVnRXhwLmxhc3RJbmRleCA9IGluZGV4XG5cbiAgd2hpbGUgKG1hdGNoID0gcGFyYW1SZWdFeHAuZXhlYyhzdHJpbmcpKSB7XG4gICAgaWYgKG1hdGNoLmluZGV4ICE9PSBpbmRleCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXJhbWV0ZXIgZm9ybWF0JylcbiAgICB9XG5cbiAgICBpbmRleCArPSBtYXRjaFswXS5sZW5ndGhcbiAgICBrZXkgPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgdmFsdWUgPSBtYXRjaFsyXVxuXG4gICAgaWYgKHZhbHVlWzBdID09PSAnXCInKSB7XG4gICAgICAvLyByZW1vdmUgcXVvdGVzIGFuZCBlc2NhcGVzXG4gICAgICB2YWx1ZSA9IHZhbHVlXG4gICAgICAgIC5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoIC0gMilcbiAgICAgICAgLnJlcGxhY2UocWVzY1JlZ0V4cCwgJyQxJylcbiAgICB9XG5cbiAgICBwYXJhbXNba2V5XSA9IHZhbHVlXG4gIH1cblxuICBpZiAoaW5kZXggIT09IC0xICYmIGluZGV4ICE9PSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBwYXJhbWV0ZXIgZm9ybWF0JylcbiAgfVxuXG4gIG9iai5wYXJhbWV0ZXJzID0gcGFyYW1zXG5cbiAgcmV0dXJuIG9ialxufVxuXG4vKipcbiAqIEdldCBjb250ZW50LXR5cGUgZnJvbSByZXEvcmVzIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9XG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRjb250ZW50dHlwZShvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmouZ2V0SGVhZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gcmVzLWxpa2VcbiAgICByZXR1cm4gb2JqLmdldEhlYWRlcignY29udGVudC10eXBlJylcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqLmhlYWRlcnMgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gcmVxLWxpa2VcbiAgICByZXR1cm4gb2JqLmhlYWRlcnMgJiYgb2JqLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddXG4gIH1cbn1cblxuLyoqXG4gKiBRdW90ZSBhIHN0cmluZyBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbFxuICogQHJldHVybiB7c3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcXN0cmluZyh2YWwpIHtcbiAgdmFyIHN0ciA9IFN0cmluZyh2YWwpXG5cbiAgLy8gbm8gbmVlZCB0byBxdW90ZSB0b2tlbnNcbiAgaWYgKHRva2VuUmVnRXhwLnRlc3Qoc3RyKSkge1xuICAgIHJldHVybiBzdHJcbiAgfVxuXG4gIGlmIChzdHIubGVuZ3RoID4gMCAmJiAhdGV4dFJlZ0V4cC50ZXN0KHN0cikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIHBhcmFtZXRlciB2YWx1ZScpXG4gIH1cblxuICByZXR1cm4gJ1wiJyArIHN0ci5yZXBsYWNlKHF1b3RlUmVnRXhwLCAnXFxcXCQxJykgKyAnXCInXG59XG5cbi8qKlxuICogU2ltcGx5IFwidHlwZS9zdWJ0eXBlK3NpZmZ4XCIgaW50byBwYXJ0cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzcGxpdFR5cGUoc3RyaW5nKSB7XG4gIHZhciBtYXRjaCA9IHR5cGVSZWdFeHAuZXhlYyhzdHJpbmcudG9Mb3dlckNhc2UoKSlcblxuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignaW52YWxpZCBtZWRpYSB0eXBlJylcbiAgfVxuXG4gIHZhciB0eXBlID0gbWF0Y2hbMV1cbiAgdmFyIHN1YnR5cGUgPSBtYXRjaFsyXVxuICB2YXIgc3VmZml4XG5cbiAgLy8gc3VmZml4IGFmdGVyIGxhc3QgK1xuICB2YXIgaW5kZXggPSBzdWJ0eXBlLmxhc3RJbmRleE9mKCcrJylcbiAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIHN1ZmZpeCA9IHN1YnR5cGUuc3Vic3RyKGluZGV4ICsgMSlcbiAgICBzdWJ0eXBlID0gc3VidHlwZS5zdWJzdHIoMCwgaW5kZXgpXG4gIH1cblxuICB2YXIgb2JqID0ge1xuICAgIHR5cGU6IHR5cGUsXG4gICAgc3VidHlwZTogc3VidHlwZSxcbiAgICBzdWZmaXg6IHN1ZmZpeFxuICB9XG5cbiAgcmV0dXJuIG9ialxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL21lZGlhLXR5cGVyL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxNTJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBtaW1lLWRiXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBKb25hdGhhbiBPbmdcbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2RiLmpzb24nKVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL21pbWUtZGIvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDE1M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHtcImFwcGxpY2F0aW9uLzFkLWludGVybGVhdmVkLXBhcml0eWZlY1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uLzNncGRhc2gtcW9lLXJlcG9ydCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi8zZ3BwLWltcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9hMmxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9hY3RpdmVtZXNzYWdlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vYWx0by1jb3N0bWFwK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vYWx0by1jb3N0bWFwZmlsdGVyK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vYWx0by1kaXJlY3RvcnkranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9hbHRvLWVuZHBvaW50Y29zdCtqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL2FsdG8tZW5kcG9pbnRjb3N0cGFyYW1zK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vYWx0by1lbmRwb2ludHByb3AranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9hbHRvLWVuZHBvaW50cHJvcHBhcmFtcytqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL2FsdG8tZXJyb3IranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9hbHRvLW5ldHdvcmttYXAranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9hbHRvLW5ldHdvcmttYXBmaWx0ZXIranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9hbWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9hbmRyZXctaW5zZXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJlelwiXX0sXCJhcHBsaWNhdGlvbi9hcHBsZWZpbGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9hcHBsaXh3YXJlXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJhd1wiXX0sXCJhcHBsaWNhdGlvbi9hdGZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9hdGZ4XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vYXRvbSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wiYXRvbVwiXX0sXCJhcHBsaWNhdGlvbi9hdG9tY2F0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImF0b21jYXRcIl19LFwiYXBwbGljYXRpb24vYXRvbWRlbGV0ZWQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vYXRvbWljbWFpbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2F0b21zdmMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiYXRvbXN2Y1wiXX0sXCJhcHBsaWNhdGlvbi9hdHhtbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2F1dGgtcG9saWN5K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2JhY25ldC14ZGQremlwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vYmF0Y2gtc210cFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2Jkb2NcIjp7XCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJiZG9jXCJdfSxcImFwcGxpY2F0aW9uL2JlZXAreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vY2FsZW5kYXIranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9jYWxlbmRhcit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9jYWxsLWNvbXBsZXRpb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9jYWxzLTE4NDBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9jYm9yXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vY2NjZXhcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9jY21wK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2NjeG1sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImNjeG1sXCJdfSxcImFwcGxpY2F0aW9uL2NkZngreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vY2RtaS1jYXBhYmlsaXR5XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiY2RtaWFcIl19LFwiYXBwbGljYXRpb24vY2RtaS1jb250YWluZXJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJjZG1pY1wiXX0sXCJhcHBsaWNhdGlvbi9jZG1pLWRvbWFpblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImNkbWlkXCJdfSxcImFwcGxpY2F0aW9uL2NkbWktb2JqZWN0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiY2RtaW9cIl19LFwiYXBwbGljYXRpb24vY2RtaS1xdWV1ZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImNkbWlxXCJdfSxcImFwcGxpY2F0aW9uL2NkbmlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9jZWFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9jZWEtMjAxOCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9jZWxsbWwreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vY2Z3XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vY2x1ZV9pbmZvK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2Ntc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2NucnAreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vY29hcC1ncm91cCtqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL2NvYXAtcGF5bG9hZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2NvbW1vbmdyb3VuZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2NvbmZlcmVuY2UtaW5mbyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9jb3NlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vY29zZS1rZXlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9jb3NlLWtleS1zZXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9jcGwreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vY3NyYXR0cnNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9jc3RhK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2NzdGFkYXRhK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2Nzdm0ranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9jdS1zZWVtZVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiY3VcIl19LFwiYXBwbGljYXRpb24vY3liZXJjYXNoXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vZGFydFwiOntcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vZGFzaCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJtcGRcIl19LFwiYXBwbGljYXRpb24vZGFzaGRlbHRhXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vZGF2bW91bnQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZGF2bW91bnRcIl19LFwiYXBwbGljYXRpb24vZGNhLXJmdFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2RjZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2RlYy1keFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2RpYWxvZy1pbmZvK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2RpY29tXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vZGljb20ranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9kaWNvbSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9kaWlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9kaXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9kbnNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9kb2Nib29rK3htbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiZGJrXCJdfSxcImFwcGxpY2F0aW9uL2Rza3BwK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2Rzc2MrZGVyXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZHNzY1wiXX0sXCJhcHBsaWNhdGlvbi9kc3NjK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInhkc3NjXCJdfSxcImFwcGxpY2F0aW9uL2R2Y3NcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcImVjbWFcIl19LFwiYXBwbGljYXRpb24vZWRpLWNvbnNlbnRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9lZGkteDEyXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZX0sXCJhcHBsaWNhdGlvbi9lZGlmYWN0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZX0sXCJhcHBsaWNhdGlvbi9lZmlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9lbWVyZ2VuY3ljYWxsZGF0YS5jb21tZW50K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2VtZXJnZW5jeWNhbGxkYXRhLmNvbnRyb2wreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vZW1lcmdlbmN5Y2FsbGRhdGEuZGV2aWNlaW5mbyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9lbWVyZ2VuY3ljYWxsZGF0YS5lY2FsbC5tc2RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9lbWVyZ2VuY3ljYWxsZGF0YS5wcm92aWRlcmluZm8reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vZW1lcmdlbmN5Y2FsbGRhdGEuc2VydmljZWluZm8reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vZW1lcmdlbmN5Y2FsbGRhdGEuc3Vic2NyaWJlcmluZm8reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vZW1lcmdlbmN5Y2FsbGRhdGEudmVkcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9lbW1hK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImVtbWFcIl19LFwiYXBwbGljYXRpb24vZW1vdGlvbm1sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2VuY2FwcnRwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vZXBwK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2VwdWIremlwXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZXB1YlwiXX0sXCJhcHBsaWNhdGlvbi9lc2hvcFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2V4aVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImV4aVwiXX0sXCJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2Zhc3Rzb2FwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vZmR0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2ZoaXIreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vZmlkby50cnVzdGVkLWFwcHMranNvblwiOntcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vZml0c1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2ZvbnQtc2ZudFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2ZvbnQtdGRwZnJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJwZnJcIl19LFwiYXBwbGljYXRpb24vZm9udC13b2ZmXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJ3b2ZmXCJdfSxcImFwcGxpY2F0aW9uL2ZyYW1ld29yay1hdHRyaWJ1dGVzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2dlbytqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcImdlb2pzb25cIl19LFwiYXBwbGljYXRpb24vZ2VvK2pzb24tc2VxXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vZ2VveGFjbWwreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vZ21sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImdtbFwiXX0sXCJhcHBsaWNhdGlvbi9ncHgreG1sXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJncHhcIl19LFwiYXBwbGljYXRpb24vZ3hmXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJneGZcIl19LFwiYXBwbGljYXRpb24vZ3ppcFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wiZ3pcIl19LFwiYXBwbGljYXRpb24vaDIyNFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2hlbGQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vaGpzb25cIjp7XCJleHRlbnNpb25zXCI6W1wiaGpzb25cIl19LFwiYXBwbGljYXRpb24vaHR0cFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2h5cGVyc3R1ZGlvXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wic3RrXCJdfSxcImFwcGxpY2F0aW9uL2liZS1rZXktcmVxdWVzdCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9pYmUtcGtnLXJlcGx5K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2liZS1wcC1kYXRhXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vaWdlc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2ltLWlzY29tcG9zaW5nK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2luZGV4XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vaW5kZXguY21kXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vaW5kZXgub2JqXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vaW5kZXgucmVzcG9uc2VcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9pbmRleC52bmRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9pbmttbCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJpbmtcIixcImlua21sXCJdfSxcImFwcGxpY2F0aW9uL2lvdHBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9pcGZpeFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImlwZml4XCJdfSxcImFwcGxpY2F0aW9uL2lwcFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2lzdXBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9pdHMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vamF2YS1hcmNoaXZlXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcImphclwiLFwid2FyXCIsXCJlYXJcIl19LFwiYXBwbGljYXRpb24vamF2YS1zZXJpYWxpemVkLW9iamVjdFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJzZXJcIl19LFwiYXBwbGljYXRpb24vamF2YS12bVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJjbGFzc1wiXX0sXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjaGFyc2V0XCI6XCJVVEYtOFwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJqc1wiLFwibWpzXCJdfSxcImFwcGxpY2F0aW9uL2pmMmZlZWQranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9qb3NlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vam9zZStqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL2pyZCtqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNoYXJzZXRcIjpcIlVURi04XCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcImpzb25cIixcIm1hcFwiXX0sXCJhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vanNvbi1zZXFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9qc29uNVwiOntcImV4dGVuc2lvbnNcIjpbXCJqc29uNVwiXX0sXCJhcHBsaWNhdGlvbi9qc29ubWwranNvblwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcImpzb25tbFwiXX0sXCJhcHBsaWNhdGlvbi9qd2sranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9qd2stc2V0K2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vand0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24va3BtbC1yZXF1ZXN0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2twbWwtcmVzcG9uc2UreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbGQranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJqc29ubGRcIl19LFwiYXBwbGljYXRpb24vbGdyK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2xpbmstZm9ybWF0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbG9hZC1jb250cm9sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL2xvc3QreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibG9zdHhtbFwiXX0sXCJhcHBsaWNhdGlvbi9sb3N0c3luYyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9seGZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9tYWMtYmluaGV4NDBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJocXhcIl19LFwiYXBwbGljYXRpb24vbWFjLWNvbXBhY3Rwcm9cIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImNwdFwiXX0sXCJhcHBsaWNhdGlvbi9tYWN3cml0ZWlpXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbWFkcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJtYWRzXCJdfSxcImFwcGxpY2F0aW9uL21hbmlmZXN0K2pzb25cIjp7XCJjaGFyc2V0XCI6XCJVVEYtOFwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJ3ZWJtYW5pZmVzdFwiXX0sXCJhcHBsaWNhdGlvbi9tYXJjXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibXJjXCJdfSxcImFwcGxpY2F0aW9uL21hcmN4bWwreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibXJjeFwiXX0sXCJhcHBsaWNhdGlvbi9tYXRoZW1hdGljYVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm1hXCIsXCJuYlwiLFwibWJcIl19LFwiYXBwbGljYXRpb24vbWF0aG1sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm1hdGhtbFwiXX0sXCJhcHBsaWNhdGlvbi9tYXRobWwtY29udGVudCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9tYXRobWwtcHJlc2VudGF0aW9uK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL21ibXMtYXNzb2NpYXRlZC1wcm9jZWR1cmUtZGVzY3JpcHRpb24reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbWJtcy1kZXJlZ2lzdGVyK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL21ibXMtZW52ZWxvcGUreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbWJtcy1tc2sreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbWJtcy1tc2stcmVzcG9uc2UreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbWJtcy1wcm90ZWN0aW9uLWRlc2NyaXB0aW9uK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL21ibXMtcmVjZXB0aW9uLXJlcG9ydCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9tYm1zLXJlZ2lzdGVyK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL21ibXMtcmVnaXN0ZXItcmVzcG9uc2UreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbWJtcy1zY2hlZHVsZSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9tYm1zLXVzZXItc2VydmljZS1kZXNjcmlwdGlvbit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9tYm94XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibWJveFwiXX0sXCJhcHBsaWNhdGlvbi9tZWRpYS1wb2xpY3ktZGF0YXNldCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9tZWRpYV9jb250cm9sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL21lZGlhc2VydmVyY29udHJvbCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJtc2NtbFwiXX0sXCJhcHBsaWNhdGlvbi9tZXJnZS1wYXRjaCtqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL21ldGFsaW5rK3htbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wibWV0YWxpbmtcIl19LFwiYXBwbGljYXRpb24vbWV0YWxpbms0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm1ldGE0XCJdfSxcImFwcGxpY2F0aW9uL21ldHMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibWV0c1wiXX0sXCJhcHBsaWNhdGlvbi9tZjRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9taWtleVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL21tdC11c2QreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbW9kcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJtb2RzXCJdfSxcImFwcGxpY2F0aW9uL21vc3Mta2V5c1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL21vc3Mtc2lnbmF0dXJlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbW9zc2tleS1kYXRhXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbW9zc2tleS1yZXF1ZXN0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbXAyMVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm0yMVwiLFwibXAyMVwiXX0sXCJhcHBsaWNhdGlvbi9tcDRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJtcDRzXCIsXCJtNHBcIl19LFwiYXBwbGljYXRpb24vbXBlZzQtZ2VuZXJpY1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL21wZWc0LWlvZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL21wZWc0LWlvZC14bXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9tcmItY29uc3VtZXIreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbXJiLXB1Ymxpc2greG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbXNjLWl2cit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9tc2MtbWl4ZXIreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbXN3b3JkXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJkb2NcIixcImRvdFwiXX0sXCJhcHBsaWNhdGlvbi9tdWQranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9teGZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJteGZcIl19LFwiYXBwbGljYXRpb24vbi1xdWFkc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL24tdHJpcGxlc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL25hc2RhdGFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9uZXdzLWNoZWNrZ3JvdXBzXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vbmV3cy1ncm91cGluZm9cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9uZXdzLXRyYW5zbWlzc2lvblwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL25sc21sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL25vZGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9uc3NcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9vY3NwLXJlcXVlc3RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9vY3NwLXJlc3BvbnNlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJiaW5cIixcImRtc1wiLFwibHJmXCIsXCJtYXJcIixcInNvXCIsXCJkaXN0XCIsXCJkaXN0elwiLFwicGtnXCIsXCJicGtcIixcImR1bXBcIixcImVsY1wiLFwiZGVwbG95XCIsXCJleGVcIixcImRsbFwiLFwiZGViXCIsXCJkbWdcIixcImlzb1wiLFwiaW1nXCIsXCJtc2lcIixcIm1zcFwiLFwibXNtXCIsXCJidWZmZXJcIl19LFwiYXBwbGljYXRpb24vb2RhXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wib2RhXCJdfSxcImFwcGxpY2F0aW9uL29keFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL29lYnBzLXBhY2thZ2UreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wib3BmXCJdfSxcImFwcGxpY2F0aW9uL29nZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wib2d4XCJdfSxcImFwcGxpY2F0aW9uL29tZG9jK3htbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wib21kb2NcIl19LFwiYXBwbGljYXRpb24vb25lbm90ZVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wib25ldG9jXCIsXCJvbmV0b2MyXCIsXCJvbmV0bXBcIixcIm9uZXBrZ1wiXX0sXCJhcHBsaWNhdGlvbi9veHBzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wib3hwc1wiXX0sXCJhcHBsaWNhdGlvbi9wMnAtb3ZlcmxheSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9wYXJpdHlmZWNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9wYXNzcG9ydFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3BhdGNoLW9wcy1lcnJvcit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ4ZXJcIl19LFwiYXBwbGljYXRpb24vcGRmXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJwZGZcIl19LFwiYXBwbGljYXRpb24vcGR4XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vcGdwLWVuY3J5cHRlZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wicGdwXCJdfSxcImFwcGxpY2F0aW9uL3BncC1rZXlzXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImFzY1wiLFwic2lnXCJdfSxcImFwcGxpY2F0aW9uL3BpY3MtcnVsZXNcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInByZlwiXX0sXCJhcHBsaWNhdGlvbi9waWRmK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3BpZGYtZGlmZit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9wa2NzMTBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJwMTBcIl19LFwiYXBwbGljYXRpb24vcGtjczEyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vcGtjczctbWltZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInA3bVwiLFwicDdjXCJdfSxcImFwcGxpY2F0aW9uL3BrY3M3LXNpZ25hdHVyZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInA3c1wiXX0sXCJhcHBsaWNhdGlvbi9wa2NzOFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInA4XCJdfSxcImFwcGxpY2F0aW9uL3BrY3M4LWVuY3J5cHRlZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3BraXgtYXR0ci1jZXJ0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiYWNcIl19LFwiYXBwbGljYXRpb24vcGtpeC1jZXJ0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiY2VyXCJdfSxcImFwcGxpY2F0aW9uL3BraXgtY3JsXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiY3JsXCJdfSxcImFwcGxpY2F0aW9uL3BraXgtcGtpcGF0aFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInBraXBhdGhcIl19LFwiYXBwbGljYXRpb24vcGtpeGNtcFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInBraVwiXX0sXCJhcHBsaWNhdGlvbi9wbHMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicGxzXCJdfSxcImFwcGxpY2F0aW9uL3BvYy1zZXR0aW5ncyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9wb3N0c2NyaXB0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcImFpXCIsXCJlcHNcIixcInBzXCJdfSxcImFwcGxpY2F0aW9uL3Bwc3AtdHJhY2tlcitqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3Byb2JsZW0ranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9wcm9ibGVtK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3Byb3ZlbmFuY2UreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vcHJzLmFsdmVzdHJhbmQudGl0cmF4LXNoZWV0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vcHJzLmN3d1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImN3d1wiXX0sXCJhcHBsaWNhdGlvbi9wcnMuaHB1Yit6aXBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9wcnMubnByZW5kXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vcHJzLnBsdWNrZXJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9wcnMucmRmLXhtbC1jcnlwdFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3Bycy54c2YreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vcHNrYyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJwc2tjeG1sXCJdfSxcImFwcGxpY2F0aW9uL3FzaWdcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9yYW1sK3lhbWxcIjp7XCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcInJhbWxcIl19LFwiYXBwbGljYXRpb24vcmFwdG9yZmVjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vcmRhcCtqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3JkZit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wicmRmXCJdfSxcImFwcGxpY2F0aW9uL3JlZ2luZm8reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicmlmXCJdfSxcImFwcGxpY2F0aW9uL3JlbGF4LW5nLWNvbXBhY3Qtc3ludGF4XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicm5jXCJdfSxcImFwcGxpY2F0aW9uL3JlbW90ZS1wcmludGluZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3JlcHV0b24ranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9yZXNvdXJjZS1saXN0cyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJybFwiXX0sXCJhcHBsaWNhdGlvbi9yZXNvdXJjZS1saXN0cy1kaWZmK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInJsZFwiXX0sXCJhcHBsaWNhdGlvbi9yZmMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vcmlzY29zXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vcmxtaSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9ybHMtc2VydmljZXMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicnNcIl19LFwiYXBwbGljYXRpb24vcm91dGUtYXBkK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3JvdXRlLXMtdHNpZCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9yb3V0ZS11c2QreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vcnBraS1naG9zdGJ1c3RlcnNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJnYnJcIl19LFwiYXBwbGljYXRpb24vcnBraS1tYW5pZmVzdFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm1mdFwiXX0sXCJhcHBsaWNhdGlvbi9ycGtpLXB1YmxpY2F0aW9uXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vcnBraS1yb2FcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJyb2FcIl19LFwiYXBwbGljYXRpb24vcnBraS11cGRvd25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9yc2QreG1sXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJyc2RcIl19LFwiYXBwbGljYXRpb24vcnNzK3htbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcInJzc1wiXX0sXCJhcHBsaWNhdGlvbi9ydGZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wicnRmXCJdfSxcImFwcGxpY2F0aW9uL3J0cGxvb3BiYWNrXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vcnR4XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vc2FtbGFzc2VydGlvbit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9zYW1sbWV0YWRhdGEreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vc2JtbCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzYm1sXCJdfSxcImFwcGxpY2F0aW9uL3NjYWlwK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3NjaW0ranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi9zY3ZwLWN2LXJlcXVlc3RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzY3FcIl19LFwiYXBwbGljYXRpb24vc2N2cC1jdi1yZXNwb25zZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNjc1wiXX0sXCJhcHBsaWNhdGlvbi9zY3ZwLXZwLXJlcXVlc3RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzcHFcIl19LFwiYXBwbGljYXRpb24vc2N2cC12cC1yZXNwb25zZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNwcFwiXX0sXCJhcHBsaWNhdGlvbi9zZHBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzZHBcIl19LFwiYXBwbGljYXRpb24vc2VwK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3NlcC1leGlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9zZXNzaW9uLWluZm9cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9zZXQtcGF5bWVudFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3NldC1wYXltZW50LWluaXRpYXRpb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzZXRwYXlcIl19LFwiYXBwbGljYXRpb24vc2V0LXJlZ2lzdHJhdGlvblwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3NldC1yZWdpc3RyYXRpb24taW5pdGlhdGlvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNldHJlZ1wiXX0sXCJhcHBsaWNhdGlvbi9zZ21sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vc2dtbC1vcGVuLWNhdGFsb2dcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9zaGYreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wic2hmXCJdfSxcImFwcGxpY2F0aW9uL3NpZXZlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vc2ltcGxlLWZpbHRlcit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9zaW1wbGUtbWVzc2FnZS1zdW1tYXJ5XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vc2ltcGxlc3ltYm9sY29udGFpbmVyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vc2xhdGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi9zbWlsXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vc21pbCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzbWlcIixcInNtaWxcIl19LFwiYXBwbGljYXRpb24vc21wdGUzMzZtXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vc29hcCtmYXN0aW5mb3NldFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3NvYXAreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3NwYXJxbC1xdWVyeVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInJxXCJdfSxcImFwcGxpY2F0aW9uL3NwYXJxbC1yZXN1bHRzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNyeFwiXX0sXCJhcHBsaWNhdGlvbi9zcGlyaXRzLWV2ZW50K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3NxbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3NyZ3NcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJncmFtXCJdfSxcImFwcGxpY2F0aW9uL3NyZ3MreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZ3J4bWxcIl19LFwiYXBwbGljYXRpb24vc3J1K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNydVwiXX0sXCJhcHBsaWNhdGlvbi9zc2RsK3htbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic3NkbFwiXX0sXCJhcHBsaWNhdGlvbi9zc21sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNzbWxcIl19LFwiYXBwbGljYXRpb24vdGFtcC1hcGV4LXVwZGF0ZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3RhbXAtYXBleC11cGRhdGUtY29uZmlybVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3RhbXAtY29tbXVuaXR5LXVwZGF0ZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3RhbXAtY29tbXVuaXR5LXVwZGF0ZS1jb25maXJtXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdGFtcC1lcnJvclwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3RhbXAtc2VxdWVuY2UtYWRqdXN0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdGFtcC1zZXF1ZW5jZS1hZGp1c3QtY29uZmlybVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3RhbXAtc3RhdHVzLXF1ZXJ5XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdGFtcC1zdGF0dXMtcmVzcG9uc2VcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi90YW1wLXVwZGF0ZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3RhbXAtdXBkYXRlLWNvbmZpcm1cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi90YXJcIjp7XCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3RlaSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ0ZWlcIixcInRlaWNvcnB1c1wiXX0sXCJhcHBsaWNhdGlvbi90aHJhdWQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widGZpXCJdfSxcImFwcGxpY2F0aW9uL3RpbWVzdGFtcC1xdWVyeVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3RpbWVzdGFtcC1yZXBseVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3RpbWVzdGFtcGVkLWRhdGFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ0c2RcIl19LFwiYXBwbGljYXRpb24vdG5hdXRobGlzdFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3RyaWdcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi90dG1sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3R2ZS10cmlnZ2VyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdWxwZmVjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdXJjLWdycHNoZWV0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3VyYy1yZXNzaGVldCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi91cmMtdGFyZ2V0ZGVzYyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi91cmMtdWlzb2NrZXRkZXNjK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZjYXJkK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vdmNhcmQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdmVtbWlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92aXZpZGVuY2Uuc2NyaXB0ZmlsZVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCJ9LFwiYXBwbGljYXRpb24vdm5kLjEwMDBtaW5kcy5kZWNpc2lvbi1tb2RlbCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuM2dwcC1wcm9zZSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuM2dwcC1wcm9zZS1wYzNjaCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuM2dwcC12MngtbG9jYWwtc2VydmljZS1pbmZvcm1hdGlvblwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLmFjY2Vzcy10cmFuc2Zlci1ldmVudHMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLjNncHAuYnNmK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLmdtb3AreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLjNncHAubWNwdHQtYWZmaWxpYXRpb24tY29tbWFuZCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuM2dwcC5tY3B0dC1mbG9vci1yZXF1ZXN0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLm1jcHR0LWluZm8reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLjNncHAubWNwdHQtbG9jYXRpb24taW5mbyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuM2dwcC5tY3B0dC1tYm1zLXVzYWdlLWluZm8reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLjNncHAubWNwdHQtc2lnbmVkK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLm1pZC1jYWxsK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy1sYXJnZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInBsYlwiXX0sXCJhcHBsaWNhdGlvbi92bmQuM2dwcC5waWMtYnctc21hbGxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJwc2JcIl19LFwiYXBwbGljYXRpb24vdm5kLjNncHAucGljLWJ3LXZhclwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInB2YlwiXX0sXCJhcHBsaWNhdGlvbi92bmQuM2dwcC5zbXNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuM2dwcC5zbXMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLjNncHAuc3J2Y2MtZXh0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnNydmNjLWluZm8reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLjNncHAuc3RhdGUtYW5kLWV2ZW50LWluZm8reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLjNncHAudXNzZCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuM2dwcDIuYmNtY3NpbmZvK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwMi5zbXNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuM2dwcDIudGNhcFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInRjYXBcIl19LFwiYXBwbGljYXRpb24vdm5kLjNsaWdodHNzb2Z0d2FyZS5pbWFnZXNjYWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuM20ucG9zdC1pdC1ub3Rlc1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInB3blwiXX0sXCJhcHBsaWNhdGlvbi92bmQuYWNjcGFjLnNpbXBseS5hc29cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJhc29cIl19LFwiYXBwbGljYXRpb24vdm5kLmFjY3BhYy5zaW1wbHkuaW1wXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiaW1wXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5hY3Vjb2JvbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImFjdVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuYWN1Y29ycFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImF0Y1wiLFwiYWN1dGNcIl19LFwiYXBwbGljYXRpb24vdm5kLmFkb2JlLmFpci1hcHBsaWNhdGlvbi1pbnN0YWxsZXItcGFja2FnZSt6aXBcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImFpclwiXX0sXCJhcHBsaWNhdGlvbi92bmQuYWRvYmUuZmxhc2gubW92aWVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuYWRvYmUuZm9ybXNjZW50cmFsLmZjZHRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJmY2R0XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5meHBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJmeHBcIixcImZ4cGxcIl19LFwiYXBwbGljYXRpb24vdm5kLmFkb2JlLnBhcnRpYWwtdXBsb2FkXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmFkb2JlLnhkcCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ4ZHBcIl19LFwiYXBwbGljYXRpb24vdm5kLmFkb2JlLnhmZGZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ4ZmRmXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5hZXRoZXIuaW1wXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmFoLWJhcmNvZGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuYWhlYWQuc3BhY2VcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJhaGVhZFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuYWlyemlwLmZpbGVzZWN1cmUuYXpmXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiYXpmXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5haXJ6aXAuZmlsZXNlY3VyZS5henNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJhenNcIl19LFwiYXBwbGljYXRpb24vdm5kLmFtYWRldXMranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQuYW1hem9uLmVib29rXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJhendcIl19LFwiYXBwbGljYXRpb24vdm5kLmFtYXpvbi5tb2JpOC1lYm9va1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5hbWVyaWNhbmR5bmFtaWNzLmFjY1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImFjY1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuYW1pZ2EuYW1pXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiYW1pXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5hbXVuZHNlbi5tYXplK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5hbmRyb2lkLnBhY2thZ2UtYXJjaGl2ZVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJhcGtcIl19LFwiYXBwbGljYXRpb24vdm5kLmFua2lcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuYW5zZXItd2ViLWNlcnRpZmljYXRlLWlzc3VlLWluaXRpYXRpb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJjaWlcIl19LFwiYXBwbGljYXRpb24vdm5kLmFuc2VyLXdlYi1mdW5kcy10cmFuc2Zlci1pbml0aWF0aW9uXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJmdGlcIl19LFwiYXBwbGljYXRpb24vdm5kLmFudGl4LmdhbWUtY29tcG9uZW50XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiYXR4XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5hcGFjaGUudGhyaWZ0LmJpbmFyeVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5hcGFjaGUudGhyaWZ0LmNvbXBhY3RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuYXBhY2hlLnRocmlmdC5qc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmFwaStqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3ZuZC5hcG90aGVrZW5kZS5yZXNlcnZhdGlvbitqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5pbnN0YWxsZXIreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibXBrZ1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuYXBwbGUubXBlZ3VybFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm0zdThcIl19LFwiYXBwbGljYXRpb24vdm5kLmFwcGxlLnBrcGFzc1wiOntcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcInBrcGFzc1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuYXJhc3RyYS5zd2lcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuYXJpc3RhbmV0d29ya3Muc3dpXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wic3dpXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5hcnRzcXVhcmVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuYXN0cmFlYS1zb2Z0d2FyZS5pb3RhXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiaW90YVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuYXVkaW9ncmFwaFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImFlcFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuYXV0b3BhY2thZ2VcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuYXZhbG9uK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vdm5kLmF2aXN0YXIreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmJhbHNhbWlxLmJtbWwreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmJhbHNhbWlxLmJtcHJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuYmJmLnVzcC5tc2dcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuYmJmLnVzcC5tc2cranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQuYmVraXR6dXItc3RlY2granNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQuYmludC5tZWQtY29udGVudFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5iaW9wYXgucmRmK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ibGluay1pZGItdmFsdWUtd3JhcHBlclwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ibHVlaWNlLm11bHRpcGFzc1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm1wbVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuYmx1ZXRvb3RoLmVwLm9vYlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ibHVldG9vdGgubGUub29iXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmJtaVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImJtaVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuYnVzaW5lc3NvYmplY3RzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicmVwXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5jYWItanNjcmlwdFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5jYW5vbi1jcGRsXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmNhbm9uLWxpcHNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuY2FwYXN5c3RlbXMtcGcranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQuY2VuZGlvLnRoaW5saW5jLmNsaWVudGNvbmZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuY2VudHVyeS1zeXN0ZW1zLnRjcF9zdHJlYW1cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuY2hlbWRyYXcreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiY2R4bWxcIl19LFwiYXBwbGljYXRpb24vdm5kLmNoZXNzLXBnblwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5jaGlwbnV0cy5rYXJhb2tlLW1tZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm1tZFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuY2luZGVyZWxsYVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImNkeVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuY2lycGFjay5pc2RuLWV4dFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5jaXRhdGlvbnN0eWxlcy5zdHlsZSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuY2xheW1vcmVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJjbGFcIl19LFwiYXBwbGljYXRpb24vdm5kLmNsb2FudG8ucnA5XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicnA5XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5jbG9uay5jNGdyb3VwXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiYzRnXCIsXCJjNGRcIixcImM0ZlwiLFwiYzRwXCIsXCJjNHVcIl19LFwiYXBwbGljYXRpb24vdm5kLmNsdWV0cnVzdC5jYXJ0b21vYmlsZS1jb25maWdcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJjMTFhbWNcIl19LFwiYXBwbGljYXRpb24vdm5kLmNsdWV0cnVzdC5jYXJ0b21vYmlsZS1jb25maWctcGtnXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiYzExYW16XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5jb2ZmZWVzY3JpcHRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuY29sbGFiaW8ueG9kb2N1bWVudHMuZG9jdW1lbnRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuY29sbGFiaW8ueG9kb2N1bWVudHMuZG9jdW1lbnQtdGVtcGxhdGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuY29sbGFiaW8ueG9kb2N1bWVudHMucHJlc2VudGF0aW9uXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmNvbGxhYmlvLnhvZG9jdW1lbnRzLnByZXNlbnRhdGlvbi10ZW1wbGF0ZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5jb2xsYWJpby54b2RvY3VtZW50cy5zcHJlYWRzaGVldFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5jb2xsYWJpby54b2RvY3VtZW50cy5zcHJlYWRzaGVldC10ZW1wbGF0ZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5jb2xsZWN0aW9uK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vdm5kLmNvbGxlY3Rpb24uZG9jK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vdm5kLmNvbGxlY3Rpb24ubmV4dCtqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3ZuZC5jb21pY2Jvb2sremlwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmNvbWljYm9vay1yYXJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuY29tbWVyY2UtYmF0dGVsbGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuY29tbW9uc3BhY2VcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJjc3BcIl19LFwiYXBwbGljYXRpb24vdm5kLmNvbnRhY3QuY21zZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImNkYmNtc2dcIl19LFwiYXBwbGljYXRpb24vdm5kLmNvcmVvcy5pZ25pdGlvbitqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3ZuZC5jb3Ntb2NhbGxlclwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImNtY1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlclwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImNsa3hcIl19LFwiYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIua2V5Ym9hcmRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJjbGtrXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLnBhbGV0dGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJjbGtwXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLnRlbXBsYXRlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiY2xrdFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuY3JpY2suY2xpY2tlci53b3JkYmFua1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImNsa3dcIl19LFwiYXBwbGljYXRpb24vdm5kLmNyaXRpY2FsdG9vbHMud2JzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIndic1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuY3RjLXBvc21sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicG1sXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5jdGN0LndzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5jdXBzLXBkZlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5jdXBzLXBvc3RzY3JpcHRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuY3Vwcy1wcGRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJwcGRcIl19LFwiYXBwbGljYXRpb24vdm5kLmN1cHMtcmFzdGVyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmN1cHMtcmF3XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmN1cmxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuY3VybC5jYXJcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImNhclwiXX0sXCJhcHBsaWNhdGlvbi92bmQuY3VybC5wY3VybFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wicGN1cmxcIl19LFwiYXBwbGljYXRpb24vdm5kLmN5YW4uZGVhbi5yb290K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5jeWJhbmtcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZDJsLmNvdXJzZXBhY2thZ2UxcDAremlwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmRhcnRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wiZGFydFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZGF0YS12aXNpb24ucmR6XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicmR6XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5kYXRhcGFja2FnZStqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3ZuZC5kYXRhcmVzb3VyY2UranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQuZGViaWFuLmJpbmFyeS1wYWNrYWdlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmRlY2UuZGF0YVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInV2ZlwiLFwidXZ2ZlwiLFwidXZkXCIsXCJ1dnZkXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5kZWNlLnR0bWwreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widXZ0XCIsXCJ1dnZ0XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5kZWNlLnVuc3BlY2lmaWVkXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widXZ4XCIsXCJ1dnZ4XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5kZWNlLnppcFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInV2elwiLFwidXZ2elwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZGVub3ZvLmZjc2VsYXlvdXQtbGlua1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImZlX2xhdW5jaFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZGVzbXVtZS1tb3ZpZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5kZXNtdW1lLm1vdmllXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIn0sXCJhcHBsaWNhdGlvbi92bmQuZGlyLWJpLnBsYXRlLWRsLW5vc3VmZml4XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmRtLmRlbGVnYXRpb24reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmRuYVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImRuYVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZG9jdW1lbnQranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQuZG9sYnkubWxwXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJtbHBcIl19LFwiYXBwbGljYXRpb24vdm5kLmRvbGJ5Lm1vYmlsZS4xXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmRvbGJ5Lm1vYmlsZS4yXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmRvcmVtaXIuc2NvcmVjbG91ZC1iaW5hcnktZG9jdW1lbnRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZHBncmFwaFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImRwZ1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuZHJlYW1mYWN0b3J5XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZGZhY1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuZHJpdmUranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQuZHMta2V5cG9pbnRcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImtweHhcIl19LFwiYXBwbGljYXRpb24vdm5kLmR0Zy5sb2NhbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5kdGcubG9jYWwuZmxhc2hcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZHRnLmxvY2FsLmh0bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZHZiLmFpdFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImFpdFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZHZiLmR2YmpcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZHZiLmVzZ2NvbnRhaW5lclwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXBkY2RmdG5vdGlmYWNjZXNzXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmR2Yi5pcGRjZXNnYWNjZXNzXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmR2Yi5pcGRjZXNnYWNjZXNzMlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXBkY2VzZ3BkZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXBkY3JvYW1pbmdcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZHZiLmlwdHYuYWxmZWMtYmFzZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5kdmIuaXB0di5hbGZlYy1lbmhhbmNlbWVudFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtYWdncmVnYXRlLXJvb3QreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1jb250YWluZXIreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmR2Yi5ub3RpZi1nZW5lcmljK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaWEtbXNnbGlzdCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZHZiLm5vdGlmLWlhLXJlZ2lzdHJhdGlvbi1yZXF1ZXN0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaWEtcmVnaXN0cmF0aW9uLXJlc3BvbnNlK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5kdmIubm90aWYtaW5pdCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZHZiLnBmclwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5kdmIuc2VydmljZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInN2Y1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuZHhyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmR5bmFnZW9cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJnZW9cIl19LFwiYXBwbGljYXRpb24vdm5kLmR6clwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5lYXN5a2FyYW9rZS5jZGdkb3dubG9hZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5lY2Rpcy11cGRhdGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZWNpcC5ybHBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZWNvd2luLmNoYXJ0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibWFnXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5lY293aW4uZmlsZXJlcXVlc3RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZWNvd2luLmZpbGV1cGRhdGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5lY293aW4uc2VyaWVzcmVxdWVzdFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5lY293aW4uc2VyaWVzdXBkYXRlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmVmaS5pbWdcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZWZpLmlzb1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5lbWNsaWVudC5hY2Nlc3NyZXF1ZXN0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5lbmxpdmVuXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibm1sXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5lbnBoYXNlLmVudm95XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmVwcmludHMuZGF0YSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZXBzb24uZXNmXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZXNmXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5tc2ZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJtc2ZcIl19LFwiYXBwbGljYXRpb24vdm5kLmVwc29uLnF1aWNrYW5pbWVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJxYW1cIl19LFwiYXBwbGljYXRpb24vdm5kLmVwc29uLnNhbHRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzbHRcIl19LFwiYXBwbGljYXRpb24vdm5kLmVwc29uLnNzZlwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNzZlwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZXJpY3Nzb24ucXVpY2tjYWxsXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmVzcGFzcy1lc3Bhc3MremlwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmVzemlnbm8zK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImVzM1wiLFwiZXQzXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmFvYyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZXRzaS5hc2ljLWUremlwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmV0c2kuYXNpYy1zK3ppcFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmN1Zyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2Y29tbWFuZCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZXRzaS5pcHR2ZGlzY292ZXJ5K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZwcm9maWxlK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZzYWQtYmMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dnNhZC1jb2QreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmV0c2kuaXB0dnNhZC1ucHZyK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZzZXJ2aWNlK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZzeW5jK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLmlwdHZ1ZXByb2ZpbGUreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmV0c2kubWNpZCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZXRzaS5taGVnNVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLm92ZXJsb2FkLWNvbnRyb2wtcG9saWN5LWRhdGFzZXQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmV0c2kucHN0bit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZXRzaS5zY2kreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmV0c2kuc2ltc2VydnMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmV0c2kudGltZXN0YW1wLXRva2VuXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmV0c2kudHNsK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ldHNpLnRzbC5kZXJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZXVkb3JhLmRhdGFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZXZvbHYuZWNpZy5wcm9maWxlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmV2b2x2LmVjaWcuc2V0dGluZ3NcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZXZvbHYuZWNpZy50aGVtZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5lenBpeC1hbGJ1bVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImV6MlwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZXpwaXgtcGFja2FnZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImV6M1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuZi1zZWN1cmUubW9iaWxlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmZhc3Rjb3B5LWRpc2staW1hZ2VcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZmRmXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZmRmXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5mZHNuLm1zZWVkXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibXNlZWRcIl19LFwiYXBwbGljYXRpb24vdm5kLmZkc24uc2VlZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNlZWRcIixcImRhdGFsZXNzXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5mZnNuc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5maWxtaXQuemZjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmZpbnRzXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmZpcmVtb25rZXlzLmNsb3VkY2VsbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5mbG9ncmFwaGl0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZ3BoXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5mbHV4dGltZS5jbGlwXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZnRjXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5mb250LWZvbnRmb3JnZS1zZmRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZnJhbWVtYWtlclwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImZtXCIsXCJmcmFtZVwiLFwibWFrZXJcIixcImJvb2tcIl19LFwiYXBwbGljYXRpb24vdm5kLmZyb2dhbnMuZm5jXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZm5jXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5mcm9nYW5zLmx0ZlwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImx0ZlwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZnNjLndlYmxhdW5jaFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImZzY1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5c1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm9hc1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5czJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJvYTJcIl19LFwiYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXMzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wib2EzXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzZ3BcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJmZzVcIl19LFwiYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXNwcnNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJiaDJcIl19LFwiYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5hcnQtZXhcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmFydDRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRkZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImRkZFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRvY3V3b3Jrc1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInhkd1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRvY3V3b3Jrcy5iaW5kZXJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ4YmRcIl19LFwiYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3MuY29udGFpbmVyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5oYnBsXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmZ1dC1taXNuZXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZnV6enlzaGVldFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImZ6c1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuZ2Vub21hdGl4LnR1eGVkb1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInR4ZFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZ2VvK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vdm5kLmdlb2N1YmUreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmdlb2dlYnJhLmZpbGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJnZ2JcIl19LFwiYXBwbGljYXRpb24vdm5kLmdlb2dlYnJhLnRvb2xcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJnZ3RcIl19LFwiYXBwbGljYXRpb24vdm5kLmdlb21ldHJ5LWV4cGxvcmVyXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZ2V4XCIsXCJncmVcIl19LFwiYXBwbGljYXRpb24vdm5kLmdlb25leHRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJneHRcIl19LFwiYXBwbGljYXRpb24vdm5kLmdlb3BsYW5cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJnMndcIl19LFwiYXBwbGljYXRpb24vdm5kLmdlb3NwYWNlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZzN3XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5nZXJiZXJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuZ2xvYmFscGxhdGZvcm0uY2FyZC1jb250ZW50LW1ndFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5nbG9iYWxwbGF0Zm9ybS5jYXJkLWNvbnRlbnQtbWd0LXJlc3BvbnNlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmdteFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImdteFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZ29vZ2xlLWFwcHMuZG9jdW1lbnRcIjp7XCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJnZG9jXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtYXBwcy5wcmVzZW50YXRpb25cIjp7XCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJnc2xpZGVzXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtYXBwcy5zcHJlYWRzaGVldFwiOntcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcImdzaGVldFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZ29vZ2xlLWVhcnRoLmttbCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wia21sXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5nb29nbGUtZWFydGgua216XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJrbXpcIl19LFwiYXBwbGljYXRpb24vdm5kLmdvdi5zay5lLWZvcm0reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmdvdi5zay5lLWZvcm0remlwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmdvdi5zay54bWxkYXRhY29udGFpbmVyK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ncmFmZXFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJncWZcIixcImdxc1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuZ3JpZG1wXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmdyb292ZS1hY2NvdW50XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZ2FjXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtaGVscFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImdoZlwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLWlkZW50aXR5LW1lc3NhZ2VcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJnaW1cIl19LFwiYXBwbGljYXRpb24vdm5kLmdyb292ZS1pbmplY3RvclwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImdydlwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXRvb2wtbWVzc2FnZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImd0bVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXRvb2wtdGVtcGxhdGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ0cGxcIl19LFwiYXBwbGljYXRpb24vdm5kLmdyb292ZS12Y2FyZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInZjZ1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuaGFsK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vdm5kLmhhbCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJoYWxcIl19LFwiYXBwbGljYXRpb24vdm5kLmhhbmRoZWxkLWVudGVydGFpbm1lbnQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiem1tXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5oYmNpXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiaGJjaVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuaGMranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQuaGNsLWJpcmVwb3J0c1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5oZHRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuaGVyb2t1K2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vdm5kLmhoZS5sZXNzb24tcGxheWVyXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibGVzXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5ocC1ocGdsXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiaHBnbFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuaHAtaHBpZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImhwaWRcIl19LFwiYXBwbGljYXRpb24vdm5kLmhwLWhwc1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImhwc1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuaHAtamx5dFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImpsdFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuaHAtcGNsXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicGNsXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5ocC1wY2x4bFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInBjbHhsXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5odHRwaG9uZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5oeWRyb3N0YXRpeC5zb2YtZGF0YVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNmZC1oZHN0eFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuaHlwZXItaXRlbStqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3ZuZC5oeXBlcmRyaXZlK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vdm5kLmh6bi0zZC1jcm9zc3dvcmRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuaWJtLmFmcGxpbmVkYXRhXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmlibS5lbGVjdHJvbmljLW1lZGlhXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmlibS5taW5pcGF5XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibXB5XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5pYm0ubW9kY2FwXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiYWZwXCIsXCJsaXN0YWZwXCIsXCJsaXN0MzgyMFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuaWJtLnJpZ2h0cy1tYW5hZ2VtZW50XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiaXJtXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5pYm0uc2VjdXJlLWNvbnRhaW5lclwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNjXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5pY2Nwcm9maWxlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiaWNjXCIsXCJpY21cIl19LFwiYXBwbGljYXRpb24vdm5kLmllZWUuMTkwNVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5pZ2xvYWRlclwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImlnbFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuaW1hZ2VtZXRlci5mb2xkZXIremlwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmltYWdlbWV0ZXIuaW1hZ2UremlwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmltbWVydmlzaW9uLWl2cFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIml2cFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuaW1tZXJ2aXNpb24taXZ1XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiaXZ1XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5pbXMuaW1zY2N2MXAxXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmltcy5pbXNjY3YxcDJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuaW1zLmltc2NjdjFwM1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5pbXMubGlzLnYyLnJlc3VsdCtqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3ZuZC5pbXMubHRpLnYyLnRvb2xjb25zdW1lcnByb2ZpbGUranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQuaW1zLmx0aS52Mi50b29scHJveHkranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQuaW1zLmx0aS52Mi50b29scHJveHkuaWQranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQuaW1zLmx0aS52Mi50b29sc2V0dGluZ3MranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQuaW1zLmx0aS52Mi50b29sc2V0dGluZ3Muc2ltcGxlK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vdm5kLmluZm9ybWVkY29udHJvbC5ybXMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmluZm9ybWl4LXZpc2lvbmFyeVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5pbmZvdGVjaC5wcm9qZWN0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmluZm90ZWNoLnByb2plY3QreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmlubm9wYXRoLndhbXAubm90aWZpY2F0aW9uXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmluc29ycy5pZ21cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJpZ21cIl19LFwiYXBwbGljYXRpb24vdm5kLmludGVyY29uLmZvcm1uZXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ4cHdcIixcInhweFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuaW50ZXJnZW9cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJpMmdcIl19LFwiYXBwbGljYXRpb24vdm5kLmludGVydHJ1c3QuZGlnaWJveFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5pbnRlcnRydXN0Lm5uY3BcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuaW50dS5xYm9cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJxYm9cIl19LFwiYXBwbGljYXRpb24vdm5kLmludHUucWZ4XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicWZ4XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLmNhdGFsb2dpdGVtK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLmNvbmNlcHRpdGVtK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5pcHRjLmcyLmtub3dsZWRnZWl0ZW0reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmlwdGMuZzIubmV3c2l0ZW0reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmlwdGMuZzIubmV3c21lc3NhZ2UreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmlwdGMuZzIucGFja2FnZWl0ZW0reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmlwdGMuZzIucGxhbm5pbmdpdGVtK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5pcHVucGx1Z2dlZC5yY3Byb2ZpbGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJyY3Byb2ZpbGVcIl19LFwiYXBwbGljYXRpb24vdm5kLmlyZXBvc2l0b3J5LnBhY2thZ2UreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiaXJwXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5pcy14cHJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ4cHJcIl19LFwiYXBwbGljYXRpb24vdm5kLmlzYWMuZmNzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZmNzXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5qYW1cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJqYW1cIl19LFwiYXBwbGljYXRpb24vdm5kLmphcGFubmV0LWRpcmVjdG9yeS1zZXJ2aWNlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmphcGFubmV0LWpwbnN0b3JlLXdha2V1cFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1wYXltZW50LXdha2V1cFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1yZWdpc3RyYXRpb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtcmVnaXN0cmF0aW9uLXdha2V1cFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1zZXRzdG9yZS13YWtldXBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtdmVyaWZpY2F0aW9uXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXZlcmlmaWNhdGlvbi13YWtldXBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuamNwLmphdmFtZS5taWRsZXQtcm1zXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicm1zXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5qaXNwXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiamlzcFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuam9vc3Quam9kYS1hcmNoaXZlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiam9kYVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuanNrLmlzZG4tbmduXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmthaG9vdHpcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJrdHpcIixcImt0clwiXX0sXCJhcHBsaWNhdGlvbi92bmQua2RlLmthcmJvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImthcmJvblwiXX0sXCJhcHBsaWNhdGlvbi92bmQua2RlLmtjaGFydFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImNocnRcIl19LFwiYXBwbGljYXRpb24vdm5kLmtkZS5rZm9ybXVsYVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImtmb1wiXX0sXCJhcHBsaWNhdGlvbi92bmQua2RlLmtpdmlvXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZmx3XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5rZGUua29udG91clwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImtvblwiXX0sXCJhcHBsaWNhdGlvbi92bmQua2RlLmtwcmVzZW50ZXJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJrcHJcIixcImtwdFwiXX0sXCJhcHBsaWNhdGlvbi92bmQua2RlLmtzcHJlYWRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJrc3BcIl19LFwiYXBwbGljYXRpb24vdm5kLmtkZS5rd29yZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImt3ZFwiLFwia3d0XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5rZW5hbWVhYXBwXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiaHRrZVwiXX0sXCJhcHBsaWNhdGlvbi92bmQua2lkc3BpcmF0aW9uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wia2lhXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5raW5hclwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImtuZVwiLFwia25wXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5rb2FuXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wic2twXCIsXCJza2RcIixcInNrdFwiLFwic2ttXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5rb2Rhay1kZXNjcmlwdG9yXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wic3NlXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5sYXMubGFzK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vdm5kLmxhcy5sYXMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibGFzeG1sXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5saWJlcnR5LXJlcXVlc3QreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLmxsYW1hZ3JhcGhpY3MubGlmZS1iYWxhbmNlLmRlc2t0b3BcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJsYmRcIl19LFwiYXBwbGljYXRpb24vdm5kLmxsYW1hZ3JhcGhpY3MubGlmZS1iYWxhbmNlLmV4Y2hhbmdlK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImxiZVwiXX0sXCJhcHBsaWNhdGlvbi92bmQubG90dXMtMS0yLTNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCIxMjNcIl19LFwiYXBwbGljYXRpb24vdm5kLmxvdHVzLWFwcHJvYWNoXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiYXByXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1mcmVlbGFuY2VcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJwcmVcIl19LFwiYXBwbGljYXRpb24vdm5kLmxvdHVzLW5vdGVzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibnNmXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1vcmdhbml6ZXJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJvcmdcIl19LFwiYXBwbGljYXRpb24vdm5kLmxvdHVzLXNjcmVlbmNhbVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNjbVwiXX0sXCJhcHBsaWNhdGlvbi92bmQubG90dXMtd29yZHByb1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImx3cFwiXX0sXCJhcHBsaWNhdGlvbi92bmQubWFjcG9ydHMucG9ydHBrZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInBvcnRwa2dcIl19LFwiYXBwbGljYXRpb24vdm5kLm1hcGJveC12ZWN0b3ItdGlsZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLmFjdGlvbnRva2VuK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLmNvbmZ0b2tlbit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubWFybGluLmRybS5saWNlbnNlK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5tYXJsaW4uZHJtLm1kY2ZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubWFzb24ranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQubWF4bWluZC5tYXhtaW5kLWRiXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm1jZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm1jZFwiXX0sXCJhcHBsaWNhdGlvbi92bmQubWVkY2FsY2RhdGFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJtYzFcIl19LFwiYXBwbGljYXRpb24vdm5kLm1lZGlhc3RhdGlvbi5jZGtleVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImNka2V5XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tZXJpZGlhbi1zbGluZ3Nob3RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubWZlclwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm13ZlwiXX0sXCJhcHBsaWNhdGlvbi92bmQubWZtcFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm1mbVwiXX0sXCJhcHBsaWNhdGlvbi92bmQubWljcm8ranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQubWljcm9ncmFmeC5mbG9cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJmbG9cIl19LFwiYXBwbGljYXRpb24vdm5kLm1pY3JvZ3JhZnguaWd4XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiaWd4XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQucG9ydGFibGUtZXhlY3V0YWJsZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQud2luZG93cy50aHVtYm5haWwtY2FjaGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubWllbGUranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQubWlmXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibWlmXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5taW5pc29mdC1ocDMwMDAtc2F2ZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5taXRzdWJpc2hpLm1pc3R5LWd1YXJkLnRydXN0d2ViXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm1vYml1cy5kYWZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJkYWZcIl19LFwiYXBwbGljYXRpb24vdm5kLm1vYml1cy5kaXNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJkaXNcIl19LFwiYXBwbGljYXRpb24vdm5kLm1vYml1cy5tYmtcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJtYmtcIl19LFwiYXBwbGljYXRpb24vdm5kLm1vYml1cy5tcXlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJtcXlcIl19LFwiYXBwbGljYXRpb24vdm5kLm1vYml1cy5tc2xcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJtc2xcIl19LFwiYXBwbGljYXRpb24vdm5kLm1vYml1cy5wbGNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJwbGNcIl19LFwiYXBwbGljYXRpb24vdm5kLm1vYml1cy50eGZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ0eGZcIl19LFwiYXBwbGljYXRpb24vdm5kLm1vcGh1bi5hcHBsaWNhdGlvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm1wblwiXX0sXCJhcHBsaWNhdGlvbi92bmQubW9waHVuLmNlcnRpZmljYXRlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibXBjXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmFkc2lcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmZpc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUuZ290YXBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmttclwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUudHRjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS53ZW1cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubW90b3JvbGEuaXBybVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5tb3ppbGxhLnh1bCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wieHVsXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tcy0zbWZkb2N1bWVudFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1hcnRnYWxyeVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImNpbFwiXX0sXCJhcHBsaWNhdGlvbi92bmQubXMtYXNmXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm1zLWNhYi1jb21wcmVzc2VkXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiY2FiXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1jb2xvci5pY2Nwcm9maWxlXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIn0sXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcInhsc1wiLFwieGxtXCIsXCJ4bGFcIixcInhsY1wiLFwieGx0XCIsXCJ4bHdcIl19LFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLmFkZGluLm1hY3JvZW5hYmxlZC4xMlwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInhsYW1cIl19LFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnNoZWV0LmJpbmFyeS5tYWNyb2VuYWJsZWQuMTJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ4bHNiXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5tYWNyb2VuYWJsZWQuMTJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ4bHNtXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC50ZW1wbGF0ZS5tYWNyb2VuYWJsZWQuMTJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ4bHRtXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1mb250b2JqZWN0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcImVvdFwiXX0sXCJhcHBsaWNhdGlvbi92bmQubXMtaHRtbGhlbHBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJjaG1cIl19LFwiYXBwbGljYXRpb24vdm5kLm1zLWltc1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImltc1wiXX0sXCJhcHBsaWNhdGlvbi92bmQubXMtbHJtXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibHJtXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1vZmZpY2UuYWN0aXZleCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubXMtb2ZmaWNldGhlbWVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ0aG14XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1vcGVudHlwZVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1vdXRsb29rXCI6e1wiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wibXNnXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1wYWNrYWdlLm9iZnVzY2F0ZWQtb3BlbnR5cGVcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwifSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1wa2kuc2VjY2F0XCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJjYXRcIl19LFwiYXBwbGljYXRpb24vdm5kLm1zLXBraS5zdGxcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInN0bFwiXX0sXCJhcHBsaWNhdGlvbi92bmQubXMtcGxheXJlYWR5LmluaXRpYXRvcit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wicHB0XCIsXCJwcHNcIixcInBvdFwiXX0sXCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5hZGRpbi5tYWNyb2VuYWJsZWQuMTJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJwcGFtXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnByZXNlbnRhdGlvbi5tYWNyb2VuYWJsZWQuMTJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJwcHRtXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlLm1hY3JvZW5hYmxlZC4xMlwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNsZG1cIl19LFwiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQuc2xpZGVzaG93Lm1hY3JvZW5hYmxlZC4xMlwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInBwc21cIl19LFwiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQudGVtcGxhdGUubWFjcm9lbmFibGVkLjEyXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicG90bVwiXX0sXCJhcHBsaWNhdGlvbi92bmQubXMtcHJpbnRkZXZpY2VjYXBhYmlsaXRpZXMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm1zLXByaW50aW5nLnByaW50dGlja2V0K3htbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCJ9LFwiYXBwbGljYXRpb24vdm5kLm1zLXByaW50c2NoZW1hdGlja2V0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1wcm9qZWN0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibXBwXCIsXCJtcHRcIl19LFwiYXBwbGljYXRpb24vdm5kLm1zLXRuZWZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubXMtd2luZG93cy5kZXZpY2VwYWlyaW5nXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm1zLXdpbmRvd3MubndwcmludGluZy5vb2JcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubXMtd2luZG93cy5wcmludGVycGFpcmluZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5tcy13aW5kb3dzLndzZC5vb2JcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubXMtd21kcm0ubGljLWNobGctcmVxXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm1zLXdtZHJtLmxpYy1yZXNwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm1zLXdtZHJtLm1ldGVyLWNobGctcmVxXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm1zLXdtZHJtLm1ldGVyLXJlc3BcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubXMtd29yZC5kb2N1bWVudC5tYWNyb2VuYWJsZWQuMTJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJkb2NtXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tcy13b3JkLnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMlwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImRvdG1cIl19LFwiYXBwbGljYXRpb24vdm5kLm1zLXdvcmtzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wid3BzXCIsXCJ3a3NcIixcIndjbVwiLFwid2RiXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tcy13cGxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ3cGxcIl19LFwiYXBwbGljYXRpb24vdm5kLm1zLXhwc2RvY3VtZW50XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJ4cHNcIl19LFwiYXBwbGljYXRpb24vdm5kLm1zYS1kaXNrLWltYWdlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm1zZXFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJtc2VxXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tc2lnblwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5tdWx0aWFkLmNyZWF0b3JcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubXVsdGlhZC5jcmVhdG9yLmNpZlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5tdXNpYy1uaWZmXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm11c2ljaWFuXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibXVzXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5tdXZlZS5zdHlsZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm1zdHlcIl19LFwiYXBwbGljYXRpb24vdm5kLm15bmZjXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widGFnbGV0XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5uY2QuY29udHJvbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5uY2QucmVmZXJlbmNlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm5lYXJzdC5pbnYranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQubmVydmFuYVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5uZXRmcHhcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubmV1cm9sYW5ndWFnZS5ubHVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJubHVcIl19LFwiYXBwbGljYXRpb24vdm5kLm5pbnRlbmRvLm5pdHJvLnJvbVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5uaW50ZW5kby5zbmVzLnJvbVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5uaXRmXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibnRmXCIsXCJuaXRmXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC1kaXJlY3RvcnlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJubmRcIl19LFwiYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LXNlYWxlclwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm5uc1wiXX0sXCJhcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtd2ViXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibm53XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5jYXRhbG9nc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5jb25tbCt3YnhtbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5jb25tbCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubm9raWEuaXB0di5jb25maWcreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm5va2lhLmlzZHMtcmFkaW8tcHJlc2V0c1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5sYW5kbWFyayt3YnhtbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5sYW5kbWFyayt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubm9raWEubGFuZG1hcmtjb2xsZWN0aW9uK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5uLWdhZ2UuYWMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm5va2lhLm4tZ2FnZS5kYXRhXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibmdkYXRcIl19LFwiYXBwbGljYXRpb24vdm5kLm5va2lhLm4tZ2FnZS5zeW1iaWFuLmluc3RhbGxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJuLWdhZ2VcIl19LFwiYXBwbGljYXRpb24vdm5kLm5va2lhLm5jZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5wY2Qrd2J4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubm9raWEucGNkK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5yYWRpby1wcmVzZXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJycHN0XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5yYWRpby1wcmVzZXRzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicnBzc1wiXX0sXCJhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZWRtXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZWRtXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5lZHhcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJlZHhcIl19LFwiYXBwbGljYXRpb24vdm5kLm5vdmFkaWdtLmV4dFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImV4dFwiXX0sXCJhcHBsaWNhdGlvbi92bmQubnR0LWxvY2FsLmNvbnRlbnQtc2hhcmVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubnR0LWxvY2FsLmZpbGUtdHJhbnNmZXJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQubnR0LWxvY2FsLm9nd19yZW1vdGUtYWNjZXNzXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm50dC1sb2NhbC5zaXAtdGFfcmVtb3RlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm50dC1sb2NhbC5zaXAtdGFfdGNwX3N0cmVhbVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJvZGNcIl19LFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydC10ZW1wbGF0ZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm90Y1wiXX0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmRhdGFiYXNlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wib2RiXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZm9ybXVsYVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm9kZlwiXX0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmZvcm11bGEtdGVtcGxhdGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJvZGZ0XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3NcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcIm9kZ1wiXX0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wib3RnXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2VcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJvZGlcIl19LFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZS10ZW1wbGF0ZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm90aVwiXX0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wib2RwXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uLXRlbXBsYXRlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wib3RwXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcIm9kc1wiXX0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnNwcmVhZHNoZWV0LXRlbXBsYXRlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wib3RzXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wib2R0XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC1tYXN0ZXJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJvZG1cIl19LFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wib3R0XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQudGV4dC13ZWJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJvdGhcIl19LFwiYXBwbGljYXRpb24vdm5kLm9iblwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vY2YrY2JvclwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vZnRuLmwxMG4ranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQub2lwZi5jb250ZW50YWNjZXNzZG93bmxvYWQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9pcGYuY29udGVudGFjY2Vzc3N0cmVhbWluZyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub2lwZi5jc3BnLWhleGJpbmFyeVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vaXBmLmRhZS5zdmcreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9pcGYuZGFlLnhodG1sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vaXBmLm1pcHB2Y29udHJvbG1lc3NhZ2UreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9pcGYucGFlLmdlbVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vaXBmLnNwZGlzY292ZXJ5K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vaXBmLnNwZGxpc3QreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9pcGYudWVwcm9maWxlK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vaXBmLnVzZXJwcm9maWxlK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbHBjLXN1Z2FyXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wieG9cIl19LFwiYXBwbGljYXRpb24vdm5kLm9tYS1zY3dzLWNvbmZpZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEtc2N3cy1odHRwLXJlcXVlc3RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub21hLXNjd3MtaHR0cC1yZXNwb25zZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3QuYXNzb2NpYXRlZC1wcm9jZWR1cmUtcGFyYW1ldGVyK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3QuZHJtLXRyaWdnZXIreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5pbWQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5sdGttXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5ub3RpZmljYXRpb24reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5wcm92aXNpb25pbmd0cmlnZ2VyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zZ2Jvb3RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnNnZGQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zZ2R1XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zaW1wbGUtc3ltYm9sLWNvbnRhaW5lclwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEuYmNhc3Quc21hcnRjYXJkLXRyaWdnZXIreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS5iY2FzdC5zcHJvdit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub21hLmJjYXN0LnN0a21cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub21hLmNhYi1hZGRyZXNzLWJvb2sreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS5jYWItZmVhdHVyZS1oYW5kbGVyK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEuY2FiLXBjYyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub21hLmNhYi1zdWJzLWludml0ZSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub21hLmNhYi11c2VyLXByZWZzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEuZGNkXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS5kY2RjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS5kZDIreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZGQyXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEuZHJtLnJpc2QreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS5ncm91cC11c2FnZS1saXN0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEubHdtMm0ranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQub21hLmx3bTJtK3RsdlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEucGFsK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEucG9jLmRldGFpbGVkLXByb2dyZXNzLXJlcG9ydCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5maW5hbC1yZXBvcnQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS5wb2MuZ3JvdXBzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEucG9jLmludm9jYXRpb24tZGVzY3JpcHRvcit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub21hLnBvYy5vcHRpbWl6ZWQtcHJvZ3Jlc3MtcmVwb3J0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEucHVzaFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbWEuc2NpZG0ubWVzc2FnZXMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYS54Y2FwLWRpcmVjdG9yeSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub21hZHMtZW1haWwreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYWRzLWZpbGUreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9tYWRzLWZvbGRlcit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub21hbG9jLXN1cGwtaW5pdFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbmVwYWdlclwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbmVwYWdlcnRhbXBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub25lcGFnZXJ0YW14XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9uZXBhZ2VydGF0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9uZXBhZ2VydGF0cFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vbmVwYWdlcnRhdHhcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbmJsb3guZ2FtZSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbmJsb3guZ2FtZS1iaW5hcnlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbmV5ZS5vZWJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3Blbm9mZmljZW9yZy5leHRlbnNpb25cIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcIm94dFwiXX0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnN0cmVldG1hcC5kYXRhK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5jdXN0b20tcHJvcGVydGllcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuY3VzdG9teG1scHJvcGVydGllcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuZHJhd2luZ21sLmNoYXJ0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuY2hhcnRzaGFwZXMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5kaWFncmFtY29sb3JzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuZGlhZ3JhbWRhdGEreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmRyYXdpbmdtbC5kaWFncmFtbGF5b3V0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5kcmF3aW5nbWwuZGlhZ3JhbXN0eWxlK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5leHRlbmRlZC1wcm9wZXJ0aWVzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5jb21tZW50YXV0aG9ycyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuY29tbWVudHMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLmhhbmRvdXRtYXN0ZXIreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLm5vdGVzbWFzdGVyK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5ub3Rlc3NsaWRlK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcInBwdHhcIl19LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvbi5tYWluK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzcHJvcHMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wic2xkeFwiXX0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGUreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRlbGF5b3V0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZW1hc3Rlcit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicHBzeFwiXX0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93Lm1haW4reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnNsaWRldXBkYXRlaW5mbyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwudGFibGVzdHlsZXMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRhZ3MreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnRlbXBsYXRlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicG90eFwiXX0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwudGVtcGxhdGUubWFpbit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwudmlld3Byb3BzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNhbGNjaGFpbit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5jaGFydHNoZWV0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNvbW1lbnRzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNvbm5lY3Rpb25zK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmRpYWxvZ3NoZWV0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmV4dGVybmFsbGluayt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5waXZvdGNhY2hlZGVmaW5pdGlvbit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5waXZvdGNhY2hlcmVjb3Jkcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5waXZvdHRhYmxlK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnF1ZXJ5dGFibGUreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwucmV2aXNpb25oZWFkZXJzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnJldmlzaW9ubG9nK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoYXJlZHN0cmluZ3MreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcInhsc3hcIl19LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQubWFpbit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldG1ldGFkYXRhK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnN0eWxlcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50YWJsZSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50YWJsZXNpbmdsZWNlbGxzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnRlbXBsYXRlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wieGx0eFwiXX0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZS5tYWluK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnVzZXJuYW1lcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC52b2xhdGlsZWRlcGVuZGVuY2llcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC53b3Jrc2hlZXQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnRoZW1lK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC50aGVtZW92ZXJyaWRlK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC52bWxkcmF3aW5nXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuY29tbWVudHMreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcImRvY3hcIl19LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQuZ2xvc3NhcnkreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQubWFpbit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5lbmRub3Rlcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5mb250dGFibGUreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZm9vdGVyK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmZvb3Rub3Rlcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5udW1iZXJpbmcreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuc2V0dGluZ3MreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuc3R5bGVzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLnRlbXBsYXRlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZG90eFwiXX0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC50ZW1wbGF0ZS5tYWluK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLndlYnNldHRpbmdzK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1wYWNrYWdlLmNvcmUtcHJvcGVydGllcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtcGFja2FnZS5kaWdpdGFsLXNpZ25hdHVyZS14bWxzaWduYXR1cmUreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UucmVsYXRpb25zaGlwcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3JhY2xlLnJlc291cmNlK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vdm5kLm9yYW5nZS5pbmRhdGFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3NhLm5ldGRlcGxveVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vc2dlby5tYXBndWlkZS5wYWNrYWdlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibWdwXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5vc2dpLmJ1bmRsZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5vc2dpLmRwXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZHBcIl19LFwiYXBwbGljYXRpb24vdm5kLm9zZ2kuc3Vic3lzdGVtXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZXNhXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5vdHBzLmN0LWtpcCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQub3hsaS5jb3VudGdyYXBoXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnBhZ2VyZHV0eStqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3ZuZC5wYWxtXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicGRiXCIsXCJwcWFcIixcIm9wcmNcIl19LFwiYXBwbGljYXRpb24vdm5kLnBhbm9wbHlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQucGFvcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQucGFvcy54bWxcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwifSxcImFwcGxpY2F0aW9uL3ZuZC5wYXRlbnRkaXZlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnBhd2FhZmlsZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInBhd1wiXX0sXCJhcHBsaWNhdGlvbi92bmQucGNvc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5wZy5mb3JtYXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzdHJcIl19LFwiYXBwbGljYXRpb24vdm5kLnBnLm9zYXNsaVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImVpNlwiXX0sXCJhcHBsaWNhdGlvbi92bmQucGlhY2Nlc3MuYXBwbGljYXRpb24tbGljZW5jZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5waWNzZWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJlZmlmXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5wbWkud2lkZ2V0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wid2dcIl19LFwiYXBwbGljYXRpb24vdm5kLnBvYy5ncm91cC1hZHZlcnRpc2VtZW50K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5wb2NrZXRsZWFyblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInBsZlwiXX0sXCJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNlwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInBiZFwiXX0sXCJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNi1zXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjdcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNy1zXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjc1XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjc1LXNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQucHJlbWluZXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQucHJldmlld3N5c3RlbXMuYm94XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiYm94XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5wcm90ZXVzLm1hZ2F6aW5lXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibWd6XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5wdWJsaXNoYXJlLWRlbHRhLXRyZWVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJxcHNcIl19LFwiYXBwbGljYXRpb24vdm5kLnB2aS5wdGlkMVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInB0aWRcIl19LFwiYXBwbGljYXRpb24vdm5kLnB3Zy1tdWx0aXBsZXhlZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5wd2cteGh0bWwtcHJpbnQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnF1YWxjb21tLmJyZXctYXBwLXJlc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5xdWFyYW50YWluZW5ldFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5xdWFyay5xdWFya3hwcmVzc1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInF4ZFwiLFwicXh0XCIsXCJxd2RcIixcInF3dFwiLFwicXhsXCIsXCJxeGJcIl19LFwiYXBwbGljYXRpb24vdm5kLnF1b2JqZWN0LXF1b3hkb2N1bWVudFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5yYWRpc3lzLm1vbWwreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQucmFkaXN5cy5tc21sLWF1ZGl0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5yYWRpc3lzLm1zbWwtYXVkaXQtY29uZit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQucmFkaXN5cy5tc21sLWF1ZGl0LWNvbm4reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbC1hdWRpdC1kaWFsb2creG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbC1hdWRpdC1zdHJlYW0reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbC1jb25mK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5yYWRpc3lzLm1zbWwtZGlhbG9nK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5yYWRpc3lzLm1zbWwtZGlhbG9nLWJhc2UreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbC1kaWFsb2ctZmF4LWRldGVjdCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQucmFkaXN5cy5tc21sLWRpYWxvZy1mYXgtc2VuZHJlY3YreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbC1kaWFsb2ctZ3JvdXAreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnJhZGlzeXMubXNtbC1kaWFsb2ctc3BlZWNoK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5yYWRpc3lzLm1zbWwtZGlhbG9nLXRyYW5zZm9ybSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQucmFpbnN0b3IuZGF0YVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5yYXBpZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5yYXJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQucmVhbHZuYy5iZWRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJiZWRcIl19LFwiYXBwbGljYXRpb24vdm5kLnJlY29yZGFyZS5tdXNpY3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm14bFwiXX0sXCJhcHBsaWNhdGlvbi92bmQucmVjb3JkYXJlLm11c2ljeG1sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm11c2ljeG1sXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5yZW5sZWFybi5ybHByaW50XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnJlc3RmdWwranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQucmlnLmNyeXB0b25vdGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJjcnlwdG9ub3RlXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5yaW0uY29kXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJjb2RcIl19LFwiYXBwbGljYXRpb24vdm5kLnJuLXJlYWxtZWRpYVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wicm1cIl19LFwiYXBwbGljYXRpb24vdm5kLnJuLXJlYWxtZWRpYS12YnJcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInJtdmJcIl19LFwiYXBwbGljYXRpb24vdm5kLnJvdXRlNjYubGluazY2K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImxpbms2NlwiXX0sXCJhcHBsaWNhdGlvbi92bmQucnMtMjc0eFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5ydWNrdXMuZG93bmxvYWRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuczNzbXNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuc2FpbGluZ3RyYWNrZXIudHJhY2tcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzdFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc2JtLmNpZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5zYm0ubWlkMlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5zY3JpYnVzXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnNlYWxlZC4zZGZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLmNzZlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQuZG9jXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnNlYWxlZC5lbWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLm1odFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWQubmV0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnNlYWxlZC5wcHRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLnRpZmZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuc2VhbGVkLnhsc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5odG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLnBkZlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5zZWVtYWlsXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wic2VlXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5zZW1hXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wic2VtYVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc2VtZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNlbWRcIl19LFwiYXBwbGljYXRpb24vdm5kLnNlbWZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzZW1mXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5mb3JtZGF0YVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImlmbVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQuZm9ybXRlbXBsYXRlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiaXRwXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5pbnRlcmNoYW5nZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImlpZlwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQucGFja2FnZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImlwa1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuc2lncm9rLnNlc3Npb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuc2ltdGVjaC1taW5kbWFwcGVyXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widHdkXCIsXCJ0d2RzXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5zaXJlbitqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3ZuZC5zbWFmXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibW1mXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5zbWFydC5ub3RlYm9va1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5zbWFydC50ZWFjaGVyXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widGVhY2hlclwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc29mdHdhcmU2MDIuZmlsbGVyLmZvcm0reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnNvZnR3YXJlNjAyLmZpbGxlci5mb3JtLXhtbC16aXBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuc29sZW50LnNka20reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wic2RrbVwiLFwic2RrZFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc3BvdGZpcmUuZHhwXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZHhwXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5zcG90ZmlyZS5zZnNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzZnNcIl19LFwiYXBwbGljYXRpb24vdm5kLnNxbGl0ZTNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuc3NzLWNvZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5zc3MtZHRmXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnNzcy1udGZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmNhbGNcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInNkY1wiXX0sXCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmRyYXdcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInNkYVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmltcHJlc3NcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInNkZFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLm1hdGhcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInNtZlwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLndyaXRlclwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic2R3XCIsXCJ2b3JcIl19LFwiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXItZ2xvYmFsXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJzZ2xcIl19LFwiYXBwbGljYXRpb24vdm5kLnN0ZXBtYW5pYS5wYWNrYWdlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wic216aXBcIl19LFwiYXBwbGljYXRpb24vdm5kLnN0ZXBtYW5pYS5zdGVwY2hhcnRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzbVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc3RyZWV0LXN0cmVhbVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5zdW4ud2FkbCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wid2FkbFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5jYWxjXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJzeGNcIl19LFwiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYy50ZW1wbGF0ZVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic3RjXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXdcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInN4ZFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5kcmF3LnRlbXBsYXRlXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJzdGRcIl19LFwiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzc1wiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic3hpXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3MudGVtcGxhdGVcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInN0aVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5tYXRoXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJzeG1cIl19LFwiYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJzeHdcIl19LFwiYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyLmdsb2JhbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic3hnXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlci50ZW1wbGF0ZVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic3R3XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5zdXMtY2FsZW5kYXJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzdXNcIixcInN1c3BcIl19LFwiYXBwbGljYXRpb24vdm5kLnN2ZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInN2ZFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc3dpZnR2aWV3LWljc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5zeW1iaWFuLmluc3RhbGxcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInNpc1wiLFwic2lzeFwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc3luY21sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInhzbVwiXX0sXCJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtK3dieG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiYmRtXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wieGRtXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0ubm90aWZpY2F0aW9uXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbWRkZit3YnhtbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG1kZGYreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbXRuZHMrd2J4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRtdG5kcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQuc3luY21sLmRzLm5vdGlmaWNhdGlvblwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC50YWJsZXNjaGVtYStqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3ZuZC50YW8uaW50ZW50LW1vZHVsZS1hcmNoaXZlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widGFvXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC50Y3BkdW1wLnBjYXBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJwY2FwXCIsXCJjYXBcIixcImRtcFwiXX0sXCJhcHBsaWNhdGlvbi92bmQudG1kLm1lZGlhZmxleC5hcGkreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnRtbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC50bW9iaWxlLWxpdmV0dlwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInRtb1wiXX0sXCJhcHBsaWNhdGlvbi92bmQudHJpLm9uZXNvdXJjZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC50cmlkLnRwdFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInRwdFwiXX0sXCJhcHBsaWNhdGlvbi92bmQudHJpc2NhcGUubXhzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibXhzXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC50cnVlYXBwXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widHJhXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC50cnVlZG9jXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnViaXNvZnQud2VicGxheWVyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnVmZGxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ1ZmRcIixcInVmZGxcIl19LFwiYXBwbGljYXRpb24vdm5kLnVpcS50aGVtZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInV0elwiXX0sXCJhcHBsaWNhdGlvbi92bmQudW1hamluXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widW1qXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC51bml0eVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInVuaXR5d2ViXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC51b21sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInVvbWxcIl19LFwiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYWxlcnRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5hbGVydC13YnhtbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmJlYXJlci1jaG9pY2VcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5iZWFyZXItY2hvaWNlLXdieG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuY2FjaGVvcFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNhY2hlb3Atd2J4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5jaGFubmVsXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuY2hhbm5lbC13YnhtbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5saXN0LXdieG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnVwbGFuZXQubGlzdGNtZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3RjbWQtd2J4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQudXBsYW5ldC5zaWduYWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQudXJpLW1hcFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC52YWx2ZS5zb3VyY2UubWF0ZXJpYWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQudmN4XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widmN4XCJdfSxcImFwcGxpY2F0aW9uL3ZuZC52ZC1zdHVkeVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC52ZWN0b3J3b3Jrc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC52ZWwranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQudmVyaW1hdHJpeC52Y2FzXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnZpZHNvZnQudmlkY29uZmVyZW5jZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC52aXNpb1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInZzZFwiLFwidnN0XCIsXCJ2c3NcIixcInZzd1wiXX0sXCJhcHBsaWNhdGlvbi92bmQudmlzaW9uYXJ5XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widmlzXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC52aXZpZGVuY2Uuc2NyaXB0ZmlsZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC52c2ZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ2c2ZcIl19LFwiYXBwbGljYXRpb24vdm5kLndhcC5zaWNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQud2FwLnNsY1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC53YXAud2J4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ3YnhtbFwiXX0sXCJhcHBsaWNhdGlvbi92bmQud2FwLndtbGNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ3bWxjXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC53YXAud21sc2NyaXB0Y1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIndtbHNjXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC53ZWJ0dXJib1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInd0YlwiXX0sXCJhcHBsaWNhdGlvbi92bmQud2ZhLnAycFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC53ZmEud3NjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLndpbmRvd3MuZGV2aWNlcGFpcmluZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC53bWNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQud21mLmJvb3RzdHJhcFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC53b2xmcmFtLm1hdGhlbWF0aWNhXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLndvbGZyYW0ubWF0aGVtYXRpY2EucGFja2FnZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC53b2xmcmFtLnBsYXllclwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm5icFwiXX0sXCJhcHBsaWNhdGlvbi92bmQud29yZHBlcmZlY3RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ3cGRcIl19LFwiYXBwbGljYXRpb24vdm5kLndxZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIndxZFwiXX0sXCJhcHBsaWNhdGlvbi92bmQud3JxLWhwMzAwMC1sYWJlbGxlZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC53dC5zdGZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzdGZcIl19LFwiYXBwbGljYXRpb24vdm5kLnd2LmNzcCt3YnhtbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC53di5jc3AreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnd2LnNzcCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQueGFjbWwranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi92bmQueGFyYVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInhhclwiXX0sXCJhcHBsaWNhdGlvbi92bmQueGZkbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInhmZGxcIl19LFwiYXBwbGljYXRpb24vdm5kLnhmZGwud2ViZm9ybVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC54bWkreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnhtcGllLmNwa2dcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQueG1waWUuZHBrZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC54bXBpZS5wbGFuXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnhtcGllLnBwa2dcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQueG1waWUueGxpbVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtZGljXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiaHZkXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtc2NyaXB0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiaHZzXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtdm9pY2VcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJodnBcIl19LFwiYXBwbGljYXRpb24vdm5kLnlhbWFoYS5vcGVuc2NvcmVmb3JtYXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJvc2ZcIl19LFwiYXBwbGljYXRpb24vdm5kLnlhbWFoYS5vcGVuc2NvcmVmb3JtYXQub3NmcHZnK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm9zZnB2Z1wiXX0sXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLnJlbW90ZS1zZXR1cFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuc21hZi1hdWRpb1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNhZlwiXX0sXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLnNtYWYtcGhyYXNlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wic3BmXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC55YW1haGEudGhyb3VnaC1uZ25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLnR1bm5lbC11ZHBlbmNhcFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3ZuZC55YW93ZW1lXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnllbGxvd3JpdmVyLWN1c3RvbS1tZW51XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiY21wXCJdfSxcImFwcGxpY2F0aW9uL3ZuZC55b3V0dWJlLnl0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vdm5kLnp1bFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInppclwiLFwiemlyelwiXX0sXCJhcHBsaWNhdGlvbi92bmQuenphenouZGVjayt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ6YXpcIl19LFwiYXBwbGljYXRpb24vdm9pY2V4bWwreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widnhtbFwiXX0sXCJhcHBsaWNhdGlvbi92b3VjaGVyLWNtcytqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3ZxLXJ0Y3B4clwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3dhc21cIjp7XCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcIndhc21cIl19LFwiYXBwbGljYXRpb24vd2F0Y2hlcmluZm8reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vd2VicHVzaC1vcHRpb25zK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24vd2hvaXNwcC1xdWVyeVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3dob2lzcHAtcmVzcG9uc2VcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi93aWRnZXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ3Z3RcIl19LFwiYXBwbGljYXRpb24vd2luaGxwXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJobHBcIl19LFwiYXBwbGljYXRpb24vd2l0YVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3dvcmRwZXJmZWN0NS4xXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24vd3NkbCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ3c2RsXCJdfSxcImFwcGxpY2F0aW9uL3dzcG9saWN5K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIndzcG9saWN5XCJdfSxcImFwcGxpY2F0aW9uL3gtN3otY29tcHJlc3NlZFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCI3elwiXX0sXCJhcHBsaWNhdGlvbi94LWFiaXdvcmRcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImFid1wiXX0sXCJhcHBsaWNhdGlvbi94LWFjZS1jb21wcmVzc2VkXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJhY2VcIl19LFwiYXBwbGljYXRpb24veC1hbWZcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwifSxcImFwcGxpY2F0aW9uL3gtYXBwbGUtZGlza2ltYWdlXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJkbWdcIl19LFwiYXBwbGljYXRpb24veC1hcmpcIjp7XCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJhcmpcIl19LFwiYXBwbGljYXRpb24veC1hdXRob3J3YXJlLWJpblwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiYWFiXCIsXCJ4MzJcIixcInUzMlwiLFwidm94XCJdfSxcImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1tYXBcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImFhbVwiXX0sXCJhcHBsaWNhdGlvbi94LWF1dGhvcndhcmUtc2VnXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJhYXNcIl19LFwiYXBwbGljYXRpb24veC1iY3Bpb1wiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiYmNwaW9cIl19LFwiYXBwbGljYXRpb24veC1iZG9jXCI6e1wiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wiYmRvY1wiXX0sXCJhcHBsaWNhdGlvbi94LWJpdHRvcnJlbnRcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInRvcnJlbnRcIl19LFwiYXBwbGljYXRpb24veC1ibG9yYlwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiYmxiXCIsXCJibG9yYlwiXX0sXCJhcHBsaWNhdGlvbi94LWJ6aXBcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wiYnpcIl19LFwiYXBwbGljYXRpb24veC1iemlwMlwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJiejJcIixcImJvelwiXX0sXCJhcHBsaWNhdGlvbi94LWNiclwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiY2JyXCIsXCJjYmFcIixcImNidFwiLFwiY2J6XCIsXCJjYjdcIl19LFwiYXBwbGljYXRpb24veC1jZGxpbmtcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInZjZFwiXX0sXCJhcHBsaWNhdGlvbi94LWNmcy1jb21wcmVzc2VkXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJjZnNcIl19LFwiYXBwbGljYXRpb24veC1jaGF0XCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJjaGF0XCJdfSxcImFwcGxpY2F0aW9uL3gtY2hlc3MtcGduXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJwZ25cIl19LFwiYXBwbGljYXRpb24veC1jaHJvbWUtZXh0ZW5zaW9uXCI6e1wiZXh0ZW5zaW9uc1wiOltcImNyeFwiXX0sXCJhcHBsaWNhdGlvbi94LWNvY29hXCI6e1wic291cmNlXCI6XCJuZ2lueFwiLFwiZXh0ZW5zaW9uc1wiOltcImNjb1wiXX0sXCJhcHBsaWNhdGlvbi94LWNvbXByZXNzXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIn0sXCJhcHBsaWNhdGlvbi94LWNvbmZlcmVuY2VcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcIm5zY1wiXX0sXCJhcHBsaWNhdGlvbi94LWNwaW9cIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImNwaW9cIl19LFwiYXBwbGljYXRpb24veC1jc2hcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImNzaFwiXX0sXCJhcHBsaWNhdGlvbi94LWRlYlwiOntcImNvbXByZXNzaWJsZVwiOmZhbHNlfSxcImFwcGxpY2F0aW9uL3gtZGViaWFuLXBhY2thZ2VcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImRlYlwiLFwidWRlYlwiXX0sXCJhcHBsaWNhdGlvbi94LWRnYy1jb21wcmVzc2VkXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJkZ2NcIl19LFwiYXBwbGljYXRpb24veC1kaXJlY3RvclwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiZGlyXCIsXCJkY3JcIixcImR4clwiLFwiY3N0XCIsXCJjY3RcIixcImN4dFwiLFwidzNkXCIsXCJmZ2RcIixcInN3YVwiXX0sXCJhcHBsaWNhdGlvbi94LWRvb21cIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcIndhZFwiXX0sXCJhcHBsaWNhdGlvbi94LWR0Ym5jeCt4bWxcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcIm5jeFwiXX0sXCJhcHBsaWNhdGlvbi94LWR0Ym9vayt4bWxcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImR0YlwiXX0sXCJhcHBsaWNhdGlvbi94LWR0YnJlc291cmNlK3htbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wicmVzXCJdfSxcImFwcGxpY2F0aW9uL3gtZHZpXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcImR2aVwiXX0sXCJhcHBsaWNhdGlvbi94LWVudm95XCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJldnlcIl19LFwiYXBwbGljYXRpb24veC1ldmFcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImV2YVwiXX0sXCJhcHBsaWNhdGlvbi94LWZvbnQtYmRmXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJiZGZcIl19LFwiYXBwbGljYXRpb24veC1mb250LWRvc1wiOntcInNvdXJjZVwiOlwiYXBhY2hlXCJ9LFwiYXBwbGljYXRpb24veC1mb250LWZyYW1lbWFrZXJcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwifSxcImFwcGxpY2F0aW9uL3gtZm9udC1naG9zdHNjcmlwdFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiZ3NmXCJdfSxcImFwcGxpY2F0aW9uL3gtZm9udC1saWJncnhcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwifSxcImFwcGxpY2F0aW9uL3gtZm9udC1saW51eC1wc2ZcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInBzZlwiXX0sXCJhcHBsaWNhdGlvbi94LWZvbnQtcGNmXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJwY2ZcIl19LFwiYXBwbGljYXRpb24veC1mb250LXNuZlwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic25mXCJdfSxcImFwcGxpY2F0aW9uL3gtZm9udC1zcGVlZG9cIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwifSxcImFwcGxpY2F0aW9uL3gtZm9udC1zdW5vcy1uZXdzXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIn0sXCJhcHBsaWNhdGlvbi94LWZvbnQtdHlwZTFcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInBmYVwiLFwicGZiXCIsXCJwZm1cIixcImFmbVwiXX0sXCJhcHBsaWNhdGlvbi94LWZvbnQtdmZvbnRcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwifSxcImFwcGxpY2F0aW9uL3gtZnJlZWFyY1wiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiYXJjXCJdfSxcImFwcGxpY2F0aW9uL3gtZnV0dXJlc3BsYXNoXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJzcGxcIl19LFwiYXBwbGljYXRpb24veC1nY2EtY29tcHJlc3NlZFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiZ2NhXCJdfSxcImFwcGxpY2F0aW9uL3gtZ2x1bHhcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInVseFwiXX0sXCJhcHBsaWNhdGlvbi94LWdudW1lcmljXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJnbnVtZXJpY1wiXX0sXCJhcHBsaWNhdGlvbi94LWdyYW1wcy14bWxcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImdyYW1wc1wiXX0sXCJhcHBsaWNhdGlvbi94LWd0YXJcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImd0YXJcIl19LFwiYXBwbGljYXRpb24veC1nemlwXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIn0sXCJhcHBsaWNhdGlvbi94LWhkZlwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiaGRmXCJdfSxcImFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwXCI6e1wiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJwaHBcIl19LFwiYXBwbGljYXRpb24veC1pbnN0YWxsLWluc3RydWN0aW9uc1wiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiaW5zdGFsbFwiXX0sXCJhcHBsaWNhdGlvbi94LWlzbzk2NjAtaW1hZ2VcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImlzb1wiXX0sXCJhcHBsaWNhdGlvbi94LWphdmEtYXJjaGl2ZS1kaWZmXCI6e1wic291cmNlXCI6XCJuZ2lueFwiLFwiZXh0ZW5zaW9uc1wiOltcImphcmRpZmZcIl19LFwiYXBwbGljYXRpb24veC1qYXZhLWpubHAtZmlsZVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJqbmxwXCJdfSxcImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdFwiOntcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24veC1sYXRleFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJsYXRleFwiXX0sXCJhcHBsaWNhdGlvbi94LWx1YS1ieXRlY29kZVwiOntcImV4dGVuc2lvbnNcIjpbXCJsdWFjXCJdfSxcImFwcGxpY2F0aW9uL3gtbHpoLWNvbXByZXNzZWRcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImx6aFwiLFwibGhhXCJdfSxcImFwcGxpY2F0aW9uL3gtbWFrZXNlbGZcIjp7XCJzb3VyY2VcIjpcIm5naW54XCIsXCJleHRlbnNpb25zXCI6W1wicnVuXCJdfSxcImFwcGxpY2F0aW9uL3gtbWllXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJtaWVcIl19LFwiYXBwbGljYXRpb24veC1tb2JpcG9ja2V0LWVib29rXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJwcmNcIixcIm1vYmlcIl19LFwiYXBwbGljYXRpb24veC1tcGVndXJsXCI6e1wiY29tcHJlc3NpYmxlXCI6ZmFsc2V9LFwiYXBwbGljYXRpb24veC1tcy1hcHBsaWNhdGlvblwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiYXBwbGljYXRpb25cIl19LFwiYXBwbGljYXRpb24veC1tcy1zaG9ydGN1dFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wibG5rXCJdfSxcImFwcGxpY2F0aW9uL3gtbXMtd21kXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJ3bWRcIl19LFwiYXBwbGljYXRpb24veC1tcy13bXpcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcIndtelwiXX0sXCJhcHBsaWNhdGlvbi94LW1zLXhiYXBcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInhiYXBcIl19LFwiYXBwbGljYXRpb24veC1tc2FjY2Vzc1wiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wibWRiXCJdfSxcImFwcGxpY2F0aW9uL3gtbXNiaW5kZXJcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcIm9iZFwiXX0sXCJhcHBsaWNhdGlvbi94LW1zY2FyZGZpbGVcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImNyZFwiXX0sXCJhcHBsaWNhdGlvbi94LW1zY2xpcFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiY2xwXCJdfSxcImFwcGxpY2F0aW9uL3gtbXNkb3MtcHJvZ3JhbVwiOntcImV4dGVuc2lvbnNcIjpbXCJleGVcIl19LFwiYXBwbGljYXRpb24veC1tc2Rvd25sb2FkXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJleGVcIixcImRsbFwiLFwiY29tXCIsXCJiYXRcIixcIm1zaVwiXX0sXCJhcHBsaWNhdGlvbi94LW1zbWVkaWF2aWV3XCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJtdmJcIixcIm0xM1wiLFwibTE0XCJdfSxcImFwcGxpY2F0aW9uL3gtbXNtZXRhZmlsZVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wid21mXCIsXCJ3bXpcIixcImVtZlwiLFwiZW16XCJdfSxcImFwcGxpY2F0aW9uL3gtbXNtb25leVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wibW55XCJdfSxcImFwcGxpY2F0aW9uL3gtbXNwdWJsaXNoZXJcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInB1YlwiXX0sXCJhcHBsaWNhdGlvbi94LW1zc2NoZWR1bGVcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInNjZFwiXX0sXCJhcHBsaWNhdGlvbi94LW1zdGVybWluYWxcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInRybVwiXX0sXCJhcHBsaWNhdGlvbi94LW1zd3JpdGVcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcIndyaVwiXX0sXCJhcHBsaWNhdGlvbi94LW5ldGNkZlwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wibmNcIixcImNkZlwiXX0sXCJhcHBsaWNhdGlvbi94LW5zLXByb3h5LWF1dG9jb25maWdcIjp7XCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcInBhY1wiXX0sXCJhcHBsaWNhdGlvbi94LW56YlwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wibnpiXCJdfSxcImFwcGxpY2F0aW9uL3gtcGVybFwiOntcInNvdXJjZVwiOlwibmdpbnhcIixcImV4dGVuc2lvbnNcIjpbXCJwbFwiLFwicG1cIl19LFwiYXBwbGljYXRpb24veC1waWxvdFwiOntcInNvdXJjZVwiOlwibmdpbnhcIixcImV4dGVuc2lvbnNcIjpbXCJwcmNcIixcInBkYlwiXX0sXCJhcHBsaWNhdGlvbi94LXBrY3MxMlwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJwMTJcIixcInBmeFwiXX0sXCJhcHBsaWNhdGlvbi94LXBrY3M3LWNlcnRpZmljYXRlc1wiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wicDdiXCIsXCJzcGNcIl19LFwiYXBwbGljYXRpb24veC1wa2NzNy1jZXJ0cmVxcmVzcFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wicDdyXCJdfSxcImFwcGxpY2F0aW9uL3gtcmFyLWNvbXByZXNzZWRcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wicmFyXCJdfSxcImFwcGxpY2F0aW9uL3gtcmVkaGF0LXBhY2thZ2UtbWFuYWdlclwiOntcInNvdXJjZVwiOlwibmdpbnhcIixcImV4dGVuc2lvbnNcIjpbXCJycG1cIl19LFwiYXBwbGljYXRpb24veC1yZXNlYXJjaC1pbmZvLXN5c3RlbXNcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInJpc1wiXX0sXCJhcHBsaWNhdGlvbi94LXNlYVwiOntcInNvdXJjZVwiOlwibmdpbnhcIixcImV4dGVuc2lvbnNcIjpbXCJzZWFcIl19LFwiYXBwbGljYXRpb24veC1zaFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcInNoXCJdfSxcImFwcGxpY2F0aW9uL3gtc2hhclwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic2hhclwiXX0sXCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJzd2ZcIl19LFwiYXBwbGljYXRpb24veC1zaWx2ZXJsaWdodC1hcHBcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInhhcFwiXX0sXCJhcHBsaWNhdGlvbi94LXNxbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic3FsXCJdfSxcImFwcGxpY2F0aW9uL3gtc3R1ZmZpdFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJzaXRcIl19LFwiYXBwbGljYXRpb24veC1zdHVmZml0eFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic2l0eFwiXX0sXCJhcHBsaWNhdGlvbi94LXN1YnJpcFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic3J0XCJdfSxcImFwcGxpY2F0aW9uL3gtc3Y0Y3Bpb1wiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic3Y0Y3Bpb1wiXX0sXCJhcHBsaWNhdGlvbi94LXN2NGNyY1wiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic3Y0Y3JjXCJdfSxcImFwcGxpY2F0aW9uL3gtdDN2bS1pbWFnZVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1widDNcIl19LFwiYXBwbGljYXRpb24veC10YWRzXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJnYW1cIl19LFwiYXBwbGljYXRpb24veC10YXJcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJ0YXJcIl19LFwiYXBwbGljYXRpb24veC10Y2xcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInRjbFwiLFwidGtcIl19LFwiYXBwbGljYXRpb24veC10ZXhcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInRleFwiXX0sXCJhcHBsaWNhdGlvbi94LXRleC10Zm1cIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInRmbVwiXX0sXCJhcHBsaWNhdGlvbi94LXRleGluZm9cIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInRleGluZm9cIixcInRleGlcIl19LFwiYXBwbGljYXRpb24veC10Z2lmXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJvYmpcIl19LFwiYXBwbGljYXRpb24veC11c3RhclwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1widXN0YXJcIl19LFwiYXBwbGljYXRpb24veC12aXJ0dWFsYm94LWhkZFwiOntcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wiaGRkXCJdfSxcImFwcGxpY2F0aW9uL3gtdmlydHVhbGJveC1vdmFcIjp7XCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcIm92YVwiXX0sXCJhcHBsaWNhdGlvbi94LXZpcnR1YWxib3gtb3ZmXCI6e1wiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJvdmZcIl19LFwiYXBwbGljYXRpb24veC12aXJ0dWFsYm94LXZib3hcIjp7XCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcInZib3hcIl19LFwiYXBwbGljYXRpb24veC12aXJ0dWFsYm94LXZib3gtZXh0cGFja1wiOntcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcInZib3gtZXh0cGFja1wiXX0sXCJhcHBsaWNhdGlvbi94LXZpcnR1YWxib3gtdmRpXCI6e1wiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJ2ZGlcIl19LFwiYXBwbGljYXRpb24veC12aXJ0dWFsYm94LXZoZFwiOntcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1widmhkXCJdfSxcImFwcGxpY2F0aW9uL3gtdmlydHVhbGJveC12bWRrXCI6e1wiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJ2bWRrXCJdfSxcImFwcGxpY2F0aW9uL3gtd2Fpcy1zb3VyY2VcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInNyY1wiXX0sXCJhcHBsaWNhdGlvbi94LXdlYi1hcHAtbWFuaWZlc3QranNvblwiOntcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wid2ViYXBwXCJdfSxcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiZGVyXCIsXCJjcnRcIixcInBlbVwiXX0sXCJhcHBsaWNhdGlvbi94LXhmaWdcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImZpZ1wiXX0sXCJhcHBsaWNhdGlvbi94LXhsaWZmK3htbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wieGxmXCJdfSxcImFwcGxpY2F0aW9uL3gteHBpbnN0YWxsXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcInhwaVwiXX0sXCJhcHBsaWNhdGlvbi94LXh6XCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJ4elwiXX0sXCJhcHBsaWNhdGlvbi94LXptYWNoaW5lXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJ6MVwiLFwiejJcIixcInozXCIsXCJ6NFwiLFwiejVcIixcIno2XCIsXCJ6N1wiLFwiejhcIl19LFwiYXBwbGljYXRpb24veDQwMC1icFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3hhY21sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3hhbWwreG1sXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJ4YW1sXCJdfSxcImFwcGxpY2F0aW9uL3hjYXAtYXR0K3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3hjYXAtY2Fwcyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi94Y2FwLWRpZmYreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wieGRmXCJdfSxcImFwcGxpY2F0aW9uL3hjYXAtZWwreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24veGNhcC1lcnJvcit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi94Y2FwLW5zK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3hjb24tY29uZmVyZW5jZS1pbmZvK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3hjb24tY29uZmVyZW5jZS1pbmZvLWRpZmYreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXBwbGljYXRpb24veGVuYyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ4ZW5jXCJdfSxcImFwcGxpY2F0aW9uL3hodG1sK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJ4aHRtbFwiLFwieGh0XCJdfSxcImFwcGxpY2F0aW9uL3hodG1sLXZvaWNlK3htbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCJ9LFwiYXBwbGljYXRpb24veG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcInhtbFwiLFwieHNsXCIsXCJ4c2RcIixcInJuZ1wiXX0sXCJhcHBsaWNhdGlvbi94bWwtZHRkXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcImR0ZFwiXX0sXCJhcHBsaWNhdGlvbi94bWwtZXh0ZXJuYWwtcGFyc2VkLWVudGl0eVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3htbC1wYXRjaCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi94bXBwK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImFwcGxpY2F0aW9uL3hvcCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wieG9wXCJdfSxcImFwcGxpY2F0aW9uL3hwcm9jK3htbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wieHBsXCJdfSxcImFwcGxpY2F0aW9uL3hzbHQreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wieHNsdFwiXX0sXCJhcHBsaWNhdGlvbi94c3BmK3htbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wieHNwZlwiXX0sXCJhcHBsaWNhdGlvbi94dit4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJteG1sXCIsXCJ4aHZtbFwiLFwieHZtbFwiLFwieHZtXCJdfSxcImFwcGxpY2F0aW9uL3lhbmdcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ5YW5nXCJdfSxcImFwcGxpY2F0aW9uL3lhbmctZGF0YStqc29uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcImFwcGxpY2F0aW9uL3lhbmctZGF0YSt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi95YW5nLXBhdGNoK2pzb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWV9LFwiYXBwbGljYXRpb24veWFuZy1wYXRjaCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhcHBsaWNhdGlvbi95aW4reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wieWluXCJdfSxcImFwcGxpY2F0aW9uL3ppcFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wiemlwXCJdfSxcImFwcGxpY2F0aW9uL3psaWJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby8xZC1pbnRlcmxlYXZlZC1wYXJpdHlmZWNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby8zMmthZHBjbVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvLzNncHBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcIjNncHBcIl19LFwiYXVkaW8vM2dwcDJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9hYzNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9hZHBjbVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiYWRwXCJdfSxcImF1ZGlvL2FtclwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2Ftci13YlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2Ftci13YitcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9hcHR4XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vYXNjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vYXRyYWMtYWR2YW5jZWQtbG9zc2xlc3NcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9hdHJhYy14XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vYXRyYWMzXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vYmFzaWNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcImF1XCIsXCJzbmRcIl19LFwiYXVkaW8vYnYxNlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2J2MzJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9jbGVhcm1vZGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9jblwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2RhdDEyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZGxzXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZHNyLWVzMjAxMTA4XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZHNyLWVzMjAyMDUwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZHNyLWVzMjAyMjExXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZHNyLWVzMjAyMjEyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZHZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9kdmk0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZWFjM1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2VuY2FwcnRwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZXZyY1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2V2cmMtcWNwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZXZyYzBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9ldnJjMVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2V2cmNiXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZXZyY2IwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZXZyY2IxXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZXZyY253XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZXZyY253MFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2V2cmNudzFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9ldnJjd2JcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9ldnJjd2IwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZXZyY3diMVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2V2c1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2Z3ZHJlZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2c3MTEtMFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2c3MTlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9nNzIyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZzcyMjFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9nNzIzXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZzcyNi0xNlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2c3MjYtMjRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9nNzI2LTMyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZzcyNi00MFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2c3MjhcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9nNzI5XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZzcyOTFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9nNzI5ZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2c3MjllXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZ3NtXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vZ3NtLWVmclwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2dzbS1oci0wOFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2lsYmNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9pcC1tcl92Mi41XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vaXNhY1wiOntcInNvdXJjZVwiOlwiYXBhY2hlXCJ9LFwiYXVkaW8vbDE2XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vbDIwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vbDI0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZX0sXCJhdWRpby9sOFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL2xwY1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL21lbHBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9tZWxwMTIwMFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL21lbHAyNDAwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vbWVscDYwMFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL21pZGlcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcIm1pZFwiLFwibWlkaVwiLFwia2FyXCIsXCJybWlcIl19LFwiYXVkaW8vbW9iaWxlLXhtZlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL21wM1wiOntcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcIm1wM1wiXX0sXCJhdWRpby9tcDRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcIm00YVwiLFwibXA0YVwiXX0sXCJhdWRpby9tcDRhLWxhdG1cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9tcGFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9tcGEtcm9idXN0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vbXBlZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wibXBnYVwiLFwibXAyXCIsXCJtcDJhXCIsXCJtcDNcIixcIm0yYVwiLFwibTNhXCJdfSxcImF1ZGlvL21wZWc0LWdlbmVyaWNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9tdXNlcGFja1wiOntcInNvdXJjZVwiOlwiYXBhY2hlXCJ9LFwiYXVkaW8vb2dnXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJvZ2FcIixcIm9nZ1wiLFwic3B4XCJdfSxcImF1ZGlvL29wdXNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9wYXJpdHlmZWNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9wY21hXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vcGNtYS13YlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3BjbXVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9wY211LXdiXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vcHJzLnNpZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3FjZWxwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vcmFwdG9yZmVjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vcmVkXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vcnRwLWVuYy1hZXNjbTEyOFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3J0cC1taWRpXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vcnRwbG9vcGJhY2tcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9ydHhcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9zM21cIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInMzbVwiXX0sXCJhdWRpby9zaWxrXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJzaWxcIl19LFwiYXVkaW8vc212XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vc212LXFjcFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3NtdjBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby9zcC1taWRpXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vc3BlZXhcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby90MTQwY1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3QzOFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3RlbGVwaG9uZS1ldmVudFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3RvbmVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby91ZW1jbGlwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vdWxwZmVjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vdmR2aVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3Ztci13YlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3ZuZC4zZ3BwLml1ZnBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby92bmQuNHNiXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vdm5kLmF1ZGlva296XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vdm5kLmNlbHBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby92bmQuY2lzY28ubnNlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vdm5kLmNtbGVzLnJhZGlvLWV2ZW50c1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3ZuZC5jbnMuYW5wMVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3ZuZC5jbnMuaW5mMVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3ZuZC5kZWNlLmF1ZGlvXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widXZhXCIsXCJ1dnZhXCJdfSxcImF1ZGlvL3ZuZC5kaWdpdGFsLXdpbmRzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZW9sXCJdfSxcImF1ZGlvL3ZuZC5kbG5hLmFkdHNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby92bmQuZG9sYnkuaGVhYWMuMVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3ZuZC5kb2xieS5oZWFhYy4yXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vdm5kLmRvbGJ5Lm1scFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3ZuZC5kb2xieS5tcHNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby92bmQuZG9sYnkucGwyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vdm5kLmRvbGJ5LnBsMnhcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby92bmQuZG9sYnkucGwyelwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3ZuZC5kb2xieS5wdWxzZS4xXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vdm5kLmRyYVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImRyYVwiXX0sXCJhdWRpby92bmQuZHRzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZHRzXCJdfSxcImF1ZGlvL3ZuZC5kdHMuaGRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJkdHNoZFwiXX0sXCJhdWRpby92bmQuZHZiLmZpbGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby92bmQuZXZlcmFkLnBsalwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3ZuZC5obnMuYXVkaW9cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby92bmQubHVjZW50LnZvaWNlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibHZwXCJdfSxcImF1ZGlvL3ZuZC5tcy1wbGF5cmVhZHkubWVkaWEucHlhXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicHlhXCJdfSxcImF1ZGlvL3ZuZC5ub2tpYS5tb2JpbGUteG1mXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vdm5kLm5vcnRlbC52YmtcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby92bmQubnVlcmEuZWNlbHA0ODAwXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZWNlbHA0ODAwXCJdfSxcImF1ZGlvL3ZuZC5udWVyYS5lY2VscDc0NzBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJlY2VscDc0NzBcIl19LFwiYXVkaW8vdm5kLm51ZXJhLmVjZWxwOTYwMFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImVjZWxwOTYwMFwiXX0sXCJhdWRpby92bmQub2N0ZWwuc2JjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vdm5kLnByZXNvbnVzLm11bHRpdHJhY2tcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby92bmQucWNlbHBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby92bmQucmhldG9yZXguMzJrYWRwY21cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJhdWRpby92bmQucmlwXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wicmlwXCJdfSxcImF1ZGlvL3ZuZC5ybi1yZWFsYXVkaW9cIjp7XCJjb21wcmVzc2libGVcIjpmYWxzZX0sXCJhdWRpby92bmQuc2VhbGVkbWVkaWEuc29mdHNlYWwubXBlZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3ZuZC52bXguY3ZzZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImF1ZGlvL3ZuZC53YXZlXCI6e1wiY29tcHJlc3NpYmxlXCI6ZmFsc2V9LFwiYXVkaW8vdm9yYmlzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZX0sXCJhdWRpby92b3JiaXMtY29uZmlnXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiYXVkaW8vd2F2XCI6e1wiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wid2F2XCJdfSxcImF1ZGlvL3dhdmVcIjp7XCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJ3YXZcIl19LFwiYXVkaW8vd2VibVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJ3ZWJhXCJdfSxcImF1ZGlvL3gtYWFjXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcImFhY1wiXX0sXCJhdWRpby94LWFpZmZcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImFpZlwiLFwiYWlmZlwiLFwiYWlmY1wiXX0sXCJhdWRpby94LWNhZlwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJjYWZcIl19LFwiYXVkaW8veC1mbGFjXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJmbGFjXCJdfSxcImF1ZGlvL3gtbTRhXCI6e1wic291cmNlXCI6XCJuZ2lueFwiLFwiZXh0ZW5zaW9uc1wiOltcIm00YVwiXX0sXCJhdWRpby94LW1hdHJvc2thXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJta2FcIl19LFwiYXVkaW8veC1tcGVndXJsXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJtM3VcIl19LFwiYXVkaW8veC1tcy13YXhcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcIndheFwiXX0sXCJhdWRpby94LW1zLXdtYVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wid21hXCJdfSxcImF1ZGlvL3gtcG4tcmVhbGF1ZGlvXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJyYW1cIixcInJhXCJdfSxcImF1ZGlvL3gtcG4tcmVhbGF1ZGlvLXBsdWdpblwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wicm1wXCJdfSxcImF1ZGlvL3gtcmVhbGF1ZGlvXCI6e1wic291cmNlXCI6XCJuZ2lueFwiLFwiZXh0ZW5zaW9uc1wiOltcInJhXCJdfSxcImF1ZGlvL3gtdHRhXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIn0sXCJhdWRpby94LXdhdlwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wid2F2XCJdfSxcImF1ZGlvL3htXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJ4bVwiXX0sXCJjaGVtaWNhbC94LWNkeFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiY2R4XCJdfSxcImNoZW1pY2FsL3gtY2lmXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJjaWZcIl19LFwiY2hlbWljYWwveC1jbWRmXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJjbWRmXCJdfSxcImNoZW1pY2FsL3gtY21sXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJjbWxcIl19LFwiY2hlbWljYWwveC1jc21sXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJjc21sXCJdfSxcImNoZW1pY2FsL3gtcGRiXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIn0sXCJjaGVtaWNhbC94LXh5elwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wieHl6XCJdfSxcImZvbnQvY29sbGVjdGlvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInR0Y1wiXX0sXCJmb250L290ZlwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJvdGZcIl19LFwiZm9udC9zZm50XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiZm9udC90dGZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ0dGZcIl19LFwiZm9udC93b2ZmXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wid29mZlwiXX0sXCJmb250L3dvZmYyXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wid29mZjJcIl19LFwiaW1hZ2UvYWNlc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImltYWdlL2FwbmdcIjp7XCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJhcG5nXCJdfSxcImltYWdlL2JtcFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJibXBcIl19LFwiaW1hZ2UvY2dtXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiY2dtXCJdfSxcImltYWdlL2RpY29tLXJsZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImltYWdlL2VtZlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImltYWdlL2ZpdHNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJpbWFnZS9nM2ZheFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImczXCJdfSxcImltYWdlL2dpZlwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wiZ2lmXCJdfSxcImltYWdlL2llZlwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImllZlwiXX0sXCJpbWFnZS9qbHNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJpbWFnZS9qcDJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcImpwMlwiLFwianBnMlwiXX0sXCJpbWFnZS9qcGVnXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJqcGVnXCIsXCJqcGdcIixcImpwZVwiXX0sXCJpbWFnZS9qcG1cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcImpwbVwiXX0sXCJpbWFnZS9qcHhcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcImpweFwiLFwianBmXCJdfSxcImltYWdlL2t0eFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImt0eFwiXX0sXCJpbWFnZS9uYXBscHNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJpbWFnZS9wanBlZ1wiOntcImNvbXByZXNzaWJsZVwiOmZhbHNlfSxcImltYWdlL3BuZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wicG5nXCJdfSxcImltYWdlL3Bycy5idGlmXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiYnRpZlwiXX0sXCJpbWFnZS9wcnMucHRpXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiaW1hZ2UvcHdnLXJhc3RlclwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImltYWdlL3NnaVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic2dpXCJdfSxcImltYWdlL3N2Zyt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wic3ZnXCIsXCJzdmd6XCJdfSxcImltYWdlL3QzOFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImltYWdlL3RpZmZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcInRpZmZcIixcInRpZlwiXX0sXCJpbWFnZS90aWZmLWZ4XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiaW1hZ2Uvdm5kLmFkb2JlLnBob3Rvc2hvcFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJwc2RcIl19LFwiaW1hZ2Uvdm5kLmFpcnppcC5hY2NlbGVyYXRvci5henZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJpbWFnZS92bmQuY25zLmluZjJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJpbWFnZS92bmQuZGVjZS5ncmFwaGljXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widXZpXCIsXCJ1dnZpXCIsXCJ1dmdcIixcInV2dmdcIl19LFwiaW1hZ2Uvdm5kLmRqdnVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJkanZ1XCIsXCJkanZcIl19LFwiaW1hZ2Uvdm5kLmR2Yi5zdWJ0aXRsZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInN1YlwiXX0sXCJpbWFnZS92bmQuZHdnXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZHdnXCJdfSxcImltYWdlL3ZuZC5keGZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJkeGZcIl19LFwiaW1hZ2Uvdm5kLmZhc3RiaWRzaGVldFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImZic1wiXX0sXCJpbWFnZS92bmQuZnB4XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZnB4XCJdfSxcImltYWdlL3ZuZC5mc3RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJmc3RcIl19LFwiaW1hZ2Uvdm5kLmZ1aml4ZXJveC5lZG1pY3MtbW1yXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibW1yXCJdfSxcImltYWdlL3ZuZC5mdWppeGVyb3guZWRtaWNzLXJsY1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInJsY1wiXX0sXCJpbWFnZS92bmQuZ2xvYmFsZ3JhcGhpY3MucGdiXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiaW1hZ2Uvdm5kLm1pY3Jvc29mdC5pY29uXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiaW1hZ2Uvdm5kLm1peFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImltYWdlL3ZuZC5tb3ppbGxhLmFwbmdcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJpbWFnZS92bmQubXMtbW9kaVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm1kaVwiXX0sXCJpbWFnZS92bmQubXMtcGhvdG9cIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcIndkcFwiXX0sXCJpbWFnZS92bmQubmV0LWZweFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIm5weFwiXX0sXCJpbWFnZS92bmQucmFkaWFuY2VcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJpbWFnZS92bmQuc2VhbGVkLnBuZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImltYWdlL3ZuZC5zZWFsZWRtZWRpYS5zb2Z0c2VhbC5naWZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJpbWFnZS92bmQuc2VhbGVkbWVkaWEuc29mdHNlYWwuanBnXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwiaW1hZ2Uvdm5kLnN2ZlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImltYWdlL3ZuZC50ZW5jZW50LnRhcFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImltYWdlL3ZuZC52YWx2ZS5zb3VyY2UudGV4dHVyZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImltYWdlL3ZuZC53YXAud2JtcFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIndibXBcIl19LFwiaW1hZ2Uvdm5kLnhpZmZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ4aWZcIl19LFwiaW1hZ2Uvdm5kLnpicnVzaC5wY3hcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJpbWFnZS93ZWJwXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJ3ZWJwXCJdfSxcImltYWdlL3dtZlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcImltYWdlL3gtM2RzXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCIzZHNcIl19LFwiaW1hZ2UveC1jbXUtcmFzdGVyXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJyYXNcIl19LFwiaW1hZ2UveC1jbXhcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImNteFwiXX0sXCJpbWFnZS94LWZyZWVoYW5kXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJmaFwiLFwiZmhjXCIsXCJmaDRcIixcImZoNVwiLFwiZmg3XCJdfSxcImltYWdlL3gtaWNvblwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcImljb1wiXX0sXCJpbWFnZS94LWpuZ1wiOntcInNvdXJjZVwiOlwibmdpbnhcIixcImV4dGVuc2lvbnNcIjpbXCJqbmdcIl19LFwiaW1hZ2UveC1tcnNpZC1pbWFnZVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic2lkXCJdfSxcImltYWdlL3gtbXMtYm1wXCI6e1wic291cmNlXCI6XCJuZ2lueFwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJibXBcIl19LFwiaW1hZ2UveC1wY3hcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInBjeFwiXX0sXCJpbWFnZS94LXBpY3RcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInBpY1wiLFwicGN0XCJdfSxcImltYWdlL3gtcG9ydGFibGUtYW55bWFwXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJwbm1cIl19LFwiaW1hZ2UveC1wb3J0YWJsZS1iaXRtYXBcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInBibVwiXX0sXCJpbWFnZS94LXBvcnRhYmxlLWdyYXltYXBcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInBnbVwiXX0sXCJpbWFnZS94LXBvcnRhYmxlLXBpeG1hcFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wicHBtXCJdfSxcImltYWdlL3gtcmdiXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJyZ2JcIl19LFwiaW1hZ2UveC10Z2FcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInRnYVwiXX0sXCJpbWFnZS94LXhiaXRtYXBcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInhibVwiXX0sXCJpbWFnZS94LXhjZlwiOntcImNvbXByZXNzaWJsZVwiOmZhbHNlfSxcImltYWdlL3gteHBpeG1hcFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wieHBtXCJdfSxcImltYWdlL3gteHdpbmRvd2R1bXBcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInh3ZFwiXX0sXCJtZXNzYWdlL2NwaW1cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1c1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcIm1lc3NhZ2UvZGlzcG9zaXRpb24tbm90aWZpY2F0aW9uXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZGlzcG9zaXRpb24tbm90aWZpY2F0aW9uXCJdfSxcIm1lc3NhZ2UvZXh0ZXJuYWwtYm9keVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcIm1lc3NhZ2UvZmVlZGJhY2stcmVwb3J0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwibWVzc2FnZS9nbG9iYWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ1OG1zZ1wiXX0sXCJtZXNzYWdlL2dsb2JhbC1kZWxpdmVyeS1zdGF0dXNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ1OGRzblwiXX0sXCJtZXNzYWdlL2dsb2JhbC1kaXNwb3NpdGlvbi1ub3RpZmljYXRpb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ1OG1kblwiXX0sXCJtZXNzYWdlL2dsb2JhbC1oZWFkZXJzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widThoZHJcIl19LFwibWVzc2FnZS9odHRwXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZX0sXCJtZXNzYWdlL2ltZG4reG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlfSxcIm1lc3NhZ2UvbmV3c1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcIm1lc3NhZ2UvcGFydGlhbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2V9LFwibWVzc2FnZS9yZmM4MjJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wiZW1sXCIsXCJtaW1lXCJdfSxcIm1lc3NhZ2Uvcy1odHRwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwibWVzc2FnZS9zaXBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJtZXNzYWdlL3NpcGZyYWdcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJtZXNzYWdlL3RyYWNraW5nLXN0YXR1c1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcIm1lc3NhZ2Uvdm5kLnNpLnNpbXBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJtZXNzYWdlL3ZuZC53ZmEud3NjXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wid3NjXCJdfSxcIm1vZGVsLzNtZlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcIm1vZGVsL2dsdGYranNvblwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJnbHRmXCJdfSxcIm1vZGVsL2dsdGYtYmluYXJ5XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcImdsYlwiXX0sXCJtb2RlbC9pZ2VzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJpZ3NcIixcImlnZXNcIl19LFwibW9kZWwvbWVzaFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wibXNoXCIsXCJtZXNoXCIsXCJzaWxvXCJdfSxcIm1vZGVsL3ZuZC5jb2xsYWRhK3htbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImRhZVwiXX0sXCJtb2RlbC92bmQuZHdmXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZHdmXCJdfSxcIm1vZGVsL3ZuZC5mbGF0bGFuZC4zZG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwibW9kZWwvdm5kLmdkbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImdkbFwiXX0sXCJtb2RlbC92bmQuZ3MtZ2RsXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIn0sXCJtb2RlbC92bmQuZ3MuZ2RsXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwibW9kZWwvdm5kLmd0d1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImd0d1wiXX0sXCJtb2RlbC92bmQubW9tbCt4bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJtb2RlbC92bmQubXRzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibXRzXCJdfSxcIm1vZGVsL3ZuZC5vcGVuZ2V4XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwibW9kZWwvdm5kLnBhcmFzb2xpZC50cmFuc21pdC5iaW5hcnlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJtb2RlbC92bmQucGFyYXNvbGlkLnRyYW5zbWl0LnRleHRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJtb2RlbC92bmQucm9zZXR0ZS5hbm5vdGF0ZWQtZGF0YS1tb2RlbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcIm1vZGVsL3ZuZC52YWx2ZS5zb3VyY2UuY29tcGlsZWQtbWFwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwibW9kZWwvdm5kLnZ0dVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInZ0dVwiXX0sXCJtb2RlbC92cm1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJ3cmxcIixcInZybWxcIl19LFwibW9kZWwveDNkK2JpbmFyeVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJ4M2RiXCIsXCJ4M2RielwiXX0sXCJtb2RlbC94M2QrZmFzdGluZm9zZXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJtb2RlbC94M2QrdnJtbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJ4M2R2XCIsXCJ4M2R2elwiXX0sXCJtb2RlbC94M2QreG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcIngzZFwiLFwieDNkelwiXX0sXCJtb2RlbC94M2QtdnJtbFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcIm11bHRpcGFydC9hbHRlcm5hdGl2ZVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2V9LFwibXVsdGlwYXJ0L2FwcGxlZG91YmxlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwibXVsdGlwYXJ0L2J5dGVyYW5nZXNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJtdWx0aXBhcnQvZGlnZXN0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwibXVsdGlwYXJ0L2VuY3J5cHRlZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2V9LFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2V9LFwibXVsdGlwYXJ0L2hlYWRlci1zZXRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJtdWx0aXBhcnQvbWl4ZWRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlfSxcIm11bHRpcGFydC9tdWx0aWxpbmd1YWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJtdWx0aXBhcnQvcGFyYWxsZWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJtdWx0aXBhcnQvcmVsYXRlZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2V9LFwibXVsdGlwYXJ0L3JlcG9ydFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcIm11bHRpcGFydC9zaWduZWRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlfSxcIm11bHRpcGFydC92bmQuYmludC5tZWQtcGx1c1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcIm11bHRpcGFydC92b2ljZS1tZXNzYWdlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwibXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvMWQtaW50ZXJsZWF2ZWQtcGFyaXR5ZmVjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC9jYWNoZS1tYW5pZmVzdFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJhcHBjYWNoZVwiLFwibWFuaWZlc3RcIl19LFwidGV4dC9jYWxlbmRhclwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImljc1wiLFwiaWZiXCJdfSxcInRleHQvY2FsZW5kZXJcIjp7XCJjb21wcmVzc2libGVcIjp0cnVlfSxcInRleHQvY21kXCI6e1wiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJ0ZXh0L2NvZmZlZXNjcmlwdFwiOntcImV4dGVuc2lvbnNcIjpbXCJjb2ZmZWVcIixcImxpdGNvZmZlZVwiXX0sXCJ0ZXh0L2Nzc1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY2hhcnNldFwiOlwiVVRGLThcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wiY3NzXCJdfSxcInRleHQvY3N2XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcImNzdlwiXX0sXCJ0ZXh0L2Nzdi1zY2hlbWFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ0ZXh0L2RpcmVjdG9yeVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvZG5zXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC9lY21hc2NyaXB0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC9lbmNhcHJ0cFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvZW5yaWNoZWRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ0ZXh0L2Z3ZHJlZFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvZ3JhbW1hci1yZWYtbGlzdFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvaHRtbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJodG1sXCIsXCJodG1cIixcInNodG1sXCJdfSxcInRleHQvamFkZVwiOntcImV4dGVuc2lvbnNcIjpbXCJqYWRlXCJdfSxcInRleHQvamF2YXNjcmlwdFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZX0sXCJ0ZXh0L2pjci1jbmRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ0ZXh0L2pzeFwiOntcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wianN4XCJdfSxcInRleHQvbGVzc1wiOntcImV4dGVuc2lvbnNcIjpbXCJsZXNzXCJdfSxcInRleHQvbWFya2Rvd25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wibWFya2Rvd25cIixcIm1kXCJdfSxcInRleHQvbWF0aG1sXCI6e1wic291cmNlXCI6XCJuZ2lueFwiLFwiZXh0ZW5zaW9uc1wiOltcIm1tbFwiXX0sXCJ0ZXh0L21pemFyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC9uM1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJuM1wiXX0sXCJ0ZXh0L3BhcmFtZXRlcnNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ0ZXh0L3Bhcml0eWZlY1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvcGxhaW5cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1widHh0XCIsXCJ0ZXh0XCIsXCJjb25mXCIsXCJkZWZcIixcImxpc3RcIixcImxvZ1wiLFwiaW5cIixcImluaVwiXX0sXCJ0ZXh0L3Byb3ZlbmFuY2Utbm90YXRpb25cIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ0ZXh0L3Bycy5mYWxsZW5zdGVpbi5yc3RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ0ZXh0L3Bycy5saW5lcy50YWdcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJkc2NcIl19LFwidGV4dC9wcnMucHJvcC5sb2dpY1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvcmFwdG9yZmVjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC9yZWRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ0ZXh0L3JmYzgyMi1oZWFkZXJzXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC9yaWNodGV4dFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJydHhcIl19LFwidGV4dC9ydGZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wicnRmXCJdfSxcInRleHQvcnRwLWVuYy1hZXNjbTEyOFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvcnRwbG9vcGJhY2tcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ0ZXh0L3J0eFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvc2dtbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInNnbWxcIixcInNnbVwiXX0sXCJ0ZXh0L3NoZXhcIjp7XCJleHRlbnNpb25zXCI6W1wic2hleFwiXX0sXCJ0ZXh0L3NsaW1cIjp7XCJleHRlbnNpb25zXCI6W1wic2xpbVwiLFwic2xtXCJdfSxcInRleHQvc3RyaW5nc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvc3R5bHVzXCI6e1wiZXh0ZW5zaW9uc1wiOltcInN0eWx1c1wiLFwic3R5bFwiXX0sXCJ0ZXh0L3QxNDBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcInRzdlwiXX0sXCJ0ZXh0L3Ryb2ZmXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widFwiLFwidHJcIixcInJvZmZcIixcIm1hblwiLFwibWVcIixcIm1zXCJdfSxcInRleHQvdHVydGxlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widHRsXCJdfSxcInRleHQvdWxwZmVjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC91cmktbGlzdFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJ1cmlcIixcInVyaXNcIixcInVybHNcIl19LFwidGV4dC92Y2FyZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJ2Y2FyZFwiXX0sXCJ0ZXh0L3ZuZC5hXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC92bmQuYWJjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC92bmQuYXNjaWktYXJ0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC92bmQuY3VybFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImN1cmxcIl19LFwidGV4dC92bmQuY3VybC5kY3VybFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiZGN1cmxcIl19LFwidGV4dC92bmQuY3VybC5tY3VybFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wibWN1cmxcIl19LFwidGV4dC92bmQuY3VybC5zY3VybFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic2N1cmxcIl19LFwidGV4dC92bmQuZGViaWFuLmNvcHlyaWdodFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvdm5kLmRtY2xpZW50c2NyaXB0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC92bmQuZHZiLnN1YnRpdGxlXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wic3ViXCJdfSxcInRleHQvdm5kLmVzbWVydGVjLnRoZW1lLWRlc2NyaXB0b3JcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ0ZXh0L3ZuZC5mbHlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJmbHlcIl19LFwidGV4dC92bmQuZm1pLmZsZXhzdG9yXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZmx4XCJdfSxcInRleHQvdm5kLmdyYXBodml6XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiZ3ZcIl19LFwidGV4dC92bmQuaW4zZC4zZG1sXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiM2RtbFwiXX0sXCJ0ZXh0L3ZuZC5pbjNkLnNwb3RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJzcG90XCJdfSxcInRleHQvdm5kLmlwdGMubmV3c21sXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC92bmQuaXB0Yy5uaXRmXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC92bmQubGF0ZXgtelwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvdm5kLm1vdG9yb2xhLnJlZmxleFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvdm5kLm1zLW1lZGlhcGFja2FnZVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInRleHQvdm5kLm5ldDJwaG9uZS5jb21tY2VudGVyLmNvbW1hbmRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ0ZXh0L3ZuZC5yYWRpc3lzLm1zbWwtYmFzaWMtbGF5b3V0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC92bmQuc2kudXJpY2F0YWxvZ3VlXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC92bmQuc3VuLmoybWUuYXBwLWRlc2NyaXB0b3JcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJqYWRcIl19LFwidGV4dC92bmQudHJvbGx0ZWNoLmxpbmd1aXN0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC92bmQud2FwLnNpXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC92bmQud2FwLnNsXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidGV4dC92bmQud2FwLndtbFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcIndtbFwiXX0sXCJ0ZXh0L3ZuZC53YXAud21sc2NyaXB0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wid21sc1wiXX0sXCJ0ZXh0L3Z0dFwiOntcImNoYXJzZXRcIjpcIlVURi04XCIsXCJjb21wcmVzc2libGVcIjp0cnVlLFwiZXh0ZW5zaW9uc1wiOltcInZ0dFwiXX0sXCJ0ZXh0L3gtYXNtXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJzXCIsXCJhc21cIl19LFwidGV4dC94LWNcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImNcIixcImNjXCIsXCJjeHhcIixcImNwcFwiLFwiaFwiLFwiaGhcIixcImRpY1wiXX0sXCJ0ZXh0L3gtY29tcG9uZW50XCI6e1wic291cmNlXCI6XCJuZ2lueFwiLFwiZXh0ZW5zaW9uc1wiOltcImh0Y1wiXX0sXCJ0ZXh0L3gtZm9ydHJhblwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiZlwiLFwiZm9yXCIsXCJmNzdcIixcImY5MFwiXX0sXCJ0ZXh0L3gtZ3d0LXJwY1wiOntcImNvbXByZXNzaWJsZVwiOnRydWV9LFwidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGVcIjp7XCJleHRlbnNpb25zXCI6W1wiaGJzXCJdfSxcInRleHQveC1qYXZhLXNvdXJjZVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiamF2YVwiXX0sXCJ0ZXh0L3gtanF1ZXJ5LXRtcGxcIjp7XCJjb21wcmVzc2libGVcIjp0cnVlfSxcInRleHQveC1sdWFcIjp7XCJleHRlbnNpb25zXCI6W1wibHVhXCJdfSxcInRleHQveC1tYXJrZG93blwiOntcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wibWtkXCJdfSxcInRleHQveC1uZm9cIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcIm5mb1wiXX0sXCJ0ZXh0L3gtb3BtbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wib3BtbFwiXX0sXCJ0ZXh0L3gtb3JnXCI6e1wiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJvcmdcIl19LFwidGV4dC94LXBhc2NhbFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wicFwiLFwicGFzXCJdfSxcInRleHQveC1wcm9jZXNzaW5nXCI6e1wiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJwZGVcIl19LFwidGV4dC94LXNhc3NcIjp7XCJleHRlbnNpb25zXCI6W1wic2Fzc1wiXX0sXCJ0ZXh0L3gtc2Nzc1wiOntcImV4dGVuc2lvbnNcIjpbXCJzY3NzXCJdfSxcInRleHQveC1zZXRleHRcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImV0eFwiXX0sXCJ0ZXh0L3gtc2Z2XCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJzZnZcIl19LFwidGV4dC94LXN1c2UteW1wXCI6e1wiY29tcHJlc3NpYmxlXCI6dHJ1ZSxcImV4dGVuc2lvbnNcIjpbXCJ5bXBcIl19LFwidGV4dC94LXV1ZW5jb2RlXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJ1dVwiXX0sXCJ0ZXh0L3gtdmNhbGVuZGFyXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJ2Y3NcIl19LFwidGV4dC94LXZjYXJkXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJ2Y2ZcIl19LFwidGV4dC94bWxcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOnRydWUsXCJleHRlbnNpb25zXCI6W1wieG1sXCJdfSxcInRleHQveG1sLWV4dGVybmFsLXBhcnNlZC1lbnRpdHlcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ0ZXh0L3lhbWxcIjp7XCJleHRlbnNpb25zXCI6W1wieWFtbFwiLFwieW1sXCJdfSxcInZpZGVvLzFkLWludGVybGVhdmVkLXBhcml0eWZlY1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvLzNncHBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCIzZ3BcIixcIjNncHBcIl19LFwidmlkZW8vM2dwcC10dFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvLzNncHAyXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wiM2cyXCJdfSxcInZpZGVvL2JtcGVnXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vYnQ2NTZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby9jZWxiXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vZHZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby9lbmNhcHJ0cFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL2gyNjFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJoMjYxXCJdfSxcInZpZGVvL2gyNjNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJoMjYzXCJdfSxcInZpZGVvL2gyNjMtMTk5OFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL2gyNjMtMjAwMFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL2gyNjRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJoMjY0XCJdfSxcInZpZGVvL2gyNjQtcmNkb1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL2gyNjQtc3ZjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vaDI2NVwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL2lzby5zZWdtZW50XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vanBlZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImpwZ3ZcIl19LFwidmlkZW8vanBlZzIwMDBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby9qcG1cIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImpwbVwiLFwianBnbVwiXX0sXCJ2aWRlby9tajJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJtajJcIixcIm1qcDJcIl19LFwidmlkZW8vbXAxc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL21wMnBcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby9tcDJ0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1widHNcIl19LFwidmlkZW8vbXA0XCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJtcDRcIixcIm1wNHZcIixcIm1wZzRcIl19LFwidmlkZW8vbXA0di1lc1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL21wZWdcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcIm1wZWdcIixcIm1wZ1wiLFwibXBlXCIsXCJtMXZcIixcIm0ydlwiXX0sXCJ2aWRlby9tcGVnNC1nZW5lcmljXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vbXB2XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vbnZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby9vZ2dcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcIm9ndlwiXX0sXCJ2aWRlby9wYXJpdHlmZWNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby9wb2ludGVyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vcXVpY2t0aW1lXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJxdFwiLFwibW92XCJdfSxcInZpZGVvL3JhcHRvcmZlY1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL3Jhd1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL3J0cC1lbmMtYWVzY20xMjhcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby9ydHBsb29wYmFja1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL3J0eFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL3NtcHRlMjkxXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vc21wdGUyOTJtXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdWxwZmVjXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdmMxXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLmNjdHZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby92bmQuZGVjZS5oZFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInV2aFwiLFwidXZ2aFwiXX0sXCJ2aWRlby92bmQuZGVjZS5tb2JpbGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ1dm1cIixcInV2dm1cIl19LFwidmlkZW8vdm5kLmRlY2UubXA0XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLmRlY2UucGRcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ1dnBcIixcInV2dnBcIl19LFwidmlkZW8vdm5kLmRlY2Uuc2RcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ1dnNcIixcInV2dnNcIl19LFwidmlkZW8vdm5kLmRlY2UudmlkZW9cIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJ1dnZcIixcInV2dnZcIl19LFwidmlkZW8vdm5kLmRpcmVjdHYubXBlZ1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL3ZuZC5kaXJlY3R2Lm1wZWctdHRzXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLmRsbmEubXBlZy10dHNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby92bmQuZHZiLmZpbGVcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJkdmJcIl19LFwidmlkZW8vdm5kLmZ2dFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcImZ2dFwiXX0sXCJ2aWRlby92bmQuaG5zLnZpZGVvXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLmlwdHZmb3J1bS4xZHBhcml0eWZlYy0xMDEwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLmlwdHZmb3J1bS4xZHBhcml0eWZlYy0yMDA1XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLmlwdHZmb3J1bS4yZHBhcml0eWZlYy0xMDEwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLmlwdHZmb3J1bS4yZHBhcml0eWZlYy0yMDA1XCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLmlwdHZmb3J1bS50dHNhdmNcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby92bmQuaXB0dmZvcnVtLnR0c21wZWcyXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLm1vdG9yb2xhLnZpZGVvXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLm1vdG9yb2xhLnZpZGVvcFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL3ZuZC5tcGVndXJsXCI6e1wic291cmNlXCI6XCJpYW5hXCIsXCJleHRlbnNpb25zXCI6W1wibXh1XCIsXCJtNHVcIl19LFwidmlkZW8vdm5kLm1zLXBsYXlyZWFkeS5tZWRpYS5weXZcIjp7XCJzb3VyY2VcIjpcImlhbmFcIixcImV4dGVuc2lvbnNcIjpbXCJweXZcIl19LFwidmlkZW8vdm5kLm5va2lhLmludGVybGVhdmVkLW11bHRpbWVkaWFcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby92bmQubm9raWEubXA0dnJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby92bmQubm9raWEudmlkZW92b2lwXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLm9iamVjdHZpZGVvXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLnJhZGdhbWV0dG9vbHMuYmlua1wiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL3ZuZC5yYWRnYW1ldHRvb2xzLnNtYWNrZXJcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby92bmQuc2VhbGVkLm1wZWcxXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLnNlYWxlZC5tcGVnNFwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL3ZuZC5zZWFsZWQuc3dmXCI6e1wic291cmNlXCI6XCJpYW5hXCJ9LFwidmlkZW8vdm5kLnNlYWxlZG1lZGlhLnNvZnRzZWFsLm1vdlwiOntcInNvdXJjZVwiOlwiaWFuYVwifSxcInZpZGVvL3ZuZC51dnZ1Lm1wNFwiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInV2dVwiLFwidXZ2dVwiXX0sXCJ2aWRlby92bmQudml2b1wiOntcInNvdXJjZVwiOlwiaWFuYVwiLFwiZXh0ZW5zaW9uc1wiOltcInZpdlwiXX0sXCJ2aWRlby92cDhcIjp7XCJzb3VyY2VcIjpcImlhbmFcIn0sXCJ2aWRlby93ZWJtXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcIndlYm1cIl19LFwidmlkZW8veC1mNHZcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcImY0dlwiXX0sXCJ2aWRlby94LWZsaVwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiZmxpXCJdfSxcInZpZGVvL3gtZmx2XCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImNvbXByZXNzaWJsZVwiOmZhbHNlLFwiZXh0ZW5zaW9uc1wiOltcImZsdlwiXX0sXCJ2aWRlby94LW00dlwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wibTR2XCJdfSxcInZpZGVvL3gtbWF0cm9za2FcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiY29tcHJlc3NpYmxlXCI6ZmFsc2UsXCJleHRlbnNpb25zXCI6W1wibWt2XCIsXCJtazNkXCIsXCJta3NcIl19LFwidmlkZW8veC1tbmdcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcIm1uZ1wiXX0sXCJ2aWRlby94LW1zLWFzZlwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiYXNmXCIsXCJhc3hcIl19LFwidmlkZW8veC1tcy12b2JcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcInZvYlwiXX0sXCJ2aWRlby94LW1zLXdtXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJ3bVwiXX0sXCJ2aWRlby94LW1zLXdtdlwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJjb21wcmVzc2libGVcIjpmYWxzZSxcImV4dGVuc2lvbnNcIjpbXCJ3bXZcIl19LFwidmlkZW8veC1tcy13bXhcIjp7XCJzb3VyY2VcIjpcImFwYWNoZVwiLFwiZXh0ZW5zaW9uc1wiOltcIndteFwiXX0sXCJ2aWRlby94LW1zLXd2eFwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wid3Z4XCJdfSxcInZpZGVvL3gtbXN2aWRlb1wiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wiYXZpXCJdfSxcInZpZGVvL3gtc2dpLW1vdmllXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJtb3ZpZVwiXX0sXCJ2aWRlby94LXNtdlwiOntcInNvdXJjZVwiOlwiYXBhY2hlXCIsXCJleHRlbnNpb25zXCI6W1wic212XCJdfSxcIngtY29uZmVyZW5jZS94LWNvb2x0YWxrXCI6e1wic291cmNlXCI6XCJhcGFjaGVcIixcImV4dGVuc2lvbnNcIjpbXCJpY2VcIl19LFwieC1zaGFkZXIveC1mcmFnbWVudFwiOntcImNvbXByZXNzaWJsZVwiOnRydWV9LFwieC1zaGFkZXIveC12ZXJ0ZXhcIjp7XCJjb21wcmVzc2libGVcIjp0cnVlfX1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvbWltZS1kYi9kYi5qc29uXG4vLyBtb2R1bGUgaWQgPSAxNTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBib2R5LXBhcnNlclxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgYnl0ZXMgPSByZXF1aXJlKCdieXRlcycpXG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdib2R5LXBhcnNlcjpyYXcnKVxudmFyIHJlYWQgPSByZXF1aXJlKCcuLi9yZWFkJylcbnZhciB0eXBlaXMgPSByZXF1aXJlKCd0eXBlLWlzJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJhd1xuXG4vKipcbiAqIENyZWF0ZSBhIG1pZGRsZXdhcmUgdG8gcGFyc2UgcmF3IGJvZGllcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcmF3IChvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fVxuXG4gIHZhciBpbmZsYXRlID0gb3B0cy5pbmZsYXRlICE9PSBmYWxzZVxuICB2YXIgbGltaXQgPSB0eXBlb2Ygb3B0cy5saW1pdCAhPT0gJ251bWJlcidcbiAgICA/IGJ5dGVzLnBhcnNlKG9wdHMubGltaXQgfHwgJzEwMGtiJylcbiAgICA6IG9wdHMubGltaXRcbiAgdmFyIHR5cGUgPSBvcHRzLnR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgdmFyIHZlcmlmeSA9IG9wdHMudmVyaWZ5IHx8IGZhbHNlXG5cbiAgaWYgKHZlcmlmeSAhPT0gZmFsc2UgJiYgdHlwZW9mIHZlcmlmeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiB2ZXJpZnkgbXVzdCBiZSBmdW5jdGlvbicpXG4gIH1cblxuICAvLyBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25cbiAgdmFyIHNob3VsZFBhcnNlID0gdHlwZW9mIHR5cGUgIT09ICdmdW5jdGlvbidcbiAgICA/IHR5cGVDaGVja2VyKHR5cGUpXG4gICAgOiB0eXBlXG5cbiAgZnVuY3Rpb24gcGFyc2UgKGJ1Zikge1xuICAgIHJldHVybiBidWZcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiByYXdQYXJzZXIgKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgaWYgKHJlcS5fYm9keSkge1xuICAgICAgZGVidWcoJ2JvZHkgYWxyZWFkeSBwYXJzZWQnKVxuICAgICAgbmV4dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXEuYm9keSA9IHJlcS5ib2R5IHx8IHt9XG5cbiAgICAvLyBza2lwIHJlcXVlc3RzIHdpdGhvdXQgYm9kaWVzXG4gICAgaWYgKCF0eXBlaXMuaGFzQm9keShyZXEpKSB7XG4gICAgICBkZWJ1Zygnc2tpcCBlbXB0eSBib2R5JylcbiAgICAgIG5leHQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZGVidWcoJ2NvbnRlbnQtdHlwZSAlaicsIHJlcS5oZWFkZXJzWydjb250ZW50LXR5cGUnXSlcblxuICAgIC8vIGRldGVybWluZSBpZiByZXF1ZXN0IHNob3VsZCBiZSBwYXJzZWRcbiAgICBpZiAoIXNob3VsZFBhcnNlKHJlcSkpIHtcbiAgICAgIGRlYnVnKCdza2lwIHBhcnNpbmcnKVxuICAgICAgbmV4dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyByZWFkXG4gICAgcmVhZChyZXEsIHJlcywgbmV4dCwgcGFyc2UsIGRlYnVnLCB7XG4gICAgICBlbmNvZGluZzogbnVsbCxcbiAgICAgIGluZmxhdGU6IGluZmxhdGUsXG4gICAgICBsaW1pdDogbGltaXQsXG4gICAgICB2ZXJpZnk6IHZlcmlmeVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNpbXBsZSB0eXBlIGNoZWNrZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICovXG5cbmZ1bmN0aW9uIHR5cGVDaGVja2VyICh0eXBlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjaGVja1R5cGUgKHJlcSkge1xuICAgIHJldHVybiBCb29sZWFuKHR5cGVpcyhyZXEsIHR5cGUpKVxuICB9XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvYm9keS1wYXJzZXIvbGliL3R5cGVzL3Jhdy5qc1xuLy8gbW9kdWxlIGlkID0gMTU1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogYm9keS1wYXJzZXJcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIGJ5dGVzID0gcmVxdWlyZSgnYnl0ZXMnKVxudmFyIGNvbnRlbnRUeXBlID0gcmVxdWlyZSgnY29udGVudC10eXBlJylcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2JvZHktcGFyc2VyOnRleHQnKVxudmFyIHJlYWQgPSByZXF1aXJlKCcuLi9yZWFkJylcbnZhciB0eXBlaXMgPSByZXF1aXJlKCd0eXBlLWlzJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHRleHRcblxuLyoqXG4gKiBDcmVhdGUgYSBtaWRkbGV3YXJlIHRvIHBhcnNlIHRleHQgYm9kaWVzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiB0ZXh0IChvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fVxuXG4gIHZhciBkZWZhdWx0Q2hhcnNldCA9IG9wdHMuZGVmYXVsdENoYXJzZXQgfHwgJ3V0Zi04J1xuICB2YXIgaW5mbGF0ZSA9IG9wdHMuaW5mbGF0ZSAhPT0gZmFsc2VcbiAgdmFyIGxpbWl0ID0gdHlwZW9mIG9wdHMubGltaXQgIT09ICdudW1iZXInXG4gICAgPyBieXRlcy5wYXJzZShvcHRzLmxpbWl0IHx8ICcxMDBrYicpXG4gICAgOiBvcHRzLmxpbWl0XG4gIHZhciB0eXBlID0gb3B0cy50eXBlIHx8ICd0ZXh0L3BsYWluJ1xuICB2YXIgdmVyaWZ5ID0gb3B0cy52ZXJpZnkgfHwgZmFsc2VcblxuICBpZiAodmVyaWZ5ICE9PSBmYWxzZSAmJiB0eXBlb2YgdmVyaWZ5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHZlcmlmeSBtdXN0IGJlIGZ1bmN0aW9uJylcbiAgfVxuXG4gIC8vIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBjaGVja2luZyBmdW5jdGlvblxuICB2YXIgc2hvdWxkUGFyc2UgPSB0eXBlb2YgdHlwZSAhPT0gJ2Z1bmN0aW9uJ1xuICAgID8gdHlwZUNoZWNrZXIodHlwZSlcbiAgICA6IHR5cGVcblxuICBmdW5jdGlvbiBwYXJzZSAoYnVmKSB7XG4gICAgcmV0dXJuIGJ1ZlxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHRleHRQYXJzZXIgKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgaWYgKHJlcS5fYm9keSkge1xuICAgICAgZGVidWcoJ2JvZHkgYWxyZWFkeSBwYXJzZWQnKVxuICAgICAgbmV4dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICByZXEuYm9keSA9IHJlcS5ib2R5IHx8IHt9XG5cbiAgICAvLyBza2lwIHJlcXVlc3RzIHdpdGhvdXQgYm9kaWVzXG4gICAgaWYgKCF0eXBlaXMuaGFzQm9keShyZXEpKSB7XG4gICAgICBkZWJ1Zygnc2tpcCBlbXB0eSBib2R5JylcbiAgICAgIG5leHQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZGVidWcoJ2NvbnRlbnQtdHlwZSAlaicsIHJlcS5oZWFkZXJzWydjb250ZW50LXR5cGUnXSlcblxuICAgIC8vIGRldGVybWluZSBpZiByZXF1ZXN0IHNob3VsZCBiZSBwYXJzZWRcbiAgICBpZiAoIXNob3VsZFBhcnNlKHJlcSkpIHtcbiAgICAgIGRlYnVnKCdza2lwIHBhcnNpbmcnKVxuICAgICAgbmV4dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgY2hhcnNldFxuICAgIHZhciBjaGFyc2V0ID0gZ2V0Q2hhcnNldChyZXEpIHx8IGRlZmF1bHRDaGFyc2V0XG5cbiAgICAvLyByZWFkXG4gICAgcmVhZChyZXEsIHJlcywgbmV4dCwgcGFyc2UsIGRlYnVnLCB7XG4gICAgICBlbmNvZGluZzogY2hhcnNldCxcbiAgICAgIGluZmxhdGU6IGluZmxhdGUsXG4gICAgICBsaW1pdDogbGltaXQsXG4gICAgICB2ZXJpZnk6IHZlcmlmeVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNoYXJzZXQgb2YgYSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXFcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldENoYXJzZXQgKHJlcSkge1xuICB0cnkge1xuICAgIHJldHVybiAoY29udGVudFR5cGUucGFyc2UocmVxKS5wYXJhbWV0ZXJzLmNoYXJzZXQgfHwgJycpLnRvTG93ZXJDYXNlKClcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgc2ltcGxlIHR5cGUgY2hlY2tlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKi9cblxuZnVuY3Rpb24gdHlwZUNoZWNrZXIgKHR5cGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNoZWNrVHlwZSAocmVxKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odHlwZWlzKHJlcSwgdHlwZSkpXG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9saWIvdHlwZXMvdGV4dC5qc1xuLy8gbW9kdWxlIGlkID0gMTU2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogYm9keS1wYXJzZXJcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGJ5dGVzID0gcmVxdWlyZSgnYnl0ZXMnKVxudmFyIGNvbnRlbnRUeXBlID0gcmVxdWlyZSgnY29udGVudC10eXBlJylcbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJ2h0dHAtZXJyb3JzJylcbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2JvZHktcGFyc2VyOnVybGVuY29kZWQnKVxudmFyIGRlcHJlY2F0ZSA9IHJlcXVpcmUoJ2RlcGQnKSgnYm9keS1wYXJzZXInKVxudmFyIHJlYWQgPSByZXF1aXJlKCcuLi9yZWFkJylcbnZhciB0eXBlaXMgPSByZXF1aXJlKCd0eXBlLWlzJylcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVybGVuY29kZWRcblxuLyoqXG4gKiBDYWNoZSBvZiBwYXJzZXIgbW9kdWxlcy5cbiAqL1xuXG52YXIgcGFyc2VycyA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuLyoqXG4gKiBDcmVhdGUgYSBtaWRkbGV3YXJlIHRvIHBhcnNlIHVybGVuY29kZWQgYm9kaWVzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHVybGVuY29kZWQgKG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9XG5cbiAgLy8gbm90aWNlIGJlY2F1c2Ugb3B0aW9uIGRlZmF1bHQgd2lsbCBmbGlwIGluIG5leHQgbWFqb3JcbiAgaWYgKG9wdHMuZXh0ZW5kZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIGRlcHJlY2F0ZSgndW5kZWZpbmVkIGV4dGVuZGVkOiBwcm92aWRlIGV4dGVuZGVkIG9wdGlvbicpXG4gIH1cblxuICB2YXIgZXh0ZW5kZWQgPSBvcHRzLmV4dGVuZGVkICE9PSBmYWxzZVxuICB2YXIgaW5mbGF0ZSA9IG9wdHMuaW5mbGF0ZSAhPT0gZmFsc2VcbiAgdmFyIGxpbWl0ID0gdHlwZW9mIG9wdHMubGltaXQgIT09ICdudW1iZXInXG4gICAgPyBieXRlcy5wYXJzZShvcHRzLmxpbWl0IHx8ICcxMDBrYicpXG4gICAgOiBvcHRzLmxpbWl0XG4gIHZhciB0eXBlID0gb3B0cy50eXBlIHx8ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gIHZhciB2ZXJpZnkgPSBvcHRzLnZlcmlmeSB8fCBmYWxzZVxuXG4gIGlmICh2ZXJpZnkgIT09IGZhbHNlICYmIHR5cGVvZiB2ZXJpZnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gdmVyaWZ5IG11c3QgYmUgZnVuY3Rpb24nKVxuICB9XG5cbiAgLy8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBxdWVyeSBwYXJzZXJcbiAgdmFyIHF1ZXJ5cGFyc2UgPSBleHRlbmRlZFxuICAgID8gZXh0ZW5kZWRwYXJzZXIob3B0cylcbiAgICA6IHNpbXBsZXBhcnNlcihvcHRzKVxuXG4gIC8vIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgdHlwZSBjaGVja2luZyBmdW5jdGlvblxuICB2YXIgc2hvdWxkUGFyc2UgPSB0eXBlb2YgdHlwZSAhPT0gJ2Z1bmN0aW9uJ1xuICAgID8gdHlwZUNoZWNrZXIodHlwZSlcbiAgICA6IHR5cGVcblxuICBmdW5jdGlvbiBwYXJzZSAoYm9keSkge1xuICAgIHJldHVybiBib2R5Lmxlbmd0aFxuICAgICAgPyBxdWVyeXBhcnNlKGJvZHkpXG4gICAgICA6IHt9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gdXJsZW5jb2RlZFBhcnNlciAocmVxLCByZXMsIG5leHQpIHtcbiAgICBpZiAocmVxLl9ib2R5KSB7XG4gICAgICBkZWJ1ZygnYm9keSBhbHJlYWR5IHBhcnNlZCcpXG4gICAgICBuZXh0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJlcS5ib2R5ID0gcmVxLmJvZHkgfHwge31cblxuICAgIC8vIHNraXAgcmVxdWVzdHMgd2l0aG91dCBib2RpZXNcbiAgICBpZiAoIXR5cGVpcy5oYXNCb2R5KHJlcSkpIHtcbiAgICAgIGRlYnVnKCdza2lwIGVtcHR5IGJvZHknKVxuICAgICAgbmV4dCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBkZWJ1ZygnY29udGVudC10eXBlICVqJywgcmVxLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKVxuXG4gICAgLy8gZGV0ZXJtaW5lIGlmIHJlcXVlc3Qgc2hvdWxkIGJlIHBhcnNlZFxuICAgIGlmICghc2hvdWxkUGFyc2UocmVxKSkge1xuICAgICAgZGVidWcoJ3NraXAgcGFyc2luZycpXG4gICAgICBuZXh0KClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGFzc2VydCBjaGFyc2V0XG4gICAgdmFyIGNoYXJzZXQgPSBnZXRDaGFyc2V0KHJlcSkgfHwgJ3V0Zi04J1xuICAgIGlmIChjaGFyc2V0ICE9PSAndXRmLTgnKSB7XG4gICAgICBkZWJ1ZygnaW52YWxpZCBjaGFyc2V0JylcbiAgICAgIG5leHQoY3JlYXRlRXJyb3IoNDE1LCAndW5zdXBwb3J0ZWQgY2hhcnNldCBcIicgKyBjaGFyc2V0LnRvVXBwZXJDYXNlKCkgKyAnXCInLCB7XG4gICAgICAgIGNoYXJzZXQ6IGNoYXJzZXQsXG4gICAgICAgIHR5cGU6ICdjaGFyc2V0LnVuc3VwcG9ydGVkJ1xuICAgICAgfSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyByZWFkXG4gICAgcmVhZChyZXEsIHJlcywgbmV4dCwgcGFyc2UsIGRlYnVnLCB7XG4gICAgICBkZWJ1ZzogZGVidWcsXG4gICAgICBlbmNvZGluZzogY2hhcnNldCxcbiAgICAgIGluZmxhdGU6IGluZmxhdGUsXG4gICAgICBsaW1pdDogbGltaXQsXG4gICAgICB2ZXJpZnk6IHZlcmlmeVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGV4dGVuZGVkIHF1ZXJ5IHBhcnNlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICovXG5cbmZ1bmN0aW9uIGV4dGVuZGVkcGFyc2VyIChvcHRpb25zKSB7XG4gIHZhciBwYXJhbWV0ZXJMaW1pdCA9IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgIT09IHVuZGVmaW5lZFxuICAgID8gb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdFxuICAgIDogMTAwMFxuICB2YXIgcGFyc2UgPSBwYXJzZXIoJ3FzJylcblxuICBpZiAoaXNOYU4ocGFyYW1ldGVyTGltaXQpIHx8IHBhcmFtZXRlckxpbWl0IDwgMSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBwYXJhbWV0ZXJMaW1pdCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJylcbiAgfVxuXG4gIGlmIChpc0Zpbml0ZShwYXJhbWV0ZXJMaW1pdCkpIHtcbiAgICBwYXJhbWV0ZXJMaW1pdCA9IHBhcmFtZXRlckxpbWl0IHwgMFxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHF1ZXJ5cGFyc2UgKGJvZHkpIHtcbiAgICB2YXIgcGFyYW1Db3VudCA9IHBhcmFtZXRlckNvdW50KGJvZHksIHBhcmFtZXRlckxpbWl0KVxuXG4gICAgaWYgKHBhcmFtQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVidWcoJ3RvbyBtYW55IHBhcmFtZXRlcnMnKVxuICAgICAgdGhyb3cgY3JlYXRlRXJyb3IoNDEzLCAndG9vIG1hbnkgcGFyYW1ldGVycycsIHtcbiAgICAgICAgdHlwZTogJ3BhcmFtZXRlcnMudG9vLm1hbnknXG4gICAgICB9KVxuICAgIH1cblxuICAgIHZhciBhcnJheUxpbWl0ID0gTWF0aC5tYXgoMTAwLCBwYXJhbUNvdW50KVxuXG4gICAgZGVidWcoJ3BhcnNlIGV4dGVuZGVkIHVybGVuY29kaW5nJylcbiAgICByZXR1cm4gcGFyc2UoYm9keSwge1xuICAgICAgYWxsb3dQcm90b3R5cGVzOiB0cnVlLFxuICAgICAgYXJyYXlMaW1pdDogYXJyYXlMaW1pdCxcbiAgICAgIGRlcHRoOiBJbmZpbml0eSxcbiAgICAgIHBhcmFtZXRlckxpbWl0OiBwYXJhbWV0ZXJMaW1pdFxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGNoYXJzZXQgb2YgYSByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXFcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldENoYXJzZXQgKHJlcSkge1xuICB0cnkge1xuICAgIHJldHVybiAoY29udGVudFR5cGUucGFyc2UocmVxKS5wYXJhbWV0ZXJzLmNoYXJzZXQgfHwgJycpLnRvTG93ZXJDYXNlKClcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycywgc3RvcHBpbmcgb25jZSBsaW1pdCByZWFjaGVkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJvZHlcbiAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyYW1ldGVyQ291bnQgKGJvZHksIGxpbWl0KSB7XG4gIHZhciBjb3VudCA9IDBcbiAgdmFyIGluZGV4ID0gMFxuXG4gIHdoaWxlICgoaW5kZXggPSBib2R5LmluZGV4T2YoJyYnLCBpbmRleCkpICE9PSAtMSkge1xuICAgIGNvdW50KytcbiAgICBpbmRleCsrXG5cbiAgICBpZiAoY291bnQgPT09IGxpbWl0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvdW50XG59XG5cbi8qKlxuICogR2V0IHBhcnNlciBmb3IgbW9kdWxlIG5hbWUgZHluYW1pY2FsbHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VyIChuYW1lKSB7XG4gIHZhciBtb2QgPSBwYXJzZXJzW25hbWVdXG5cbiAgaWYgKG1vZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1vZC5wYXJzZVxuICB9XG5cbiAgLy8gdGhpcyB1c2VzIGEgc3dpdGNoIGZvciBzdGF0aWMgcmVxdWlyZSBhbmFseXNpc1xuICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlICdxcyc6XG4gICAgICBtb2QgPSByZXF1aXJlKCdxcycpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3F1ZXJ5c3RyaW5nJzpcbiAgICAgIG1vZCA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJylcbiAgICAgIGJyZWFrXG4gIH1cblxuICAvLyBzdG9yZSB0byBwcmV2ZW50IGludm9raW5nIHJlcXVpcmUoKVxuICBwYXJzZXJzW25hbWVdID0gbW9kXG5cbiAgcmV0dXJuIG1vZC5wYXJzZVxufVxuXG4vKipcbiAqIEdldCB0aGUgc2ltcGxlIHF1ZXJ5IHBhcnNlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICovXG5cbmZ1bmN0aW9uIHNpbXBsZXBhcnNlciAob3B0aW9ucykge1xuICB2YXIgcGFyYW1ldGVyTGltaXQgPSBvcHRpb25zLnBhcmFtZXRlckxpbWl0ICE9PSB1bmRlZmluZWRcbiAgICA/IG9wdGlvbnMucGFyYW1ldGVyTGltaXRcbiAgICA6IDEwMDBcbiAgdmFyIHBhcnNlID0gcGFyc2VyKCdxdWVyeXN0cmluZycpXG5cbiAgaWYgKGlzTmFOKHBhcmFtZXRlckxpbWl0KSB8fCBwYXJhbWV0ZXJMaW1pdCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gcGFyYW1ldGVyTGltaXQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpXG4gIH1cblxuICBpZiAoaXNGaW5pdGUocGFyYW1ldGVyTGltaXQpKSB7XG4gICAgcGFyYW1ldGVyTGltaXQgPSBwYXJhbWV0ZXJMaW1pdCB8IDBcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBxdWVyeXBhcnNlIChib2R5KSB7XG4gICAgdmFyIHBhcmFtQ291bnQgPSBwYXJhbWV0ZXJDb3VudChib2R5LCBwYXJhbWV0ZXJMaW1pdClcblxuICAgIGlmIChwYXJhbUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlYnVnKCd0b28gbWFueSBwYXJhbWV0ZXJzJylcbiAgICAgIHRocm93IGNyZWF0ZUVycm9yKDQxMywgJ3RvbyBtYW55IHBhcmFtZXRlcnMnLCB7XG4gICAgICAgIHR5cGU6ICdwYXJhbWV0ZXJzLnRvby5tYW55J1xuICAgICAgfSlcbiAgICB9XG5cbiAgICBkZWJ1ZygncGFyc2UgdXJsZW5jb2RpbmcnKVxuICAgIHJldHVybiBwYXJzZShib2R5LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwge21heEtleXM6IHBhcmFtZXRlckxpbWl0fSlcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgc2ltcGxlIHR5cGUgY2hlY2tlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICogQHJldHVybiB7ZnVuY3Rpb259XG4gKi9cblxuZnVuY3Rpb24gdHlwZUNoZWNrZXIgKHR5cGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNoZWNrVHlwZSAocmVxKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odHlwZWlzKHJlcSwgdHlwZSkpXG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9ib2R5LXBhcnNlci9saWIvdHlwZXMvdXJsZW5jb2RlZC5qc1xuLy8gbW9kdWxlIGlkID0gMTU3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxudmFyIGFycmF5UHJlZml4R2VuZXJhdG9ycyA9IHtcbiAgICBicmFja2V0czogZnVuY3Rpb24gYnJhY2tldHMocHJlZml4KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnW10nO1xuICAgIH0sXG4gICAgaW5kaWNlczogZnVuY3Rpb24gaW5kaWNlcyhwcmVmaXgsIGtleSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1snICsga2V5ICsgJ10nO1xuICAgIH0sXG4gICAgcmVwZWF0OiBmdW5jdGlvbiByZXBlYXQocHJlZml4KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG4gICAgICAgIHJldHVybiBwcmVmaXg7XG4gICAgfVxufTtcblxudmFyIHRvSVNPID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBlbmNvZGU6IHRydWUsXG4gICAgZW5jb2RlcjogdXRpbHMuZW5jb2RlLFxuICAgIGVuY29kZVZhbHVlc09ubHk6IGZhbHNlLFxuICAgIHNlcmlhbGl6ZURhdGU6IGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGUoZGF0ZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gdG9JU08uY2FsbChkYXRlKTtcbiAgICB9LFxuICAgIHNraXBOdWxsczogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIHN0cmluZ2lmeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeSggLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICBvYmplY3QsXG4gICAgcHJlZml4LFxuICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgIHNraXBOdWxscyxcbiAgICBlbmNvZGVyLFxuICAgIGZpbHRlcixcbiAgICBzb3J0LFxuICAgIGFsbG93RG90cyxcbiAgICBzZXJpYWxpemVEYXRlLFxuICAgIGZvcm1hdHRlcixcbiAgICBlbmNvZGVWYWx1ZXNPbmx5XG4pIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iaiA9IGZpbHRlcihwcmVmaXgsIG9iaik7XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG9iaiA9IHNlcmlhbGl6ZURhdGUob2JqKTtcbiAgICB9IGVsc2UgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWN0TnVsbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlciAmJiAhZW5jb2RlVmFsdWVzT25seSA/IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyKSA6IHByZWZpeDtcbiAgICAgICAgfVxuXG4gICAgICAgIG9iaiA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicgfHwgdXRpbHMuaXNCdWZmZXIob2JqKSkge1xuICAgICAgICBpZiAoZW5jb2Rlcikge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlID0gZW5jb2RlVmFsdWVzT25seSA/IHByZWZpeCA6IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyKTtcbiAgICAgICAgICAgIHJldHVybiBbZm9ybWF0dGVyKGtleVZhbHVlKSArICc9JyArIGZvcm1hdHRlcihlbmNvZGVyKG9iaiwgZGVmYXVsdHMuZW5jb2RlcikpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgb2JqS2V5cyA9IHNvcnQgPyBrZXlzLnNvcnQoc29ydCkgOiBrZXlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQoc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgocHJlZml4LCBrZXkpLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgICAgICBlbmNvZGVyLFxuICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQoc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAgICAgIHByZWZpeCArIChhbGxvd0RvdHMgPyAnLicgKyBrZXkgOiAnWycgKyBrZXkgKyAnXScpLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgICAgICBlbmNvZGVyLFxuICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG9wdHMpIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuICAgIHZhciBvcHRpb25zID0gb3B0cyA/IHV0aWxzLmFzc2lnbih7fSwgb3B0cykgOiB7fTtcblxuICAgIGlmIChvcHRpb25zLmVuY29kZXIgIT09IG51bGwgJiYgb3B0aW9ucy5lbmNvZGVyICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMuZW5jb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFbmNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHZhciBkZWxpbWl0ZXIgPSB0eXBlb2Ygb3B0aW9ucy5kZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuZGVsaW1pdGVyIDogb3B0aW9ucy5kZWxpbWl0ZXI7XG4gICAgdmFyIHN0cmljdE51bGxIYW5kbGluZyA9IHR5cGVvZiBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmc7XG4gICAgdmFyIHNraXBOdWxscyA9IHR5cGVvZiBvcHRpb25zLnNraXBOdWxscyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5za2lwTnVsbHMgOiBkZWZhdWx0cy5za2lwTnVsbHM7XG4gICAgdmFyIGVuY29kZSA9IHR5cGVvZiBvcHRpb25zLmVuY29kZSA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5lbmNvZGUgOiBkZWZhdWx0cy5lbmNvZGU7XG4gICAgdmFyIGVuY29kZXIgPSB0eXBlb2Ygb3B0aW9ucy5lbmNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5lbmNvZGVyIDogZGVmYXVsdHMuZW5jb2RlcjtcbiAgICB2YXIgc29ydCA9IHR5cGVvZiBvcHRpb25zLnNvcnQgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnNvcnQgOiBudWxsO1xuICAgIHZhciBhbGxvd0RvdHMgPSB0eXBlb2Ygb3B0aW9ucy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gZmFsc2UgOiBvcHRpb25zLmFsbG93RG90cztcbiAgICB2YXIgc2VyaWFsaXplRGF0ZSA9IHR5cGVvZiBvcHRpb25zLnNlcmlhbGl6ZURhdGUgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnNlcmlhbGl6ZURhdGUgOiBkZWZhdWx0cy5zZXJpYWxpemVEYXRlO1xuICAgIHZhciBlbmNvZGVWYWx1ZXNPbmx5ID0gdHlwZW9mIG9wdGlvbnMuZW5jb2RlVmFsdWVzT25seSA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5lbmNvZGVWYWx1ZXNPbmx5IDogZGVmYXVsdHMuZW5jb2RlVmFsdWVzT25seTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZm9ybWF0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvcHRpb25zLmZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbiAgICB9IGVsc2UgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZm9ybWF0cy5mb3JtYXR0ZXJzLCBvcHRpb25zLmZvcm1hdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBmb3JtYXQgb3B0aW9uIHByb3ZpZGVkLicpO1xuICAgIH1cbiAgICB2YXIgZm9ybWF0dGVyID0gZm9ybWF0cy5mb3JtYXR0ZXJzW29wdGlvbnMuZm9ybWF0XTtcbiAgICB2YXIgb2JqS2V5cztcbiAgICB2YXIgZmlsdGVyO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqID0gZmlsdGVyKCcnLCBvYmopO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHZhciBhcnJheUZvcm1hdDtcbiAgICBpZiAob3B0aW9ucy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRpb25zLmFycmF5Rm9ybWF0O1xuICAgIH0gZWxzZSBpZiAoJ2luZGljZXMnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRpb25zLmluZGljZXMgPyAnaW5kaWNlcycgOiAncmVwZWF0JztcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheUZvcm1hdCA9ICdpbmRpY2VzJztcbiAgICB9XG5cbiAgICB2YXIgZ2VuZXJhdGVBcnJheVByZWZpeCA9IGFycmF5UHJlZml4R2VuZXJhdG9yc1thcnJheUZvcm1hdF07XG5cbiAgICBpZiAoIW9iaktleXMpIHtcbiAgICAgICAgb2JqS2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKHNvcnQpIHtcbiAgICAgICAgb2JqS2V5cy5zb3J0KHNvcnQpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChzdHJpbmdpZnkoXG4gICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICBza2lwTnVsbHMsXG4gICAgICAgICAgICBlbmNvZGUgPyBlbmNvZGVyIDogbnVsbCxcbiAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgIHNvcnQsXG4gICAgICAgICAgICBhbGxvd0RvdHMsXG4gICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgZm9ybWF0dGVyLFxuICAgICAgICAgICAgZW5jb2RlVmFsdWVzT25seVxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICB2YXIgam9pbmVkID0ga2V5cy5qb2luKGRlbGltaXRlcik7XG4gICAgdmFyIHByZWZpeCA9IG9wdGlvbnMuYWRkUXVlcnlQcmVmaXggPT09IHRydWUgPyAnPycgOiAnJztcblxuICAgIHJldHVybiBqb2luZWQubGVuZ3RoID4gMCA/IHByZWZpeCArIGpvaW5lZCA6ICcnO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzXG4vLyBtb2R1bGUgaWQgPSAxNThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBhbGxvd1Byb3RvdHlwZXM6IGZhbHNlLFxuICAgIGFycmF5TGltaXQ6IDIwLFxuICAgIGRlY29kZXI6IHV0aWxzLmRlY29kZSxcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBkZXB0aDogNSxcbiAgICBwYXJhbWV0ZXJMaW1pdDogMTAwMCxcbiAgICBwbGFpbk9iamVjdHM6IGZhbHNlLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2Vcbn07XG5cbnZhciBwYXJzZVZhbHVlcyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMoc3RyLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IHt9O1xuICAgIHZhciBjbGVhblN0ciA9IG9wdGlvbnMuaWdub3JlUXVlcnlQcmVmaXggPyBzdHIucmVwbGFjZSgvXlxcPy8sICcnKSA6IHN0cjtcbiAgICB2YXIgbGltaXQgPSBvcHRpb25zLnBhcmFtZXRlckxpbWl0ID09PSBJbmZpbml0eSA/IHVuZGVmaW5lZCA6IG9wdGlvbnMucGFyYW1ldGVyTGltaXQ7XG4gICAgdmFyIHBhcnRzID0gY2xlYW5TdHIuc3BsaXQob3B0aW9ucy5kZWxpbWl0ZXIsIGxpbWl0KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcblxuICAgICAgICB2YXIgYnJhY2tldEVxdWFsc1BvcyA9IHBhcnQuaW5kZXhPZignXT0nKTtcbiAgICAgICAgdmFyIHBvcyA9IGJyYWNrZXRFcXVhbHNQb3MgPT09IC0xID8gcGFydC5pbmRleE9mKCc9JykgOiBicmFja2V0RXF1YWxzUG9zICsgMTtcblxuICAgICAgICB2YXIga2V5LCB2YWw7XG4gICAgICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydCwgZGVmYXVsdHMuZGVjb2Rlcik7XG4gICAgICAgICAgICB2YWwgPSBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA/IG51bGwgOiAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LnNsaWNlKDAsIHBvcyksIGRlZmF1bHRzLmRlY29kZXIpO1xuICAgICAgICAgICAgdmFsID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQuc2xpY2UocG9zICsgMSksIGRlZmF1bHRzLmRlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXMuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gW10uY29uY2F0KG9ialtrZXldKS5jb25jYXQodmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBwYXJzZU9iamVjdCA9IGZ1bmN0aW9uIChjaGFpbiwgdmFsLCBvcHRpb25zKSB7XG4gICAgdmFyIGxlYWYgPSB2YWw7XG5cbiAgICBmb3IgKHZhciBpID0gY2hhaW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIG9iajtcbiAgICAgICAgdmFyIHJvb3QgPSBjaGFpbltpXTtcblxuICAgICAgICBpZiAocm9vdCA9PT0gJ1tdJykge1xuICAgICAgICAgICAgb2JqID0gW107XG4gICAgICAgICAgICBvYmogPSBvYmouY29uY2F0KGxlYWYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgICAgICAgICB2YXIgY2xlYW5Sb290ID0gcm9vdC5jaGFyQXQoMCkgPT09ICdbJyAmJiByb290LmNoYXJBdChyb290Lmxlbmd0aCAtIDEpID09PSAnXScgPyByb290LnNsaWNlKDEsIC0xKSA6IHJvb3Q7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZUludChjbGVhblJvb3QsIDEwKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICAgICAgJiYgcm9vdCAhPT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgU3RyaW5nKGluZGV4KSA9PT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICYmIChvcHRpb25zLnBhcnNlQXJyYXlzICYmIGluZGV4IDw9IG9wdGlvbnMuYXJyYXlMaW1pdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9iaiA9IFtdO1xuICAgICAgICAgICAgICAgIG9ialtpbmRleF0gPSBsZWFmO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYmpbY2xlYW5Sb290XSA9IGxlYWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZWFmID0gb2JqO1xuICAgIH1cblxuICAgIHJldHVybiBsZWFmO1xufTtcblxudmFyIHBhcnNlS2V5cyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdLZXlzKGdpdmVuS2V5LCB2YWwsIG9wdGlvbnMpIHtcbiAgICBpZiAoIWdpdmVuS2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2Zvcm0gZG90IG5vdGF0aW9uIHRvIGJyYWNrZXQgbm90YXRpb25cbiAgICB2YXIga2V5ID0gb3B0aW9ucy5hbGxvd0RvdHMgPyBnaXZlbktleS5yZXBsYWNlKC9cXC4oW14uW10rKS9nLCAnWyQxXScpIDogZ2l2ZW5LZXk7XG5cbiAgICAvLyBUaGUgcmVnZXggY2h1bmtzXG5cbiAgICB2YXIgYnJhY2tldHMgPSAvKFxcW1teW1xcXV0qXSkvO1xuICAgIHZhciBjaGlsZCA9IC8oXFxbW15bXFxdXSpdKS9nO1xuXG4gICAgLy8gR2V0IHRoZSBwYXJlbnRcblxuICAgIHZhciBzZWdtZW50ID0gYnJhY2tldHMuZXhlYyhrZXkpO1xuICAgIHZhciBwYXJlbnQgPSBzZWdtZW50ID8ga2V5LnNsaWNlKDAsIHNlZ21lbnQuaW5kZXgpIDoga2V5O1xuXG4gICAgLy8gU3Rhc2ggdGhlIHBhcmVudCBpZiBpdCBleGlzdHNcblxuICAgIHZhciBrZXlzID0gW107XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICAvLyBJZiB3ZSBhcmVuJ3QgdXNpbmcgcGxhaW4gb2JqZWN0cywgb3B0aW9uYWxseSBwcmVmaXgga2V5c1xuICAgICAgICAvLyB0aGF0IHdvdWxkIG92ZXJ3cml0ZSBvYmplY3QgcHJvdG90eXBlIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBwYXJlbnQpKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAga2V5cy5wdXNoKHBhcmVudCk7XG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGNoaWxkcmVuIGFwcGVuZGluZyB0byB0aGUgYXJyYXkgdW50aWwgd2UgaGl0IGRlcHRoXG5cbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKChzZWdtZW50ID0gY2hpbGQuZXhlYyhrZXkpKSAhPT0gbnVsbCAmJiBpIDwgb3B0aW9ucy5kZXB0aCkge1xuICAgICAgICBpICs9IDE7XG4gICAgICAgIGlmICghb3B0aW9ucy5wbGFpbk9iamVjdHMgJiYgaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgc2VnbWVudFsxXS5zbGljZSgxLCAtMSkpKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleXMucHVzaChzZWdtZW50WzFdKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSdzIGEgcmVtYWluZGVyLCBqdXN0IGFkZCB3aGF0ZXZlciBpcyBsZWZ0XG5cbiAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICBrZXlzLnB1c2goJ1snICsga2V5LnNsaWNlKHNlZ21lbnQuaW5kZXgpICsgJ10nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VPYmplY3Qoa2V5cywgdmFsLCBvcHRpb25zKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0ciwgb3B0cykge1xuICAgIHZhciBvcHRpb25zID0gb3B0cyA/IHV0aWxzLmFzc2lnbih7fSwgb3B0cykgOiB7fTtcblxuICAgIGlmIChvcHRpb25zLmRlY29kZXIgIT09IG51bGwgJiYgb3B0aW9ucy5kZWNvZGVyICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMuZGVjb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdEZWNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIG9wdGlvbnMuaWdub3JlUXVlcnlQcmVmaXggPSBvcHRpb25zLmlnbm9yZVF1ZXJ5UHJlZml4ID09PSB0cnVlO1xuICAgIG9wdGlvbnMuZGVsaW1pdGVyID0gdHlwZW9mIG9wdGlvbnMuZGVsaW1pdGVyID09PSAnc3RyaW5nJyB8fCB1dGlscy5pc1JlZ0V4cChvcHRpb25zLmRlbGltaXRlcikgPyBvcHRpb25zLmRlbGltaXRlciA6IGRlZmF1bHRzLmRlbGltaXRlcjtcbiAgICBvcHRpb25zLmRlcHRoID0gdHlwZW9mIG9wdGlvbnMuZGVwdGggPT09ICdudW1iZXInID8gb3B0aW9ucy5kZXB0aCA6IGRlZmF1bHRzLmRlcHRoO1xuICAgIG9wdGlvbnMuYXJyYXlMaW1pdCA9IHR5cGVvZiBvcHRpb25zLmFycmF5TGltaXQgPT09ICdudW1iZXInID8gb3B0aW9ucy5hcnJheUxpbWl0IDogZGVmYXVsdHMuYXJyYXlMaW1pdDtcbiAgICBvcHRpb25zLnBhcnNlQXJyYXlzID0gb3B0aW9ucy5wYXJzZUFycmF5cyAhPT0gZmFsc2U7XG4gICAgb3B0aW9ucy5kZWNvZGVyID0gdHlwZW9mIG9wdGlvbnMuZGVjb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMuZGVjb2RlciA6IGRlZmF1bHRzLmRlY29kZXI7XG4gICAgb3B0aW9ucy5hbGxvd0RvdHMgPSB0eXBlb2Ygb3B0aW9ucy5hbGxvd0RvdHMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuYWxsb3dEb3RzIDogZGVmYXVsdHMuYWxsb3dEb3RzO1xuICAgIG9wdGlvbnMucGxhaW5PYmplY3RzID0gdHlwZW9mIG9wdGlvbnMucGxhaW5PYmplY3RzID09PSAnYm9vbGVhbicgPyBvcHRpb25zLnBsYWluT2JqZWN0cyA6IGRlZmF1bHRzLnBsYWluT2JqZWN0cztcbiAgICBvcHRpb25zLmFsbG93UHJvdG90eXBlcyA9IHR5cGVvZiBvcHRpb25zLmFsbG93UHJvdG90eXBlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMgOiBkZWZhdWx0cy5hbGxvd1Byb3RvdHlwZXM7XG4gICAgb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdCA9IHR5cGVvZiBvcHRpb25zLnBhcmFtZXRlckxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgOiBkZWZhdWx0cy5wYXJhbWV0ZXJMaW1pdDtcbiAgICBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA9IHR5cGVvZiBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmc7XG5cbiAgICBpZiAoc3RyID09PSAnJyB8fCBzdHIgPT09IG51bGwgfHwgdHlwZW9mIHN0ciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIH1cblxuICAgIHZhciB0ZW1wT2JqID0gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgPyBwYXJzZVZhbHVlcyhzdHIsIG9wdGlvbnMpIDogc3RyO1xuICAgIHZhciBvYmogPSBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUga2V5cyBhbmQgc2V0dXAgdGhlIG5ldyBvYmplY3RcblxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGVtcE9iaik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICB2YXIgbmV3T2JqID0gcGFyc2VLZXlzKGtleSwgdGVtcE9ialtrZXldLCBvcHRpb25zKTtcbiAgICAgICAgb2JqID0gdXRpbHMubWVyZ2Uob2JqLCBuZXdPYmosIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1dGlscy5jb21wYWN0KG9iaik7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3FzL2xpYi9wYXJzZS5qc1xuLy8gbW9kdWxlIGlkID0gMTU5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogbWVyZ2UtZGVzY3JpcHRvcnNcbiAqIENvcHlyaWdodChjKSAyMDE0IEpvbmF0aGFuIE9uZ1xuICogQ29weXJpZ2h0KGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gbWVyZ2VcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG5cbi8qKlxuICogTWVyZ2UgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIG9mIGBzcmNgIGludG8gYGRlc3RgXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGRlc3QgT2JqZWN0IHRvIGFkZCBkZXNjcmlwdG9ycyB0b1xuICogQHBhcmFtIHtvYmplY3R9IHNyYyBPYmplY3QgdG8gY2xvbmUgZGVzY3JpcHRvcnMgZnJvbVxuICogQHBhcmFtIHtib29sZWFufSBbcmVkZWZpbmU9dHJ1ZV0gUmVkZWZpbmUgYGRlc3RgIHByb3BlcnRpZXMgd2l0aCBgc3JjYCBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyB7b2JqZWN0fSBSZWZlcmVuY2UgdG8gZGVzdFxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIG1lcmdlKGRlc3QsIHNyYywgcmVkZWZpbmUpIHtcbiAgaWYgKCFkZXN0KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgZGVzdCBpcyByZXF1aXJlZCcpXG4gIH1cblxuICBpZiAoIXNyYykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHNyYyBpcyByZXF1aXJlZCcpXG4gIH1cblxuICBpZiAocmVkZWZpbmUgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIERlZmF1bHQgdG8gdHJ1ZVxuICAgIHJlZGVmaW5lID0gdHJ1ZVxuICB9XG5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc3JjKS5mb3JFYWNoKGZ1bmN0aW9uIGZvckVhY2hPd25Qcm9wZXJ0eU5hbWUobmFtZSkge1xuICAgIGlmICghcmVkZWZpbmUgJiYgaGFzT3duUHJvcGVydHkuY2FsbChkZXN0LCBuYW1lKSkge1xuICAgICAgLy8gU2tpcCBkZXNyaXB0b3JcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIENvcHkgZGVzY3JpcHRvclxuICAgIHZhciBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzcmMsIG5hbWUpXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlc3QsIG5hbWUsIGRlc2NyaXB0b3IpXG4gIH0pXG5cbiAgcmV0dXJuIGRlc3Rcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9tZXJnZS1kZXNjcmlwdG9ycy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogZXhwcmVzc1xuICogQ29weXJpZ2h0KGMpIDIwMDktMjAxMyBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTMgUm9tYW4gU2h0eWxtYW5cbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZmluYWxoYW5kbGVyID0gcmVxdWlyZSgnZmluYWxoYW5kbGVyJyk7XG52YXIgUm91dGVyID0gcmVxdWlyZSgnLi9yb3V0ZXInKTtcbnZhciBtZXRob2RzID0gcmVxdWlyZSgnbWV0aG9kcycpO1xudmFyIG1pZGRsZXdhcmUgPSByZXF1aXJlKCcuL21pZGRsZXdhcmUvaW5pdCcpO1xudmFyIHF1ZXJ5ID0gcmVxdWlyZSgnLi9taWRkbGV3YXJlL3F1ZXJ5Jyk7XG52YXIgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdleHByZXNzOmFwcGxpY2F0aW9uJyk7XG52YXIgVmlldyA9IHJlcXVpcmUoJy4vdmlldycpO1xudmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG52YXIgY29tcGlsZUVUYWcgPSByZXF1aXJlKCcuL3V0aWxzJykuY29tcGlsZUVUYWc7XG52YXIgY29tcGlsZVF1ZXJ5UGFyc2VyID0gcmVxdWlyZSgnLi91dGlscycpLmNvbXBpbGVRdWVyeVBhcnNlcjtcbnZhciBjb21waWxlVHJ1c3QgPSByZXF1aXJlKCcuL3V0aWxzJykuY29tcGlsZVRydXN0O1xudmFyIGRlcHJlY2F0ZSA9IHJlcXVpcmUoJ2RlcGQnKSgnZXhwcmVzcycpO1xudmFyIGZsYXR0ZW4gPSByZXF1aXJlKCdhcnJheS1mbGF0dGVuJyk7XG52YXIgbWVyZ2UgPSByZXF1aXJlKCd1dGlscy1tZXJnZScpO1xudmFyIHJlc29sdmUgPSByZXF1aXJlKCdwYXRoJykucmVzb2x2ZTtcbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJ3NldHByb3RvdHlwZW9mJylcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuLyoqXG4gKiBBcHBsaWNhdGlvbiBwcm90b3R5cGUuXG4gKi9cblxudmFyIGFwcCA9IGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vKipcbiAqIFZhcmlhYmxlIGZvciB0cnVzdCBwcm94eSBpbmhlcml0YW5jZSBiYWNrLWNvbXBhdFxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgdHJ1c3RQcm94eURlZmF1bHRTeW1ib2wgPSAnQEBzeW1ib2w6dHJ1c3RfcHJveHlfZGVmYXVsdCc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgc2VydmVyLlxuICpcbiAqICAgLSBzZXR1cCBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAqICAgLSBzZXR1cCBkZWZhdWx0IG1pZGRsZXdhcmVcbiAqICAgLSBzZXR1cCByb3V0ZSByZWZsZWN0aW9uIG1ldGhvZHNcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmFwcC5pbml0ID0gZnVuY3Rpb24gaW5pdCgpIHtcbiAgdGhpcy5jYWNoZSA9IHt9O1xuICB0aGlzLmVuZ2luZXMgPSB7fTtcbiAgdGhpcy5zZXR0aW5ncyA9IHt9O1xuXG4gIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24oKTtcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLlxuICogQHByaXZhdGVcbiAqL1xuXG5hcHAuZGVmYXVsdENvbmZpZ3VyYXRpb24gPSBmdW5jdGlvbiBkZWZhdWx0Q29uZmlndXJhdGlvbigpIHtcbiAgdmFyIGVudiA9IHByb2Nlc3MuZW52Lk5PREVfRU5WIHx8ICdkZXZlbG9wbWVudCc7XG5cbiAgLy8gZGVmYXVsdCBzZXR0aW5nc1xuICB0aGlzLmVuYWJsZSgneC1wb3dlcmVkLWJ5Jyk7XG4gIHRoaXMuc2V0KCdldGFnJywgJ3dlYWsnKTtcbiAgdGhpcy5zZXQoJ2VudicsIGVudik7XG4gIHRoaXMuc2V0KCdxdWVyeSBwYXJzZXInLCAnZXh0ZW5kZWQnKTtcbiAgdGhpcy5zZXQoJ3N1YmRvbWFpbiBvZmZzZXQnLCAyKTtcbiAgdGhpcy5zZXQoJ3RydXN0IHByb3h5JywgZmFsc2UpO1xuXG4gIC8vIHRydXN0IHByb3h5IGluaGVyaXQgYmFjay1jb21wYXRcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuc2V0dGluZ3MsIHRydXN0UHJveHlEZWZhdWx0U3ltYm9sLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuXG4gIGRlYnVnKCdib290aW5nIGluICVzIG1vZGUnLCBlbnYpO1xuXG4gIHRoaXMub24oJ21vdW50JywgZnVuY3Rpb24gb25tb3VudChwYXJlbnQpIHtcbiAgICAvLyBpbmhlcml0IHRydXN0IHByb3h5XG4gICAgaWYgKHRoaXMuc2V0dGluZ3NbdHJ1c3RQcm94eURlZmF1bHRTeW1ib2xdID09PSB0cnVlXG4gICAgICAmJiB0eXBlb2YgcGFyZW50LnNldHRpbmdzWyd0cnVzdCBwcm94eSBmbiddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBkZWxldGUgdGhpcy5zZXR0aW5nc1sndHJ1c3QgcHJveHknXTtcbiAgICAgIGRlbGV0ZSB0aGlzLnNldHRpbmdzWyd0cnVzdCBwcm94eSBmbiddO1xuICAgIH1cblxuICAgIC8vIGluaGVyaXQgcHJvdG9zXG4gICAgc2V0UHJvdG90eXBlT2YodGhpcy5yZXF1ZXN0LCBwYXJlbnQucmVxdWVzdClcbiAgICBzZXRQcm90b3R5cGVPZih0aGlzLnJlc3BvbnNlLCBwYXJlbnQucmVzcG9uc2UpXG4gICAgc2V0UHJvdG90eXBlT2YodGhpcy5lbmdpbmVzLCBwYXJlbnQuZW5naW5lcylcbiAgICBzZXRQcm90b3R5cGVPZih0aGlzLnNldHRpbmdzLCBwYXJlbnQuc2V0dGluZ3MpXG4gIH0pO1xuXG4gIC8vIHNldHVwIGxvY2Fsc1xuICB0aGlzLmxvY2FscyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy8gdG9wLW1vc3QgYXBwIGlzIG1vdW50ZWQgYXQgL1xuICB0aGlzLm1vdW50cGF0aCA9ICcvJztcblxuICAvLyBkZWZhdWx0IGxvY2Fsc1xuICB0aGlzLmxvY2Fscy5zZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3M7XG5cbiAgLy8gZGVmYXVsdCBjb25maWd1cmF0aW9uXG4gIHRoaXMuc2V0KCd2aWV3JywgVmlldyk7XG4gIHRoaXMuc2V0KCd2aWV3cycsIHJlc29sdmUoJ3ZpZXdzJykpO1xuICB0aGlzLnNldCgnanNvbnAgY2FsbGJhY2sgbmFtZScsICdjYWxsYmFjaycpO1xuXG4gIGlmIChlbnYgPT09ICdwcm9kdWN0aW9uJykge1xuICAgIHRoaXMuZW5hYmxlKCd2aWV3IGNhY2hlJyk7XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JvdXRlcicsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcXCdhcHAucm91dGVyXFwnIGlzIGRlcHJlY2F0ZWQhXFxuUGxlYXNlIHNlZSB0aGUgMy54IHRvIDQueCBtaWdyYXRpb24gZ3VpZGUgZm9yIGRldGFpbHMgb24gaG93IHRvIHVwZGF0ZSB5b3VyIGFwcC4nKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBsYXppbHkgYWRkcyB0aGUgYmFzZSByb3V0ZXIgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBhZGRlZC5cbiAqXG4gKiBXZSBjYW5ub3QgYWRkIHRoZSBiYXNlIHJvdXRlciBpbiB0aGUgZGVmYXVsdENvbmZpZ3VyYXRpb24gYmVjYXVzZVxuICogaXQgcmVhZHMgYXBwIHNldHRpbmdzIHdoaWNoIG1pZ2h0IGJlIHNldCBhZnRlciB0aGF0IGhhcyBydW4uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuYXBwLmxhenlyb3V0ZXIgPSBmdW5jdGlvbiBsYXp5cm91dGVyKCkge1xuICBpZiAoIXRoaXMuX3JvdXRlcikge1xuICAgIHRoaXMuX3JvdXRlciA9IG5ldyBSb3V0ZXIoe1xuICAgICAgY2FzZVNlbnNpdGl2ZTogdGhpcy5lbmFibGVkKCdjYXNlIHNlbnNpdGl2ZSByb3V0aW5nJyksXG4gICAgICBzdHJpY3Q6IHRoaXMuZW5hYmxlZCgnc3RyaWN0IHJvdXRpbmcnKVxuICAgIH0pO1xuXG4gICAgdGhpcy5fcm91dGVyLnVzZShxdWVyeSh0aGlzLmdldCgncXVlcnkgcGFyc2VyIGZuJykpKTtcbiAgICB0aGlzLl9yb3V0ZXIudXNlKG1pZGRsZXdhcmUuaW5pdCh0aGlzKSk7XG4gIH1cbn07XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXEsIHJlcyBwYWlyIGludG8gdGhlIGFwcGxpY2F0aW9uLiBTdGFydHMgcGlwZWxpbmUgcHJvY2Vzc2luZy5cbiAqXG4gKiBJZiBubyBjYWxsYmFjayBpcyBwcm92aWRlZCwgdGhlbiBkZWZhdWx0IGVycm9yIGhhbmRsZXJzIHdpbGwgcmVzcG9uZFxuICogaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yIGJ1YmJsaW5nIHRocm91Z2ggdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuYXBwLmhhbmRsZSA9IGZ1bmN0aW9uIGhhbmRsZShyZXEsIHJlcywgY2FsbGJhY2spIHtcbiAgdmFyIHJvdXRlciA9IHRoaXMuX3JvdXRlcjtcblxuICAvLyBmaW5hbCBoYW5kbGVyXG4gIHZhciBkb25lID0gY2FsbGJhY2sgfHwgZmluYWxoYW5kbGVyKHJlcSwgcmVzLCB7XG4gICAgZW52OiB0aGlzLmdldCgnZW52JyksXG4gICAgb25lcnJvcjogbG9nZXJyb3IuYmluZCh0aGlzKVxuICB9KTtcblxuICAvLyBubyByb3V0ZXNcbiAgaWYgKCFyb3V0ZXIpIHtcbiAgICBkZWJ1Zygnbm8gcm91dGVzIGRlZmluZWQgb24gYXBwJyk7XG4gICAgZG9uZSgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJvdXRlci5oYW5kbGUocmVxLCByZXMsIGRvbmUpO1xufTtcblxuLyoqXG4gKiBQcm94eSBgUm91dGVyI3VzZSgpYCB0byBhZGQgbWlkZGxld2FyZSB0byB0aGUgYXBwIHJvdXRlci5cbiAqIFNlZSBSb3V0ZXIjdXNlKCkgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy5cbiAqXG4gKiBJZiB0aGUgX2ZuXyBwYXJhbWV0ZXIgaXMgYW4gZXhwcmVzcyBhcHAsIHRoZW4gaXQgd2lsbCBiZVxuICogbW91bnRlZCBhdCB0aGUgX3JvdXRlXyBzcGVjaWZpZWQuXG4gKlxuICogQHB1YmxpY1xuICovXG5cbmFwcC51c2UgPSBmdW5jdGlvbiB1c2UoZm4pIHtcbiAgdmFyIG9mZnNldCA9IDA7XG4gIHZhciBwYXRoID0gJy8nO1xuXG4gIC8vIGRlZmF1bHQgcGF0aCB0byAnLydcbiAgLy8gZGlzYW1iaWd1YXRlIGFwcC51c2UoW2ZuXSlcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBhcmcgPSBmbjtcblxuICAgIHdoaWxlIChBcnJheS5pc0FycmF5KGFyZykgJiYgYXJnLmxlbmd0aCAhPT0gMCkge1xuICAgICAgYXJnID0gYXJnWzBdO1xuICAgIH1cblxuICAgIC8vIGZpcnN0IGFyZyBpcyB0aGUgcGF0aFxuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvZmZzZXQgPSAxO1xuICAgICAgcGF0aCA9IGZuO1xuICAgIH1cbiAgfVxuXG4gIHZhciBmbnMgPSBmbGF0dGVuKHNsaWNlLmNhbGwoYXJndW1lbnRzLCBvZmZzZXQpKTtcblxuICBpZiAoZm5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FwcC51c2UoKSByZXF1aXJlcyBhIG1pZGRsZXdhcmUgZnVuY3Rpb24nKVxuICB9XG5cbiAgLy8gc2V0dXAgcm91dGVyXG4gIHRoaXMubGF6eXJvdXRlcigpO1xuICB2YXIgcm91dGVyID0gdGhpcy5fcm91dGVyO1xuXG4gIGZucy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgIC8vIG5vbi1leHByZXNzIGFwcFxuICAgIGlmICghZm4gfHwgIWZuLmhhbmRsZSB8fCAhZm4uc2V0KSB7XG4gICAgICByZXR1cm4gcm91dGVyLnVzZShwYXRoLCBmbik7XG4gICAgfVxuXG4gICAgZGVidWcoJy51c2UgYXBwIHVuZGVyICVzJywgcGF0aCk7XG4gICAgZm4ubW91bnRwYXRoID0gcGF0aDtcbiAgICBmbi5wYXJlbnQgPSB0aGlzO1xuXG4gICAgLy8gcmVzdG9yZSAuYXBwIHByb3BlcnR5IG9uIHJlcSBhbmQgcmVzXG4gICAgcm91dGVyLnVzZShwYXRoLCBmdW5jdGlvbiBtb3VudGVkX2FwcChyZXEsIHJlcywgbmV4dCkge1xuICAgICAgdmFyIG9yaWcgPSByZXEuYXBwO1xuICAgICAgZm4uaGFuZGxlKHJlcSwgcmVzLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHNldFByb3RvdHlwZU9mKHJlcSwgb3JpZy5yZXF1ZXN0KVxuICAgICAgICBzZXRQcm90b3R5cGVPZihyZXMsIG9yaWcucmVzcG9uc2UpXG4gICAgICAgIG5leHQoZXJyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gbW91bnRlZCBhbiBhcHBcbiAgICBmbi5lbWl0KCdtb3VudCcsIHRoaXMpO1xuICB9LCB0aGlzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUHJveHkgdG8gdGhlIGFwcCBgUm91dGVyI3JvdXRlKClgXG4gKiBSZXR1cm5zIGEgbmV3IGBSb3V0ZWAgaW5zdGFuY2UgZm9yIHRoZSBfcGF0aF8uXG4gKlxuICogUm91dGVzIGFyZSBpc29sYXRlZCBtaWRkbGV3YXJlIHN0YWNrcyBmb3Igc3BlY2lmaWMgcGF0aHMuXG4gKiBTZWUgdGhlIFJvdXRlIGFwaSBkb2NzIGZvciBkZXRhaWxzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG5hcHAucm91dGUgPSBmdW5jdGlvbiByb3V0ZShwYXRoKSB7XG4gIHRoaXMubGF6eXJvdXRlcigpO1xuICByZXR1cm4gdGhpcy5fcm91dGVyLnJvdXRlKHBhdGgpO1xufTtcblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgZ2l2ZW4gdGVtcGxhdGUgZW5naW5lIGNhbGxiYWNrIGBmbmBcbiAqIGFzIGBleHRgLlxuICpcbiAqIEJ5IGRlZmF1bHQgd2lsbCBgcmVxdWlyZSgpYCB0aGUgZW5naW5lIGJhc2VkIG9uIHRoZVxuICogZmlsZSBleHRlbnNpb24uIEZvciBleGFtcGxlIGlmIHlvdSB0cnkgdG8gcmVuZGVyXG4gKiBhIFwiZm9vLmVqc1wiIGZpbGUgRXhwcmVzcyB3aWxsIGludm9rZSB0aGUgZm9sbG93aW5nIGludGVybmFsbHk6XG4gKlxuICogICAgIGFwcC5lbmdpbmUoJ2VqcycsIHJlcXVpcmUoJ2VqcycpLl9fZXhwcmVzcyk7XG4gKlxuICogRm9yIGVuZ2luZXMgdGhhdCBkbyBub3QgcHJvdmlkZSBgLl9fZXhwcmVzc2Agb3V0IG9mIHRoZSBib3gsXG4gKiBvciBpZiB5b3Ugd2lzaCB0byBcIm1hcFwiIGEgZGlmZmVyZW50IGV4dGVuc2lvbiB0byB0aGUgdGVtcGxhdGUgZW5naW5lXG4gKiB5b3UgbWF5IHVzZSB0aGlzIG1ldGhvZC4gRm9yIGV4YW1wbGUgbWFwcGluZyB0aGUgRUpTIHRlbXBsYXRlIGVuZ2luZSB0b1xuICogXCIuaHRtbFwiIGZpbGVzOlxuICpcbiAqICAgICBhcHAuZW5naW5lKCdodG1sJywgcmVxdWlyZSgnZWpzJykucmVuZGVyRmlsZSk7XG4gKlxuICogSW4gdGhpcyBjYXNlIEVKUyBwcm92aWRlcyBhIGAucmVuZGVyRmlsZSgpYCBtZXRob2Qgd2l0aFxuICogdGhlIHNhbWUgc2lnbmF0dXJlIHRoYXQgRXhwcmVzcyBleHBlY3RzOiBgKHBhdGgsIG9wdGlvbnMsIGNhbGxiYWNrKWAsXG4gKiB0aG91Z2ggbm90ZSB0aGF0IGl0IGFsaWFzZXMgdGhpcyBtZXRob2QgYXMgYGVqcy5fX2V4cHJlc3NgIGludGVybmFsbHlcbiAqIHNvIGlmIHlvdSdyZSB1c2luZyBcIi5lanNcIiBleHRlbnNpb25zIHlvdSBkb250IG5lZWQgdG8gZG8gYW55dGhpbmcuXG4gKlxuICogU29tZSB0ZW1wbGF0ZSBlbmdpbmVzIGRvIG5vdCBmb2xsb3cgdGhpcyBjb252ZW50aW9uLCB0aGVcbiAqIFtDb25zb2xpZGF0ZS5qc10oaHR0cHM6Ly9naXRodWIuY29tL3RqL2NvbnNvbGlkYXRlLmpzKVxuICogbGlicmFyeSB3YXMgY3JlYXRlZCB0byBtYXAgYWxsIG9mIG5vZGUncyBwb3B1bGFyIHRlbXBsYXRlXG4gKiBlbmdpbmVzIHRvIGZvbGxvdyB0aGlzIGNvbnZlbnRpb24sIHRodXMgYWxsb3dpbmcgdGhlbSB0b1xuICogd29yayBzZWFtbGVzc2x5IHdpdGhpbiBFeHByZXNzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBleHRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHthcHB9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbmFwcC5lbmdpbmUgPSBmdW5jdGlvbiBlbmdpbmUoZXh0LCBmbikge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsYmFjayBmdW5jdGlvbiByZXF1aXJlZCcpO1xuICB9XG5cbiAgLy8gZ2V0IGZpbGUgZXh0ZW5zaW9uXG4gIHZhciBleHRlbnNpb24gPSBleHRbMF0gIT09ICcuJ1xuICAgID8gJy4nICsgZXh0XG4gICAgOiBleHQ7XG5cbiAgLy8gc3RvcmUgZW5naW5lXG4gIHRoaXMuZW5naW5lc1tleHRlbnNpb25dID0gZm47XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFByb3h5IHRvIGBSb3V0ZXIjcGFyYW0oKWAgd2l0aCBvbmUgYWRkZWQgYXBpIGZlYXR1cmUuIFRoZSBfbmFtZV8gcGFyYW1ldGVyXG4gKiBjYW4gYmUgYW4gYXJyYXkgb2YgbmFtZXMuXG4gKlxuICogU2VlIHRoZSBSb3V0ZXIjcGFyYW0oKSBkb2NzIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHthcHB9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbmFwcC5wYXJhbSA9IGZ1bmN0aW9uIHBhcmFtKG5hbWUsIGZuKSB7XG4gIHRoaXMubGF6eXJvdXRlcigpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KG5hbWUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhcmFtKG5hbWVbaV0sIGZuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRoaXMuX3JvdXRlci5wYXJhbShuYW1lLCBmbik7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFzc2lnbiBgc2V0dGluZ2AgdG8gYHZhbGAsIG9yIHJldHVybiBgc2V0dGluZ2AncyB2YWx1ZS5cbiAqXG4gKiAgICBhcHAuc2V0KCdmb28nLCAnYmFyJyk7XG4gKiAgICBhcHAuc2V0KCdmb28nKTtcbiAqICAgIC8vID0+IFwiYmFyXCJcbiAqXG4gKiBNb3VudGVkIHNlcnZlcnMgaW5oZXJpdCB0aGVpciBwYXJlbnQgc2VydmVyJ3Mgc2V0dGluZ3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNldHRpbmdcbiAqIEBwYXJhbSB7Kn0gW3ZhbF1cbiAqIEByZXR1cm4ge1NlcnZlcn0gZm9yIGNoYWluaW5nXG4gKiBAcHVibGljXG4gKi9cblxuYXBwLnNldCA9IGZ1bmN0aW9uIHNldChzZXR0aW5nLCB2YWwpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBhcHAuZ2V0KHNldHRpbmcpXG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3Nbc2V0dGluZ107XG4gIH1cblxuICBkZWJ1Zygnc2V0IFwiJXNcIiB0byAlbycsIHNldHRpbmcsIHZhbCk7XG5cbiAgLy8gc2V0IHZhbHVlXG4gIHRoaXMuc2V0dGluZ3Nbc2V0dGluZ10gPSB2YWw7XG5cbiAgLy8gdHJpZ2dlciBtYXRjaGVkIHNldHRpbmdzXG4gIHN3aXRjaCAoc2V0dGluZykge1xuICAgIGNhc2UgJ2V0YWcnOlxuICAgICAgdGhpcy5zZXQoJ2V0YWcgZm4nLCBjb21waWxlRVRhZyh2YWwpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3F1ZXJ5IHBhcnNlcic6XG4gICAgICB0aGlzLnNldCgncXVlcnkgcGFyc2VyIGZuJywgY29tcGlsZVF1ZXJ5UGFyc2VyKHZhbCkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndHJ1c3QgcHJveHknOlxuICAgICAgdGhpcy5zZXQoJ3RydXN0IHByb3h5IGZuJywgY29tcGlsZVRydXN0KHZhbCkpO1xuXG4gICAgICAvLyB0cnVzdCBwcm94eSBpbmhlcml0IGJhY2stY29tcGF0XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5zZXR0aW5ncywgdHJ1c3RQcm94eURlZmF1bHRTeW1ib2wsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGFwcCdzIGFic29sdXRlIHBhdGhuYW1lXG4gKiBiYXNlZCBvbiB0aGUgcGFyZW50KHMpIHRoYXQgaGF2ZVxuICogbW91bnRlZCBpdC5cbiAqXG4gKiBGb3IgZXhhbXBsZSBpZiB0aGUgYXBwbGljYXRpb24gd2FzXG4gKiBtb3VudGVkIGFzIFwiL2FkbWluXCIsIHdoaWNoIGl0c2VsZlxuICogd2FzIG1vdW50ZWQgYXMgXCIvYmxvZ1wiIHRoZW4gdGhlXG4gKiByZXR1cm4gdmFsdWUgd291bGQgYmUgXCIvYmxvZy9hZG1pblwiLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuYXBwLnBhdGggPSBmdW5jdGlvbiBwYXRoKCkge1xuICByZXR1cm4gdGhpcy5wYXJlbnRcbiAgICA/IHRoaXMucGFyZW50LnBhdGgoKSArIHRoaXMubW91bnRwYXRoXG4gICAgOiAnJztcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYHNldHRpbmdgIGlzIGVuYWJsZWQgKHRydXRoeSkuXG4gKlxuICogICAgYXBwLmVuYWJsZWQoJ2ZvbycpXG4gKiAgICAvLyA9PiBmYWxzZVxuICpcbiAqICAgIGFwcC5lbmFibGUoJ2ZvbycpXG4gKiAgICBhcHAuZW5hYmxlZCgnZm9vJylcbiAqICAgIC8vID0+IHRydWVcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2V0dGluZ1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5hcHAuZW5hYmxlZCA9IGZ1bmN0aW9uIGVuYWJsZWQoc2V0dGluZykge1xuICByZXR1cm4gQm9vbGVhbih0aGlzLnNldChzZXR0aW5nKSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGBzZXR0aW5nYCBpcyBkaXNhYmxlZC5cbiAqXG4gKiAgICBhcHAuZGlzYWJsZWQoJ2ZvbycpXG4gKiAgICAvLyA9PiB0cnVlXG4gKlxuICogICAgYXBwLmVuYWJsZSgnZm9vJylcbiAqICAgIGFwcC5kaXNhYmxlZCgnZm9vJylcbiAqICAgIC8vID0+IGZhbHNlXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNldHRpbmdcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiBAcHVibGljXG4gKi9cblxuYXBwLmRpc2FibGVkID0gZnVuY3Rpb24gZGlzYWJsZWQoc2V0dGluZykge1xuICByZXR1cm4gIXRoaXMuc2V0KHNldHRpbmcpO1xufTtcblxuLyoqXG4gKiBFbmFibGUgYHNldHRpbmdgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5nXG4gKiBAcmV0dXJuIHthcHB9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbmFwcC5lbmFibGUgPSBmdW5jdGlvbiBlbmFibGUoc2V0dGluZykge1xuICByZXR1cm4gdGhpcy5zZXQoc2V0dGluZywgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIERpc2FibGUgYHNldHRpbmdgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZXR0aW5nXG4gKiBAcmV0dXJuIHthcHB9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbmFwcC5kaXNhYmxlID0gZnVuY3Rpb24gZGlzYWJsZShzZXR0aW5nKSB7XG4gIHJldHVybiB0aGlzLnNldChzZXR0aW5nLCBmYWxzZSk7XG59O1xuXG4vKipcbiAqIERlbGVnYXRlIGAuVkVSQiguLi4pYCBjYWxscyB0byBgcm91dGVyLlZFUkIoLi4uKWAuXG4gKi9cblxubWV0aG9kcy5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCl7XG4gIGFwcFttZXRob2RdID0gZnVuY3Rpb24ocGF0aCl7XG4gICAgaWYgKG1ldGhvZCA9PT0gJ2dldCcgJiYgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gYXBwLmdldChzZXR0aW5nKVxuICAgICAgcmV0dXJuIHRoaXMuc2V0KHBhdGgpO1xuICAgIH1cblxuICAgIHRoaXMubGF6eXJvdXRlcigpO1xuXG4gICAgdmFyIHJvdXRlID0gdGhpcy5fcm91dGVyLnJvdXRlKHBhdGgpO1xuICAgIHJvdXRlW21ldGhvZF0uYXBwbHkocm91dGUsIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59KTtcblxuLyoqXG4gKiBTcGVjaWFsLWNhc2VkIFwiYWxsXCIgbWV0aG9kLCBhcHBseWluZyB0aGUgZ2l2ZW4gcm91dGUgYHBhdGhgLFxuICogbWlkZGxld2FyZSwgYW5kIGNhbGxiYWNrIHRvIF9ldmVyeV8gSFRUUCBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7RnVuY3Rpb259IC4uLlxuICogQHJldHVybiB7YXBwfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5hcHAuYWxsID0gZnVuY3Rpb24gYWxsKHBhdGgpIHtcbiAgdGhpcy5sYXp5cm91dGVyKCk7XG5cbiAgdmFyIHJvdXRlID0gdGhpcy5fcm91dGVyLnJvdXRlKHBhdGgpO1xuICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICByb3V0ZVttZXRob2RzW2ldXS5hcHBseShyb3V0ZSwgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGRlbCAtPiBkZWxldGUgYWxpYXNcblxuYXBwLmRlbCA9IGRlcHJlY2F0ZS5mdW5jdGlvbihhcHAuZGVsZXRlLCAnYXBwLmRlbDogVXNlIGFwcC5kZWxldGUgaW5zdGVhZCcpO1xuXG4vKipcbiAqIFJlbmRlciB0aGUgZ2l2ZW4gdmlldyBgbmFtZWAgbmFtZSB3aXRoIGBvcHRpb25zYFxuICogYW5kIGEgY2FsbGJhY2sgYWNjZXB0aW5nIGFuIGVycm9yIGFuZCB0aGVcbiAqIHJlbmRlcmVkIHRlbXBsYXRlIHN0cmluZy5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqICAgIGFwcC5yZW5kZXIoJ2VtYWlsJywgeyBuYW1lOiAnVG9iaScgfSwgZnVuY3Rpb24oZXJyLCBodG1sKXtcbiAqICAgICAgLy8gLi4uXG4gKiAgICB9KVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09iamVjdHxGdW5jdGlvbn0gb3B0aW9ucyBvciBmblxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEBwdWJsaWNcbiAqL1xuXG5hcHAucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKG5hbWUsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBjYWNoZSA9IHRoaXMuY2FjaGU7XG4gIHZhciBkb25lID0gY2FsbGJhY2s7XG4gIHZhciBlbmdpbmVzID0gdGhpcy5lbmdpbmVzO1xuICB2YXIgb3B0cyA9IG9wdGlvbnM7XG4gIHZhciByZW5kZXJPcHRpb25zID0ge307XG4gIHZhciB2aWV3O1xuXG4gIC8vIHN1cHBvcnQgY2FsbGJhY2sgZnVuY3Rpb24gYXMgc2Vjb25kIGFyZ1xuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBkb25lID0gb3B0aW9ucztcbiAgICBvcHRzID0ge307XG4gIH1cblxuICAvLyBtZXJnZSBhcHAubG9jYWxzXG4gIG1lcmdlKHJlbmRlck9wdGlvbnMsIHRoaXMubG9jYWxzKTtcblxuICAvLyBtZXJnZSBvcHRpb25zLl9sb2NhbHNcbiAgaWYgKG9wdHMuX2xvY2Fscykge1xuICAgIG1lcmdlKHJlbmRlck9wdGlvbnMsIG9wdHMuX2xvY2Fscyk7XG4gIH1cblxuICAvLyBtZXJnZSBvcHRpb25zXG4gIG1lcmdlKHJlbmRlck9wdGlvbnMsIG9wdHMpO1xuXG4gIC8vIHNldCAuY2FjaGUgdW5sZXNzIGV4cGxpY2l0bHkgcHJvdmlkZWRcbiAgaWYgKHJlbmRlck9wdGlvbnMuY2FjaGUgPT0gbnVsbCkge1xuICAgIHJlbmRlck9wdGlvbnMuY2FjaGUgPSB0aGlzLmVuYWJsZWQoJ3ZpZXcgY2FjaGUnKTtcbiAgfVxuXG4gIC8vIHByaW1lZCBjYWNoZVxuICBpZiAocmVuZGVyT3B0aW9ucy5jYWNoZSkge1xuICAgIHZpZXcgPSBjYWNoZVtuYW1lXTtcbiAgfVxuXG4gIC8vIHZpZXdcbiAgaWYgKCF2aWV3KSB7XG4gICAgdmFyIFZpZXcgPSB0aGlzLmdldCgndmlldycpO1xuXG4gICAgdmlldyA9IG5ldyBWaWV3KG5hbWUsIHtcbiAgICAgIGRlZmF1bHRFbmdpbmU6IHRoaXMuZ2V0KCd2aWV3IGVuZ2luZScpLFxuICAgICAgcm9vdDogdGhpcy5nZXQoJ3ZpZXdzJyksXG4gICAgICBlbmdpbmVzOiBlbmdpbmVzXG4gICAgfSk7XG5cbiAgICBpZiAoIXZpZXcucGF0aCkge1xuICAgICAgdmFyIGRpcnMgPSBBcnJheS5pc0FycmF5KHZpZXcucm9vdCkgJiYgdmlldy5yb290Lmxlbmd0aCA+IDFcbiAgICAgICAgPyAnZGlyZWN0b3JpZXMgXCInICsgdmlldy5yb290LnNsaWNlKDAsIC0xKS5qb2luKCdcIiwgXCInKSArICdcIiBvciBcIicgKyB2aWV3LnJvb3Rbdmlldy5yb290Lmxlbmd0aCAtIDFdICsgJ1wiJ1xuICAgICAgICA6ICdkaXJlY3RvcnkgXCInICsgdmlldy5yb290ICsgJ1wiJ1xuICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignRmFpbGVkIHRvIGxvb2t1cCB2aWV3IFwiJyArIG5hbWUgKyAnXCIgaW4gdmlld3MgJyArIGRpcnMpO1xuICAgICAgZXJyLnZpZXcgPSB2aWV3O1xuICAgICAgcmV0dXJuIGRvbmUoZXJyKTtcbiAgICB9XG5cbiAgICAvLyBwcmltZSB0aGUgY2FjaGVcbiAgICBpZiAocmVuZGVyT3B0aW9ucy5jYWNoZSkge1xuICAgICAgY2FjaGVbbmFtZV0gPSB2aWV3O1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlbmRlclxuICB0cnlSZW5kZXIodmlldywgcmVuZGVyT3B0aW9ucywgZG9uZSk7XG59O1xuXG4vKipcbiAqIExpc3RlbiBmb3IgY29ubmVjdGlvbnMuXG4gKlxuICogQSBub2RlIGBodHRwLlNlcnZlcmAgaXMgcmV0dXJuZWQsIHdpdGggdGhpc1xuICogYXBwbGljYXRpb24gKHdoaWNoIGlzIGEgYEZ1bmN0aW9uYCkgYXMgaXRzXG4gKiBjYWxsYmFjay4gSWYgeW91IHdpc2ggdG8gY3JlYXRlIGJvdGggYW4gSFRUUFxuICogYW5kIEhUVFBTIHNlcnZlciB5b3UgbWF5IGRvIHNvIHdpdGggdGhlIFwiaHR0cFwiXG4gKiBhbmQgXCJodHRwc1wiIG1vZHVsZXMgYXMgc2hvd24gaGVyZTpcbiAqXG4gKiAgICB2YXIgaHR0cCA9IHJlcXVpcmUoJ2h0dHAnKVxuICogICAgICAsIGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKVxuICogICAgICAsIGV4cHJlc3MgPSByZXF1aXJlKCdleHByZXNzJylcbiAqICAgICAgLCBhcHAgPSBleHByZXNzKCk7XG4gKlxuICogICAgaHR0cC5jcmVhdGVTZXJ2ZXIoYXBwKS5saXN0ZW4oODApO1xuICogICAgaHR0cHMuY3JlYXRlU2VydmVyKHsgLi4uIH0sIGFwcCkubGlzdGVuKDQ0Myk7XG4gKlxuICogQHJldHVybiB7aHR0cC5TZXJ2ZXJ9XG4gKiBAcHVibGljXG4gKi9cblxuYXBwLmxpc3RlbiA9IGZ1bmN0aW9uIGxpc3RlbigpIHtcbiAgdmFyIHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKHRoaXMpO1xuICByZXR1cm4gc2VydmVyLmxpc3Rlbi5hcHBseShzZXJ2ZXIsIGFyZ3VtZW50cyk7XG59O1xuXG4vKipcbiAqIExvZyBlcnJvciB1c2luZyBjb25zb2xlLmVycm9yLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2dlcnJvcihlcnIpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHRoaXMuZ2V0KCdlbnYnKSAhPT0gJ3Rlc3QnKSBjb25zb2xlLmVycm9yKGVyci5zdGFjayB8fCBlcnIudG9TdHJpbmcoKSk7XG59XG5cbi8qKlxuICogVHJ5IHJlbmRlcmluZyBhIHZpZXcuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRyeVJlbmRlcih2aWV3LCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB0cnkge1xuICAgIHZpZXcucmVuZGVyKG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2FsbGJhY2soZXJyKTtcbiAgfVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2V4cHJlc3MvbGliL2FwcGxpY2F0aW9uLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBmaW5hbGhhbmRsZXJcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTcgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2ZpbmFsaGFuZGxlcicpXG52YXIgZW5jb2RlVXJsID0gcmVxdWlyZSgnZW5jb2RldXJsJylcbnZhciBlc2NhcGVIdG1sID0gcmVxdWlyZSgnZXNjYXBlLWh0bWwnKVxudmFyIG9uRmluaXNoZWQgPSByZXF1aXJlKCdvbi1maW5pc2hlZCcpXG52YXIgcGFyc2VVcmwgPSByZXF1aXJlKCdwYXJzZXVybCcpXG52YXIgc3RhdHVzZXMgPSByZXF1aXJlKCdzdGF0dXNlcycpXG52YXIgdW5waXBlID0gcmVxdWlyZSgndW5waXBlJylcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgRE9VQkxFX1NQQUNFX1JFR0VYUCA9IC9cXHgyMHsyfS9nXG52YXIgTkVXTElORV9SRUdFWFAgPSAvXFxuL2dcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnZhciBkZWZlciA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbidcbiAgPyBzZXRJbW1lZGlhdGVcbiAgOiBmdW5jdGlvbiAoZm4pIHsgcHJvY2Vzcy5uZXh0VGljayhmbi5iaW5kLmFwcGx5KGZuLCBhcmd1bWVudHMpKSB9XG52YXIgaXNGaW5pc2hlZCA9IG9uRmluaXNoZWQuaXNGaW5pc2hlZFxuXG4vKipcbiAqIENyZWF0ZSBhIG1pbmltYWwgSFRNTCBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVIdG1sRG9jdW1lbnQgKG1lc3NhZ2UpIHtcbiAgdmFyIGJvZHkgPSBlc2NhcGVIdG1sKG1lc3NhZ2UpXG4gICAgLnJlcGxhY2UoTkVXTElORV9SRUdFWFAsICc8YnI+JylcbiAgICAucmVwbGFjZShET1VCTEVfU1BBQ0VfUkVHRVhQLCAnICZuYnNwOycpXG5cbiAgcmV0dXJuICc8IURPQ1RZUEUgaHRtbD5cXG4nICtcbiAgICAnPGh0bWwgbGFuZz1cImVuXCI+XFxuJyArXG4gICAgJzxoZWFkPlxcbicgK1xuICAgICc8bWV0YSBjaGFyc2V0PVwidXRmLThcIj5cXG4nICtcbiAgICAnPHRpdGxlPkVycm9yPC90aXRsZT5cXG4nICtcbiAgICAnPC9oZWFkPlxcbicgK1xuICAgICc8Ym9keT5cXG4nICtcbiAgICAnPHByZT4nICsgYm9keSArICc8L3ByZT5cXG4nICtcbiAgICAnPC9ib2R5PlxcbicgK1xuICAgICc8L2h0bWw+XFxuJ1xufVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZmluYWxoYW5kbGVyXG5cbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBmaW5hbCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge1JlcXVlc3R9IHJlcVxuICogQHBhcmFtIHtSZXNwb25zZX0gcmVzXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmaW5hbGhhbmRsZXIgKHJlcSwgcmVzLCBvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fVxuXG4gIC8vIGdldCBlbnZpcm9ubWVudFxuICB2YXIgZW52ID0gb3B0cy5lbnYgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgJ2RldmVsb3BtZW50J1xuXG4gIC8vIGdldCBlcnJvciBjYWxsYmFja1xuICB2YXIgb25lcnJvciA9IG9wdHMub25lcnJvclxuXG4gIHJldHVybiBmdW5jdGlvbiAoZXJyKSB7XG4gICAgdmFyIGhlYWRlcnNcbiAgICB2YXIgbXNnXG4gICAgdmFyIHN0YXR1c1xuXG4gICAgLy8gaWdub3JlIDQwNCBvbiBpbi1mbGlnaHQgcmVzcG9uc2VcbiAgICBpZiAoIWVyciAmJiBoZWFkZXJzU2VudChyZXMpKSB7XG4gICAgICBkZWJ1ZygnY2Fubm90IDQwNCBhZnRlciBoZWFkZXJzIHNlbnQnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdW5oYW5kbGVkIGVycm9yXG4gICAgaWYgKGVycikge1xuICAgICAgLy8gcmVzcGVjdCBzdGF0dXMgY29kZSBmcm9tIGVycm9yXG4gICAgICBzdGF0dXMgPSBnZXRFcnJvclN0YXR1c0NvZGUoZXJyKVxuXG4gICAgICBpZiAoc3RhdHVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gZmFsbGJhY2sgdG8gc3RhdHVzIGNvZGUgb24gcmVzcG9uc2VcbiAgICAgICAgc3RhdHVzID0gZ2V0UmVzcG9uc2VTdGF0dXNDb2RlKHJlcylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlc3BlY3QgaGVhZGVycyBmcm9tIGVycm9yXG4gICAgICAgIGhlYWRlcnMgPSBnZXRFcnJvckhlYWRlcnMoZXJyKVxuICAgICAgfVxuXG4gICAgICAvLyBnZXQgZXJyb3IgbWVzc2FnZVxuICAgICAgbXNnID0gZ2V0RXJyb3JNZXNzYWdlKGVyciwgc3RhdHVzLCBlbnYpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vdCBmb3VuZFxuICAgICAgc3RhdHVzID0gNDA0XG4gICAgICBtc2cgPSAnQ2Fubm90ICcgKyByZXEubWV0aG9kICsgJyAnICsgZW5jb2RlVXJsKGdldFJlc291cmNlTmFtZShyZXEpKVxuICAgIH1cblxuICAgIGRlYnVnKCdkZWZhdWx0ICVzJywgc3RhdHVzKVxuXG4gICAgLy8gc2NoZWR1bGUgb25lcnJvciBjYWxsYmFja1xuICAgIGlmIChlcnIgJiYgb25lcnJvcikge1xuICAgICAgZGVmZXIob25lcnJvciwgZXJyLCByZXEsIHJlcylcbiAgICB9XG5cbiAgICAvLyBjYW5ub3QgYWN0dWFsbHkgcmVzcG9uZFxuICAgIGlmIChoZWFkZXJzU2VudChyZXMpKSB7XG4gICAgICBkZWJ1ZygnY2Fubm90ICVkIGFmdGVyIGhlYWRlcnMgc2VudCcsIHN0YXR1cylcbiAgICAgIHJlcS5zb2NrZXQuZGVzdHJveSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBzZW5kIHJlc3BvbnNlXG4gICAgc2VuZChyZXEsIHJlcywgc3RhdHVzLCBoZWFkZXJzLCBtc2cpXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgaGVhZGVycyBmcm9tIEVycm9yIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXJyb3JIZWFkZXJzIChlcnIpIHtcbiAgaWYgKCFlcnIuaGVhZGVycyB8fCB0eXBlb2YgZXJyLmhlYWRlcnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgdmFyIGhlYWRlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZXJyLmhlYWRlcnMpXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV1cbiAgICBoZWFkZXJzW2tleV0gPSBlcnIuaGVhZGVyc1trZXldXG4gIH1cblxuICByZXR1cm4gaGVhZGVyc1xufVxuXG4vKipcbiAqIEdldCBtZXNzYWdlIGZyb20gRXJyb3Igb2JqZWN0LCBmYWxsYmFjayB0byBzdGF0dXMgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbnZcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlIChlcnIsIHN0YXR1cywgZW52KSB7XG4gIHZhciBtc2dcblxuICBpZiAoZW52ICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyB1c2UgZXJyLnN0YWNrLCB3aGljaCB0eXBpY2FsbHkgaW5jbHVkZXMgZXJyLm1lc3NhZ2VcbiAgICBtc2cgPSBlcnIuc3RhY2tcblxuICAgIC8vIGZhbGxiYWNrIHRvIGVyci50b1N0cmluZygpIHdoZW4gcG9zc2libGVcbiAgICBpZiAoIW1zZyAmJiB0eXBlb2YgZXJyLnRvU3RyaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtc2cgPSBlcnIudG9TdHJpbmcoKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtc2cgfHwgc3RhdHVzZXNbc3RhdHVzXVxufVxuXG4vKipcbiAqIEdldCBzdGF0dXMgY29kZSBmcm9tIEVycm9yIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXJyb3JTdGF0dXNDb2RlIChlcnIpIHtcbiAgLy8gY2hlY2sgZXJyLnN0YXR1c1xuICBpZiAodHlwZW9mIGVyci5zdGF0dXMgPT09ICdudW1iZXInICYmIGVyci5zdGF0dXMgPj0gNDAwICYmIGVyci5zdGF0dXMgPCA2MDApIHtcbiAgICByZXR1cm4gZXJyLnN0YXR1c1xuICB9XG5cbiAgLy8gY2hlY2sgZXJyLnN0YXR1c0NvZGVcbiAgaWYgKHR5cGVvZiBlcnIuc3RhdHVzQ29kZSA9PT0gJ251bWJlcicgJiYgZXJyLnN0YXR1c0NvZGUgPj0gNDAwICYmIGVyci5zdGF0dXNDb2RlIDwgNjAwKSB7XG4gICAgcmV0dXJuIGVyci5zdGF0dXNDb2RlXG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogR2V0IHJlc291cmNlIG5hbWUgZm9yIHRoZSByZXF1ZXN0LlxuICpcbiAqIFRoaXMgaXMgdHlwaWNhbGx5IGp1c3QgdGhlIG9yaWdpbmFsIHBhdGhuYW1lIG9mIHRoZSByZXF1ZXN0XG4gKiBidXQgd2lsbCBmYWxsYmFjayB0byBcInJlc291cmNlXCIgaXMgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAqXG4gKiBAcGFyYW0ge0luY29taW5nTWVzc2FnZX0gcmVxXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldFJlc291cmNlTmFtZSAocmVxKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlVXJsLm9yaWdpbmFsKHJlcSkucGF0aG5hbWVcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiAncmVzb3VyY2UnXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgc3RhdHVzIGNvZGUgZnJvbSByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge091dGdvaW5nTWVzc2FnZX0gcmVzXG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldFJlc3BvbnNlU3RhdHVzQ29kZSAocmVzKSB7XG4gIHZhciBzdGF0dXMgPSByZXMuc3RhdHVzQ29kZVxuXG4gIC8vIGRlZmF1bHQgc3RhdHVzIGNvZGUgdG8gNTAwIGlmIG91dHNpZGUgdmFsaWQgcmFuZ2VcbiAgaWYgKHR5cGVvZiBzdGF0dXMgIT09ICdudW1iZXInIHx8IHN0YXR1cyA8IDQwMCB8fCBzdGF0dXMgPiA1OTkpIHtcbiAgICBzdGF0dXMgPSA1MDBcbiAgfVxuXG4gIHJldHVybiBzdGF0dXNcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIHJlc3BvbnNlIGhlYWRlcnMgaGF2ZSBiZWVuIHNlbnQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGhlYWRlcnNTZW50IChyZXMpIHtcbiAgcmV0dXJuIHR5cGVvZiByZXMuaGVhZGVyc1NlbnQgIT09ICdib29sZWFuJ1xuICAgID8gQm9vbGVhbihyZXMuX2hlYWRlcilcbiAgICA6IHJlcy5oZWFkZXJzU2VudFxufVxuXG4vKipcbiAqIFNlbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtJbmNvbWluZ01lc3NhZ2V9IHJlcVxuICogQHBhcmFtIHtPdXRnb2luZ01lc3NhZ2V9IHJlc1xuICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICogQHBhcmFtIHtvYmplY3R9IGhlYWRlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNlbmQgKHJlcSwgcmVzLCBzdGF0dXMsIGhlYWRlcnMsIG1lc3NhZ2UpIHtcbiAgZnVuY3Rpb24gd3JpdGUgKCkge1xuICAgIC8vIHJlc3BvbnNlIGJvZHlcbiAgICB2YXIgYm9keSA9IGNyZWF0ZUh0bWxEb2N1bWVudChtZXNzYWdlKVxuXG4gICAgLy8gcmVzcG9uc2Ugc3RhdHVzXG4gICAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXNcbiAgICByZXMuc3RhdHVzTWVzc2FnZSA9IHN0YXR1c2VzW3N0YXR1c11cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnNcbiAgICBzZXRIZWFkZXJzKHJlcywgaGVhZGVycylcblxuICAgIC8vIHNlY3VyaXR5IGhlYWRlcnNcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsIFwiZGVmYXVsdC1zcmMgJ3NlbGYnXCIpXG4gICAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJylcblxuICAgIC8vIHN0YW5kYXJkIGhlYWRlcnNcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JylcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHksICd1dGY4JykpXG5cbiAgICBpZiAocmVxLm1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgICByZXMuZW5kKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJlcy5lbmQoYm9keSwgJ3V0ZjgnKVxuICB9XG5cbiAgaWYgKGlzRmluaXNoZWQocmVxKSkge1xuICAgIHdyaXRlKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIHVucGlwZSBldmVyeXRoaW5nIGZyb20gdGhlIHJlcXVlc3RcbiAgdW5waXBlKHJlcSlcblxuICAvLyBmbHVzaCB0aGUgcmVxdWVzdFxuICBvbkZpbmlzaGVkKHJlcSwgd3JpdGUpXG4gIHJlcS5yZXN1bWUoKVxufVxuXG4vKipcbiAqIFNldCByZXNwb25zZSBoZWFkZXJzIGZyb20gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T3V0Z29pbmdNZXNzYWdlfSByZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBoZWFkZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNldEhlYWRlcnMgKHJlcywgaGVhZGVycykge1xuICBpZiAoIWhlYWRlcnMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycylcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNbaV1cbiAgICByZXMuc2V0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKVxuICB9XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvZmluYWxoYW5kbGVyL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxNjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBFeHBvc2UgYHBhdGh0b1JlZ2V4cGAuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwYXRodG9SZWdleHA7XG5cbi8qKlxuICogTWF0Y2ggbWF0Y2hpbmcgZ3JvdXBzIGluIGEgcmVndWxhciBleHByZXNzaW9uLlxuICovXG52YXIgTUFUQ0hJTkdfR1JPVVBfUkVHRVhQID0gL1xcKCg/IVxcPykvZztcblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIGdpdmVuIHBhdGggc3RyaW5nLFxuICogcmV0dXJuaW5nIGEgcmVndWxhciBleHByZXNzaW9uLlxuICpcbiAqIEFuIGVtcHR5IGFycmF5IHNob3VsZCBiZSBwYXNzZWQsXG4gKiB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIHBsYWNlaG9sZGVyXG4gKiBrZXkgbmFtZXMuIEZvciBleGFtcGxlIFwiL3VzZXIvOmlkXCIgd2lsbFxuICogdGhlbiBjb250YWluIFtcImlkXCJdLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ3xSZWdFeHB8QXJyYXl9IHBhdGhcbiAqIEBwYXJhbSAge0FycmF5fSBrZXlzXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1JlZ0V4cH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhdGh0b1JlZ2V4cChwYXRoLCBrZXlzLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBrZXlzID0ga2V5cyB8fCBbXTtcbiAgdmFyIHN0cmljdCA9IG9wdGlvbnMuc3RyaWN0O1xuICB2YXIgZW5kID0gb3B0aW9ucy5lbmQgIT09IGZhbHNlO1xuICB2YXIgZmxhZ3MgPSBvcHRpb25zLnNlbnNpdGl2ZSA/ICcnIDogJ2knO1xuICB2YXIgZXh0cmFPZmZzZXQgPSAwO1xuICB2YXIga2V5c09mZnNldCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBuYW1lID0gMDtcbiAgdmFyIG07XG5cbiAgaWYgKHBhdGggaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICB3aGlsZSAobSA9IE1BVENISU5HX0dST1VQX1JFR0VYUC5leGVjKHBhdGguc291cmNlKSkge1xuICAgICAga2V5cy5wdXNoKHtcbiAgICAgICAgbmFtZTogbmFtZSsrLFxuICAgICAgICBvcHRpb25hbDogZmFsc2UsXG4gICAgICAgIG9mZnNldDogbS5pbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgIC8vIE1hcCBhcnJheSBwYXJ0cyBpbnRvIHJlZ2V4cHMgYW5kIHJldHVybiB0aGVpciBzb3VyY2UuIFdlIGFsc28gcGFzc1xuICAgIC8vIHRoZSBzYW1lIGtleXMgYW5kIG9wdGlvbnMgaW5zdGFuY2UgaW50byBldmVyeSBnZW5lcmF0aW9uIHRvIGdldFxuICAgIC8vIGNvbnNpc3RlbnQgbWF0Y2hpbmcgZ3JvdXBzIGJlZm9yZSB3ZSBqb2luIHRoZSBzb3VyY2VzIHRvZ2V0aGVyLlxuICAgIHBhdGggPSBwYXRoLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBwYXRodG9SZWdleHAodmFsdWUsIGtleXMsIG9wdGlvbnMpLnNvdXJjZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUmVnRXhwKCcoPzonICsgcGF0aC5qb2luKCd8JykgKyAnKScsIGZsYWdzKTtcbiAgfVxuXG4gIHBhdGggPSAoJ14nICsgcGF0aCArIChzdHJpY3QgPyAnJyA6IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gJy8nID8gJz8nIDogJy8/JykpXG4gICAgLnJlcGxhY2UoL1xcL1xcKC9nLCAnLyg/OicpXG4gICAgLnJlcGxhY2UoLyhbXFwvXFwuXSkvZywgJ1xcXFwkMScpXG4gICAgLnJlcGxhY2UoLyhcXFxcXFwvKT8oXFxcXFxcLik/OihcXHcrKShcXCguKj9cXCkpPyhcXCopPyhcXD8pPy9nLCBmdW5jdGlvbiAobWF0Y2gsIHNsYXNoLCBmb3JtYXQsIGtleSwgY2FwdHVyZSwgc3Rhciwgb3B0aW9uYWwsIG9mZnNldCkge1xuICAgICAgc2xhc2ggPSBzbGFzaCB8fCAnJztcbiAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgIGNhcHR1cmUgPSBjYXB0dXJlIHx8ICcoW15cXFxcLycgKyBmb3JtYXQgKyAnXSs/KSc7XG4gICAgICBvcHRpb25hbCA9IG9wdGlvbmFsIHx8ICcnO1xuXG4gICAgICBrZXlzLnB1c2goe1xuICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgIG9wdGlvbmFsOiAhIW9wdGlvbmFsLFxuICAgICAgICBvZmZzZXQ6IG9mZnNldCArIGV4dHJhT2Zmc2V0XG4gICAgICB9KTtcblxuICAgICAgdmFyIHJlc3VsdCA9ICcnXG4gICAgICAgICsgKG9wdGlvbmFsID8gJycgOiBzbGFzaClcbiAgICAgICAgKyAnKD86J1xuICAgICAgICArIGZvcm1hdCArIChvcHRpb25hbCA/IHNsYXNoIDogJycpICsgY2FwdHVyZVxuICAgICAgICArIChzdGFyID8gJygoPzpbXFxcXC8nICsgZm9ybWF0ICsgJ10uKz8pPyknIDogJycpXG4gICAgICAgICsgJyknXG4gICAgICAgICsgb3B0aW9uYWw7XG5cbiAgICAgIGV4dHJhT2Zmc2V0ICs9IHJlc3VsdC5sZW5ndGggLSBtYXRjaC5sZW5ndGg7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSlcbiAgICAucmVwbGFjZSgvXFwqL2csIGZ1bmN0aW9uIChzdGFyLCBpbmRleCkge1xuICAgICAgdmFyIGxlbiA9IGtleXMubGVuZ3RoXG5cbiAgICAgIHdoaWxlIChsZW4tLSA+IGtleXNPZmZzZXQgJiYga2V5c1tsZW5dLm9mZnNldCA+IGluZGV4KSB7XG4gICAgICAgIGtleXNbbGVuXS5vZmZzZXQgKz0gMzsgLy8gUmVwbGFjZW1lbnQgbGVuZ3RoIG1pbnVzIGFzdGVyaXNrIGxlbmd0aC5cbiAgICAgIH1cblxuICAgICAgcmV0dXJuICcoLiopJztcbiAgICB9KTtcblxuICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgaGFuZGxpbmcgdW5uYW1lZCBtYXRjaGluZyBncm91cHMuXG4gIHdoaWxlIChtID0gTUFUQ0hJTkdfR1JPVVBfUkVHRVhQLmV4ZWMocGF0aCkpIHtcbiAgICB2YXIgZXNjYXBlQ291bnQgPSAwO1xuICAgIHZhciBpbmRleCA9IG0uaW5kZXg7XG5cbiAgICB3aGlsZSAocGF0aC5jaGFyQXQoLS1pbmRleCkgPT09ICdcXFxcJykge1xuICAgICAgZXNjYXBlQ291bnQrKztcbiAgICB9XG5cbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIGVzY2FwZSB0aGUgYnJhY2tldC5cbiAgICBpZiAoZXNjYXBlQ291bnQgJSAyID09PSAxKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoa2V5c09mZnNldCArIGkgPT09IGtleXMubGVuZ3RoIHx8IGtleXNba2V5c09mZnNldCArIGldLm9mZnNldCA+IG0uaW5kZXgpIHtcbiAgICAgIGtleXMuc3BsaWNlKGtleXNPZmZzZXQgKyBpLCAwLCB7XG4gICAgICAgIG5hbWU6IG5hbWUrKywgLy8gVW5uYW1lZCBtYXRjaGluZyBncm91cHMgbXVzdCBiZSBjb25zaXN0ZW50bHkgbGluZWFyLlxuICAgICAgICBvcHRpb25hbDogZmFsc2UsXG4gICAgICAgIG9mZnNldDogbS5pbmRleFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaSsrO1xuICB9XG5cbiAgLy8gSWYgdGhlIHBhdGggaXMgbm9uLWVuZGluZywgbWF0Y2ggdW50aWwgdGhlIGVuZCBvciBhIHNsYXNoLlxuICBwYXRoICs9IChlbmQgPyAnJCcgOiAocGF0aFtwYXRoLmxlbmd0aCAtIDFdID09PSAnLycgPyAnJyA6ICcoPz1cXFxcL3wkKScpKTtcblxuICByZXR1cm4gbmV3IFJlZ0V4cChwYXRoLCBmbGFncyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3BhdGgtdG8tcmVnZXhwL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxNjNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJ3NldHByb3RvdHlwZW9mJylcblxuLyoqXG4gKiBJbml0aWFsaXphdGlvbiBtaWRkbGV3YXJlLCBleHBvc2luZyB0aGVcbiAqIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRvIGVhY2ggb3RoZXIsIGFzIHdlbGxcbiAqIGFzIGRlZmF1bHRpbmcgdGhlIFgtUG93ZXJlZC1CeSBoZWFkZXIgZmllbGQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXBwXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMuaW5pdCA9IGZ1bmN0aW9uKGFwcCl7XG4gIHJldHVybiBmdW5jdGlvbiBleHByZXNzSW5pdChyZXEsIHJlcywgbmV4dCl7XG4gICAgaWYgKGFwcC5lbmFibGVkKCd4LXBvd2VyZWQtYnknKSkgcmVzLnNldEhlYWRlcignWC1Qb3dlcmVkLUJ5JywgJ0V4cHJlc3MnKTtcbiAgICByZXEucmVzID0gcmVzO1xuICAgIHJlcy5yZXEgPSByZXE7XG4gICAgcmVxLm5leHQgPSBuZXh0O1xuXG4gICAgc2V0UHJvdG90eXBlT2YocmVxLCBhcHAucmVxdWVzdClcbiAgICBzZXRQcm90b3R5cGVPZihyZXMsIGFwcC5yZXNwb25zZSlcblxuICAgIHJlcy5sb2NhbHMgPSByZXMubG9jYWxzIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICBuZXh0KCk7XG4gIH07XG59O1xuXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvbWlkZGxld2FyZS9pbml0LmpzXG4vLyBtb2R1bGUgaWQgPSAxNjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxMyBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBkZWJ1ZyA9IHJlcXVpcmUoJ2RlYnVnJykoJ2V4cHJlc3M6dmlldycpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgZnMgPSByZXF1aXJlKCdmcycpO1xuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBkaXJuYW1lID0gcGF0aC5kaXJuYW1lO1xudmFyIGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZTtcbnZhciBleHRuYW1lID0gcGF0aC5leHRuYW1lO1xudmFyIGpvaW4gPSBwYXRoLmpvaW47XG52YXIgcmVzb2x2ZSA9IHBhdGgucmVzb2x2ZTtcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZpZXc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgVmlld2Agd2l0aCB0aGUgZ2l2ZW4gYG5hbWVgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogICAtIGBkZWZhdWx0RW5naW5lYCB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBlbmdpbmUgbmFtZVxuICogICAtIGBlbmdpbmVzYCB0ZW1wbGF0ZSBlbmdpbmUgcmVxdWlyZSgpIGNhY2hlXG4gKiAgIC0gYHJvb3RgIHJvb3QgcGF0aCBmb3IgdmlldyBsb29rdXBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBWaWV3KG5hbWUsIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHRoaXMuZGVmYXVsdEVuZ2luZSA9IG9wdHMuZGVmYXVsdEVuZ2luZTtcbiAgdGhpcy5leHQgPSBleHRuYW1lKG5hbWUpO1xuICB0aGlzLm5hbWUgPSBuYW1lO1xuICB0aGlzLnJvb3QgPSBvcHRzLnJvb3Q7XG5cbiAgaWYgKCF0aGlzLmV4dCAmJiAhdGhpcy5kZWZhdWx0RW5naW5lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBkZWZhdWx0IGVuZ2luZSB3YXMgc3BlY2lmaWVkIGFuZCBubyBleHRlbnNpb24gd2FzIHByb3ZpZGVkLicpO1xuICB9XG5cbiAgdmFyIGZpbGVOYW1lID0gbmFtZTtcblxuICBpZiAoIXRoaXMuZXh0KSB7XG4gICAgLy8gZ2V0IGV4dGVuc2lvbiBmcm9tIGRlZmF1bHQgZW5naW5lIG5hbWVcbiAgICB0aGlzLmV4dCA9IHRoaXMuZGVmYXVsdEVuZ2luZVswXSAhPT0gJy4nXG4gICAgICA/ICcuJyArIHRoaXMuZGVmYXVsdEVuZ2luZVxuICAgICAgOiB0aGlzLmRlZmF1bHRFbmdpbmU7XG5cbiAgICBmaWxlTmFtZSArPSB0aGlzLmV4dDtcbiAgfVxuXG4gIGlmICghb3B0cy5lbmdpbmVzW3RoaXMuZXh0XSkge1xuICAgIC8vIGxvYWQgZW5naW5lXG4gICAgdmFyIG1vZCA9IHRoaXMuZXh0LnN1YnN0cigxKVxuICAgIGRlYnVnKCdyZXF1aXJlIFwiJXNcIicsIG1vZClcblxuICAgIC8vIGRlZmF1bHQgZW5naW5lIGV4cG9ydFxuICAgIHZhciBmbiA9IHJlcXVpcmUobW9kKS5fX2V4cHJlc3NcblxuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kdWxlIFwiJyArIG1vZCArICdcIiBkb2VzIG5vdCBwcm92aWRlIGEgdmlldyBlbmdpbmUuJylcbiAgICB9XG5cbiAgICBvcHRzLmVuZ2luZXNbdGhpcy5leHRdID0gZm5cbiAgfVxuXG4gIC8vIHN0b3JlIGxvYWRlZCBlbmdpbmVcbiAgdGhpcy5lbmdpbmUgPSBvcHRzLmVuZ2luZXNbdGhpcy5leHRdO1xuXG4gIC8vIGxvb2t1cCBwYXRoXG4gIHRoaXMucGF0aCA9IHRoaXMubG9va3VwKGZpbGVOYW1lKTtcbn1cblxuLyoqXG4gKiBMb29rdXAgdmlldyBieSB0aGUgZ2l2ZW4gYG5hbWVgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwcml2YXRlXG4gKi9cblxuVmlldy5wcm90b3R5cGUubG9va3VwID0gZnVuY3Rpb24gbG9va3VwKG5hbWUpIHtcbiAgdmFyIHBhdGg7XG4gIHZhciByb290cyA9IFtdLmNvbmNhdCh0aGlzLnJvb3QpO1xuXG4gIGRlYnVnKCdsb29rdXAgXCIlc1wiJywgbmFtZSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByb290cy5sZW5ndGggJiYgIXBhdGg7IGkrKykge1xuICAgIHZhciByb290ID0gcm9vdHNbaV07XG5cbiAgICAvLyByZXNvbHZlIHRoZSBwYXRoXG4gICAgdmFyIGxvYyA9IHJlc29sdmUocm9vdCwgbmFtZSk7XG4gICAgdmFyIGRpciA9IGRpcm5hbWUobG9jKTtcbiAgICB2YXIgZmlsZSA9IGJhc2VuYW1lKGxvYyk7XG5cbiAgICAvLyByZXNvbHZlIHRoZSBmaWxlXG4gICAgcGF0aCA9IHRoaXMucmVzb2x2ZShkaXIsIGZpbGUpO1xuICB9XG5cbiAgcmV0dXJuIHBhdGg7XG59O1xuXG4vKipcbiAqIFJlbmRlciB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHByaXZhdGVcbiAqL1xuXG5WaWV3LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgZGVidWcoJ3JlbmRlciBcIiVzXCInLCB0aGlzLnBhdGgpO1xuICB0aGlzLmVuZ2luZSh0aGlzLnBhdGgsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZmlsZSB3aXRoaW4gdGhlIGdpdmVuIGRpcmVjdG9yeS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVxuICogQHByaXZhdGVcbiAqL1xuXG5WaWV3LnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gcmVzb2x2ZShkaXIsIGZpbGUpIHtcbiAgdmFyIGV4dCA9IHRoaXMuZXh0O1xuXG4gIC8vIDxwYXRoPi48ZXh0PlxuICB2YXIgcGF0aCA9IGpvaW4oZGlyLCBmaWxlKTtcbiAgdmFyIHN0YXQgPSB0cnlTdGF0KHBhdGgpO1xuXG4gIGlmIChzdGF0ICYmIHN0YXQuaXNGaWxlKCkpIHtcbiAgICByZXR1cm4gcGF0aDtcbiAgfVxuXG4gIC8vIDxwYXRoPi9pbmRleC48ZXh0PlxuICBwYXRoID0gam9pbihkaXIsIGJhc2VuYW1lKGZpbGUsIGV4dCksICdpbmRleCcgKyBleHQpO1xuICBzdGF0ID0gdHJ5U3RhdChwYXRoKTtcblxuICBpZiAoc3RhdCAmJiBzdGF0LmlzRmlsZSgpKSB7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJuIGEgc3RhdCwgbWF5YmUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm4ge2ZzLlN0YXRzfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB0cnlTdGF0KHBhdGgpIHtcbiAgZGVidWcoJ3N0YXQgXCIlc1wiJywgcGF0aCk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZnMuc3RhdFN5bmMocGF0aCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvdmlldy5qc1xuLy8gbW9kdWxlIGlkID0gMTY1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImZ1bmN0aW9uIHdlYnBhY2tFbXB0eUNvbnRleHQocmVxKSB7XG5cdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIgKyByZXEgKyBcIicuXCIpO1xufVxud2VicGFja0VtcHR5Q29udGV4dC5rZXlzID0gZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfTtcbndlYnBhY2tFbXB0eUNvbnRleHQucmVzb2x2ZSA9IHdlYnBhY2tFbXB0eUNvbnRleHQ7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tFbXB0eUNvbnRleHQ7XG53ZWJwYWNrRW1wdHlDb250ZXh0LmlkID0gMTY2O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9leHByZXNzL2xpYlxuLy8gbW9kdWxlIGlkID0gMTY2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogZGVzdHJveVxuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgUmVhZFN0cmVhbSA9IHJlcXVpcmUoJ2ZzJykuUmVhZFN0cmVhbVxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXN0cm95XG5cbi8qKlxuICogRGVzdHJveSBhIHN0cmVhbS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gc3RyZWFtXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVzdHJveShzdHJlYW0pIHtcbiAgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIFJlYWRTdHJlYW0pIHtcbiAgICByZXR1cm4gZGVzdHJveVJlYWRTdHJlYW0oc3RyZWFtKVxuICB9XG5cbiAgaWYgKCEoc3RyZWFtIGluc3RhbmNlb2YgU3RyZWFtKSkge1xuICAgIHJldHVybiBzdHJlYW1cbiAgfVxuXG4gIGlmICh0eXBlb2Ygc3RyZWFtLmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdHJlYW0uZGVzdHJveSgpXG4gIH1cblxuICByZXR1cm4gc3RyZWFtXG59XG5cbi8qKlxuICogRGVzdHJveSBhIFJlYWRTdHJlYW0uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHN0cmVhbVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBkZXN0cm95UmVhZFN0cmVhbShzdHJlYW0pIHtcbiAgc3RyZWFtLmRlc3Ryb3koKVxuXG4gIGlmICh0eXBlb2Ygc3RyZWFtLmNsb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gbm9kZS5qcyBjb3JlIGJ1ZyB3b3JrLWFyb3VuZFxuICAgIHN0cmVhbS5vbignb3BlbicsIG9uT3BlbkNsb3NlKVxuICB9XG5cbiAgcmV0dXJuIHN0cmVhbVxufVxuXG4vKipcbiAqIE9uIG9wZW4gaGFuZGxlciB0byBjbG9zZSBzdHJlYW0uXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG9uT3BlbkNsb3NlKCkge1xuICBpZiAodHlwZW9mIHRoaXMuZmQgPT09ICdudW1iZXInKSB7XG4gICAgLy8gYWN0dWFsbHkgY2xvc2UgZG93biB0aGUgZmRcbiAgICB0aGlzLmNsb3NlKClcbiAgfVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2Rlc3Ryb3kvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDE2N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmZ1bmN0aW9uIE1pbWUoKSB7XG4gIC8vIE1hcCBvZiBleHRlbnNpb24gLT4gbWltZSB0eXBlXG4gIHRoaXMudHlwZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vIE1hcCBvZiBtaW1lIHR5cGUgLT4gZXh0ZW5zaW9uXG4gIHRoaXMuZXh0ZW5zaW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG59XG5cbi8qKlxuICogRGVmaW5lIG1pbWV0eXBlIC0+IGV4dGVuc2lvbiBtYXBwaW5ncy4gIEVhY2gga2V5IGlzIGEgbWltZS10eXBlIHRoYXQgbWFwc1xuICogdG8gYW4gYXJyYXkgb2YgZXh0ZW5zaW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHR5cGUuICBUaGUgZmlyc3QgZXh0ZW5zaW9uIGlzXG4gKiB1c2VkIGFzIHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgdGhlIHR5cGUuXG4gKlxuICogZS5nLiBtaW1lLmRlZmluZSh7J2F1ZGlvL29nZycsIFsnb2dhJywgJ29nZycsICdzcHgnXX0pO1xuICpcbiAqIEBwYXJhbSBtYXAgKE9iamVjdCkgdHlwZSBkZWZpbml0aW9uc1xuICovXG5NaW1lLnByb3RvdHlwZS5kZWZpbmUgPSBmdW5jdGlvbiAobWFwKSB7XG4gIGZvciAodmFyIHR5cGUgaW4gbWFwKSB7XG4gICAgdmFyIGV4dHMgPSBtYXBbdHlwZV07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuREVCVUdfTUlNRSAmJiB0aGlzLnR5cGVzW2V4dHNbaV1dKSB7XG4gICAgICAgIGNvbnNvbGUud2FybigodGhpcy5fbG9hZGluZyB8fCBcImRlZmluZSgpXCIpLnJlcGxhY2UoLy4qXFwvLywgJycpLCAnY2hhbmdlcyBcIicgKyBleHRzW2ldICsgJ1wiIGV4dGVuc2lvbiB0eXBlIGZyb20gJyArXG4gICAgICAgICAgdGhpcy50eXBlc1tleHRzW2ldXSArICcgdG8gJyArIHR5cGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnR5cGVzW2V4dHNbaV1dID0gdHlwZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGV4dGVuc2lvbiBpcyB0aGUgZmlyc3Qgb25lIHdlIGVuY291bnRlclxuICAgIGlmICghdGhpcy5leHRlbnNpb25zW3R5cGVdKSB7XG4gICAgICB0aGlzLmV4dGVuc2lvbnNbdHlwZV0gPSBleHRzWzBdO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMb2FkIGFuIEFwYWNoZTItc3R5bGUgXCIudHlwZXNcIiBmaWxlXG4gKlxuICogVGhpcyBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIChpdCdzIGV4cGVjdGVkKS4gIFdoZXJlIGZpbGVzIGRlY2xhcmVcbiAqIG92ZXJsYXBwaW5nIHR5cGVzL2V4dGVuc2lvbnMsIHRoZSBsYXN0IGZpbGUgd2lucy5cbiAqXG4gKiBAcGFyYW0gZmlsZSAoU3RyaW5nKSBwYXRoIG9mIGZpbGUgdG8gbG9hZC5cbiAqL1xuTWltZS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uKGZpbGUpIHtcbiAgdGhpcy5fbG9hZGluZyA9IGZpbGU7XG4gIC8vIFJlYWQgZmlsZSBhbmQgc3BsaXQgaW50byBsaW5lc1xuICB2YXIgbWFwID0ge30sXG4gICAgICBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICdhc2NpaScpLFxuICAgICAgbGluZXMgPSBjb250ZW50LnNwbGl0KC9bXFxyXFxuXSsvKTtcblxuICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAvLyBDbGVhbiB1cCB3aGl0ZXNwYWNlL2NvbW1lbnRzLCBhbmQgc3BsaXQgaW50byBmaWVsZHNcbiAgICB2YXIgZmllbGRzID0gbGluZS5yZXBsYWNlKC9cXHMqIy4qfF5cXHMqfFxccyokL2csICcnKS5zcGxpdCgvXFxzKy8pO1xuICAgIG1hcFtmaWVsZHMuc2hpZnQoKV0gPSBmaWVsZHM7XG4gIH0pO1xuXG4gIHRoaXMuZGVmaW5lKG1hcCk7XG5cbiAgdGhpcy5fbG9hZGluZyA9IG51bGw7XG59O1xuXG4vKipcbiAqIExvb2t1cCBhIG1pbWUgdHlwZSBiYXNlZCBvbiBleHRlbnNpb25cbiAqL1xuTWltZS5wcm90b3R5cGUubG9va3VwID0gZnVuY3Rpb24ocGF0aCwgZmFsbGJhY2spIHtcbiAgdmFyIGV4dCA9IHBhdGgucmVwbGFjZSgvXi4qW1xcLlxcL1xcXFxdLywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgcmV0dXJuIHRoaXMudHlwZXNbZXh0XSB8fCBmYWxsYmFjayB8fCB0aGlzLmRlZmF1bHRfdHlwZTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGZpbGUgZXh0ZW5zaW9uIGFzc29jaWF0ZWQgd2l0aCBhIG1pbWUgdHlwZVxuICovXG5NaW1lLnByb3RvdHlwZS5leHRlbnNpb24gPSBmdW5jdGlvbihtaW1lVHlwZSkge1xuICB2YXIgdHlwZSA9IG1pbWVUeXBlLm1hdGNoKC9eXFxzKihbXjtcXHNdKikoPzo7fFxcc3wkKS8pWzFdLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiB0aGlzLmV4dGVuc2lvbnNbdHlwZV07XG59O1xuXG4vLyBEZWZhdWx0IGluc3RhbmNlXG52YXIgbWltZSA9IG5ldyBNaW1lKCk7XG5cbi8vIERlZmluZSBidWlsdC1pbiB0eXBlc1xubWltZS5kZWZpbmUocmVxdWlyZSgnLi90eXBlcy5qc29uJykpO1xuXG4vLyBEZWZhdWx0IHR5cGVcbm1pbWUuZGVmYXVsdF90eXBlID0gbWltZS5sb29rdXAoJ2JpbicpO1xuXG4vL1xuLy8gQWRkaXRpb25hbCBBUEkgc3BlY2lmaWMgdG8gdGhlIGRlZmF1bHQgaW5zdGFuY2Vcbi8vXG5cbm1pbWUuTWltZSA9IE1pbWU7XG5cbi8qKlxuICogTG9va3VwIGEgY2hhcnNldCBiYXNlZCBvbiBtaW1lIHR5cGUuXG4gKi9cbm1pbWUuY2hhcnNldHMgPSB7XG4gIGxvb2t1cDogZnVuY3Rpb24obWltZVR5cGUsIGZhbGxiYWNrKSB7XG4gICAgLy8gQXNzdW1lIHRleHQgdHlwZXMgYXJlIHV0ZjhcbiAgICByZXR1cm4gKC9edGV4dFxcL3xeYXBwbGljYXRpb25cXC8oamF2YXNjcmlwdHxqc29uKS8pLnRlc3QobWltZVR5cGUpID8gJ1VURi04JyA6IGZhbGxiYWNrO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1pbWU7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvbWltZS9taW1lLmpzXG4vLyBtb2R1bGUgaWQgPSAxNjhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSB7XCJhcHBsaWNhdGlvbi9hbmRyZXctaW5zZXRcIjpbXCJlelwiXSxcImFwcGxpY2F0aW9uL2FwcGxpeHdhcmVcIjpbXCJhd1wiXSxcImFwcGxpY2F0aW9uL2F0b20reG1sXCI6W1wiYXRvbVwiXSxcImFwcGxpY2F0aW9uL2F0b21jYXQreG1sXCI6W1wiYXRvbWNhdFwiXSxcImFwcGxpY2F0aW9uL2F0b21zdmMreG1sXCI6W1wiYXRvbXN2Y1wiXSxcImFwcGxpY2F0aW9uL2Jkb2NcIjpbXCJiZG9jXCJdLFwiYXBwbGljYXRpb24vY2N4bWwreG1sXCI6W1wiY2N4bWxcIl0sXCJhcHBsaWNhdGlvbi9jZG1pLWNhcGFiaWxpdHlcIjpbXCJjZG1pYVwiXSxcImFwcGxpY2F0aW9uL2NkbWktY29udGFpbmVyXCI6W1wiY2RtaWNcIl0sXCJhcHBsaWNhdGlvbi9jZG1pLWRvbWFpblwiOltcImNkbWlkXCJdLFwiYXBwbGljYXRpb24vY2RtaS1vYmplY3RcIjpbXCJjZG1pb1wiXSxcImFwcGxpY2F0aW9uL2NkbWktcXVldWVcIjpbXCJjZG1pcVwiXSxcImFwcGxpY2F0aW9uL2N1LXNlZW1lXCI6W1wiY3VcIl0sXCJhcHBsaWNhdGlvbi9kYXNoK3htbFwiOltcIm1wZFwiXSxcImFwcGxpY2F0aW9uL2Rhdm1vdW50K3htbFwiOltcImRhdm1vdW50XCJdLFwiYXBwbGljYXRpb24vZG9jYm9vayt4bWxcIjpbXCJkYmtcIl0sXCJhcHBsaWNhdGlvbi9kc3NjK2RlclwiOltcImRzc2NcIl0sXCJhcHBsaWNhdGlvbi9kc3NjK3htbFwiOltcInhkc3NjXCJdLFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdFwiOltcImVjbWFcIl0sXCJhcHBsaWNhdGlvbi9lbW1hK3htbFwiOltcImVtbWFcIl0sXCJhcHBsaWNhdGlvbi9lcHViK3ppcFwiOltcImVwdWJcIl0sXCJhcHBsaWNhdGlvbi9leGlcIjpbXCJleGlcIl0sXCJhcHBsaWNhdGlvbi9mb250LXRkcGZyXCI6W1wicGZyXCJdLFwiYXBwbGljYXRpb24vZm9udC13b2ZmXCI6W1wid29mZlwiXSxcImFwcGxpY2F0aW9uL2ZvbnQtd29mZjJcIjpbXCJ3b2ZmMlwiXSxcImFwcGxpY2F0aW9uL2dlbytqc29uXCI6W1wiZ2VvanNvblwiXSxcImFwcGxpY2F0aW9uL2dtbCt4bWxcIjpbXCJnbWxcIl0sXCJhcHBsaWNhdGlvbi9ncHgreG1sXCI6W1wiZ3B4XCJdLFwiYXBwbGljYXRpb24vZ3hmXCI6W1wiZ3hmXCJdLFwiYXBwbGljYXRpb24vZ3ppcFwiOltcImd6XCJdLFwiYXBwbGljYXRpb24vaHlwZXJzdHVkaW9cIjpbXCJzdGtcIl0sXCJhcHBsaWNhdGlvbi9pbmttbCt4bWxcIjpbXCJpbmtcIixcImlua21sXCJdLFwiYXBwbGljYXRpb24vaXBmaXhcIjpbXCJpcGZpeFwiXSxcImFwcGxpY2F0aW9uL2phdmEtYXJjaGl2ZVwiOltcImphclwiLFwid2FyXCIsXCJlYXJcIl0sXCJhcHBsaWNhdGlvbi9qYXZhLXNlcmlhbGl6ZWQtb2JqZWN0XCI6W1wic2VyXCJdLFwiYXBwbGljYXRpb24vamF2YS12bVwiOltcImNsYXNzXCJdLFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiOltcImpzXCIsXCJtanNcIl0sXCJhcHBsaWNhdGlvbi9qc29uXCI6W1wianNvblwiLFwibWFwXCJdLFwiYXBwbGljYXRpb24vanNvbjVcIjpbXCJqc29uNVwiXSxcImFwcGxpY2F0aW9uL2pzb25tbCtqc29uXCI6W1wianNvbm1sXCJdLFwiYXBwbGljYXRpb24vbGQranNvblwiOltcImpzb25sZFwiXSxcImFwcGxpY2F0aW9uL2xvc3QreG1sXCI6W1wibG9zdHhtbFwiXSxcImFwcGxpY2F0aW9uL21hYy1iaW5oZXg0MFwiOltcImhxeFwiXSxcImFwcGxpY2F0aW9uL21hYy1jb21wYWN0cHJvXCI6W1wiY3B0XCJdLFwiYXBwbGljYXRpb24vbWFkcyt4bWxcIjpbXCJtYWRzXCJdLFwiYXBwbGljYXRpb24vbWFuaWZlc3QranNvblwiOltcIndlYm1hbmlmZXN0XCJdLFwiYXBwbGljYXRpb24vbWFyY1wiOltcIm1yY1wiXSxcImFwcGxpY2F0aW9uL21hcmN4bWwreG1sXCI6W1wibXJjeFwiXSxcImFwcGxpY2F0aW9uL21hdGhlbWF0aWNhXCI6W1wibWFcIixcIm5iXCIsXCJtYlwiXSxcImFwcGxpY2F0aW9uL21hdGhtbCt4bWxcIjpbXCJtYXRobWxcIl0sXCJhcHBsaWNhdGlvbi9tYm94XCI6W1wibWJveFwiXSxcImFwcGxpY2F0aW9uL21lZGlhc2VydmVyY29udHJvbCt4bWxcIjpbXCJtc2NtbFwiXSxcImFwcGxpY2F0aW9uL21ldGFsaW5rK3htbFwiOltcIm1ldGFsaW5rXCJdLFwiYXBwbGljYXRpb24vbWV0YWxpbms0K3htbFwiOltcIm1ldGE0XCJdLFwiYXBwbGljYXRpb24vbWV0cyt4bWxcIjpbXCJtZXRzXCJdLFwiYXBwbGljYXRpb24vbW9kcyt4bWxcIjpbXCJtb2RzXCJdLFwiYXBwbGljYXRpb24vbXAyMVwiOltcIm0yMVwiLFwibXAyMVwiXSxcImFwcGxpY2F0aW9uL21wNFwiOltcIm1wNHNcIixcIm00cFwiXSxcImFwcGxpY2F0aW9uL21zd29yZFwiOltcImRvY1wiLFwiZG90XCJdLFwiYXBwbGljYXRpb24vbXhmXCI6W1wibXhmXCJdLFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCI6W1wiYmluXCIsXCJkbXNcIixcImxyZlwiLFwibWFyXCIsXCJzb1wiLFwiZGlzdFwiLFwiZGlzdHpcIixcInBrZ1wiLFwiYnBrXCIsXCJkdW1wXCIsXCJlbGNcIixcImRlcGxveVwiLFwiZXhlXCIsXCJkbGxcIixcImRlYlwiLFwiZG1nXCIsXCJpc29cIixcImltZ1wiLFwibXNpXCIsXCJtc3BcIixcIm1zbVwiLFwiYnVmZmVyXCJdLFwiYXBwbGljYXRpb24vb2RhXCI6W1wib2RhXCJdLFwiYXBwbGljYXRpb24vb2VicHMtcGFja2FnZSt4bWxcIjpbXCJvcGZcIl0sXCJhcHBsaWNhdGlvbi9vZ2dcIjpbXCJvZ3hcIl0sXCJhcHBsaWNhdGlvbi9vbWRvYyt4bWxcIjpbXCJvbWRvY1wiXSxcImFwcGxpY2F0aW9uL29uZW5vdGVcIjpbXCJvbmV0b2NcIixcIm9uZXRvYzJcIixcIm9uZXRtcFwiLFwib25lcGtnXCJdLFwiYXBwbGljYXRpb24vb3hwc1wiOltcIm94cHNcIl0sXCJhcHBsaWNhdGlvbi9wYXRjaC1vcHMtZXJyb3IreG1sXCI6W1wieGVyXCJdLFwiYXBwbGljYXRpb24vcGRmXCI6W1wicGRmXCJdLFwiYXBwbGljYXRpb24vcGdwLWVuY3J5cHRlZFwiOltcInBncFwiXSxcImFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmVcIjpbXCJhc2NcIixcInNpZ1wiXSxcImFwcGxpY2F0aW9uL3BpY3MtcnVsZXNcIjpbXCJwcmZcIl0sXCJhcHBsaWNhdGlvbi9wa2NzMTBcIjpbXCJwMTBcIl0sXCJhcHBsaWNhdGlvbi9wa2NzNy1taW1lXCI6W1wicDdtXCIsXCJwN2NcIl0sXCJhcHBsaWNhdGlvbi9wa2NzNy1zaWduYXR1cmVcIjpbXCJwN3NcIl0sXCJhcHBsaWNhdGlvbi9wa2NzOFwiOltcInA4XCJdLFwiYXBwbGljYXRpb24vcGtpeC1hdHRyLWNlcnRcIjpbXCJhY1wiXSxcImFwcGxpY2F0aW9uL3BraXgtY2VydFwiOltcImNlclwiXSxcImFwcGxpY2F0aW9uL3BraXgtY3JsXCI6W1wiY3JsXCJdLFwiYXBwbGljYXRpb24vcGtpeC1wa2lwYXRoXCI6W1wicGtpcGF0aFwiXSxcImFwcGxpY2F0aW9uL3BraXhjbXBcIjpbXCJwa2lcIl0sXCJhcHBsaWNhdGlvbi9wbHMreG1sXCI6W1wicGxzXCJdLFwiYXBwbGljYXRpb24vcG9zdHNjcmlwdFwiOltcImFpXCIsXCJlcHNcIixcInBzXCJdLFwiYXBwbGljYXRpb24vcHJzLmN3d1wiOltcImN3d1wiXSxcImFwcGxpY2F0aW9uL3Bza2MreG1sXCI6W1wicHNrY3htbFwiXSxcImFwcGxpY2F0aW9uL3JkZit4bWxcIjpbXCJyZGZcIl0sXCJhcHBsaWNhdGlvbi9yZWdpbmZvK3htbFwiOltcInJpZlwiXSxcImFwcGxpY2F0aW9uL3JlbGF4LW5nLWNvbXBhY3Qtc3ludGF4XCI6W1wicm5jXCJdLFwiYXBwbGljYXRpb24vcmVzb3VyY2UtbGlzdHMreG1sXCI6W1wicmxcIl0sXCJhcHBsaWNhdGlvbi9yZXNvdXJjZS1saXN0cy1kaWZmK3htbFwiOltcInJsZFwiXSxcImFwcGxpY2F0aW9uL3Jscy1zZXJ2aWNlcyt4bWxcIjpbXCJyc1wiXSxcImFwcGxpY2F0aW9uL3Jwa2ktZ2hvc3RidXN0ZXJzXCI6W1wiZ2JyXCJdLFwiYXBwbGljYXRpb24vcnBraS1tYW5pZmVzdFwiOltcIm1mdFwiXSxcImFwcGxpY2F0aW9uL3Jwa2ktcm9hXCI6W1wicm9hXCJdLFwiYXBwbGljYXRpb24vcnNkK3htbFwiOltcInJzZFwiXSxcImFwcGxpY2F0aW9uL3Jzcyt4bWxcIjpbXCJyc3NcIl0sXCJhcHBsaWNhdGlvbi9ydGZcIjpbXCJydGZcIl0sXCJhcHBsaWNhdGlvbi9zYm1sK3htbFwiOltcInNibWxcIl0sXCJhcHBsaWNhdGlvbi9zY3ZwLWN2LXJlcXVlc3RcIjpbXCJzY3FcIl0sXCJhcHBsaWNhdGlvbi9zY3ZwLWN2LXJlc3BvbnNlXCI6W1wic2NzXCJdLFwiYXBwbGljYXRpb24vc2N2cC12cC1yZXF1ZXN0XCI6W1wic3BxXCJdLFwiYXBwbGljYXRpb24vc2N2cC12cC1yZXNwb25zZVwiOltcInNwcFwiXSxcImFwcGxpY2F0aW9uL3NkcFwiOltcInNkcFwiXSxcImFwcGxpY2F0aW9uL3NldC1wYXltZW50LWluaXRpYXRpb25cIjpbXCJzZXRwYXlcIl0sXCJhcHBsaWNhdGlvbi9zZXQtcmVnaXN0cmF0aW9uLWluaXRpYXRpb25cIjpbXCJzZXRyZWdcIl0sXCJhcHBsaWNhdGlvbi9zaGYreG1sXCI6W1wic2hmXCJdLFwiYXBwbGljYXRpb24vc21pbCt4bWxcIjpbXCJzbWlcIixcInNtaWxcIl0sXCJhcHBsaWNhdGlvbi9zcGFycWwtcXVlcnlcIjpbXCJycVwiXSxcImFwcGxpY2F0aW9uL3NwYXJxbC1yZXN1bHRzK3htbFwiOltcInNyeFwiXSxcImFwcGxpY2F0aW9uL3NyZ3NcIjpbXCJncmFtXCJdLFwiYXBwbGljYXRpb24vc3Jncyt4bWxcIjpbXCJncnhtbFwiXSxcImFwcGxpY2F0aW9uL3NydSt4bWxcIjpbXCJzcnVcIl0sXCJhcHBsaWNhdGlvbi9zc2RsK3htbFwiOltcInNzZGxcIl0sXCJhcHBsaWNhdGlvbi9zc21sK3htbFwiOltcInNzbWxcIl0sXCJhcHBsaWNhdGlvbi90ZWkreG1sXCI6W1widGVpXCIsXCJ0ZWljb3JwdXNcIl0sXCJhcHBsaWNhdGlvbi90aHJhdWQreG1sXCI6W1widGZpXCJdLFwiYXBwbGljYXRpb24vdGltZXN0YW1wZWQtZGF0YVwiOltcInRzZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy1sYXJnZVwiOltcInBsYlwiXSxcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy1zbWFsbFwiOltcInBzYlwiXSxcImFwcGxpY2F0aW9uL3ZuZC4zZ3BwLnBpYy1idy12YXJcIjpbXCJwdmJcIl0sXCJhcHBsaWNhdGlvbi92bmQuM2dwcDIudGNhcFwiOltcInRjYXBcIl0sXCJhcHBsaWNhdGlvbi92bmQuM20ucG9zdC1pdC1ub3Rlc1wiOltcInB3blwiXSxcImFwcGxpY2F0aW9uL3ZuZC5hY2NwYWMuc2ltcGx5LmFzb1wiOltcImFzb1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5hY2NwYWMuc2ltcGx5LmltcFwiOltcImltcFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5hY3Vjb2JvbFwiOltcImFjdVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5hY3Vjb3JwXCI6W1wiYXRjXCIsXCJhY3V0Y1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5haXItYXBwbGljYXRpb24taW5zdGFsbGVyLXBhY2thZ2UremlwXCI6W1wiYWlyXCJdLFwiYXBwbGljYXRpb24vdm5kLmFkb2JlLmZvcm1zY2VudHJhbC5mY2R0XCI6W1wiZmNkdFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5meHBcIjpbXCJmeHBcIixcImZ4cGxcIl0sXCJhcHBsaWNhdGlvbi92bmQuYWRvYmUueGRwK3htbFwiOltcInhkcFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5hZG9iZS54ZmRmXCI6W1wieGZkZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5haGVhZC5zcGFjZVwiOltcImFoZWFkXCJdLFwiYXBwbGljYXRpb24vdm5kLmFpcnppcC5maWxlc2VjdXJlLmF6ZlwiOltcImF6ZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5haXJ6aXAuZmlsZXNlY3VyZS5henNcIjpbXCJhenNcIl0sXCJhcHBsaWNhdGlvbi92bmQuYW1hem9uLmVib29rXCI6W1wiYXp3XCJdLFwiYXBwbGljYXRpb24vdm5kLmFtZXJpY2FuZHluYW1pY3MuYWNjXCI6W1wiYWNjXCJdLFwiYXBwbGljYXRpb24vdm5kLmFtaWdhLmFtaVwiOltcImFtaVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5hbmRyb2lkLnBhY2thZ2UtYXJjaGl2ZVwiOltcImFwa1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5hbnNlci13ZWItY2VydGlmaWNhdGUtaXNzdWUtaW5pdGlhdGlvblwiOltcImNpaVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5hbnNlci13ZWItZnVuZHMtdHJhbnNmZXItaW5pdGlhdGlvblwiOltcImZ0aVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5hbnRpeC5nYW1lLWNvbXBvbmVudFwiOltcImF0eFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5pbnN0YWxsZXIreG1sXCI6W1wibXBrZ1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5tcGVndXJsXCI6W1wibTN1OFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5hcHBsZS5wa3Bhc3NcIjpbXCJwa3Bhc3NcIl0sXCJhcHBsaWNhdGlvbi92bmQuYXJpc3RhbmV0d29ya3Muc3dpXCI6W1wic3dpXCJdLFwiYXBwbGljYXRpb24vdm5kLmFzdHJhZWEtc29mdHdhcmUuaW90YVwiOltcImlvdGFcIl0sXCJhcHBsaWNhdGlvbi92bmQuYXVkaW9ncmFwaFwiOltcImFlcFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ibHVlaWNlLm11bHRpcGFzc1wiOltcIm1wbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ibWlcIjpbXCJibWlcIl0sXCJhcHBsaWNhdGlvbi92bmQuYnVzaW5lc3NvYmplY3RzXCI6W1wicmVwXCJdLFwiYXBwbGljYXRpb24vdm5kLmNoZW1kcmF3K3htbFwiOltcImNkeG1sXCJdLFwiYXBwbGljYXRpb24vdm5kLmNoaXBudXRzLmthcmFva2UtbW1kXCI6W1wibW1kXCJdLFwiYXBwbGljYXRpb24vdm5kLmNpbmRlcmVsbGFcIjpbXCJjZHlcIl0sXCJhcHBsaWNhdGlvbi92bmQuY2xheW1vcmVcIjpbXCJjbGFcIl0sXCJhcHBsaWNhdGlvbi92bmQuY2xvYW50by5ycDlcIjpbXCJycDlcIl0sXCJhcHBsaWNhdGlvbi92bmQuY2xvbmsuYzRncm91cFwiOltcImM0Z1wiLFwiYzRkXCIsXCJjNGZcIixcImM0cFwiLFwiYzR1XCJdLFwiYXBwbGljYXRpb24vdm5kLmNsdWV0cnVzdC5jYXJ0b21vYmlsZS1jb25maWdcIjpbXCJjMTFhbWNcIl0sXCJhcHBsaWNhdGlvbi92bmQuY2x1ZXRydXN0LmNhcnRvbW9iaWxlLWNvbmZpZy1wa2dcIjpbXCJjMTFhbXpcIl0sXCJhcHBsaWNhdGlvbi92bmQuY29tbW9uc3BhY2VcIjpbXCJjc3BcIl0sXCJhcHBsaWNhdGlvbi92bmQuY29udGFjdC5jbXNnXCI6W1wiY2RiY21zZ1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5jb3Ntb2NhbGxlclwiOltcImNtY1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyXCI6W1wiY2xreFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLmtleWJvYXJkXCI6W1wiY2xra1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5jcmljay5jbGlja2VyLnBhbGV0dGVcIjpbXCJjbGtwXCJdLFwiYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIudGVtcGxhdGVcIjpbXCJjbGt0XCJdLFwiYXBwbGljYXRpb24vdm5kLmNyaWNrLmNsaWNrZXIud29yZGJhbmtcIjpbXCJjbGt3XCJdLFwiYXBwbGljYXRpb24vdm5kLmNyaXRpY2FsdG9vbHMud2JzK3htbFwiOltcIndic1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5jdGMtcG9zbWxcIjpbXCJwbWxcIl0sXCJhcHBsaWNhdGlvbi92bmQuY3Vwcy1wcGRcIjpbXCJwcGRcIl0sXCJhcHBsaWNhdGlvbi92bmQuY3VybC5jYXJcIjpbXCJjYXJcIl0sXCJhcHBsaWNhdGlvbi92bmQuY3VybC5wY3VybFwiOltcInBjdXJsXCJdLFwiYXBwbGljYXRpb24vdm5kLmRhcnRcIjpbXCJkYXJ0XCJdLFwiYXBwbGljYXRpb24vdm5kLmRhdGEtdmlzaW9uLnJkelwiOltcInJkelwiXSxcImFwcGxpY2F0aW9uL3ZuZC5kZWNlLmRhdGFcIjpbXCJ1dmZcIixcInV2dmZcIixcInV2ZFwiLFwidXZ2ZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5kZWNlLnR0bWwreG1sXCI6W1widXZ0XCIsXCJ1dnZ0XCJdLFwiYXBwbGljYXRpb24vdm5kLmRlY2UudW5zcGVjaWZpZWRcIjpbXCJ1dnhcIixcInV2dnhcIl0sXCJhcHBsaWNhdGlvbi92bmQuZGVjZS56aXBcIjpbXCJ1dnpcIixcInV2dnpcIl0sXCJhcHBsaWNhdGlvbi92bmQuZGVub3ZvLmZjc2VsYXlvdXQtbGlua1wiOltcImZlX2xhdW5jaFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5kbmFcIjpbXCJkbmFcIl0sXCJhcHBsaWNhdGlvbi92bmQuZG9sYnkubWxwXCI6W1wibWxwXCJdLFwiYXBwbGljYXRpb24vdm5kLmRwZ3JhcGhcIjpbXCJkcGdcIl0sXCJhcHBsaWNhdGlvbi92bmQuZHJlYW1mYWN0b3J5XCI6W1wiZGZhY1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5kcy1rZXlwb2ludFwiOltcImtweHhcIl0sXCJhcHBsaWNhdGlvbi92bmQuZHZiLmFpdFwiOltcImFpdFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5kdmIuc2VydmljZVwiOltcInN2Y1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5keW5hZ2VvXCI6W1wiZ2VvXCJdLFwiYXBwbGljYXRpb24vdm5kLmVjb3dpbi5jaGFydFwiOltcIm1hZ1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5lbmxpdmVuXCI6W1wibm1sXCJdLFwiYXBwbGljYXRpb24vdm5kLmVwc29uLmVzZlwiOltcImVzZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5tc2ZcIjpbXCJtc2ZcIl0sXCJhcHBsaWNhdGlvbi92bmQuZXBzb24ucXVpY2thbmltZVwiOltcInFhbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5zYWx0XCI6W1wic2x0XCJdLFwiYXBwbGljYXRpb24vdm5kLmVwc29uLnNzZlwiOltcInNzZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5lc3ppZ25vMyt4bWxcIjpbXCJlczNcIixcImV0M1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5lenBpeC1hbGJ1bVwiOltcImV6MlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5lenBpeC1wYWNrYWdlXCI6W1wiZXozXCJdLFwiYXBwbGljYXRpb24vdm5kLmZkZlwiOltcImZkZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5mZHNuLm1zZWVkXCI6W1wibXNlZWRcIl0sXCJhcHBsaWNhdGlvbi92bmQuZmRzbi5zZWVkXCI6W1wic2VlZFwiLFwiZGF0YWxlc3NcIl0sXCJhcHBsaWNhdGlvbi92bmQuZmxvZ3JhcGhpdFwiOltcImdwaFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5mbHV4dGltZS5jbGlwXCI6W1wiZnRjXCJdLFwiYXBwbGljYXRpb24vdm5kLmZyYW1lbWFrZXJcIjpbXCJmbVwiLFwiZnJhbWVcIixcIm1ha2VyXCIsXCJib29rXCJdLFwiYXBwbGljYXRpb24vdm5kLmZyb2dhbnMuZm5jXCI6W1wiZm5jXCJdLFwiYXBwbGljYXRpb24vdm5kLmZyb2dhbnMubHRmXCI6W1wibHRmXCJdLFwiYXBwbGljYXRpb24vdm5kLmZzYy53ZWJsYXVuY2hcIjpbXCJmc2NcIl0sXCJhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5c1wiOltcIm9hc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzMlwiOltcIm9hMlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzM1wiOltcIm9hM1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzZ3BcIjpbXCJmZzVcIl0sXCJhcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5c3Byc1wiOltcImJoMlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5mdWppeGVyb3guZGRkXCI6W1wiZGRkXCJdLFwiYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3NcIjpbXCJ4ZHdcIl0sXCJhcHBsaWNhdGlvbi92bmQuZnVqaXhlcm94LmRvY3V3b3Jrcy5iaW5kZXJcIjpbXCJ4YmRcIl0sXCJhcHBsaWNhdGlvbi92bmQuZnV6enlzaGVldFwiOltcImZ6c1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5nZW5vbWF0aXgudHV4ZWRvXCI6W1widHhkXCJdLFwiYXBwbGljYXRpb24vdm5kLmdlb2dlYnJhLmZpbGVcIjpbXCJnZ2JcIl0sXCJhcHBsaWNhdGlvbi92bmQuZ2VvZ2VicmEudG9vbFwiOltcImdndFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5nZW9tZXRyeS1leHBsb3JlclwiOltcImdleFwiLFwiZ3JlXCJdLFwiYXBwbGljYXRpb24vdm5kLmdlb25leHRcIjpbXCJneHRcIl0sXCJhcHBsaWNhdGlvbi92bmQuZ2VvcGxhblwiOltcImcyd1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5nZW9zcGFjZVwiOltcImczd1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5nbXhcIjpbXCJnbXhcIl0sXCJhcHBsaWNhdGlvbi92bmQuZ29vZ2xlLWFwcHMuZG9jdW1lbnRcIjpbXCJnZG9jXCJdLFwiYXBwbGljYXRpb24vdm5kLmdvb2dsZS1hcHBzLnByZXNlbnRhdGlvblwiOltcImdzbGlkZXNcIl0sXCJhcHBsaWNhdGlvbi92bmQuZ29vZ2xlLWFwcHMuc3ByZWFkc2hlZXRcIjpbXCJnc2hlZXRcIl0sXCJhcHBsaWNhdGlvbi92bmQuZ29vZ2xlLWVhcnRoLmttbCt4bWxcIjpbXCJrbWxcIl0sXCJhcHBsaWNhdGlvbi92bmQuZ29vZ2xlLWVhcnRoLmttelwiOltcImttelwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ncmFmZXFcIjpbXCJncWZcIixcImdxc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtYWNjb3VudFwiOltcImdhY1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtaGVscFwiOltcImdoZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtaWRlbnRpdHktbWVzc2FnZVwiOltcImdpbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtaW5qZWN0b3JcIjpbXCJncnZcIl0sXCJhcHBsaWNhdGlvbi92bmQuZ3Jvb3ZlLXRvb2wtbWVzc2FnZVwiOltcImd0bVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtdG9vbC10ZW1wbGF0ZVwiOltcInRwbFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ncm9vdmUtdmNhcmRcIjpbXCJ2Y2dcIl0sXCJhcHBsaWNhdGlvbi92bmQuaGFsK3htbFwiOltcImhhbFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5oYW5kaGVsZC1lbnRlcnRhaW5tZW50K3htbFwiOltcInptbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5oYmNpXCI6W1wiaGJjaVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5oaGUubGVzc29uLXBsYXllclwiOltcImxlc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5ocC1ocGdsXCI6W1wiaHBnbFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ocC1ocGlkXCI6W1wiaHBpZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ocC1ocHNcIjpbXCJocHNcIl0sXCJhcHBsaWNhdGlvbi92bmQuaHAtamx5dFwiOltcImpsdFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ocC1wY2xcIjpbXCJwY2xcIl0sXCJhcHBsaWNhdGlvbi92bmQuaHAtcGNseGxcIjpbXCJwY2x4bFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5oeWRyb3N0YXRpeC5zb2YtZGF0YVwiOltcInNmZC1oZHN0eFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5pYm0ubWluaXBheVwiOltcIm1weVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5pYm0ubW9kY2FwXCI6W1wiYWZwXCIsXCJsaXN0YWZwXCIsXCJsaXN0MzgyMFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5pYm0ucmlnaHRzLW1hbmFnZW1lbnRcIjpbXCJpcm1cIl0sXCJhcHBsaWNhdGlvbi92bmQuaWJtLnNlY3VyZS1jb250YWluZXJcIjpbXCJzY1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5pY2Nwcm9maWxlXCI6W1wiaWNjXCIsXCJpY21cIl0sXCJhcHBsaWNhdGlvbi92bmQuaWdsb2FkZXJcIjpbXCJpZ2xcIl0sXCJhcHBsaWNhdGlvbi92bmQuaW1tZXJ2aXNpb24taXZwXCI6W1wiaXZwXCJdLFwiYXBwbGljYXRpb24vdm5kLmltbWVydmlzaW9uLWl2dVwiOltcIml2dVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5pbnNvcnMuaWdtXCI6W1wiaWdtXCJdLFwiYXBwbGljYXRpb24vdm5kLmludGVyY29uLmZvcm1uZXRcIjpbXCJ4cHdcIixcInhweFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5pbnRlcmdlb1wiOltcImkyZ1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5pbnR1LnFib1wiOltcInFib1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5pbnR1LnFmeFwiOltcInFmeFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5pcHVucGx1Z2dlZC5yY3Byb2ZpbGVcIjpbXCJyY3Byb2ZpbGVcIl0sXCJhcHBsaWNhdGlvbi92bmQuaXJlcG9zaXRvcnkucGFja2FnZSt4bWxcIjpbXCJpcnBcIl0sXCJhcHBsaWNhdGlvbi92bmQuaXMteHByXCI6W1wieHByXCJdLFwiYXBwbGljYXRpb24vdm5kLmlzYWMuZmNzXCI6W1wiZmNzXCJdLFwiYXBwbGljYXRpb24vdm5kLmphbVwiOltcImphbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5qY3AuamF2YW1lLm1pZGxldC1ybXNcIjpbXCJybXNcIl0sXCJhcHBsaWNhdGlvbi92bmQuamlzcFwiOltcImppc3BcIl0sXCJhcHBsaWNhdGlvbi92bmQuam9vc3Quam9kYS1hcmNoaXZlXCI6W1wiam9kYVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5rYWhvb3R6XCI6W1wia3R6XCIsXCJrdHJcIl0sXCJhcHBsaWNhdGlvbi92bmQua2RlLmthcmJvblwiOltcImthcmJvblwiXSxcImFwcGxpY2F0aW9uL3ZuZC5rZGUua2NoYXJ0XCI6W1wiY2hydFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5rZGUua2Zvcm11bGFcIjpbXCJrZm9cIl0sXCJhcHBsaWNhdGlvbi92bmQua2RlLmtpdmlvXCI6W1wiZmx3XCJdLFwiYXBwbGljYXRpb24vdm5kLmtkZS5rb250b3VyXCI6W1wia29uXCJdLFwiYXBwbGljYXRpb24vdm5kLmtkZS5rcHJlc2VudGVyXCI6W1wia3ByXCIsXCJrcHRcIl0sXCJhcHBsaWNhdGlvbi92bmQua2RlLmtzcHJlYWRcIjpbXCJrc3BcIl0sXCJhcHBsaWNhdGlvbi92bmQua2RlLmt3b3JkXCI6W1wia3dkXCIsXCJrd3RcIl0sXCJhcHBsaWNhdGlvbi92bmQua2VuYW1lYWFwcFwiOltcImh0a2VcIl0sXCJhcHBsaWNhdGlvbi92bmQua2lkc3BpcmF0aW9uXCI6W1wia2lhXCJdLFwiYXBwbGljYXRpb24vdm5kLmtpbmFyXCI6W1wia25lXCIsXCJrbnBcIl0sXCJhcHBsaWNhdGlvbi92bmQua29hblwiOltcInNrcFwiLFwic2tkXCIsXCJza3RcIixcInNrbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5rb2Rhay1kZXNjcmlwdG9yXCI6W1wic3NlXCJdLFwiYXBwbGljYXRpb24vdm5kLmxhcy5sYXMreG1sXCI6W1wibGFzeG1sXCJdLFwiYXBwbGljYXRpb24vdm5kLmxsYW1hZ3JhcGhpY3MubGlmZS1iYWxhbmNlLmRlc2t0b3BcIjpbXCJsYmRcIl0sXCJhcHBsaWNhdGlvbi92bmQubGxhbWFncmFwaGljcy5saWZlLWJhbGFuY2UuZXhjaGFuZ2UreG1sXCI6W1wibGJlXCJdLFwiYXBwbGljYXRpb24vdm5kLmxvdHVzLTEtMi0zXCI6W1wiMTIzXCJdLFwiYXBwbGljYXRpb24vdm5kLmxvdHVzLWFwcHJvYWNoXCI6W1wiYXByXCJdLFwiYXBwbGljYXRpb24vdm5kLmxvdHVzLWZyZWVsYW5jZVwiOltcInByZVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1ub3Rlc1wiOltcIm5zZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1vcmdhbml6ZXJcIjpbXCJvcmdcIl0sXCJhcHBsaWNhdGlvbi92bmQubG90dXMtc2NyZWVuY2FtXCI6W1wic2NtXCJdLFwiYXBwbGljYXRpb24vdm5kLmxvdHVzLXdvcmRwcm9cIjpbXCJsd3BcIl0sXCJhcHBsaWNhdGlvbi92bmQubWFjcG9ydHMucG9ydHBrZ1wiOltcInBvcnRwa2dcIl0sXCJhcHBsaWNhdGlvbi92bmQubWNkXCI6W1wibWNkXCJdLFwiYXBwbGljYXRpb24vdm5kLm1lZGNhbGNkYXRhXCI6W1wibWMxXCJdLFwiYXBwbGljYXRpb24vdm5kLm1lZGlhc3RhdGlvbi5jZGtleVwiOltcImNka2V5XCJdLFwiYXBwbGljYXRpb24vdm5kLm1mZXJcIjpbXCJtd2ZcIl0sXCJhcHBsaWNhdGlvbi92bmQubWZtcFwiOltcIm1mbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5taWNyb2dyYWZ4LmZsb1wiOltcImZsb1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5taWNyb2dyYWZ4LmlneFwiOltcImlneFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5taWZcIjpbXCJtaWZcIl0sXCJhcHBsaWNhdGlvbi92bmQubW9iaXVzLmRhZlwiOltcImRhZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMuZGlzXCI6W1wiZGlzXCJdLFwiYXBwbGljYXRpb24vdm5kLm1vYml1cy5tYmtcIjpbXCJtYmtcIl0sXCJhcHBsaWNhdGlvbi92bmQubW9iaXVzLm1xeVwiOltcIm1xeVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMubXNsXCI6W1wibXNsXCJdLFwiYXBwbGljYXRpb24vdm5kLm1vYml1cy5wbGNcIjpbXCJwbGNcIl0sXCJhcHBsaWNhdGlvbi92bmQubW9iaXVzLnR4ZlwiOltcInR4ZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tb3BodW4uYXBwbGljYXRpb25cIjpbXCJtcG5cIl0sXCJhcHBsaWNhdGlvbi92bmQubW9waHVuLmNlcnRpZmljYXRlXCI6W1wibXBjXCJdLFwiYXBwbGljYXRpb24vdm5kLm1vemlsbGEueHVsK3htbFwiOltcInh1bFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1hcnRnYWxyeVwiOltcImNpbFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1jYWItY29tcHJlc3NlZFwiOltcImNhYlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbFwiOltcInhsc1wiLFwieGxtXCIsXCJ4bGFcIixcInhsY1wiLFwieGx0XCIsXCJ4bHdcIl0sXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuYWRkaW4ubWFjcm9lbmFibGVkLjEyXCI6W1wieGxhbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5iaW5hcnkubWFjcm9lbmFibGVkLjEyXCI6W1wieGxzYlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5tYWNyb2VuYWJsZWQuMTJcIjpbXCJ4bHNtXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsLnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMlwiOltcInhsdG1cIl0sXCJhcHBsaWNhdGlvbi92bmQubXMtZm9udG9iamVjdFwiOltcImVvdFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1odG1saGVscFwiOltcImNobVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1pbXNcIjpbXCJpbXNcIl0sXCJhcHBsaWNhdGlvbi92bmQubXMtbHJtXCI6W1wibHJtXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLW9mZmljZXRoZW1lXCI6W1widGhteFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1vdXRsb29rXCI6W1wibXNnXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLXBraS5zZWNjYXRcIjpbXCJjYXRcIl0sXCJhcHBsaWNhdGlvbi92bmQubXMtcGtpLnN0bFwiOltcInN0bFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50XCI6W1wicHB0XCIsXCJwcHNcIixcInBvdFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LmFkZGluLm1hY3JvZW5hYmxlZC4xMlwiOltcInBwYW1cIl0sXCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5wcmVzZW50YXRpb24ubWFjcm9lbmFibGVkLjEyXCI6W1wicHB0bVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnNsaWRlLm1hY3JvZW5hYmxlZC4xMlwiOltcInNsZG1cIl0sXCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludC5zbGlkZXNob3cubWFjcm9lbmFibGVkLjEyXCI6W1wicHBzbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50LnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMlwiOltcInBvdG1cIl0sXCJhcHBsaWNhdGlvbi92bmQubXMtcHJvamVjdFwiOltcIm1wcFwiLFwibXB0XCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLXdvcmQuZG9jdW1lbnQubWFjcm9lbmFibGVkLjEyXCI6W1wiZG9jbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5tcy13b3JkLnRlbXBsYXRlLm1hY3JvZW5hYmxlZC4xMlwiOltcImRvdG1cIl0sXCJhcHBsaWNhdGlvbi92bmQubXMtd29ya3NcIjpbXCJ3cHNcIixcIndrc1wiLFwid2NtXCIsXCJ3ZGJcIl0sXCJhcHBsaWNhdGlvbi92bmQubXMtd3BsXCI6W1wid3BsXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zLXhwc2RvY3VtZW50XCI6W1wieHBzXCJdLFwiYXBwbGljYXRpb24vdm5kLm1zZXFcIjpbXCJtc2VxXCJdLFwiYXBwbGljYXRpb24vdm5kLm11c2ljaWFuXCI6W1wibXVzXCJdLFwiYXBwbGljYXRpb24vdm5kLm11dmVlLnN0eWxlXCI6W1wibXN0eVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5teW5mY1wiOltcInRhZ2xldFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5uZXVyb2xhbmd1YWdlLm5sdVwiOltcIm5sdVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5uaXRmXCI6W1wibnRmXCIsXCJuaXRmXCJdLFwiYXBwbGljYXRpb24vdm5kLm5vYmxlbmV0LWRpcmVjdG9yeVwiOltcIm5uZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC1zZWFsZXJcIjpbXCJubnNcIl0sXCJhcHBsaWNhdGlvbi92bmQubm9ibGVuZXQtd2ViXCI6W1wibm53XCJdLFwiYXBwbGljYXRpb24vdm5kLm5va2lhLm4tZ2FnZS5kYXRhXCI6W1wibmdkYXRcIl0sXCJhcHBsaWNhdGlvbi92bmQubm9raWEubi1nYWdlLnN5bWJpYW4uaW5zdGFsbFwiOltcIm4tZ2FnZVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ub2tpYS5yYWRpby1wcmVzZXRcIjpbXCJycHN0XCJdLFwiYXBwbGljYXRpb24vdm5kLm5va2lhLnJhZGlvLXByZXNldHNcIjpbXCJycHNzXCJdLFwiYXBwbGljYXRpb24vdm5kLm5vdmFkaWdtLmVkbVwiOltcImVkbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5lZHhcIjpbXCJlZHhcIl0sXCJhcHBsaWNhdGlvbi92bmQubm92YWRpZ20uZXh0XCI6W1wiZXh0XCJdLFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5jaGFydFwiOltcIm9kY1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuY2hhcnQtdGVtcGxhdGVcIjpbXCJvdGNcIl0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmRhdGFiYXNlXCI6W1wib2RiXCJdLFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhXCI6W1wib2RmXCJdLFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5mb3JtdWxhLXRlbXBsYXRlXCI6W1wib2RmdFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuZ3JhcGhpY3NcIjpbXCJvZGdcIl0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LmdyYXBoaWNzLXRlbXBsYXRlXCI6W1wib3RnXCJdLFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5pbWFnZVwiOltcIm9kaVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuaW1hZ2UtdGVtcGxhdGVcIjpbXCJvdGlcIl0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnByZXNlbnRhdGlvblwiOltcIm9kcFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQucHJlc2VudGF0aW9uLXRlbXBsYXRlXCI6W1wib3RwXCJdLFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC5zcHJlYWRzaGVldFwiOltcIm9kc1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5vYXNpcy5vcGVuZG9jdW1lbnQuc3ByZWFkc2hlZXQtdGVtcGxhdGVcIjpbXCJvdHNcIl0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHRcIjpbXCJvZHRcIl0sXCJhcHBsaWNhdGlvbi92bmQub2FzaXMub3BlbmRvY3VtZW50LnRleHQtbWFzdGVyXCI6W1wib2RtXCJdLFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXRlbXBsYXRlXCI6W1wib3R0XCJdLFwiYXBwbGljYXRpb24vdm5kLm9hc2lzLm9wZW5kb2N1bWVudC50ZXh0LXdlYlwiOltcIm90aFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vbHBjLXN1Z2FyXCI6W1wieG9cIl0sXCJhcHBsaWNhdGlvbi92bmQub21hLmRkMit4bWxcIjpbXCJkZDJcIl0sXCJhcHBsaWNhdGlvbi92bmQub3Blbm9mZmljZW9yZy5leHRlbnNpb25cIjpbXCJveHRcIl0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uXCI6W1wicHB0eFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZVwiOltcInNsZHhcIl0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93XCI6W1wicHBzeFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC50ZW1wbGF0ZVwiOltcInBvdHhcIl0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldFwiOltcInhsc3hcIl0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50ZW1wbGF0ZVwiOltcInhsdHhcIl0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudFwiOltcImRvY3hcIl0sXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC50ZW1wbGF0ZVwiOltcImRvdHhcIl0sXCJhcHBsaWNhdGlvbi92bmQub3NnZW8ubWFwZ3VpZGUucGFja2FnZVwiOltcIm1ncFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5vc2dpLmRwXCI6W1wiZHBcIl0sXCJhcHBsaWNhdGlvbi92bmQub3NnaS5zdWJzeXN0ZW1cIjpbXCJlc2FcIl0sXCJhcHBsaWNhdGlvbi92bmQucGFsbVwiOltcInBkYlwiLFwicHFhXCIsXCJvcHJjXCJdLFwiYXBwbGljYXRpb24vdm5kLnBhd2FhZmlsZVwiOltcInBhd1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5wZy5mb3JtYXRcIjpbXCJzdHJcIl0sXCJhcHBsaWNhdGlvbi92bmQucGcub3Nhc2xpXCI6W1wiZWk2XCJdLFwiYXBwbGljYXRpb24vdm5kLnBpY3NlbFwiOltcImVmaWZcIl0sXCJhcHBsaWNhdGlvbi92bmQucG1pLndpZGdldFwiOltcIndnXCJdLFwiYXBwbGljYXRpb24vdm5kLnBvY2tldGxlYXJuXCI6W1wicGxmXCJdLFwiYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjZcIjpbXCJwYmRcIl0sXCJhcHBsaWNhdGlvbi92bmQucHJldmlld3N5c3RlbXMuYm94XCI6W1wiYm94XCJdLFwiYXBwbGljYXRpb24vdm5kLnByb3RldXMubWFnYXppbmVcIjpbXCJtZ3pcIl0sXCJhcHBsaWNhdGlvbi92bmQucHVibGlzaGFyZS1kZWx0YS10cmVlXCI6W1wicXBzXCJdLFwiYXBwbGljYXRpb24vdm5kLnB2aS5wdGlkMVwiOltcInB0aWRcIl0sXCJhcHBsaWNhdGlvbi92bmQucXVhcmsucXVhcmt4cHJlc3NcIjpbXCJxeGRcIixcInF4dFwiLFwicXdkXCIsXCJxd3RcIixcInF4bFwiLFwicXhiXCJdLFwiYXBwbGljYXRpb24vdm5kLnJlYWx2bmMuYmVkXCI6W1wiYmVkXCJdLFwiYXBwbGljYXRpb24vdm5kLnJlY29yZGFyZS5tdXNpY3htbFwiOltcIm14bFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5yZWNvcmRhcmUubXVzaWN4bWwreG1sXCI6W1wibXVzaWN4bWxcIl0sXCJhcHBsaWNhdGlvbi92bmQucmlnLmNyeXB0b25vdGVcIjpbXCJjcnlwdG9ub3RlXCJdLFwiYXBwbGljYXRpb24vdm5kLnJpbS5jb2RcIjpbXCJjb2RcIl0sXCJhcHBsaWNhdGlvbi92bmQucm4tcmVhbG1lZGlhXCI6W1wicm1cIl0sXCJhcHBsaWNhdGlvbi92bmQucm4tcmVhbG1lZGlhLXZiclwiOltcInJtdmJcIl0sXCJhcHBsaWNhdGlvbi92bmQucm91dGU2Ni5saW5rNjYreG1sXCI6W1wibGluazY2XCJdLFwiYXBwbGljYXRpb24vdm5kLnNhaWxpbmd0cmFja2VyLnRyYWNrXCI6W1wic3RcIl0sXCJhcHBsaWNhdGlvbi92bmQuc2VlbWFpbFwiOltcInNlZVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zZW1hXCI6W1wic2VtYVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zZW1kXCI6W1wic2VtZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zZW1mXCI6W1wic2VtZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5mb3JtZGF0YVwiOltcImlmbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5mb3JtdGVtcGxhdGVcIjpbXCJpdHBcIl0sXCJhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQuaW50ZXJjaGFuZ2VcIjpbXCJpaWZcIl0sXCJhcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQucGFja2FnZVwiOltcImlwa1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5zaW10ZWNoLW1pbmRtYXBwZXJcIjpbXCJ0d2RcIixcInR3ZHNcIl0sXCJhcHBsaWNhdGlvbi92bmQuc21hZlwiOltcIm1tZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zbWFydC50ZWFjaGVyXCI6W1widGVhY2hlclwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zb2xlbnQuc2RrbSt4bWxcIjpbXCJzZGttXCIsXCJzZGtkXCJdLFwiYXBwbGljYXRpb24vdm5kLnNwb3RmaXJlLmR4cFwiOltcImR4cFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zcG90ZmlyZS5zZnNcIjpbXCJzZnNcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmNhbGNcIjpbXCJzZGNcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmRyYXdcIjpbXCJzZGFcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLmltcHJlc3NcIjpbXCJzZGRcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLm1hdGhcIjpbXCJzbWZcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3RhcmRpdmlzaW9uLndyaXRlclwiOltcInNkd1wiLFwidm9yXCJdLFwiYXBwbGljYXRpb24vdm5kLnN0YXJkaXZpc2lvbi53cml0ZXItZ2xvYmFsXCI6W1wic2dsXCJdLFwiYXBwbGljYXRpb24vdm5kLnN0ZXBtYW5pYS5wYWNrYWdlXCI6W1wic216aXBcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3RlcG1hbmlhLnN0ZXBjaGFydFwiOltcInNtXCJdLFwiYXBwbGljYXRpb24vdm5kLnN1bi53YWRsK3htbFwiOltcIndhZGxcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5jYWxjXCI6W1wic3hjXCJdLFwiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuY2FsYy50ZW1wbGF0ZVwiOltcInN0Y1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmRyYXdcIjpbXCJzeGRcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5kcmF3LnRlbXBsYXRlXCI6W1wic3RkXCJdLFwiYXBwbGljYXRpb24vdm5kLnN1bi54bWwuaW1wcmVzc1wiOltcInN4aVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLmltcHJlc3MudGVtcGxhdGVcIjpbXCJzdGlcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3VuLnhtbC5tYXRoXCI6W1wic3htXCJdLFwiYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyXCI6W1wic3h3XCJdLFwiYXBwbGljYXRpb24vdm5kLnN1bi54bWwud3JpdGVyLmdsb2JhbFwiOltcInN4Z1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdW4ueG1sLndyaXRlci50ZW1wbGF0ZVwiOltcInN0d1wiXSxcImFwcGxpY2F0aW9uL3ZuZC5zdXMtY2FsZW5kYXJcIjpbXCJzdXNcIixcInN1c3BcIl0sXCJhcHBsaWNhdGlvbi92bmQuc3ZkXCI6W1wic3ZkXCJdLFwiYXBwbGljYXRpb24vdm5kLnN5bWJpYW4uaW5zdGFsbFwiOltcInNpc1wiLFwic2lzeFwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwreG1sXCI6W1wieHNtXCJdLFwiYXBwbGljYXRpb24vdm5kLnN5bmNtbC5kbSt3YnhtbFwiOltcImJkbVwiXSxcImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwuZG0reG1sXCI6W1wieGRtXCJdLFwiYXBwbGljYXRpb24vdm5kLnRhby5pbnRlbnQtbW9kdWxlLWFyY2hpdmVcIjpbXCJ0YW9cIl0sXCJhcHBsaWNhdGlvbi92bmQudGNwZHVtcC5wY2FwXCI6W1wicGNhcFwiLFwiY2FwXCIsXCJkbXBcIl0sXCJhcHBsaWNhdGlvbi92bmQudG1vYmlsZS1saXZldHZcIjpbXCJ0bW9cIl0sXCJhcHBsaWNhdGlvbi92bmQudHJpZC50cHRcIjpbXCJ0cHRcIl0sXCJhcHBsaWNhdGlvbi92bmQudHJpc2NhcGUubXhzXCI6W1wibXhzXCJdLFwiYXBwbGljYXRpb24vdm5kLnRydWVhcHBcIjpbXCJ0cmFcIl0sXCJhcHBsaWNhdGlvbi92bmQudWZkbFwiOltcInVmZFwiLFwidWZkbFwiXSxcImFwcGxpY2F0aW9uL3ZuZC51aXEudGhlbWVcIjpbXCJ1dHpcIl0sXCJhcHBsaWNhdGlvbi92bmQudW1hamluXCI6W1widW1qXCJdLFwiYXBwbGljYXRpb24vdm5kLnVuaXR5XCI6W1widW5pdHl3ZWJcIl0sXCJhcHBsaWNhdGlvbi92bmQudW9tbCt4bWxcIjpbXCJ1b21sXCJdLFwiYXBwbGljYXRpb24vdm5kLnZjeFwiOltcInZjeFwiXSxcImFwcGxpY2F0aW9uL3ZuZC52aXNpb1wiOltcInZzZFwiLFwidnN0XCIsXCJ2c3NcIixcInZzd1wiXSxcImFwcGxpY2F0aW9uL3ZuZC52aXNpb25hcnlcIjpbXCJ2aXNcIl0sXCJhcHBsaWNhdGlvbi92bmQudnNmXCI6W1widnNmXCJdLFwiYXBwbGljYXRpb24vdm5kLndhcC53YnhtbFwiOltcIndieG1sXCJdLFwiYXBwbGljYXRpb24vdm5kLndhcC53bWxjXCI6W1wid21sY1wiXSxcImFwcGxpY2F0aW9uL3ZuZC53YXAud21sc2NyaXB0Y1wiOltcIndtbHNjXCJdLFwiYXBwbGljYXRpb24vdm5kLndlYnR1cmJvXCI6W1wid3RiXCJdLFwiYXBwbGljYXRpb24vdm5kLndvbGZyYW0ucGxheWVyXCI6W1wibmJwXCJdLFwiYXBwbGljYXRpb24vdm5kLndvcmRwZXJmZWN0XCI6W1wid3BkXCJdLFwiYXBwbGljYXRpb24vdm5kLndxZFwiOltcIndxZFwiXSxcImFwcGxpY2F0aW9uL3ZuZC53dC5zdGZcIjpbXCJzdGZcIl0sXCJhcHBsaWNhdGlvbi92bmQueGFyYVwiOltcInhhclwiXSxcImFwcGxpY2F0aW9uL3ZuZC54ZmRsXCI6W1wieGZkbFwiXSxcImFwcGxpY2F0aW9uL3ZuZC55YW1haGEuaHYtZGljXCI6W1wiaHZkXCJdLFwiYXBwbGljYXRpb24vdm5kLnlhbWFoYS5odi1zY3JpcHRcIjpbXCJodnNcIl0sXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLmh2LXZvaWNlXCI6W1wiaHZwXCJdLFwiYXBwbGljYXRpb24vdm5kLnlhbWFoYS5vcGVuc2NvcmVmb3JtYXRcIjpbXCJvc2ZcIl0sXCJhcHBsaWNhdGlvbi92bmQueWFtYWhhLm9wZW5zY29yZWZvcm1hdC5vc2ZwdmcreG1sXCI6W1wib3NmcHZnXCJdLFwiYXBwbGljYXRpb24vdm5kLnlhbWFoYS5zbWFmLWF1ZGlvXCI6W1wic2FmXCJdLFwiYXBwbGljYXRpb24vdm5kLnlhbWFoYS5zbWFmLXBocmFzZVwiOltcInNwZlwiXSxcImFwcGxpY2F0aW9uL3ZuZC55ZWxsb3dyaXZlci1jdXN0b20tbWVudVwiOltcImNtcFwiXSxcImFwcGxpY2F0aW9uL3ZuZC56dWxcIjpbXCJ6aXJcIixcInppcnpcIl0sXCJhcHBsaWNhdGlvbi92bmQuenphenouZGVjayt4bWxcIjpbXCJ6YXpcIl0sXCJhcHBsaWNhdGlvbi92b2ljZXhtbCt4bWxcIjpbXCJ2eG1sXCJdLFwiYXBwbGljYXRpb24vd2lkZ2V0XCI6W1wid2d0XCJdLFwiYXBwbGljYXRpb24vd2luaGxwXCI6W1wiaGxwXCJdLFwiYXBwbGljYXRpb24vd3NkbCt4bWxcIjpbXCJ3c2RsXCJdLFwiYXBwbGljYXRpb24vd3Nwb2xpY3kreG1sXCI6W1wid3Nwb2xpY3lcIl0sXCJhcHBsaWNhdGlvbi94LTd6LWNvbXByZXNzZWRcIjpbXCI3elwiXSxcImFwcGxpY2F0aW9uL3gtYWJpd29yZFwiOltcImFid1wiXSxcImFwcGxpY2F0aW9uL3gtYWNlLWNvbXByZXNzZWRcIjpbXCJhY2VcIl0sXCJhcHBsaWNhdGlvbi94LWFwcGxlLWRpc2tpbWFnZVwiOltcImRtZ1wiXSxcImFwcGxpY2F0aW9uL3gtYXJqXCI6W1wiYXJqXCJdLFwiYXBwbGljYXRpb24veC1hdXRob3J3YXJlLWJpblwiOltcImFhYlwiLFwieDMyXCIsXCJ1MzJcIixcInZveFwiXSxcImFwcGxpY2F0aW9uL3gtYXV0aG9yd2FyZS1tYXBcIjpbXCJhYW1cIl0sXCJhcHBsaWNhdGlvbi94LWF1dGhvcndhcmUtc2VnXCI6W1wiYWFzXCJdLFwiYXBwbGljYXRpb24veC1iY3Bpb1wiOltcImJjcGlvXCJdLFwiYXBwbGljYXRpb24veC1iZG9jXCI6W1wiYmRvY1wiXSxcImFwcGxpY2F0aW9uL3gtYml0dG9ycmVudFwiOltcInRvcnJlbnRcIl0sXCJhcHBsaWNhdGlvbi94LWJsb3JiXCI6W1wiYmxiXCIsXCJibG9yYlwiXSxcImFwcGxpY2F0aW9uL3gtYnppcFwiOltcImJ6XCJdLFwiYXBwbGljYXRpb24veC1iemlwMlwiOltcImJ6MlwiLFwiYm96XCJdLFwiYXBwbGljYXRpb24veC1jYnJcIjpbXCJjYnJcIixcImNiYVwiLFwiY2J0XCIsXCJjYnpcIixcImNiN1wiXSxcImFwcGxpY2F0aW9uL3gtY2RsaW5rXCI6W1widmNkXCJdLFwiYXBwbGljYXRpb24veC1jZnMtY29tcHJlc3NlZFwiOltcImNmc1wiXSxcImFwcGxpY2F0aW9uL3gtY2hhdFwiOltcImNoYXRcIl0sXCJhcHBsaWNhdGlvbi94LWNoZXNzLXBnblwiOltcInBnblwiXSxcImFwcGxpY2F0aW9uL3gtY2hyb21lLWV4dGVuc2lvblwiOltcImNyeFwiXSxcImFwcGxpY2F0aW9uL3gtY29jb2FcIjpbXCJjY29cIl0sXCJhcHBsaWNhdGlvbi94LWNvbmZlcmVuY2VcIjpbXCJuc2NcIl0sXCJhcHBsaWNhdGlvbi94LWNwaW9cIjpbXCJjcGlvXCJdLFwiYXBwbGljYXRpb24veC1jc2hcIjpbXCJjc2hcIl0sXCJhcHBsaWNhdGlvbi94LWRlYmlhbi1wYWNrYWdlXCI6W1wiZGViXCIsXCJ1ZGViXCJdLFwiYXBwbGljYXRpb24veC1kZ2MtY29tcHJlc3NlZFwiOltcImRnY1wiXSxcImFwcGxpY2F0aW9uL3gtZGlyZWN0b3JcIjpbXCJkaXJcIixcImRjclwiLFwiZHhyXCIsXCJjc3RcIixcImNjdFwiLFwiY3h0XCIsXCJ3M2RcIixcImZnZFwiLFwic3dhXCJdLFwiYXBwbGljYXRpb24veC1kb29tXCI6W1wid2FkXCJdLFwiYXBwbGljYXRpb24veC1kdGJuY3greG1sXCI6W1wibmN4XCJdLFwiYXBwbGljYXRpb24veC1kdGJvb2sreG1sXCI6W1wiZHRiXCJdLFwiYXBwbGljYXRpb24veC1kdGJyZXNvdXJjZSt4bWxcIjpbXCJyZXNcIl0sXCJhcHBsaWNhdGlvbi94LWR2aVwiOltcImR2aVwiXSxcImFwcGxpY2F0aW9uL3gtZW52b3lcIjpbXCJldnlcIl0sXCJhcHBsaWNhdGlvbi94LWV2YVwiOltcImV2YVwiXSxcImFwcGxpY2F0aW9uL3gtZm9udC1iZGZcIjpbXCJiZGZcIl0sXCJhcHBsaWNhdGlvbi94LWZvbnQtZ2hvc3RzY3JpcHRcIjpbXCJnc2ZcIl0sXCJhcHBsaWNhdGlvbi94LWZvbnQtbGludXgtcHNmXCI6W1wicHNmXCJdLFwiYXBwbGljYXRpb24veC1mb250LW90ZlwiOltcIm90ZlwiXSxcImFwcGxpY2F0aW9uL3gtZm9udC1wY2ZcIjpbXCJwY2ZcIl0sXCJhcHBsaWNhdGlvbi94LWZvbnQtc25mXCI6W1wic25mXCJdLFwiYXBwbGljYXRpb24veC1mb250LXR0ZlwiOltcInR0ZlwiLFwidHRjXCJdLFwiYXBwbGljYXRpb24veC1mb250LXR5cGUxXCI6W1wicGZhXCIsXCJwZmJcIixcInBmbVwiLFwiYWZtXCJdLFwiYXBwbGljYXRpb24veC1mcmVlYXJjXCI6W1wiYXJjXCJdLFwiYXBwbGljYXRpb24veC1mdXR1cmVzcGxhc2hcIjpbXCJzcGxcIl0sXCJhcHBsaWNhdGlvbi94LWdjYS1jb21wcmVzc2VkXCI6W1wiZ2NhXCJdLFwiYXBwbGljYXRpb24veC1nbHVseFwiOltcInVseFwiXSxcImFwcGxpY2F0aW9uL3gtZ251bWVyaWNcIjpbXCJnbnVtZXJpY1wiXSxcImFwcGxpY2F0aW9uL3gtZ3JhbXBzLXhtbFwiOltcImdyYW1wc1wiXSxcImFwcGxpY2F0aW9uL3gtZ3RhclwiOltcImd0YXJcIl0sXCJhcHBsaWNhdGlvbi94LWhkZlwiOltcImhkZlwiXSxcImFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwXCI6W1wicGhwXCJdLFwiYXBwbGljYXRpb24veC1pbnN0YWxsLWluc3RydWN0aW9uc1wiOltcImluc3RhbGxcIl0sXCJhcHBsaWNhdGlvbi94LWlzbzk2NjAtaW1hZ2VcIjpbXCJpc29cIl0sXCJhcHBsaWNhdGlvbi94LWphdmEtYXJjaGl2ZS1kaWZmXCI6W1wiamFyZGlmZlwiXSxcImFwcGxpY2F0aW9uL3gtamF2YS1qbmxwLWZpbGVcIjpbXCJqbmxwXCJdLFwiYXBwbGljYXRpb24veC1sYXRleFwiOltcImxhdGV4XCJdLFwiYXBwbGljYXRpb24veC1sdWEtYnl0ZWNvZGVcIjpbXCJsdWFjXCJdLFwiYXBwbGljYXRpb24veC1semgtY29tcHJlc3NlZFwiOltcImx6aFwiLFwibGhhXCJdLFwiYXBwbGljYXRpb24veC1tYWtlc2VsZlwiOltcInJ1blwiXSxcImFwcGxpY2F0aW9uL3gtbWllXCI6W1wibWllXCJdLFwiYXBwbGljYXRpb24veC1tb2JpcG9ja2V0LWVib29rXCI6W1wicHJjXCIsXCJtb2JpXCJdLFwiYXBwbGljYXRpb24veC1tcy1hcHBsaWNhdGlvblwiOltcImFwcGxpY2F0aW9uXCJdLFwiYXBwbGljYXRpb24veC1tcy1zaG9ydGN1dFwiOltcImxua1wiXSxcImFwcGxpY2F0aW9uL3gtbXMtd21kXCI6W1wid21kXCJdLFwiYXBwbGljYXRpb24veC1tcy13bXpcIjpbXCJ3bXpcIl0sXCJhcHBsaWNhdGlvbi94LW1zLXhiYXBcIjpbXCJ4YmFwXCJdLFwiYXBwbGljYXRpb24veC1tc2FjY2Vzc1wiOltcIm1kYlwiXSxcImFwcGxpY2F0aW9uL3gtbXNiaW5kZXJcIjpbXCJvYmRcIl0sXCJhcHBsaWNhdGlvbi94LW1zY2FyZGZpbGVcIjpbXCJjcmRcIl0sXCJhcHBsaWNhdGlvbi94LW1zY2xpcFwiOltcImNscFwiXSxcImFwcGxpY2F0aW9uL3gtbXNkb3MtcHJvZ3JhbVwiOltcImV4ZVwiXSxcImFwcGxpY2F0aW9uL3gtbXNkb3dubG9hZFwiOltcImV4ZVwiLFwiZGxsXCIsXCJjb21cIixcImJhdFwiLFwibXNpXCJdLFwiYXBwbGljYXRpb24veC1tc21lZGlhdmlld1wiOltcIm12YlwiLFwibTEzXCIsXCJtMTRcIl0sXCJhcHBsaWNhdGlvbi94LW1zbWV0YWZpbGVcIjpbXCJ3bWZcIixcIndtelwiLFwiZW1mXCIsXCJlbXpcIl0sXCJhcHBsaWNhdGlvbi94LW1zbW9uZXlcIjpbXCJtbnlcIl0sXCJhcHBsaWNhdGlvbi94LW1zcHVibGlzaGVyXCI6W1wicHViXCJdLFwiYXBwbGljYXRpb24veC1tc3NjaGVkdWxlXCI6W1wic2NkXCJdLFwiYXBwbGljYXRpb24veC1tc3Rlcm1pbmFsXCI6W1widHJtXCJdLFwiYXBwbGljYXRpb24veC1tc3dyaXRlXCI6W1wid3JpXCJdLFwiYXBwbGljYXRpb24veC1uZXRjZGZcIjpbXCJuY1wiLFwiY2RmXCJdLFwiYXBwbGljYXRpb24veC1ucy1wcm94eS1hdXRvY29uZmlnXCI6W1wicGFjXCJdLFwiYXBwbGljYXRpb24veC1uemJcIjpbXCJuemJcIl0sXCJhcHBsaWNhdGlvbi94LXBlcmxcIjpbXCJwbFwiLFwicG1cIl0sXCJhcHBsaWNhdGlvbi94LXBpbG90XCI6W1wicHJjXCIsXCJwZGJcIl0sXCJhcHBsaWNhdGlvbi94LXBrY3MxMlwiOltcInAxMlwiLFwicGZ4XCJdLFwiYXBwbGljYXRpb24veC1wa2NzNy1jZXJ0aWZpY2F0ZXNcIjpbXCJwN2JcIixcInNwY1wiXSxcImFwcGxpY2F0aW9uL3gtcGtjczctY2VydHJlcXJlc3BcIjpbXCJwN3JcIl0sXCJhcHBsaWNhdGlvbi94LXJhci1jb21wcmVzc2VkXCI6W1wicmFyXCJdLFwiYXBwbGljYXRpb24veC1yZWRoYXQtcGFja2FnZS1tYW5hZ2VyXCI6W1wicnBtXCJdLFwiYXBwbGljYXRpb24veC1yZXNlYXJjaC1pbmZvLXN5c3RlbXNcIjpbXCJyaXNcIl0sXCJhcHBsaWNhdGlvbi94LXNlYVwiOltcInNlYVwiXSxcImFwcGxpY2F0aW9uL3gtc2hcIjpbXCJzaFwiXSxcImFwcGxpY2F0aW9uL3gtc2hhclwiOltcInNoYXJcIl0sXCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaFwiOltcInN3ZlwiXSxcImFwcGxpY2F0aW9uL3gtc2lsdmVybGlnaHQtYXBwXCI6W1wieGFwXCJdLFwiYXBwbGljYXRpb24veC1zcWxcIjpbXCJzcWxcIl0sXCJhcHBsaWNhdGlvbi94LXN0dWZmaXRcIjpbXCJzaXRcIl0sXCJhcHBsaWNhdGlvbi94LXN0dWZmaXR4XCI6W1wic2l0eFwiXSxcImFwcGxpY2F0aW9uL3gtc3VicmlwXCI6W1wic3J0XCJdLFwiYXBwbGljYXRpb24veC1zdjRjcGlvXCI6W1wic3Y0Y3Bpb1wiXSxcImFwcGxpY2F0aW9uL3gtc3Y0Y3JjXCI6W1wic3Y0Y3JjXCJdLFwiYXBwbGljYXRpb24veC10M3ZtLWltYWdlXCI6W1widDNcIl0sXCJhcHBsaWNhdGlvbi94LXRhZHNcIjpbXCJnYW1cIl0sXCJhcHBsaWNhdGlvbi94LXRhclwiOltcInRhclwiXSxcImFwcGxpY2F0aW9uL3gtdGNsXCI6W1widGNsXCIsXCJ0a1wiXSxcImFwcGxpY2F0aW9uL3gtdGV4XCI6W1widGV4XCJdLFwiYXBwbGljYXRpb24veC10ZXgtdGZtXCI6W1widGZtXCJdLFwiYXBwbGljYXRpb24veC10ZXhpbmZvXCI6W1widGV4aW5mb1wiLFwidGV4aVwiXSxcImFwcGxpY2F0aW9uL3gtdGdpZlwiOltcIm9ialwiXSxcImFwcGxpY2F0aW9uL3gtdXN0YXJcIjpbXCJ1c3RhclwiXSxcImFwcGxpY2F0aW9uL3gtdmlydHVhbGJveC1oZGRcIjpbXCJoZGRcIl0sXCJhcHBsaWNhdGlvbi94LXZpcnR1YWxib3gtb3ZhXCI6W1wib3ZhXCJdLFwiYXBwbGljYXRpb24veC12aXJ0dWFsYm94LW92ZlwiOltcIm92ZlwiXSxcImFwcGxpY2F0aW9uL3gtdmlydHVhbGJveC12Ym94XCI6W1widmJveFwiXSxcImFwcGxpY2F0aW9uL3gtdmlydHVhbGJveC12Ym94LWV4dHBhY2tcIjpbXCJ2Ym94LWV4dHBhY2tcIl0sXCJhcHBsaWNhdGlvbi94LXZpcnR1YWxib3gtdmRpXCI6W1widmRpXCJdLFwiYXBwbGljYXRpb24veC12aXJ0dWFsYm94LXZoZFwiOltcInZoZFwiXSxcImFwcGxpY2F0aW9uL3gtdmlydHVhbGJveC12bWRrXCI6W1widm1ka1wiXSxcImFwcGxpY2F0aW9uL3gtd2Fpcy1zb3VyY2VcIjpbXCJzcmNcIl0sXCJhcHBsaWNhdGlvbi94LXdlYi1hcHAtbWFuaWZlc3QranNvblwiOltcIndlYmFwcFwiXSxcImFwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0XCI6W1wiZGVyXCIsXCJjcnRcIixcInBlbVwiXSxcImFwcGxpY2F0aW9uL3gteGZpZ1wiOltcImZpZ1wiXSxcImFwcGxpY2F0aW9uL3gteGxpZmYreG1sXCI6W1wieGxmXCJdLFwiYXBwbGljYXRpb24veC14cGluc3RhbGxcIjpbXCJ4cGlcIl0sXCJhcHBsaWNhdGlvbi94LXh6XCI6W1wieHpcIl0sXCJhcHBsaWNhdGlvbi94LXptYWNoaW5lXCI6W1wiejFcIixcInoyXCIsXCJ6M1wiLFwiejRcIixcIno1XCIsXCJ6NlwiLFwiejdcIixcIno4XCJdLFwiYXBwbGljYXRpb24veGFtbCt4bWxcIjpbXCJ4YW1sXCJdLFwiYXBwbGljYXRpb24veGNhcC1kaWZmK3htbFwiOltcInhkZlwiXSxcImFwcGxpY2F0aW9uL3hlbmMreG1sXCI6W1wieGVuY1wiXSxcImFwcGxpY2F0aW9uL3hodG1sK3htbFwiOltcInhodG1sXCIsXCJ4aHRcIl0sXCJhcHBsaWNhdGlvbi94bWxcIjpbXCJ4bWxcIixcInhzbFwiLFwieHNkXCIsXCJybmdcIl0sXCJhcHBsaWNhdGlvbi94bWwtZHRkXCI6W1wiZHRkXCJdLFwiYXBwbGljYXRpb24veG9wK3htbFwiOltcInhvcFwiXSxcImFwcGxpY2F0aW9uL3hwcm9jK3htbFwiOltcInhwbFwiXSxcImFwcGxpY2F0aW9uL3hzbHQreG1sXCI6W1wieHNsdFwiXSxcImFwcGxpY2F0aW9uL3hzcGYreG1sXCI6W1wieHNwZlwiXSxcImFwcGxpY2F0aW9uL3h2K3htbFwiOltcIm14bWxcIixcInhodm1sXCIsXCJ4dm1sXCIsXCJ4dm1cIl0sXCJhcHBsaWNhdGlvbi95YW5nXCI6W1wieWFuZ1wiXSxcImFwcGxpY2F0aW9uL3lpbit4bWxcIjpbXCJ5aW5cIl0sXCJhcHBsaWNhdGlvbi96aXBcIjpbXCJ6aXBcIl0sXCJhdWRpby8zZ3BwXCI6W1wiM2dwcFwiXSxcImF1ZGlvL2FkcGNtXCI6W1wiYWRwXCJdLFwiYXVkaW8vYmFzaWNcIjpbXCJhdVwiLFwic25kXCJdLFwiYXVkaW8vbWlkaVwiOltcIm1pZFwiLFwibWlkaVwiLFwia2FyXCIsXCJybWlcIl0sXCJhdWRpby9tcDNcIjpbXCJtcDNcIl0sXCJhdWRpby9tcDRcIjpbXCJtNGFcIixcIm1wNGFcIl0sXCJhdWRpby9tcGVnXCI6W1wibXBnYVwiLFwibXAyXCIsXCJtcDJhXCIsXCJtcDNcIixcIm0yYVwiLFwibTNhXCJdLFwiYXVkaW8vb2dnXCI6W1wib2dhXCIsXCJvZ2dcIixcInNweFwiXSxcImF1ZGlvL3MzbVwiOltcInMzbVwiXSxcImF1ZGlvL3NpbGtcIjpbXCJzaWxcIl0sXCJhdWRpby92bmQuZGVjZS5hdWRpb1wiOltcInV2YVwiLFwidXZ2YVwiXSxcImF1ZGlvL3ZuZC5kaWdpdGFsLXdpbmRzXCI6W1wiZW9sXCJdLFwiYXVkaW8vdm5kLmRyYVwiOltcImRyYVwiXSxcImF1ZGlvL3ZuZC5kdHNcIjpbXCJkdHNcIl0sXCJhdWRpby92bmQuZHRzLmhkXCI6W1wiZHRzaGRcIl0sXCJhdWRpby92bmQubHVjZW50LnZvaWNlXCI6W1wibHZwXCJdLFwiYXVkaW8vdm5kLm1zLXBsYXlyZWFkeS5tZWRpYS5weWFcIjpbXCJweWFcIl0sXCJhdWRpby92bmQubnVlcmEuZWNlbHA0ODAwXCI6W1wiZWNlbHA0ODAwXCJdLFwiYXVkaW8vdm5kLm51ZXJhLmVjZWxwNzQ3MFwiOltcImVjZWxwNzQ3MFwiXSxcImF1ZGlvL3ZuZC5udWVyYS5lY2VscDk2MDBcIjpbXCJlY2VscDk2MDBcIl0sXCJhdWRpby92bmQucmlwXCI6W1wicmlwXCJdLFwiYXVkaW8vd2F2XCI6W1wid2F2XCJdLFwiYXVkaW8vd2F2ZVwiOltcIndhdlwiXSxcImF1ZGlvL3dlYm1cIjpbXCJ3ZWJhXCJdLFwiYXVkaW8veC1hYWNcIjpbXCJhYWNcIl0sXCJhdWRpby94LWFpZmZcIjpbXCJhaWZcIixcImFpZmZcIixcImFpZmNcIl0sXCJhdWRpby94LWNhZlwiOltcImNhZlwiXSxcImF1ZGlvL3gtZmxhY1wiOltcImZsYWNcIl0sXCJhdWRpby94LW00YVwiOltcIm00YVwiXSxcImF1ZGlvL3gtbWF0cm9za2FcIjpbXCJta2FcIl0sXCJhdWRpby94LW1wZWd1cmxcIjpbXCJtM3VcIl0sXCJhdWRpby94LW1zLXdheFwiOltcIndheFwiXSxcImF1ZGlvL3gtbXMtd21hXCI6W1wid21hXCJdLFwiYXVkaW8veC1wbi1yZWFsYXVkaW9cIjpbXCJyYW1cIixcInJhXCJdLFwiYXVkaW8veC1wbi1yZWFsYXVkaW8tcGx1Z2luXCI6W1wicm1wXCJdLFwiYXVkaW8veC1yZWFsYXVkaW9cIjpbXCJyYVwiXSxcImF1ZGlvL3gtd2F2XCI6W1wid2F2XCJdLFwiYXVkaW8veG1cIjpbXCJ4bVwiXSxcImNoZW1pY2FsL3gtY2R4XCI6W1wiY2R4XCJdLFwiY2hlbWljYWwveC1jaWZcIjpbXCJjaWZcIl0sXCJjaGVtaWNhbC94LWNtZGZcIjpbXCJjbWRmXCJdLFwiY2hlbWljYWwveC1jbWxcIjpbXCJjbWxcIl0sXCJjaGVtaWNhbC94LWNzbWxcIjpbXCJjc21sXCJdLFwiY2hlbWljYWwveC14eXpcIjpbXCJ4eXpcIl0sXCJmb250L290ZlwiOltcIm90ZlwiXSxcImltYWdlL2FwbmdcIjpbXCJhcG5nXCJdLFwiaW1hZ2UvYm1wXCI6W1wiYm1wXCJdLFwiaW1hZ2UvY2dtXCI6W1wiY2dtXCJdLFwiaW1hZ2UvZzNmYXhcIjpbXCJnM1wiXSxcImltYWdlL2dpZlwiOltcImdpZlwiXSxcImltYWdlL2llZlwiOltcImllZlwiXSxcImltYWdlL2pwZWdcIjpbXCJqcGVnXCIsXCJqcGdcIixcImpwZVwiXSxcImltYWdlL2t0eFwiOltcImt0eFwiXSxcImltYWdlL3BuZ1wiOltcInBuZ1wiXSxcImltYWdlL3Bycy5idGlmXCI6W1wiYnRpZlwiXSxcImltYWdlL3NnaVwiOltcInNnaVwiXSxcImltYWdlL3N2Zyt4bWxcIjpbXCJzdmdcIixcInN2Z3pcIl0sXCJpbWFnZS90aWZmXCI6W1widGlmZlwiLFwidGlmXCJdLFwiaW1hZ2Uvdm5kLmFkb2JlLnBob3Rvc2hvcFwiOltcInBzZFwiXSxcImltYWdlL3ZuZC5kZWNlLmdyYXBoaWNcIjpbXCJ1dmlcIixcInV2dmlcIixcInV2Z1wiLFwidXZ2Z1wiXSxcImltYWdlL3ZuZC5kanZ1XCI6W1wiZGp2dVwiLFwiZGp2XCJdLFwiaW1hZ2Uvdm5kLmR2Yi5zdWJ0aXRsZVwiOltcInN1YlwiXSxcImltYWdlL3ZuZC5kd2dcIjpbXCJkd2dcIl0sXCJpbWFnZS92bmQuZHhmXCI6W1wiZHhmXCJdLFwiaW1hZ2Uvdm5kLmZhc3RiaWRzaGVldFwiOltcImZic1wiXSxcImltYWdlL3ZuZC5mcHhcIjpbXCJmcHhcIl0sXCJpbWFnZS92bmQuZnN0XCI6W1wiZnN0XCJdLFwiaW1hZ2Uvdm5kLmZ1aml4ZXJveC5lZG1pY3MtbW1yXCI6W1wibW1yXCJdLFwiaW1hZ2Uvdm5kLmZ1aml4ZXJveC5lZG1pY3MtcmxjXCI6W1wicmxjXCJdLFwiaW1hZ2Uvdm5kLm1zLW1vZGlcIjpbXCJtZGlcIl0sXCJpbWFnZS92bmQubXMtcGhvdG9cIjpbXCJ3ZHBcIl0sXCJpbWFnZS92bmQubmV0LWZweFwiOltcIm5weFwiXSxcImltYWdlL3ZuZC53YXAud2JtcFwiOltcIndibXBcIl0sXCJpbWFnZS92bmQueGlmZlwiOltcInhpZlwiXSxcImltYWdlL3dlYnBcIjpbXCJ3ZWJwXCJdLFwiaW1hZ2UveC0zZHNcIjpbXCIzZHNcIl0sXCJpbWFnZS94LWNtdS1yYXN0ZXJcIjpbXCJyYXNcIl0sXCJpbWFnZS94LWNteFwiOltcImNteFwiXSxcImltYWdlL3gtZnJlZWhhbmRcIjpbXCJmaFwiLFwiZmhjXCIsXCJmaDRcIixcImZoNVwiLFwiZmg3XCJdLFwiaW1hZ2UveC1pY29uXCI6W1wiaWNvXCJdLFwiaW1hZ2UveC1qbmdcIjpbXCJqbmdcIl0sXCJpbWFnZS94LW1yc2lkLWltYWdlXCI6W1wic2lkXCJdLFwiaW1hZ2UveC1tcy1ibXBcIjpbXCJibXBcIl0sXCJpbWFnZS94LXBjeFwiOltcInBjeFwiXSxcImltYWdlL3gtcGljdFwiOltcInBpY1wiLFwicGN0XCJdLFwiaW1hZ2UveC1wb3J0YWJsZS1hbnltYXBcIjpbXCJwbm1cIl0sXCJpbWFnZS94LXBvcnRhYmxlLWJpdG1hcFwiOltcInBibVwiXSxcImltYWdlL3gtcG9ydGFibGUtZ3JheW1hcFwiOltcInBnbVwiXSxcImltYWdlL3gtcG9ydGFibGUtcGl4bWFwXCI6W1wicHBtXCJdLFwiaW1hZ2UveC1yZ2JcIjpbXCJyZ2JcIl0sXCJpbWFnZS94LXRnYVwiOltcInRnYVwiXSxcImltYWdlL3gteGJpdG1hcFwiOltcInhibVwiXSxcImltYWdlL3gteHBpeG1hcFwiOltcInhwbVwiXSxcImltYWdlL3gteHdpbmRvd2R1bXBcIjpbXCJ4d2RcIl0sXCJtZXNzYWdlL3JmYzgyMlwiOltcImVtbFwiLFwibWltZVwiXSxcIm1vZGVsL2dsdGYranNvblwiOltcImdsdGZcIl0sXCJtb2RlbC9nbHRmLWJpbmFyeVwiOltcImdsYlwiXSxcIm1vZGVsL2lnZXNcIjpbXCJpZ3NcIixcImlnZXNcIl0sXCJtb2RlbC9tZXNoXCI6W1wibXNoXCIsXCJtZXNoXCIsXCJzaWxvXCJdLFwibW9kZWwvdm5kLmNvbGxhZGEreG1sXCI6W1wiZGFlXCJdLFwibW9kZWwvdm5kLmR3ZlwiOltcImR3ZlwiXSxcIm1vZGVsL3ZuZC5nZGxcIjpbXCJnZGxcIl0sXCJtb2RlbC92bmQuZ3R3XCI6W1wiZ3R3XCJdLFwibW9kZWwvdm5kLm10c1wiOltcIm10c1wiXSxcIm1vZGVsL3ZuZC52dHVcIjpbXCJ2dHVcIl0sXCJtb2RlbC92cm1sXCI6W1wid3JsXCIsXCJ2cm1sXCJdLFwibW9kZWwveDNkK2JpbmFyeVwiOltcIngzZGJcIixcIngzZGJ6XCJdLFwibW9kZWwveDNkK3ZybWxcIjpbXCJ4M2R2XCIsXCJ4M2R2elwiXSxcIm1vZGVsL3gzZCt4bWxcIjpbXCJ4M2RcIixcIngzZHpcIl0sXCJ0ZXh0L2NhY2hlLW1hbmlmZXN0XCI6W1wiYXBwY2FjaGVcIixcIm1hbmlmZXN0XCJdLFwidGV4dC9jYWxlbmRhclwiOltcImljc1wiLFwiaWZiXCJdLFwidGV4dC9jb2ZmZWVzY3JpcHRcIjpbXCJjb2ZmZWVcIixcImxpdGNvZmZlZVwiXSxcInRleHQvY3NzXCI6W1wiY3NzXCJdLFwidGV4dC9jc3ZcIjpbXCJjc3ZcIl0sXCJ0ZXh0L2hqc29uXCI6W1wiaGpzb25cIl0sXCJ0ZXh0L2h0bWxcIjpbXCJodG1sXCIsXCJodG1cIixcInNodG1sXCJdLFwidGV4dC9qYWRlXCI6W1wiamFkZVwiXSxcInRleHQvanN4XCI6W1wianN4XCJdLFwidGV4dC9sZXNzXCI6W1wibGVzc1wiXSxcInRleHQvbWFya2Rvd25cIjpbXCJtYXJrZG93blwiLFwibWRcIl0sXCJ0ZXh0L21hdGhtbFwiOltcIm1tbFwiXSxcInRleHQvbjNcIjpbXCJuM1wiXSxcInRleHQvcGxhaW5cIjpbXCJ0eHRcIixcInRleHRcIixcImNvbmZcIixcImRlZlwiLFwibGlzdFwiLFwibG9nXCIsXCJpblwiLFwiaW5pXCJdLFwidGV4dC9wcnMubGluZXMudGFnXCI6W1wiZHNjXCJdLFwidGV4dC9yaWNodGV4dFwiOltcInJ0eFwiXSxcInRleHQvcnRmXCI6W1wicnRmXCJdLFwidGV4dC9zZ21sXCI6W1wic2dtbFwiLFwic2dtXCJdLFwidGV4dC9zbGltXCI6W1wic2xpbVwiLFwic2xtXCJdLFwidGV4dC9zdHlsdXNcIjpbXCJzdHlsdXNcIixcInN0eWxcIl0sXCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzXCI6W1widHN2XCJdLFwidGV4dC90cm9mZlwiOltcInRcIixcInRyXCIsXCJyb2ZmXCIsXCJtYW5cIixcIm1lXCIsXCJtc1wiXSxcInRleHQvdHVydGxlXCI6W1widHRsXCJdLFwidGV4dC91cmktbGlzdFwiOltcInVyaVwiLFwidXJpc1wiLFwidXJsc1wiXSxcInRleHQvdmNhcmRcIjpbXCJ2Y2FyZFwiXSxcInRleHQvdm5kLmN1cmxcIjpbXCJjdXJsXCJdLFwidGV4dC92bmQuY3VybC5kY3VybFwiOltcImRjdXJsXCJdLFwidGV4dC92bmQuY3VybC5tY3VybFwiOltcIm1jdXJsXCJdLFwidGV4dC92bmQuY3VybC5zY3VybFwiOltcInNjdXJsXCJdLFwidGV4dC92bmQuZHZiLnN1YnRpdGxlXCI6W1wic3ViXCJdLFwidGV4dC92bmQuZmx5XCI6W1wiZmx5XCJdLFwidGV4dC92bmQuZm1pLmZsZXhzdG9yXCI6W1wiZmx4XCJdLFwidGV4dC92bmQuZ3JhcGh2aXpcIjpbXCJndlwiXSxcInRleHQvdm5kLmluM2QuM2RtbFwiOltcIjNkbWxcIl0sXCJ0ZXh0L3ZuZC5pbjNkLnNwb3RcIjpbXCJzcG90XCJdLFwidGV4dC92bmQuc3VuLmoybWUuYXBwLWRlc2NyaXB0b3JcIjpbXCJqYWRcIl0sXCJ0ZXh0L3ZuZC53YXAud21sXCI6W1wid21sXCJdLFwidGV4dC92bmQud2FwLndtbHNjcmlwdFwiOltcIndtbHNcIl0sXCJ0ZXh0L3Z0dFwiOltcInZ0dFwiXSxcInRleHQveC1hc21cIjpbXCJzXCIsXCJhc21cIl0sXCJ0ZXh0L3gtY1wiOltcImNcIixcImNjXCIsXCJjeHhcIixcImNwcFwiLFwiaFwiLFwiaGhcIixcImRpY1wiXSxcInRleHQveC1jb21wb25lbnRcIjpbXCJodGNcIl0sXCJ0ZXh0L3gtZm9ydHJhblwiOltcImZcIixcImZvclwiLFwiZjc3XCIsXCJmOTBcIl0sXCJ0ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZVwiOltcImhic1wiXSxcInRleHQveC1qYXZhLXNvdXJjZVwiOltcImphdmFcIl0sXCJ0ZXh0L3gtbHVhXCI6W1wibHVhXCJdLFwidGV4dC94LW1hcmtkb3duXCI6W1wibWtkXCJdLFwidGV4dC94LW5mb1wiOltcIm5mb1wiXSxcInRleHQveC1vcG1sXCI6W1wib3BtbFwiXSxcInRleHQveC1vcmdcIjpbXCJvcmdcIl0sXCJ0ZXh0L3gtcGFzY2FsXCI6W1wicFwiLFwicGFzXCJdLFwidGV4dC94LXByb2Nlc3NpbmdcIjpbXCJwZGVcIl0sXCJ0ZXh0L3gtc2Fzc1wiOltcInNhc3NcIl0sXCJ0ZXh0L3gtc2Nzc1wiOltcInNjc3NcIl0sXCJ0ZXh0L3gtc2V0ZXh0XCI6W1wiZXR4XCJdLFwidGV4dC94LXNmdlwiOltcInNmdlwiXSxcInRleHQveC1zdXNlLXltcFwiOltcInltcFwiXSxcInRleHQveC11dWVuY29kZVwiOltcInV1XCJdLFwidGV4dC94LXZjYWxlbmRhclwiOltcInZjc1wiXSxcInRleHQveC12Y2FyZFwiOltcInZjZlwiXSxcInRleHQveG1sXCI6W1wieG1sXCJdLFwidGV4dC95YW1sXCI6W1wieWFtbFwiLFwieW1sXCJdLFwidmlkZW8vM2dwcFwiOltcIjNncFwiLFwiM2dwcFwiXSxcInZpZGVvLzNncHAyXCI6W1wiM2cyXCJdLFwidmlkZW8vaDI2MVwiOltcImgyNjFcIl0sXCJ2aWRlby9oMjYzXCI6W1wiaDI2M1wiXSxcInZpZGVvL2gyNjRcIjpbXCJoMjY0XCJdLFwidmlkZW8vanBlZ1wiOltcImpwZ3ZcIl0sXCJ2aWRlby9qcG1cIjpbXCJqcG1cIixcImpwZ21cIl0sXCJ2aWRlby9tajJcIjpbXCJtajJcIixcIm1qcDJcIl0sXCJ2aWRlby9tcDJ0XCI6W1widHNcIl0sXCJ2aWRlby9tcDRcIjpbXCJtcDRcIixcIm1wNHZcIixcIm1wZzRcIl0sXCJ2aWRlby9tcGVnXCI6W1wibXBlZ1wiLFwibXBnXCIsXCJtcGVcIixcIm0xdlwiLFwibTJ2XCJdLFwidmlkZW8vb2dnXCI6W1wib2d2XCJdLFwidmlkZW8vcXVpY2t0aW1lXCI6W1wicXRcIixcIm1vdlwiXSxcInZpZGVvL3ZuZC5kZWNlLmhkXCI6W1widXZoXCIsXCJ1dnZoXCJdLFwidmlkZW8vdm5kLmRlY2UubW9iaWxlXCI6W1widXZtXCIsXCJ1dnZtXCJdLFwidmlkZW8vdm5kLmRlY2UucGRcIjpbXCJ1dnBcIixcInV2dnBcIl0sXCJ2aWRlby92bmQuZGVjZS5zZFwiOltcInV2c1wiLFwidXZ2c1wiXSxcInZpZGVvL3ZuZC5kZWNlLnZpZGVvXCI6W1widXZ2XCIsXCJ1dnZ2XCJdLFwidmlkZW8vdm5kLmR2Yi5maWxlXCI6W1wiZHZiXCJdLFwidmlkZW8vdm5kLmZ2dFwiOltcImZ2dFwiXSxcInZpZGVvL3ZuZC5tcGVndXJsXCI6W1wibXh1XCIsXCJtNHVcIl0sXCJ2aWRlby92bmQubXMtcGxheXJlYWR5Lm1lZGlhLnB5dlwiOltcInB5dlwiXSxcInZpZGVvL3ZuZC51dnZ1Lm1wNFwiOltcInV2dVwiLFwidXZ2dVwiXSxcInZpZGVvL3ZuZC52aXZvXCI6W1widml2XCJdLFwidmlkZW8vd2VibVwiOltcIndlYm1cIl0sXCJ2aWRlby94LWY0dlwiOltcImY0dlwiXSxcInZpZGVvL3gtZmxpXCI6W1wiZmxpXCJdLFwidmlkZW8veC1mbHZcIjpbXCJmbHZcIl0sXCJ2aWRlby94LW00dlwiOltcIm00dlwiXSxcInZpZGVvL3gtbWF0cm9za2FcIjpbXCJta3ZcIixcIm1rM2RcIixcIm1rc1wiXSxcInZpZGVvL3gtbW5nXCI6W1wibW5nXCJdLFwidmlkZW8veC1tcy1hc2ZcIjpbXCJhc2ZcIixcImFzeFwiXSxcInZpZGVvL3gtbXMtdm9iXCI6W1widm9iXCJdLFwidmlkZW8veC1tcy13bVwiOltcIndtXCJdLFwidmlkZW8veC1tcy13bXZcIjpbXCJ3bXZcIl0sXCJ2aWRlby94LW1zLXdteFwiOltcIndteFwiXSxcInZpZGVvL3gtbXMtd3Z4XCI6W1wid3Z4XCJdLFwidmlkZW8veC1tc3ZpZGVvXCI6W1wiYXZpXCJdLFwidmlkZW8veC1zZ2ktbW92aWVcIjpbXCJtb3ZpZVwiXSxcInZpZGVvL3gtc212XCI6W1wic212XCJdLFwieC1jb25mZXJlbmNlL3gtY29vbHRhbGtcIjpbXCJpY2VcIl19XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL21pbWUvdHlwZXMuanNvblxuLy8gbW9kdWxlIGlkID0gMTY5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogZm9yd2FyZGVkXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZvcndhcmRlZFxuXG4vKipcbiAqIEdldCBhbGwgYWRkcmVzc2VzIGluIHRoZSByZXF1ZXN0LCB1c2luZyB0aGUgYFgtRm9yd2FyZGVkLUZvcmAgaGVhZGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXFcbiAqIEByZXR1cm4ge2FycmF5fVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGZvcndhcmRlZCAocmVxKSB7XG4gIGlmICghcmVxKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgcmVxIGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIHNpbXBsZSBoZWFkZXIgcGFyc2luZ1xuICB2YXIgcHJveHlBZGRycyA9IHBhcnNlKHJlcS5oZWFkZXJzWyd4LWZvcndhcmRlZC1mb3InXSB8fCAnJylcbiAgdmFyIHNvY2tldEFkZHIgPSByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzXG4gIHZhciBhZGRycyA9IFtzb2NrZXRBZGRyXS5jb25jYXQocHJveHlBZGRycylcblxuICAvLyByZXR1cm4gYWxsIGFkZHJlc3Nlc1xuICByZXR1cm4gYWRkcnNcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgWC1Gb3J3YXJkZWQtRm9yIGhlYWRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlIChoZWFkZXIpIHtcbiAgdmFyIGVuZCA9IGhlYWRlci5sZW5ndGhcbiAgdmFyIGxpc3QgPSBbXVxuICB2YXIgc3RhcnQgPSBoZWFkZXIubGVuZ3RoXG5cbiAgLy8gZ2F0aGVyIGFkZHJlc3NlcywgYmFja3dhcmRzXG4gIGZvciAodmFyIGkgPSBoZWFkZXIubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBzd2l0Y2ggKGhlYWRlci5jaGFyQ29kZUF0KGkpKSB7XG4gICAgICBjYXNlIDB4MjA6IC8qICAgKi9cbiAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHtcbiAgICAgICAgICBzdGFydCA9IGVuZCA9IGlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAweDJjOiAvKiAsICovXG4gICAgICAgIGlmIChzdGFydCAhPT0gZW5kKSB7XG4gICAgICAgICAgbGlzdC5wdXNoKGhlYWRlci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpXG4gICAgICAgIH1cbiAgICAgICAgc3RhcnQgPSBlbmQgPSBpXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzdGFydCA9IGlcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvLyBmaW5hbCBhZGRyZXNzXG4gIGlmIChzdGFydCAhPT0gZW5kKSB7XG4gICAgbGlzdC5wdXNoKGhlYWRlci5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpXG4gIH1cblxuICByZXR1cm4gbGlzdFxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2ZvcndhcmRlZC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTcwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIihmdW5jdGlvbigpIHtcbiAgdmFyIGV4cGFuZElQdjYsIGlwYWRkciwgaXB2NFBhcnQsIGlwdjRSZWdleGVzLCBpcHY2UGFydCwgaXB2NlJlZ2V4ZXMsIG1hdGNoQ0lEUiwgcm9vdCwgem9uZUluZGV4O1xuXG4gIGlwYWRkciA9IHt9O1xuXG4gIHJvb3QgPSB0aGlzO1xuXG4gIGlmICgodHlwZW9mIG1vZHVsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtb2R1bGUgIT09IG51bGwpICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBpcGFkZHI7XG4gIH0gZWxzZSB7XG4gICAgcm9vdFsnaXBhZGRyJ10gPSBpcGFkZHI7XG4gIH1cblxuICBtYXRjaENJRFIgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kLCBwYXJ0U2l6ZSwgY2lkckJpdHMpIHtcbiAgICB2YXIgcGFydCwgc2hpZnQ7XG4gICAgaWYgKGZpcnN0Lmxlbmd0aCAhPT0gc2Vjb25kLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaXBhZGRyOiBjYW5ub3QgbWF0Y2ggQ0lEUiBmb3Igb2JqZWN0cyB3aXRoIGRpZmZlcmVudCBsZW5ndGhzXCIpO1xuICAgIH1cbiAgICBwYXJ0ID0gMDtcbiAgICB3aGlsZSAoY2lkckJpdHMgPiAwKSB7XG4gICAgICBzaGlmdCA9IHBhcnRTaXplIC0gY2lkckJpdHM7XG4gICAgICBpZiAoc2hpZnQgPCAwKSB7XG4gICAgICAgIHNoaWZ0ID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChmaXJzdFtwYXJ0XSA+PiBzaGlmdCAhPT0gc2Vjb25kW3BhcnRdID4+IHNoaWZ0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNpZHJCaXRzIC09IHBhcnRTaXplO1xuICAgICAgcGFydCArPSAxO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBpcGFkZHIuc3VibmV0TWF0Y2ggPSBmdW5jdGlvbihhZGRyZXNzLCByYW5nZUxpc3QsIGRlZmF1bHROYW1lKSB7XG4gICAgdmFyIGssIGxlbiwgcmFuZ2VOYW1lLCByYW5nZVN1Ym5ldHMsIHN1Ym5ldDtcbiAgICBpZiAoZGVmYXVsdE5hbWUgPT0gbnVsbCkge1xuICAgICAgZGVmYXVsdE5hbWUgPSAndW5pY2FzdCc7XG4gICAgfVxuICAgIGZvciAocmFuZ2VOYW1lIGluIHJhbmdlTGlzdCkge1xuICAgICAgcmFuZ2VTdWJuZXRzID0gcmFuZ2VMaXN0W3JhbmdlTmFtZV07XG4gICAgICBpZiAocmFuZ2VTdWJuZXRzWzBdICYmICEocmFuZ2VTdWJuZXRzWzBdIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgIHJhbmdlU3VibmV0cyA9IFtyYW5nZVN1Ym5ldHNdO1xuICAgICAgfVxuICAgICAgZm9yIChrID0gMCwgbGVuID0gcmFuZ2VTdWJuZXRzLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7XG4gICAgICAgIHN1Ym5ldCA9IHJhbmdlU3VibmV0c1trXTtcbiAgICAgICAgaWYgKGFkZHJlc3Mua2luZCgpID09PSBzdWJuZXRbMF0ua2luZCgpKSB7XG4gICAgICAgICAgaWYgKGFkZHJlc3MubWF0Y2guYXBwbHkoYWRkcmVzcywgc3VibmV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJhbmdlTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHROYW1lO1xuICB9O1xuXG4gIGlwYWRkci5JUHY0ID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIElQdjQob2N0ZXRzKSB7XG4gICAgICB2YXIgaywgbGVuLCBvY3RldDtcbiAgICAgIGlmIChvY3RldHMubGVuZ3RoICE9PSA0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogaXB2NCBvY3RldCBjb3VudCBzaG91bGQgYmUgNFwiKTtcbiAgICAgIH1cbiAgICAgIGZvciAoayA9IDAsIGxlbiA9IG9jdGV0cy5sZW5ndGg7IGsgPCBsZW47IGsrKykge1xuICAgICAgICBvY3RldCA9IG9jdGV0c1trXTtcbiAgICAgICAgaWYgKCEoKDAgPD0gb2N0ZXQgJiYgb2N0ZXQgPD0gMjU1KSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IGlwdjQgb2N0ZXQgc2hvdWxkIGZpdCBpbiA4IGJpdHNcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMub2N0ZXRzID0gb2N0ZXRzO1xuICAgIH1cblxuICAgIElQdjQucHJvdG90eXBlLmtpbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAnaXB2NCc7XG4gICAgfTtcblxuICAgIElQdjQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5vY3RldHMuam9pbihcIi5cIik7XG4gICAgfTtcblxuICAgIElQdjQucHJvdG90eXBlLnRvTm9ybWFsaXplZFN0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTtcbiAgICB9O1xuXG4gICAgSVB2NC5wcm90b3R5cGUudG9CeXRlQXJyYXkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLm9jdGV0cy5zbGljZSgwKTtcbiAgICB9O1xuXG4gICAgSVB2NC5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbihvdGhlciwgY2lkclJhbmdlKSB7XG4gICAgICB2YXIgcmVmO1xuICAgICAgaWYgKGNpZHJSYW5nZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHJlZiA9IG90aGVyLCBvdGhlciA9IHJlZlswXSwgY2lkclJhbmdlID0gcmVmWzFdO1xuICAgICAgfVxuICAgICAgaWYgKG90aGVyLmtpbmQoKSAhPT0gJ2lwdjQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImlwYWRkcjogY2Fubm90IG1hdGNoIGlwdjQgYWRkcmVzcyB3aXRoIG5vbi1pcHY0IG9uZVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaENJRFIodGhpcy5vY3RldHMsIG90aGVyLm9jdGV0cywgOCwgY2lkclJhbmdlKTtcbiAgICB9O1xuXG4gICAgSVB2NC5wcm90b3R5cGUuU3BlY2lhbFJhbmdlcyA9IHtcbiAgICAgIHVuc3BlY2lmaWVkOiBbW25ldyBJUHY0KFswLCAwLCAwLCAwXSksIDhdXSxcbiAgICAgIGJyb2FkY2FzdDogW1tuZXcgSVB2NChbMjU1LCAyNTUsIDI1NSwgMjU1XSksIDMyXV0sXG4gICAgICBtdWx0aWNhc3Q6IFtbbmV3IElQdjQoWzIyNCwgMCwgMCwgMF0pLCA0XV0sXG4gICAgICBsaW5rTG9jYWw6IFtbbmV3IElQdjQoWzE2OSwgMjU0LCAwLCAwXSksIDE2XV0sXG4gICAgICBsb29wYmFjazogW1tuZXcgSVB2NChbMTI3LCAwLCAwLCAwXSksIDhdXSxcbiAgICAgIGNhcnJpZXJHcmFkZU5hdDogW1tuZXcgSVB2NChbMTAwLCA2NCwgMCwgMF0pLCAxMF1dLFxuICAgICAgXCJwcml2YXRlXCI6IFtbbmV3IElQdjQoWzEwLCAwLCAwLCAwXSksIDhdLCBbbmV3IElQdjQoWzE3MiwgMTYsIDAsIDBdKSwgMTJdLCBbbmV3IElQdjQoWzE5MiwgMTY4LCAwLCAwXSksIDE2XV0sXG4gICAgICByZXNlcnZlZDogW1tuZXcgSVB2NChbMTkyLCAwLCAwLCAwXSksIDI0XSwgW25ldyBJUHY0KFsxOTIsIDAsIDIsIDBdKSwgMjRdLCBbbmV3IElQdjQoWzE5MiwgODgsIDk5LCAwXSksIDI0XSwgW25ldyBJUHY0KFsxOTgsIDUxLCAxMDAsIDBdKSwgMjRdLCBbbmV3IElQdjQoWzIwMywgMCwgMTEzLCAwXSksIDI0XSwgW25ldyBJUHY0KFsyNDAsIDAsIDAsIDBdKSwgNF1dXG4gICAgfTtcblxuICAgIElQdjQucHJvdG90eXBlLnJhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaXBhZGRyLnN1Ym5ldE1hdGNoKHRoaXMsIHRoaXMuU3BlY2lhbFJhbmdlcyk7XG4gICAgfTtcblxuICAgIElQdjQucHJvdG90eXBlLnRvSVB2NE1hcHBlZEFkZHJlc3MgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBpcGFkZHIuSVB2Ni5wYXJzZShcIjo6ZmZmZjpcIiArICh0aGlzLnRvU3RyaW5nKCkpKTtcbiAgICB9O1xuXG4gICAgSVB2NC5wcm90b3R5cGUucHJlZml4TGVuZ3RoRnJvbVN1Ym5ldE1hc2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjaWRyLCBpLCBrLCBvY3RldCwgc3RvcCwgemVyb3MsIHplcm90YWJsZTtcbiAgICAgIHplcm90YWJsZSA9IHtcbiAgICAgICAgMDogOCxcbiAgICAgICAgMTI4OiA3LFxuICAgICAgICAxOTI6IDYsXG4gICAgICAgIDIyNDogNSxcbiAgICAgICAgMjQwOiA0LFxuICAgICAgICAyNDg6IDMsXG4gICAgICAgIDI1MjogMixcbiAgICAgICAgMjU0OiAxLFxuICAgICAgICAyNTU6IDBcbiAgICAgIH07XG4gICAgICBjaWRyID0gMDtcbiAgICAgIHN0b3AgPSBmYWxzZTtcbiAgICAgIGZvciAoaSA9IGsgPSAzOyBrID49IDA7IGkgPSBrICs9IC0xKSB7XG4gICAgICAgIG9jdGV0ID0gdGhpcy5vY3RldHNbaV07XG4gICAgICAgIGlmIChvY3RldCBpbiB6ZXJvdGFibGUpIHtcbiAgICAgICAgICB6ZXJvcyA9IHplcm90YWJsZVtvY3RldF07XG4gICAgICAgICAgaWYgKHN0b3AgJiYgemVyb3MgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoemVyb3MgIT09IDgpIHtcbiAgICAgICAgICAgIHN0b3AgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaWRyICs9IHplcm9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gMzIgLSBjaWRyO1xuICAgIH07XG5cbiAgICByZXR1cm4gSVB2NDtcblxuICB9KSgpO1xuXG4gIGlwdjRQYXJ0ID0gXCIoMD9cXFxcZCt8MHhbYS1mMC05XSspXCI7XG5cbiAgaXB2NFJlZ2V4ZXMgPSB7XG4gICAgZm91ck9jdGV0OiBuZXcgUmVnRXhwKFwiXlwiICsgaXB2NFBhcnQgKyBcIlxcXFwuXCIgKyBpcHY0UGFydCArIFwiXFxcXC5cIiArIGlwdjRQYXJ0ICsgXCJcXFxcLlwiICsgaXB2NFBhcnQgKyBcIiRcIiwgJ2knKSxcbiAgICBsb25nVmFsdWU6IG5ldyBSZWdFeHAoXCJeXCIgKyBpcHY0UGFydCArIFwiJFwiLCAnaScpXG4gIH07XG5cbiAgaXBhZGRyLklQdjQucGFyc2VyID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIG1hdGNoLCBwYXJzZUludEF1dG8sIHBhcnQsIHNoaWZ0LCB2YWx1ZTtcbiAgICBwYXJzZUludEF1dG8gPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgIGlmIChzdHJpbmdbMF0gPT09IFwiMFwiICYmIHN0cmluZ1sxXSAhPT0gXCJ4XCIpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHN0cmluZywgOCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQoc3RyaW5nKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChpcHY0UmVnZXhlcy5mb3VyT2N0ZXQpKSB7XG4gICAgICByZXR1cm4gKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaywgbGVuLCByZWYsIHJlc3VsdHM7XG4gICAgICAgIHJlZiA9IG1hdGNoLnNsaWNlKDEsIDYpO1xuICAgICAgICByZXN1bHRzID0gW107XG4gICAgICAgIGZvciAoayA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGsgPCBsZW47IGsrKykge1xuICAgICAgICAgIHBhcnQgPSByZWZba107XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnNlSW50QXV0byhwYXJ0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSgpO1xuICAgIH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goaXB2NFJlZ2V4ZXMubG9uZ1ZhbHVlKSkge1xuICAgICAgdmFsdWUgPSBwYXJzZUludEF1dG8obWF0Y2hbMV0pO1xuICAgICAgaWYgKHZhbHVlID4gMHhmZmZmZmZmZiB8fCB2YWx1ZSA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaXBhZGRyOiBhZGRyZXNzIG91dHNpZGUgZGVmaW5lZCByYW5nZVwiKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaywgcmVzdWx0cztcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKHNoaWZ0ID0gayA9IDA7IGsgPD0gMjQ7IHNoaWZ0ID0gayArPSA4KSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKCh2YWx1ZSA+PiBzaGlmdCkgJiAweGZmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCkpLnJldmVyc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIGlwYWRkci5JUHY2ID0gKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIElQdjYocGFydHMsIHpvbmVJZCkge1xuICAgICAgdmFyIGksIGssIGwsIGxlbiwgcGFydCwgcmVmO1xuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMTYpIHtcbiAgICAgICAgdGhpcy5wYXJ0cyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSBrID0gMDsgayA8PSAxNDsgaSA9IGsgKz0gMikge1xuICAgICAgICAgIHRoaXMucGFydHMucHVzaCgocGFydHNbaV0gPDwgOCkgfCBwYXJ0c1tpICsgMV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnRzLmxlbmd0aCA9PT0gOCkge1xuICAgICAgICB0aGlzLnBhcnRzID0gcGFydHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IGlwdjYgcGFydCBjb3VudCBzaG91bGQgYmUgOCBvciAxNlwiKTtcbiAgICAgIH1cbiAgICAgIHJlZiA9IHRoaXMucGFydHM7XG4gICAgICBmb3IgKGwgPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBsIDwgbGVuOyBsKyspIHtcbiAgICAgICAgcGFydCA9IHJlZltsXTtcbiAgICAgICAgaWYgKCEoKDAgPD0gcGFydCAmJiBwYXJ0IDw9IDB4ZmZmZikpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaXBhZGRyOiBpcHY2IHBhcnQgc2hvdWxkIGZpdCBpbiAxNiBiaXRzXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoem9uZUlkKSB7XG4gICAgICAgIHRoaXMuem9uZUlkID0gem9uZUlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIElQdjYucHJvdG90eXBlLmtpbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAnaXB2Nic7XG4gICAgfTtcblxuICAgIElQdjYucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50b05vcm1hbGl6ZWRTdHJpbmcoKS5yZXBsYWNlKC8oKF58OikoMCg6fCQpKSspLywgJzo6Jyk7XG4gICAgfTtcblxuICAgIElQdjYucHJvdG90eXBlLnRvQnl0ZUFycmF5ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYnl0ZXMsIGssIGxlbiwgcGFydCwgcmVmO1xuICAgICAgYnl0ZXMgPSBbXTtcbiAgICAgIHJlZiA9IHRoaXMucGFydHM7XG4gICAgICBmb3IgKGsgPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgICAgcGFydCA9IHJlZltrXTtcbiAgICAgICAgYnl0ZXMucHVzaChwYXJ0ID4+IDgpO1xuICAgICAgICBieXRlcy5wdXNoKHBhcnQgJiAweGZmKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBieXRlcztcbiAgICB9O1xuXG4gICAgSVB2Ni5wcm90b3R5cGUudG9Ob3JtYWxpemVkU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYWRkciwgcGFydCwgc3VmZml4O1xuICAgICAgYWRkciA9ICgoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBrLCBsZW4sIHJlZiwgcmVzdWx0cztcbiAgICAgICAgcmVmID0gdGhpcy5wYXJ0cztcbiAgICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgICBmb3IgKGsgPSAwLCBsZW4gPSByZWYubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgICAgICBwYXJ0ID0gcmVmW2tdO1xuICAgICAgICAgIHJlc3VsdHMucHVzaChwYXJ0LnRvU3RyaW5nKDE2KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KS5jYWxsKHRoaXMpKS5qb2luKFwiOlwiKTtcbiAgICAgIHN1ZmZpeCA9ICcnO1xuICAgICAgaWYgKHRoaXMuem9uZUlkKSB7XG4gICAgICAgIHN1ZmZpeCA9ICclJyArIHRoaXMuem9uZUlkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFkZHIgKyBzdWZmaXg7XG4gICAgfTtcblxuICAgIElQdjYucHJvdG90eXBlLm1hdGNoID0gZnVuY3Rpb24ob3RoZXIsIGNpZHJSYW5nZSkge1xuICAgICAgdmFyIHJlZjtcbiAgICAgIGlmIChjaWRyUmFuZ2UgPT09IHZvaWQgMCkge1xuICAgICAgICByZWYgPSBvdGhlciwgb3RoZXIgPSByZWZbMF0sIGNpZHJSYW5nZSA9IHJlZlsxXTtcbiAgICAgIH1cbiAgICAgIGlmIChvdGhlci5raW5kKCkgIT09ICdpcHY2Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IGNhbm5vdCBtYXRjaCBpcHY2IGFkZHJlc3Mgd2l0aCBub24taXB2NiBvbmVcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWF0Y2hDSURSKHRoaXMucGFydHMsIG90aGVyLnBhcnRzLCAxNiwgY2lkclJhbmdlKTtcbiAgICB9O1xuXG4gICAgSVB2Ni5wcm90b3R5cGUuU3BlY2lhbFJhbmdlcyA9IHtcbiAgICAgIHVuc3BlY2lmaWVkOiBbbmV3IElQdjYoWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKSwgMTI4XSxcbiAgICAgIGxpbmtMb2NhbDogW25ldyBJUHY2KFsweGZlODAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKSwgMTBdLFxuICAgICAgbXVsdGljYXN0OiBbbmV3IElQdjYoWzB4ZmYwMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pLCA4XSxcbiAgICAgIGxvb3BiYWNrOiBbbmV3IElQdjYoWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDFdKSwgMTI4XSxcbiAgICAgIHVuaXF1ZUxvY2FsOiBbbmV3IElQdjYoWzB4ZmMwMCwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pLCA3XSxcbiAgICAgIGlwdjRNYXBwZWQ6IFtuZXcgSVB2NihbMCwgMCwgMCwgMCwgMCwgMHhmZmZmLCAwLCAwXSksIDk2XSxcbiAgICAgIHJmYzYxNDU6IFtuZXcgSVB2NihbMCwgMCwgMCwgMCwgMHhmZmZmLCAwLCAwLCAwXSksIDk2XSxcbiAgICAgIHJmYzYwNTI6IFtuZXcgSVB2NihbMHg2NCwgMHhmZjliLCAwLCAwLCAwLCAwLCAwLCAwXSksIDk2XSxcbiAgICAgICc2dG80JzogW25ldyBJUHY2KFsweDIwMDIsIDAsIDAsIDAsIDAsIDAsIDAsIDBdKSwgMTZdLFxuICAgICAgdGVyZWRvOiBbbmV3IElQdjYoWzB4MjAwMSwgMCwgMCwgMCwgMCwgMCwgMCwgMF0pLCAzMl0sXG4gICAgICByZXNlcnZlZDogW1tuZXcgSVB2NihbMHgyMDAxLCAweGRiOCwgMCwgMCwgMCwgMCwgMCwgMF0pLCAzMl1dXG4gICAgfTtcblxuICAgIElQdjYucHJvdG90eXBlLnJhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gaXBhZGRyLnN1Ym5ldE1hdGNoKHRoaXMsIHRoaXMuU3BlY2lhbFJhbmdlcyk7XG4gICAgfTtcblxuICAgIElQdjYucHJvdG90eXBlLmlzSVB2NE1hcHBlZEFkZHJlc3MgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnJhbmdlKCkgPT09ICdpcHY0TWFwcGVkJztcbiAgICB9O1xuXG4gICAgSVB2Ni5wcm90b3R5cGUudG9JUHY0QWRkcmVzcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGhpZ2gsIGxvdywgcmVmO1xuICAgICAgaWYgKCF0aGlzLmlzSVB2NE1hcHBlZEFkZHJlc3MoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IHRyeWluZyB0byBjb252ZXJ0IGEgZ2VuZXJpYyBpcHY2IGFkZHJlc3MgdG8gaXB2NFwiKTtcbiAgICAgIH1cbiAgICAgIHJlZiA9IHRoaXMucGFydHMuc2xpY2UoLTIpLCBoaWdoID0gcmVmWzBdLCBsb3cgPSByZWZbMV07XG4gICAgICByZXR1cm4gbmV3IGlwYWRkci5JUHY0KFtoaWdoID4+IDgsIGhpZ2ggJiAweGZmLCBsb3cgPj4gOCwgbG93ICYgMHhmZl0pO1xuICAgIH07XG5cbiAgICBJUHY2LnByb3RvdHlwZS5wcmVmaXhMZW5ndGhGcm9tU3VibmV0TWFzayA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNpZHIsIGksIGssIHBhcnQsIHN0b3AsIHplcm9zLCB6ZXJvdGFibGU7XG4gICAgICB6ZXJvdGFibGUgPSB7XG4gICAgICAgIDA6IDE2LFxuICAgICAgICAzMjc2ODogMTUsXG4gICAgICAgIDQ5MTUyOiAxNCxcbiAgICAgICAgNTczNDQ6IDEzLFxuICAgICAgICA2MTQ0MDogMTIsXG4gICAgICAgIDYzNDg4OiAxMSxcbiAgICAgICAgNjQ1MTI6IDEwLFxuICAgICAgICA2NTAyNDogOSxcbiAgICAgICAgNjUyODA6IDgsXG4gICAgICAgIDY1NDA4OiA3LFxuICAgICAgICA2NTQ3MjogNixcbiAgICAgICAgNjU1MDQ6IDUsXG4gICAgICAgIDY1NTIwOiA0LFxuICAgICAgICA2NTUyODogMyxcbiAgICAgICAgNjU1MzI6IDIsXG4gICAgICAgIDY1NTM0OiAxLFxuICAgICAgICA2NTUzNTogMFxuICAgICAgfTtcbiAgICAgIGNpZHIgPSAwO1xuICAgICAgc3RvcCA9IGZhbHNlO1xuICAgICAgZm9yIChpID0gayA9IDc7IGsgPj0gMDsgaSA9IGsgKz0gLTEpIHtcbiAgICAgICAgcGFydCA9IHRoaXMucGFydHNbaV07XG4gICAgICAgIGlmIChwYXJ0IGluIHplcm90YWJsZSkge1xuICAgICAgICAgIHplcm9zID0gemVyb3RhYmxlW3BhcnRdO1xuICAgICAgICAgIGlmIChzdG9wICYmIHplcm9zICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHplcm9zICE9PSAxNikge1xuICAgICAgICAgICAgc3RvcCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNpZHIgKz0gemVyb3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAxMjggLSBjaWRyO1xuICAgIH07XG5cbiAgICByZXR1cm4gSVB2NjtcblxuICB9KSgpO1xuXG4gIGlwdjZQYXJ0ID0gXCIoPzpbMC05YS1mXSs6Oj8pK1wiO1xuXG4gIHpvbmVJbmRleCA9IFwiJVswLTlhLXpdezEsfVwiO1xuXG4gIGlwdjZSZWdleGVzID0ge1xuICAgIHpvbmVJbmRleDogbmV3IFJlZ0V4cCh6b25lSW5kZXgsICdpJyksXG4gICAgXCJuYXRpdmVcIjogbmV3IFJlZ0V4cChcIl4oOjopPyhcIiArIGlwdjZQYXJ0ICsgXCIpPyhbMC05YS1mXSspPyg6Oik/KFwiICsgem9uZUluZGV4ICsgXCIpPyRcIiwgJ2knKSxcbiAgICB0cmFuc2l0aW9uYWw6IG5ldyBSZWdFeHAoKFwiXigoPzpcIiArIGlwdjZQYXJ0ICsgXCIpfCg/Ojo6KSg/OlwiICsgaXB2NlBhcnQgKyBcIik/KVwiKSArIChpcHY0UGFydCArIFwiXFxcXC5cIiArIGlwdjRQYXJ0ICsgXCJcXFxcLlwiICsgaXB2NFBhcnQgKyBcIlxcXFwuXCIgKyBpcHY0UGFydCkgKyAoXCIoXCIgKyB6b25lSW5kZXggKyBcIik/JFwiKSwgJ2knKVxuICB9O1xuXG4gIGV4cGFuZElQdjYgPSBmdW5jdGlvbihzdHJpbmcsIHBhcnRzKSB7XG4gICAgdmFyIGNvbG9uQ291bnQsIGxhc3RDb2xvbiwgcGFydCwgcmVwbGFjZW1lbnQsIHJlcGxhY2VtZW50Q291bnQsIHpvbmVJZDtcbiAgICBpZiAoc3RyaW5nLmluZGV4T2YoJzo6JykgIT09IHN0cmluZy5sYXN0SW5kZXhPZignOjonKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHpvbmVJZCA9IChzdHJpbmcubWF0Y2goaXB2NlJlZ2V4ZXNbJ3pvbmVJbmRleCddKSB8fCBbXSlbMF07XG4gICAgaWYgKHpvbmVJZCkge1xuICAgICAgem9uZUlkID0gem9uZUlkLnN1YnN0cmluZygxKTtcbiAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKC8lLiskLywgJycpO1xuICAgIH1cbiAgICBjb2xvbkNvdW50ID0gMDtcbiAgICBsYXN0Q29sb24gPSAtMTtcbiAgICB3aGlsZSAoKGxhc3RDb2xvbiA9IHN0cmluZy5pbmRleE9mKCc6JywgbGFzdENvbG9uICsgMSkpID49IDApIHtcbiAgICAgIGNvbG9uQ291bnQrKztcbiAgICB9XG4gICAgaWYgKHN0cmluZy5zdWJzdHIoMCwgMikgPT09ICc6OicpIHtcbiAgICAgIGNvbG9uQ291bnQtLTtcbiAgICB9XG4gICAgaWYgKHN0cmluZy5zdWJzdHIoLTIsIDIpID09PSAnOjonKSB7XG4gICAgICBjb2xvbkNvdW50LS07XG4gICAgfVxuICAgIGlmIChjb2xvbkNvdW50ID4gcGFydHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXBsYWNlbWVudENvdW50ID0gcGFydHMgLSBjb2xvbkNvdW50O1xuICAgIHJlcGxhY2VtZW50ID0gJzonO1xuICAgIHdoaWxlIChyZXBsYWNlbWVudENvdW50LS0pIHtcbiAgICAgIHJlcGxhY2VtZW50ICs9ICcwOic7XG4gICAgfVxuICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKCc6OicsIHJlcGxhY2VtZW50KTtcbiAgICBpZiAoc3RyaW5nWzBdID09PSAnOicpIHtcbiAgICAgIHN0cmluZyA9IHN0cmluZy5zbGljZSgxKTtcbiAgICB9XG4gICAgaWYgKHN0cmluZ1tzdHJpbmcubGVuZ3RoIC0gMV0gPT09ICc6Jykge1xuICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKDAsIC0xKTtcbiAgICB9XG4gICAgcGFydHMgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaywgbGVuLCByZWYsIHJlc3VsdHM7XG4gICAgICByZWYgPSBzdHJpbmcuc3BsaXQoXCI6XCIpO1xuICAgICAgcmVzdWx0cyA9IFtdO1xuICAgICAgZm9yIChrID0gMCwgbGVuID0gcmVmLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7XG4gICAgICAgIHBhcnQgPSByZWZba107XG4gICAgICAgIHJlc3VsdHMucHVzaChwYXJzZUludChwYXJ0LCAxNikpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfSkoKTtcbiAgICByZXR1cm4ge1xuICAgICAgcGFydHM6IHBhcnRzLFxuICAgICAgem9uZUlkOiB6b25lSWRcbiAgICB9O1xuICB9O1xuXG4gIGlwYWRkci5JUHY2LnBhcnNlciA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHZhciBhZGRyLCBrLCBsZW4sIG1hdGNoLCBvY3RldCwgb2N0ZXRzLCB6b25lSWQ7XG4gICAgaWYgKGlwdjZSZWdleGVzWyduYXRpdmUnXS50ZXN0KHN0cmluZykpIHtcbiAgICAgIHJldHVybiBleHBhbmRJUHY2KHN0cmluZywgOCk7XG4gICAgfSBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChpcHY2UmVnZXhlc1sndHJhbnNpdGlvbmFsJ10pKSB7XG4gICAgICB6b25lSWQgPSBtYXRjaFs2XSB8fCAnJztcbiAgICAgIGFkZHIgPSBleHBhbmRJUHY2KG1hdGNoWzFdLnNsaWNlKDAsIC0xKSArIHpvbmVJZCwgNik7XG4gICAgICBpZiAoYWRkci5wYXJ0cykge1xuICAgICAgICBvY3RldHMgPSBbcGFyc2VJbnQobWF0Y2hbMl0pLCBwYXJzZUludChtYXRjaFszXSksIHBhcnNlSW50KG1hdGNoWzRdKSwgcGFyc2VJbnQobWF0Y2hbNV0pXTtcbiAgICAgICAgZm9yIChrID0gMCwgbGVuID0gb2N0ZXRzLmxlbmd0aDsgayA8IGxlbjsgaysrKSB7XG4gICAgICAgICAgb2N0ZXQgPSBvY3RldHNba107XG4gICAgICAgICAgaWYgKCEoKDAgPD0gb2N0ZXQgJiYgb2N0ZXQgPD0gMjU1KSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhZGRyLnBhcnRzLnB1c2gob2N0ZXRzWzBdIDw8IDggfCBvY3RldHNbMV0pO1xuICAgICAgICBhZGRyLnBhcnRzLnB1c2gob2N0ZXRzWzJdIDw8IDggfCBvY3RldHNbM10pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBhcnRzOiBhZGRyLnBhcnRzLFxuICAgICAgICAgIHpvbmVJZDogYWRkci56b25lSWRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgaXBhZGRyLklQdjQuaXNJUHY0ID0gaXBhZGRyLklQdjYuaXNJUHY2ID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyKHN0cmluZykgIT09IG51bGw7XG4gIH07XG5cbiAgaXBhZGRyLklQdjQuaXNWYWxpZCA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHZhciBlO1xuICAgIHRyeSB7XG4gICAgICBuZXcgdGhpcyh0aGlzLnBhcnNlcihzdHJpbmcpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgZSA9IGVycm9yMTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgaXBhZGRyLklQdjQuaXNWYWxpZEZvdXJQYXJ0RGVjaW1hbCA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIGlmIChpcGFkZHIuSVB2NC5pc1ZhbGlkKHN0cmluZykgJiYgc3RyaW5nLm1hdGNoKC9eXFxkKyhcXC5cXGQrKXszfSQvKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgaXBhZGRyLklQdjYuaXNWYWxpZCA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHZhciBhZGRyLCBlO1xuICAgIGlmICh0eXBlb2Ygc3RyaW5nID09PSBcInN0cmluZ1wiICYmIHN0cmluZy5pbmRleE9mKFwiOlwiKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGFkZHIgPSB0aGlzLnBhcnNlcihzdHJpbmcpO1xuICAgICAgbmV3IHRoaXMoYWRkci5wYXJ0cywgYWRkci56b25lSWQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICBlID0gZXJyb3IxO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcblxuICBpcGFkZHIuSVB2NC5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHZhciBwYXJ0cztcbiAgICBwYXJ0cyA9IHRoaXMucGFyc2VyKHN0cmluZyk7XG4gICAgaWYgKHBhcnRzID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IHN0cmluZyBpcyBub3QgZm9ybWF0dGVkIGxpa2UgaXAgYWRkcmVzc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyB0aGlzKHBhcnRzKTtcbiAgfTtcblxuICBpcGFkZHIuSVB2Ni5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHZhciBhZGRyO1xuICAgIGFkZHIgPSB0aGlzLnBhcnNlcihzdHJpbmcpO1xuICAgIGlmIChhZGRyLnBhcnRzID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IHN0cmluZyBpcyBub3QgZm9ybWF0dGVkIGxpa2UgaXAgYWRkcmVzc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyB0aGlzKGFkZHIucGFydHMsIGFkZHIuem9uZUlkKTtcbiAgfTtcblxuICBpcGFkZHIuSVB2NC5wYXJzZUNJRFIgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICB2YXIgbWFza0xlbmd0aCwgbWF0Y2g7XG4gICAgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKC9eKC4rKVxcLyhcXGQrKSQvKSkge1xuICAgICAgbWFza0xlbmd0aCA9IHBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgIGlmIChtYXNrTGVuZ3RoID49IDAgJiYgbWFza0xlbmd0aCA8PSAzMikge1xuICAgICAgICByZXR1cm4gW3RoaXMucGFyc2UobWF0Y2hbMV0pLCBtYXNrTGVuZ3RoXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaXBhZGRyOiBzdHJpbmcgaXMgbm90IGZvcm1hdHRlZCBsaWtlIGFuIElQdjQgQ0lEUiByYW5nZVwiKTtcbiAgfTtcblxuICBpcGFkZHIuSVB2NC5zdWJuZXRNYXNrRnJvbVByZWZpeExlbmd0aCA9IGZ1bmN0aW9uKHByZWZpeCkge1xuICAgIHZhciBmaWxsZWRPY3RldENvdW50LCBqLCBvY3RldHM7XG4gICAgcHJlZml4ID0gcGFyc2VJbnQocHJlZml4KTtcbiAgICBpZiAocHJlZml4IDwgMCB8fCBwcmVmaXggPiAzMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpcGFkZHI6IGludmFsaWQgSVB2NCBwcmVmaXggbGVuZ3RoJyk7XG4gICAgfVxuICAgIG9jdGV0cyA9IFswLCAwLCAwLCAwXTtcbiAgICBqID0gMDtcbiAgICBmaWxsZWRPY3RldENvdW50ID0gTWF0aC5mbG9vcihwcmVmaXggLyA4KTtcbiAgICB3aGlsZSAoaiA8IGZpbGxlZE9jdGV0Q291bnQpIHtcbiAgICAgIG9jdGV0c1tqXSA9IDI1NTtcbiAgICAgIGorKztcbiAgICB9XG4gICAgaWYgKGZpbGxlZE9jdGV0Q291bnQgPCA0KSB7XG4gICAgICBvY3RldHNbZmlsbGVkT2N0ZXRDb3VudF0gPSBNYXRoLnBvdygyLCBwcmVmaXggJSA4KSAtIDEgPDwgOCAtIChwcmVmaXggJSA4KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyB0aGlzKG9jdGV0cyk7XG4gIH07XG5cbiAgaXBhZGRyLklQdjQuYnJvYWRjYXN0QWRkcmVzc0Zyb21DSURSID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGNpZHIsIGVycm9yLCBpLCBpcEludGVyZmFjZU9jdGV0cywgb2N0ZXRzLCBzdWJuZXRNYXNrT2N0ZXRzO1xuICAgIHRyeSB7XG4gICAgICBjaWRyID0gdGhpcy5wYXJzZUNJRFIoc3RyaW5nKTtcbiAgICAgIGlwSW50ZXJmYWNlT2N0ZXRzID0gY2lkclswXS50b0J5dGVBcnJheSgpO1xuICAgICAgc3VibmV0TWFza09jdGV0cyA9IHRoaXMuc3VibmV0TWFza0Zyb21QcmVmaXhMZW5ndGgoY2lkclsxXSkudG9CeXRlQXJyYXkoKTtcbiAgICAgIG9jdGV0cyA9IFtdO1xuICAgICAgaSA9IDA7XG4gICAgICB3aGlsZSAoaSA8IDQpIHtcbiAgICAgICAgb2N0ZXRzLnB1c2gocGFyc2VJbnQoaXBJbnRlcmZhY2VPY3RldHNbaV0sIDEwKSB8IHBhcnNlSW50KHN1Ym5ldE1hc2tPY3RldHNbaV0sIDEwKSBeIDI1NSk7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgdGhpcyhvY3RldHMpO1xuICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lwYWRkcjogdGhlIGFkZHJlc3MgZG9lcyBub3QgaGF2ZSBJUHY0IENJRFIgZm9ybWF0Jyk7XG4gICAgfVxuICB9O1xuXG4gIGlwYWRkci5JUHY0Lm5ldHdvcmtBZGRyZXNzRnJvbUNJRFIgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICB2YXIgY2lkciwgZXJyb3IsIGksIGlwSW50ZXJmYWNlT2N0ZXRzLCBvY3RldHMsIHN1Ym5ldE1hc2tPY3RldHM7XG4gICAgdHJ5IHtcbiAgICAgIGNpZHIgPSB0aGlzLnBhcnNlQ0lEUihzdHJpbmcpO1xuICAgICAgaXBJbnRlcmZhY2VPY3RldHMgPSBjaWRyWzBdLnRvQnl0ZUFycmF5KCk7XG4gICAgICBzdWJuZXRNYXNrT2N0ZXRzID0gdGhpcy5zdWJuZXRNYXNrRnJvbVByZWZpeExlbmd0aChjaWRyWzFdKS50b0J5dGVBcnJheSgpO1xuICAgICAgb2N0ZXRzID0gW107XG4gICAgICBpID0gMDtcbiAgICAgIHdoaWxlIChpIDwgNCkge1xuICAgICAgICBvY3RldHMucHVzaChwYXJzZUludChpcEludGVyZmFjZU9jdGV0c1tpXSwgMTApICYgcGFyc2VJbnQoc3VibmV0TWFza09jdGV0c1tpXSwgMTApKTtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyB0aGlzKG9jdGV0cyk7XG4gICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICBlcnJvciA9IGVycm9yMTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaXBhZGRyOiB0aGUgYWRkcmVzcyBkb2VzIG5vdCBoYXZlIElQdjQgQ0lEUiBmb3JtYXQnKTtcbiAgICB9XG4gIH07XG5cbiAgaXBhZGRyLklQdjYucGFyc2VDSURSID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIG1hc2tMZW5ndGgsIG1hdGNoO1xuICAgIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaCgvXiguKylcXC8oXFxkKykkLykpIHtcbiAgICAgIG1hc2tMZW5ndGggPSBwYXJzZUludChtYXRjaFsyXSk7XG4gICAgICBpZiAobWFza0xlbmd0aCA+PSAwICYmIG1hc2tMZW5ndGggPD0gMTI4KSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5wYXJzZShtYXRjaFsxXSksIG1hc2tMZW5ndGhdO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IHN0cmluZyBpcyBub3QgZm9ybWF0dGVkIGxpa2UgYW4gSVB2NiBDSURSIHJhbmdlXCIpO1xuICB9O1xuXG4gIGlwYWRkci5pc1ZhbGlkID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgcmV0dXJuIGlwYWRkci5JUHY2LmlzVmFsaWQoc3RyaW5nKSB8fCBpcGFkZHIuSVB2NC5pc1ZhbGlkKHN0cmluZyk7XG4gIH07XG5cbiAgaXBhZGRyLnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgaWYgKGlwYWRkci5JUHY2LmlzVmFsaWQoc3RyaW5nKSkge1xuICAgICAgcmV0dXJuIGlwYWRkci5JUHY2LnBhcnNlKHN0cmluZyk7XG4gICAgfSBlbHNlIGlmIChpcGFkZHIuSVB2NC5pc1ZhbGlkKHN0cmluZykpIHtcbiAgICAgIHJldHVybiBpcGFkZHIuSVB2NC5wYXJzZShzdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpcGFkZHI6IHRoZSBhZGRyZXNzIGhhcyBuZWl0aGVyIElQdjYgbm9yIElQdjQgZm9ybWF0XCIpO1xuICAgIH1cbiAgfTtcblxuICBpcGFkZHIucGFyc2VDSURSID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBpcGFkZHIuSVB2Ni5wYXJzZUNJRFIoc3RyaW5nKTtcbiAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgIGUgPSBlcnJvcjE7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gaXBhZGRyLklQdjQucGFyc2VDSURSKHN0cmluZyk7XG4gICAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgICAgZSA9IGVycm9yMTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaXBhZGRyOiB0aGUgYWRkcmVzcyBoYXMgbmVpdGhlciBJUHY2IG5vciBJUHY0IENJRFIgZm9ybWF0XCIpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBpcGFkZHIuZnJvbUJ5dGVBcnJheSA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gICAgdmFyIGxlbmd0aDtcbiAgICBsZW5ndGggPSBieXRlcy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCA9PT0gNCkge1xuICAgICAgcmV0dXJuIG5ldyBpcGFkZHIuSVB2NChieXRlcyk7XG4gICAgfSBlbHNlIGlmIChsZW5ndGggPT09IDE2KSB7XG4gICAgICByZXR1cm4gbmV3IGlwYWRkci5JUHY2KGJ5dGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaXBhZGRyOiB0aGUgYmluYXJ5IGlucHV0IGlzIG5laXRoZXIgYW4gSVB2NiBub3IgSVB2NCBhZGRyZXNzXCIpO1xuICAgIH1cbiAgfTtcblxuICBpcGFkZHIucHJvY2VzcyA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHZhciBhZGRyO1xuICAgIGFkZHIgPSB0aGlzLnBhcnNlKHN0cmluZyk7XG4gICAgaWYgKGFkZHIua2luZCgpID09PSAnaXB2NicgJiYgYWRkci5pc0lQdjRNYXBwZWRBZGRyZXNzKCkpIHtcbiAgICAgIHJldHVybiBhZGRyLnRvSVB2NEFkZHJlc3MoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFkZHI7XG4gICAgfVxuICB9O1xuXG59KS5jYWxsKHRoaXMpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2lwYWRkci5qcy9saWIvaXBhZGRyLmpzXG4vLyBtb2R1bGUgaWQgPSAxNzFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcclxuXHRpZighbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xyXG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XHJcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcclxuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxyXG5cdFx0aWYoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XHJcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XHJcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXHJcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xyXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcclxuXHR9XHJcblx0cmV0dXJuIG1vZHVsZTtcclxufTtcclxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9tb2R1bGUuanNcbi8vIG1vZHVsZSBpZCA9IDE3MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKiFcbiAqIGV4cHJlc3NcbiAqIENvcHlyaWdodChjKSAyMDA5LTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDEzIFJvbWFuIFNodHlsbWFuXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGFjY2VwdHMgPSByZXF1aXJlKCdhY2NlcHRzJyk7XG52YXIgZGVwcmVjYXRlID0gcmVxdWlyZSgnZGVwZCcpKCdleHByZXNzJyk7XG52YXIgaXNJUCA9IHJlcXVpcmUoJ25ldCcpLmlzSVA7XG52YXIgdHlwZWlzID0gcmVxdWlyZSgndHlwZS1pcycpO1xudmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG52YXIgZnJlc2ggPSByZXF1aXJlKCdmcmVzaCcpO1xudmFyIHBhcnNlUmFuZ2UgPSByZXF1aXJlKCdyYW5nZS1wYXJzZXInKTtcbnZhciBwYXJzZSA9IHJlcXVpcmUoJ3BhcnNldXJsJyk7XG52YXIgcHJveHlhZGRyID0gcmVxdWlyZSgncHJveHktYWRkcicpO1xuXG4vKipcbiAqIFJlcXVlc3QgcHJvdG90eXBlLlxuICogQHB1YmxpY1xuICovXG5cbnZhciByZXEgPSBPYmplY3QuY3JlYXRlKGh0dHAuSW5jb21pbmdNZXNzYWdlLnByb3RvdHlwZSlcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcVxuXG4vKipcbiAqIFJldHVybiByZXF1ZXN0IGhlYWRlci5cbiAqXG4gKiBUaGUgYFJlZmVycmVyYCBoZWFkZXIgZmllbGQgaXMgc3BlY2lhbC1jYXNlZCxcbiAqIGJvdGggYFJlZmVycmVyYCBhbmQgYFJlZmVyZXJgIGFyZSBpbnRlcmNoYW5nZWFibGUuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgIHJlcS5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICogICAgIC8vID0+IFwidGV4dC9wbGFpblwiXG4gKlxuICogICAgIHJlcS5nZXQoJ2NvbnRlbnQtdHlwZScpO1xuICogICAgIC8vID0+IFwidGV4dC9wbGFpblwiXG4gKlxuICogICAgIHJlcS5nZXQoJ1NvbWV0aGluZycpO1xuICogICAgIC8vID0+IHVuZGVmaW5lZFxuICpcbiAqIEFsaWFzZWQgYXMgYHJlcS5oZWFkZXIoKWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXEuZ2V0ID1cbnJlcS5oZWFkZXIgPSBmdW5jdGlvbiBoZWFkZXIobmFtZSkge1xuICBpZiAoIW5hbWUpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCduYW1lIGFyZ3VtZW50IGlzIHJlcXVpcmVkIHRvIHJlcS5nZXQnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCduYW1lIG11c3QgYmUgYSBzdHJpbmcgdG8gcmVxLmdldCcpO1xuICB9XG5cbiAgdmFyIGxjID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIHN3aXRjaCAobGMpIHtcbiAgICBjYXNlICdyZWZlcmVyJzpcbiAgICBjYXNlICdyZWZlcnJlcic6XG4gICAgICByZXR1cm4gdGhpcy5oZWFkZXJzLnJlZmVycmVyXG4gICAgICAgIHx8IHRoaXMuaGVhZGVycy5yZWZlcmVyO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdGhpcy5oZWFkZXJzW2xjXTtcbiAgfVxufTtcblxuLyoqXG4gKiBUbyBkbzogdXBkYXRlIGRvY3MuXG4gKlxuICogQ2hlY2sgaWYgdGhlIGdpdmVuIGB0eXBlKHMpYCBpcyBhY2NlcHRhYmxlLCByZXR1cm5pbmdcbiAqIHRoZSBiZXN0IG1hdGNoIHdoZW4gdHJ1ZSwgb3RoZXJ3aXNlIGB1bmRlZmluZWRgLCBpbiB3aGljaFxuICogY2FzZSB5b3Ugc2hvdWxkIHJlc3BvbmQgd2l0aCA0MDYgXCJOb3QgQWNjZXB0YWJsZVwiLlxuICpcbiAqIFRoZSBgdHlwZWAgdmFsdWUgbWF5IGJlIGEgc2luZ2xlIE1JTUUgdHlwZSBzdHJpbmdcbiAqIHN1Y2ggYXMgXCJhcHBsaWNhdGlvbi9qc29uXCIsIGFuIGV4dGVuc2lvbiBuYW1lXG4gKiBzdWNoIGFzIFwianNvblwiLCBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IHN1Y2ggYXMgXCJqc29uLCBodG1sLCB0ZXh0L3BsYWluXCIsXG4gKiBhbiBhcmd1bWVudCBsaXN0IHN1Y2ggYXMgYFwianNvblwiLCBcImh0bWxcIiwgXCJ0ZXh0L3BsYWluXCJgLFxuICogb3IgYW4gYXJyYXkgYFtcImpzb25cIiwgXCJodG1sXCIsIFwidGV4dC9wbGFpblwiXWAuIFdoZW4gYSBsaXN0XG4gKiBvciBhcnJheSBpcyBnaXZlbiwgdGhlIF9iZXN0XyBtYXRjaCwgaWYgYW55IGlzIHJldHVybmVkLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAvLyBBY2NlcHQ6IHRleHQvaHRtbFxuICogICAgIHJlcS5hY2NlcHRzKCdodG1sJyk7XG4gKiAgICAgLy8gPT4gXCJodG1sXCJcbiAqXG4gKiAgICAgLy8gQWNjZXB0OiB0ZXh0LyosIGFwcGxpY2F0aW9uL2pzb25cbiAqICAgICByZXEuYWNjZXB0cygnaHRtbCcpO1xuICogICAgIC8vID0+IFwiaHRtbFwiXG4gKiAgICAgcmVxLmFjY2VwdHMoJ3RleHQvaHRtbCcpO1xuICogICAgIC8vID0+IFwidGV4dC9odG1sXCJcbiAqICAgICByZXEuYWNjZXB0cygnanNvbiwgdGV4dCcpO1xuICogICAgIC8vID0+IFwianNvblwiXG4gKiAgICAgcmVxLmFjY2VwdHMoJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAqICAgICAvLyA9PiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICpcbiAqICAgICAvLyBBY2NlcHQ6IHRleHQvKiwgYXBwbGljYXRpb24vanNvblxuICogICAgIHJlcS5hY2NlcHRzKCdpbWFnZS9wbmcnKTtcbiAqICAgICByZXEuYWNjZXB0cygncG5nJyk7XG4gKiAgICAgLy8gPT4gdW5kZWZpbmVkXG4gKlxuICogICAgIC8vIEFjY2VwdDogdGV4dC8qO3E9LjUsIGFwcGxpY2F0aW9uL2pzb25cbiAqICAgICByZXEuYWNjZXB0cyhbJ2h0bWwnLCAnanNvbiddKTtcbiAqICAgICByZXEuYWNjZXB0cygnaHRtbCcsICdqc29uJyk7XG4gKiAgICAgcmVxLmFjY2VwdHMoJ2h0bWwsIGpzb24nKTtcbiAqICAgICAvLyA9PiBcImpzb25cIlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSB0eXBlKHMpXG4gKiBAcmV0dXJuIHtTdHJpbmd8QXJyYXl8Qm9vbGVhbn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXEuYWNjZXB0cyA9IGZ1bmN0aW9uKCl7XG4gIHZhciBhY2NlcHQgPSBhY2NlcHRzKHRoaXMpO1xuICByZXR1cm4gYWNjZXB0LnR5cGVzLmFwcGx5KGFjY2VwdCwgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGdpdmVuIGBlbmNvZGluZ2BzIGFyZSBhY2NlcHRlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gLi4uZW5jb2RpbmdcbiAqIEByZXR1cm4ge1N0cmluZ3xBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXEuYWNjZXB0c0VuY29kaW5ncyA9IGZ1bmN0aW9uKCl7XG4gIHZhciBhY2NlcHQgPSBhY2NlcHRzKHRoaXMpO1xuICByZXR1cm4gYWNjZXB0LmVuY29kaW5ncy5hcHBseShhY2NlcHQsIGFyZ3VtZW50cyk7XG59O1xuXG5yZXEuYWNjZXB0c0VuY29kaW5nID0gZGVwcmVjYXRlLmZ1bmN0aW9uKHJlcS5hY2NlcHRzRW5jb2RpbmdzLFxuICAncmVxLmFjY2VwdHNFbmNvZGluZzogVXNlIGFjY2VwdHNFbmNvZGluZ3MgaW5zdGVhZCcpO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBgY2hhcnNldGBzIGFyZSBhY2NlcHRhYmxlLFxuICogb3RoZXJ3aXNlIHlvdSBzaG91bGQgcmVzcG9uZCB3aXRoIDQwNiBcIk5vdCBBY2NlcHRhYmxlXCIuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IC4uLmNoYXJzZXRcbiAqIEByZXR1cm4ge1N0cmluZ3xBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXEuYWNjZXB0c0NoYXJzZXRzID0gZnVuY3Rpb24oKXtcbiAgdmFyIGFjY2VwdCA9IGFjY2VwdHModGhpcyk7XG4gIHJldHVybiBhY2NlcHQuY2hhcnNldHMuYXBwbHkoYWNjZXB0LCBhcmd1bWVudHMpO1xufTtcblxucmVxLmFjY2VwdHNDaGFyc2V0ID0gZGVwcmVjYXRlLmZ1bmN0aW9uKHJlcS5hY2NlcHRzQ2hhcnNldHMsXG4gICdyZXEuYWNjZXB0c0NoYXJzZXQ6IFVzZSBhY2NlcHRzQ2hhcnNldHMgaW5zdGVhZCcpO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBgbGFuZ2BzIGFyZSBhY2NlcHRhYmxlLFxuICogb3RoZXJ3aXNlIHlvdSBzaG91bGQgcmVzcG9uZCB3aXRoIDQwNiBcIk5vdCBBY2NlcHRhYmxlXCIuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IC4uLmxhbmdcbiAqIEByZXR1cm4ge1N0cmluZ3xBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXEuYWNjZXB0c0xhbmd1YWdlcyA9IGZ1bmN0aW9uKCl7XG4gIHZhciBhY2NlcHQgPSBhY2NlcHRzKHRoaXMpO1xuICByZXR1cm4gYWNjZXB0Lmxhbmd1YWdlcy5hcHBseShhY2NlcHQsIGFyZ3VtZW50cyk7XG59O1xuXG5yZXEuYWNjZXB0c0xhbmd1YWdlID0gZGVwcmVjYXRlLmZ1bmN0aW9uKHJlcS5hY2NlcHRzTGFuZ3VhZ2VzLFxuICAncmVxLmFjY2VwdHNMYW5ndWFnZTogVXNlIGFjY2VwdHNMYW5ndWFnZXMgaW5zdGVhZCcpO1xuXG4vKipcbiAqIFBhcnNlIFJhbmdlIGhlYWRlciBmaWVsZCwgY2FwcGluZyB0byB0aGUgZ2l2ZW4gYHNpemVgLlxuICpcbiAqIFVuc3BlY2lmaWVkIHJhbmdlcyBzdWNoIGFzIFwiMC1cIiByZXF1aXJlIGtub3dsZWRnZSBvZiB5b3VyIHJlc291cmNlIGxlbmd0aC4gSW5cbiAqIHRoZSBjYXNlIG9mIGEgYnl0ZSByYW5nZSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzLiBJZiB0aGVcbiAqIFJhbmdlIGhlYWRlciBmaWVsZCBpcyBub3QgZ2l2ZW4gYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQsIGAtMWAgd2hlbiB1bnNhdGlzZmlhYmxlLFxuICogYW5kIGAtMmAgd2hlbiBzeW50YWN0aWNhbGx5IGludmFsaWQuXG4gKlxuICogV2hlbiByYW5nZXMgYXJlIHJldHVybmVkLCB0aGUgYXJyYXkgaGFzIGEgXCJ0eXBlXCIgcHJvcGVydHkgd2hpY2ggaXMgdGhlIHR5cGUgb2ZcbiAqIHJhbmdlIHRoYXQgaXMgcmVxdWlyZWQgKG1vc3QgY29tbW9ubHksIFwiYnl0ZXNcIikuIEVhY2ggYXJyYXkgZWxlbWVudCBpcyBhbiBvYmplY3RcbiAqIHdpdGggYSBcInN0YXJ0XCIgYW5kIFwiZW5kXCIgcHJvcGVydHkgZm9yIHRoZSBwb3J0aW9uIG9mIHRoZSByYW5nZS5cbiAqXG4gKiBUaGUgXCJjb21iaW5lXCIgb3B0aW9uIGNhbiBiZSBzZXQgdG8gYHRydWVgIGFuZCBvdmVybGFwcGluZyAmIGFkamFjZW50IHJhbmdlc1xuICogd2lsbCBiZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIHJhbmdlLlxuICpcbiAqIE5PVEU6IHJlbWVtYmVyIHRoYXQgcmFuZ2VzIGFyZSBpbmNsdXNpdmUsIHNvIGZvciBleGFtcGxlIFwiUmFuZ2U6IHVzZXJzPTAtM1wiXG4gKiBzaG91bGQgcmVzcG9uZCB3aXRoIDQgdXNlcnMgd2hlbiBhdmFpbGFibGUsIG5vdCAzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmNvbWJpbmU9ZmFsc2VdXG4gKiBAcmV0dXJuIHtudW1iZXJ8YXJyYXl9XG4gKiBAcHVibGljXG4gKi9cblxucmVxLnJhbmdlID0gZnVuY3Rpb24gcmFuZ2Uoc2l6ZSwgb3B0aW9ucykge1xuICB2YXIgcmFuZ2UgPSB0aGlzLmdldCgnUmFuZ2UnKTtcbiAgaWYgKCFyYW5nZSkgcmV0dXJuO1xuICByZXR1cm4gcGFyc2VSYW5nZShzaXplLCByYW5nZSwgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgdmFsdWUgb2YgcGFyYW0gYG5hbWVgIHdoZW4gcHJlc2VudCBvciBgZGVmYXVsdFZhbHVlYC5cbiAqXG4gKiAgLSBDaGVja3Mgcm91dGUgcGxhY2Vob2xkZXJzLCBleDogXy91c2VyLzppZF9cbiAqICAtIENoZWNrcyBib2R5IHBhcmFtcywgZXg6IGlkPTEyLCB7XCJpZFwiOjEyfVxuICogIC0gQ2hlY2tzIHF1ZXJ5IHN0cmluZyBwYXJhbXMsIGV4OiA/aWQ9MTJcbiAqXG4gKiBUbyB1dGlsaXplIHJlcXVlc3QgYm9kaWVzLCBgcmVxLmJvZHlgXG4gKiBzaG91bGQgYmUgYW4gb2JqZWN0LiBUaGlzIGNhbiBiZSBkb25lIGJ5IHVzaW5nXG4gKiB0aGUgYGJvZHlQYXJzZXIoKWAgbWlkZGxld2FyZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtNaXhlZH0gW2RlZmF1bHRWYWx1ZV1cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXEucGFyYW0gPSBmdW5jdGlvbiBwYXJhbShuYW1lLCBkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIHBhcmFtcyA9IHRoaXMucGFyYW1zIHx8IHt9O1xuICB2YXIgYm9keSA9IHRoaXMuYm9keSB8fCB7fTtcbiAgdmFyIHF1ZXJ5ID0gdGhpcy5xdWVyeSB8fCB7fTtcblxuICB2YXIgYXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDFcbiAgICA/ICduYW1lJ1xuICAgIDogJ25hbWUsIGRlZmF1bHQnO1xuICBkZXByZWNhdGUoJ3JlcS5wYXJhbSgnICsgYXJncyArICcpOiBVc2UgcmVxLnBhcmFtcywgcmVxLmJvZHksIG9yIHJlcS5xdWVyeSBpbnN0ZWFkJyk7XG5cbiAgaWYgKG51bGwgIT0gcGFyYW1zW25hbWVdICYmIHBhcmFtcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgcmV0dXJuIHBhcmFtc1tuYW1lXTtcbiAgaWYgKG51bGwgIT0gYm9keVtuYW1lXSkgcmV0dXJuIGJvZHlbbmFtZV07XG4gIGlmIChudWxsICE9IHF1ZXJ5W25hbWVdKSByZXR1cm4gcXVlcnlbbmFtZV07XG5cbiAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIGluY29taW5nIHJlcXVlc3QgY29udGFpbnMgdGhlIFwiQ29udGVudC1UeXBlXCJcbiAqIGhlYWRlciBmaWVsZCwgYW5kIGl0IGNvbnRhaW5zIHRoZSBnaXZlIG1pbWUgYHR5cGVgLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgLy8gV2l0aCBDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOFxuICogICAgICByZXEuaXMoJ2h0bWwnKTtcbiAqICAgICAgcmVxLmlzKCd0ZXh0L2h0bWwnKTtcbiAqICAgICAgcmVxLmlzKCd0ZXh0LyonKTtcbiAqICAgICAgLy8gPT4gdHJ1ZVxuICpcbiAqICAgICAgLy8gV2hlbiBDb250ZW50LVR5cGUgaXMgYXBwbGljYXRpb24vanNvblxuICogICAgICByZXEuaXMoJ2pzb24nKTtcbiAqICAgICAgcmVxLmlzKCdhcHBsaWNhdGlvbi9qc29uJyk7XG4gKiAgICAgIHJlcS5pcygnYXBwbGljYXRpb24vKicpO1xuICogICAgICAvLyA9PiB0cnVlXG4gKlxuICogICAgICByZXEuaXMoJ2h0bWwnKTtcbiAqICAgICAgLy8gPT4gZmFsc2VcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gdHlwZXMuLi5cbiAqIEByZXR1cm4ge1N0cmluZ3xmYWxzZXxudWxsfVxuICogQHB1YmxpY1xuICovXG5cbnJlcS5pcyA9IGZ1bmN0aW9uIGlzKHR5cGVzKSB7XG4gIHZhciBhcnIgPSB0eXBlcztcblxuICAvLyBzdXBwb3J0IGZsYXR0ZW5lZCBhcmd1bWVudHNcbiAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGVzKSkge1xuICAgIGFyciA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgYXJyW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0eXBlaXModGhpcywgYXJyKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwcm90b2NvbCBzdHJpbmcgXCJodHRwXCIgb3IgXCJodHRwc1wiXG4gKiB3aGVuIHJlcXVlc3RlZCB3aXRoIFRMUy4gV2hlbiB0aGUgXCJ0cnVzdCBwcm94eVwiXG4gKiBzZXR0aW5nIHRydXN0cyB0aGUgc29ja2V0IGFkZHJlc3MsIHRoZVxuICogXCJYLUZvcndhcmRlZC1Qcm90b1wiIGhlYWRlciBmaWVsZCB3aWxsIGJlIHRydXN0ZWRcbiAqIGFuZCB1c2VkIGlmIHByZXNlbnQuXG4gKlxuICogSWYgeW91J3JlIHJ1bm5pbmcgYmVoaW5kIGEgcmV2ZXJzZSBwcm94eSB0aGF0XG4gKiBzdXBwbGllcyBodHRwcyBmb3IgeW91IHRoaXMgbWF5IGJlIGVuYWJsZWQuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmRlZmluZUdldHRlcihyZXEsICdwcm90b2NvbCcsIGZ1bmN0aW9uIHByb3RvY29sKCl7XG4gIHZhciBwcm90byA9IHRoaXMuY29ubmVjdGlvbi5lbmNyeXB0ZWRcbiAgICA/ICdodHRwcydcbiAgICA6ICdodHRwJztcbiAgdmFyIHRydXN0ID0gdGhpcy5hcHAuZ2V0KCd0cnVzdCBwcm94eSBmbicpO1xuXG4gIGlmICghdHJ1c3QodGhpcy5jb25uZWN0aW9uLnJlbW90ZUFkZHJlc3MsIDApKSB7XG4gICAgcmV0dXJuIHByb3RvO1xuICB9XG5cbiAgLy8gTm90ZTogWC1Gb3J3YXJkZWQtUHJvdG8gaXMgbm9ybWFsbHkgb25seSBldmVyIGFcbiAgLy8gICAgICAgc2luZ2xlIHZhbHVlLCBidXQgdGhpcyBpcyB0byBiZSBzYWZlLlxuICB2YXIgaGVhZGVyID0gdGhpcy5nZXQoJ1gtRm9yd2FyZGVkLVByb3RvJykgfHwgcHJvdG9cbiAgdmFyIGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJywnKVxuXG4gIHJldHVybiBpbmRleCAhPT0gLTFcbiAgICA/IGhlYWRlci5zdWJzdHJpbmcoMCwgaW5kZXgpLnRyaW0oKVxuICAgIDogaGVhZGVyLnRyaW0oKVxufSk7XG5cbi8qKlxuICogU2hvcnQtaGFuZCBmb3I6XG4gKlxuICogICAgcmVxLnByb3RvY29sID09PSAnaHR0cHMnXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5kZWZpbmVHZXR0ZXIocmVxLCAnc2VjdXJlJywgZnVuY3Rpb24gc2VjdXJlKCl7XG4gIHJldHVybiB0aGlzLnByb3RvY29sID09PSAnaHR0cHMnO1xufSk7XG5cbi8qKlxuICogUmV0dXJuIHRoZSByZW1vdGUgYWRkcmVzcyBmcm9tIHRoZSB0cnVzdGVkIHByb3h5LlxuICpcbiAqIFRoZSBpcyB0aGUgcmVtb3RlIGFkZHJlc3Mgb24gdGhlIHNvY2tldCB1bmxlc3NcbiAqIFwidHJ1c3QgcHJveHlcIiBpcyBzZXQuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmRlZmluZUdldHRlcihyZXEsICdpcCcsIGZ1bmN0aW9uIGlwKCl7XG4gIHZhciB0cnVzdCA9IHRoaXMuYXBwLmdldCgndHJ1c3QgcHJveHkgZm4nKTtcbiAgcmV0dXJuIHByb3h5YWRkcih0aGlzLCB0cnVzdCk7XG59KTtcblxuLyoqXG4gKiBXaGVuIFwidHJ1c3QgcHJveHlcIiBpcyBzZXQsIHRydXN0ZWQgcHJveHkgYWRkcmVzc2VzICsgY2xpZW50LlxuICpcbiAqIEZvciBleGFtcGxlIGlmIHRoZSB2YWx1ZSB3ZXJlIFwiY2xpZW50LCBwcm94eTEsIHByb3h5MlwiXG4gKiB5b3Ugd291bGQgcmVjZWl2ZSB0aGUgYXJyYXkgYFtcImNsaWVudFwiLCBcInByb3h5MVwiLCBcInByb3h5MlwiXWBcbiAqIHdoZXJlIFwicHJveHkyXCIgaXMgdGhlIGZ1cnRoZXN0IGRvd24tc3RyZWFtIGFuZCBcInByb3h5MVwiIGFuZFxuICogXCJwcm94eTJcIiB3ZXJlIHRydXN0ZWQuXG4gKlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAcHVibGljXG4gKi9cblxuZGVmaW5lR2V0dGVyKHJlcSwgJ2lwcycsIGZ1bmN0aW9uIGlwcygpIHtcbiAgdmFyIHRydXN0ID0gdGhpcy5hcHAuZ2V0KCd0cnVzdCBwcm94eSBmbicpO1xuICB2YXIgYWRkcnMgPSBwcm94eWFkZHIuYWxsKHRoaXMsIHRydXN0KTtcblxuICAvLyByZXZlcnNlIHRoZSBvcmRlciAodG8gZmFydGhlc3QgLT4gY2xvc2VzdClcbiAgLy8gYW5kIHJlbW92ZSBzb2NrZXQgYWRkcmVzc1xuICBhZGRycy5yZXZlcnNlKCkucG9wKClcblxuICByZXR1cm4gYWRkcnNcbn0pO1xuXG4vKipcbiAqIFJldHVybiBzdWJkb21haW5zIGFzIGFuIGFycmF5LlxuICpcbiAqIFN1YmRvbWFpbnMgYXJlIHRoZSBkb3Qtc2VwYXJhdGVkIHBhcnRzIG9mIHRoZSBob3N0IGJlZm9yZSB0aGUgbWFpbiBkb21haW4gb2ZcbiAqIHRoZSBhcHAuIEJ5IGRlZmF1bHQsIHRoZSBkb21haW4gb2YgdGhlIGFwcCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBsYXN0IHR3b1xuICogcGFydHMgb2YgdGhlIGhvc3QuIFRoaXMgY2FuIGJlIGNoYW5nZWQgYnkgc2V0dGluZyBcInN1YmRvbWFpbiBvZmZzZXRcIi5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGRvbWFpbiBpcyBcInRvYmkuZmVycmV0cy5leGFtcGxlLmNvbVwiOlxuICogSWYgXCJzdWJkb21haW4gb2Zmc2V0XCIgaXMgbm90IHNldCwgcmVxLnN1YmRvbWFpbnMgaXMgYFtcImZlcnJldHNcIiwgXCJ0b2JpXCJdYC5cbiAqIElmIFwic3ViZG9tYWluIG9mZnNldFwiIGlzIDMsIHJlcS5zdWJkb21haW5zIGlzIGBbXCJ0b2JpXCJdYC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBwdWJsaWNcbiAqL1xuXG5kZWZpbmVHZXR0ZXIocmVxLCAnc3ViZG9tYWlucycsIGZ1bmN0aW9uIHN1YmRvbWFpbnMoKSB7XG4gIHZhciBob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWU7XG5cbiAgaWYgKCFob3N0bmFtZSkgcmV0dXJuIFtdO1xuXG4gIHZhciBvZmZzZXQgPSB0aGlzLmFwcC5nZXQoJ3N1YmRvbWFpbiBvZmZzZXQnKTtcbiAgdmFyIHN1YmRvbWFpbnMgPSAhaXNJUChob3N0bmFtZSlcbiAgICA/IGhvc3RuYW1lLnNwbGl0KCcuJykucmV2ZXJzZSgpXG4gICAgOiBbaG9zdG5hbWVdO1xuXG4gIHJldHVybiBzdWJkb21haW5zLnNsaWNlKG9mZnNldCk7XG59KTtcblxuLyoqXG4gKiBTaG9ydC1oYW5kIGZvciBgdXJsLnBhcnNlKHJlcS51cmwpLnBhdGhuYW1lYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxuZGVmaW5lR2V0dGVyKHJlcSwgJ3BhdGgnLCBmdW5jdGlvbiBwYXRoKCkge1xuICByZXR1cm4gcGFyc2UodGhpcykucGF0aG5hbWU7XG59KTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgXCJIb3N0XCIgaGVhZGVyIGZpZWxkIHRvIGEgaG9zdG5hbWUuXG4gKlxuICogV2hlbiB0aGUgXCJ0cnVzdCBwcm94eVwiIHNldHRpbmcgdHJ1c3RzIHRoZSBzb2NrZXRcbiAqIGFkZHJlc3MsIHRoZSBcIlgtRm9yd2FyZGVkLUhvc3RcIiBoZWFkZXIgZmllbGQgd2lsbFxuICogYmUgdHJ1c3RlZC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxuZGVmaW5lR2V0dGVyKHJlcSwgJ2hvc3RuYW1lJywgZnVuY3Rpb24gaG9zdG5hbWUoKXtcbiAgdmFyIHRydXN0ID0gdGhpcy5hcHAuZ2V0KCd0cnVzdCBwcm94eSBmbicpO1xuICB2YXIgaG9zdCA9IHRoaXMuZ2V0KCdYLUZvcndhcmRlZC1Ib3N0Jyk7XG5cbiAgaWYgKCFob3N0IHx8ICF0cnVzdCh0aGlzLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzcywgMCkpIHtcbiAgICBob3N0ID0gdGhpcy5nZXQoJ0hvc3QnKTtcbiAgfVxuXG4gIGlmICghaG9zdCkgcmV0dXJuO1xuXG4gIC8vIElQdjYgbGl0ZXJhbCBzdXBwb3J0XG4gIHZhciBvZmZzZXQgPSBob3N0WzBdID09PSAnWydcbiAgICA/IGhvc3QuaW5kZXhPZignXScpICsgMVxuICAgIDogMDtcbiAgdmFyIGluZGV4ID0gaG9zdC5pbmRleE9mKCc6Jywgb2Zmc2V0KTtcblxuICByZXR1cm4gaW5kZXggIT09IC0xXG4gICAgPyBob3N0LnN1YnN0cmluZygwLCBpbmRleClcbiAgICA6IGhvc3Q7XG59KTtcblxuLy8gVE9ETzogY2hhbmdlIHJlcS5ob3N0IHRvIHJldHVybiBob3N0IGluIG5leHQgbWFqb3JcblxuZGVmaW5lR2V0dGVyKHJlcSwgJ2hvc3QnLCBkZXByZWNhdGUuZnVuY3Rpb24oZnVuY3Rpb24gaG9zdCgpe1xuICByZXR1cm4gdGhpcy5ob3N0bmFtZTtcbn0sICdyZXEuaG9zdDogVXNlIHJlcS5ob3N0bmFtZSBpbnN0ZWFkJykpO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIGZyZXNoLCBha2FcbiAqIExhc3QtTW9kaWZpZWQgYW5kL29yIHRoZSBFVGFnXG4gKiBzdGlsbCBtYXRjaC5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHB1YmxpY1xuICovXG5cbmRlZmluZUdldHRlcihyZXEsICdmcmVzaCcsIGZ1bmN0aW9uKCl7XG4gIHZhciBtZXRob2QgPSB0aGlzLm1ldGhvZDtcbiAgdmFyIHJlcyA9IHRoaXMucmVzXG4gIHZhciBzdGF0dXMgPSByZXMuc3RhdHVzQ29kZVxuXG4gIC8vIEdFVCBvciBIRUFEIGZvciB3ZWFrIGZyZXNobmVzcyB2YWxpZGF0aW9uIG9ubHlcbiAgaWYgKCdHRVQnICE9PSBtZXRob2QgJiYgJ0hFQUQnICE9PSBtZXRob2QpIHJldHVybiBmYWxzZTtcblxuICAvLyAyeHggb3IgMzA0IGFzIHBlciByZmMyNjE2IDE0LjI2XG4gIGlmICgoc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDApIHx8IDMwNCA9PT0gc3RhdHVzKSB7XG4gICAgcmV0dXJuIGZyZXNoKHRoaXMuaGVhZGVycywge1xuICAgICAgJ2V0YWcnOiByZXMuZ2V0KCdFVGFnJyksXG4gICAgICAnbGFzdC1tb2RpZmllZCc6IHJlcy5nZXQoJ0xhc3QtTW9kaWZpZWQnKVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59KTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBpcyBzdGFsZSwgYWthXG4gKiBcIkxhc3QtTW9kaWZpZWRcIiBhbmQgLyBvciB0aGUgXCJFVGFnXCIgZm9yIHRoZVxuICogcmVzb3VyY2UgaGFzIGNoYW5nZWQuXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5kZWZpbmVHZXR0ZXIocmVxLCAnc3RhbGUnLCBmdW5jdGlvbiBzdGFsZSgpe1xuICByZXR1cm4gIXRoaXMuZnJlc2g7XG59KTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcmVxdWVzdCB3YXMgYW4gX1hNTEh0dHBSZXF1ZXN0Xy5cbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHB1YmxpY1xuICovXG5cbmRlZmluZUdldHRlcihyZXEsICd4aHInLCBmdW5jdGlvbiB4aHIoKXtcbiAgdmFyIHZhbCA9IHRoaXMuZ2V0KCdYLVJlcXVlc3RlZC1XaXRoJykgfHwgJyc7XG4gIHJldHVybiB2YWwudG9Mb3dlckNhc2UoKSA9PT0gJ3htbGh0dHByZXF1ZXN0Jztcbn0pO1xuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBnZXR0ZXIgb24gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXR0ZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGRlZmluZUdldHRlcihvYmosIG5hbWUsIGdldHRlcikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBuYW1lLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBnZXR0ZXJcbiAgfSk7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvZXhwcmVzcy9saWIvcmVxdWVzdC5qc1xuLy8gbW9kdWxlIGlkID0gMTczXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogYWNjZXB0c1xuICogQ29weXJpZ2h0KGMpIDIwMTQgSm9uYXRoYW4gT25nXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIE5lZ290aWF0b3IgPSByZXF1aXJlKCduZWdvdGlhdG9yJylcbnZhciBtaW1lID0gcmVxdWlyZSgnbWltZS10eXBlcycpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBBY2NlcHRzXG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IEFjY2VwdHMgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gcmVxLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXFcbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBBY2NlcHRzIChyZXEpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEFjY2VwdHMpKSB7XG4gICAgcmV0dXJuIG5ldyBBY2NlcHRzKHJlcSlcbiAgfVxuXG4gIHRoaXMuaGVhZGVycyA9IHJlcS5oZWFkZXJzXG4gIHRoaXMubmVnb3RpYXRvciA9IG5ldyBOZWdvdGlhdG9yKHJlcSlcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgZ2l2ZW4gYHR5cGUocylgIGlzIGFjY2VwdGFibGUsIHJldHVybmluZ1xuICogdGhlIGJlc3QgbWF0Y2ggd2hlbiB0cnVlLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAsIGluIHdoaWNoXG4gKiBjYXNlIHlvdSBzaG91bGQgcmVzcG9uZCB3aXRoIDQwNiBcIk5vdCBBY2NlcHRhYmxlXCIuXG4gKlxuICogVGhlIGB0eXBlYCB2YWx1ZSBtYXkgYmUgYSBzaW5nbGUgbWltZSB0eXBlIHN0cmluZ1xuICogc3VjaCBhcyBcImFwcGxpY2F0aW9uL2pzb25cIiwgdGhlIGV4dGVuc2lvbiBuYW1lXG4gKiBzdWNoIGFzIFwianNvblwiIG9yIGFuIGFycmF5IGBbXCJqc29uXCIsIFwiaHRtbFwiLCBcInRleHQvcGxhaW5cIl1gLiBXaGVuIGEgbGlzdFxuICogb3IgYXJyYXkgaXMgZ2l2ZW4gdGhlIF9iZXN0XyBtYXRjaCwgaWYgYW55IGlzIHJldHVybmVkLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAvLyBBY2NlcHQ6IHRleHQvaHRtbFxuICogICAgIHRoaXMudHlwZXMoJ2h0bWwnKTtcbiAqICAgICAvLyA9PiBcImh0bWxcIlxuICpcbiAqICAgICAvLyBBY2NlcHQ6IHRleHQvKiwgYXBwbGljYXRpb24vanNvblxuICogICAgIHRoaXMudHlwZXMoJ2h0bWwnKTtcbiAqICAgICAvLyA9PiBcImh0bWxcIlxuICogICAgIHRoaXMudHlwZXMoJ3RleHQvaHRtbCcpO1xuICogICAgIC8vID0+IFwidGV4dC9odG1sXCJcbiAqICAgICB0aGlzLnR5cGVzKCdqc29uJywgJ3RleHQnKTtcbiAqICAgICAvLyA9PiBcImpzb25cIlxuICogICAgIHRoaXMudHlwZXMoJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAqICAgICAvLyA9PiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICpcbiAqICAgICAvLyBBY2NlcHQ6IHRleHQvKiwgYXBwbGljYXRpb24vanNvblxuICogICAgIHRoaXMudHlwZXMoJ2ltYWdlL3BuZycpO1xuICogICAgIHRoaXMudHlwZXMoJ3BuZycpO1xuICogICAgIC8vID0+IHVuZGVmaW5lZFxuICpcbiAqICAgICAvLyBBY2NlcHQ6IHRleHQvKjtxPS41LCBhcHBsaWNhdGlvbi9qc29uXG4gKiAgICAgdGhpcy50eXBlcyhbJ2h0bWwnLCAnanNvbiddKTtcbiAqICAgICB0aGlzLnR5cGVzKCdodG1sJywgJ2pzb24nKTtcbiAqICAgICAvLyA9PiBcImpzb25cIlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSB0eXBlcy4uLlxuICogQHJldHVybiB7U3RyaW5nfEFycmF5fEJvb2xlYW59XG4gKiBAcHVibGljXG4gKi9cblxuQWNjZXB0cy5wcm90b3R5cGUudHlwZSA9XG5BY2NlcHRzLnByb3RvdHlwZS50eXBlcyA9IGZ1bmN0aW9uICh0eXBlc18pIHtcbiAgdmFyIHR5cGVzID0gdHlwZXNfXG5cbiAgLy8gc3VwcG9ydCBmbGF0dGVuZWQgYXJndW1lbnRzXG4gIGlmICh0eXBlcyAmJiAhQXJyYXkuaXNBcnJheSh0eXBlcykpIHtcbiAgICB0eXBlcyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHR5cGVzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuICB9XG5cbiAgLy8gbm8gdHlwZXMsIHJldHVybiBhbGwgcmVxdWVzdGVkIHR5cGVzXG4gIGlmICghdHlwZXMgfHwgdHlwZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRoaXMubmVnb3RpYXRvci5tZWRpYVR5cGVzKClcbiAgfVxuXG4gIC8vIG5vIGFjY2VwdCBoZWFkZXIsIHJldHVybiBmaXJzdCBnaXZlbiB0eXBlXG4gIGlmICghdGhpcy5oZWFkZXJzLmFjY2VwdCkge1xuICAgIHJldHVybiB0eXBlc1swXVxuICB9XG5cbiAgdmFyIG1pbWVzID0gdHlwZXMubWFwKGV4dFRvTWltZSlcbiAgdmFyIGFjY2VwdHMgPSB0aGlzLm5lZ290aWF0b3IubWVkaWFUeXBlcyhtaW1lcy5maWx0ZXIodmFsaWRNaW1lKSlcbiAgdmFyIGZpcnN0ID0gYWNjZXB0c1swXVxuXG4gIHJldHVybiBmaXJzdFxuICAgID8gdHlwZXNbbWltZXMuaW5kZXhPZihmaXJzdCldXG4gICAgOiBmYWxzZVxufVxuXG4vKipcbiAqIFJldHVybiBhY2NlcHRlZCBlbmNvZGluZ3Mgb3IgYmVzdCBmaXQgYmFzZWQgb24gYGVuY29kaW5nc2AuXG4gKlxuICogR2l2ZW4gYEFjY2VwdC1FbmNvZGluZzogZ3ppcCwgZGVmbGF0ZWBcbiAqIGFuIGFycmF5IHNvcnRlZCBieSBxdWFsaXR5IGlzIHJldHVybmVkOlxuICpcbiAqICAgICBbJ2d6aXAnLCAnZGVmbGF0ZSddXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGVuY29kaW5ncy4uLlxuICogQHJldHVybiB7U3RyaW5nfEFycmF5fVxuICogQHB1YmxpY1xuICovXG5cbkFjY2VwdHMucHJvdG90eXBlLmVuY29kaW5nID1cbkFjY2VwdHMucHJvdG90eXBlLmVuY29kaW5ncyA9IGZ1bmN0aW9uIChlbmNvZGluZ3NfKSB7XG4gIHZhciBlbmNvZGluZ3MgPSBlbmNvZGluZ3NfXG5cbiAgLy8gc3VwcG9ydCBmbGF0dGVuZWQgYXJndW1lbnRzXG4gIGlmIChlbmNvZGluZ3MgJiYgIUFycmF5LmlzQXJyYXkoZW5jb2RpbmdzKSkge1xuICAgIGVuY29kaW5ncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW5jb2RpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBlbmNvZGluZ3NbaV0gPSBhcmd1bWVudHNbaV1cbiAgICB9XG4gIH1cblxuICAvLyBubyBlbmNvZGluZ3MsIHJldHVybiBhbGwgcmVxdWVzdGVkIGVuY29kaW5nc1xuICBpZiAoIWVuY29kaW5ncyB8fCBlbmNvZGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRoaXMubmVnb3RpYXRvci5lbmNvZGluZ3MoKVxuICB9XG5cbiAgcmV0dXJuIHRoaXMubmVnb3RpYXRvci5lbmNvZGluZ3MoZW5jb2RpbmdzKVswXSB8fCBmYWxzZVxufVxuXG4vKipcbiAqIFJldHVybiBhY2NlcHRlZCBjaGFyc2V0cyBvciBiZXN0IGZpdCBiYXNlZCBvbiBgY2hhcnNldHNgLlxuICpcbiAqIEdpdmVuIGBBY2NlcHQtQ2hhcnNldDogdXRmLTgsIGlzby04ODU5LTE7cT0wLjIsIHV0Zi03O3E9MC41YFxuICogYW4gYXJyYXkgc29ydGVkIGJ5IHF1YWxpdHkgaXMgcmV0dXJuZWQ6XG4gKlxuICogICAgIFsndXRmLTgnLCAndXRmLTcnLCAnaXNvLTg4NTktMSddXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGNoYXJzZXRzLi4uXG4gKiBAcmV0dXJuIHtTdHJpbmd8QXJyYXl9XG4gKiBAcHVibGljXG4gKi9cblxuQWNjZXB0cy5wcm90b3R5cGUuY2hhcnNldCA9XG5BY2NlcHRzLnByb3RvdHlwZS5jaGFyc2V0cyA9IGZ1bmN0aW9uIChjaGFyc2V0c18pIHtcbiAgdmFyIGNoYXJzZXRzID0gY2hhcnNldHNfXG5cbiAgLy8gc3VwcG9ydCBmbGF0dGVuZWQgYXJndW1lbnRzXG4gIGlmIChjaGFyc2V0cyAmJiAhQXJyYXkuaXNBcnJheShjaGFyc2V0cykpIHtcbiAgICBjaGFyc2V0cyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhcnNldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoYXJzZXRzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuICB9XG5cbiAgLy8gbm8gY2hhcnNldHMsIHJldHVybiBhbGwgcmVxdWVzdGVkIGNoYXJzZXRzXG4gIGlmICghY2hhcnNldHMgfHwgY2hhcnNldHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRoaXMubmVnb3RpYXRvci5jaGFyc2V0cygpXG4gIH1cblxuICByZXR1cm4gdGhpcy5uZWdvdGlhdG9yLmNoYXJzZXRzKGNoYXJzZXRzKVswXSB8fCBmYWxzZVxufVxuXG4vKipcbiAqIFJldHVybiBhY2NlcHRlZCBsYW5ndWFnZXMgb3IgYmVzdCBmaXQgYmFzZWQgb24gYGxhbmdzYC5cbiAqXG4gKiBHaXZlbiBgQWNjZXB0LUxhbmd1YWdlOiBlbjtxPTAuOCwgZXMsIHB0YFxuICogYW4gYXJyYXkgc29ydGVkIGJ5IHF1YWxpdHkgaXMgcmV0dXJuZWQ6XG4gKlxuICogICAgIFsnZXMnLCAncHQnLCAnZW4nXVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBsYW5ncy4uLlxuICogQHJldHVybiB7QXJyYXl8U3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbkFjY2VwdHMucHJvdG90eXBlLmxhbmcgPVxuQWNjZXB0cy5wcm90b3R5cGUubGFuZ3MgPVxuQWNjZXB0cy5wcm90b3R5cGUubGFuZ3VhZ2UgPVxuQWNjZXB0cy5wcm90b3R5cGUubGFuZ3VhZ2VzID0gZnVuY3Rpb24gKGxhbmd1YWdlc18pIHtcbiAgdmFyIGxhbmd1YWdlcyA9IGxhbmd1YWdlc19cblxuICAvLyBzdXBwb3J0IGZsYXR0ZW5lZCBhcmd1bWVudHNcbiAgaWYgKGxhbmd1YWdlcyAmJiAhQXJyYXkuaXNBcnJheShsYW5ndWFnZXMpKSB7XG4gICAgbGFuZ3VhZ2VzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYW5ndWFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxhbmd1YWdlc1tpXSA9IGFyZ3VtZW50c1tpXVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vIGxhbmd1YWdlcywgcmV0dXJuIGFsbCByZXF1ZXN0ZWQgbGFuZ3VhZ2VzXG4gIGlmICghbGFuZ3VhZ2VzIHx8IGxhbmd1YWdlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdGhpcy5uZWdvdGlhdG9yLmxhbmd1YWdlcygpXG4gIH1cblxuICByZXR1cm4gdGhpcy5uZWdvdGlhdG9yLmxhbmd1YWdlcyhsYW5ndWFnZXMpWzBdIHx8IGZhbHNlXG59XG5cbi8qKlxuICogQ29udmVydCBleHRuYW1lcyB0byBtaW1lLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGV4dFRvTWltZSAodHlwZSkge1xuICByZXR1cm4gdHlwZS5pbmRleE9mKCcvJykgPT09IC0xXG4gICAgPyBtaW1lLmxvb2t1cCh0eXBlKVxuICAgIDogdHlwZVxufVxuXG4vKipcbiAqIENoZWNrIGlmIG1pbWUgaXMgdmFsaWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gdmFsaWRNaW1lICh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZydcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9hY2NlcHRzL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxNzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBuZWdvdGlhdG9yXG4gKiBDb3B5cmlnaHQoYykgMjAxMiBGZWRlcmljbyBSb21lcm9cbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSXNhYWMgWi4gU2NobHVldGVyXG4gKiBDb3B5cmlnaHQoYykgMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENhY2hlZCBsb2FkZWQgc3VibW9kdWxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIG1vZHVsZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gTmVnb3RpYXRvcjtcbm1vZHVsZS5leHBvcnRzLk5lZ290aWF0b3IgPSBOZWdvdGlhdG9yO1xuXG4vKipcbiAqIENyZWF0ZSBhIE5lZ290aWF0b3IgaW5zdGFuY2UgZnJvbSBhIHJlcXVlc3QuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVxdWVzdFxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIE5lZ290aWF0b3IocmVxdWVzdCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTmVnb3RpYXRvcikpIHtcbiAgICByZXR1cm4gbmV3IE5lZ290aWF0b3IocmVxdWVzdCk7XG4gIH1cblxuICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0O1xufVxuXG5OZWdvdGlhdG9yLnByb3RvdHlwZS5jaGFyc2V0ID0gZnVuY3Rpb24gY2hhcnNldChhdmFpbGFibGUpIHtcbiAgdmFyIHNldCA9IHRoaXMuY2hhcnNldHMoYXZhaWxhYmxlKTtcbiAgcmV0dXJuIHNldCAmJiBzZXRbMF07XG59O1xuXG5OZWdvdGlhdG9yLnByb3RvdHlwZS5jaGFyc2V0cyA9IGZ1bmN0aW9uIGNoYXJzZXRzKGF2YWlsYWJsZSkge1xuICB2YXIgcHJlZmVycmVkQ2hhcnNldHMgPSBsb2FkTW9kdWxlKCdjaGFyc2V0JykucHJlZmVycmVkQ2hhcnNldHM7XG4gIHJldHVybiBwcmVmZXJyZWRDaGFyc2V0cyh0aGlzLnJlcXVlc3QuaGVhZGVyc1snYWNjZXB0LWNoYXJzZXQnXSwgYXZhaWxhYmxlKTtcbn07XG5cbk5lZ290aWF0b3IucHJvdG90eXBlLmVuY29kaW5nID0gZnVuY3Rpb24gZW5jb2RpbmcoYXZhaWxhYmxlKSB7XG4gIHZhciBzZXQgPSB0aGlzLmVuY29kaW5ncyhhdmFpbGFibGUpO1xuICByZXR1cm4gc2V0ICYmIHNldFswXTtcbn07XG5cbk5lZ290aWF0b3IucHJvdG90eXBlLmVuY29kaW5ncyA9IGZ1bmN0aW9uIGVuY29kaW5ncyhhdmFpbGFibGUpIHtcbiAgdmFyIHByZWZlcnJlZEVuY29kaW5ncyA9IGxvYWRNb2R1bGUoJ2VuY29kaW5nJykucHJlZmVycmVkRW5jb2RpbmdzO1xuICByZXR1cm4gcHJlZmVycmVkRW5jb2RpbmdzKHRoaXMucmVxdWVzdC5oZWFkZXJzWydhY2NlcHQtZW5jb2RpbmcnXSwgYXZhaWxhYmxlKTtcbn07XG5cbk5lZ290aWF0b3IucHJvdG90eXBlLmxhbmd1YWdlID0gZnVuY3Rpb24gbGFuZ3VhZ2UoYXZhaWxhYmxlKSB7XG4gIHZhciBzZXQgPSB0aGlzLmxhbmd1YWdlcyhhdmFpbGFibGUpO1xuICByZXR1cm4gc2V0ICYmIHNldFswXTtcbn07XG5cbk5lZ290aWF0b3IucHJvdG90eXBlLmxhbmd1YWdlcyA9IGZ1bmN0aW9uIGxhbmd1YWdlcyhhdmFpbGFibGUpIHtcbiAgdmFyIHByZWZlcnJlZExhbmd1YWdlcyA9IGxvYWRNb2R1bGUoJ2xhbmd1YWdlJykucHJlZmVycmVkTGFuZ3VhZ2VzO1xuICByZXR1cm4gcHJlZmVycmVkTGFuZ3VhZ2VzKHRoaXMucmVxdWVzdC5oZWFkZXJzWydhY2NlcHQtbGFuZ3VhZ2UnXSwgYXZhaWxhYmxlKTtcbn07XG5cbk5lZ290aWF0b3IucHJvdG90eXBlLm1lZGlhVHlwZSA9IGZ1bmN0aW9uIG1lZGlhVHlwZShhdmFpbGFibGUpIHtcbiAgdmFyIHNldCA9IHRoaXMubWVkaWFUeXBlcyhhdmFpbGFibGUpO1xuICByZXR1cm4gc2V0ICYmIHNldFswXTtcbn07XG5cbk5lZ290aWF0b3IucHJvdG90eXBlLm1lZGlhVHlwZXMgPSBmdW5jdGlvbiBtZWRpYVR5cGVzKGF2YWlsYWJsZSkge1xuICB2YXIgcHJlZmVycmVkTWVkaWFUeXBlcyA9IGxvYWRNb2R1bGUoJ21lZGlhVHlwZScpLnByZWZlcnJlZE1lZGlhVHlwZXM7XG4gIHJldHVybiBwcmVmZXJyZWRNZWRpYVR5cGVzKHRoaXMucmVxdWVzdC5oZWFkZXJzLmFjY2VwdCwgYXZhaWxhYmxlKTtcbn07XG5cbi8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5OZWdvdGlhdG9yLnByb3RvdHlwZS5wcmVmZXJyZWRDaGFyc2V0ID0gTmVnb3RpYXRvci5wcm90b3R5cGUuY2hhcnNldDtcbk5lZ290aWF0b3IucHJvdG90eXBlLnByZWZlcnJlZENoYXJzZXRzID0gTmVnb3RpYXRvci5wcm90b3R5cGUuY2hhcnNldHM7XG5OZWdvdGlhdG9yLnByb3RvdHlwZS5wcmVmZXJyZWRFbmNvZGluZyA9IE5lZ290aWF0b3IucHJvdG90eXBlLmVuY29kaW5nO1xuTmVnb3RpYXRvci5wcm90b3R5cGUucHJlZmVycmVkRW5jb2RpbmdzID0gTmVnb3RpYXRvci5wcm90b3R5cGUuZW5jb2RpbmdzO1xuTmVnb3RpYXRvci5wcm90b3R5cGUucHJlZmVycmVkTGFuZ3VhZ2UgPSBOZWdvdGlhdG9yLnByb3RvdHlwZS5sYW5ndWFnZTtcbk5lZ290aWF0b3IucHJvdG90eXBlLnByZWZlcnJlZExhbmd1YWdlcyA9IE5lZ290aWF0b3IucHJvdG90eXBlLmxhbmd1YWdlcztcbk5lZ290aWF0b3IucHJvdG90eXBlLnByZWZlcnJlZE1lZGlhVHlwZSA9IE5lZ290aWF0b3IucHJvdG90eXBlLm1lZGlhVHlwZTtcbk5lZ290aWF0b3IucHJvdG90eXBlLnByZWZlcnJlZE1lZGlhVHlwZXMgPSBOZWdvdGlhdG9yLnByb3RvdHlwZS5tZWRpYVR5cGVzO1xuXG4vKipcbiAqIExvYWQgdGhlIGdpdmVuIG1vZHVsZS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9hZE1vZHVsZShtb2R1bGVOYW1lKSB7XG4gIHZhciBtb2R1bGUgPSBtb2R1bGVzW21vZHVsZU5hbWVdO1xuXG4gIGlmIChtb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBtb2R1bGU7XG4gIH1cblxuICAvLyBUaGlzIHVzZXMgYSBzd2l0Y2ggZm9yIHN0YXRpYyByZXF1aXJlIGFuYWx5c2lzXG4gIHN3aXRjaCAobW9kdWxlTmFtZSkge1xuICAgIGNhc2UgJ2NoYXJzZXQnOlxuICAgICAgbW9kdWxlID0gcmVxdWlyZSgnLi9saWIvY2hhcnNldCcpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZW5jb2RpbmcnOlxuICAgICAgbW9kdWxlID0gcmVxdWlyZSgnLi9saWIvZW5jb2RpbmcnKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2xhbmd1YWdlJzpcbiAgICAgIG1vZHVsZSA9IHJlcXVpcmUoJy4vbGliL2xhbmd1YWdlJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdtZWRpYVR5cGUnOlxuICAgICAgbW9kdWxlID0gcmVxdWlyZSgnLi9saWIvbWVkaWFUeXBlJyk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBtb2R1bGUgXFwnJyArIG1vZHVsZU5hbWUgKyAnXFwnJyk7XG4gIH1cblxuICAvLyBTdG9yZSB0byBwcmV2ZW50IGludm9raW5nIHJlcXVpcmUoKVxuICBtb2R1bGVzW21vZHVsZU5hbWVdID0gbW9kdWxlO1xuXG4gIHJldHVybiBtb2R1bGU7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvbmVnb3RpYXRvci9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTc1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogbmVnb3RpYXRvclxuICogQ29weXJpZ2h0KGMpIDIwMTIgSXNhYWMgWi4gU2NobHVldGVyXG4gKiBDb3B5cmlnaHQoYykgMjAxNCBGZWRlcmljbyBSb21lcm9cbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHByZWZlcnJlZENoYXJzZXRzO1xubW9kdWxlLmV4cG9ydHMucHJlZmVycmVkQ2hhcnNldHMgPSBwcmVmZXJyZWRDaGFyc2V0cztcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgc2ltcGxlQ2hhcnNldFJlZ0V4cCA9IC9eXFxzKihbXlxccztdKylcXHMqKD86OyguKikpPyQvO1xuXG4vKipcbiAqIFBhcnNlIHRoZSBBY2NlcHQtQ2hhcnNldCBoZWFkZXIuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlQWNjZXB0Q2hhcnNldChhY2NlcHQpIHtcbiAgdmFyIGFjY2VwdHMgPSBhY2NlcHQuc3BsaXQoJywnKTtcblxuICBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGkgPCBhY2NlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGNoYXJzZXQgPSBwYXJzZUNoYXJzZXQoYWNjZXB0c1tpXS50cmltKCksIGkpO1xuXG4gICAgaWYgKGNoYXJzZXQpIHtcbiAgICAgIGFjY2VwdHNbaisrXSA9IGNoYXJzZXQ7XG4gICAgfVxuICB9XG5cbiAgLy8gdHJpbSBhY2NlcHRzXG4gIGFjY2VwdHMubGVuZ3RoID0gajtcblxuICByZXR1cm4gYWNjZXB0cztcbn1cblxuLyoqXG4gKiBQYXJzZSBhIGNoYXJzZXQgZnJvbSB0aGUgQWNjZXB0LUNoYXJzZXQgaGVhZGVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZUNoYXJzZXQoc3RyLCBpKSB7XG4gIHZhciBtYXRjaCA9IHNpbXBsZUNoYXJzZXRSZWdFeHAuZXhlYyhzdHIpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcblxuICB2YXIgY2hhcnNldCA9IG1hdGNoWzFdO1xuICB2YXIgcSA9IDE7XG4gIGlmIChtYXRjaFsyXSkge1xuICAgIHZhciBwYXJhbXMgPSBtYXRjaFsyXS5zcGxpdCgnOycpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICB2YXIgcCA9IHBhcmFtc1tpXS50cmltKCkuc3BsaXQoJz0nKTtcbiAgICAgIGlmIChwWzBdID09PSAncScpIHtcbiAgICAgICAgcSA9IHBhcnNlRmxvYXQocFsxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2hhcnNldDogY2hhcnNldCxcbiAgICBxOiBxLFxuICAgIGk6IGlcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByaW9yaXR5IG9mIGEgY2hhcnNldC5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0Q2hhcnNldFByaW9yaXR5KGNoYXJzZXQsIGFjY2VwdGVkLCBpbmRleCkge1xuICB2YXIgcHJpb3JpdHkgPSB7bzogLTEsIHE6IDAsIHM6IDB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjZXB0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc3BlYyA9IHNwZWNpZnkoY2hhcnNldCwgYWNjZXB0ZWRbaV0sIGluZGV4KTtcblxuICAgIGlmIChzcGVjICYmIChwcmlvcml0eS5zIC0gc3BlYy5zIHx8IHByaW9yaXR5LnEgLSBzcGVjLnEgfHwgcHJpb3JpdHkubyAtIHNwZWMubykgPCAwKSB7XG4gICAgICBwcmlvcml0eSA9IHNwZWM7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHByaW9yaXR5O1xufVxuXG4vKipcbiAqIEdldCB0aGUgc3BlY2lmaWNpdHkgb2YgdGhlIGNoYXJzZXQuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNwZWNpZnkoY2hhcnNldCwgc3BlYywgaW5kZXgpIHtcbiAgdmFyIHMgPSAwO1xuICBpZihzcGVjLmNoYXJzZXQudG9Mb3dlckNhc2UoKSA9PT0gY2hhcnNldC50b0xvd2VyQ2FzZSgpKXtcbiAgICBzIHw9IDE7XG4gIH0gZWxzZSBpZiAoc3BlYy5jaGFyc2V0ICE9PSAnKicgKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaTogaW5kZXgsXG4gICAgbzogc3BlYy5pLFxuICAgIHE6IHNwZWMucSxcbiAgICBzOiBzXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByZWZlcnJlZCBjaGFyc2V0cyBmcm9tIGFuIEFjY2VwdC1DaGFyc2V0IGhlYWRlci5cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwcmVmZXJyZWRDaGFyc2V0cyhhY2NlcHQsIHByb3ZpZGVkKSB7XG4gIC8vIFJGQyAyNjE2IHNlYyAxNC4yOiBubyBoZWFkZXIgPSAqXG4gIHZhciBhY2NlcHRzID0gcGFyc2VBY2NlcHRDaGFyc2V0KGFjY2VwdCA9PT0gdW5kZWZpbmVkID8gJyonIDogYWNjZXB0IHx8ICcnKTtcblxuICBpZiAoIXByb3ZpZGVkKSB7XG4gICAgLy8gc29ydGVkIGxpc3Qgb2YgYWxsIGNoYXJzZXRzXG4gICAgcmV0dXJuIGFjY2VwdHNcbiAgICAgIC5maWx0ZXIoaXNRdWFsaXR5KVxuICAgICAgLnNvcnQoY29tcGFyZVNwZWNzKVxuICAgICAgLm1hcChnZXRGdWxsQ2hhcnNldCk7XG4gIH1cblxuICB2YXIgcHJpb3JpdGllcyA9IHByb3ZpZGVkLm1hcChmdW5jdGlvbiBnZXRQcmlvcml0eSh0eXBlLCBpbmRleCkge1xuICAgIHJldHVybiBnZXRDaGFyc2V0UHJpb3JpdHkodHlwZSwgYWNjZXB0cywgaW5kZXgpO1xuICB9KTtcblxuICAvLyBzb3J0ZWQgbGlzdCBvZiBhY2NlcHRlZCBjaGFyc2V0c1xuICByZXR1cm4gcHJpb3JpdGllcy5maWx0ZXIoaXNRdWFsaXR5KS5zb3J0KGNvbXBhcmVTcGVjcykubWFwKGZ1bmN0aW9uIGdldENoYXJzZXQocHJpb3JpdHkpIHtcbiAgICByZXR1cm4gcHJvdmlkZWRbcHJpb3JpdGllcy5pbmRleE9mKHByaW9yaXR5KV07XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbXBhcmUgdHdvIHNwZWNzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb21wYXJlU3BlY3MoYSwgYikge1xuICByZXR1cm4gKGIucSAtIGEucSkgfHwgKGIucyAtIGEucykgfHwgKGEubyAtIGIubykgfHwgKGEuaSAtIGIuaSkgfHwgMDtcbn1cblxuLyoqXG4gKiBHZXQgZnVsbCBjaGFyc2V0IHN0cmluZy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RnVsbENoYXJzZXQoc3BlYykge1xuICByZXR1cm4gc3BlYy5jaGFyc2V0O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgc3BlYyBoYXMgYW55IHF1YWxpdHkuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzUXVhbGl0eShzcGVjKSB7XG4gIHJldHVybiBzcGVjLnEgPiAwO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL25lZ290aWF0b3IvbGliL2NoYXJzZXQuanNcbi8vIG1vZHVsZSBpZCA9IDE3NlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKipcbiAqIG5lZ290aWF0b3JcbiAqIENvcHlyaWdodChjKSAyMDEyIElzYWFjIFouIFNjaGx1ZXRlclxuICogQ29weXJpZ2h0KGMpIDIwMTQgRmVkZXJpY28gUm9tZXJvXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwcmVmZXJyZWRFbmNvZGluZ3M7XG5tb2R1bGUuZXhwb3J0cy5wcmVmZXJyZWRFbmNvZGluZ3MgPSBwcmVmZXJyZWRFbmNvZGluZ3M7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIHNpbXBsZUVuY29kaW5nUmVnRXhwID0gL15cXHMqKFteXFxzO10rKVxccyooPzo7KC4qKSk/JC87XG5cbi8qKlxuICogUGFyc2UgdGhlIEFjY2VwdC1FbmNvZGluZyBoZWFkZXIuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlQWNjZXB0RW5jb2RpbmcoYWNjZXB0KSB7XG4gIHZhciBhY2NlcHRzID0gYWNjZXB0LnNwbGl0KCcsJyk7XG4gIHZhciBoYXNJZGVudGl0eSA9IGZhbHNlO1xuICB2YXIgbWluUXVhbGl0eSA9IDE7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgYWNjZXB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlbmNvZGluZyA9IHBhcnNlRW5jb2RpbmcoYWNjZXB0c1tpXS50cmltKCksIGkpO1xuXG4gICAgaWYgKGVuY29kaW5nKSB7XG4gICAgICBhY2NlcHRzW2orK10gPSBlbmNvZGluZztcbiAgICAgIGhhc0lkZW50aXR5ID0gaGFzSWRlbnRpdHkgfHwgc3BlY2lmeSgnaWRlbnRpdHknLCBlbmNvZGluZyk7XG4gICAgICBtaW5RdWFsaXR5ID0gTWF0aC5taW4obWluUXVhbGl0eSwgZW5jb2RpbmcucSB8fCAxKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWhhc0lkZW50aXR5KSB7XG4gICAgLypcbiAgICAgKiBJZiBpZGVudGl0eSBkb2Vzbid0IGV4cGxpY2l0bHkgYXBwZWFyIGluIHRoZSBhY2NlcHQtZW5jb2RpbmcgaGVhZGVyLFxuICAgICAqIGl0J3MgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgYWNjZXB0YWJsZSBlbmNvZGluZyB3aXRoIHRoZSBsb3dlc3QgcVxuICAgICAqL1xuICAgIGFjY2VwdHNbaisrXSA9IHtcbiAgICAgIGVuY29kaW5nOiAnaWRlbnRpdHknLFxuICAgICAgcTogbWluUXVhbGl0eSxcbiAgICAgIGk6IGlcbiAgICB9O1xuICB9XG5cbiAgLy8gdHJpbSBhY2NlcHRzXG4gIGFjY2VwdHMubGVuZ3RoID0gajtcblxuICByZXR1cm4gYWNjZXB0cztcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBlbmNvZGluZyBmcm9tIHRoZSBBY2NlcHQtRW5jb2RpbmcgaGVhZGVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZUVuY29kaW5nKHN0ciwgaSkge1xuICB2YXIgbWF0Y2ggPSBzaW1wbGVFbmNvZGluZ1JlZ0V4cC5leGVjKHN0cik7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIHZhciBlbmNvZGluZyA9IG1hdGNoWzFdO1xuICB2YXIgcSA9IDE7XG4gIGlmIChtYXRjaFsyXSkge1xuICAgIHZhciBwYXJhbXMgPSBtYXRjaFsyXS5zcGxpdCgnOycpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSArKykge1xuICAgICAgdmFyIHAgPSBwYXJhbXNbaV0udHJpbSgpLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAocFswXSA9PT0gJ3EnKSB7XG4gICAgICAgIHEgPSBwYXJzZUZsb2F0KHBbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVuY29kaW5nOiBlbmNvZGluZyxcbiAgICBxOiBxLFxuICAgIGk6IGlcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByaW9yaXR5IG9mIGFuIGVuY29kaW5nLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRFbmNvZGluZ1ByaW9yaXR5KGVuY29kaW5nLCBhY2NlcHRlZCwgaW5kZXgpIHtcbiAgdmFyIHByaW9yaXR5ID0ge286IC0xLCBxOiAwLCBzOiAwfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFjY2VwdGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNwZWMgPSBzcGVjaWZ5KGVuY29kaW5nLCBhY2NlcHRlZFtpXSwgaW5kZXgpO1xuXG4gICAgaWYgKHNwZWMgJiYgKHByaW9yaXR5LnMgLSBzcGVjLnMgfHwgcHJpb3JpdHkucSAtIHNwZWMucSB8fCBwcmlvcml0eS5vIC0gc3BlYy5vKSA8IDApIHtcbiAgICAgIHByaW9yaXR5ID0gc3BlYztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcHJpb3JpdHk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBzcGVjaWZpY2l0eSBvZiB0aGUgZW5jb2RpbmcuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNwZWNpZnkoZW5jb2RpbmcsIHNwZWMsIGluZGV4KSB7XG4gIHZhciBzID0gMDtcbiAgaWYoc3BlYy5lbmNvZGluZy50b0xvd2VyQ2FzZSgpID09PSBlbmNvZGluZy50b0xvd2VyQ2FzZSgpKXtcbiAgICBzIHw9IDE7XG4gIH0gZWxzZSBpZiAoc3BlYy5lbmNvZGluZyAhPT0gJyonICkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGk6IGluZGV4LFxuICAgIG86IHNwZWMuaSxcbiAgICBxOiBzcGVjLnEsXG4gICAgczogc1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcHJlZmVycmVkIGVuY29kaW5ncyBmcm9tIGFuIEFjY2VwdC1FbmNvZGluZyBoZWFkZXIuXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcHJlZmVycmVkRW5jb2RpbmdzKGFjY2VwdCwgcHJvdmlkZWQpIHtcbiAgdmFyIGFjY2VwdHMgPSBwYXJzZUFjY2VwdEVuY29kaW5nKGFjY2VwdCB8fCAnJyk7XG5cbiAgaWYgKCFwcm92aWRlZCkge1xuICAgIC8vIHNvcnRlZCBsaXN0IG9mIGFsbCBlbmNvZGluZ3NcbiAgICByZXR1cm4gYWNjZXB0c1xuICAgICAgLmZpbHRlcihpc1F1YWxpdHkpXG4gICAgICAuc29ydChjb21wYXJlU3BlY3MpXG4gICAgICAubWFwKGdldEZ1bGxFbmNvZGluZyk7XG4gIH1cblxuICB2YXIgcHJpb3JpdGllcyA9IHByb3ZpZGVkLm1hcChmdW5jdGlvbiBnZXRQcmlvcml0eSh0eXBlLCBpbmRleCkge1xuICAgIHJldHVybiBnZXRFbmNvZGluZ1ByaW9yaXR5KHR5cGUsIGFjY2VwdHMsIGluZGV4KTtcbiAgfSk7XG5cbiAgLy8gc29ydGVkIGxpc3Qgb2YgYWNjZXB0ZWQgZW5jb2RpbmdzXG4gIHJldHVybiBwcmlvcml0aWVzLmZpbHRlcihpc1F1YWxpdHkpLnNvcnQoY29tcGFyZVNwZWNzKS5tYXAoZnVuY3Rpb24gZ2V0RW5jb2RpbmcocHJpb3JpdHkpIHtcbiAgICByZXR1cm4gcHJvdmlkZWRbcHJpb3JpdGllcy5pbmRleE9mKHByaW9yaXR5KV07XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbXBhcmUgdHdvIHNwZWNzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb21wYXJlU3BlY3MoYSwgYikge1xuICByZXR1cm4gKGIucSAtIGEucSkgfHwgKGIucyAtIGEucykgfHwgKGEubyAtIGIubykgfHwgKGEuaSAtIGIuaSkgfHwgMDtcbn1cblxuLyoqXG4gKiBHZXQgZnVsbCBlbmNvZGluZyBzdHJpbmcuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEZ1bGxFbmNvZGluZyhzcGVjKSB7XG4gIHJldHVybiBzcGVjLmVuY29kaW5nO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgc3BlYyBoYXMgYW55IHF1YWxpdHkuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGlzUXVhbGl0eShzcGVjKSB7XG4gIHJldHVybiBzcGVjLnEgPiAwO1xufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL25lZ290aWF0b3IvbGliL2VuY29kaW5nLmpzXG4vLyBtb2R1bGUgaWQgPSAxNzdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBuZWdvdGlhdG9yXG4gKiBDb3B5cmlnaHQoYykgMjAxMiBJc2FhYyBaLiBTY2hsdWV0ZXJcbiAqIENvcHlyaWdodChjKSAyMDE0IEZlZGVyaWNvIFJvbWVyb1xuICogQ29weXJpZ2h0KGMpIDIwMTQtMjAxNSBEb3VnbGFzIENocmlzdG9waGVyIFdpbHNvblxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gcHJlZmVycmVkTGFuZ3VhZ2VzO1xubW9kdWxlLmV4cG9ydHMucHJlZmVycmVkTGFuZ3VhZ2VzID0gcHJlZmVycmVkTGFuZ3VhZ2VzO1xuXG4vKipcbiAqIE1vZHVsZSB2YXJpYWJsZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBzaW1wbGVMYW5ndWFnZVJlZ0V4cCA9IC9eXFxzKihbXlxcc1xcLTtdKykoPzotKFteXFxzO10rKSk/XFxzKig/OjsoLiopKT8kLztcblxuLyoqXG4gKiBQYXJzZSB0aGUgQWNjZXB0LUxhbmd1YWdlIGhlYWRlci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VBY2NlcHRMYW5ndWFnZShhY2NlcHQpIHtcbiAgdmFyIGFjY2VwdHMgPSBhY2NlcHQuc3BsaXQoJywnKTtcblxuICBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGkgPCBhY2NlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGxhbmdhdWdlID0gcGFyc2VMYW5ndWFnZShhY2NlcHRzW2ldLnRyaW0oKSwgaSk7XG5cbiAgICBpZiAobGFuZ2F1Z2UpIHtcbiAgICAgIGFjY2VwdHNbaisrXSA9IGxhbmdhdWdlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRyaW0gYWNjZXB0c1xuICBhY2NlcHRzLmxlbmd0aCA9IGo7XG5cbiAgcmV0dXJuIGFjY2VwdHM7XG59XG5cbi8qKlxuICogUGFyc2UgYSBsYW5ndWFnZSBmcm9tIHRoZSBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZUxhbmd1YWdlKHN0ciwgaSkge1xuICB2YXIgbWF0Y2ggPSBzaW1wbGVMYW5ndWFnZVJlZ0V4cC5leGVjKHN0cik7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIHZhciBwcmVmaXggPSBtYXRjaFsxXSxcbiAgICAgIHN1ZmZpeCA9IG1hdGNoWzJdLFxuICAgICAgZnVsbCA9IHByZWZpeDtcblxuICBpZiAoc3VmZml4KSBmdWxsICs9IFwiLVwiICsgc3VmZml4O1xuXG4gIHZhciBxID0gMTtcbiAgaWYgKG1hdGNoWzNdKSB7XG4gICAgdmFyIHBhcmFtcyA9IG1hdGNoWzNdLnNwbGl0KCc7JylcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkgKyspIHtcbiAgICAgIHZhciBwID0gcGFyYW1zW2ldLnNwbGl0KCc9Jyk7XG4gICAgICBpZiAocFswXSA9PT0gJ3EnKSBxID0gcGFyc2VGbG9hdChwWzFdKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHByZWZpeDogcHJlZml4LFxuICAgIHN1ZmZpeDogc3VmZml4LFxuICAgIHE6IHEsXG4gICAgaTogaSxcbiAgICBmdWxsOiBmdWxsXG4gIH07XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcmlvcml0eSBvZiBhIGxhbmd1YWdlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZVByaW9yaXR5KGxhbmd1YWdlLCBhY2NlcHRlZCwgaW5kZXgpIHtcbiAgdmFyIHByaW9yaXR5ID0ge286IC0xLCBxOiAwLCBzOiAwfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFjY2VwdGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNwZWMgPSBzcGVjaWZ5KGxhbmd1YWdlLCBhY2NlcHRlZFtpXSwgaW5kZXgpO1xuXG4gICAgaWYgKHNwZWMgJiYgKHByaW9yaXR5LnMgLSBzcGVjLnMgfHwgcHJpb3JpdHkucSAtIHNwZWMucSB8fCBwcmlvcml0eS5vIC0gc3BlYy5vKSA8IDApIHtcbiAgICAgIHByaW9yaXR5ID0gc3BlYztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcHJpb3JpdHk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBzcGVjaWZpY2l0eSBvZiB0aGUgbGFuZ3VhZ2UuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNwZWNpZnkobGFuZ3VhZ2UsIHNwZWMsIGluZGV4KSB7XG4gIHZhciBwID0gcGFyc2VMYW5ndWFnZShsYW5ndWFnZSlcbiAgaWYgKCFwKSByZXR1cm4gbnVsbDtcbiAgdmFyIHMgPSAwO1xuICBpZihzcGVjLmZ1bGwudG9Mb3dlckNhc2UoKSA9PT0gcC5mdWxsLnRvTG93ZXJDYXNlKCkpe1xuICAgIHMgfD0gNDtcbiAgfSBlbHNlIGlmIChzcGVjLnByZWZpeC50b0xvd2VyQ2FzZSgpID09PSBwLmZ1bGwudG9Mb3dlckNhc2UoKSkge1xuICAgIHMgfD0gMjtcbiAgfSBlbHNlIGlmIChzcGVjLmZ1bGwudG9Mb3dlckNhc2UoKSA9PT0gcC5wcmVmaXgudG9Mb3dlckNhc2UoKSkge1xuICAgIHMgfD0gMTtcbiAgfSBlbHNlIGlmIChzcGVjLmZ1bGwgIT09ICcqJyApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpOiBpbmRleCxcbiAgICBvOiBzcGVjLmksXG4gICAgcTogc3BlYy5xLFxuICAgIHM6IHNcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIHByZWZlcnJlZCBsYW5ndWFnZXMgZnJvbSBhbiBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyLlxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIHByZWZlcnJlZExhbmd1YWdlcyhhY2NlcHQsIHByb3ZpZGVkKSB7XG4gIC8vIFJGQyAyNjE2IHNlYyAxNC40OiBubyBoZWFkZXIgPSAqXG4gIHZhciBhY2NlcHRzID0gcGFyc2VBY2NlcHRMYW5ndWFnZShhY2NlcHQgPT09IHVuZGVmaW5lZCA/ICcqJyA6IGFjY2VwdCB8fCAnJyk7XG5cbiAgaWYgKCFwcm92aWRlZCkge1xuICAgIC8vIHNvcnRlZCBsaXN0IG9mIGFsbCBsYW5ndWFnZXNcbiAgICByZXR1cm4gYWNjZXB0c1xuICAgICAgLmZpbHRlcihpc1F1YWxpdHkpXG4gICAgICAuc29ydChjb21wYXJlU3BlY3MpXG4gICAgICAubWFwKGdldEZ1bGxMYW5ndWFnZSk7XG4gIH1cblxuICB2YXIgcHJpb3JpdGllcyA9IHByb3ZpZGVkLm1hcChmdW5jdGlvbiBnZXRQcmlvcml0eSh0eXBlLCBpbmRleCkge1xuICAgIHJldHVybiBnZXRMYW5ndWFnZVByaW9yaXR5KHR5cGUsIGFjY2VwdHMsIGluZGV4KTtcbiAgfSk7XG5cbiAgLy8gc29ydGVkIGxpc3Qgb2YgYWNjZXB0ZWQgbGFuZ3VhZ2VzXG4gIHJldHVybiBwcmlvcml0aWVzLmZpbHRlcihpc1F1YWxpdHkpLnNvcnQoY29tcGFyZVNwZWNzKS5tYXAoZnVuY3Rpb24gZ2V0TGFuZ3VhZ2UocHJpb3JpdHkpIHtcbiAgICByZXR1cm4gcHJvdmlkZWRbcHJpb3JpdGllcy5pbmRleE9mKHByaW9yaXR5KV07XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbXBhcmUgdHdvIHNwZWNzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb21wYXJlU3BlY3MoYSwgYikge1xuICByZXR1cm4gKGIucSAtIGEucSkgfHwgKGIucyAtIGEucykgfHwgKGEubyAtIGIubykgfHwgKGEuaSAtIGIuaSkgfHwgMDtcbn1cblxuLyoqXG4gKiBHZXQgZnVsbCBsYW5ndWFnZSBzdHJpbmcuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEZ1bGxMYW5ndWFnZShzcGVjKSB7XG4gIHJldHVybiBzcGVjLmZ1bGw7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBzcGVjIGhhcyBhbnkgcXVhbGl0eS5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gaXNRdWFsaXR5KHNwZWMpIHtcbiAgcmV0dXJuIHNwZWMucSA+IDA7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvbmVnb3RpYXRvci9saWIvbGFuZ3VhZ2UuanNcbi8vIG1vZHVsZSBpZCA9IDE3OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvKipcbiAqIG5lZ290aWF0b3JcbiAqIENvcHlyaWdodChjKSAyMDEyIElzYWFjIFouIFNjaGx1ZXRlclxuICogQ29weXJpZ2h0KGMpIDIwMTQgRmVkZXJpY28gUm9tZXJvXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBwcmVmZXJyZWRNZWRpYVR5cGVzO1xubW9kdWxlLmV4cG9ydHMucHJlZmVycmVkTWVkaWFUeXBlcyA9IHByZWZlcnJlZE1lZGlhVHlwZXM7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIHNpbXBsZU1lZGlhVHlwZVJlZ0V4cCA9IC9eXFxzKihbXlxcc1xcLztdKylcXC8oW147XFxzXSspXFxzKig/OjsoLiopKT8kLztcblxuLyoqXG4gKiBQYXJzZSB0aGUgQWNjZXB0IGhlYWRlci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VBY2NlcHQoYWNjZXB0KSB7XG4gIHZhciBhY2NlcHRzID0gc3BsaXRNZWRpYVR5cGVzKGFjY2VwdCk7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgYWNjZXB0cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtZWRpYVR5cGUgPSBwYXJzZU1lZGlhVHlwZShhY2NlcHRzW2ldLnRyaW0oKSwgaSk7XG5cbiAgICBpZiAobWVkaWFUeXBlKSB7XG4gICAgICBhY2NlcHRzW2orK10gPSBtZWRpYVR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gdHJpbSBhY2NlcHRzXG4gIGFjY2VwdHMubGVuZ3RoID0gajtcblxuICByZXR1cm4gYWNjZXB0cztcbn1cblxuLyoqXG4gKiBQYXJzZSBhIG1lZGlhIHR5cGUgZnJvbSB0aGUgQWNjZXB0IGhlYWRlci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2VNZWRpYVR5cGUoc3RyLCBpKSB7XG4gIHZhciBtYXRjaCA9IHNpbXBsZU1lZGlhVHlwZVJlZ0V4cC5leGVjKHN0cik7XG4gIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuXG4gIHZhciBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2YXIgcSA9IDE7XG4gIHZhciBzdWJ0eXBlID0gbWF0Y2hbMl07XG4gIHZhciB0eXBlID0gbWF0Y2hbMV07XG5cbiAgaWYgKG1hdGNoWzNdKSB7XG4gICAgdmFyIGt2cHMgPSBzcGxpdFBhcmFtZXRlcnMobWF0Y2hbM10pLm1hcChzcGxpdEtleVZhbHVlUGFpcik7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGt2cHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBwYWlyID0ga3Zwc1tqXTtcbiAgICAgIHZhciBrZXkgPSBwYWlyWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgdmFsID0gcGFpclsxXTtcblxuICAgICAgLy8gZ2V0IHRoZSB2YWx1ZSwgdW53cmFwcGluZyBxdW90ZXNcbiAgICAgIHZhciB2YWx1ZSA9IHZhbCAmJiB2YWxbMF0gPT09ICdcIicgJiYgdmFsW3ZhbC5sZW5ndGggLSAxXSA9PT0gJ1wiJ1xuICAgICAgICA/IHZhbC5zdWJzdHIoMSwgdmFsLmxlbmd0aCAtIDIpXG4gICAgICAgIDogdmFsO1xuXG4gICAgICBpZiAoa2V5ID09PSAncScpIHtcbiAgICAgICAgcSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gc3RvcmUgcGFyYW1ldGVyXG4gICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdHlwZTogdHlwZSxcbiAgICBzdWJ0eXBlOiBzdWJ0eXBlLFxuICAgIHBhcmFtczogcGFyYW1zLFxuICAgIHE6IHEsXG4gICAgaTogaVxuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHJpb3JpdHkgb2YgYSBtZWRpYSB0eXBlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRNZWRpYVR5cGVQcmlvcml0eSh0eXBlLCBhY2NlcHRlZCwgaW5kZXgpIHtcbiAgdmFyIHByaW9yaXR5ID0ge286IC0xLCBxOiAwLCBzOiAwfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFjY2VwdGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNwZWMgPSBzcGVjaWZ5KHR5cGUsIGFjY2VwdGVkW2ldLCBpbmRleCk7XG5cbiAgICBpZiAoc3BlYyAmJiAocHJpb3JpdHkucyAtIHNwZWMucyB8fCBwcmlvcml0eS5xIC0gc3BlYy5xIHx8IHByaW9yaXR5Lm8gLSBzcGVjLm8pIDwgMCkge1xuICAgICAgcHJpb3JpdHkgPSBzcGVjO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcmlvcml0eTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHNwZWNpZmljaXR5IG9mIHRoZSBtZWRpYSB0eXBlLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzcGVjaWZ5KHR5cGUsIHNwZWMsIGluZGV4KSB7XG4gIHZhciBwID0gcGFyc2VNZWRpYVR5cGUodHlwZSk7XG4gIHZhciBzID0gMDtcblxuICBpZiAoIXApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmKHNwZWMudHlwZS50b0xvd2VyQ2FzZSgpID09IHAudHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcyB8PSA0XG4gIH0gZWxzZSBpZihzcGVjLnR5cGUgIT0gJyonKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZihzcGVjLnN1YnR5cGUudG9Mb3dlckNhc2UoKSA9PSBwLnN1YnR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgIHMgfD0gMlxuICB9IGVsc2UgaWYoc3BlYy5zdWJ0eXBlICE9ICcqJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzcGVjLnBhcmFtcyk7XG4gIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoa2V5cy5ldmVyeShmdW5jdGlvbiAoaykge1xuICAgICAgcmV0dXJuIHNwZWMucGFyYW1zW2tdID09ICcqJyB8fCAoc3BlYy5wYXJhbXNba10gfHwgJycpLnRvTG93ZXJDYXNlKCkgPT0gKHAucGFyYW1zW2tdIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIH0pKSB7XG4gICAgICBzIHw9IDFcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGk6IGluZGV4LFxuICAgIG86IHNwZWMuaSxcbiAgICBxOiBzcGVjLnEsXG4gICAgczogcyxcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgcHJlZmVycmVkIG1lZGlhIHR5cGVzIGZyb20gYW4gQWNjZXB0IGhlYWRlci5cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwcmVmZXJyZWRNZWRpYVR5cGVzKGFjY2VwdCwgcHJvdmlkZWQpIHtcbiAgLy8gUkZDIDI2MTYgc2VjIDE0LjI6IG5vIGhlYWRlciA9ICovKlxuICB2YXIgYWNjZXB0cyA9IHBhcnNlQWNjZXB0KGFjY2VwdCA9PT0gdW5kZWZpbmVkID8gJyovKicgOiBhY2NlcHQgfHwgJycpO1xuXG4gIGlmICghcHJvdmlkZWQpIHtcbiAgICAvLyBzb3J0ZWQgbGlzdCBvZiBhbGwgdHlwZXNcbiAgICByZXR1cm4gYWNjZXB0c1xuICAgICAgLmZpbHRlcihpc1F1YWxpdHkpXG4gICAgICAuc29ydChjb21wYXJlU3BlY3MpXG4gICAgICAubWFwKGdldEZ1bGxUeXBlKTtcbiAgfVxuXG4gIHZhciBwcmlvcml0aWVzID0gcHJvdmlkZWQubWFwKGZ1bmN0aW9uIGdldFByaW9yaXR5KHR5cGUsIGluZGV4KSB7XG4gICAgcmV0dXJuIGdldE1lZGlhVHlwZVByaW9yaXR5KHR5cGUsIGFjY2VwdHMsIGluZGV4KTtcbiAgfSk7XG5cbiAgLy8gc29ydGVkIGxpc3Qgb2YgYWNjZXB0ZWQgdHlwZXNcbiAgcmV0dXJuIHByaW9yaXRpZXMuZmlsdGVyKGlzUXVhbGl0eSkuc29ydChjb21wYXJlU3BlY3MpLm1hcChmdW5jdGlvbiBnZXRUeXBlKHByaW9yaXR5KSB7XG4gICAgcmV0dXJuIHByb3ZpZGVkW3ByaW9yaXRpZXMuaW5kZXhPZihwcmlvcml0eSldO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb21wYXJlIHR3byBzcGVjcy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY29tcGFyZVNwZWNzKGEsIGIpIHtcbiAgcmV0dXJuIChiLnEgLSBhLnEpIHx8IChiLnMgLSBhLnMpIHx8IChhLm8gLSBiLm8pIHx8IChhLmkgLSBiLmkpIHx8IDA7XG59XG5cbi8qKlxuICogR2V0IGZ1bGwgdHlwZSBzdHJpbmcuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGdldEZ1bGxUeXBlKHNwZWMpIHtcbiAgcmV0dXJuIHNwZWMudHlwZSArICcvJyArIHNwZWMuc3VidHlwZTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHNwZWMgaGFzIGFueSBxdWFsaXR5LlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc1F1YWxpdHkoc3BlYykge1xuICByZXR1cm4gc3BlYy5xID4gMDtcbn1cblxuLyoqXG4gKiBDb3VudCB0aGUgbnVtYmVyIG9mIHF1b3RlcyBpbiBhIHN0cmluZy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcXVvdGVDb3VudChzdHJpbmcpIHtcbiAgdmFyIGNvdW50ID0gMDtcbiAgdmFyIGluZGV4ID0gMDtcblxuICB3aGlsZSAoKGluZGV4ID0gc3RyaW5nLmluZGV4T2YoJ1wiJywgaW5kZXgpKSAhPT0gLTEpIHtcbiAgICBjb3VudCsrO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICByZXR1cm4gY291bnQ7XG59XG5cbi8qKlxuICogU3BsaXQgYSBrZXkgdmFsdWUgcGFpci5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc3BsaXRLZXlWYWx1ZVBhaXIoc3RyKSB7XG4gIHZhciBpbmRleCA9IHN0ci5pbmRleE9mKCc9Jyk7XG4gIHZhciBrZXk7XG4gIHZhciB2YWw7XG5cbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIGtleSA9IHN0cjtcbiAgfSBlbHNlIHtcbiAgICBrZXkgPSBzdHIuc3Vic3RyKDAsIGluZGV4KTtcbiAgICB2YWwgPSBzdHIuc3Vic3RyKGluZGV4ICsgMSk7XG4gIH1cblxuICByZXR1cm4gW2tleSwgdmFsXTtcbn1cblxuLyoqXG4gKiBTcGxpdCBhbiBBY2NlcHQgaGVhZGVyIGludG8gbWVkaWEgdHlwZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNwbGl0TWVkaWFUeXBlcyhhY2NlcHQpIHtcbiAgdmFyIGFjY2VwdHMgPSBhY2NlcHQuc3BsaXQoJywnKTtcblxuICBmb3IgKHZhciBpID0gMSwgaiA9IDA7IGkgPCBhY2NlcHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHF1b3RlQ291bnQoYWNjZXB0c1tqXSkgJSAyID09IDApIHtcbiAgICAgIGFjY2VwdHNbKytqXSA9IGFjY2VwdHNbaV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjY2VwdHNbal0gKz0gJywnICsgYWNjZXB0c1tpXTtcbiAgICB9XG4gIH1cblxuICAvLyB0cmltIGFjY2VwdHNcbiAgYWNjZXB0cy5sZW5ndGggPSBqICsgMTtcblxuICByZXR1cm4gYWNjZXB0cztcbn1cblxuLyoqXG4gKiBTcGxpdCBhIHN0cmluZyBvZiBwYXJhbWV0ZXJzLlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBzcGxpdFBhcmFtZXRlcnMoc3RyKSB7XG4gIHZhciBwYXJhbWV0ZXJzID0gc3RyLnNwbGl0KCc7Jyk7XG5cbiAgZm9yICh2YXIgaSA9IDEsIGogPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChxdW90ZUNvdW50KHBhcmFtZXRlcnNbal0pICUgMiA9PSAwKSB7XG4gICAgICBwYXJhbWV0ZXJzWysral0gPSBwYXJhbWV0ZXJzW2ldO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbWV0ZXJzW2pdICs9ICc7JyArIHBhcmFtZXRlcnNbaV07XG4gICAgfVxuICB9XG5cbiAgLy8gdHJpbSBwYXJhbWV0ZXJzXG4gIHBhcmFtZXRlcnMubGVuZ3RoID0gaiArIDE7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGFyYW1ldGVyc1tpXSA9IHBhcmFtZXRlcnNbaV0udHJpbSgpO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtZXRlcnM7XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvbmVnb3RpYXRvci9saWIvbWVkaWFUeXBlLmpzXG4vLyBtb2R1bGUgaWQgPSAxNzlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBleHByZXNzXG4gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG52YXIgY29udGVudERpc3Bvc2l0aW9uID0gcmVxdWlyZSgnY29udGVudC1kaXNwb3NpdGlvbicpO1xudmFyIGRlcHJlY2F0ZSA9IHJlcXVpcmUoJ2RlcGQnKSgnZXhwcmVzcycpO1xudmFyIGVuY29kZVVybCA9IHJlcXVpcmUoJ2VuY29kZXVybCcpO1xudmFyIGVzY2FwZUh0bWwgPSByZXF1aXJlKCdlc2NhcGUtaHRtbCcpO1xudmFyIGh0dHAgPSByZXF1aXJlKCdodHRwJyk7XG52YXIgaXNBYnNvbHV0ZSA9IHJlcXVpcmUoJy4vdXRpbHMnKS5pc0Fic29sdXRlO1xudmFyIG9uRmluaXNoZWQgPSByZXF1aXJlKCdvbi1maW5pc2hlZCcpO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgc3RhdHVzZXMgPSByZXF1aXJlKCdzdGF0dXNlcycpXG52YXIgbWVyZ2UgPSByZXF1aXJlKCd1dGlscy1tZXJnZScpO1xudmFyIHNpZ24gPSByZXF1aXJlKCdjb29raWUtc2lnbmF0dXJlJykuc2lnbjtcbnZhciBub3JtYWxpemVUeXBlID0gcmVxdWlyZSgnLi91dGlscycpLm5vcm1hbGl6ZVR5cGU7XG52YXIgbm9ybWFsaXplVHlwZXMgPSByZXF1aXJlKCcuL3V0aWxzJykubm9ybWFsaXplVHlwZXM7XG52YXIgc2V0Q2hhcnNldCA9IHJlcXVpcmUoJy4vdXRpbHMnKS5zZXRDaGFyc2V0O1xudmFyIGNvb2tpZSA9IHJlcXVpcmUoJ2Nvb2tpZScpO1xudmFyIHNlbmQgPSByZXF1aXJlKCdzZW5kJyk7XG52YXIgZXh0bmFtZSA9IHBhdGguZXh0bmFtZTtcbnZhciBtaW1lID0gc2VuZC5taW1lO1xudmFyIHJlc29sdmUgPSBwYXRoLnJlc29sdmU7XG52YXIgdmFyeSA9IHJlcXVpcmUoJ3ZhcnknKTtcblxuLyoqXG4gKiBSZXNwb25zZSBwcm90b3R5cGUuXG4gKiBAcHVibGljXG4gKi9cblxudmFyIHJlcyA9IE9iamVjdC5jcmVhdGUoaHR0cC5TZXJ2ZXJSZXNwb25zZS5wcm90b3R5cGUpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSByZXNcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgY2hhcnNldFJlZ0V4cCA9IC87XFxzKmNoYXJzZXRcXHMqPS87XG5cbi8qKlxuICogU2V0IHN0YXR1cyBgY29kZWAuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGNvZGVcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfVxuICogQHB1YmxpY1xuICovXG5cbnJlcy5zdGF0dXMgPSBmdW5jdGlvbiBzdGF0dXMoY29kZSkge1xuICB0aGlzLnN0YXR1c0NvZGUgPSBjb2RlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IExpbmsgaGVhZGVyIGZpZWxkIHdpdGggdGhlIGdpdmVuIGBsaW5rc2AuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgcmVzLmxpbmtzKHtcbiAqICAgICAgbmV4dDogJ2h0dHA6Ly9hcGkuZXhhbXBsZS5jb20vdXNlcnM/cGFnZT0yJyxcbiAqICAgICAgbGFzdDogJ2h0dHA6Ly9hcGkuZXhhbXBsZS5jb20vdXNlcnM/cGFnZT01J1xuICogICAgfSk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGxpbmtzXG4gKiBAcmV0dXJuIHtTZXJ2ZXJSZXNwb25zZX1cbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMubGlua3MgPSBmdW5jdGlvbihsaW5rcyl7XG4gIHZhciBsaW5rID0gdGhpcy5nZXQoJ0xpbmsnKSB8fCAnJztcbiAgaWYgKGxpbmspIGxpbmsgKz0gJywgJztcbiAgcmV0dXJuIHRoaXMuc2V0KCdMaW5rJywgbGluayArIE9iamVjdC5rZXlzKGxpbmtzKS5tYXAoZnVuY3Rpb24ocmVsKXtcbiAgICByZXR1cm4gJzwnICsgbGlua3NbcmVsXSArICc+OyByZWw9XCInICsgcmVsICsgJ1wiJztcbiAgfSkuam9pbignLCAnKSk7XG59O1xuXG4vKipcbiAqIFNlbmQgYSByZXNwb25zZS5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgcmVzLnNlbmQoQnVmZmVyLmZyb20oJ3dhaG9vJykpO1xuICogICAgIHJlcy5zZW5kKHsgc29tZTogJ2pzb24nIH0pO1xuICogICAgIHJlcy5zZW5kKCc8cD5zb21lIGh0bWw8L3A+Jyk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJvb2xlYW58b2JqZWN0fEJ1ZmZlcn0gYm9keVxuICogQHB1YmxpY1xuICovXG5cbnJlcy5zZW5kID0gZnVuY3Rpb24gc2VuZChib2R5KSB7XG4gIHZhciBjaHVuayA9IGJvZHk7XG4gIHZhciBlbmNvZGluZztcbiAgdmFyIHJlcSA9IHRoaXMucmVxO1xuICB2YXIgdHlwZTtcblxuICAvLyBzZXR0aW5nc1xuICB2YXIgYXBwID0gdGhpcy5hcHA7XG5cbiAgLy8gYWxsb3cgc3RhdHVzIC8gYm9keVxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIC8vIHJlcy5zZW5kKGJvZHksIHN0YXR1cykgYmFja3dhcmRzIGNvbXBhdFxuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYXJndW1lbnRzWzFdID09PSAnbnVtYmVyJykge1xuICAgICAgZGVwcmVjYXRlKCdyZXMuc2VuZChib2R5LCBzdGF0dXMpOiBVc2UgcmVzLnN0YXR1cyhzdGF0dXMpLnNlbmQoYm9keSkgaW5zdGVhZCcpO1xuICAgICAgdGhpcy5zdGF0dXNDb2RlID0gYXJndW1lbnRzWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXByZWNhdGUoJ3Jlcy5zZW5kKHN0YXR1cywgYm9keSk6IFVzZSByZXMuc3RhdHVzKHN0YXR1cykuc2VuZChib2R5KSBpbnN0ZWFkJyk7XG4gICAgICB0aGlzLnN0YXR1c0NvZGUgPSBhcmd1bWVudHNbMF07XG4gICAgICBjaHVuayA9IGFyZ3VtZW50c1sxXTtcbiAgICB9XG4gIH1cblxuICAvLyBkaXNhbWJpZ3VhdGUgcmVzLnNlbmQoc3RhdHVzKSBhbmQgcmVzLnNlbmQoc3RhdHVzLCBudW0pXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdudW1iZXInICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyByZXMuc2VuZChzdGF0dXMpIHdpbGwgc2V0IHN0YXR1cyBtZXNzYWdlIGFzIHRleHQgc3RyaW5nXG4gICAgaWYgKCF0aGlzLmdldCgnQ29udGVudC1UeXBlJykpIHtcbiAgICAgIHRoaXMudHlwZSgndHh0Jyk7XG4gICAgfVxuXG4gICAgZGVwcmVjYXRlKCdyZXMuc2VuZChzdGF0dXMpOiBVc2UgcmVzLnNlbmRTdGF0dXMoc3RhdHVzKSBpbnN0ZWFkJyk7XG4gICAgdGhpcy5zdGF0dXNDb2RlID0gY2h1bms7XG4gICAgY2h1bmsgPSBzdGF0dXNlc1tjaHVua11cbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mIGNodW5rKSB7XG4gICAgLy8gc3RyaW5nIGRlZmF1bHRpbmcgdG8gaHRtbFxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBpZiAoIXRoaXMuZ2V0KCdDb250ZW50LVR5cGUnKSkge1xuICAgICAgICB0aGlzLnR5cGUoJ2h0bWwnKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGlmIChjaHVuayA9PT0gbnVsbCkge1xuICAgICAgICBjaHVuayA9ICcnO1xuICAgICAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSB7XG4gICAgICAgIGlmICghdGhpcy5nZXQoJ0NvbnRlbnQtVHlwZScpKSB7XG4gICAgICAgICAgdGhpcy50eXBlKCdiaW4nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuanNvbihjaHVuayk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuXG4gIC8vIHdyaXRlIHN0cmluZ3MgaW4gdXRmLThcbiAgaWYgKHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4JztcbiAgICB0eXBlID0gdGhpcy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuXG4gICAgLy8gcmVmbGVjdCB0aGlzIGluIGNvbnRlbnQtdHlwZVxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuc2V0KCdDb250ZW50LVR5cGUnLCBzZXRDaGFyc2V0KHR5cGUsICd1dGYtOCcpKTtcbiAgICB9XG4gIH1cblxuICAvLyBkZXRlcm1pbmUgaWYgRVRhZyBzaG91bGQgYmUgZ2VuZXJhdGVkXG4gIHZhciBldGFnRm4gPSBhcHAuZ2V0KCdldGFnIGZuJylcbiAgdmFyIGdlbmVyYXRlRVRhZyA9ICF0aGlzLmdldCgnRVRhZycpICYmIHR5cGVvZiBldGFnRm4gPT09ICdmdW5jdGlvbidcblxuICAvLyBwb3B1bGF0ZSBDb250ZW50LUxlbmd0aFxuICB2YXIgbGVuXG4gIGlmIChjaHVuayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjaHVuaykpIHtcbiAgICAgIC8vIGdldCBsZW5ndGggb2YgQnVmZmVyXG4gICAgICBsZW4gPSBjaHVuay5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKCFnZW5lcmF0ZUVUYWcgJiYgY2h1bmsubGVuZ3RoIDwgMTAwMCkge1xuICAgICAgLy8ganVzdCBjYWxjdWxhdGUgbGVuZ3RoIHdoZW4gbm8gRVRhZyArIHNtYWxsIGNodW5rXG4gICAgICBsZW4gPSBCdWZmZXIuYnl0ZUxlbmd0aChjaHVuaywgZW5jb2RpbmcpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnZlcnQgY2h1bmsgdG8gQnVmZmVyIGFuZCBjYWxjdWxhdGVcbiAgICAgIGNodW5rID0gQnVmZmVyLmZyb20oY2h1bmssIGVuY29kaW5nKVxuICAgICAgZW5jb2RpbmcgPSB1bmRlZmluZWQ7XG4gICAgICBsZW4gPSBjaHVuay5sZW5ndGhcbiAgICB9XG5cbiAgICB0aGlzLnNldCgnQ29udGVudC1MZW5ndGgnLCBsZW4pO1xuICB9XG5cbiAgLy8gcG9wdWxhdGUgRVRhZ1xuICB2YXIgZXRhZztcbiAgaWYgKGdlbmVyYXRlRVRhZyAmJiBsZW4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICgoZXRhZyA9IGV0YWdGbihjaHVuaywgZW5jb2RpbmcpKSkge1xuICAgICAgdGhpcy5zZXQoJ0VUYWcnLCBldGFnKTtcbiAgICB9XG4gIH1cblxuICAvLyBmcmVzaG5lc3NcbiAgaWYgKHJlcS5mcmVzaCkgdGhpcy5zdGF0dXNDb2RlID0gMzA0O1xuXG4gIC8vIHN0cmlwIGlycmVsZXZhbnQgaGVhZGVyc1xuICBpZiAoMjA0ID09PSB0aGlzLnN0YXR1c0NvZGUgfHwgMzA0ID09PSB0aGlzLnN0YXR1c0NvZGUpIHtcbiAgICB0aGlzLnJlbW92ZUhlYWRlcignQ29udGVudC1UeXBlJyk7XG4gICAgdGhpcy5yZW1vdmVIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJyk7XG4gICAgdGhpcy5yZW1vdmVIZWFkZXIoJ1RyYW5zZmVyLUVuY29kaW5nJyk7XG4gICAgY2h1bmsgPSAnJztcbiAgfVxuXG4gIGlmIChyZXEubWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICAvLyBza2lwIGJvZHkgZm9yIEhFQURcbiAgICB0aGlzLmVuZCgpO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlc3BvbmRcbiAgICB0aGlzLmVuZChjaHVuaywgZW5jb2RpbmcpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNlbmQgSlNPTiByZXNwb25zZS5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgcmVzLmpzb24obnVsbCk7XG4gKiAgICAgcmVzLmpzb24oeyB1c2VyOiAndGonIH0pO1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxib29sZWFufG9iamVjdH0gb2JqXG4gKiBAcHVibGljXG4gKi9cblxucmVzLmpzb24gPSBmdW5jdGlvbiBqc29uKG9iaikge1xuICB2YXIgdmFsID0gb2JqO1xuXG4gIC8vIGFsbG93IHN0YXR1cyAvIGJvZHlcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAvLyByZXMuanNvbihib2R5LCBzdGF0dXMpIGJhY2t3YXJkcyBjb21wYXRcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGRlcHJlY2F0ZSgncmVzLmpzb24ob2JqLCBzdGF0dXMpOiBVc2UgcmVzLnN0YXR1cyhzdGF0dXMpLmpzb24ob2JqKSBpbnN0ZWFkJyk7XG4gICAgICB0aGlzLnN0YXR1c0NvZGUgPSBhcmd1bWVudHNbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlcHJlY2F0ZSgncmVzLmpzb24oc3RhdHVzLCBvYmopOiBVc2UgcmVzLnN0YXR1cyhzdGF0dXMpLmpzb24ob2JqKSBpbnN0ZWFkJyk7XG4gICAgICB0aGlzLnN0YXR1c0NvZGUgPSBhcmd1bWVudHNbMF07XG4gICAgICB2YWwgPSBhcmd1bWVudHNbMV07XG4gICAgfVxuICB9XG5cbiAgLy8gc2V0dGluZ3NcbiAgdmFyIGFwcCA9IHRoaXMuYXBwO1xuICB2YXIgZXNjYXBlID0gYXBwLmdldCgnanNvbiBlc2NhcGUnKVxuICB2YXIgcmVwbGFjZXIgPSBhcHAuZ2V0KCdqc29uIHJlcGxhY2VyJyk7XG4gIHZhciBzcGFjZXMgPSBhcHAuZ2V0KCdqc29uIHNwYWNlcycpO1xuICB2YXIgYm9keSA9IHN0cmluZ2lmeSh2YWwsIHJlcGxhY2VyLCBzcGFjZXMsIGVzY2FwZSlcblxuICAvLyBjb250ZW50LXR5cGVcbiAgaWYgKCF0aGlzLmdldCgnQ29udGVudC1UeXBlJykpIHtcbiAgICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLnNlbmQoYm9keSk7XG59O1xuXG4vKipcbiAqIFNlbmQgSlNPTiByZXNwb25zZSB3aXRoIEpTT05QIGNhbGxiYWNrIHN1cHBvcnQuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgIHJlcy5qc29ucChudWxsKTtcbiAqICAgICByZXMuanNvbnAoeyB1c2VyOiAndGonIH0pO1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxib29sZWFufG9iamVjdH0gb2JqXG4gKiBAcHVibGljXG4gKi9cblxucmVzLmpzb25wID0gZnVuY3Rpb24ganNvbnAob2JqKSB7XG4gIHZhciB2YWwgPSBvYmo7XG5cbiAgLy8gYWxsb3cgc3RhdHVzIC8gYm9keVxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIC8vIHJlcy5qc29uKGJvZHksIHN0YXR1cykgYmFja3dhcmRzIGNvbXBhdFxuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdID09PSAnbnVtYmVyJykge1xuICAgICAgZGVwcmVjYXRlKCdyZXMuanNvbnAob2JqLCBzdGF0dXMpOiBVc2UgcmVzLnN0YXR1cyhzdGF0dXMpLmpzb24ob2JqKSBpbnN0ZWFkJyk7XG4gICAgICB0aGlzLnN0YXR1c0NvZGUgPSBhcmd1bWVudHNbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlcHJlY2F0ZSgncmVzLmpzb25wKHN0YXR1cywgb2JqKTogVXNlIHJlcy5zdGF0dXMoc3RhdHVzKS5qc29ucChvYmopIGluc3RlYWQnKTtcbiAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgIHZhbCA9IGFyZ3VtZW50c1sxXTtcbiAgICB9XG4gIH1cblxuICAvLyBzZXR0aW5nc1xuICB2YXIgYXBwID0gdGhpcy5hcHA7XG4gIHZhciBlc2NhcGUgPSBhcHAuZ2V0KCdqc29uIGVzY2FwZScpXG4gIHZhciByZXBsYWNlciA9IGFwcC5nZXQoJ2pzb24gcmVwbGFjZXInKTtcbiAgdmFyIHNwYWNlcyA9IGFwcC5nZXQoJ2pzb24gc3BhY2VzJyk7XG4gIHZhciBib2R5ID0gc3RyaW5naWZ5KHZhbCwgcmVwbGFjZXIsIHNwYWNlcywgZXNjYXBlKVxuICB2YXIgY2FsbGJhY2sgPSB0aGlzLnJlcS5xdWVyeVthcHAuZ2V0KCdqc29ucCBjYWxsYmFjayBuYW1lJyldO1xuXG4gIC8vIGNvbnRlbnQtdHlwZVxuICBpZiAoIXRoaXMuZ2V0KCdDb250ZW50LVR5cGUnKSkge1xuICAgIHRoaXMuc2V0KCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJywgJ25vc25pZmYnKTtcbiAgICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgfVxuXG4gIC8vIGZpeHVwIGNhbGxiYWNrXG4gIGlmIChBcnJheS5pc0FycmF5KGNhbGxiYWNrKSkge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2tbMF07XG4gIH1cblxuICAvLyBqc29ucFxuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnc3RyaW5nJyAmJiBjYWxsYmFjay5sZW5ndGggIT09IDApIHtcbiAgICB0aGlzLnNldCgnWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJyk7XG4gICAgdGhpcy5zZXQoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTtcblxuICAgIC8vIHJlc3RyaWN0IGNhbGxiYWNrIGNoYXJzZXRcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrLnJlcGxhY2UoL1teXFxbXFxdXFx3JC5dL2csICcnKTtcblxuICAgIC8vIHJlcGxhY2UgY2hhcnMgbm90IGFsbG93ZWQgaW4gSmF2YVNjcmlwdCB0aGF0IGFyZSBpbiBKU09OXG4gICAgYm9keSA9IGJvZHlcbiAgICAgIC5yZXBsYWNlKC9cXHUyMDI4L2csICdcXFxcdTIwMjgnKVxuICAgICAgLnJlcGxhY2UoL1xcdTIwMjkvZywgJ1xcXFx1MjAyOScpO1xuXG4gICAgLy8gdGhlIC8qKi8gaXMgYSBzcGVjaWZpYyBzZWN1cml0eSBtaXRpZ2F0aW9uIGZvciBcIlJvc2V0dGEgRmxhc2ggSlNPTlAgYWJ1c2VcIlxuICAgIC8vIHRoZSB0eXBlb2YgY2hlY2sgaXMganVzdCB0byByZWR1Y2UgY2xpZW50IGVycm9yIG5vaXNlXG4gICAgYm9keSA9ICcvKiovIHR5cGVvZiAnICsgY2FsbGJhY2sgKyAnID09PSBcXCdmdW5jdGlvblxcJyAmJiAnICsgY2FsbGJhY2sgKyAnKCcgKyBib2R5ICsgJyk7JztcbiAgfVxuXG4gIHJldHVybiB0aGlzLnNlbmQoYm9keSk7XG59O1xuXG4vKipcbiAqIFNlbmQgZ2l2ZW4gSFRUUCBzdGF0dXMgY29kZS5cbiAqXG4gKiBTZXRzIHRoZSByZXNwb25zZSBzdGF0dXMgdG8gYHN0YXR1c0NvZGVgIGFuZCB0aGUgYm9keSBvZiB0aGVcbiAqIHJlc3BvbnNlIHRvIHRoZSBzdGFuZGFyZCBkZXNjcmlwdGlvbiBmcm9tIG5vZGUncyBodHRwLlNUQVRVU19DT0RFU1xuICogb3IgdGhlIHN0YXR1c0NvZGUgbnVtYmVyIGlmIG5vIGRlc2NyaXB0aW9uLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICByZXMuc2VuZFN0YXR1cygyMDApO1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNDb2RlXG4gKiBAcHVibGljXG4gKi9cblxucmVzLnNlbmRTdGF0dXMgPSBmdW5jdGlvbiBzZW5kU3RhdHVzKHN0YXR1c0NvZGUpIHtcbiAgdmFyIGJvZHkgPSBzdGF0dXNlc1tzdGF0dXNDb2RlXSB8fCBTdHJpbmcoc3RhdHVzQ29kZSlcblxuICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICB0aGlzLnR5cGUoJ3R4dCcpO1xuXG4gIHJldHVybiB0aGlzLnNlbmQoYm9keSk7XG59O1xuXG4vKipcbiAqIFRyYW5zZmVyIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBgcGF0aGAuXG4gKlxuICogQXV0b21hdGljYWxseSBzZXRzIHRoZSBfQ29udGVudC1UeXBlXyByZXNwb25zZSBoZWFkZXIgZmllbGQuXG4gKiBUaGUgY2FsbGJhY2sgYGNhbGxiYWNrKGVycilgIGlzIGludm9rZWQgd2hlbiB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGVcbiAqIG9yIHdoZW4gYW4gZXJyb3Igb2NjdXJzLiBCZSBzdXJlIHRvIGNoZWNrIGByZXMuc2VudEhlYWRlcmBcbiAqIGlmIHlvdSB3aXNoIHRvIGF0dGVtcHQgcmVzcG9uZGluZywgYXMgdGhlIGhlYWRlciBhbmQgc29tZSBkYXRhXG4gKiBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gdHJhbnNmZXJyZWQuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgIC0gYG1heEFnZWAgICBkZWZhdWx0aW5nIHRvIDAgKGNhbiBiZSBzdHJpbmcgY29udmVydGVkIGJ5IGBtc2ApXG4gKiAgIC0gYHJvb3RgICAgICByb290IGRpcmVjdG9yeSBmb3IgcmVsYXRpdmUgZmlsZW5hbWVzXG4gKiAgIC0gYGhlYWRlcnNgICBvYmplY3Qgb2YgaGVhZGVycyB0byBzZXJ2ZSB3aXRoIGZpbGVcbiAqICAgLSBgZG90ZmlsZXNgIHNlcnZlIGRvdGZpbGVzLCBkZWZhdWx0aW5nIHRvIGZhbHNlOyBjYW4gYmUgYFwiYWxsb3dcImAgdG8gc2VuZCB0aGVtXG4gKlxuICogT3RoZXIgb3B0aW9ucyBhcmUgcGFzc2VkIGFsb25nIHRvIGBzZW5kYC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGhvdyBgcmVzLnNlbmRGaWxlKClgIG1heVxuICogIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgZm9yIHRoZSBgc3RhdGljKClgIG1pZGRsZXdhcmUgZm9yXG4gKiAgZHluYW1pYyBzaXR1YXRpb25zLiBUaGUgY29kZSBiYWNraW5nIGByZXMuc2VuZEZpbGUoKWAgaXMgYWN0dWFsbHlcbiAqICB0aGUgc2FtZSBjb2RlLCBzbyBIVFRQIGNhY2hlIHN1cHBvcnQgZXRjIGlzIGlkZW50aWNhbC5cbiAqXG4gKiAgICAgYXBwLmdldCgnL3VzZXIvOnVpZC9waG90b3MvOmZpbGUnLCBmdW5jdGlvbihyZXEsIHJlcyl7XG4gKiAgICAgICB2YXIgdWlkID0gcmVxLnBhcmFtcy51aWRcbiAqICAgICAgICAgLCBmaWxlID0gcmVxLnBhcmFtcy5maWxlO1xuICpcbiAqICAgICAgIHJlcS51c2VyLm1heVZpZXdGaWxlc0Zyb20odWlkLCBmdW5jdGlvbih5ZXMpe1xuICogICAgICAgICBpZiAoeWVzKSB7XG4gKiAgICAgICAgICAgcmVzLnNlbmRGaWxlKCcvdXBsb2Fkcy8nICsgdWlkICsgJy8nICsgZmlsZSk7XG4gKiAgICAgICAgIH0gZWxzZSB7XG4gKiAgICAgICAgICAgcmVzLnNlbmQoNDAzLCAnU29ycnkhIHlvdSBjYW50IHNlZSB0aGF0LicpO1xuICogICAgICAgICB9XG4gKiAgICAgICB9KTtcbiAqICAgICB9KTtcbiAqXG4gKiBAcHVibGljXG4gKi9cblxucmVzLnNlbmRGaWxlID0gZnVuY3Rpb24gc2VuZEZpbGUocGF0aCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIGRvbmUgPSBjYWxsYmFjaztcbiAgdmFyIHJlcSA9IHRoaXMucmVxO1xuICB2YXIgcmVzID0gdGhpcztcbiAgdmFyIG5leHQgPSByZXEubmV4dDtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmICghcGF0aCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3BhdGggYXJndW1lbnQgaXMgcmVxdWlyZWQgdG8gcmVzLnNlbmRGaWxlJyk7XG4gIH1cblxuICAvLyBzdXBwb3J0IGZ1bmN0aW9uIGFzIHNlY29uZCBhcmdcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZG9uZSA9IG9wdGlvbnM7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgaWYgKCFvcHRzLnJvb3QgJiYgIWlzQWJzb2x1dGUocGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwYXRoIG11c3QgYmUgYWJzb2x1dGUgb3Igc3BlY2lmeSByb290IHRvIHJlcy5zZW5kRmlsZScpO1xuICB9XG5cbiAgLy8gY3JlYXRlIGZpbGUgc3RyZWFtXG4gIHZhciBwYXRobmFtZSA9IGVuY29kZVVSSShwYXRoKTtcbiAgdmFyIGZpbGUgPSBzZW5kKHJlcSwgcGF0aG5hbWUsIG9wdHMpO1xuXG4gIC8vIHRyYW5zZmVyXG4gIHNlbmRmaWxlKHJlcywgZmlsZSwgb3B0cywgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChkb25lKSByZXR1cm4gZG9uZShlcnIpO1xuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgPT09ICdFSVNESVInKSByZXR1cm4gbmV4dCgpO1xuXG4gICAgLy8gbmV4dCgpIGFsbCBidXQgd3JpdGUgZXJyb3JzXG4gICAgaWYgKGVyciAmJiBlcnIuY29kZSAhPT0gJ0VDT05OQUJPUlRFRCcgJiYgZXJyLnN5c2NhbGwgIT09ICd3cml0ZScpIHtcbiAgICAgIG5leHQoZXJyKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBUcmFuc2ZlciB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gYHBhdGhgLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgX0NvbnRlbnQtVHlwZV8gcmVzcG9uc2UgaGVhZGVyIGZpZWxkLlxuICogVGhlIGNhbGxiYWNrIGBjYWxsYmFjayhlcnIpYCBpcyBpbnZva2VkIHdoZW4gdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlXG4gKiBvciB3aGVuIGFuIGVycm9yIG9jY3Vycy4gQmUgc3VyZSB0byBjaGVjayBgcmVzLnNlbnRIZWFkZXJgXG4gKiBpZiB5b3Ugd2lzaCB0byBhdHRlbXB0IHJlc3BvbmRpbmcsIGFzIHRoZSBoZWFkZXIgYW5kIHNvbWUgZGF0YVxuICogbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHRyYW5zZmVycmVkLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogICAtIGBtYXhBZ2VgICAgZGVmYXVsdGluZyB0byAwIChjYW4gYmUgc3RyaW5nIGNvbnZlcnRlZCBieSBgbXNgKVxuICogICAtIGByb290YCAgICAgcm9vdCBkaXJlY3RvcnkgZm9yIHJlbGF0aXZlIGZpbGVuYW1lc1xuICogICAtIGBoZWFkZXJzYCAgb2JqZWN0IG9mIGhlYWRlcnMgdG8gc2VydmUgd2l0aCBmaWxlXG4gKiAgIC0gYGRvdGZpbGVzYCBzZXJ2ZSBkb3RmaWxlcywgZGVmYXVsdGluZyB0byBmYWxzZTsgY2FuIGJlIGBcImFsbG93XCJgIHRvIHNlbmQgdGhlbVxuICpcbiAqIE90aGVyIG9wdGlvbnMgYXJlIHBhc3NlZCBhbG9uZyB0byBgc2VuZGAuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBob3cgYHJlcy5zZW5kZmlsZSgpYCBtYXlcbiAqICBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIGZvciB0aGUgYHN0YXRpYygpYCBtaWRkbGV3YXJlIGZvclxuICogIGR5bmFtaWMgc2l0dWF0aW9ucy4gVGhlIGNvZGUgYmFja2luZyBgcmVzLnNlbmRmaWxlKClgIGlzIGFjdHVhbGx5XG4gKiAgdGhlIHNhbWUgY29kZSwgc28gSFRUUCBjYWNoZSBzdXBwb3J0IGV0YyBpcyBpZGVudGljYWwuXG4gKlxuICogICAgIGFwcC5nZXQoJy91c2VyLzp1aWQvcGhvdG9zLzpmaWxlJywgZnVuY3Rpb24ocmVxLCByZXMpe1xuICogICAgICAgdmFyIHVpZCA9IHJlcS5wYXJhbXMudWlkXG4gKiAgICAgICAgICwgZmlsZSA9IHJlcS5wYXJhbXMuZmlsZTtcbiAqXG4gKiAgICAgICByZXEudXNlci5tYXlWaWV3RmlsZXNGcm9tKHVpZCwgZnVuY3Rpb24oeWVzKXtcbiAqICAgICAgICAgaWYgKHllcykge1xuICogICAgICAgICAgIHJlcy5zZW5kZmlsZSgnL3VwbG9hZHMvJyArIHVpZCArICcvJyArIGZpbGUpO1xuICogICAgICAgICB9IGVsc2Uge1xuICogICAgICAgICAgIHJlcy5zZW5kKDQwMywgJ1NvcnJ5ISB5b3UgY2FudCBzZWUgdGhhdC4nKTtcbiAqICAgICAgICAgfVxuICogICAgICAgfSk7XG4gKiAgICAgfSk7XG4gKlxuICogQHB1YmxpY1xuICovXG5cbnJlcy5zZW5kZmlsZSA9IGZ1bmN0aW9uIChwYXRoLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZG9uZSA9IGNhbGxiYWNrO1xuICB2YXIgcmVxID0gdGhpcy5yZXE7XG4gIHZhciByZXMgPSB0aGlzO1xuICB2YXIgbmV4dCA9IHJlcS5uZXh0O1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gc3VwcG9ydCBmdW5jdGlvbiBhcyBzZWNvbmQgYXJnXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUgPSBvcHRpb25zO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBmaWxlIHN0cmVhbVxuICB2YXIgZmlsZSA9IHNlbmQocmVxLCBwYXRoLCBvcHRzKTtcblxuICAvLyB0cmFuc2ZlclxuICBzZW5kZmlsZShyZXMsIGZpbGUsIG9wdHMsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoZG9uZSkgcmV0dXJuIGRvbmUoZXJyKTtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRUlTRElSJykgcmV0dXJuIG5leHQoKTtcblxuICAgIC8vIG5leHQoKSBhbGwgYnV0IHdyaXRlIGVycm9yc1xuICAgIGlmIChlcnIgJiYgZXJyLmNvZGUgIT09ICdFQ09OTkFCT1JUJyAmJiBlcnIuc3lzY2FsbCAhPT0gJ3dyaXRlJykge1xuICAgICAgbmV4dChlcnIpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5yZXMuc2VuZGZpbGUgPSBkZXByZWNhdGUuZnVuY3Rpb24ocmVzLnNlbmRmaWxlLFxuICAncmVzLnNlbmRmaWxlOiBVc2UgcmVzLnNlbmRGaWxlIGluc3RlYWQnKTtcblxuLyoqXG4gKiBUcmFuc2ZlciB0aGUgZmlsZSBhdCB0aGUgZ2l2ZW4gYHBhdGhgIGFzIGFuIGF0dGFjaG1lbnQuXG4gKlxuICogT3B0aW9uYWxseSBwcm92aWRpbmcgYW4gYWx0ZXJuYXRlIGF0dGFjaG1lbnQgYGZpbGVuYW1lYCxcbiAqIGFuZCBvcHRpb25hbCBjYWxsYmFjayBgY2FsbGJhY2soZXJyKWAuIFRoZSBjYWxsYmFjayBpcyBpbnZva2VkXG4gKiB3aGVuIHRoZSBkYXRhIHRyYW5zZmVyIGlzIGNvbXBsZXRlLCBvciB3aGVuIGFuIGVycm9yIGhhc1xuICogb2N1cnJlZC4gQmUgc3VyZSB0byBjaGVjayBgcmVzLmhlYWRlcnNTZW50YCBpZiB5b3UgcGxhbiB0byByZXNwb25kLlxuICpcbiAqIE9wdGlvbmFsbHkgcHJvdmlkaW5nIGFuIGBvcHRpb25zYCBvYmplY3QgdG8gdXNlIHdpdGggYHJlcy5zZW5kRmlsZSgpYC5cbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgdGhlIGBDb250ZW50LURpc3Bvc2l0aW9uYCBoZWFkZXIsIG92ZXJyaWRpbmdcbiAqIGFueSBgQ29udGVudC1EaXNwb3NpdGlvbmAgaGVhZGVyIHBhc3NlZCBhcyBoZWFkZXIgb3B0aW9ucyBpbiBvcmRlclxuICogdG8gc2V0IHRoZSBhdHRhY2htZW50IGFuZCBmaWxlbmFtZS5cbiAqXG4gKiBUaGlzIG1ldGhvZCB1c2VzIGByZXMuc2VuZEZpbGUoKWAuXG4gKlxuICogQHB1YmxpY1xuICovXG5cbnJlcy5kb3dubG9hZCA9IGZ1bmN0aW9uIGRvd25sb2FkIChwYXRoLCBmaWxlbmFtZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgdmFyIGRvbmUgPSBjYWxsYmFjaztcbiAgdmFyIG5hbWUgPSBmaWxlbmFtZTtcbiAgdmFyIG9wdHMgPSBvcHRpb25zIHx8IG51bGxcblxuICAvLyBzdXBwb3J0IGZ1bmN0aW9uIGFzIHNlY29uZCBvciB0aGlyZCBhcmdcbiAgaWYgKHR5cGVvZiBmaWxlbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUgPSBmaWxlbmFtZTtcbiAgICBuYW1lID0gbnVsbDtcbiAgICBvcHRzID0gbnVsbFxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZG9uZSA9IG9wdGlvbnNcbiAgICBvcHRzID0gbnVsbFxuICB9XG5cbiAgLy8gc2V0IENvbnRlbnQtRGlzcG9zaXRpb24gd2hlbiBmaWxlIGlzIHNlbnRcbiAgdmFyIGhlYWRlcnMgPSB7XG4gICAgJ0NvbnRlbnQtRGlzcG9zaXRpb24nOiBjb250ZW50RGlzcG9zaXRpb24obmFtZSB8fCBwYXRoKVxuICB9O1xuXG4gIC8vIG1lcmdlIHVzZXItcHJvdmlkZWQgaGVhZGVyc1xuICBpZiAob3B0cyAmJiBvcHRzLmhlYWRlcnMpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9wdHMuaGVhZGVycylcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldXG4gICAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgIT09ICdjb250ZW50LWRpc3Bvc2l0aW9uJykge1xuICAgICAgICBoZWFkZXJzW2tleV0gPSBvcHRzLmhlYWRlcnNba2V5XVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG1lcmdlIHVzZXItcHJvdmlkZWQgb3B0aW9uc1xuICBvcHRzID0gT2JqZWN0LmNyZWF0ZShvcHRzKVxuICBvcHRzLmhlYWRlcnMgPSBoZWFkZXJzXG5cbiAgLy8gUmVzb2x2ZSB0aGUgZnVsbCBwYXRoIGZvciBzZW5kRmlsZVxuICB2YXIgZnVsbFBhdGggPSByZXNvbHZlKHBhdGgpO1xuXG4gIC8vIHNlbmQgZmlsZVxuICByZXR1cm4gdGhpcy5zZW5kRmlsZShmdWxsUGF0aCwgb3B0cywgZG9uZSlcbn07XG5cbi8qKlxuICogU2V0IF9Db250ZW50LVR5cGVfIHJlc3BvbnNlIGhlYWRlciB3aXRoIGB0eXBlYCB0aHJvdWdoIGBtaW1lLmxvb2t1cCgpYFxuICogd2hlbiBpdCBkb2VzIG5vdCBjb250YWluIFwiL1wiLCBvciBzZXQgdGhlIENvbnRlbnQtVHlwZSB0byBgdHlwZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICByZXMudHlwZSgnLmh0bWwnKTtcbiAqICAgICByZXMudHlwZSgnaHRtbCcpO1xuICogICAgIHJlcy50eXBlKCdqc29uJyk7XG4gKiAgICAgcmVzLnR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAqICAgICByZXMudHlwZSgncG5nJyk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuY29udGVudFR5cGUgPVxucmVzLnR5cGUgPSBmdW5jdGlvbiBjb250ZW50VHlwZSh0eXBlKSB7XG4gIHZhciBjdCA9IHR5cGUuaW5kZXhPZignLycpID09PSAtMVxuICAgID8gbWltZS5sb29rdXAodHlwZSlcbiAgICA6IHR5cGU7XG5cbiAgcmV0dXJuIHRoaXMuc2V0KCdDb250ZW50LVR5cGUnLCBjdCk7XG59O1xuXG4vKipcbiAqIFJlc3BvbmQgdG8gdGhlIEFjY2VwdGFibGUgZm9ybWF0cyB1c2luZyBhbiBgb2JqYFxuICogb2YgbWltZS10eXBlIGNhbGxiYWNrcy5cbiAqXG4gKiBUaGlzIG1ldGhvZCB1c2VzIGByZXEuYWNjZXB0ZWRgLCBhbiBhcnJheSBvZlxuICogYWNjZXB0YWJsZSB0eXBlcyBvcmRlcmVkIGJ5IHRoZWlyIHF1YWxpdHkgdmFsdWVzLlxuICogV2hlbiBcIkFjY2VwdFwiIGlzIG5vdCBwcmVzZW50IHRoZSBfZmlyc3RfIGNhbGxiYWNrXG4gKiBpcyBpbnZva2VkLCBvdGhlcndpc2UgdGhlIGZpcnN0IG1hdGNoIGlzIHVzZWQuIFdoZW5cbiAqIG5vIG1hdGNoIGlzIHBlcmZvcm1lZCB0aGUgc2VydmVyIHJlc3BvbmRzIHdpdGhcbiAqIDQwNiBcIk5vdCBBY2NlcHRhYmxlXCIuXG4gKlxuICogQ29udGVudC1UeXBlIGlzIHNldCBmb3IgeW91LCBob3dldmVyIGlmIHlvdSBjaG9vc2VcbiAqIHlvdSBtYXkgYWx0ZXIgdGhpcyB3aXRoaW4gdGhlIGNhbGxiYWNrIHVzaW5nIGByZXMudHlwZSgpYFxuICogb3IgYHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsIC4uLilgLlxuICpcbiAqICAgIHJlcy5mb3JtYXQoe1xuICogICAgICAndGV4dC9wbGFpbic6IGZ1bmN0aW9uKCl7XG4gKiAgICAgICAgcmVzLnNlbmQoJ2hleScpO1xuICogICAgICB9LFxuICpcbiAqICAgICAgJ3RleHQvaHRtbCc6IGZ1bmN0aW9uKCl7XG4gKiAgICAgICAgcmVzLnNlbmQoJzxwPmhleTwvcD4nKTtcbiAqICAgICAgfSxcbiAqXG4gKiAgICAgICdhcHBsaWF0aW9uL2pzb24nOiBmdW5jdGlvbigpe1xuICogICAgICAgIHJlcy5zZW5kKHsgbWVzc2FnZTogJ2hleScgfSk7XG4gKiAgICAgIH1cbiAqICAgIH0pO1xuICpcbiAqIEluIGFkZGl0aW9uIHRvIGNhbm9uaWNhbGl6ZWQgTUlNRSB0eXBlcyB5b3UgbWF5XG4gKiBhbHNvIHVzZSBleHRuYW1lcyBtYXBwZWQgdG8gdGhlc2UgdHlwZXM6XG4gKlxuICogICAgcmVzLmZvcm1hdCh7XG4gKiAgICAgIHRleHQ6IGZ1bmN0aW9uKCl7XG4gKiAgICAgICAgcmVzLnNlbmQoJ2hleScpO1xuICogICAgICB9LFxuICpcbiAqICAgICAgaHRtbDogZnVuY3Rpb24oKXtcbiAqICAgICAgICByZXMuc2VuZCgnPHA+aGV5PC9wPicpO1xuICogICAgICB9LFxuICpcbiAqICAgICAganNvbjogZnVuY3Rpb24oKXtcbiAqICAgICAgICByZXMuc2VuZCh7IG1lc3NhZ2U6ICdoZXknIH0pO1xuICogICAgICB9XG4gKiAgICB9KTtcbiAqXG4gKiBCeSBkZWZhdWx0IEV4cHJlc3MgcGFzc2VzIGFuIGBFcnJvcmBcbiAqIHdpdGggYSBgLnN0YXR1c2Agb2YgNDA2IHRvIGBuZXh0KGVycilgXG4gKiBpZiBhIG1hdGNoIGlzIG5vdCBtYWRlLiBJZiB5b3UgcHJvdmlkZVxuICogYSBgLmRlZmF1bHRgIGNhbGxiYWNrIGl0IHdpbGwgYmUgaW52b2tlZFxuICogaW5zdGVhZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtTZXJ2ZXJSZXNwb25zZX0gZm9yIGNoYWluaW5nXG4gKiBAcHVibGljXG4gKi9cblxucmVzLmZvcm1hdCA9IGZ1bmN0aW9uKG9iail7XG4gIHZhciByZXEgPSB0aGlzLnJlcTtcbiAgdmFyIG5leHQgPSByZXEubmV4dDtcblxuICB2YXIgZm4gPSBvYmouZGVmYXVsdDtcbiAgaWYgKGZuKSBkZWxldGUgb2JqLmRlZmF1bHQ7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcblxuICB2YXIga2V5ID0ga2V5cy5sZW5ndGggPiAwXG4gICAgPyByZXEuYWNjZXB0cyhrZXlzKVxuICAgIDogZmFsc2U7XG5cbiAgdGhpcy52YXJ5KFwiQWNjZXB0XCIpO1xuXG4gIGlmIChrZXkpIHtcbiAgICB0aGlzLnNldCgnQ29udGVudC1UeXBlJywgbm9ybWFsaXplVHlwZShrZXkpLnZhbHVlKTtcbiAgICBvYmpba2V5XShyZXEsIHRoaXMsIG5leHQpO1xuICB9IGVsc2UgaWYgKGZuKSB7XG4gICAgZm4oKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdOb3QgQWNjZXB0YWJsZScpO1xuICAgIGVyci5zdGF0dXMgPSBlcnIuc3RhdHVzQ29kZSA9IDQwNjtcbiAgICBlcnIudHlwZXMgPSBub3JtYWxpemVUeXBlcyhrZXlzKS5tYXAoZnVuY3Rpb24obyl7IHJldHVybiBvLnZhbHVlIH0pO1xuICAgIG5leHQoZXJyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgX0NvbnRlbnQtRGlzcG9zaXRpb25fIGhlYWRlciB0byBfYXR0YWNobWVudF8gd2l0aCBvcHRpb25hbCBgZmlsZW5hbWVgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlbmFtZVxuICogQHJldHVybiB7U2VydmVyUmVzcG9uc2V9XG4gKiBAcHVibGljXG4gKi9cblxucmVzLmF0dGFjaG1lbnQgPSBmdW5jdGlvbiBhdHRhY2htZW50KGZpbGVuYW1lKSB7XG4gIGlmIChmaWxlbmFtZSkge1xuICAgIHRoaXMudHlwZShleHRuYW1lKGZpbGVuYW1lKSk7XG4gIH1cblxuICB0aGlzLnNldCgnQ29udGVudC1EaXNwb3NpdGlvbicsIGNvbnRlbnREaXNwb3NpdGlvbihmaWxlbmFtZSkpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBcHBlbmQgYWRkaXRpb25hbCBoZWFkZXIgYGZpZWxkYCB3aXRoIHZhbHVlIGB2YWxgLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogICAgcmVzLmFwcGVuZCgnTGluaycsIFsnPGh0dHA6Ly9sb2NhbGhvc3QvPicsICc8aHR0cDovL2xvY2FsaG9zdDozMDAwLz4nXSk7XG4gKiAgICByZXMuYXBwZW5kKCdTZXQtQ29va2llJywgJ2Zvbz1iYXI7IFBhdGg9LzsgSHR0cE9ubHknKTtcbiAqICAgIHJlcy5hcHBlbmQoJ1dhcm5pbmcnLCAnMTk5IE1pc2NlbGxhbmVvdXMgd2FybmluZycpO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IHZhbFxuICogQHJldHVybiB7U2VydmVyUmVzcG9uc2V9IGZvciBjaGFpbmluZ1xuICogQHB1YmxpY1xuICovXG5cbnJlcy5hcHBlbmQgPSBmdW5jdGlvbiBhcHBlbmQoZmllbGQsIHZhbCkge1xuICB2YXIgcHJldiA9IHRoaXMuZ2V0KGZpZWxkKTtcbiAgdmFyIHZhbHVlID0gdmFsO1xuXG4gIGlmIChwcmV2KSB7XG4gICAgLy8gY29uY2F0IHRoZSBuZXcgYW5kIHByZXYgdmFsc1xuICAgIHZhbHVlID0gQXJyYXkuaXNBcnJheShwcmV2KSA/IHByZXYuY29uY2F0KHZhbClcbiAgICAgIDogQXJyYXkuaXNBcnJheSh2YWwpID8gW3ByZXZdLmNvbmNhdCh2YWwpXG4gICAgICA6IFtwcmV2LCB2YWxdO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuc2V0KGZpZWxkLCB2YWx1ZSk7XG59O1xuXG4vKipcbiAqIFNldCBoZWFkZXIgYGZpZWxkYCB0byBgdmFsYCwgb3IgcGFzc1xuICogYW4gb2JqZWN0IG9mIGhlYWRlciBmaWVsZHMuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgcmVzLnNldCgnRm9vJywgWydiYXInLCAnYmF6J10pO1xuICogICAgcmVzLnNldCgnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAqICAgIHJlcy5zZXQoeyBBY2NlcHQ6ICd0ZXh0L3BsYWluJywgJ1gtQVBJLUtleSc6ICd0b2JpJyB9KTtcbiAqXG4gKiBBbGlhc2VkIGFzIGByZXMuaGVhZGVyKClgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gZmllbGRcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSB2YWxcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuc2V0ID1cbnJlcy5oZWFkZXIgPSBmdW5jdGlvbiBoZWFkZXIoZmllbGQsIHZhbCkge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikge1xuICAgIHZhciB2YWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsKVxuICAgICAgPyB2YWwubWFwKFN0cmluZylcbiAgICAgIDogU3RyaW5nKHZhbCk7XG5cbiAgICAvLyBhZGQgY2hhcnNldCB0byBjb250ZW50LXR5cGVcbiAgICBpZiAoZmllbGQudG9Mb3dlckNhc2UoKSA9PT0gJ2NvbnRlbnQtdHlwZScpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb250ZW50LVR5cGUgY2Fubm90IGJlIHNldCB0byBhbiBBcnJheScpO1xuICAgICAgfVxuICAgICAgaWYgKCFjaGFyc2V0UmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHZhciBjaGFyc2V0ID0gbWltZS5jaGFyc2V0cy5sb29rdXAodmFsdWUuc3BsaXQoJzsnKVswXSk7XG4gICAgICAgIGlmIChjaGFyc2V0KSB2YWx1ZSArPSAnOyBjaGFyc2V0PScgKyBjaGFyc2V0LnRvTG93ZXJDYXNlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXRIZWFkZXIoZmllbGQsIHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZmllbGQpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgZmllbGRba2V5XSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBHZXQgdmFsdWUgZm9yIGhlYWRlciBgZmllbGRgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbnJlcy5nZXQgPSBmdW5jdGlvbihmaWVsZCl7XG4gIHJldHVybiB0aGlzLmdldEhlYWRlcihmaWVsZCk7XG59O1xuXG4vKipcbiAqIENsZWFyIGNvb2tpZSBgbmFtZWAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMuY2xlYXJDb29raWUgPSBmdW5jdGlvbiBjbGVhckNvb2tpZShuYW1lLCBvcHRpb25zKSB7XG4gIHZhciBvcHRzID0gbWVyZ2UoeyBleHBpcmVzOiBuZXcgRGF0ZSgxKSwgcGF0aDogJy8nIH0sIG9wdGlvbnMpO1xuXG4gIHJldHVybiB0aGlzLmNvb2tpZShuYW1lLCAnJywgb3B0cyk7XG59O1xuXG4vKipcbiAqIFNldCBjb29raWUgYG5hbWVgIHRvIGB2YWx1ZWAsIHdpdGggdGhlIGdpdmVuIGBvcHRpb25zYC5cbiAqXG4gKiBPcHRpb25zOlxuICpcbiAqICAgIC0gYG1heEFnZWAgICBtYXgtYWdlIGluIG1pbGxpc2Vjb25kcywgY29udmVydGVkIHRvIGBleHBpcmVzYFxuICogICAgLSBgc2lnbmVkYCAgIHNpZ24gdGhlIGNvb2tpZVxuICogICAgLSBgcGF0aGAgICAgIGRlZmF1bHRzIHRvIFwiL1wiXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgLy8gXCJSZW1lbWJlciBNZVwiIGZvciAxNSBtaW51dGVzXG4gKiAgICByZXMuY29va2llKCdyZW1lbWJlcm1lJywgJzEnLCB7IGV4cGlyZXM6IG5ldyBEYXRlKERhdGUubm93KCkgKyA5MDAwMDApLCBodHRwT25seTogdHJ1ZSB9KTtcbiAqXG4gKiAgICAvLyBzYXZlIGFzIGFib3ZlXG4gKiAgICByZXMuY29va2llKCdyZW1lbWJlcm1lJywgJzEnLCB7IG1heEFnZTogOTAwMDAwLCBodHRwT25seTogdHJ1ZSB9KVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHZhbHVlXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJuIHtTZXJ2ZXJSZXNwb25zZX0gZm9yIGNoYWluaW5nXG4gKiBAcHVibGljXG4gKi9cblxucmVzLmNvb2tpZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgb3B0aW9ucykge1xuICB2YXIgb3B0cyA9IG1lcmdlKHt9LCBvcHRpb25zKTtcbiAgdmFyIHNlY3JldCA9IHRoaXMucmVxLnNlY3JldDtcbiAgdmFyIHNpZ25lZCA9IG9wdHMuc2lnbmVkO1xuXG4gIGlmIChzaWduZWQgJiYgIXNlY3JldCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY29va2llUGFyc2VyKFwic2VjcmV0XCIpIHJlcXVpcmVkIGZvciBzaWduZWQgY29va2llcycpO1xuICB9XG5cbiAgdmFyIHZhbCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICA/ICdqOicgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgICA6IFN0cmluZyh2YWx1ZSk7XG5cbiAgaWYgKHNpZ25lZCkge1xuICAgIHZhbCA9ICdzOicgKyBzaWduKHZhbCwgc2VjcmV0KTtcbiAgfVxuXG4gIGlmICgnbWF4QWdlJyBpbiBvcHRzKSB7XG4gICAgb3B0cy5leHBpcmVzID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIG9wdHMubWF4QWdlKTtcbiAgICBvcHRzLm1heEFnZSAvPSAxMDAwO1xuICB9XG5cbiAgaWYgKG9wdHMucGF0aCA9PSBudWxsKSB7XG4gICAgb3B0cy5wYXRoID0gJy8nO1xuICB9XG5cbiAgdGhpcy5hcHBlbmQoJ1NldC1Db29raWUnLCBjb29raWUuc2VyaWFsaXplKG5hbWUsIFN0cmluZyh2YWwpLCBvcHRzKSk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgbG9jYXRpb24gaGVhZGVyIHRvIGB1cmxgLlxuICpcbiAqIFRoZSBnaXZlbiBgdXJsYCBjYW4gYWxzbyBiZSBcImJhY2tcIiwgd2hpY2ggcmVkaXJlY3RzXG4gKiB0byB0aGUgX1JlZmVycmVyXyBvciBfUmVmZXJlcl8gaGVhZGVycyBvciBcIi9cIi5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICByZXMubG9jYXRpb24oJy9mb28vYmFyJykuO1xuICogICAgcmVzLmxvY2F0aW9uKCdodHRwOi8vZXhhbXBsZS5jb20nKTtcbiAqICAgIHJlcy5sb2NhdGlvbignLi4vbG9naW4nKTtcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gKiBAcmV0dXJuIHtTZXJ2ZXJSZXNwb25zZX0gZm9yIGNoYWluaW5nXG4gKiBAcHVibGljXG4gKi9cblxucmVzLmxvY2F0aW9uID0gZnVuY3Rpb24gbG9jYXRpb24odXJsKSB7XG4gIHZhciBsb2MgPSB1cmw7XG5cbiAgLy8gXCJiYWNrXCIgaXMgYW4gYWxpYXMgZm9yIHRoZSByZWZlcnJlclxuICBpZiAodXJsID09PSAnYmFjaycpIHtcbiAgICBsb2MgPSB0aGlzLnJlcS5nZXQoJ1JlZmVycmVyJykgfHwgJy8nO1xuICB9XG5cbiAgLy8gc2V0IGxvY2F0aW9uXG4gIHJldHVybiB0aGlzLnNldCgnTG9jYXRpb24nLCBlbmNvZGVVcmwobG9jKSk7XG59O1xuXG4vKipcbiAqIFJlZGlyZWN0IHRvIHRoZSBnaXZlbiBgdXJsYCB3aXRoIG9wdGlvbmFsIHJlc3BvbnNlIGBzdGF0dXNgXG4gKiBkZWZhdWx0aW5nIHRvIDMwMi5cbiAqXG4gKiBUaGUgcmVzdWx0aW5nIGB1cmxgIGlzIGRldGVybWluZWQgYnkgYHJlcy5sb2NhdGlvbigpYCwgc29cbiAqIGl0IHdpbGwgcGxheSBuaWNlbHkgd2l0aCBtb3VudGVkIGFwcHMsIHJlbGF0aXZlIHBhdGhzLFxuICogYFwiYmFja1wiYCBldGMuXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgcmVzLnJlZGlyZWN0KCcvZm9vL2JhcicpO1xuICogICAgcmVzLnJlZGlyZWN0KCdodHRwOi8vZXhhbXBsZS5jb20nKTtcbiAqICAgIHJlcy5yZWRpcmVjdCgzMDEsICdodHRwOi8vZXhhbXBsZS5jb20nKTtcbiAqICAgIHJlcy5yZWRpcmVjdCgnLi4vbG9naW4nKTsgLy8gL2Jsb2cvcG9zdC8xIC0+IC9ibG9nL2xvZ2luXG4gKlxuICogQHB1YmxpY1xuICovXG5cbnJlcy5yZWRpcmVjdCA9IGZ1bmN0aW9uIHJlZGlyZWN0KHVybCkge1xuICB2YXIgYWRkcmVzcyA9IHVybDtcbiAgdmFyIGJvZHk7XG4gIHZhciBzdGF0dXMgPSAzMDI7XG5cbiAgLy8gYWxsb3cgc3RhdHVzIC8gdXJsXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdudW1iZXInKSB7XG4gICAgICBzdGF0dXMgPSBhcmd1bWVudHNbMF07XG4gICAgICBhZGRyZXNzID0gYXJndW1lbnRzWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXByZWNhdGUoJ3Jlcy5yZWRpcmVjdCh1cmwsIHN0YXR1cyk6IFVzZSByZXMucmVkaXJlY3Qoc3RhdHVzLCB1cmwpIGluc3RlYWQnKTtcbiAgICAgIHN0YXR1cyA9IGFyZ3VtZW50c1sxXTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXQgbG9jYXRpb24gaGVhZGVyXG4gIGFkZHJlc3MgPSB0aGlzLmxvY2F0aW9uKGFkZHJlc3MpLmdldCgnTG9jYXRpb24nKTtcblxuICAvLyBTdXBwb3J0IHRleHQve3BsYWluLGh0bWx9IGJ5IGRlZmF1bHRcbiAgdGhpcy5mb3JtYXQoe1xuICAgIHRleHQ6IGZ1bmN0aW9uKCl7XG4gICAgICBib2R5ID0gc3RhdHVzZXNbc3RhdHVzXSArICcuIFJlZGlyZWN0aW5nIHRvICcgKyBhZGRyZXNzXG4gICAgfSxcblxuICAgIGh0bWw6IGZ1bmN0aW9uKCl7XG4gICAgICB2YXIgdSA9IGVzY2FwZUh0bWwoYWRkcmVzcyk7XG4gICAgICBib2R5ID0gJzxwPicgKyBzdGF0dXNlc1tzdGF0dXNdICsgJy4gUmVkaXJlY3RpbmcgdG8gPGEgaHJlZj1cIicgKyB1ICsgJ1wiPicgKyB1ICsgJzwvYT48L3A+J1xuICAgIH0sXG5cbiAgICBkZWZhdWx0OiBmdW5jdGlvbigpe1xuICAgICAgYm9keSA9ICcnO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUmVzcG9uZFxuICB0aGlzLnN0YXR1c0NvZGUgPSBzdGF0dXM7XG4gIHRoaXMuc2V0KCdDb250ZW50LUxlbmd0aCcsIEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHkpKTtcblxuICBpZiAodGhpcy5yZXEubWV0aG9kID09PSAnSEVBRCcpIHtcbiAgICB0aGlzLmVuZCgpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZW5kKGJvZHkpO1xuICB9XG59O1xuXG4vKipcbiAqIEFkZCBgZmllbGRgIHRvIFZhcnkuIElmIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgVmFyeSBzZXQsIHRoZW5cbiAqIHRoaXMgY2FsbCBpcyBzaW1wbHkgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gZmllbGRcbiAqIEByZXR1cm4ge1NlcnZlclJlc3BvbnNlfSBmb3IgY2hhaW5pbmdcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMudmFyeSA9IGZ1bmN0aW9uKGZpZWxkKXtcbiAgLy8gY2hlY2tzIGZvciBiYWNrLWNvbXBhdFxuICBpZiAoIWZpZWxkIHx8IChBcnJheS5pc0FycmF5KGZpZWxkKSAmJiAhZmllbGQubGVuZ3RoKSkge1xuICAgIGRlcHJlY2F0ZSgncmVzLnZhcnkoKTogUHJvdmlkZSBhIGZpZWxkIG5hbWUnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHZhcnkodGhpcywgZmllbGQpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZW5kZXIgYHZpZXdgIHdpdGggdGhlIGdpdmVuIGBvcHRpb25zYCBhbmQgb3B0aW9uYWwgY2FsbGJhY2sgYGZuYC5cbiAqIFdoZW4gYSBjYWxsYmFjayBmdW5jdGlvbiBpcyBnaXZlbiBhIHJlc3BvbnNlIHdpbGwgX25vdF8gYmUgbWFkZVxuICogYXV0b21hdGljYWxseSwgb3RoZXJ3aXNlIGEgcmVzcG9uc2Ugb2YgXzIwMF8gYW5kIF90ZXh0L2h0bWxfIGlzIGdpdmVuLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGNhY2hlYCAgICAgYm9vbGVhbiBoaW50aW5nIHRvIHRoZSBlbmdpbmUgaXQgc2hvdWxkIGNhY2hlXG4gKiAgLSBgZmlsZW5hbWVgICBmaWxlbmFtZSBvZiB0aGUgdmlldyBiZWluZyByZW5kZXJlZFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG5yZXMucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKHZpZXcsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIHZhciBhcHAgPSB0aGlzLnJlcS5hcHA7XG4gIHZhciBkb25lID0gY2FsbGJhY2s7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJlcSA9IHRoaXMucmVxO1xuICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgLy8gc3VwcG9ydCBjYWxsYmFjayBmdW5jdGlvbiBhcyBzZWNvbmQgYXJnXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRvbmUgPSBvcHRpb25zO1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIC8vIG1lcmdlIHJlcy5sb2NhbHNcbiAgb3B0cy5fbG9jYWxzID0gc2VsZi5sb2NhbHM7XG5cbiAgLy8gZGVmYXVsdCBjYWxsYmFjayB0byByZXNwb25kXG4gIGRvbmUgPSBkb25lIHx8IGZ1bmN0aW9uIChlcnIsIHN0cikge1xuICAgIGlmIChlcnIpIHJldHVybiByZXEubmV4dChlcnIpO1xuICAgIHNlbGYuc2VuZChzdHIpO1xuICB9O1xuXG4gIC8vIHJlbmRlclxuICBhcHAucmVuZGVyKHZpZXcsIG9wdHMsIGRvbmUpO1xufTtcblxuLy8gcGlwZSB0aGUgc2VuZCBmaWxlIHN0cmVhbVxuZnVuY3Rpb24gc2VuZGZpbGUocmVzLCBmaWxlLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICB2YXIgZG9uZSA9IGZhbHNlO1xuICB2YXIgc3RyZWFtaW5nO1xuXG4gIC8vIHJlcXVlc3QgYWJvcnRlZFxuICBmdW5jdGlvbiBvbmFib3J0ZWQoKSB7XG4gICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICBkb25lID0gdHJ1ZTtcblxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1JlcXVlc3QgYWJvcnRlZCcpO1xuICAgIGVyci5jb2RlID0gJ0VDT05OQUJPUlRFRCc7XG4gICAgY2FsbGJhY2soZXJyKTtcbiAgfVxuXG4gIC8vIGRpcmVjdG9yeVxuICBmdW5jdGlvbiBvbmRpcmVjdG9yeSgpIHtcbiAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgIGRvbmUgPSB0cnVlO1xuXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignRUlTRElSLCByZWFkJyk7XG4gICAgZXJyLmNvZGUgPSAnRUlTRElSJztcbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG5cbiAgLy8gZXJyb3JzXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXJyKSB7XG4gICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICBkb25lID0gdHJ1ZTtcbiAgICBjYWxsYmFjayhlcnIpO1xuICB9XG5cbiAgLy8gZW5kZWRcbiAgZnVuY3Rpb24gb25lbmQoKSB7XG4gICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICBkb25lID0gdHJ1ZTtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgLy8gZmlsZVxuICBmdW5jdGlvbiBvbmZpbGUoKSB7XG4gICAgc3RyZWFtaW5nID0gZmFsc2U7XG4gIH1cblxuICAvLyBmaW5pc2hlZFxuICBmdW5jdGlvbiBvbmZpbmlzaChlcnIpIHtcbiAgICBpZiAoZXJyICYmIGVyci5jb2RlID09PSAnRUNPTk5SRVNFVCcpIHJldHVybiBvbmFib3J0ZWQoKTtcbiAgICBpZiAoZXJyKSByZXR1cm4gb25lcnJvcihlcnIpO1xuICAgIGlmIChkb25lKSByZXR1cm47XG5cbiAgICBzZXRJbW1lZGlhdGUoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHN0cmVhbWluZyAhPT0gZmFsc2UgJiYgIWRvbmUpIHtcbiAgICAgICAgb25hYm9ydGVkKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHN0cmVhbWluZ1xuICBmdW5jdGlvbiBvbnN0cmVhbSgpIHtcbiAgICBzdHJlYW1pbmcgPSB0cnVlO1xuICB9XG5cbiAgZmlsZS5vbignZGlyZWN0b3J5Jywgb25kaXJlY3RvcnkpO1xuICBmaWxlLm9uKCdlbmQnLCBvbmVuZCk7XG4gIGZpbGUub24oJ2Vycm9yJywgb25lcnJvcik7XG4gIGZpbGUub24oJ2ZpbGUnLCBvbmZpbGUpO1xuICBmaWxlLm9uKCdzdHJlYW0nLCBvbnN0cmVhbSk7XG4gIG9uRmluaXNoZWQocmVzLCBvbmZpbmlzaCk7XG5cbiAgaWYgKG9wdGlvbnMuaGVhZGVycykge1xuICAgIC8vIHNldCBoZWFkZXJzIG9uIHN1Y2Nlc3NmdWwgdHJhbnNmZXJcbiAgICBmaWxlLm9uKCdoZWFkZXJzJywgZnVuY3Rpb24gaGVhZGVycyhyZXMpIHtcbiAgICAgIHZhciBvYmogPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgayA9IGtleXNbaV07XG4gICAgICAgIHJlcy5zZXRIZWFkZXIoaywgb2JqW2tdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIHBpcGVcbiAgZmlsZS5waXBlKHJlcyk7XG59XG5cbi8qKlxuICogU3RyaW5naWZ5IEpTT04sIGxpa2UgSlNPTi5zdHJpbmdpZnksIGJ1dCB2OCBvcHRpbWl6ZWQsIHdpdGggdGhlXG4gKiBhYmlsaXR5IHRvIGVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgY2FuIHRyaWdnZXIgSFRNTCBzbmlmZmluZy5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSByZXBsYWNlc1xuICogQHBhcmFtIHtudW1iZXJ9IHNwYWNlc1xuICogQHBhcmFtIHtib29sZWFufSBlc2NhcGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHN0cmluZ2lmeSAodmFsdWUsIHJlcGxhY2VyLCBzcGFjZXMsIGVzY2FwZSkge1xuICAvLyB2OCBjaGVja3MgYXJndW1lbnRzLmxlbmd0aCBmb3Igb3B0aW1pemluZyBzaW1wbGUgY2FsbFxuICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00NzMwXG4gIHZhciBqc29uID0gcmVwbGFjZXIgfHwgc3BhY2VzXG4gICAgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgcmVwbGFjZXIsIHNwYWNlcylcbiAgICA6IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblxuICBpZiAoZXNjYXBlKSB7XG4gICAganNvbiA9IGpzb24ucmVwbGFjZSgvWzw+Jl0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHN3aXRjaCAoYy5jaGFyQ29kZUF0KDApKSB7XG4gICAgICAgIGNhc2UgMHgzYzpcbiAgICAgICAgICByZXR1cm4gJ1xcXFx1MDAzYydcbiAgICAgICAgY2FzZSAweDNlOlxuICAgICAgICAgIHJldHVybiAnXFxcXHUwMDNlJ1xuICAgICAgICBjYXNlIDB4MjY6XG4gICAgICAgICAgcmV0dXJuICdcXFxcdTAwMjYnXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGNcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGpzb25cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9leHByZXNzL2xpYi9yZXNwb25zZS5qc1xuLy8gbW9kdWxlIGlkID0gMTgwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbi8qKlxuICogU2lnbiB0aGUgZ2l2ZW4gYHZhbGAgd2l0aCBgc2VjcmV0YC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VjcmV0XG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5leHBvcnRzLnNpZ24gPSBmdW5jdGlvbih2YWwsIHNlY3JldCl7XG4gIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgdmFsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ29va2llIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgYXMgYSBzdHJpbmcuXCIpO1xuICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIHNlY3JldCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNlY3JldCBzdHJpbmcgbXVzdCBiZSBwcm92aWRlZC5cIik7XG4gIHJldHVybiB2YWwgKyAnLicgKyBjcnlwdG9cbiAgICAuY3JlYXRlSG1hYygnc2hhMjU2Jywgc2VjcmV0KVxuICAgIC51cGRhdGUodmFsKVxuICAgIC5kaWdlc3QoJ2Jhc2U2NCcpXG4gICAgLnJlcGxhY2UoL1xcPSskLywgJycpO1xufTtcblxuLyoqXG4gKiBVbnNpZ24gYW5kIGRlY29kZSB0aGUgZ2l2ZW4gYHZhbGAgd2l0aCBgc2VjcmV0YCxcbiAqIHJldHVybmluZyBgZmFsc2VgIGlmIHRoZSBzaWduYXR1cmUgaXMgaW52YWxpZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsXG4gKiBAcGFyYW0ge1N0cmluZ30gc2VjcmV0XG4gKiBAcmV0dXJuIHtTdHJpbmd8Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmV4cG9ydHMudW5zaWduID0gZnVuY3Rpb24odmFsLCBzZWNyZXQpe1xuICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIHZhbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNpZ25lZCBjb29raWUgc3RyaW5nIG11c3QgYmUgcHJvdmlkZWQuXCIpO1xuICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIHNlY3JldCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlNlY3JldCBzdHJpbmcgbXVzdCBiZSBwcm92aWRlZC5cIik7XG4gIHZhciBzdHIgPSB2YWwuc2xpY2UoMCwgdmFsLmxhc3RJbmRleE9mKCcuJykpXG4gICAgLCBtYWMgPSBleHBvcnRzLnNpZ24oc3RyLCBzZWNyZXQpO1xuICBcbiAgcmV0dXJuIHNoYTEobWFjKSA9PSBzaGExKHZhbCkgPyBzdHIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogUHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNoYTEoc3RyKXtcbiAgcmV0dXJuIGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJykudXBkYXRlKHN0cikuZGlnZXN0KCdoZXgnKTtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb29raWUtc2lnbmF0dXJlL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxODFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiBjb29raWVcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgUm9tYW4gU2h0eWxtYW5cbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGRlY29kZSA9IGRlY29kZVVSSUNvbXBvbmVudDtcbnZhciBlbmNvZGUgPSBlbmNvZGVVUklDb21wb25lbnQ7XG52YXIgcGFpclNwbGl0UmVnRXhwID0gLzsgKi87XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGZpZWxkLWNvbnRlbnQgaW4gUkZDIDcyMzAgc2VjIDMuMlxuICpcbiAqIGZpZWxkLWNvbnRlbnQgPSBmaWVsZC12Y2hhciBbIDEqKCBTUCAvIEhUQUIgKSBmaWVsZC12Y2hhciBdXG4gKiBmaWVsZC12Y2hhciAgID0gVkNIQVIgLyBvYnMtdGV4dFxuICogb2JzLXRleHQgICAgICA9ICV4ODAtRkZcbiAqL1xuXG52YXIgZmllbGRDb250ZW50UmVnRXhwID0gL15bXFx1MDAwOVxcdTAwMjAtXFx1MDA3ZVxcdTAwODAtXFx1MDBmZl0rJC87XG5cbi8qKlxuICogUGFyc2UgYSBjb29raWUgaGVhZGVyLlxuICpcbiAqIFBhcnNlIHRoZSBnaXZlbiBjb29raWUgaGVhZGVyIHN0cmluZyBpbnRvIGFuIG9iamVjdFxuICogVGhlIG9iamVjdCBoYXMgdGhlIHZhcmlvdXMgY29va2llcyBhcyBrZXlzKG5hbWVzKSA9PiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHN0ciBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gIH1cblxuICB2YXIgb2JqID0ge31cbiAgdmFyIG9wdCA9IG9wdGlvbnMgfHwge307XG4gIHZhciBwYWlycyA9IHN0ci5zcGxpdChwYWlyU3BsaXRSZWdFeHApO1xuICB2YXIgZGVjID0gb3B0LmRlY29kZSB8fCBkZWNvZGU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwYWlyID0gcGFpcnNbaV07XG4gICAgdmFyIGVxX2lkeCA9IHBhaXIuaW5kZXhPZignPScpO1xuXG4gICAgLy8gc2tpcCB0aGluZ3MgdGhhdCBkb24ndCBsb29rIGxpa2Uga2V5PXZhbHVlXG4gICAgaWYgKGVxX2lkeCA8IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBrZXkgPSBwYWlyLnN1YnN0cigwLCBlcV9pZHgpLnRyaW0oKVxuICAgIHZhciB2YWwgPSBwYWlyLnN1YnN0cigrK2VxX2lkeCwgcGFpci5sZW5ndGgpLnRyaW0oKTtcblxuICAgIC8vIHF1b3RlZCB2YWx1ZXNcbiAgICBpZiAoJ1wiJyA9PSB2YWxbMF0pIHtcbiAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSk7XG4gICAgfVxuXG4gICAgLy8gb25seSBhc3NpZ24gb25jZVxuICAgIGlmICh1bmRlZmluZWQgPT0gb2JqW2tleV0pIHtcbiAgICAgIG9ialtrZXldID0gdHJ5RGVjb2RlKHZhbCwgZGVjKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSBkYXRhIGludG8gYSBjb29raWUgaGVhZGVyLlxuICpcbiAqIFNlcmlhbGl6ZSB0aGUgYSBuYW1lIHZhbHVlIHBhaXIgaW50byBhIGNvb2tpZSBzdHJpbmcgc3VpdGFibGUgZm9yXG4gKiBodHRwIGhlYWRlcnMuIEFuIG9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHNwZWNpZmllZCBjb29raWUgcGFyYW1ldGVycy5cbiAqXG4gKiBzZXJpYWxpemUoJ2ZvbycsICdiYXInLCB7IGh0dHBPbmx5OiB0cnVlIH0pXG4gKiAgID0+IFwiZm9vPWJhcjsgaHR0cE9ubHlcIlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gc2VyaWFsaXplKG5hbWUsIHZhbCwgb3B0aW9ucykge1xuICB2YXIgb3B0ID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGVuYyA9IG9wdC5lbmNvZGUgfHwgZW5jb2RlO1xuXG4gIGlmICh0eXBlb2YgZW5jICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIGVuY29kZSBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgbmFtZSBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICB2YXIgdmFsdWUgPSBlbmModmFsKTtcblxuICBpZiAodmFsdWUgJiYgIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHZhbCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICB2YXIgc3RyID0gbmFtZSArICc9JyArIHZhbHVlO1xuXG4gIGlmIChudWxsICE9IG9wdC5tYXhBZ2UpIHtcbiAgICB2YXIgbWF4QWdlID0gb3B0Lm1heEFnZSAtIDA7XG4gICAgaWYgKGlzTmFOKG1heEFnZSkpIHRocm93IG5ldyBFcnJvcignbWF4QWdlIHNob3VsZCBiZSBhIE51bWJlcicpO1xuICAgIHN0ciArPSAnOyBNYXgtQWdlPScgKyBNYXRoLmZsb29yKG1heEFnZSk7XG4gIH1cblxuICBpZiAob3B0LmRvbWFpbikge1xuICAgIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3Qob3B0LmRvbWFpbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBkb21haW4gaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBEb21haW49JyArIG9wdC5kb21haW47XG4gIH1cblxuICBpZiAob3B0LnBhdGgpIHtcbiAgICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG9wdC5wYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHBhdGggaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBQYXRoPScgKyBvcHQucGF0aDtcbiAgfVxuXG4gIGlmIChvcHQuZXhwaXJlcykge1xuICAgIGlmICh0eXBlb2Ygb3B0LmV4cGlyZXMudG9VVENTdHJpbmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBleHBpcmVzIGlzIGludmFsaWQnKTtcbiAgICB9XG5cbiAgICBzdHIgKz0gJzsgRXhwaXJlcz0nICsgb3B0LmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgfVxuXG4gIGlmIChvcHQuaHR0cE9ubHkpIHtcbiAgICBzdHIgKz0gJzsgSHR0cE9ubHknO1xuICB9XG5cbiAgaWYgKG9wdC5zZWN1cmUpIHtcbiAgICBzdHIgKz0gJzsgU2VjdXJlJztcbiAgfVxuXG4gIGlmIChvcHQuc2FtZVNpdGUpIHtcbiAgICB2YXIgc2FtZVNpdGUgPSB0eXBlb2Ygb3B0LnNhbWVTaXRlID09PSAnc3RyaW5nJ1xuICAgICAgPyBvcHQuc2FtZVNpdGUudG9Mb3dlckNhc2UoKSA6IG9wdC5zYW1lU2l0ZTtcblxuICAgIHN3aXRjaCAoc2FtZVNpdGUpIHtcbiAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPVN0cmljdCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGF4JzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPUxheCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RyaWN0JzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPVN0cmljdCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHNhbWVTaXRlIGlzIGludmFsaWQnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG4vKipcbiAqIFRyeSBkZWNvZGluZyBhIHN0cmluZyB1c2luZyBhIGRlY29kaW5nIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGRlY29kZVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB0cnlEZWNvZGUoc3RyLCBkZWNvZGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlKHN0cik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29va2llL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxODJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyohXG4gKiB2YXJ5XG4gKiBDb3B5cmlnaHQoYykgMjAxNC0yMDE3IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZhcnlcbm1vZHVsZS5leHBvcnRzLmFwcGVuZCA9IGFwcGVuZFxuXG4vKipcbiAqIFJlZ0V4cCB0byBtYXRjaCBmaWVsZC1uYW1lIGluIFJGQyA3MjMwIHNlYyAzLjJcbiAqXG4gKiBmaWVsZC1uYW1lICAgID0gdG9rZW5cbiAqIHRva2VuICAgICAgICAgPSAxKnRjaGFyXG4gKiB0Y2hhciAgICAgICAgID0gXCIhXCIgLyBcIiNcIiAvIFwiJFwiIC8gXCIlXCIgLyBcIiZcIiAvIFwiJ1wiIC8gXCIqXCJcbiAqICAgICAgICAgICAgICAgLyBcIitcIiAvIFwiLVwiIC8gXCIuXCIgLyBcIl5cIiAvIFwiX1wiIC8gXCJgXCIgLyBcInxcIiAvIFwiflwiXG4gKiAgICAgICAgICAgICAgIC8gRElHSVQgLyBBTFBIQVxuICogICAgICAgICAgICAgICA7IGFueSBWQ0hBUiwgZXhjZXB0IGRlbGltaXRlcnNcbiAqL1xuXG52YXIgRklFTERfTkFNRV9SRUdFWFAgPSAvXlshIyQlJicqK1xcLS5eX2B8fjAtOUEtWmEtel0rJC9cblxuLyoqXG4gKiBBcHBlbmQgYSBmaWVsZCB0byBhIHZhcnkgaGVhZGVyLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJcbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5fSBmaWVsZFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGFwcGVuZCAoaGVhZGVyLCBmaWVsZCkge1xuICBpZiAodHlwZW9mIGhlYWRlciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdoZWFkZXIgYXJndW1lbnQgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgaWYgKCFmaWVsZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpZWxkIGFyZ3VtZW50IGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIGdldCBmaWVsZHMgYXJyYXlcbiAgdmFyIGZpZWxkcyA9ICFBcnJheS5pc0FycmF5KGZpZWxkKVxuICAgID8gcGFyc2UoU3RyaW5nKGZpZWxkKSlcbiAgICA6IGZpZWxkXG5cbiAgLy8gYXNzZXJ0IG9uIGludmFsaWQgZmllbGQgbmFtZXNcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBmaWVsZHMubGVuZ3RoOyBqKyspIHtcbiAgICBpZiAoIUZJRUxEX05BTUVfUkVHRVhQLnRlc3QoZmllbGRzW2pdKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZmllbGQgYXJndW1lbnQgY29udGFpbnMgYW4gaW52YWxpZCBoZWFkZXIgbmFtZScpXG4gICAgfVxuICB9XG5cbiAgLy8gZXhpc3RpbmcsIHVuc3BlY2lmaWVkIHZhcnlcbiAgaWYgKGhlYWRlciA9PT0gJyonKSB7XG4gICAgcmV0dXJuIGhlYWRlclxuICB9XG5cbiAgLy8gZW51bWVyYXRlIGN1cnJlbnQgdmFsdWVzXG4gIHZhciB2YWwgPSBoZWFkZXJcbiAgdmFyIHZhbHMgPSBwYXJzZShoZWFkZXIudG9Mb3dlckNhc2UoKSlcblxuICAvLyB1bnNwZWNpZmllZCB2YXJ5XG4gIGlmIChmaWVsZHMuaW5kZXhPZignKicpICE9PSAtMSB8fCB2YWxzLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gJyonXG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBmbGQgPSBmaWVsZHNbaV0udG9Mb3dlckNhc2UoKVxuXG4gICAgLy8gYXBwZW5kIHZhbHVlIChjYXNlLXByZXNlcnZpbmcpXG4gICAgaWYgKHZhbHMuaW5kZXhPZihmbGQpID09PSAtMSkge1xuICAgICAgdmFscy5wdXNoKGZsZClcbiAgICAgIHZhbCA9IHZhbFxuICAgICAgICA/IHZhbCArICcsICcgKyBmaWVsZHNbaV1cbiAgICAgICAgOiBmaWVsZHNbaV1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbi8qKlxuICogUGFyc2UgYSB2YXJ5IGhlYWRlciBpbnRvIGFuIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJcbiAqIEByZXR1cm4ge0FycmF5fVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZSAoaGVhZGVyKSB7XG4gIHZhciBlbmQgPSAwXG4gIHZhciBsaXN0ID0gW11cbiAgdmFyIHN0YXJ0ID0gMFxuXG4gIC8vIGdhdGhlciB0b2tlbnNcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGhlYWRlci5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHN3aXRjaCAoaGVhZGVyLmNoYXJDb2RlQXQoaSkpIHtcbiAgICAgIGNhc2UgMHgyMDogLyogICAqL1xuICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCkge1xuICAgICAgICAgIHN0YXJ0ID0gZW5kID0gaSArIDFcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAweDJjOiAvKiAsICovXG4gICAgICAgIGxpc3QucHVzaChoZWFkZXIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKVxuICAgICAgICBzdGFydCA9IGVuZCA9IGkgKyAxXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBlbmQgPSBpICsgMVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmFsIHRva2VuXG4gIGxpc3QucHVzaChoZWFkZXIuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpKVxuXG4gIHJldHVybiBsaXN0XG59XG5cbi8qKlxuICogTWFyayB0aGF0IGEgcmVxdWVzdCBpcyB2YXJpZWQgb24gYSBoZWFkZXIgZmllbGQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlc1xuICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IGZpZWxkXG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gdmFyeSAocmVzLCBmaWVsZCkge1xuICBpZiAoIXJlcyB8fCAhcmVzLmdldEhlYWRlciB8fCAhcmVzLnNldEhlYWRlcikge1xuICAgIC8vIHF1YWNrIHF1YWNrXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVzIGFyZ3VtZW50IGlzIHJlcXVpcmVkJylcbiAgfVxuXG4gIC8vIGdldCBleGlzdGluZyBoZWFkZXJcbiAgdmFyIHZhbCA9IHJlcy5nZXRIZWFkZXIoJ1ZhcnknKSB8fCAnJ1xuICB2YXIgaGVhZGVyID0gQXJyYXkuaXNBcnJheSh2YWwpXG4gICAgPyB2YWwuam9pbignLCAnKVxuICAgIDogU3RyaW5nKHZhbClcblxuICAvLyBzZXQgbmV3IGhlYWRlclxuICBpZiAoKHZhbCA9IGFwcGVuZChoZWFkZXIsIGZpZWxkKSkpIHtcbiAgICByZXMuc2V0SGVhZGVyKCdWYXJ5JywgdmFsKVxuICB9XG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvdmFyeS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTgzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogc2VydmUtc3RhdGljXG4gKiBDb3B5cmlnaHQoYykgMjAxMCBTZW5jaGEgSW5jLlxuICogQ29weXJpZ2h0KGMpIDIwMTEgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodChjKSAyMDE0LTIwMTYgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0J1xuXG4vKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5cbnZhciBlbmNvZGVVcmwgPSByZXF1aXJlKCdlbmNvZGV1cmwnKVxudmFyIGVzY2FwZUh0bWwgPSByZXF1aXJlKCdlc2NhcGUtaHRtbCcpXG52YXIgcGFyc2VVcmwgPSByZXF1aXJlKCdwYXJzZXVybCcpXG52YXIgcmVzb2x2ZSA9IHJlcXVpcmUoJ3BhdGgnKS5yZXNvbHZlXG52YXIgc2VuZCA9IHJlcXVpcmUoJ3NlbmQnKVxudmFyIHVybCA9IHJlcXVpcmUoJ3VybCcpXG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBzZXJ2ZVN0YXRpY1xubW9kdWxlLmV4cG9ydHMubWltZSA9IHNlbmQubWltZVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSByb290XG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBzZXJ2ZVN0YXRpYyAocm9vdCwgb3B0aW9ucykge1xuICBpZiAoIXJvb3QpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyb290IHBhdGggcmVxdWlyZWQnKVxuICB9XG5cbiAgaWYgKHR5cGVvZiByb290ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Jvb3QgcGF0aCBtdXN0IGJlIGEgc3RyaW5nJylcbiAgfVxuXG4gIC8vIGNvcHkgb3B0aW9ucyBvYmplY3RcbiAgdmFyIG9wdHMgPSBPYmplY3QuY3JlYXRlKG9wdGlvbnMgfHwgbnVsbClcblxuICAvLyBmYWxsLXRob3VnaFxuICB2YXIgZmFsbHRocm91Z2ggPSBvcHRzLmZhbGx0aHJvdWdoICE9PSBmYWxzZVxuXG4gIC8vIGRlZmF1bHQgcmVkaXJlY3RcbiAgdmFyIHJlZGlyZWN0ID0gb3B0cy5yZWRpcmVjdCAhPT0gZmFsc2VcblxuICAvLyBoZWFkZXJzIGxpc3RlbmVyXG4gIHZhciBzZXRIZWFkZXJzID0gb3B0cy5zZXRIZWFkZXJzXG5cbiAgaWYgKHNldEhlYWRlcnMgJiYgdHlwZW9mIHNldEhlYWRlcnMgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gc2V0SGVhZGVycyBtdXN0IGJlIGZ1bmN0aW9uJylcbiAgfVxuXG4gIC8vIHNldHVwIG9wdGlvbnMgZm9yIHNlbmRcbiAgb3B0cy5tYXhhZ2UgPSBvcHRzLm1heGFnZSB8fCBvcHRzLm1heEFnZSB8fCAwXG4gIG9wdHMucm9vdCA9IHJlc29sdmUocm9vdClcblxuICAvLyBjb25zdHJ1Y3QgZGlyZWN0b3J5IGxpc3RlbmVyXG4gIHZhciBvbkRpcmVjdG9yeSA9IHJlZGlyZWN0XG4gICAgPyBjcmVhdGVSZWRpcmVjdERpcmVjdG9yeUxpc3RlbmVyKClcbiAgICA6IGNyZWF0ZU5vdEZvdW5kRGlyZWN0b3J5TGlzdGVuZXIoKVxuXG4gIHJldHVybiBmdW5jdGlvbiBzZXJ2ZVN0YXRpYyAocmVxLCByZXMsIG5leHQpIHtcbiAgICBpZiAocmVxLm1ldGhvZCAhPT0gJ0dFVCcgJiYgcmVxLm1ldGhvZCAhPT0gJ0hFQUQnKSB7XG4gICAgICBpZiAoZmFsbHRocm91Z2gpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoKVxuICAgICAgfVxuXG4gICAgICAvLyBtZXRob2Qgbm90IGFsbG93ZWRcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA1XG4gICAgICByZXMuc2V0SGVhZGVyKCdBbGxvdycsICdHRVQsIEhFQUQnKVxuICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1MZW5ndGgnLCAnMCcpXG4gICAgICByZXMuZW5kKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBmb3J3YXJkRXJyb3IgPSAhZmFsbHRocm91Z2hcbiAgICB2YXIgb3JpZ2luYWxVcmwgPSBwYXJzZVVybC5vcmlnaW5hbChyZXEpXG4gICAgdmFyIHBhdGggPSBwYXJzZVVybChyZXEpLnBhdGhuYW1lXG5cbiAgICAvLyBtYWtlIHN1cmUgcmVkaXJlY3Qgb2NjdXJzIGF0IG1vdW50XG4gICAgaWYgKHBhdGggPT09ICcvJyAmJiBvcmlnaW5hbFVybC5wYXRobmFtZS5zdWJzdHIoLTEpICE9PSAnLycpIHtcbiAgICAgIHBhdGggPSAnJ1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBzZW5kIHN0cmVhbVxuICAgIHZhciBzdHJlYW0gPSBzZW5kKHJlcSwgcGF0aCwgb3B0cylcblxuICAgIC8vIGFkZCBkaXJlY3RvcnkgaGFuZGxlclxuICAgIHN0cmVhbS5vbignZGlyZWN0b3J5Jywgb25EaXJlY3RvcnkpXG5cbiAgICAvLyBhZGQgaGVhZGVycyBsaXN0ZW5lclxuICAgIGlmIChzZXRIZWFkZXJzKSB7XG4gICAgICBzdHJlYW0ub24oJ2hlYWRlcnMnLCBzZXRIZWFkZXJzKVxuICAgIH1cblxuICAgIC8vIGFkZCBmaWxlIGxpc3RlbmVyIGZvciBmYWxsdGhyb3VnaFxuICAgIGlmIChmYWxsdGhyb3VnaCkge1xuICAgICAgc3RyZWFtLm9uKCdmaWxlJywgZnVuY3Rpb24gb25GaWxlICgpIHtcbiAgICAgICAgLy8gb25jZSBmaWxlIGlzIGRldGVybWluZWQsIGFsd2F5cyBmb3J3YXJkIGVycm9yXG4gICAgICAgIGZvcndhcmRFcnJvciA9IHRydWVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gZm9yd2FyZCBlcnJvcnNcbiAgICBzdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24gZXJyb3IgKGVycikge1xuICAgICAgaWYgKGZvcndhcmRFcnJvciB8fCAhKGVyci5zdGF0dXNDb2RlIDwgNTAwKSkge1xuICAgICAgICBuZXh0KGVycilcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIG5leHQoKVxuICAgIH0pXG5cbiAgICAvLyBwaXBlXG4gICAgc3RyZWFtLnBpcGUocmVzKVxuICB9XG59XG5cbi8qKlxuICogQ29sbGFwc2UgYWxsIGxlYWRpbmcgc2xhc2hlcyBpbnRvIGEgc2luZ2xlIHNsYXNoXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjb2xsYXBzZUxlYWRpbmdTbGFzaGVzIChzdHIpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3RyLmNoYXJDb2RlQXQoaSkgIT09IDB4MmYgLyogLyAqLykge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaSA+IDFcbiAgICA/ICcvJyArIHN0ci5zdWJzdHIoaSlcbiAgICA6IHN0clxufVxuXG4gLyoqXG4gKiBDcmVhdGUgYSBtaW5pbWFsIEhUTUwgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gKiBAcGFyYW0ge3N0cmluZ30gYm9keVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVIdG1sRG9jdW1lbnQgKHRpdGxlLCBib2R5KSB7XG4gIHJldHVybiAnPCFET0NUWVBFIGh0bWw+XFxuJyArXG4gICAgJzxodG1sIGxhbmc9XCJlblwiPlxcbicgK1xuICAgICc8aGVhZD5cXG4nICtcbiAgICAnPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+XFxuJyArXG4gICAgJzx0aXRsZT4nICsgdGl0bGUgKyAnPC90aXRsZT5cXG4nICtcbiAgICAnPC9oZWFkPlxcbicgK1xuICAgICc8Ym9keT5cXG4nICtcbiAgICAnPHByZT4nICsgYm9keSArICc8L3ByZT5cXG4nICtcbiAgICAnPC9ib2R5PlxcbicgK1xuICAgICc8L2h0bWw+XFxuJ1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGRpcmVjdG9yeSBsaXN0ZW5lciB0aGF0IGp1c3QgNDA0cy5cbiAqIEBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlTm90Rm91bmREaXJlY3RvcnlMaXN0ZW5lciAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBub3RGb3VuZCAoKSB7XG4gICAgdGhpcy5lcnJvcig0MDQpXG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBkaXJlY3RvcnkgbGlzdGVuZXIgdGhhdCBwZXJmb3JtcyBhIHJlZGlyZWN0LlxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVSZWRpcmVjdERpcmVjdG9yeUxpc3RlbmVyICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHJlZGlyZWN0IChyZXMpIHtcbiAgICBpZiAodGhpcy5oYXNUcmFpbGluZ1NsYXNoKCkpIHtcbiAgICAgIHRoaXMuZXJyb3IoNDA0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IG9yaWdpbmFsIFVSTFxuICAgIHZhciBvcmlnaW5hbFVybCA9IHBhcnNlVXJsLm9yaWdpbmFsKHRoaXMucmVxKVxuXG4gICAgLy8gYXBwZW5kIHRyYWlsaW5nIHNsYXNoXG4gICAgb3JpZ2luYWxVcmwucGF0aCA9IG51bGxcbiAgICBvcmlnaW5hbFVybC5wYXRobmFtZSA9IGNvbGxhcHNlTGVhZGluZ1NsYXNoZXMob3JpZ2luYWxVcmwucGF0aG5hbWUgKyAnLycpXG5cbiAgICAvLyByZWZvcm1hdCB0aGUgVVJMXG4gICAgdmFyIGxvYyA9IGVuY29kZVVybCh1cmwuZm9ybWF0KG9yaWdpbmFsVXJsKSlcbiAgICB2YXIgZG9jID0gY3JlYXRlSHRtbERvY3VtZW50KCdSZWRpcmVjdGluZycsICdSZWRpcmVjdGluZyB0byA8YSBocmVmPVwiJyArIGVzY2FwZUh0bWwobG9jKSArICdcIj4nICtcbiAgICAgIGVzY2FwZUh0bWwobG9jKSArICc8L2E+JylcblxuICAgIC8vIHNlbmQgcmVkaXJlY3QgcmVzcG9uc2VcbiAgICByZXMuc3RhdHVzQ29kZSA9IDMwMVxuICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgnKVxuICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgQnVmZmVyLmJ5dGVMZW5ndGgoZG9jKSlcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LVNlY3VyaXR5LVBvbGljeScsIFwiZGVmYXVsdC1zcmMgJ3NlbGYnXCIpXG4gICAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJylcbiAgICByZXMuc2V0SGVhZGVyKCdMb2NhdGlvbicsIGxvYylcbiAgICByZXMuZW5kKGRvYylcbiAgfVxufVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3NlcnZlLXN0YXRpYy9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTg0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCAqIGFzIGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5cbmltcG9ydCB7XG4gIERhdGFzb3VyY2UsXG4gIE1ldHJpYyxcbiAgQW5vbWFseSxcbiAgc2F2ZUFub21hbHksXG4gIGluc2VydEFub21hbHksIHJlbW92ZUFub21hbHksIGxvYWRBbm9tYWx5QnlOYW1lLCBsb2FkQW5vbWFseUJ5SWQsIGdldEFub21hbHlJZEJ5TmFtZVxufSBmcm9tICcuLi9zZXJ2aWNlcy9hbm9tYWx5VHlwZSc7XG5pbXBvcnQgeyBydW5MZWFybmluZyB9IGZyb20gJy4uL3NlcnZpY2VzL2FuYWx5dGljcydcbmltcG9ydCB7IHNhdmVUYXJnZXRzIH0gZnJvbSAnLi4vc2VydmljZXMvbWV0cmljcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbmRBbm9tYWx5VHlwZVN0YXR1cyhyZXEsIHJlcykge1xuICBsZXQgaWQgPSByZXEucXVlcnkuaWQ7XG4gIGxldCBuYW1lID0gcmVxLnF1ZXJ5Lm5hbWU7XG4gIHRyeSB7XG4gICAgbGV0IGFub21hbHk6IEFub21hbHk7XG4gICAgaWYoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYW5vbWFseSA9IGxvYWRBbm9tYWx5QnlJZChpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFub21hbHkgPSBsb2FkQW5vbWFseUJ5TmFtZShuYW1lKTtcbiAgICB9XG4gICAgaWYoYW5vbWFseSA9PT0gbnVsbCkge1xuICAgICAgcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICBjb2RlOiA0MDQsXG4gICAgICAgIG1lc3NhZ2U6ICdOb3QgZm91bmQnXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYoYW5vbWFseS5zdGF0dXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzdGF0dXMgZm9yICcgKyBuYW1lKTtcbiAgICB9XG4gICAgcmVzLnN0YXR1cygyMDApLnNlbmQoeyBzdGF0dXM6IGFub21hbHkuc3RhdHVzLCBlcnJvck1lc3NhZ2U6IGFub21hbHkuZXJyb3IgfSk7XG4gIH0gY2F0Y2goZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgLy8gVE9ETzogYmV0dGVyIHNlbmQgNDA0IHdoZW4gd2Uga25vdyB0aGFuIGlzbmB0IGZvdW5kXG4gICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoeyBlcnJvcjogJ0NhbmB0IHJldHVybiBhbnl0aGluZycgfSk7XG4gIH1cblxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBbm9tYWx5KHJlcSwgcmVzKSB7XG4gIHRyeSB7XG4gICAgbGV0IGlkID0gcmVxLnF1ZXJ5LmlkO1xuICAgIGxldCBuYW1lID0gcmVxLnF1ZXJ5Lm5hbWU7XG5cbiAgICBsZXQgYW5vbWFseTpBbm9tYWx5O1xuICAgIGlmKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFub21hbHkgPSBsb2FkQW5vbWFseUJ5SWQoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbm9tYWx5ID0gbG9hZEFub21hbHlCeU5hbWUobmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG4gICAgaWYoYW5vbWFseSA9PT0gbnVsbCkge1xuICAgICAgcmVzLnN0YXR1cyg0MDQpLnNlbmQoe1xuICAgICAgICBjb2RlOiA0MDQsXG4gICAgICAgIG1lc3NhZ2U6ICdOb3QgZm91bmQnXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIG5hbWU6IGFub21hbHkubmFtZSxcbiAgICAgIG1ldHJpYzogYW5vbWFseS5tZXRyaWMsXG4gICAgICBzdGF0dXM6IGFub21hbHkuc3RhdHVzXG4gICAgfSk7XG4gICAgcmVzLnN0YXR1cygyMDApLnNlbmQocGF5bG9hZClcbiAgfSBjYXRjaChlKSB7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAvLyBUT0RPOiBiZXR0ZXIgc2VuZCA0MDQgd2hlbiB3ZSBrbm93IHRoYW4gaXNuYHQgZm91bmRcbiAgICByZXMuc3RhdHVzKDUwMCkuc2VuZCgnQ2FuYHQgZ2V0IGFueXRoaW5nJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQW5vbWFseShyZXEsIHJlcykge1xuICB0cnkge1xuICAgIGNvbnN0IG1ldHJpYzpNZXRyaWMgPSB7XG4gICAgICBkYXRhc291cmNlOiByZXEuYm9keS5tZXRyaWMuZGF0YXNvdXJjZSxcbiAgICAgIHRhcmdldHM6IHNhdmVUYXJnZXRzKHJlcS5ib2R5Lm1ldHJpYy50YXJnZXRzKVxuICAgIH07XG5cbiAgICBjb25zdCBhbm9tYWx5OkFub21hbHkgPSB7XG4gICAgICBuYW1lOiByZXEuYm9keS5uYW1lLFxuICAgICAgcGFuZWxVcmw6IHJlcS5ib2R5LnBhbmVsVXJsLFxuICAgICAgbWV0cmljOiBtZXRyaWMsXG4gICAgICBkYXRhc291cmNlOiByZXEuYm9keS5kYXRhc291cmNlLFxuICAgICAgc3RhdHVzOiAnbGVhcm5pbmcnLFxuICAgICAgbGFzdF9wcmVkaWN0aW9uX3RpbWU6IDAsXG4gICAgICBuZXh0X2lkOiAwXG4gICAgfTtcbiAgICBsZXQgYW5vbWFseUlkID0gaW5zZXJ0QW5vbWFseShhbm9tYWx5KTtcbiAgICBpZihhbm9tYWx5SWQgPT09IG51bGwpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAzKS5zZW5kKHtcbiAgICAgICAgY29kZTogNDAzLFxuICAgICAgICBtZXNzYWdlOiAnQWxyZWFkeSBleGlzdHMnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHsgYW5vbWFseV9pZDogYW5vbWFseUlkIH0pXG4gICAgcmVzLnN0YXR1cygyMDApLnNlbmQocGF5bG9hZCk7XG5cbiAgICBydW5MZWFybmluZyhhbm9tYWx5SWQpO1xuICB9IGNhdGNoKGUpIHtcbiAgICByZXMuc3RhdHVzKDUwMCkuc2VuZCh7XG4gICAgICBjb2RlOiA1MDAsXG4gICAgICBtZXNzYWdlOiAnSW50ZXJuYWwgZXJyb3InXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVsZXRlQW5vbWFseShyZXEsIHJlcykge1xuICB0cnkge1xuICAgIGxldCBpZCA9IHJlcS5xdWVyeS5pZDtcbiAgICBsZXQgbmFtZSA9IHJlcS5xdWVyeS5uYW1lO1xuXG4gICAgaWYoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVtb3ZlQW5vbWFseShpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbW92ZUFub21hbHkobmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG4gICAgXG4gICAgcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgY29kZTogMjAwLFxuICAgICAgbWVzc2FnZTogJ1N1Y2Nlc3MnXG4gICAgfSk7XG4gIH0gY2F0Y2goZSkge1xuICAgIHJlcy5zdGF0dXMoNTAwKS5zZW5kKHtcbiAgICAgIGNvZGU6IDUwMCxcbiAgICAgIG1lc3NhZ2U6ICdJbnRlcm5hbCBlcnJvcidcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxucm91dGVyLmdldCgnL3N0YXR1cycsIHNlbmRBbm9tYWx5VHlwZVN0YXR1cyk7XG5yb3V0ZXIuZ2V0KCcvJywgZ2V0QW5vbWFseSk7XG5yb3V0ZXIucG9zdCgnLycsIGNyZWF0ZUFub21hbHkpO1xucm91dGVyLmRlbGV0ZSgnLycsIGRlbGV0ZUFub21hbHkpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcm91dGVzL2Fub21hbGllcy50cyIsInZhciBjb3JlID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpO1xudmFyICRKU09OID0gY29yZS5KU09OIHx8IChjb3JlLkpTT04gPSB7IHN0cmluZ2lmeTogSlNPTi5zdHJpbmdpZnkgfSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiAkSlNPTi5zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3VtZW50cyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9qc29uL3N0cmluZ2lmeS5qc1xuLy8gbW9kdWxlIGlkID0gMTg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLy8gVGhpcyBtZXRob2Qgb2Ygb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IG5lZWRzIHRvIGJlXG4vLyBrZXB0IGlkZW50aWNhbCB0byB0aGUgd2F5IGl0IGlzIG9idGFpbmVkIGluIHJ1bnRpbWUuanNcbnZhciBnID0gKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcblxuLy8gVXNlIGBnZXRPd25Qcm9wZXJ0eU5hbWVzYCBiZWNhdXNlIG5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBjYWxsaW5nXG4vLyBgaGFzT3duUHJvcGVydHlgIG9uIHRoZSBnbG9iYWwgYHNlbGZgIG9iamVjdCBpbiBhIHdvcmtlci4gU2VlICMxODMuXG52YXIgaGFkUnVudGltZSA9IGcucmVnZW5lcmF0b3JSdW50aW1lICYmXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGcpLmluZGV4T2YoXCJyZWdlbmVyYXRvclJ1bnRpbWVcIikgPj0gMDtcblxuLy8gU2F2ZSB0aGUgb2xkIHJlZ2VuZXJhdG9yUnVudGltZSBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIHJlc3RvcmVkIGxhdGVyLlxudmFyIG9sZFJ1bnRpbWUgPSBoYWRSdW50aW1lICYmIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuXG4vLyBGb3JjZSByZWV2YWx1dGF0aW9uIG9mIHJ1bnRpbWUuanMuXG5nLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuXG5pZiAoaGFkUnVudGltZSkge1xuICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBydW50aW1lLlxuICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IG9sZFJ1bnRpbWU7XG59IGVsc2Uge1xuICAvLyBSZW1vdmUgdGhlIGdsb2JhbCBwcm9wZXJ0eSBhZGRlZCBieSBydW50aW1lLmpzLlxuICB0cnkge1xuICAgIGRlbGV0ZSBnLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgfSBjYXRjaChlKSB7XG4gICAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUtbW9kdWxlLmpzXG4vLyBtb2R1bGUgaWQgPSAxODdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIHZhciBpbk1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgcnVudGltZS53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGVbdG9TdHJpbmdUYWdTeW1ib2xdID1cbiAgICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGlmICghKHRvU3RyaW5nVGFnU3ltYm9sIGluIGdlbkZ1bikpIHtcbiAgICAgICAgZ2VuRnVuW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBob3dldmVyLCB0aGVcbiAgICAgICAgICAvLyByZXN1bHQgZm9yIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgLy8gdGhyb3duIGJhY2sgaW50byB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgIC8vIHdoZW4gYW4gYXdhaXRlZCBQcm9taXNlIGlzIHJlamVjdGVkLiBUaGlzIGRpZmZlcmVuY2UgaW5cbiAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbnN1bWVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHlpZWxkZWRcbiAgICAgICAgICAvLyByZWplY3Rpb24gKHN3YWxsb3cgaXQgYW5kIGNvbnRpbnVlLCBtYW51YWxseSAudGhyb3cgaXQgYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgIC8vIGF3YWl0LCBieSBjb250cmFzdCwgdGhlcmUgaXMgbm8gb3Bwb3J0dW5pdHkgdG8gZXhhbWluZSB0aGVcbiAgICAgICAgICAvLyByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgc28gdGhlXG4gICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgLy8gbGV0IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaGFuZGxlIHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEluIHNsb3BweSBtb2RlLCB1bmJvdW5kIGB0aGlzYCByZWZlcnMgdG8gdGhlIGdsb2JhbCBvYmplY3QsIGZhbGxiYWNrIHRvXG4gIC8vIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGlmIHdlJ3JlIGluIGdsb2JhbCBzdHJpY3QgbW9kZS4gVGhhdCBpcyBzYWRseSBhIGZvcm1cbiAgLy8gb2YgaW5kaXJlY3QgZXZhbCB3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeS5cbiAgKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKVxuKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanNcbi8vIG1vZHVsZSBpZCA9IDE4OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJyZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5wcm9taXNlLnRyeScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJykuUHJvbWlzZTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcHJvbWlzZS5qc1xuLy8gbW9kdWxlIGlkID0gMTg5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3N0cmluZy1hdC5qc1xuLy8gbW9kdWxlIGlkID0gMTkwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzXG4vLyBtb2R1bGUgaWQgPSAxOTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFMpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1wcmltaXRpdmUuanNcbi8vIG1vZHVsZSBpZCA9IDE5MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcmVkZWZpbmUuanNcbi8vIG1vZHVsZSBpZCA9IDE5M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1jcmVhdGUuanNcbi8vIG1vZHVsZSBpZCA9IDE5NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBnZXRLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpID0gMDtcbiAgdmFyIFA7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1kcHMuanNcbi8vIG1vZHVsZSBpZCA9IDE5NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy5qc1xuLy8gbW9kdWxlIGlkID0gMTk2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qc1xuLy8gbW9kdWxlIGlkID0gMTk3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qc1xuLy8gbW9kdWxlIGlkID0gMTk4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMTk5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ3BvLmpzXG4vLyBtb2R1bGUgaWQgPSAyMDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIga2luZCA9IHRoaXMuX2s7XG4gIHZhciBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYgKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKSB7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDIwMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzXG4vLyBtb2R1bGUgaWQgPSAyMDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXQ7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi9fcGVyZm9ybScpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4vX3VzZXItYWdlbnQnKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnM7XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52OCB8fCAnJztcbnZhciAkUHJvbWlzZSA9IGdsb2JhbFtQUk9NSVNFXTtcbnZhciBpc05vZGUgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJztcbnZhciBlbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBJbnRlcm5hbCwgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgV3JhcHBlcjtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG5cbnZhciBVU0VfTkFUSVZFID0gISFmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gY29ycmVjdCBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgPSAkUHJvbWlzZS5yZXNvbHZlKDEpO1xuICAgIHZhciBGYWtlUHJvbWlzZSA9IChwcm9taXNlLmNvbnN0cnVjdG9yID0ge30pW3JlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyldID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICAgIGV4ZWMoZW1wdHksIGVtcHR5KTtcbiAgICB9O1xuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICByZXR1cm4gKGlzTm9kZSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpXG4gICAgICAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2VcbiAgICAgIC8vIHY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAgICAgLy8gd2UgY2FuJ3QgZGV0ZWN0IGl0IHN5bmNocm9ub3VzbHksIHNvIGp1c3QgY2hlY2sgdmVyc2lvbnNcbiAgICAgICYmIHY4LmluZGV4T2YoJzYuNicpICE9PSAwXG4gICAgICAmJiB1c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lLzY2JykgPT09IC0xO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn0oKTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHByb21pc2UsIGlzUmVqZWN0KSB7XG4gIGlmIChwcm9taXNlLl9uKSByZXR1cm47XG4gIHByb21pc2UuX24gPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9jO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIG9rID0gcHJvbWlzZS5fcyA9PSAxO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24gKHJlYWN0aW9uKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChwcm9taXNlLl9oID09IDIpIG9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5faCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIG1heSB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaSkgcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYgKGlzUmVqZWN0ICYmICFwcm9taXNlLl9oKSBvblVuaGFuZGxlZChwcm9taXNlKTtcbiAgfSk7XG59O1xudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIHVuaGFuZGxlZCA9IGlzVW5oYW5kbGVkKHByb21pc2UpO1xuICAgIHZhciByZXN1bHQsIGhhbmRsZXIsIGNvbnNvbGU7XG4gICAgaWYgKHVuaGFuZGxlZCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKSB7XG4gICAgICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodW5oYW5kbGVkICYmIHJlc3VsdC5lKSB0aHJvdyByZXN1bHQudjtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgcmV0dXJuIHByb21pc2UuX2ggIT09IDEgJiYgKHByb21pc2UuX2EgfHwgcHJvbWlzZS5fYykubGVuZ3RoID09PSAwO1xufTtcbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaGFuZGxlcjtcbiAgICBpZiAoaXNOb2RlKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPSBnbG9iYWwub25yZWplY3Rpb25oYW5kbGVkKSB7XG4gICAgICBoYW5kbGVyKHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiBwcm9taXNlLl92IH0pO1xuICAgIH1cbiAgfSk7XG59O1xudmFyICRyZWplY3QgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICBpZiAocHJvbWlzZS5fZCkgcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fcyA9IDI7XG4gIGlmICghcHJvbWlzZS5fYSkgcHJvbWlzZS5fYSA9IHByb21pc2UuX2Muc2xpY2UoKTtcbiAgbm90aWZ5KHByb21pc2UsIHRydWUpO1xufTtcbnZhciAkcmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIHZhciB0aGVuO1xuICBpZiAocHJvbWlzZS5fZCkgcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICBpZiAodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgX3c6IHByb21pc2UsIF9kOiBmYWxzZSB9OyAvLyB3cmFwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBjdHgoJHJlc29sdmUsIHdyYXBwZXIsIDEpLCBjdHgoJHJlamVjdCwgd3JhcHBlciwgMSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgJHJlamVjdC5jYWxsKHdyYXBwZXIsIGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fcyA9IDE7XG4gICAgICBub3RpZnkocHJvbWlzZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgICRyZWplY3QuY2FsbCh7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfSwgZSk7IC8vIHdyYXBcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmICghVVNFX05BVElWRSkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICAkUHJvbWlzZSA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRQcm9taXNlLCBQUk9NSVNFLCAnX2gnKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGN0eCgkcmVzb2x2ZSwgdGhpcywgMSksIGN0eCgkcmVqZWN0LCB0aGlzLCAxKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAkcmVqZWN0LmNhbGwodGhpcywgZXJyKTtcbiAgICB9XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICB0aGlzLl9jID0gW107ICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgIHRoaXMuX2EgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gY2hlY2tlZCBpbiBpc1VuaGFuZGxlZCByZWFjdGlvbnNcbiAgICB0aGlzLl9zID0gMDsgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgdGhpcy5fZCA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBkb25lXG4gICAgdGhpcy5fdiA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSB2YWx1ZVxuICAgIHRoaXMuX2ggPSAwOyAgICAgICAgICAgICAgLy8gPC0gcmVqZWN0aW9uIHN0YXRlLCAwIC0gZGVmYXVsdCwgMSAtIGhhbmRsZWQsIDIgLSB1bmhhbmRsZWRcbiAgICB0aGlzLl9uID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKSgkUHJvbWlzZS5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkUHJvbWlzZSkpO1xuICAgICAgcmVhY3Rpb24ub2sgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBpc05vZGUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2MucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fYSkgdGhpcy5fYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLl9zKSBub3RpZnkodGhpcywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyAyNS40LjUuMSBQcm9taXNlLnByb3RvdHlwZS5jYXRjaChvblJlamVjdGVkKVxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGN0eCgkcmVzb2x2ZSwgcHJvbWlzZSwgMSk7XG4gICAgdGhpcy5yZWplY3QgPSBjdHgoJHJlamVjdCwgcHJvbWlzZSwgMSk7XG4gIH07XG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09ICRQcm9taXNlIHx8IEMgPT09IFdyYXBwZXJcbiAgICAgID8gbmV3IE93blByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBQcm9taXNlOiAkUHJvbWlzZSB9KTtcbnJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJykoJFByb21pc2UsIFBST01JU0UpO1xucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKShQUk9NSVNFKTtcbldyYXBwZXIgPSByZXF1aXJlKCcuL19jb3JlJylbUFJPTUlTRV07XG5cbi8vIHN0YXRpY3NcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjUgUHJvbWlzZS5yZWplY3QocilcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocikge1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7XG4gICAgdmFyICQkcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgJCRyZWplY3Qocik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChMSUJSQVJZIHx8ICFVU0VfTkFUSVZFKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNiBQcm9taXNlLnJlc29sdmUoeClcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKExJQlJBUlkgJiYgdGhpcyA9PT0gV3JhcHBlciA/ICRQcm9taXNlIDogdGhpcywgeCk7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKFVTRV9OQVRJVkUgJiYgcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbiAoaXRlcikge1xuICAkUHJvbWlzZS5hbGwoaXRlcilbJ2NhdGNoJ10oZW1wdHkpO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciAkaW5kZXggPSBpbmRleCsrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbJGluZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZSkgcmVqZWN0KHJlc3VsdC52KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyAyNS40LjQuNCBQcm9taXNlLnJhY2UoaXRlcmFibGUpXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnByb21pc2UuanNcbi8vIG1vZHVsZSBpZCA9IDIwM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIGVudHJpZXMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW50cmllcyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoIChlKSB7XG4gICAgdmFyIHJldCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZiAocmV0ICE9PSB1bmRlZmluZWQpIGFuT2JqZWN0KHJldC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1jYWxsLmpzXG4vLyBtb2R1bGUgaWQgPSAyMDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDIwNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBhcmdzLCB0aGF0KSB7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2ludm9rZS5qc1xuLy8gbW9kdWxlIGlkID0gMjA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIE9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBpc05vZGUgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoaXNOb2RlICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoaXNOb2RlKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIFNhZmFyaSAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgfSBlbHNlIGlmIChPYnNlcnZlciAmJiAhKGdsb2JhbC5uYXZpZ2F0b3IgJiYgZ2xvYmFsLm5hdmlnYXRvci5zdGFuZGFsb25lKSkge1xuICAgIHZhciB0b2dnbGUgPSB0cnVlO1xuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKGdsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gICAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYgKCFoZWFkKSB7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19taWNyb3Rhc2suanNcbi8vIG1vZHVsZSBpZCA9IDIwN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgbmF2aWdhdG9yID0gZ2xvYmFsLm5hdmlnYXRvcjtcblxubW9kdWxlLmV4cG9ydHMgPSBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdXNlci1hZ2VudC5qc1xuLy8gbW9kdWxlIGlkID0gMjA4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgcml0ZXIgPSBbN11bSVRFUkFUT1JdKCk7XG4gIHJpdGVyWydyZXR1cm4nXSA9IGZ1bmN0aW9uICgpIHsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShyaXRlciwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBza2lwQ2xvc2luZykge1xuICBpZiAoIXNraXBDbG9zaW5nICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gWzddO1xuICAgIHZhciBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHsgZG9uZTogc2FmZSA9IHRydWUgfTsgfTtcbiAgICBhcnJbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gc2FmZTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItZGV0ZWN0LmpzXG4vLyBtb2R1bGUgaWQgPSAyMDlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS1maW5hbGx5XG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi9fcHJvbWlzZS1yZXNvbHZlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnUHJvbWlzZScsIHsgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGNvcmUuUHJvbWlzZSB8fCBnbG9iYWwuUHJvbWlzZSk7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIG9uRmluYWxseSA9PSAnZnVuY3Rpb24nO1xuICByZXR1cm4gdGhpcy50aGVuKFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHksXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICB9IDogb25GaW5hbGx5XG4gICk7XG59IH0pO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5wcm9taXNlLmZpbmFsbHkuanNcbi8vIG1vZHVsZSBpZCA9IDIxMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLXRyeVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi9fcGVyZm9ybScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1Byb21pc2UnLCB7ICd0cnknOiBmdW5jdGlvbiAoY2FsbGJhY2tmbikge1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gcGVyZm9ybShjYWxsYmFja2ZuKTtcbiAgKHJlc3VsdC5lID8gcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0IDogcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZSkocmVzdWx0LnYpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn0gfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnByb21pc2UudHJ5LmpzXG4vLyBtb2R1bGUgaWQgPSAyMTFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCBcImNoaWxkX3Byb2Nlc3NcIlxuLy8gbW9kdWxlIGlkID0gMjEyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3InKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vZ2V0LWl0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAyMTNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZ2V0ID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29yZScpLmdldEl0ZXJhdG9yID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBpdGVyRm4gPSBnZXQoaXQpO1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgcmV0dXJuIGFuT2JqZWN0KGl0ZXJGbi5jYWxsKGl0KSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAyMTRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy9maWx0ZXIgd2lsbCByZWVtaXQgdGhlIGRhdGEgaWYgY2IoZXJyLHBhc3MpIHBhc3MgaXMgdHJ1dGh5XG5cbi8vIHJlZHVjZSBpcyBtb3JlIHRyaWNreVxuLy8gbWF5YmUgd2Ugd2FudCB0byBncm91cCB0aGUgcmVkdWN0aW9ucyBvciBlbWl0IHByb2dyZXNzIHVwZGF0ZXMgb2NjYXNpb25hbGx5XG4vLyB0aGUgbW9zdCBiYXNpYyByZWR1Y2UganVzdCBlbWl0cyBvbmUgJ2RhdGEnIGV2ZW50IGFmdGVyIGl0IGhhcyByZWNpZXZlZCAnZW5kJ1xuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJykuU3RyZWFtXG4gICwgZXMgPSBleHBvcnRzXG4gICwgdGhyb3VnaCA9IHJlcXVpcmUoJ3Rocm91Z2gnKVxuICAsIGZyb20gPSByZXF1aXJlKCdmcm9tJylcbiAgLCBkdXBsZXggPSByZXF1aXJlKCdkdXBsZXhlcicpXG4gICwgbWFwID0gcmVxdWlyZSgnbWFwLXN0cmVhbScpXG4gICwgcGF1c2UgPSByZXF1aXJlKCdwYXVzZS1zdHJlYW0nKVxuICAsIHNwbGl0ID0gcmVxdWlyZSgnc3BsaXQnKVxuICAsIHBpcGVsaW5lID0gcmVxdWlyZSgnc3RyZWFtLWNvbWJpbmVyJylcbiAgLCBpbW1lZGlhdGVseSA9IGdsb2JhbC5zZXRJbW1lZGlhdGUgfHwgcHJvY2Vzcy5uZXh0VGljaztcblxuZXMuU3RyZWFtID0gU3RyZWFtIC8vcmUtZXhwb3J0IFN0cmVhbSBmcm9tIGNvcmVcbmVzLnRocm91Z2ggPSB0aHJvdWdoXG5lcy5mcm9tID0gZnJvbVxuZXMuZHVwbGV4ID0gZHVwbGV4XG5lcy5tYXAgPSBtYXBcbmVzLnBhdXNlID0gcGF1c2VcbmVzLnNwbGl0ID0gc3BsaXRcbmVzLnBpcGVsaW5lID0gZXMuY29ubmVjdCA9IGVzLnBpcGUgPSBwaXBlbGluZVxuLy8gbWVyZ2UgLyBjb25jYXRcbi8vXG4vLyBjb21iaW5lIG11bHRpcGxlIHN0cmVhbXMgaW50byBhIHNpbmdsZSBzdHJlYW0uXG4vLyB3aWxsIGVtaXQgZW5kIG9ubHkgb25jZVxuXG5lcy5jb25jYXQgPSAvL2FjdHVhbGx5IHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBjb25jYXRcbmVzLm1lcmdlID0gZnVuY3Rpb24gKC8qc3RyZWFtcy4uLiovKSB7XG4gIHZhciB0b01lcmdlID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gIGlmICh0b01lcmdlLmxlbmd0aCA9PT0gMSAmJiAodG9NZXJnZVswXSBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgIHRvTWVyZ2UgPSB0b01lcmdlWzBdIC8vaGFuZGxlIGFycmF5IGFzIGFyZ3VtZW50cyBvYmplY3RcbiAgfVxuICB2YXIgc3RyZWFtID0gbmV3IFN0cmVhbSgpXG4gIHN0cmVhbS5zZXRNYXhMaXN0ZW5lcnMoMCkgLy8gYWxsb3cgYWRkaW5nIG1vcmUgdGhhbiAxMSBzdHJlYW1zXG4gIHZhciBlbmRDb3VudCA9IDBcbiAgc3RyZWFtLndyaXRhYmxlID0gc3RyZWFtLnJlYWRhYmxlID0gdHJ1ZVxuXG4gIGlmICh0b01lcmdlLmxlbmd0aCkge1xuICAgIHRvTWVyZ2UuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgZS5waXBlKHN0cmVhbSwge2VuZDogZmFsc2V9KVxuICAgICAgdmFyIGVuZGVkID0gZmFsc2VcbiAgICAgIGUub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYoZW5kZWQpIHJldHVyblxuICAgICAgICBlbmRlZCA9IHRydWVcbiAgICAgICAgZW5kQ291bnQgKytcbiAgICAgICAgaWYoZW5kQ291bnQgPT0gdG9NZXJnZS5sZW5ndGgpXG4gICAgICAgICAgc3RyZWFtLmVtaXQoJ2VuZCcpXG4gICAgICB9KVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZW5kJylcbiAgICB9KVxuICB9XG4gIFxuICBzdHJlYW0ud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHRoaXMuZW1pdCgnZGF0YScsIGRhdGEpXG4gIH1cbiAgc3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgdG9NZXJnZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZihlLmRlc3Ryb3kpIGUuZGVzdHJveSgpXG4gICAgfSlcbiAgfVxuICByZXR1cm4gc3RyZWFtXG59XG5cblxuLy8gd3JpdGFibGUgc3RyZWFtLCBjb2xsZWN0cyBhbGwgZXZlbnRzIGludG8gYW4gYXJyYXlcbi8vIGFuZCBjYWxscyBiYWNrIHdoZW4gJ2VuZCcgb2NjdXJzXG4vLyBtYWlubHkgSSdtIHVzaW5nIHRoaXMgdG8gdGVzdCB0aGUgb3RoZXIgZnVuY3Rpb25zXG5cbmVzLndyaXRlQXJyYXkgPSBmdW5jdGlvbiAoZG9uZSkge1xuICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGRvbmUpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdmdW5jdGlvbiB3cml0ZUFycmF5IChkb25lKTogZG9uZSBtdXN0IGJlIGZ1bmN0aW9uJylcblxuICB2YXIgYSA9IG5ldyBTdHJlYW0gKClcbiAgICAsIGFycmF5ID0gW10sIGlzRG9uZSA9IGZhbHNlXG4gIGEud3JpdGUgPSBmdW5jdGlvbiAobCkge1xuICAgIGFycmF5LnB1c2gobClcbiAgfVxuICBhLmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpc0RvbmUgPSB0cnVlXG4gICAgZG9uZShudWxsLCBhcnJheSlcbiAgfVxuICBhLndyaXRhYmxlID0gdHJ1ZVxuICBhLnJlYWRhYmxlID0gZmFsc2VcbiAgYS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIGEud3JpdGFibGUgPSBhLnJlYWRhYmxlID0gZmFsc2VcbiAgICBpZihpc0RvbmUpIHJldHVyblxuICAgIGRvbmUobmV3IEVycm9yKCdkZXN0cm95ZWQgYmVmb3JlIGVuZCcpLCBhcnJheSlcbiAgfVxuICByZXR1cm4gYVxufVxuXG4vL3JldHVybiBhIFN0cmVhbSB0aGF0IHJlYWRzIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdFxuLy9yZXNwZWN0aW5nIHBhdXNlKCkgYW5kIHJlc3VtZSgpXG5cbmVzLnJlYWRBcnJheSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICB2YXIgc3RyZWFtID0gbmV3IFN0cmVhbSgpXG4gICAgLCBpID0gMFxuICAgICwgcGF1c2VkID0gZmFsc2VcbiAgICAsIGVuZGVkID0gZmFsc2VcblxuICBzdHJlYW0ucmVhZGFibGUgPSB0cnVlXG4gIHN0cmVhbS53cml0YWJsZSA9IGZhbHNlXG5cbiAgaWYoIUFycmF5LmlzQXJyYXkoYXJyYXkpKVxuICAgIHRocm93IG5ldyBFcnJvcignZXZlbnQtc3RyZWFtLnJlYWQgZXhwZWN0cyBhbiBhcnJheScpXG5cbiAgc3RyZWFtLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZihlbmRlZCkgcmV0dXJuXG4gICAgcGF1c2VkID0gZmFsc2VcbiAgICB2YXIgbCA9IGFycmF5Lmxlbmd0aFxuICAgIHdoaWxlKGkgPCBsICYmICFwYXVzZWQgJiYgIWVuZGVkKSB7XG4gICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGFycmF5W2krK10pXG4gICAgfVxuICAgIGlmKGkgPT0gbCAmJiAhZW5kZWQpXG4gICAgICBlbmRlZCA9IHRydWUsIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlLCBzdHJlYW0uZW1pdCgnZW5kJylcbiAgfVxuICBwcm9jZXNzLm5leHRUaWNrKHN0cmVhbS5yZXN1bWUpXG4gIHN0cmVhbS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgcGF1c2VkID0gdHJ1ZVxuICB9XG4gIHN0cmVhbS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIGVuZGVkID0gdHJ1ZVxuICAgIHN0cmVhbS5lbWl0KCdjbG9zZScpXG4gIH1cbiAgcmV0dXJuIHN0cmVhbVxufVxuXG4vL1xuLy8gcmVhZGFibGUgKGFzeW5jRnVuY3Rpb24pXG4vLyByZXR1cm4gYSBzdHJlYW0gdGhhdCBjYWxscyBhbiBhc3luYyBmdW5jdGlvbiB3aGlsZSB0aGUgc3RyZWFtIGlzIG5vdCBwYXVzZWQuXG4vL1xuLy8gdGhlIGZ1bmN0aW9uIG11c3QgdGFrZTogKGNvdW50LCBjYWxsYmFjaykgey4uLlxuLy9cblxuZXMucmVhZGFibGUgPVxuZnVuY3Rpb24gKGZ1bmMsIGNvbnRpbnVlT25FcnJvcikge1xuICB2YXIgc3RyZWFtID0gbmV3IFN0cmVhbSgpXG4gICAgLCBpID0gMFxuICAgICwgcGF1c2VkID0gZmFsc2VcbiAgICAsIGVuZGVkID0gZmFsc2VcbiAgICAsIHJlYWRpbmcgPSBmYWxzZVxuXG4gIHN0cmVhbS5yZWFkYWJsZSA9IHRydWVcbiAgc3RyZWFtLndyaXRhYmxlID0gZmFsc2VcblxuICBpZignZnVuY3Rpb24nICE9PSB0eXBlb2YgZnVuYylcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V2ZW50LXN0cmVhbS5yZWFkYWJsZSBleHBlY3RzIGFzeW5jIGZ1bmN0aW9uJylcblxuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHsgZW5kZWQgPSB0cnVlIH0pXG5cbiAgZnVuY3Rpb24gZ2V0IChlcnIsIGRhdGEpIHtcblxuICAgIGlmKGVycikge1xuICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgaWYoIWNvbnRpbnVlT25FcnJvcikgc3RyZWFtLmVtaXQoJ2VuZCcpXG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSlcbiAgICAgIHN0cmVhbS5lbWl0KCdkYXRhJywgZGF0YSlcblxuICAgIGltbWVkaWF0ZWx5KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmKGVuZGVkIHx8IHBhdXNlZCB8fCByZWFkaW5nKSByZXR1cm5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlYWRpbmcgPSB0cnVlXG4gICAgICAgIGZ1bmMuY2FsbChzdHJlYW0sIGkrKywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJlYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIGdldC5hcHBseShudWxsLCBhcmd1bWVudHMpXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgc3RyZWFtLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBwYXVzZWQgPSBmYWxzZVxuICAgIGdldCgpXG4gIH1cbiAgcHJvY2Vzcy5uZXh0VGljayhnZXQpXG4gIHN0cmVhbS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgcGF1c2VkID0gdHJ1ZVxuICB9XG4gIHN0cmVhbS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKVxuICAgIHN0cmVhbS5lbWl0KCdjbG9zZScpXG4gICAgZW5kZWQgPSB0cnVlXG4gIH1cbiAgcmV0dXJuIHN0cmVhbVxufVxuXG5cbi8vXG4vLyBtYXAgc3luY1xuLy9cblxuZXMubWFwU3luYyA9IGZ1bmN0aW9uIChzeW5jKSB7XG4gIHJldHVybiBlcy50aHJvdWdoKGZ1bmN0aW9uIHdyaXRlKGRhdGEpIHtcbiAgICB2YXIgbWFwcGVkRGF0YVxuICAgIHRyeSB7XG4gICAgICBtYXBwZWREYXRhID0gc3luYyhkYXRhKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpXG4gICAgfVxuICAgIGlmIChtYXBwZWREYXRhICE9PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLmVtaXQoJ2RhdGEnLCBtYXBwZWREYXRhKVxuICB9KVxufVxuXG4vL1xuLy8gbG9nIGp1c3QgcHJpbnQgb3V0IHdoYXQgaXMgY29taW5nIHRocm91Z2ggdGhlIHN0cmVhbSwgZm9yIGRlYnVnZ2luZ1xuLy9cblxuZXMubG9nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIGVzLnRocm91Z2goZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgIGlmKG5hbWUpIGNvbnNvbGUuZXJyb3IobmFtZSwgZGF0YSlcbiAgICBlbHNlICAgICBjb25zb2xlLmVycm9yKGRhdGEpXG4gICAgdGhpcy5lbWl0KCdkYXRhJywgZGF0YSlcbiAgfSlcbn1cblxuXG4vL1xuLy8gY2hpbGQgLS0gcGlwZSB0aHJvdWdoIGEgY2hpbGQgcHJvY2Vzc1xuLy9cblxuZXMuY2hpbGQgPSBmdW5jdGlvbiAoY2hpbGQpIHtcblxuICByZXR1cm4gZXMuZHVwbGV4KGNoaWxkLnN0ZGluLCBjaGlsZC5zdGRvdXQpXG5cbn1cblxuLy9cbi8vIHBhcnNlXG4vL1xuLy8gbXVzdCBiZSB1c2VkIGFmdGVyIGVzLnNwbGl0KCkgdG8gZW5zdXJlIHRoYXQgZWFjaCBjaHVuayByZXByZXNlbnRzIGEgbGluZVxuLy8gc291cmNlLnBpcGUoZXMuc3BsaXQoKSkucGlwZShlcy5wYXJzZSgpKVxuXG5lcy5wYXJzZSA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIHZhciBlbWl0RXJyb3IgPSAhIShvcHRpb25zID8gb3B0aW9ucy5lcnJvciA6IGZhbHNlKVxuICByZXR1cm4gZXMudGhyb3VnaChmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBvYmpcbiAgICB0cnkge1xuICAgICAgaWYoZGF0YSkgLy9pZ25vcmUgZW1wdHkgbGluZXNcbiAgICAgICAgb2JqID0gSlNPTi5wYXJzZShkYXRhLnRvU3RyaW5nKCkpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZW1pdEVycm9yKVxuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdlcnJvcicsIGVycilcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKGVyciwgJ2F0dGVtcHRpbmcgdG8gcGFyc2U6JywgZGF0YSlcbiAgICB9XG4gICAgLy9pZ25vcmUgbGluZXMgdGhhdCB3aGVyZSBvbmx5IHdoaXRlc3BhY2UuXG4gICAgaWYob2JqICE9PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLmVtaXQoJ2RhdGEnLCBvYmopXG4gIH0pXG59XG4vL1xuLy8gc3RyaW5naWZ5XG4vL1xuXG5lcy5zdHJpbmdpZnkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXJcbiAgcmV0dXJuIGVzLm1hcFN5bmMoZnVuY3Rpb24gKGUpe1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShCdWZmZXIuaXNCdWZmZXIoZSkgPyBlLnRvU3RyaW5nKCkgOiBlKSArICdcXG4nXG4gIH0pXG59XG5cbi8vXG4vLyByZXBsYWNlIGEgc3RyaW5nIHdpdGhpbiBhIHN0cmVhbS5cbi8vXG4vLyB3YXJuOiBqdXN0IGNvbmNhdGVuYXRlcyB0aGUgc3RyaW5nIGFuZCB0aGVuIGRvZXMgc3RyLnNwbGl0KCkuam9pbigpLlxuLy8gcHJvYmFibHkgbm90IG9wdGltYWwuXG4vLyBmb3Igc21hbGxpc2ggcmVzcG9uc2VzLCB3aG8gY2FyZXM/XG4vLyBJIG5lZWQgdGhpcyBmb3Igc2hhZG93LW5wbSBzbyBpdCdzIG9ubHkgcmVsYXRpdmVseSBzbWFsbCBqc29uIGZpbGVzLlxuXG5lcy5yZXBsYWNlID0gZnVuY3Rpb24gKGZyb20sIHRvKSB7XG4gIHJldHVybiBlcy5waXBlbGluZShlcy5zcGxpdChmcm9tKSwgZXMuam9pbih0bykpXG59XG5cbi8vXG4vLyBqb2luIGNodW5rcyB3aXRoIGEgam9pbmVyLiBqdXN0IGxpa2UgQXJyYXkjam9pblxuLy8gYWxzbyBhY2NlcHRzIGEgY2FsbGJhY2sgdGhhdCBpcyBwYXNzZWQgdGhlIGNodW5rcyBhcHBlbmRlZCB0b2dldGhlclxuLy8gdGhpcyBpcyBzdGlsbCBzdXBwb3J0ZWQgZm9yIGxlZ2FjeSByZWFzb25zLlxuLy9cblxuZXMuam9pbiA9IGZ1bmN0aW9uIChzdHIpIHtcblxuICAvL2xlZ2FjeSBhcGlcbiAgaWYoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHN0cilcbiAgICByZXR1cm4gZXMud2FpdChzdHIpXG5cbiAgdmFyIGZpcnN0ID0gdHJ1ZVxuICByZXR1cm4gZXMudGhyb3VnaChmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmKCFmaXJzdClcbiAgICAgIHRoaXMuZW1pdCgnZGF0YScsIHN0cilcbiAgICBmaXJzdCA9IGZhbHNlXG4gICAgdGhpcy5lbWl0KCdkYXRhJywgZGF0YSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9KVxufVxuXG5cbi8vXG4vLyB3YWl0LiBjYWxsYmFjayB3aGVuICdlbmQnIGlzIGVtaXR0ZWQsIHdpdGggYWxsIGNodW5rcyBhcHBlbmRlZCBhcyBzdHJpbmcuXG4vL1xuXG5lcy53YWl0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHZhciBhcnIgPSBbXVxuICByZXR1cm4gZXMudGhyb3VnaChmdW5jdGlvbiAoZGF0YSkgeyBhcnIucHVzaChkYXRhKSB9LFxuICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBib2R5ID0gQnVmZmVyLmlzQnVmZmVyKGFyclswXSkgPyBCdWZmZXIuY29uY2F0KGFycilcbiAgICAgICAgOiBhcnIuam9pbignJylcbiAgICAgIHRoaXMuZW1pdCgnZGF0YScsIGJvZHkpXG4gICAgICB0aGlzLmVtaXQoJ2VuZCcpXG4gICAgICBpZihjYWxsYmFjaykgY2FsbGJhY2sobnVsbCwgYm9keSlcbiAgICB9KVxufVxuXG5lcy5waXBlYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdbRVZFTlQtU1RSRUFNXSBlcy5waXBlYWJsZSBpcyBkZXByZWNhdGVkJylcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9ldmVudC1zdHJlYW0vaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDIxNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJcbid1c2Ugc3RyaWN0JztcblxudmFyIFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpXG5cbi8vIGZyb21cbi8vXG4vLyBhIHN0cmVhbSB0aGF0IHJlYWRzIGZyb20gYW4gc291cmNlLlxuLy8gc291cmNlIG1heSBiZSBhbiBhcnJheSwgb3IgYSBmdW5jdGlvbi5cbi8vIGZyb20gaGFuZGxlcyBwYXVzZSBiZWhhdmlvdXIgZm9yIHlvdS5cblxubW9kdWxlLmV4cG9ydHMgPVxuZnVuY3Rpb24gZnJvbSAoc291cmNlKSB7XG4gIGlmKEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuXHRcdHZhciBzb3VyY2VfaW5kZXggPSAwLCBzb3VyY2VfbGVuID0gc291cmNlLmxlbmd0aDtcbiAgICByZXR1cm4gZnJvbSAoZnVuY3Rpb24gKGkpIHtcbiAgICAgIGlmKHNvdXJjZV9pbmRleCA8IHNvdXJjZV9sZW4pXG4gICAgICAgIHRoaXMuZW1pdCgnZGF0YScsIHNvdXJjZVtzb3VyY2VfaW5kZXgrK10pXG4gICAgICBlbHNlXG4gICAgICAgIHRoaXMuZW1pdCgnZW5kJylcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSlcbiAgfVxuICB2YXIgcyA9IG5ldyBTdHJlYW0oKSwgaSA9IDBcbiAgcy5lbmRlZCA9IGZhbHNlXG4gIHMuc3RhcnRlZCA9IGZhbHNlXG4gIHMucmVhZGFibGUgPSB0cnVlXG4gIHMud3JpdGFibGUgPSBmYWxzZVxuICBzLnBhdXNlZCA9IGZhbHNlXG4gIHMuZW5kZWQgPSBmYWxzZVxuICBzLnBhdXNlID0gZnVuY3Rpb24gKCkge1xuICAgIHMuc3RhcnRlZCA9IHRydWVcbiAgICBzLnBhdXNlZCA9IHRydWVcbiAgfVxuICBmdW5jdGlvbiBuZXh0ICgpIHtcbiAgICBzLnN0YXJ0ZWQgPSB0cnVlXG4gICAgaWYocy5lbmRlZCkgcmV0dXJuXG4gICAgd2hpbGUoIXMuZW5kZWQgJiYgIXMucGF1c2VkICYmIHNvdXJjZS5jYWxsKHMsIGkrKywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYoIXMuZW5kZWQgJiYgIXMucGF1c2VkKVxuICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2sobmV4dCk7XG4gICAgfSkpXG4gICAgICA7XG4gIH1cbiAgcy5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcy5zdGFydGVkID0gdHJ1ZVxuICAgIHMucGF1c2VkID0gZmFsc2VcbiAgICBuZXh0KClcbiAgfVxuICBzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgcy5lbmRlZCA9IHRydWVcbiAgICBzLnJlYWRhYmxlID0gZmFsc2VcbiAgICBwcm9jZXNzLm5leHRUaWNrKHMuZGVzdHJveSlcbiAgfSlcbiAgcy5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHMuZW5kZWQgPSB0cnVlXG4gICAgcy5lbWl0KCdjbG9zZScpIFxuICB9XG4gIC8qXG4gICAgYnkgZGVmYXVsdCwgdGhlIHN0cmVhbSB3aWxsIHN0YXJ0IGVtaXR0aW5nIGF0IG5leHRUaWNrXG4gICAgaWYgeW91IHdhbnQsIHlvdSBjYW4gcGF1c2UgaXQsIGFmdGVyIHBpcGVpbmcuXG4gICAgeW91IGNhbiBhbHNvIHJlc3VtZSBiZWZvcmUgbmV4dCB0aWNrLCBhbmQgdGhhdCB3aWxsIGFsc29cbiAgICB3b3JrLlxuICAqL1xuICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICBpZighcy5zdGFydGVkKSBzLnJlc3VtZSgpXG4gIH0pXG4gIHJldHVybiBzXG59XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvZnJvbS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMjE2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vZmlsdGVyIHdpbGwgcmVlbWl0IHRoZSBkYXRhIGlmIGNiKGVycixwYXNzKSBwYXNzIGlzIHRydXRoeVxuXG4vLyByZWR1Y2UgaXMgbW9yZSB0cmlja3lcbi8vIG1heWJlIHdlIHdhbnQgdG8gZ3JvdXAgdGhlIHJlZHVjdGlvbnMgb3IgZW1pdCBwcm9ncmVzcyB1cGRhdGVzIG9jY2FzaW9uYWxseVxuLy8gdGhlIG1vc3QgYmFzaWMgcmVkdWNlIGp1c3QgZW1pdHMgb25lICdkYXRhJyBldmVudCBhZnRlciBpdCBoYXMgcmVjaWV2ZWQgJ2VuZCdcblxuXG52YXIgU3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJykuU3RyZWFtXG5cblxuLy9jcmVhdGUgYW4gZXZlbnQgc3RyZWFtIGFuZCBhcHBseSBmdW5jdGlvbiB0byBlYWNoIC53cml0ZVxuLy9lbWl0dGluZyBlYWNoIHJlc3BvbnNlIGFzIGRhdGFcbi8vdW5sZXNzIGl0J3MgYW4gZW1wdHkgY2FsbGJhY2tcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWFwcGVyLCBvcHRzKSB7XG5cbiAgdmFyIHN0cmVhbSA9IG5ldyBTdHJlYW0oKVxuICAgICwgc2VsZiA9IHRoaXNcbiAgICAsIGlucHV0cyA9IDBcbiAgICAsIG91dHB1dHMgPSAwXG4gICAgLCBlbmRlZCA9IGZhbHNlXG4gICAgLCBwYXVzZWQgPSBmYWxzZVxuICAgICwgZGVzdHJveWVkID0gZmFsc2VcbiAgICAsIGxhc3RXcml0dGVuID0gMFxuICAgICwgaW5OZXh0ID0gZmFsc2VcblxuICB0aGlzLm9wdHMgPSBvcHRzIHx8IHt9O1xuICB2YXIgZXJyb3JFdmVudE5hbWUgPSB0aGlzLm9wdHMuZmFpbHVyZXMgPyAnZmFpbHVyZScgOiAnZXJyb3InO1xuXG4gIC8vIEl0ZW1zIHRoYXQgYXJlIG5vdCByZWFkeSB0byBiZSB3cml0dGVuIHlldCAoYmVjYXVzZSB0aGV5IHdvdWxkIGNvbWUgb3V0IG9mXG4gIC8vIG9yZGVyKSBnZXQgc3R1Y2sgaW4gYSBxdWV1ZSBmb3IgbGF0ZXIuXG4gIHZhciB3cml0ZVF1ZXVlID0ge31cblxuICBzdHJlYW0ud3JpdGFibGUgPSB0cnVlXG4gIHN0cmVhbS5yZWFkYWJsZSA9IHRydWVcblxuICBmdW5jdGlvbiBxdWV1ZURhdGEgKGRhdGEsIG51bWJlcikge1xuICAgIHZhciBuZXh0VG9Xcml0ZSA9IGxhc3RXcml0dGVuICsgMVxuXG4gICAgaWYgKG51bWJlciA9PT0gbmV4dFRvV3JpdGUpIHtcbiAgICAgIC8vIElmIGl0J3MgbmV4dCwgYW5kIGl0cyBub3QgdW5kZWZpbmVkIHdyaXRlIGl0XG4gICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0cmVhbS5lbWl0LmFwcGx5KHN0cmVhbSwgWydkYXRhJywgZGF0YV0pXG4gICAgICB9XG4gICAgICBsYXN0V3JpdHRlbiArK1xuICAgICAgbmV4dFRvV3JpdGUgKytcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlIHF1ZXVlIGl0IGZvciBsYXRlci5cbiAgICAgIHdyaXRlUXVldWVbbnVtYmVyXSA9IGRhdGFcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbmV4dCB2YWx1ZSBpcyBpbiB0aGUgcXVldWUsIHdyaXRlIGl0XG4gICAgaWYgKHdyaXRlUXVldWUuaGFzT3duUHJvcGVydHkobmV4dFRvV3JpdGUpKSB7XG4gICAgICB2YXIgZGF0YVRvV3JpdGUgPSB3cml0ZVF1ZXVlW25leHRUb1dyaXRlXVxuICAgICAgZGVsZXRlIHdyaXRlUXVldWVbbmV4dFRvV3JpdGVdXG4gICAgICByZXR1cm4gcXVldWVEYXRhKGRhdGFUb1dyaXRlLCBuZXh0VG9Xcml0ZSlcbiAgICB9XG5cbiAgICBvdXRwdXRzICsrXG4gICAgaWYoaW5wdXRzID09PSBvdXRwdXRzKSB7XG4gICAgICBpZihwYXVzZWQpIHBhdXNlZCA9IGZhbHNlLCBzdHJlYW0uZW1pdCgnZHJhaW4nKSAvL3dyaXR0ZW4gYWxsIHRoZSBpbmNvbWluZyBldmVudHNcbiAgICAgIGlmKGVuZGVkKSBlbmQoKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHQgKGVyciwgZGF0YSwgbnVtYmVyKSB7XG4gICAgaWYoZGVzdHJveWVkKSByZXR1cm5cbiAgICBpbk5leHQgPSB0cnVlXG5cbiAgICBpZiAoIWVyciB8fCBzZWxmLm9wdHMuZmFpbHVyZXMpIHtcbiAgICAgIHF1ZXVlRGF0YShkYXRhLCBudW1iZXIpXG4gICAgfVxuXG4gICAgaWYgKGVycikge1xuICAgICAgc3RyZWFtLmVtaXQuYXBwbHkoc3RyZWFtLCBbIGVycm9yRXZlbnROYW1lLCBlcnIgXSk7XG4gICAgfVxuXG4gICAgaW5OZXh0ID0gZmFsc2U7XG4gIH1cblxuICAvLyBXcmFwIHRoZSBtYXBwZXIgZnVuY3Rpb24gYnkgY2FsbGluZyBpdHMgY2FsbGJhY2sgd2l0aCB0aGUgb3JkZXIgbnVtYmVyIG9mXG4gIC8vIHRoZSBpdGVtIGluIHRoZSBzdHJlYW0uXG4gIGZ1bmN0aW9uIHdyYXBwZWRNYXBwZXIgKGlucHV0LCBudW1iZXIsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIG1hcHBlci5jYWxsKG51bGwsIGlucHV0LCBmdW5jdGlvbihlcnIsIGRhdGEpe1xuICAgICAgY2FsbGJhY2soZXJyLCBkYXRhLCBudW1iZXIpXG4gICAgfSlcbiAgfVxuXG4gIHN0cmVhbS53cml0ZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgaWYoZW5kZWQpIHRocm93IG5ldyBFcnJvcignbWFwIHN0cmVhbSBpcyBub3Qgd3JpdGFibGUnKVxuICAgIGluTmV4dCA9IGZhbHNlXG4gICAgaW5wdXRzICsrXG5cbiAgICB0cnkge1xuICAgICAgLy9jYXRjaCBzeW5jIGVycm9ycyBhbmQgaGFuZGxlIHRoZW0gbGlrZSBhc3luYyBlcnJvcnNcbiAgICAgIHZhciB3cml0dGVuID0gd3JhcHBlZE1hcHBlcihkYXRhLCBpbnB1dHMsIG5leHQpXG4gICAgICBwYXVzZWQgPSAod3JpdHRlbiA9PT0gZmFsc2UpXG4gICAgICByZXR1cm4gIXBhdXNlZFxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy9pZiB0aGUgY2FsbGJhY2sgaGFzIGJlZW4gY2FsbGVkIHN5bmNyb25vdXNseSwgYW5kIHRoZSBlcnJvclxuICAgICAgLy9oYXMgb2NjdXJlZCBpbiBhbiBsaXN0ZW5lciwgdGhyb3cgaXQgYWdhaW4uXG4gICAgICBpZihpbk5leHQpXG4gICAgICAgIHRocm93IGVyclxuICAgICAgbmV4dChlcnIpXG4gICAgICByZXR1cm4gIXBhdXNlZFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZCAoZGF0YSkge1xuICAgIC8vaWYgZW5kIHdhcyBjYWxsZWQgd2l0aCBhcmdzLCB3cml0ZSBpdCwgXG4gICAgZW5kZWQgPSB0cnVlIC8vd3JpdGUgd2lsbCBlbWl0ICdlbmQnIGlmIGVuZGVkIGlzIHRydWVcbiAgICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZVxuICAgIGlmKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHF1ZXVlRGF0YShkYXRhLCBpbnB1dHMpXG4gICAgfSBlbHNlIGlmIChpbnB1dHMgPT0gb3V0cHV0cykgeyAvL3dhaXQgZm9yIHByb2Nlc3NpbmcgXG4gICAgICBzdHJlYW0ucmVhZGFibGUgPSBmYWxzZSwgc3RyZWFtLmVtaXQoJ2VuZCcpLCBzdHJlYW0uZGVzdHJveSgpIFxuICAgIH1cbiAgfVxuXG4gIHN0cmVhbS5lbmQgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmKGVuZGVkKSByZXR1cm5cbiAgICBlbmQoKVxuICB9XG5cbiAgc3RyZWFtLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7XG4gICAgZW5kZWQgPSBkZXN0cm95ZWQgPSB0cnVlXG4gICAgc3RyZWFtLndyaXRhYmxlID0gc3RyZWFtLnJlYWRhYmxlID0gcGF1c2VkID0gZmFsc2VcbiAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHN0cmVhbS5lbWl0KCdjbG9zZScpXG4gICAgfSlcbiAgfVxuICBzdHJlYW0ucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgcGF1c2VkID0gdHJ1ZVxuICB9XG5cbiAgc3RyZWFtLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBwYXVzZWQgPSBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHN0cmVhbVxufVxuXG5cblxuXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvbWFwLXN0cmVhbS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMjE3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vdGhyb3VnaEAyIGhhbmRsZXMgdGhpcyBieSBkZWZhdWx0IVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCd0aHJvdWdoJylcblxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3BhdXNlLXN0cmVhbS9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMjE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vZmlsdGVyIHdpbGwgcmVlbWl0IHRoZSBkYXRhIGlmIGNiKGVycixwYXNzKSBwYXNzIGlzIHRydXRoeVxuXG4vLyByZWR1Y2UgaXMgbW9yZSB0cmlja3lcbi8vIG1heWJlIHdlIHdhbnQgdG8gZ3JvdXAgdGhlIHJlZHVjdGlvbnMgb3IgZW1pdCBwcm9ncmVzcyB1cGRhdGVzIG9jY2FzaW9uYWxseVxuLy8gdGhlIG1vc3QgYmFzaWMgcmVkdWNlIGp1c3QgZW1pdHMgb25lICdkYXRhJyBldmVudCBhZnRlciBpdCBoYXMgcmVjaWV2ZWQgJ2VuZCdcblxuXG52YXIgdGhyb3VnaCA9IHJlcXVpcmUoJ3Rocm91Z2gnKVxudmFyIERlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2RlcicpLlN0cmluZ0RlY29kZXJcblxubW9kdWxlLmV4cG9ydHMgPSBzcGxpdFxuXG4vL1RPRE8gcGFzcyBpbiBhIGZ1bmN0aW9uIHRvIG1hcCBhY3Jvc3MgdGhlIGxpbmVzLlxuXG5mdW5jdGlvbiBzcGxpdCAobWF0Y2hlciwgbWFwcGVyLCBvcHRpb25zKSB7XG4gIHZhciBkZWNvZGVyID0gbmV3IERlY29kZXIoKVxuICB2YXIgc29GYXIgPSAnJ1xuICB2YXIgbWF4TGVuZ3RoID0gb3B0aW9ucyAmJiBvcHRpb25zLm1heExlbmd0aDtcbiAgaWYoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG1hdGNoZXIpXG4gICAgbWFwcGVyID0gbWF0Y2hlciwgbWF0Y2hlciA9IG51bGxcbiAgaWYgKCFtYXRjaGVyKVxuICAgIG1hdGNoZXIgPSAvXFxyP1xcbi9cblxuICBmdW5jdGlvbiBlbWl0KHN0cmVhbSwgcGllY2UpIHtcbiAgICBpZihtYXBwZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBpZWNlID0gbWFwcGVyKHBpZWNlKVxuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKVxuICAgICAgfVxuICAgICAgaWYoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBwaWVjZSlcbiAgICAgICAgc3RyZWFtLnF1ZXVlKHBpZWNlKVxuICAgIH1cbiAgICBlbHNlXG4gICAgICBzdHJlYW0ucXVldWUocGllY2UpXG4gIH1cblxuICBmdW5jdGlvbiBuZXh0IChzdHJlYW0sIGJ1ZmZlcikge1xuICAgIHZhciBwaWVjZXMgPSAoKHNvRmFyICE9IG51bGwgPyBzb0ZhciA6ICcnKSArIGJ1ZmZlcikuc3BsaXQobWF0Y2hlcilcbiAgICBzb0ZhciA9IHBpZWNlcy5wb3AoKVxuXG4gICAgaWYgKG1heExlbmd0aCAmJiBzb0Zhci5sZW5ndGggPiBtYXhMZW5ndGgpXG4gICAgICBzdHJlYW0uZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ21heGltdW0gYnVmZmVyIHJlYWNoZWQnKSlcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGllY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGllY2UgPSBwaWVjZXNbaV1cbiAgICAgIGVtaXQoc3RyZWFtLCBwaWVjZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhyb3VnaChmdW5jdGlvbiAoYikge1xuICAgIG5leHQodGhpcywgZGVjb2Rlci53cml0ZShiKSlcbiAgfSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIGlmKGRlY29kZXIuZW5kKVxuICAgICAgbmV4dCh0aGlzLCBkZWNvZGVyLmVuZCgpKVxuICAgIGlmKHNvRmFyICE9IG51bGwpXG4gICAgICBlbWl0KHRoaXMsIHNvRmFyKVxuICAgIHRoaXMucXVldWUobnVsbClcbiAgfSlcbn1cblxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3NwbGl0L2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAyMTlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGR1cGxleGVyID0gcmVxdWlyZSgnZHVwbGV4ZXInKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblxuICB2YXIgc3RyZWFtcyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgICwgZmlyc3QgPSBzdHJlYW1zWzBdXG4gICAgLCBsYXN0ID0gc3RyZWFtc1tzdHJlYW1zLmxlbmd0aCAtIDFdXG4gICAgLCB0aGVwaXBlID0gZHVwbGV4ZXIoZmlyc3QsIGxhc3QpXG5cbiAgaWYoc3RyZWFtcy5sZW5ndGggPT0gMSlcbiAgICByZXR1cm4gc3RyZWFtc1swXVxuICBlbHNlIGlmICghc3RyZWFtcy5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdjb25uZWN0IGNhbGxlZCB3aXRoIGVtcHR5IGFyZ3MnKVxuXG4gIC8vcGlwZSBhbGwgdGhlIHN0cmVhbXMgdG9nZXRoZXJcblxuICBmdW5jdGlvbiByZWN1cnNlIChzdHJlYW1zKSB7XG4gICAgaWYoc3RyZWFtcy5sZW5ndGggPCAyKVxuICAgICAgcmV0dXJuXG4gICAgc3RyZWFtc1swXS5waXBlKHN0cmVhbXNbMV0pXG4gICAgcmVjdXJzZShzdHJlYW1zLnNsaWNlKDEpKSAgXG4gIH1cbiAgXG4gIHJlY3Vyc2Uoc3RyZWFtcylcbiBcbiAgZnVuY3Rpb24gb25lcnJvciAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICBhcmdzLnVuc2hpZnQoJ2Vycm9yJylcbiAgICB0aGVwaXBlLmVtaXQuYXBwbHkodGhlcGlwZSwgYXJncylcbiAgfVxuICBcbiAgLy9lcy5kdXBsZXggYWxyZWFkeSByZWVtaXRzIHRoZSBlcnJvciBmcm9tIHRoZSBmaXJzdCBhbmQgbGFzdCBzdHJlYW0uXG4gIC8vYWRkIGEgbGlzdGVuZXIgZm9yIHRoZSBpbm5lciBzdHJlYW1zIGluIHRoZSBwaXBlbGluZS5cbiAgZm9yKHZhciBpID0gMTsgaSA8IHN0cmVhbXMubGVuZ3RoIC0gMTsgaSArKylcbiAgICBzdHJlYW1zW2ldLm9uKCdlcnJvcicsIG9uZXJyb3IpXG5cbiAgcmV0dXJuIHRoZXBpcGVcbn1cblxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL3N0cmVhbS1jb21iaW5lci9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gMjIwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCAqIGFzIGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBnZXRMYWJlbGVkU2VnbWVudHMsXG4gIGluc2VydFNlZ21lbnRzLFxuICByZW1vdmVTZWdtZW50cyxcbn0gZnJvbSAnLi4vc2VydmljZXMvc2VnbWVudHMnO1xuaW1wb3J0IHtydW5MZWFybmluZ30gZnJvbSAnLi4vc2VydmljZXMvYW5hbHl0aWNzJztcbmltcG9ydCB7QW5vbWFseSwgQW5vbWFseUlkLCBnZXRBbm9tYWx5SWRCeU5hbWUsIGxvYWRBbm9tYWx5QnlJZH0gZnJvbSAnLi4vc2VydmljZXMvYW5vbWFseVR5cGUnO1xuXG5cbmFzeW5jIGZ1bmN0aW9uIHNlbmRTZWdtZW50cyhyZXEsIHJlcykge1xuICB0cnkge1xuICAgIGxldCBhbm9tYWx5SWQ6IEFub21hbHlJZCA9IHJlcS5xdWVyeS5hbm9tYWx5X2lkO1xuICAgIGxldCBhbm9tYWx5OkFub21hbHkgPSBsb2FkQW5vbWFseUJ5SWQoYW5vbWFseUlkKTtcbiAgICBpZihhbm9tYWx5ID09PSBudWxsKSB7XG4gICAgICBhbm9tYWx5SWQgPSBnZXRBbm9tYWx5SWRCeU5hbWUoYW5vbWFseUlkKTtcbiAgICB9XG5cbiAgICBsZXQgbGFzdFNlZ21lbnRJZCA9IHJlcS5xdWVyeS5sYXN0X3NlZ21lbnQ7XG4gICAgbGV0IHRpbWVGcm9tID0gcmVxLnF1ZXJ5LmZyb207XG4gICAgbGV0IHRpbWVUbyA9IHJlcS5xdWVyeS50bztcblxuICAgIGxldCBzZWdtZW50cyA9IGdldExhYmVsZWRTZWdtZW50cyhhbm9tYWx5SWQpO1xuXG4gICAgLy8gSWQgZmlsdGVyaW5nXG4gICAgaWYobGFzdFNlZ21lbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZWdtZW50cyA9IHNlZ21lbnRzLmZpbHRlcihlbCA9PiBlbC5pZCA+IGxhc3RTZWdtZW50SWQpO1xuICAgIH1cblxuICAgIC8vIFRpbWUgZmlsdGVyaW5nXG4gICAgaWYodGltZUZyb20gIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VnbWVudHMgPSBzZWdtZW50cy5maWx0ZXIoZWwgPT4gZWwuZmluaXNoID4gdGltZUZyb20pO1xuICAgIH1cblxuICAgIGlmKHRpbWVUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZWdtZW50cyA9IHNlZ21lbnRzLmZpbHRlcihlbCA9PiBlbC5zdGFydCA8IHRpbWVUbyk7XG4gICAgfVxuXG4gICAgbGV0IHBheWxvYWQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBzZWdtZW50c1xuICAgIH0pO1xuICAgIHJlcy5zdGF0dXMoMjAwKS5zZW5kKHBheWxvYWQpO1xuICB9IGNhdGNoKGUpIHtcbiAgICByZXMuc3RhdHVzKDUwMCkuc2VuZCh7XG4gICAgICBjb2RlOiA1MDAsXG4gICAgICBtZXNzYWdlOiAnSW50ZXJuYWwgZXJyb3InXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlU2VnbWVudHMocmVxLCByZXMpIHtcbiAgdHJ5IHtcbiAgICBsZXQgc2VnbWVudHNVcGRhdGUgPSByZXEuYm9keTtcblxuICAgIGxldCBhbm9tYWx5SWQgPSBzZWdtZW50c1VwZGF0ZS5hbm9tYWx5X2lkO1xuICAgIGxldCBhbm9tYWx5TmFtZSA9IHNlZ21lbnRzVXBkYXRlLm5hbWU7XG5cbiAgICBpZihhbm9tYWx5SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYW5vbWFseUlkID0gZ2V0QW5vbWFseUlkQnlOYW1lKGFub21hbHlOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIGxldCBhZGRlZElkcyA9IGluc2VydFNlZ21lbnRzKGFub21hbHlJZCwgc2VnbWVudHNVcGRhdGUuYWRkZWRfc2VnbWVudHMsIHRydWUpO1xuICAgIHJlbW92ZVNlZ21lbnRzKGFub21hbHlJZCwgc2VnbWVudHNVcGRhdGUucmVtb3ZlZF9zZWdtZW50cyk7XG5cbiAgICBsZXQgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHsgYWRkZWRfaWRzOiBhZGRlZElkcyB9KTtcbiAgICByZXMuc3RhdHVzKDIwMCkuc2VuZChwYXlsb2FkKTtcblxuICAgIHJ1bkxlYXJuaW5nKGFub21hbHlJZCk7XG4gIH0gY2F0Y2goZSkge1xuICAgIHJlcy5zdGF0dXMoNTAwKS5zZW5kKHtcbiAgICAgIGNvZGU6IDUwMCxcbiAgICAgIG1lc3NhZ2U6ICdJbnRlcm5hbCBlcnJvcidcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxucm91dGVyLmdldCgnLycsIHNlbmRTZWdtZW50cyk7XG5yb3V0ZXIucGF0Y2goJy8nLCB1cGRhdGVTZWdtZW50cyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yb3V0ZXMvc2VnbWVudHMudHMiLCJpbXBvcnQgKiBhcyBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHtBbm9tYWx5SWQsIGdldEFub21hbHlJZEJ5TmFtZSwgbG9hZEFub21hbHlCeUlkfSBmcm9tICcuLi9zZXJ2aWNlcy9hbm9tYWx5VHlwZSc7XG5pbXBvcnQgeyBnZXRBbGVydHNBbm9tYWxpZXMsIHNhdmVBbGVydHNBbm9tYWxpZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9hbGVydHMnO1xuXG5mdW5jdGlvbiBnZXRBbGVydChyZXEsIHJlcykge1xuICB0cnkge1xuICAgIGxldCBhbm9tYWx5SWQ6IEFub21hbHlJZCA9IHJlcS5xdWVyeS5hbm9tYWx5X2lkO1xuICAgIGxldCBhbm9tYWx5ID0gbG9hZEFub21hbHlCeUlkKGFub21hbHlJZClcbiAgICBpZiAoYW5vbWFseSA9PSBudWxsKSB7XG4gICAgICBhbm9tYWx5SWQgPSBnZXRBbm9tYWx5SWRCeU5hbWUoYW5vbWFseUlkLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIGxldCBhbGVydHNBbm9tYWxpZXMgPSBnZXRBbGVydHNBbm9tYWxpZXMoKTtcbiAgICBsZXQgcG9zID0gYWxlcnRzQW5vbWFsaWVzLmluZGV4T2YoYW5vbWFseUlkKTtcblxuICAgIGxldCBlbmFibGU6IGJvb2xlYW4gPSAocG9zICE9PSAtMSk7XG4gICAgcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgZW5hYmxlXG4gICAgfSk7XG4gIH0gY2F0Y2goZSkge1xuICAgIHJlcy5zdGF0dXMoNTAwKS5zZW5kKHtcbiAgICAgIGNvZGU6IDUwMCxcbiAgICAgIG1lc3NhZ2U6ICdJbnRlcm5hbCBlcnJvcidcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGFuZ2VBbGVydChyZXEsIHJlcykge1xuICB0cnkge1xuICAgIGxldCBhbm9tYWx5SWQ6IEFub21hbHlJZCA9IHJlcS5ib2R5LmFub21hbHlfaWQ7XG4gICAgbGV0IGVuYWJsZTogYm9vbGVhbiA9IHJlcS5ib2R5LmVuYWJsZTtcblxuICAgIGxldCBhbm9tYWx5ID0gbG9hZEFub21hbHlCeUlkKGFub21hbHlJZClcbiAgICBpZiAoYW5vbWFseSA9PSBudWxsKSB7XG4gICAgICBhbm9tYWx5SWQgPSBnZXRBbm9tYWx5SWRCeU5hbWUoYW5vbWFseUlkLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIGxldCBhbGVydHNBbm9tYWxpZXMgPSBnZXRBbGVydHNBbm9tYWxpZXMoKTtcbiAgICBsZXQgcG9zOiBudW1iZXIgPSBhbGVydHNBbm9tYWxpZXMuaW5kZXhPZihhbm9tYWx5SWQpO1xuICAgIGlmKGVuYWJsZSAmJiBwb3MgPT0gLTEpIHtcbiAgICAgIGFsZXJ0c0Fub21hbGllcy5wdXNoKGFub21hbHlJZCk7XG4gICAgICBzYXZlQWxlcnRzQW5vbWFsaWVzKGFsZXJ0c0Fub21hbGllcyk7XG4gICAgfSBlbHNlIGlmKCFlbmFibGUgJiYgcG9zID4gLTEpIHtcbiAgICAgIGFsZXJ0c0Fub21hbGllcy5zcGxpY2UocG9zLCAxKTtcbiAgICAgIHNhdmVBbGVydHNBbm9tYWxpZXMoYWxlcnRzQW5vbWFsaWVzKTtcbiAgICB9XG4gICAgcmVzLnN0YXR1cygyMDApLnNlbmQoe1xuICAgICAgc3RhdHVzOiAnT2snXG4gICAgfSk7XG4gIH0gY2F0Y2goZSkge1xuICAgIHJlcy5zdGF0dXMoNTAwKS5zZW5kKHtcbiAgICAgIGNvZGU6IDUwMCxcbiAgICAgIG1lc3NhZ2U6ICdJbnRlcm5hbCBlcnJvcidcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcblxucm91dGVyLmdldCgnLycsIGdldEFsZXJ0KTtcbnJvdXRlci5wb3N0KCcvJywgY2hhbmdlQWxlcnQpO1xuXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yb3V0ZXMvYWxlcnRzLnRzIiwiaW1wb3J0IHsgZ2V0SnNvbkRhdGFTeW5jLCB3cml0ZUpzb25EYXRhU3luYyB9IGZyb20gJy4vanNvbic7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgQW5vbWFseUlkIH0gZnJvbSAnLi9hbm9tYWx5VHlwZSc7XG5pbXBvcnQgeyBBTk9NQUxJRVNfUEFUSCB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBydW5QcmVkaWN0IH0gZnJvbSAnLi9hbmFseXRpY3MnO1xuaW1wb3J0IHsgc2VuZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4vbm90aWZpY2F0aW9uJztcbmltcG9ydCB7IGdldExhYmVsZWRTZWdtZW50cyB9IGZyb20gJy4vc2VnbWVudHMnO1xuXG5mdW5jdGlvbiBnZXRBbGVydHNBbm9tYWxpZXMoKSA6IEFub21hbHlJZFtdIHtcbiAgbGV0IGZpbGVuYW1lID0gcGF0aC5qb2luKEFOT01BTElFU19QQVRILCBgYWxlcnRzX2Fub21hbGllcy5qc29uYCk7XG4gIGlmKCFmcy5leGlzdHNTeW5jKGZpbGVuYW1lKSkge1xuICAgIHNhdmVBbGVydHNBbm9tYWxpZXMoW10pO1xuICB9XG4gIHJldHVybiBnZXRKc29uRGF0YVN5bmMocGF0aC5qb2luKEFOT01BTElFU19QQVRILCBgYWxlcnRzX2Fub21hbGllcy5qc29uYCkpO1xufVxuXG5mdW5jdGlvbiBzYXZlQWxlcnRzQW5vbWFsaWVzKGFub21hbGllczogQW5vbWFseUlkW10pIHtcbiAgcmV0dXJuIHdyaXRlSnNvbkRhdGFTeW5jKHBhdGguam9pbihBTk9NQUxJRVNfUEFUSCwgYGFsZXJ0c19hbm9tYWxpZXMuanNvbmApLCBhbm9tYWxpZXMpO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzQWxlcnRzKGFub21hbHlJZCkge1xuICBsZXQgc2VnbWVudHMgPSBnZXRMYWJlbGVkU2VnbWVudHMoYW5vbWFseUlkKTtcblxuICBjb25zdCBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICBjb25zdCBhY3RpdmVBbGVydCA9IGZhbHNlO1xuICBsZXQgbmV3QWN0aXZlQWxlcnQgPSBmYWxzZTtcblxuICBpZihzZWdtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgbGV0IGxhc3RTZWdtZW50ID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV07XG4gICAgaWYobGFzdFNlZ21lbnQuZmluaXNoID49IGN1cnJlbnRUaW1lIC0gYWxlcnRUaW1lb3V0KSB7XG4gICAgICBuZXdBY3RpdmVBbGVydCA9IHRydWU7XG4gICAgfVxuICB9XG4gIGNvbnNvbGUubG9nKGFjdGl2ZUFsZXJ0KVxuICBuZXdBY3RpdmVBbGVydCA9IHRydWVcbiAgaWYoIWFjdGl2ZUFsZXJ0ICYmIG5ld0FjdGl2ZUFsZXJ0KSB7XG4gICAgYWN0aXZlQWxlcnRzLmFkZChhbm9tYWx5SWQpO1xuICAgIHNlbmROb3RpZmljYXRpb24oYW5vbWFseUlkLCB0cnVlKTtcbiAgfSBlbHNlIGlmKGFjdGl2ZUFsZXJ0ICYmICFuZXdBY3RpdmVBbGVydCkge1xuICAgIGFjdGl2ZUFsZXJ0cy5kZWxldGUoYW5vbWFseUlkKTtcbiAgICBzZW5kTm90aWZpY2F0aW9uKGFub21hbHlJZCwgZmFsc2UpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFsZXJ0c1RpY2soKSB7XG4gIGxldCBhbGVydHNBbm9tYWxpZXMgPSBnZXRBbGVydHNBbm9tYWxpZXMoKTtcbiAgZm9yIChsZXQgYW5vbWFseUlkIG9mIGFsZXJ0c0Fub21hbGllcykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBydW5QcmVkaWN0KGFub21hbHlJZCk7XG4gICAgICBwcm9jZXNzQWxlcnRzKGFub21hbHlJZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG4gIH1cbiAgc2V0VGltZW91dChhbGVydHNUaWNrLCA1MDAwKTtcbn1cblxuY29uc3QgYWxlcnRUaW1lb3V0ID0gNjAwMDA7IC8vIG1zXG5jb25zdCBhY3RpdmVBbGVydHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbnNldFRpbWVvdXQoYWxlcnRzVGljaywgNTAwMCk7XG5cblxuZXhwb3J0IHsgZ2V0QWxlcnRzQW5vbWFsaWVzLCBzYXZlQWxlcnRzQW5vbWFsaWVzIH1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZpY2VzL2FsZXJ0cy50cyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zZXRcIiksIF9fZXNNb2R1bGU6IHRydWUgfTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3NldC5qc1xuLy8gbW9kdWxlIGlkID0gMjI0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zZXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3LnNldC50by1qc29uJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNy5zZXQub2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM3LnNldC5mcm9tJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5TZXQ7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3NldC5qc1xuLy8gbW9kdWxlIGlkID0gMjI1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJvbmcgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXN0cm9uZycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFNFVCA9ICdTZXQnO1xuXG4vLyAyMy4yIFNldCBPYmplY3RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24nKShTRVQsIGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFNldCgpIHsgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7IH07XG59LCB7XG4gIC8vIDIzLjIuMy4xIFNldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHZhbGlkYXRlKHRoaXMsIFNFVCksIHZhbHVlID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWUsIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc2V0LmpzXG4vLyBtb2R1bGUgaWQgPSAyMjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyICRpdGVyRGVmaW5lID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIGZhc3RLZXkgPSByZXF1aXJlKCcuL19tZXRhJykuZmFzdEtleTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBTSVpFID0gREVTQ1JJUFRPUlMgPyAnX3MnIDogJ3NpemUnO1xuXG52YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7XG4gIC8vIGZhc3QgY2FzZVxuICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSk7XG4gIHZhciBlbnRyeTtcbiAgaWYgKGluZGV4ICE9PSAnRicpIHJldHVybiB0aGF0Ll9pW2luZGV4XTtcbiAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gIGZvciAoZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgaWYgKGVudHJ5LmsgPT0ga2V5KSByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIE5BTUUsICdfaScpO1xuICAgICAgdGhhdC5fdCA9IE5BTUU7ICAgICAgICAgLy8gY29sbGVjdGlvbiB0eXBlXG4gICAgICB0aGF0Ll9pID0gY3JlYXRlKG51bGwpOyAvLyBpbmRleFxuICAgICAgdGhhdC5fZiA9IHVuZGVmaW5lZDsgICAgLy8gZmlyc3QgZW50cnlcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7ICAgIC8vIGxhc3QgZW50cnlcbiAgICAgIHRoYXRbU0laRV0gPSAwOyAgICAgICAgIC8vIHNpemVcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMS4zLjEgTWFwLnByb3RvdHlwZS5jbGVhcigpXG4gICAgICAvLyAyMy4yLjMuMiBTZXQucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgZm9yICh2YXIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBkYXRhID0gdGhhdC5faSwgZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgICAgICAgZW50cnkuciA9IHRydWU7XG4gICAgICAgICAgaWYgKGVudHJ5LnApIGVudHJ5LnAgPSBlbnRyeS5wLm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZW50cnkuaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5fZiA9IHRoYXQuX2wgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoYXRbU0laRV0gPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB2YWxpZGF0ZSh0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uO1xuICAgICAgICAgIHZhciBwcmV2ID0gZW50cnkucDtcbiAgICAgICAgICBkZWxldGUgdGhhdC5faVtlbnRyeS5pXTtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocHJldikgcHJldi5uID0gbmV4dDtcbiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wID0gcHJldjtcbiAgICAgICAgICBpZiAodGhhdC5fZiA9PSBlbnRyeSkgdGhhdC5fZiA9IG5leHQ7XG4gICAgICAgICAgaWYgKHRoYXQuX2wgPT0gZW50cnkpIHRoYXQuX2wgPSBwcmV2O1xuICAgICAgICAgIHRoYXRbU0laRV0tLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YWxpZGF0ZSh0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoaXMuX2YpIHtcbiAgICAgICAgICBmKGVudHJ5LnYsIGVudHJ5LmssIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuNyBNYXAucHJvdG90eXBlLmhhcyhrZXkpXG4gICAgICAvLyAyMy4yLjMuNyBTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRQKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUodGhpcywgTkFNRSlbU0laRV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgIHZhciBwcmV2LCBpbmRleDtcbiAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGVudHJ5LnYgPSB2YWx1ZTtcbiAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoYXQuX2wgPSBlbnRyeSA9IHtcbiAgICAgICAgaTogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksIC8vIDwtIGluZGV4XG4gICAgICAgIGs6IGtleSwgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBrZXlcbiAgICAgICAgdjogdmFsdWUsICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHZhbHVlXG4gICAgICAgIHA6IHByZXYgPSB0aGF0Ll9sLCAgICAgICAgICAgICAvLyA8LSBwcmV2aW91cyBlbnRyeVxuICAgICAgICBuOiB1bmRlZmluZWQsICAgICAgICAgICAgICAgICAgLy8gPC0gbmV4dCBlbnRyeVxuICAgICAgICByOiBmYWxzZSAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gcmVtb3ZlZFxuICAgICAgfTtcbiAgICAgIGlmICghdGhhdC5fZikgdGhhdC5fZiA9IGVudHJ5O1xuICAgICAgaWYgKHByZXYpIHByZXYubiA9IGVudHJ5O1xuICAgICAgdGhhdFtTSVpFXSsrO1xuICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICBpZiAoaW5kZXggIT09ICdGJykgdGhhdC5faVtpbmRleF0gPSBlbnRyeTtcbiAgICB9IHJldHVybiB0aGF0O1xuICB9LFxuICBnZXRFbnRyeTogZ2V0RW50cnksXG4gIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIE5BTUUsIElTX01BUCkge1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICAkaXRlckRlZmluZShDLCBOQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHRoaXMuX3QgPSB2YWxpZGF0ZShpdGVyYXRlZCwgTkFNRSk7IC8vIHRhcmdldFxuICAgICAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICAgICAgdGhpcy5fbCA9IHVuZGVmaW5lZDsgICAgICAgICAgICAgICAgLy8gcHJldmlvdXNcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIga2luZCA9IHRoYXQuX2s7XG4gICAgICB2YXIgZW50cnkgPSB0aGF0Ll9sO1xuICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucikgZW50cnkgPSBlbnRyeS5wO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghdGhhdC5fdCB8fCAhKHRoYXQuX2wgPSBlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoYXQuX3QuX2YpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHRoYXQuX3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBzdGVwKDEpO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBlbnRyeS5rKTtcbiAgICAgIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBlbnRyeS52KTtcbiAgICAgIHJldHVybiBzdGVwKDAsIFtlbnRyeS5rLCBlbnRyeS52XSk7XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBzZXRTcGVjaWVzKE5BTUUpO1xuICB9XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb2xsZWN0aW9uLXN0cm9uZy5qc1xuLy8gbW9kdWxlIGlkID0gMjI3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGVhY2ggPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMCk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChOQU1FLCB3cmFwcGVyLCBtZXRob2RzLCBjb21tb24sIElTX01BUCwgSVNfV0VBSykge1xuICB2YXIgQmFzZSA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIEMgPSBCYXNlO1xuICB2YXIgQURERVIgPSBJU19NQVAgPyAnc2V0JyA6ICdhZGQnO1xuICB2YXIgcHJvdG8gPSBDICYmIEMucHJvdG90eXBlO1xuICB2YXIgTyA9IHt9O1xuICBpZiAoIURFU0NSSVBUT1JTIHx8IHR5cGVvZiBDICE9ICdmdW5jdGlvbicgfHwgIShJU19XRUFLIHx8IHByb3RvLmZvckVhY2ggJiYgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgQygpLmVudHJpZXMoKS5uZXh0KCk7XG4gIH0pKSkge1xuICAgIC8vIGNyZWF0ZSBjb2xsZWN0aW9uIGNvbnN0cnVjdG9yXG4gICAgQyA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwgbWV0aG9kcyk7XG4gICAgbWV0YS5ORUVEID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBDID0gd3JhcHBlcihmdW5jdGlvbiAodGFyZ2V0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0YXJnZXQsIEMsIE5BTUUsICdfYycpO1xuICAgICAgdGFyZ2V0Ll9jID0gbmV3IEJhc2UoKTtcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRhcmdldFtBRERFUl0sIHRhcmdldCk7XG4gICAgfSk7XG4gICAgZWFjaCgnYWRkLGNsZWFyLGRlbGV0ZSxmb3JFYWNoLGdldCxoYXMsc2V0LGtleXMsdmFsdWVzLGVudHJpZXMsdG9KU09OJy5zcGxpdCgnLCcpLCBmdW5jdGlvbiAoS0VZKSB7XG4gICAgICB2YXIgSVNfQURERVIgPSBLRVkgPT0gJ2FkZCcgfHwgS0VZID09ICdzZXQnO1xuICAgICAgaWYgKEtFWSBpbiBwcm90byAmJiAhKElTX1dFQUsgJiYgS0VZID09ICdjbGVhcicpKSBoaWRlKEMucHJvdG90eXBlLCBLRVksIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIGFuSW5zdGFuY2UodGhpcywgQywgS0VZKTtcbiAgICAgICAgaWYgKCFJU19BRERFUiAmJiBJU19XRUFLICYmICFpc09iamVjdChhKSkgcmV0dXJuIEtFWSA9PSAnZ2V0JyA/IHVuZGVmaW5lZCA6IGZhbHNlO1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fY1tLRVldKGEgPT09IDAgPyAwIDogYSwgYik7XG4gICAgICAgIHJldHVybiBJU19BRERFUiA/IHRoaXMgOiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBJU19XRUFLIHx8IGRQKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYy5zaXplO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0VG9TdHJpbmdUYWcoQywgTkFNRSk7XG5cbiAgT1tOQU1FXSA9IEM7XG4gICRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GLCBPKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQywgTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvbGxlY3Rpb24uanNcbi8vIG1vZHVsZSBpZCA9IDIyOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyAwIC0+IEFycmF5I2ZvckVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyA0IC0+IEFycmF5I2V2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIDYgLT4gQXJyYXkjZmluZEluZGV4XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYXNjID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRZUEUsICRjcmVhdGUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICB2YXIgY3JlYXRlID0gJGNyZWF0ZSB8fCBhc2M7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGNhbGxiYWNrZm4sIHRoYXQpIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IElPYmplY3QoTyk7XG4gICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgdGhhdCwgMyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKHNlbGYubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciByZXN1bHQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWwsIHJlcztcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbCA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzID0gZih2YWwsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHJlc3VsdFtpbmRleF0gPSByZXM7ICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlcykgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHJlc3VsdC5wdXNoKHZhbCk7ICAgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmIChJU19FVkVSWSkgcmV0dXJuIGZhbHNlOyAvLyBldmVyeVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogcmVzdWx0O1xuICB9O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktbWV0aG9kcy5qc1xuLy8gbW9kdWxlIGlkID0gMjI5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIDkuNC4yLjMgQXJyYXlTcGVjaWVzQ3JlYXRlKG9yaWdpbmFsQXJyYXksIGxlbmd0aClcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsLCBsZW5ndGgpIHtcbiAgcmV0dXJuIG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKG9yaWdpbmFsKSkobGVuZ3RoKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzXG4vLyBtb2R1bGUgaWQgPSAyMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzLWFycmF5Jyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsKSB7XG4gIHZhciBDO1xuICBpZiAoaXNBcnJheShvcmlnaW5hbCkpIHtcbiAgICBDID0gb3JpZ2luYWwuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZiAodHlwZW9mIEMgPT0gJ2Z1bmN0aW9uJyAmJiAoQyA9PT0gQXJyYXkgfHwgaXNBcnJheShDLnByb3RvdHlwZSkpKSBDID0gdW5kZWZpbmVkO1xuICAgIGlmIChpc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFU107XG4gICAgICBpZiAoQyA9PT0gbnVsbCkgQyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gcmV0dXJuIEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQztcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanNcbi8vIG1vZHVsZSBpZCA9IDIzMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtYXJyYXkuanNcbi8vIG1vZHVsZSBpZCA9IDIzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ1NldCcsIHsgdG9KU09OOiByZXF1aXJlKCcuL19jb2xsZWN0aW9uLXRvLWpzb24nKSgnU2V0JykgfSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnNldC50by1qc29uLmpzXG4vLyBtb2R1bGUgaWQgPSAyMzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4vX2FycmF5LWZyb20taXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICBpZiAoY2xhc3NvZih0aGlzKSAhPSBOQU1FKSB0aHJvdyBUeXBlRXJyb3IoTkFNRSArIFwiI3RvSlNPTiBpc24ndCBnZW5lcmljXCIpO1xuICAgIHJldHVybiBmcm9tKHRoaXMpO1xuICB9O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29sbGVjdGlvbi10by1qc29uLmpzXG4vLyBtb2R1bGUgaWQgPSAyMzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwidmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXIsIElURVJBVE9SKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yT2YoaXRlciwgZmFsc2UsIHJlc3VsdC5wdXNoLCByZXN1bHQsIElURVJBVE9SKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FycmF5LWZyb20taXRlcmFibGUuanNcbi8vIG1vZHVsZSBpZCA9IDIzNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1zZXQub2ZcbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLW9mJykoJ1NldCcpO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zZXQub2YuanNcbi8vIG1vZHVsZSBpZCA9IDIzNlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT0xMRUNUSU9OKSB7XG4gICRleHBvcnQoJGV4cG9ydC5TLCBDT0xMRUNUSU9OLCB7IG9mOiBmdW5jdGlvbiBvZigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgQSA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgIHdoaWxlIChsZW5ndGgtLSkgQVtsZW5ndGhdID0gYXJndW1lbnRzW2xlbmd0aF07XG4gICAgcmV0dXJuIG5ldyB0aGlzKEEpO1xuICB9IH0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LWNvbGxlY3Rpb24tb2YuanNcbi8vIG1vZHVsZSBpZCA9IDIzN1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy1zZXQuZnJvbVxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tZnJvbScpKCdTZXQnKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc2V0LmZyb20uanNcbi8vIG1vZHVsZSBpZCA9IDIzOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDT0xMRUNUSU9OKSB7XG4gICRleHBvcnQoJGV4cG9ydC5TLCBDT0xMRUNUSU9OLCB7IGZyb206IGZ1bmN0aW9uIGZyb20oc291cmNlIC8qICwgbWFwRm4sIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgbWFwRm4gPSBhcmd1bWVudHNbMV07XG4gICAgdmFyIG1hcHBpbmcsIEEsIG4sIGNiO1xuICAgIGFGdW5jdGlvbih0aGlzKTtcbiAgICBtYXBwaW5nID0gbWFwRm4gIT09IHVuZGVmaW5lZDtcbiAgICBpZiAobWFwcGluZykgYUZ1bmN0aW9uKG1hcEZuKTtcbiAgICBpZiAoc291cmNlID09IHVuZGVmaW5lZCkgcmV0dXJuIG5ldyB0aGlzKCk7XG4gICAgQSA9IFtdO1xuICAgIGlmIChtYXBwaW5nKSB7XG4gICAgICBuID0gMDtcbiAgICAgIGNiID0gY3R4KG1hcEZuLCBhcmd1bWVudHNbMl0sIDIpO1xuICAgICAgZm9yT2Yoc291cmNlLCBmYWxzZSwgZnVuY3Rpb24gKG5leHRJdGVtKSB7XG4gICAgICAgIEEucHVzaChjYihuZXh0SXRlbSwgbisrKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yT2Yoc291cmNlLCBmYWxzZSwgQS5wdXNoLCBBKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyB0aGlzKEEpO1xuICB9IH0pO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LWNvbGxlY3Rpb24tZnJvbS5qc1xuLy8gbW9kdWxlIGlkID0gMjM5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCBmZXRjaCBmcm9tICdub2RlLWZldGNoJztcbmltcG9ydCB7IGxvYWRBbm9tYWx5QnlJZCB9IGZyb20gJy4vYW5vbWFseVR5cGUnO1xuXG5mdW5jdGlvbiBzZW5kTm90aWZpY2F0aW9uKGFub21hbHlJZCwgYWN0aXZlKSB7XG4gIGxldCBhbm9tYWx5TmFtZSA9IGxvYWRBbm9tYWx5QnlJZChhbm9tYWx5SWQpLm5hbWU7XG4gIGNvbnNvbGUubG9nKCdOb3RpZmljYXRpb24gJyArIGFub21hbHlOYW1lKTtcblxuICBsZXQgbm90aWZpY2F0aW9uID0ge1xuICAgIGFub21hbHk6IGFub21hbHlOYW1lLFxuICAgIHN0YXR1czogJydcbiAgfTtcbiAgaWYoYWN0aXZlKSB7XG4gICAgbm90aWZpY2F0aW9uLnN0YXR1cyA9ICdhbGVydCc7XG4gIH0gZWxzZSB7XG4gICAgbm90aWZpY2F0aW9uLnN0YXR1cyA9ICdPSyc7XG4gIH1cblxuICBpZihwcm9jZXNzLmVudi5BTEVSVF9FTkRQT0lOVCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZmV0Y2gocHJvY2Vzcy5lbnYuQUxFUlRfRU5EUE9JTlQsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkobm90aWZpY2F0aW9uKVxuICAgIH0pXG4gICAgICAudGhlbihkYXRhID0+IGNvbnNvbGUubG9nKGRhdGEpKVxuICAgICAgLmNhdGNoKGVyciA9PiBjb25zb2xlLmVycm9yKGBDYW4ndCBzZW5kIGFsZXJ0IHRvICR7cHJvY2Vzcy5lbnYuQUxFUlRfRU5EUE9JTlR9LiBFcnJvcjogJHtlcnJ9YCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoYENhbid0IHNlbmQgYWxlcnQsIGVudiBBTEVSVF9FTkRQT0lOVCBpcyB1bmRlZmluZWRgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBzZW5kTm90aWZpY2F0aW9uIH1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NlcnZpY2VzL25vdGlmaWNhdGlvbi50cyIsIi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS90bXB2YXIvanNkb20vYmxvYi9hYTg1YjJhYmYwNzc2NmZmN2JmNWMxZjZkYWFmYjM3MjZmMmYyZGI1L2xpYi9qc2RvbS9saXZpbmcvYmxvYi5qc1xuLy8gKE1JVCBsaWNlbnNlZClcblxuY29uc3QgQlVGRkVSID0gU3ltYm9sKCdidWZmZXInKTtcbmNvbnN0IFRZUEUgPSBTeW1ib2woJ3R5cGUnKTtcblxuY2xhc3MgQmxvYiB7XG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXNbVFlQRV0gPSAnJztcblxuXHRcdGNvbnN0IGJsb2JQYXJ0cyA9IGFyZ3VtZW50c1swXTtcblx0XHRjb25zdCBvcHRpb25zID0gYXJndW1lbnRzWzFdO1xuXG5cdFx0Y29uc3QgYnVmZmVycyA9IFtdO1xuXG5cdFx0aWYgKGJsb2JQYXJ0cykge1xuXHRcdFx0Y29uc3QgYSA9IGJsb2JQYXJ0cztcblx0XHRcdGNvbnN0IGxlbmd0aCA9IE51bWJlcihhLmxlbmd0aCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IGVsZW1lbnQgPSBhW2ldO1xuXHRcdFx0XHRsZXQgYnVmZmVyO1xuXHRcdFx0XHRpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuXHRcdFx0XHRcdGJ1ZmZlciA9IGVsZW1lbnQ7XG5cdFx0XHRcdH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGVsZW1lbnQpKSB7XG5cdFx0XHRcdFx0YnVmZmVyID0gQnVmZmVyLmZyb20oZWxlbWVudC5idWZmZXIsIGVsZW1lbnQuYnl0ZU9mZnNldCwgZWxlbWVudC5ieXRlTGVuZ3RoKTtcblx0XHRcdFx0fSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcblx0XHRcdFx0XHRidWZmZXIgPSBCdWZmZXIuZnJvbShlbGVtZW50KTtcblx0XHRcdFx0fSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQmxvYikge1xuXHRcdFx0XHRcdGJ1ZmZlciA9IGVsZW1lbnRbQlVGRkVSXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRidWZmZXIgPSBCdWZmZXIuZnJvbSh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgPyBlbGVtZW50IDogU3RyaW5nKGVsZW1lbnQpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRidWZmZXJzLnB1c2goYnVmZmVyKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzW0JVRkZFUl0gPSBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpO1xuXG5cdFx0bGV0IHR5cGUgPSBvcHRpb25zICYmIG9wdGlvbnMudHlwZSAhPT0gdW5kZWZpbmVkICYmIFN0cmluZyhvcHRpb25zLnR5cGUpLnRvTG93ZXJDYXNlKCk7XG5cdFx0aWYgKHR5cGUgJiYgIS9bXlxcdTAwMjAtXFx1MDA3RV0vLnRlc3QodHlwZSkpIHtcblx0XHRcdHRoaXNbVFlQRV0gPSB0eXBlO1xuXHRcdH1cblx0fVxuXHRnZXQgc2l6ZSgpIHtcblx0XHRyZXR1cm4gdGhpc1tCVUZGRVJdLmxlbmd0aDtcblx0fVxuXHRnZXQgdHlwZSgpIHtcblx0XHRyZXR1cm4gdGhpc1tUWVBFXTtcblx0fVxuXHRzbGljZSgpIHtcblx0XHRjb25zdCBzaXplID0gdGhpcy5zaXplO1xuXG5cdFx0Y29uc3Qgc3RhcnQgPSBhcmd1bWVudHNbMF07XG5cdFx0Y29uc3QgZW5kID0gYXJndW1lbnRzWzFdO1xuXHRcdGxldCByZWxhdGl2ZVN0YXJ0LCByZWxhdGl2ZUVuZDtcblx0XHRpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVsYXRpdmVTdGFydCA9IDA7XG5cdFx0fSBlbHNlIGlmIChzdGFydCA8IDApIHtcblx0XHRcdHJlbGF0aXZlU3RhcnQgPSBNYXRoLm1heChzaXplICsgc3RhcnQsIDApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZWxhdGl2ZVN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsIHNpemUpO1xuXHRcdH1cblx0XHRpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlbGF0aXZlRW5kID0gc2l6ZTtcblx0XHR9IGVsc2UgaWYgKGVuZCA8IDApIHtcblx0XHRcdHJlbGF0aXZlRW5kID0gTWF0aC5tYXgoc2l6ZSArIGVuZCwgMCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlbGF0aXZlRW5kID0gTWF0aC5taW4oZW5kLCBzaXplKTtcblx0XHR9XG5cdFx0Y29uc3Qgc3BhbiA9IE1hdGgubWF4KHJlbGF0aXZlRW5kIC0gcmVsYXRpdmVTdGFydCwgMCk7XG5cblx0XHRjb25zdCBidWZmZXIgPSB0aGlzW0JVRkZFUl07XG5cdFx0Y29uc3Qgc2xpY2VkQnVmZmVyID0gYnVmZmVyLnNsaWNlKHJlbGF0aXZlU3RhcnQsIHJlbGF0aXZlU3RhcnQgKyBzcGFuKTtcblx0XHRjb25zdCBibG9iID0gbmV3IEJsb2IoW10sIHsgdHlwZTogYXJndW1lbnRzWzJdIH0pO1xuXHRcdGJsb2JbQlVGRkVSXSA9IHNsaWNlZEJ1ZmZlcjtcblx0XHRyZXR1cm4gYmxvYjtcblx0fVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhCbG9iLnByb3RvdHlwZSwge1xuXHRzaXplOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0dHlwZTogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG5cdHNsaWNlOiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCbG9iLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG5cdHZhbHVlOiAnQmxvYicsXG5cdHdyaXRhYmxlOiBmYWxzZSxcblx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5cbi8qKlxuICogZmV0Y2gtZXJyb3IuanNcbiAqXG4gKiBGZXRjaEVycm9yIGludGVyZmFjZSBmb3Igb3BlcmF0aW9uYWwgZXJyb3JzXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgRmV0Y2hFcnJvciBpbnN0YW5jZVxuICpcbiAqIEBwYXJhbSAgIFN0cmluZyAgICAgIG1lc3NhZ2UgICAgICBFcnJvciBtZXNzYWdlIGZvciBodW1hblxuICogQHBhcmFtICAgU3RyaW5nICAgICAgdHlwZSAgICAgICAgIEVycm9yIHR5cGUgZm9yIG1hY2hpbmVcbiAqIEBwYXJhbSAgIFN0cmluZyAgICAgIHN5c3RlbUVycm9yICBGb3IgTm9kZS5qcyBzeXN0ZW0gZXJyb3JcbiAqIEByZXR1cm4gIEZldGNoRXJyb3JcbiAqL1xuZnVuY3Rpb24gRmV0Y2hFcnJvcihtZXNzYWdlLCB0eXBlLCBzeXN0ZW1FcnJvcikge1xuICBFcnJvci5jYWxsKHRoaXMsIG1lc3NhZ2UpO1xuXG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG5cbiAgLy8gd2hlbiBlcnIudHlwZSBpcyBgc3lzdGVtYCwgZXJyLmNvZGUgY29udGFpbnMgc3lzdGVtIGVycm9yIGNvZGVcbiAgaWYgKHN5c3RlbUVycm9yKSB7XG4gICAgdGhpcy5jb2RlID0gdGhpcy5lcnJubyA9IHN5c3RlbUVycm9yLmNvZGU7XG4gIH1cblxuICAvLyBoaWRlIGN1c3RvbSBlcnJvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZyb20gZW5kLXVzZXJzXG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xufVxuXG5GZXRjaEVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcbkZldGNoRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmV0Y2hFcnJvcjtcbkZldGNoRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnRmV0Y2hFcnJvcic7XG5cbi8qKlxuICogYm9keS5qc1xuICpcbiAqIEJvZHkgaW50ZXJmYWNlIHByb3ZpZGVzIGNvbW1vbiBtZXRob2RzIGZvciBSZXF1ZXN0IGFuZCBSZXNwb25zZVxuICovXG5cbmNvbnN0IFN0cmVhbSA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuXG52YXIgX3JlcXVpcmUgPSByZXF1aXJlKCdzdHJlYW0nKTtcblxuY29uc3QgUGFzc1Rocm91Z2ggPSBfcmVxdWlyZS5QYXNzVGhyb3VnaDtcblxuXG5sZXQgY29udmVydDtcbnRyeSB7XG5cdGNvbnZlcnQgPSByZXF1aXJlKCdlbmNvZGluZycpLmNvbnZlcnQ7XG59IGNhdGNoIChlKSB7fVxuXG5jb25zdCBJTlRFUk5BTFMgPSBTeW1ib2woJ0JvZHkgaW50ZXJuYWxzJyk7XG5cbi8qKlxuICogQm9keSBtaXhpblxuICpcbiAqIFJlZjogaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2JvZHlcbiAqXG4gKiBAcGFyYW0gICBTdHJlYW0gIGJvZHkgIFJlYWRhYmxlIHN0cmVhbVxuICogQHBhcmFtICAgT2JqZWN0ICBvcHRzICBSZXNwb25zZSBvcHRpb25zXG4gKiBAcmV0dXJuICBWb2lkXG4gKi9cbmZ1bmN0aW9uIEJvZHkoYm9keSkge1xuXHR2YXIgX3RoaXMgPSB0aGlzO1xuXG5cdHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcblx0ICAgIF9yZWYkc2l6ZSA9IF9yZWYuc2l6ZTtcblxuXHRsZXQgc2l6ZSA9IF9yZWYkc2l6ZSA9PT0gdW5kZWZpbmVkID8gMCA6IF9yZWYkc2l6ZTtcblx0dmFyIF9yZWYkdGltZW91dCA9IF9yZWYudGltZW91dDtcblx0bGV0IHRpbWVvdXQgPSBfcmVmJHRpbWVvdXQgPT09IHVuZGVmaW5lZCA/IDAgOiBfcmVmJHRpbWVvdXQ7XG5cblx0aWYgKGJvZHkgPT0gbnVsbCkge1xuXHRcdC8vIGJvZHkgaXMgdW5kZWZpbmVkIG9yIG51bGxcblx0XHRib2R5ID0gbnVsbDtcblx0fSBlbHNlIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcblx0XHQvLyBib2R5IGlzIHN0cmluZ1xuXHR9IGVsc2UgaWYgKGlzVVJMU2VhcmNoUGFyYW1zKGJvZHkpKSB7XG5cdFx0Ly8gYm9keSBpcyBhIFVSTFNlYXJjaFBhcmFtc1xuXHR9IGVsc2UgaWYgKGJvZHkgaW5zdGFuY2VvZiBCbG9iKSB7XG5cdFx0Ly8gYm9keSBpcyBibG9iXG5cdH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGJvZHkpKSB7XG5cdFx0Ly8gYm9keSBpcyBidWZmZXJcblx0fSBlbHNlIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYm9keSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcblx0XHQvLyBib2R5IGlzIGFycmF5IGJ1ZmZlclxuXHR9IGVsc2UgaWYgKGJvZHkgaW5zdGFuY2VvZiBTdHJlYW0pIHtcblx0XHQvLyBib2R5IGlzIHN0cmVhbVxuXHR9IGVsc2Uge1xuXHRcdC8vIG5vbmUgb2YgdGhlIGFib3ZlXG5cdFx0Ly8gY29lcmNlIHRvIHN0cmluZ1xuXHRcdGJvZHkgPSBTdHJpbmcoYm9keSk7XG5cdH1cblx0dGhpc1tJTlRFUk5BTFNdID0ge1xuXHRcdGJvZHksXG5cdFx0ZGlzdHVyYmVkOiBmYWxzZSxcblx0XHRlcnJvcjogbnVsbFxuXHR9O1xuXHR0aGlzLnNpemUgPSBzaXplO1xuXHR0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuXG5cdGlmIChib2R5IGluc3RhbmNlb2YgU3RyZWFtKSB7XG5cdFx0Ym9keS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG5cdFx0XHRfdGhpc1tJTlRFUk5BTFNdLmVycm9yID0gbmV3IEZldGNoRXJyb3IoYEludmFsaWQgcmVzcG9uc2UgYm9keSB3aGlsZSB0cnlpbmcgdG8gZmV0Y2ggJHtfdGhpcy51cmx9OiAke2Vyci5tZXNzYWdlfWAsICdzeXN0ZW0nLCBlcnIpO1xuXHRcdH0pO1xuXHR9XG59XG5cbkJvZHkucHJvdG90eXBlID0ge1xuXHRnZXQgYm9keSgpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFNdLmJvZHk7XG5cdH0sXG5cblx0Z2V0IGJvZHlVc2VkKCkge1xuXHRcdHJldHVybiB0aGlzW0lOVEVSTkFMU10uZGlzdHVyYmVkO1xuXHR9LFxuXG5cdC8qKlxuICAqIERlY29kZSByZXNwb25zZSBhcyBBcnJheUJ1ZmZlclxuICAqXG4gICogQHJldHVybiAgUHJvbWlzZVxuICAqL1xuXHRhcnJheUJ1ZmZlcigpIHtcblx0XHRyZXR1cm4gY29uc3VtZUJvZHkuY2FsbCh0aGlzKS50aGVuKGZ1bmN0aW9uIChidWYpIHtcblx0XHRcdHJldHVybiBidWYuYnVmZmVyLnNsaWNlKGJ1Zi5ieXRlT2Zmc2V0LCBidWYuYnl0ZU9mZnNldCArIGJ1Zi5ieXRlTGVuZ3RoKTtcblx0XHR9KTtcblx0fSxcblxuXHQvKipcbiAgKiBSZXR1cm4gcmF3IHJlc3BvbnNlIGFzIEJsb2JcbiAgKlxuICAqIEByZXR1cm4gUHJvbWlzZVxuICAqL1xuXHRibG9iKCkge1xuXHRcdGxldCBjdCA9IHRoaXMuaGVhZGVycyAmJiB0aGlzLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSB8fCAnJztcblx0XHRyZXR1cm4gY29uc3VtZUJvZHkuY2FsbCh0aGlzKS50aGVuKGZ1bmN0aW9uIChidWYpIHtcblx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKFxuXHRcdFx0Ly8gUHJldmVudCBjb3B5aW5nXG5cdFx0XHRuZXcgQmxvYihbXSwge1xuXHRcdFx0XHR0eXBlOiBjdC50b0xvd2VyQ2FzZSgpXG5cdFx0XHR9KSwge1xuXHRcdFx0XHRbQlVGRkVSXTogYnVmXG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fSxcblxuXHQvKipcbiAgKiBEZWNvZGUgcmVzcG9uc2UgYXMganNvblxuICAqXG4gICogQHJldHVybiAgUHJvbWlzZVxuICAqL1xuXHRqc29uKCkge1xuXHRcdHZhciBfdGhpczIgPSB0aGlzO1xuXG5cdFx0cmV0dXJuIGNvbnN1bWVCb2R5LmNhbGwodGhpcykudGhlbihmdW5jdGlvbiAoYnVmZmVyKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXR1cm4gSlNPTi5wYXJzZShidWZmZXIudG9TdHJpbmcoKSk7XG5cdFx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdFx0cmV0dXJuIEJvZHkuUHJvbWlzZS5yZWplY3QobmV3IEZldGNoRXJyb3IoYGludmFsaWQganNvbiByZXNwb25zZSBib2R5IGF0ICR7X3RoaXMyLnVybH0gcmVhc29uOiAke2Vyci5tZXNzYWdlfWAsICdpbnZhbGlkLWpzb24nKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG4gICogRGVjb2RlIHJlc3BvbnNlIGFzIHRleHRcbiAgKlxuICAqIEByZXR1cm4gIFByb21pc2VcbiAgKi9cblx0dGV4dCgpIHtcblx0XHRyZXR1cm4gY29uc3VtZUJvZHkuY2FsbCh0aGlzKS50aGVuKGZ1bmN0aW9uIChidWZmZXIpIHtcblx0XHRcdHJldHVybiBidWZmZXIudG9TdHJpbmcoKTtcblx0XHR9KTtcblx0fSxcblxuXHQvKipcbiAgKiBEZWNvZGUgcmVzcG9uc2UgYXMgYnVmZmVyIChub24tc3BlYyBhcGkpXG4gICpcbiAgKiBAcmV0dXJuICBQcm9taXNlXG4gICovXG5cdGJ1ZmZlcigpIHtcblx0XHRyZXR1cm4gY29uc3VtZUJvZHkuY2FsbCh0aGlzKTtcblx0fSxcblxuXHQvKipcbiAgKiBEZWNvZGUgcmVzcG9uc2UgYXMgdGV4dCwgd2hpbGUgYXV0b21hdGljYWxseSBkZXRlY3RpbmcgdGhlIGVuY29kaW5nIGFuZFxuICAqIHRyeWluZyB0byBkZWNvZGUgdG8gVVRGLTggKG5vbi1zcGVjIGFwaSlcbiAgKlxuICAqIEByZXR1cm4gIFByb21pc2VcbiAgKi9cblx0dGV4dENvbnZlcnRlZCgpIHtcblx0XHR2YXIgX3RoaXMzID0gdGhpcztcblxuXHRcdHJldHVybiBjb25zdW1lQm9keS5jYWxsKHRoaXMpLnRoZW4oZnVuY3Rpb24gKGJ1ZmZlcikge1xuXHRcdFx0cmV0dXJuIGNvbnZlcnRCb2R5KGJ1ZmZlciwgX3RoaXMzLmhlYWRlcnMpO1xuXHRcdH0pO1xuXHR9XG5cbn07XG5cbi8vIEluIGJyb3dzZXJzLCBhbGwgcHJvcGVydGllcyBhcmUgZW51bWVyYWJsZS5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEJvZHkucHJvdG90eXBlLCB7XG5cdGJvZHk6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRib2R5VXNlZDogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG5cdGFycmF5QnVmZmVyOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0YmxvYjogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG5cdGpzb246IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHR0ZXh0OiB7IGVudW1lcmFibGU6IHRydWUgfVxufSk7XG5cbkJvZHkubWl4SW4gPSBmdW5jdGlvbiAocHJvdG8pIHtcblx0Zm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKEJvZHkucHJvdG90eXBlKSkge1xuXHRcdC8vIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBmdXR1cmUgcHJvb2Zcblx0XHRpZiAoIShuYW1lIGluIHByb3RvKSkge1xuXHRcdFx0Y29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoQm9keS5wcm90b3R5cGUsIG5hbWUpO1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBuYW1lLCBkZXNjKTtcblx0XHR9XG5cdH1cbn07XG5cbi8qKlxuICogQ29uc3VtZSBhbmQgY29udmVydCBhbiBlbnRpcmUgQm9keSB0byBhIEJ1ZmZlci5cbiAqXG4gKiBSZWY6IGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktY29uc3VtZS1ib2R5XG4gKlxuICogQHJldHVybiAgUHJvbWlzZVxuICovXG5mdW5jdGlvbiBjb25zdW1lQm9keSgpIHtcblx0dmFyIF90aGlzNCA9IHRoaXM7XG5cblx0aWYgKHRoaXNbSU5URVJOQUxTXS5kaXN0dXJiZWQpIHtcblx0XHRyZXR1cm4gQm9keS5Qcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKGBib2R5IHVzZWQgYWxyZWFkeSBmb3I6ICR7dGhpcy51cmx9YCkpO1xuXHR9XG5cblx0dGhpc1tJTlRFUk5BTFNdLmRpc3R1cmJlZCA9IHRydWU7XG5cblx0aWYgKHRoaXNbSU5URVJOQUxTXS5lcnJvcikge1xuXHRcdHJldHVybiBCb2R5LlByb21pc2UucmVqZWN0KHRoaXNbSU5URVJOQUxTXS5lcnJvcik7XG5cdH1cblxuXHQvLyBib2R5IGlzIG51bGxcblx0aWYgKHRoaXMuYm9keSA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBCb2R5LlByb21pc2UucmVzb2x2ZShCdWZmZXIuYWxsb2MoMCkpO1xuXHR9XG5cblx0Ly8gYm9keSBpcyBzdHJpbmdcblx0aWYgKHR5cGVvZiB0aGlzLmJvZHkgPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIEJvZHkuUHJvbWlzZS5yZXNvbHZlKEJ1ZmZlci5mcm9tKHRoaXMuYm9keSkpO1xuXHR9XG5cblx0Ly8gYm9keSBpcyBibG9iXG5cdGlmICh0aGlzLmJvZHkgaW5zdGFuY2VvZiBCbG9iKSB7XG5cdFx0cmV0dXJuIEJvZHkuUHJvbWlzZS5yZXNvbHZlKHRoaXMuYm9keVtCVUZGRVJdKTtcblx0fVxuXG5cdC8vIGJvZHkgaXMgYnVmZmVyXG5cdGlmIChCdWZmZXIuaXNCdWZmZXIodGhpcy5ib2R5KSkge1xuXHRcdHJldHVybiBCb2R5LlByb21pc2UucmVzb2x2ZSh0aGlzLmJvZHkpO1xuXHR9XG5cblx0Ly8gYm9keSBpcyBidWZmZXJcblx0aWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzLmJvZHkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG5cdFx0cmV0dXJuIEJvZHkuUHJvbWlzZS5yZXNvbHZlKEJ1ZmZlci5mcm9tKHRoaXMuYm9keSkpO1xuXHR9XG5cblx0Ly8gaXN0YW5idWwgaWdub3JlIGlmOiBzaG91bGQgbmV2ZXIgaGFwcGVuXG5cdGlmICghKHRoaXMuYm9keSBpbnN0YW5jZW9mIFN0cmVhbSkpIHtcblx0XHRyZXR1cm4gQm9keS5Qcm9taXNlLnJlc29sdmUoQnVmZmVyLmFsbG9jKDApKTtcblx0fVxuXG5cdC8vIGJvZHkgaXMgc3RyZWFtXG5cdC8vIGdldCByZWFkeSB0byBhY3R1YWxseSBjb25zdW1lIHRoZSBib2R5XG5cdGxldCBhY2N1bSA9IFtdO1xuXHRsZXQgYWNjdW1CeXRlcyA9IDA7XG5cdGxldCBhYm9ydCA9IGZhbHNlO1xuXG5cdHJldHVybiBuZXcgQm9keS5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRsZXQgcmVzVGltZW91dDtcblxuXHRcdC8vIGFsbG93IHRpbWVvdXQgb24gc2xvdyByZXNwb25zZSBib2R5XG5cdFx0aWYgKF90aGlzNC50aW1lb3V0KSB7XG5cdFx0XHRyZXNUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGFib3J0ID0gdHJ1ZTtcblx0XHRcdFx0cmVqZWN0KG5ldyBGZXRjaEVycm9yKGBSZXNwb25zZSB0aW1lb3V0IHdoaWxlIHRyeWluZyB0byBmZXRjaCAke190aGlzNC51cmx9IChvdmVyICR7X3RoaXM0LnRpbWVvdXR9bXMpYCwgJ2JvZHktdGltZW91dCcpKTtcblx0XHRcdH0sIF90aGlzNC50aW1lb3V0KTtcblx0XHR9XG5cblx0XHQvLyBoYW5kbGUgc3RyZWFtIGVycm9yLCBzdWNoIGFzIGluY29ycmVjdCBjb250ZW50LWVuY29kaW5nXG5cdFx0X3RoaXM0LmJvZHkub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuXHRcdFx0cmVqZWN0KG5ldyBGZXRjaEVycm9yKGBJbnZhbGlkIHJlc3BvbnNlIGJvZHkgd2hpbGUgdHJ5aW5nIHRvIGZldGNoICR7X3RoaXM0LnVybH06ICR7ZXJyLm1lc3NhZ2V9YCwgJ3N5c3RlbScsIGVycikpO1xuXHRcdH0pO1xuXG5cdFx0X3RoaXM0LmJvZHkub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcblx0XHRcdGlmIChhYm9ydCB8fCBjaHVuayA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChfdGhpczQuc2l6ZSAmJiBhY2N1bUJ5dGVzICsgY2h1bmsubGVuZ3RoID4gX3RoaXM0LnNpemUpIHtcblx0XHRcdFx0YWJvcnQgPSB0cnVlO1xuXHRcdFx0XHRyZWplY3QobmV3IEZldGNoRXJyb3IoYGNvbnRlbnQgc2l6ZSBhdCAke190aGlzNC51cmx9IG92ZXIgbGltaXQ6ICR7X3RoaXM0LnNpemV9YCwgJ21heC1zaXplJykpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGFjY3VtQnl0ZXMgKz0gY2h1bmsubGVuZ3RoO1xuXHRcdFx0YWNjdW0ucHVzaChjaHVuayk7XG5cdFx0fSk7XG5cblx0XHRfdGhpczQuYm9keS5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKGFib3J0KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y2xlYXJUaW1lb3V0KHJlc1RpbWVvdXQpO1xuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXNvbHZlKEJ1ZmZlci5jb25jYXQoYWNjdW0pKTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHQvLyBoYW5kbGUgc3RyZWFtcyB0aGF0IGhhdmUgYWNjdW11bGF0ZWQgdG9vIG11Y2ggZGF0YSAoaXNzdWUgIzQxNClcblx0XHRcdFx0cmVqZWN0KG5ldyBGZXRjaEVycm9yKGBDb3VsZCBub3QgY3JlYXRlIEJ1ZmZlciBmcm9tIHJlc3BvbnNlIGJvZHkgZm9yICR7X3RoaXM0LnVybH06ICR7ZXJyLm1lc3NhZ2V9YCwgJ3N5c3RlbScsIGVycikpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBEZXRlY3QgYnVmZmVyIGVuY29kaW5nIGFuZCBjb252ZXJ0IHRvIHRhcmdldCBlbmNvZGluZ1xuICogcmVmOiBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1dELWh0bWw1LTIwMTEwMTEzL3BhcnNpbmcuaHRtbCNkZXRlcm1pbmluZy10aGUtY2hhcmFjdGVyLWVuY29kaW5nXG4gKlxuICogQHBhcmFtICAgQnVmZmVyICBidWZmZXIgICAgSW5jb21pbmcgYnVmZmVyXG4gKiBAcGFyYW0gICBTdHJpbmcgIGVuY29kaW5nICBUYXJnZXQgZW5jb2RpbmdcbiAqIEByZXR1cm4gIFN0cmluZ1xuICovXG5mdW5jdGlvbiBjb252ZXJ0Qm9keShidWZmZXIsIGhlYWRlcnMpIHtcblx0aWYgKHR5cGVvZiBjb252ZXJ0ICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgcGFja2FnZSBgZW5jb2RpbmdgIG11c3QgYmUgaW5zdGFsbGVkIHRvIHVzZSB0aGUgdGV4dENvbnZlcnRlZCgpIGZ1bmN0aW9uJyk7XG5cdH1cblxuXHRjb25zdCBjdCA9IGhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcblx0bGV0IGNoYXJzZXQgPSAndXRmLTgnO1xuXHRsZXQgcmVzLCBzdHI7XG5cblx0Ly8gaGVhZGVyXG5cdGlmIChjdCkge1xuXHRcdHJlcyA9IC9jaGFyc2V0PShbXjtdKikvaS5leGVjKGN0KTtcblx0fVxuXG5cdC8vIG5vIGNoYXJzZXQgaW4gY29udGVudCB0eXBlLCBwZWVrIGF0IHJlc3BvbnNlIGJvZHkgZm9yIGF0IG1vc3QgMTAyNCBieXRlc1xuXHRzdHIgPSBidWZmZXIuc2xpY2UoMCwgMTAyNCkudG9TdHJpbmcoKTtcblxuXHQvLyBodG1sNVxuXHRpZiAoIXJlcyAmJiBzdHIpIHtcblx0XHRyZXMgPSAvPG1ldGEuKz9jaGFyc2V0PShbJ1wiXSkoLis/KVxcMS9pLmV4ZWMoc3RyKTtcblx0fVxuXG5cdC8vIGh0bWw0XG5cdGlmICghcmVzICYmIHN0cikge1xuXHRcdHJlcyA9IC88bWV0YVtcXHNdKz9odHRwLWVxdWl2PShbJ1wiXSljb250ZW50LXR5cGVcXDFbXFxzXSs/Y29udGVudD0oWydcIl0pKC4rPylcXDIvaS5leGVjKHN0cik7XG5cblx0XHRpZiAocmVzKSB7XG5cdFx0XHRyZXMgPSAvY2hhcnNldD0oLiopL2kuZXhlYyhyZXMucG9wKCkpO1xuXHRcdH1cblx0fVxuXG5cdC8vIHhtbFxuXHRpZiAoIXJlcyAmJiBzdHIpIHtcblx0XHRyZXMgPSAvPFxcP3htbC4rP2VuY29kaW5nPShbJ1wiXSkoLis/KVxcMS9pLmV4ZWMoc3RyKTtcblx0fVxuXG5cdC8vIGZvdW5kIGNoYXJzZXRcblx0aWYgKHJlcykge1xuXHRcdGNoYXJzZXQgPSByZXMucG9wKCk7XG5cblx0XHQvLyBwcmV2ZW50IGRlY29kZSBpc3N1ZXMgd2hlbiBzaXRlcyB1c2UgaW5jb3JyZWN0IGVuY29kaW5nXG5cdFx0Ly8gcmVmOiBodHRwczovL2hzaXZvbmVuLmZpL2VuY29kaW5nLW1lbnUvXG5cdFx0aWYgKGNoYXJzZXQgPT09ICdnYjIzMTInIHx8IGNoYXJzZXQgPT09ICdnYmsnKSB7XG5cdFx0XHRjaGFyc2V0ID0gJ2diMTgwMzAnO1xuXHRcdH1cblx0fVxuXG5cdC8vIHR1cm4gcmF3IGJ1ZmZlcnMgaW50byBhIHNpbmdsZSB1dGYtOCBidWZmZXJcblx0cmV0dXJuIGNvbnZlcnQoYnVmZmVyLCAnVVRGLTgnLCBjaGFyc2V0KS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIERldGVjdCBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2JpdGlubi9ub2RlLWZldGNoL2lzc3Vlcy8yOTYjaXNzdWVjb21tZW50LTMwNzU5ODE0M1xuICpcbiAqIEBwYXJhbSAgIE9iamVjdCAgb2JqICAgICBPYmplY3QgdG8gZGV0ZWN0IGJ5IHR5cGUgb3IgYnJhbmRcbiAqIEByZXR1cm4gIFN0cmluZ1xuICovXG5mdW5jdGlvbiBpc1VSTFNlYXJjaFBhcmFtcyhvYmopIHtcblx0Ly8gRHVjay10eXBpbmcgYXMgYSBuZWNlc3NhcnkgY29uZGl0aW9uLlxuXHRpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iai5hcHBlbmQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIG9iai5kZWxldGUgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIG9iai5nZXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIG9iai5nZXRBbGwgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIG9iai5oYXMgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIG9iai5zZXQgIT09ICdmdW5jdGlvbicpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBCcmFuZC1jaGVja2luZyBhbmQgbW9yZSBkdWNrLXR5cGluZyBhcyBvcHRpb25hbCBjb25kaXRpb24uXG5cdHJldHVybiBvYmouY29uc3RydWN0b3IubmFtZSA9PT0gJ1VSTFNlYXJjaFBhcmFtcycgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IFVSTFNlYXJjaFBhcmFtc10nIHx8IHR5cGVvZiBvYmouc29ydCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBDbG9uZSBib2R5IGdpdmVuIFJlcy9SZXEgaW5zdGFuY2VcbiAqXG4gKiBAcGFyYW0gICBNaXhlZCAgaW5zdGFuY2UgIFJlc3BvbnNlIG9yIFJlcXVlc3QgaW5zdGFuY2VcbiAqIEByZXR1cm4gIE1peGVkXG4gKi9cbmZ1bmN0aW9uIGNsb25lKGluc3RhbmNlKSB7XG5cdGxldCBwMSwgcDI7XG5cdGxldCBib2R5ID0gaW5zdGFuY2UuYm9keTtcblxuXHQvLyBkb24ndCBhbGxvdyBjbG9uaW5nIGEgdXNlZCBib2R5XG5cdGlmIChpbnN0YW5jZS5ib2R5VXNlZCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignY2Fubm90IGNsb25lIGJvZHkgYWZ0ZXIgaXQgaXMgdXNlZCcpO1xuXHR9XG5cblx0Ly8gY2hlY2sgdGhhdCBib2R5IGlzIGEgc3RyZWFtIGFuZCBub3QgZm9ybS1kYXRhIG9iamVjdFxuXHQvLyBub3RlOiB3ZSBjYW4ndCBjbG9uZSB0aGUgZm9ybS1kYXRhIG9iamVjdCB3aXRob3V0IGhhdmluZyBpdCBhcyBhIGRlcGVuZGVuY3lcblx0aWYgKGJvZHkgaW5zdGFuY2VvZiBTdHJlYW0gJiYgdHlwZW9mIGJvZHkuZ2V0Qm91bmRhcnkgIT09ICdmdW5jdGlvbicpIHtcblx0XHQvLyB0ZWUgaW5zdGFuY2UgYm9keVxuXHRcdHAxID0gbmV3IFBhc3NUaHJvdWdoKCk7XG5cdFx0cDIgPSBuZXcgUGFzc1Rocm91Z2goKTtcblx0XHRib2R5LnBpcGUocDEpO1xuXHRcdGJvZHkucGlwZShwMik7XG5cdFx0Ly8gc2V0IGluc3RhbmNlIGJvZHkgdG8gdGVlZCBib2R5IGFuZCByZXR1cm4gdGhlIG90aGVyIHRlZWQgYm9keVxuXHRcdGluc3RhbmNlW0lOVEVSTkFMU10uYm9keSA9IHAxO1xuXHRcdGJvZHkgPSBwMjtcblx0fVxuXG5cdHJldHVybiBib2R5O1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBvcGVyYXRpb24gXCJleHRyYWN0IGEgYENvbnRlbnQtVHlwZWAgdmFsdWUgZnJvbSB8b2JqZWN0fFwiIGFzXG4gKiBzcGVjaWZpZWQgaW4gdGhlIHNwZWNpZmljYXRpb246XG4gKiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1ib2R5aW5pdC1leHRyYWN0XG4gKlxuICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgaW5zdGFuY2UuYm9keSBpcyBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSAgIE1peGVkICBpbnN0YW5jZSAgUmVzcG9uc2Ugb3IgUmVxdWVzdCBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBleHRyYWN0Q29udGVudFR5cGUoaW5zdGFuY2UpIHtcblx0Y29uc3QgYm9keSA9IGluc3RhbmNlLmJvZHk7XG5cblx0Ly8gaXN0YW5idWwgaWdub3JlIGlmOiBDdXJyZW50bHksIGJlY2F1c2Ugb2YgYSBndWFyZCBpbiBSZXF1ZXN0LCBib2R5XG5cdC8vIGNhbiBuZXZlciBiZSBudWxsLiBJbmNsdWRlZCBoZXJlIGZvciBjb21wbGV0ZW5lc3MuXG5cblx0aWYgKGJvZHkgPT09IG51bGwpIHtcblx0XHQvLyBib2R5IGlzIG51bGxcblx0XHRyZXR1cm4gbnVsbDtcblx0fSBlbHNlIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcblx0XHQvLyBib2R5IGlzIHN0cmluZ1xuXHRcdHJldHVybiAndGV4dC9wbGFpbjtjaGFyc2V0PVVURi04Jztcblx0fSBlbHNlIGlmIChpc1VSTFNlYXJjaFBhcmFtcyhib2R5KSkge1xuXHRcdC8vIGJvZHkgaXMgYSBVUkxTZWFyY2hQYXJhbXNcblx0XHRyZXR1cm4gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04Jztcblx0fSBlbHNlIGlmIChib2R5IGluc3RhbmNlb2YgQmxvYikge1xuXHRcdC8vIGJvZHkgaXMgYmxvYlxuXHRcdHJldHVybiBib2R5LnR5cGUgfHwgbnVsbDtcblx0fSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIoYm9keSkpIHtcblx0XHQvLyBib2R5IGlzIGJ1ZmZlclxuXHRcdHJldHVybiBudWxsO1xuXHR9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChib2R5KSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuXHRcdC8vIGJvZHkgaXMgYXJyYXkgYnVmZmVyXG5cdFx0cmV0dXJuIG51bGw7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGJvZHkuZ2V0Qm91bmRhcnkgPT09ICdmdW5jdGlvbicpIHtcblx0XHQvLyBkZXRlY3QgZm9ybSBkYXRhIGlucHV0IGZyb20gZm9ybS1kYXRhIG1vZHVsZVxuXHRcdHJldHVybiBgbXVsdGlwYXJ0L2Zvcm0tZGF0YTtib3VuZGFyeT0ke2JvZHkuZ2V0Qm91bmRhcnkoKX1gO1xuXHR9IGVsc2Uge1xuXHRcdC8vIGJvZHkgaXMgc3RyZWFtXG5cdFx0Ly8gY2FuJ3QgcmVhbGx5IGRvIG11Y2ggYWJvdXQgdGhpc1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogVGhlIEZldGNoIFN0YW5kYXJkIHRyZWF0cyB0aGlzIGFzIGlmIFwidG90YWwgYnl0ZXNcIiBpcyBhIHByb3BlcnR5IG9uIHRoZSBib2R5LlxuICogRm9yIHVzLCB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZ2V0IGl0IHdpdGggYSBmdW5jdGlvbi5cbiAqXG4gKiByZWY6IGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNjb25jZXB0LWJvZHktdG90YWwtYnl0ZXNcbiAqXG4gKiBAcGFyYW0gICBCb2R5ICAgIGluc3RhbmNlICAgSW5zdGFuY2Ugb2YgQm9keVxuICogQHJldHVybiAgTnVtYmVyPyAgICAgICAgICAgIE51bWJlciBvZiBieXRlcywgb3IgbnVsbCBpZiBub3QgcG9zc2libGVcbiAqL1xuZnVuY3Rpb24gZ2V0VG90YWxCeXRlcyhpbnN0YW5jZSkge1xuXHRjb25zdCBib2R5ID0gaW5zdGFuY2UuYm9keTtcblxuXHQvLyBpc3RhbmJ1bCBpZ25vcmUgaWY6IGluY2x1ZGVkIGZvciBjb21wbGV0aW9uXG5cblx0aWYgKGJvZHkgPT09IG51bGwpIHtcblx0XHQvLyBib2R5IGlzIG51bGxcblx0XHRyZXR1cm4gMDtcblx0fSBlbHNlIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcblx0XHQvLyBib2R5IGlzIHN0cmluZ1xuXHRcdHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChib2R5KTtcblx0fSBlbHNlIGlmIChpc1VSTFNlYXJjaFBhcmFtcyhib2R5KSkge1xuXHRcdC8vIGJvZHkgaXMgVVJMU2VhcmNoUGFyYW1zXG5cdFx0cmV0dXJuIEJ1ZmZlci5ieXRlTGVuZ3RoKFN0cmluZyhib2R5KSk7XG5cdH0gZWxzZSBpZiAoYm9keSBpbnN0YW5jZW9mIEJsb2IpIHtcblx0XHQvLyBib2R5IGlzIGJsb2Jcblx0XHRyZXR1cm4gYm9keS5zaXplO1xuXHR9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihib2R5KSkge1xuXHRcdC8vIGJvZHkgaXMgYnVmZmVyXG5cdFx0cmV0dXJuIGJvZHkubGVuZ3RoO1xuXHR9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChib2R5KSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJykge1xuXHRcdC8vIGJvZHkgaXMgYXJyYXkgYnVmZmVyXG5cdFx0cmV0dXJuIGJvZHkuYnl0ZUxlbmd0aDtcblx0fSBlbHNlIGlmIChib2R5ICYmIHR5cGVvZiBib2R5LmdldExlbmd0aFN5bmMgPT09ICdmdW5jdGlvbicpIHtcblx0XHQvLyBkZXRlY3QgZm9ybSBkYXRhIGlucHV0IGZyb20gZm9ybS1kYXRhIG1vZHVsZVxuXHRcdGlmIChib2R5Ll9sZW5ndGhSZXRyaWV2ZXJzICYmIGJvZHkuX2xlbmd0aFJldHJpZXZlcnMubGVuZ3RoID09IDAgfHwgLy8gMS54XG5cdFx0Ym9keS5oYXNLbm93bkxlbmd0aCAmJiBib2R5Lmhhc0tub3duTGVuZ3RoKCkpIHtcblx0XHRcdC8vIDIueFxuXHRcdFx0cmV0dXJuIGJvZHkuZ2V0TGVuZ3RoU3luYygpO1xuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fSBlbHNlIHtcblx0XHQvLyBib2R5IGlzIHN0cmVhbVxuXHRcdC8vIGNhbid0IHJlYWxseSBkbyBtdWNoIGFib3V0IHRoaXNcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufVxuXG4vKipcbiAqIFdyaXRlIGEgQm9keSB0byBhIE5vZGUuanMgV3JpdGFibGVTdHJlYW0gKGUuZy4gaHR0cC5SZXF1ZXN0KSBvYmplY3QuXG4gKlxuICogQHBhcmFtICAgQm9keSAgICBpbnN0YW5jZSAgIEluc3RhbmNlIG9mIEJvZHlcbiAqIEByZXR1cm4gIFZvaWRcbiAqL1xuZnVuY3Rpb24gd3JpdGVUb1N0cmVhbShkZXN0LCBpbnN0YW5jZSkge1xuXHRjb25zdCBib2R5ID0gaW5zdGFuY2UuYm9keTtcblxuXG5cdGlmIChib2R5ID09PSBudWxsKSB7XG5cdFx0Ly8gYm9keSBpcyBudWxsXG5cdFx0ZGVzdC5lbmQoKTtcblx0fSBlbHNlIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcblx0XHQvLyBib2R5IGlzIHN0cmluZ1xuXHRcdGRlc3Qud3JpdGUoYm9keSk7XG5cdFx0ZGVzdC5lbmQoKTtcblx0fSBlbHNlIGlmIChpc1VSTFNlYXJjaFBhcmFtcyhib2R5KSkge1xuXHRcdC8vIGJvZHkgaXMgVVJMU2VhcmNoUGFyYW1zXG5cdFx0ZGVzdC53cml0ZShCdWZmZXIuZnJvbShTdHJpbmcoYm9keSkpKTtcblx0XHRkZXN0LmVuZCgpO1xuXHR9IGVsc2UgaWYgKGJvZHkgaW5zdGFuY2VvZiBCbG9iKSB7XG5cdFx0Ly8gYm9keSBpcyBibG9iXG5cdFx0ZGVzdC53cml0ZShib2R5W0JVRkZFUl0pO1xuXHRcdGRlc3QuZW5kKCk7XG5cdH0gZWxzZSBpZiAoQnVmZmVyLmlzQnVmZmVyKGJvZHkpKSB7XG5cdFx0Ly8gYm9keSBpcyBidWZmZXJcblx0XHRkZXN0LndyaXRlKGJvZHkpO1xuXHRcdGRlc3QuZW5kKCk7XG5cdH0gZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGJvZHkpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG5cdFx0Ly8gYm9keSBpcyBhcnJheSBidWZmZXJcblx0XHRkZXN0LndyaXRlKEJ1ZmZlci5mcm9tKGJvZHkpKTtcblx0XHRkZXN0LmVuZCgpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIGJvZHkgaXMgc3RyZWFtXG5cdFx0Ym9keS5waXBlKGRlc3QpO1xuXHR9XG59XG5cbi8vIGV4cG9zZSBQcm9taXNlXG5Cb2R5LlByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcblxuLyoqXG4gKiBoZWFkZXJzLmpzXG4gKlxuICogSGVhZGVycyBjbGFzcyBvZmZlcnMgY29udmVuaWVudCBoZWxwZXJzXG4gKi9cblxuY29uc3QgaW52YWxpZFRva2VuUmVnZXggPSAvW15cXF5fYGEtekEtWlxcLTAtOSEjJCUmJyorLnx+XS87XG5jb25zdCBpbnZhbGlkSGVhZGVyQ2hhclJlZ2V4ID0gL1teXFx0XFx4MjAtXFx4N2VcXHg4MC1cXHhmZl0vO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZU5hbWUobmFtZSkge1xuXHRuYW1lID0gYCR7bmFtZX1gO1xuXHRpZiAoaW52YWxpZFRva2VuUmVnZXgudGVzdChuYW1lKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYCR7bmFtZX0gaXMgbm90IGEgbGVnYWwgSFRUUCBoZWFkZXIgbmFtZWApO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVmFsdWUodmFsdWUpIHtcblx0dmFsdWUgPSBgJHt2YWx1ZX1gO1xuXHRpZiAoaW52YWxpZEhlYWRlckNoYXJSZWdleC50ZXN0KHZhbHVlKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYCR7dmFsdWV9IGlzIG5vdCBhIGxlZ2FsIEhUVFAgaGVhZGVyIHZhbHVlYCk7XG5cdH1cbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBrZXkgaW4gdGhlIG1hcCBvYmplY3QgZ2l2ZW4gYSBoZWFkZXIgbmFtZS5cbiAqXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBub3QgZm91bmQuXG4gKlxuICogQHBhcmFtICAgU3RyaW5nICBuYW1lICBIZWFkZXIgbmFtZVxuICogQHJldHVybiAgU3RyaW5nfFVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBmaW5kKG1hcCwgbmFtZSkge1xuXHRuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRmb3IgKGNvbnN0IGtleSBpbiBtYXApIHtcblx0XHRpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09IG5hbWUpIHtcblx0XHRcdHJldHVybiBrZXk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IE1BUCA9IFN5bWJvbCgnbWFwJyk7XG5jbGFzcyBIZWFkZXJzIHtcblx0LyoqXG4gICogSGVhZGVycyBjbGFzc1xuICAqXG4gICogQHBhcmFtICAgT2JqZWN0ICBoZWFkZXJzICBSZXNwb25zZSBoZWFkZXJzXG4gICogQHJldHVybiAgVm9pZFxuICAqL1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRsZXQgaW5pdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkO1xuXG5cdFx0dGhpc1tNQVBdID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuXHRcdGlmIChpbml0IGluc3RhbmNlb2YgSGVhZGVycykge1xuXHRcdFx0Y29uc3QgcmF3SGVhZGVycyA9IGluaXQucmF3KCk7XG5cdFx0XHRjb25zdCBoZWFkZXJOYW1lcyA9IE9iamVjdC5rZXlzKHJhd0hlYWRlcnMpO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGhlYWRlck5hbWUgb2YgaGVhZGVyTmFtZXMpIHtcblx0XHRcdFx0Zm9yIChjb25zdCB2YWx1ZSBvZiByYXdIZWFkZXJzW2hlYWRlck5hbWVdKSB7XG5cdFx0XHRcdFx0dGhpcy5hcHBlbmQoaGVhZGVyTmFtZSwgdmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBXZSBkb24ndCB3b3JyeSBhYm91dCBjb252ZXJ0aW5nIHByb3AgdG8gQnl0ZVN0cmluZyBoZXJlIGFzIGFwcGVuZCgpXG5cdFx0Ly8gd2lsbCBoYW5kbGUgaXQuXG5cdFx0aWYgKGluaXQgPT0gbnVsbCkge1xuXHRcdFx0Ly8gbm8gb3Bcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBpbml0ID09PSAnb2JqZWN0Jykge1xuXHRcdFx0Y29uc3QgbWV0aG9kID0gaW5pdFtTeW1ib2wuaXRlcmF0b3JdO1xuXHRcdFx0aWYgKG1ldGhvZCAhPSBudWxsKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgbWV0aG9kICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignSGVhZGVyIHBhaXJzIG11c3QgYmUgaXRlcmFibGUnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHNlcXVlbmNlPHNlcXVlbmNlPEJ5dGVTdHJpbmc+PlxuXHRcdFx0XHQvLyBOb3RlOiBwZXIgc3BlYyB3ZSBoYXZlIHRvIGZpcnN0IGV4aGF1c3QgdGhlIGxpc3RzIHRoZW4gcHJvY2VzcyB0aGVtXG5cdFx0XHRcdGNvbnN0IHBhaXJzID0gW107XG5cdFx0XHRcdGZvciAoY29uc3QgcGFpciBvZiBpbml0KSB7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBwYWlyICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgcGFpcltTeW1ib2wuaXRlcmF0b3JdICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFYWNoIGhlYWRlciBwYWlyIG11c3QgYmUgaXRlcmFibGUnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cGFpcnMucHVzaChBcnJheS5mcm9tKHBhaXIpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuXHRcdFx0XHRcdGlmIChwYWlyLmxlbmd0aCAhPT0gMikge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRWFjaCBoZWFkZXIgcGFpciBtdXN0IGJlIGEgbmFtZS92YWx1ZSB0dXBsZScpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLmFwcGVuZChwYWlyWzBdLCBwYWlyWzFdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gcmVjb3JkPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+XG5cdFx0XHRcdGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGluaXQpKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBpbml0W2tleV07XG5cdFx0XHRcdFx0dGhpcy5hcHBlbmQoa2V5LCB2YWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignUHJvdmlkZWQgaW5pdGlhbGl6ZXIgbXVzdCBiZSBhbiBvYmplY3QnKTtcblx0XHR9XG5cdH1cblxuXHQvKipcbiAgKiBSZXR1cm4gY29tYmluZWQgaGVhZGVyIHZhbHVlIGdpdmVuIG5hbWVcbiAgKlxuICAqIEBwYXJhbSAgIFN0cmluZyAgbmFtZSAgSGVhZGVyIG5hbWVcbiAgKiBAcmV0dXJuICBNaXhlZFxuICAqL1xuXHRnZXQobmFtZSkge1xuXHRcdG5hbWUgPSBgJHtuYW1lfWA7XG5cdFx0dmFsaWRhdGVOYW1lKG5hbWUpO1xuXHRcdGNvbnN0IGtleSA9IGZpbmQodGhpc1tNQVBdLCBuYW1lKTtcblx0XHRpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzW01BUF1ba2V5XS5qb2luKCcsICcpO1xuXHR9XG5cblx0LyoqXG4gICogSXRlcmF0ZSBvdmVyIGFsbCBoZWFkZXJzXG4gICpcbiAgKiBAcGFyYW0gICBGdW5jdGlvbiAgY2FsbGJhY2sgIEV4ZWN1dGVkIGZvciBlYWNoIGl0ZW0gd2l0aCBwYXJhbWV0ZXJzICh2YWx1ZSwgbmFtZSwgdGhpc0FyZylcbiAgKiBAcGFyYW0gICBCb29sZWFuICAgdGhpc0FyZyAgIGB0aGlzYCBjb250ZXh0IGZvciBjYWxsYmFjayBmdW5jdGlvblxuICAqIEByZXR1cm4gIFZvaWRcbiAgKi9cblx0Zm9yRWFjaChjYWxsYmFjaykge1xuXHRcdGxldCB0aGlzQXJnID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG5cblx0XHRsZXQgcGFpcnMgPSBnZXRIZWFkZXJzKHRoaXMpO1xuXHRcdGxldCBpID0gMDtcblx0XHR3aGlsZSAoaSA8IHBhaXJzLmxlbmd0aCkge1xuXHRcdFx0dmFyIF9wYWlycyRpID0gcGFpcnNbaV07XG5cdFx0XHRjb25zdCBuYW1lID0gX3BhaXJzJGlbMF0sXG5cdFx0XHQgICAgICB2YWx1ZSA9IF9wYWlycyRpWzFdO1xuXG5cdFx0XHRjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHZhbHVlLCBuYW1lLCB0aGlzKTtcblx0XHRcdHBhaXJzID0gZ2V0SGVhZGVycyh0aGlzKTtcblx0XHRcdGkrKztcblx0XHR9XG5cdH1cblxuXHQvKipcbiAgKiBPdmVyd3JpdGUgaGVhZGVyIHZhbHVlcyBnaXZlbiBuYW1lXG4gICpcbiAgKiBAcGFyYW0gICBTdHJpbmcgIG5hbWUgICBIZWFkZXIgbmFtZVxuICAqIEBwYXJhbSAgIFN0cmluZyAgdmFsdWUgIEhlYWRlciB2YWx1ZVxuICAqIEByZXR1cm4gIFZvaWRcbiAgKi9cblx0c2V0KG5hbWUsIHZhbHVlKSB7XG5cdFx0bmFtZSA9IGAke25hbWV9YDtcblx0XHR2YWx1ZSA9IGAke3ZhbHVlfWA7XG5cdFx0dmFsaWRhdGVOYW1lKG5hbWUpO1xuXHRcdHZhbGlkYXRlVmFsdWUodmFsdWUpO1xuXHRcdGNvbnN0IGtleSA9IGZpbmQodGhpc1tNQVBdLCBuYW1lKTtcblx0XHR0aGlzW01BUF1ba2V5ICE9PSB1bmRlZmluZWQgPyBrZXkgOiBuYW1lXSA9IFt2YWx1ZV07XG5cdH1cblxuXHQvKipcbiAgKiBBcHBlbmQgYSB2YWx1ZSBvbnRvIGV4aXN0aW5nIGhlYWRlclxuICAqXG4gICogQHBhcmFtICAgU3RyaW5nICBuYW1lICAgSGVhZGVyIG5hbWVcbiAgKiBAcGFyYW0gICBTdHJpbmcgIHZhbHVlICBIZWFkZXIgdmFsdWVcbiAgKiBAcmV0dXJuICBWb2lkXG4gICovXG5cdGFwcGVuZChuYW1lLCB2YWx1ZSkge1xuXHRcdG5hbWUgPSBgJHtuYW1lfWA7XG5cdFx0dmFsdWUgPSBgJHt2YWx1ZX1gO1xuXHRcdHZhbGlkYXRlTmFtZShuYW1lKTtcblx0XHR2YWxpZGF0ZVZhbHVlKHZhbHVlKTtcblx0XHRjb25zdCBrZXkgPSBmaW5kKHRoaXNbTUFQXSwgbmFtZSk7XG5cdFx0aWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzW01BUF1ba2V5XS5wdXNoKHZhbHVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpc1tNQVBdW25hbWVdID0gW3ZhbHVlXTtcblx0XHR9XG5cdH1cblxuXHQvKipcbiAgKiBDaGVjayBmb3IgaGVhZGVyIG5hbWUgZXhpc3RlbmNlXG4gICpcbiAgKiBAcGFyYW0gICBTdHJpbmcgICBuYW1lICBIZWFkZXIgbmFtZVxuICAqIEByZXR1cm4gIEJvb2xlYW5cbiAgKi9cblx0aGFzKG5hbWUpIHtcblx0XHRuYW1lID0gYCR7bmFtZX1gO1xuXHRcdHZhbGlkYXRlTmFtZShuYW1lKTtcblx0XHRyZXR1cm4gZmluZCh0aGlzW01BUF0sIG5hbWUpICE9PSB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcbiAgKiBEZWxldGUgYWxsIGhlYWRlciB2YWx1ZXMgZ2l2ZW4gbmFtZVxuICAqXG4gICogQHBhcmFtICAgU3RyaW5nICBuYW1lICBIZWFkZXIgbmFtZVxuICAqIEByZXR1cm4gIFZvaWRcbiAgKi9cblx0ZGVsZXRlKG5hbWUpIHtcblx0XHRuYW1lID0gYCR7bmFtZX1gO1xuXHRcdHZhbGlkYXRlTmFtZShuYW1lKTtcblx0XHRjb25zdCBrZXkgPSBmaW5kKHRoaXNbTUFQXSwgbmFtZSk7XG5cdFx0aWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRkZWxldGUgdGhpc1tNQVBdW2tleV07XG5cdFx0fVxuXHR9XG5cblx0LyoqXG4gICogUmV0dXJuIHJhdyBoZWFkZXJzIChub24tc3BlYyBhcGkpXG4gICpcbiAgKiBAcmV0dXJuICBPYmplY3RcbiAgKi9cblx0cmF3KCkge1xuXHRcdHJldHVybiB0aGlzW01BUF07XG5cdH1cblxuXHQvKipcbiAgKiBHZXQgYW4gaXRlcmF0b3Igb24ga2V5cy5cbiAgKlxuICAqIEByZXR1cm4gIEl0ZXJhdG9yXG4gICovXG5cdGtleXMoKSB7XG5cdFx0cmV0dXJuIGNyZWF0ZUhlYWRlcnNJdGVyYXRvcih0aGlzLCAna2V5Jyk7XG5cdH1cblxuXHQvKipcbiAgKiBHZXQgYW4gaXRlcmF0b3Igb24gdmFsdWVzLlxuICAqXG4gICogQHJldHVybiAgSXRlcmF0b3JcbiAgKi9cblx0dmFsdWVzKCkge1xuXHRcdHJldHVybiBjcmVhdGVIZWFkZXJzSXRlcmF0b3IodGhpcywgJ3ZhbHVlJyk7XG5cdH1cblxuXHQvKipcbiAgKiBHZXQgYW4gaXRlcmF0b3Igb24gZW50cmllcy5cbiAgKlxuICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgaXRlcmF0b3Igb2YgdGhlIEhlYWRlcnMgb2JqZWN0LlxuICAqXG4gICogQHJldHVybiAgSXRlcmF0b3JcbiAgKi9cblx0W1N5bWJvbC5pdGVyYXRvcl0oKSB7XG5cdFx0cmV0dXJuIGNyZWF0ZUhlYWRlcnNJdGVyYXRvcih0aGlzLCAna2V5K3ZhbHVlJyk7XG5cdH1cbn1cbkhlYWRlcnMucHJvdG90eXBlLmVudHJpZXMgPSBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoSGVhZGVycy5wcm90b3R5cGUsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuXHR2YWx1ZTogJ0hlYWRlcnMnLFxuXHR3cml0YWJsZTogZmFsc2UsXG5cdGVudW1lcmFibGU6IGZhbHNlLFxuXHRjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhIZWFkZXJzLnByb3RvdHlwZSwge1xuXHRnZXQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRmb3JFYWNoOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0c2V0OiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0YXBwZW5kOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0aGFzOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0ZGVsZXRlOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0a2V5czogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG5cdHZhbHVlczogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG5cdGVudHJpZXM6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcblxuZnVuY3Rpb24gZ2V0SGVhZGVycyhoZWFkZXJzKSB7XG5cdGxldCBraW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAna2V5K3ZhbHVlJztcblxuXHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVyc1tNQVBdKS5zb3J0KCk7XG5cdHJldHVybiBrZXlzLm1hcChraW5kID09PSAna2V5JyA/IGZ1bmN0aW9uIChrKSB7XG5cdFx0cmV0dXJuIGsudG9Mb3dlckNhc2UoKTtcblx0fSA6IGtpbmQgPT09ICd2YWx1ZScgPyBmdW5jdGlvbiAoaykge1xuXHRcdHJldHVybiBoZWFkZXJzW01BUF1ba10uam9pbignLCAnKTtcblx0fSA6IGZ1bmN0aW9uIChrKSB7XG5cdFx0cmV0dXJuIFtrLnRvTG93ZXJDYXNlKCksIGhlYWRlcnNbTUFQXVtrXS5qb2luKCcsICcpXTtcblx0fSk7XG59XG5cbmNvbnN0IElOVEVSTkFMID0gU3ltYm9sKCdpbnRlcm5hbCcpO1xuXG5mdW5jdGlvbiBjcmVhdGVIZWFkZXJzSXRlcmF0b3IodGFyZ2V0LCBraW5kKSB7XG5cdGNvbnN0IGl0ZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShIZWFkZXJzSXRlcmF0b3JQcm90b3R5cGUpO1xuXHRpdGVyYXRvcltJTlRFUk5BTF0gPSB7XG5cdFx0dGFyZ2V0LFxuXHRcdGtpbmQsXG5cdFx0aW5kZXg6IDBcblx0fTtcblx0cmV0dXJuIGl0ZXJhdG9yO1xufVxuXG5jb25zdCBIZWFkZXJzSXRlcmF0b3JQcm90b3R5cGUgPSBPYmplY3Quc2V0UHJvdG90eXBlT2Yoe1xuXHRuZXh0KCkge1xuXHRcdC8vIGlzdGFuYnVsIGlnbm9yZSBpZlxuXHRcdGlmICghdGhpcyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykgIT09IEhlYWRlcnNJdGVyYXRvclByb3RvdHlwZSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignVmFsdWUgb2YgYHRoaXNgIGlzIG5vdCBhIEhlYWRlcnNJdGVyYXRvcicpO1xuXHRcdH1cblxuXHRcdHZhciBfSU5URVJOQUwgPSB0aGlzW0lOVEVSTkFMXTtcblx0XHRjb25zdCB0YXJnZXQgPSBfSU5URVJOQUwudGFyZ2V0LFxuXHRcdCAgICAgIGtpbmQgPSBfSU5URVJOQUwua2luZCxcblx0XHQgICAgICBpbmRleCA9IF9JTlRFUk5BTC5pbmRleDtcblxuXHRcdGNvbnN0IHZhbHVlcyA9IGdldEhlYWRlcnModGFyZ2V0LCBraW5kKTtcblx0XHRjb25zdCBsZW4gPSB2YWx1ZXMubGVuZ3RoO1xuXHRcdGlmIChpbmRleCA+PSBsZW4pIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHZhbHVlOiB1bmRlZmluZWQsXG5cdFx0XHRcdGRvbmU6IHRydWVcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0dGhpc1tJTlRFUk5BTF0uaW5kZXggPSBpbmRleCArIDE7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dmFsdWU6IHZhbHVlc1tpbmRleF0sXG5cdFx0XHRkb25lOiBmYWxzZVxuXHRcdH07XG5cdH1cbn0sIE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoW11bU3ltYm9sLml0ZXJhdG9yXSgpKSkpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoSGVhZGVyc0l0ZXJhdG9yUHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcblx0dmFsdWU6ICdIZWFkZXJzSXRlcmF0b3InLFxuXHR3cml0YWJsZTogZmFsc2UsXG5cdGVudW1lcmFibGU6IGZhbHNlLFxuXHRjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG4vKipcbiAqIEV4cG9ydCB0aGUgSGVhZGVycyBvYmplY3QgaW4gYSBmb3JtIHRoYXQgTm9kZS5qcyBjYW4gY29uc3VtZS5cbiAqXG4gKiBAcGFyYW0gICBIZWFkZXJzICBoZWFkZXJzXG4gKiBAcmV0dXJuICBPYmplY3RcbiAqL1xuZnVuY3Rpb24gZXhwb3J0Tm9kZUNvbXBhdGlibGVIZWFkZXJzKGhlYWRlcnMpIHtcblx0Y29uc3Qgb2JqID0gT2JqZWN0LmFzc2lnbih7IF9fcHJvdG9fXzogbnVsbCB9LCBoZWFkZXJzW01BUF0pO1xuXG5cdC8vIGh0dHAucmVxdWVzdCgpIG9ubHkgc3VwcG9ydHMgc3RyaW5nIGFzIEhvc3QgaGVhZGVyLiBUaGlzIGhhY2sgbWFrZXNcblx0Ly8gc3BlY2lmeWluZyBjdXN0b20gSG9zdCBoZWFkZXIgcG9zc2libGUuXG5cdGNvbnN0IGhvc3RIZWFkZXJLZXkgPSBmaW5kKGhlYWRlcnNbTUFQXSwgJ0hvc3QnKTtcblx0aWYgKGhvc3RIZWFkZXJLZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdG9ialtob3N0SGVhZGVyS2V5XSA9IG9ialtob3N0SGVhZGVyS2V5XVswXTtcblx0fVxuXG5cdHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgSGVhZGVycyBvYmplY3QgZnJvbSBhbiBvYmplY3Qgb2YgaGVhZGVycywgaWdub3JpbmcgdGhvc2UgdGhhdCBkb1xuICogbm90IGNvbmZvcm0gdG8gSFRUUCBncmFtbWFyIHByb2R1Y3Rpb25zLlxuICpcbiAqIEBwYXJhbSAgIE9iamVjdCAgb2JqICBPYmplY3Qgb2YgaGVhZGVyc1xuICogQHJldHVybiAgSGVhZGVyc1xuICovXG5mdW5jdGlvbiBjcmVhdGVIZWFkZXJzTGVuaWVudChvYmopIHtcblx0Y29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG5cdGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG5cdFx0aWYgKGludmFsaWRUb2tlblJlZ2V4LnRlc3QobmFtZSkpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRpZiAoQXJyYXkuaXNBcnJheShvYmpbbmFtZV0pKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHZhbCBvZiBvYmpbbmFtZV0pIHtcblx0XHRcdFx0aWYgKGludmFsaWRIZWFkZXJDaGFyUmVnZXgudGVzdCh2YWwpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGhlYWRlcnNbTUFQXVtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aGVhZGVyc1tNQVBdW25hbWVdID0gW3ZhbF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aGVhZGVyc1tNQVBdW25hbWVdLnB1c2godmFsKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoIWludmFsaWRIZWFkZXJDaGFyUmVnZXgudGVzdChvYmpbbmFtZV0pKSB7XG5cdFx0XHRoZWFkZXJzW01BUF1bbmFtZV0gPSBbb2JqW25hbWVdXTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGhlYWRlcnM7XG59XG5cbi8qKlxuICogcmVzcG9uc2UuanNcbiAqXG4gKiBSZXNwb25zZSBjbGFzcyBwcm92aWRlcyBjb250ZW50IGRlY29kaW5nXG4gKi9cblxudmFyIF9yZXF1aXJlJDEgPSByZXF1aXJlKCdodHRwJyk7XG5cbmNvbnN0IFNUQVRVU19DT0RFUyA9IF9yZXF1aXJlJDEuU1RBVFVTX0NPREVTO1xuXG5cbmNvbnN0IElOVEVSTkFMUyQxID0gU3ltYm9sKCdSZXNwb25zZSBpbnRlcm5hbHMnKTtcblxuLyoqXG4gKiBSZXNwb25zZSBjbGFzc1xuICpcbiAqIEBwYXJhbSAgIFN0cmVhbSAgYm9keSAgUmVhZGFibGUgc3RyZWFtXG4gKiBAcGFyYW0gICBPYmplY3QgIG9wdHMgIFJlc3BvbnNlIG9wdGlvbnNcbiAqIEByZXR1cm4gIFZvaWRcbiAqL1xuY2xhc3MgUmVzcG9uc2Uge1xuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRsZXQgYm9keSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcblx0XHRsZXQgb3B0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cblx0XHRCb2R5LmNhbGwodGhpcywgYm9keSwgb3B0cyk7XG5cblx0XHRjb25zdCBzdGF0dXMgPSBvcHRzLnN0YXR1cyB8fCAyMDA7XG5cblx0XHR0aGlzW0lOVEVSTkFMUyQxXSA9IHtcblx0XHRcdHVybDogb3B0cy51cmwsXG5cdFx0XHRzdGF0dXMsXG5cdFx0XHRzdGF0dXNUZXh0OiBvcHRzLnN0YXR1c1RleHQgfHwgU1RBVFVTX0NPREVTW3N0YXR1c10sXG5cdFx0XHRoZWFkZXJzOiBuZXcgSGVhZGVycyhvcHRzLmhlYWRlcnMpXG5cdFx0fTtcblx0fVxuXG5cdGdldCB1cmwoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDFdLnVybDtcblx0fVxuXG5cdGdldCBzdGF0dXMoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDFdLnN0YXR1cztcblx0fVxuXG5cdC8qKlxuICAqIENvbnZlbmllbmNlIHByb3BlcnR5IHJlcHJlc2VudGluZyBpZiB0aGUgcmVxdWVzdCBlbmRlZCBub3JtYWxseVxuICAqL1xuXHRnZXQgb2soKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDFdLnN0YXR1cyA+PSAyMDAgJiYgdGhpc1tJTlRFUk5BTFMkMV0uc3RhdHVzIDwgMzAwO1xuXHR9XG5cblx0Z2V0IHN0YXR1c1RleHQoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDFdLnN0YXR1c1RleHQ7XG5cdH1cblxuXHRnZXQgaGVhZGVycygpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMV0uaGVhZGVycztcblx0fVxuXG5cdC8qKlxuICAqIENsb25lIHRoaXMgcmVzcG9uc2VcbiAgKlxuICAqIEByZXR1cm4gIFJlc3BvbnNlXG4gICovXG5cdGNsb25lKCkge1xuXHRcdHJldHVybiBuZXcgUmVzcG9uc2UoY2xvbmUodGhpcyksIHtcblx0XHRcdHVybDogdGhpcy51cmwsXG5cdFx0XHRzdGF0dXM6IHRoaXMuc3RhdHVzLFxuXHRcdFx0c3RhdHVzVGV4dDogdGhpcy5zdGF0dXNUZXh0LFxuXHRcdFx0aGVhZGVyczogdGhpcy5oZWFkZXJzLFxuXHRcdFx0b2s6IHRoaXMub2tcblx0XHR9KTtcblx0fVxufVxuXG5Cb2R5Lm1peEluKFJlc3BvbnNlLnByb3RvdHlwZSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlc3BvbnNlLnByb3RvdHlwZSwge1xuXHR1cmw6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRzdGF0dXM6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRvazogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG5cdHN0YXR1c1RleHQ6IHsgZW51bWVyYWJsZTogdHJ1ZSB9LFxuXHRoZWFkZXJzOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0Y2xvbmU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlc3BvbnNlLnByb3RvdHlwZSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG5cdHZhbHVlOiAnUmVzcG9uc2UnLFxuXHR3cml0YWJsZTogZmFsc2UsXG5cdGVudW1lcmFibGU6IGZhbHNlLFxuXHRjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG4vKipcbiAqIHJlcXVlc3QuanNcbiAqXG4gKiBSZXF1ZXN0IGNsYXNzIGNvbnRhaW5zIHNlcnZlciBvbmx5IG9wdGlvbnNcbiAqXG4gKiBBbGwgc3BlYyBhbGdvcml0aG0gc3RlcCBudW1iZXJzIGFyZSBiYXNlZCBvbiBodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy9jb21taXQtc25hcHNob3RzL2FlNzE2ODIyY2IzYTYxODQzMjI2Y2QwOTBlZWZjNjU4OTQ0NmMxZDIvLlxuICovXG5cbnZhciBfcmVxdWlyZSQyID0gcmVxdWlyZSgndXJsJyk7XG5cbmNvbnN0IGZvcm1hdF91cmwgPSBfcmVxdWlyZSQyLmZvcm1hdDtcbmNvbnN0IHBhcnNlX3VybCA9IF9yZXF1aXJlJDIucGFyc2U7XG5cblxuY29uc3QgSU5URVJOQUxTJDIgPSBTeW1ib2woJ1JlcXVlc3QgaW50ZXJuYWxzJyk7XG5cbi8qKlxuICogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBSZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSAgIE1peGVkICAgaW5wdXRcbiAqIEByZXR1cm4gIEJvb2xlYW5cbiAqL1xuZnVuY3Rpb24gaXNSZXF1ZXN0KGlucHV0KSB7XG5cdHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIHR5cGVvZiBpbnB1dFtJTlRFUk5BTFMkMl0gPT09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIFJlcXVlc3QgY2xhc3NcbiAqXG4gKiBAcGFyYW0gICBNaXhlZCAgIGlucHV0ICBVcmwgb3IgUmVxdWVzdCBpbnN0YW5jZVxuICogQHBhcmFtICAgT2JqZWN0ICBpbml0ICAgQ3VzdG9tIG9wdGlvbnNcbiAqIEByZXR1cm4gIFZvaWRcbiAqL1xuY2xhc3MgUmVxdWVzdCB7XG5cdGNvbnN0cnVjdG9yKGlucHV0KSB7XG5cdFx0bGV0IGluaXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG5cdFx0bGV0IHBhcnNlZFVSTDtcblxuXHRcdC8vIG5vcm1hbGl6ZSBpbnB1dFxuXHRcdGlmICghaXNSZXF1ZXN0KGlucHV0KSkge1xuXHRcdFx0aWYgKGlucHV0ICYmIGlucHV0LmhyZWYpIHtcblx0XHRcdFx0Ly8gaW4gb3JkZXIgdG8gc3VwcG9ydCBOb2RlLmpzJyBVcmwgb2JqZWN0czsgdGhvdWdoIFdIQVRXRydzIFVSTCBvYmplY3RzXG5cdFx0XHRcdC8vIHdpbGwgZmFsbCBpbnRvIHRoaXMgYnJhbmNoIGFsc28gKHNpbmNlIHRoZWlyIGB0b1N0cmluZygpYCB3aWxsIHJldHVyblxuXHRcdFx0XHQvLyBgaHJlZmAgcHJvcGVydHkgYW55d2F5KVxuXHRcdFx0XHRwYXJzZWRVUkwgPSBwYXJzZV91cmwoaW5wdXQuaHJlZik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBjb2VyY2UgaW5wdXQgdG8gYSBzdHJpbmcgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcGFyc2Vcblx0XHRcdFx0cGFyc2VkVVJMID0gcGFyc2VfdXJsKGAke2lucHV0fWApO1xuXHRcdFx0fVxuXHRcdFx0aW5wdXQgPSB7fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyc2VkVVJMID0gcGFyc2VfdXJsKGlucHV0LnVybCk7XG5cdFx0fVxuXG5cdFx0bGV0IG1ldGhvZCA9IGluaXQubWV0aG9kIHx8IGlucHV0Lm1ldGhvZCB8fCAnR0VUJztcblx0XHRtZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcblxuXHRcdGlmICgoaW5pdC5ib2R5ICE9IG51bGwgfHwgaXNSZXF1ZXN0KGlucHV0KSAmJiBpbnB1dC5ib2R5ICE9PSBudWxsKSAmJiAobWV0aG9kID09PSAnR0VUJyB8fCBtZXRob2QgPT09ICdIRUFEJykpIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlcXVlc3Qgd2l0aCBHRVQvSEVBRCBtZXRob2QgY2Fubm90IGhhdmUgYm9keScpO1xuXHRcdH1cblxuXHRcdGxldCBpbnB1dEJvZHkgPSBpbml0LmJvZHkgIT0gbnVsbCA/IGluaXQuYm9keSA6IGlzUmVxdWVzdChpbnB1dCkgJiYgaW5wdXQuYm9keSAhPT0gbnVsbCA/IGNsb25lKGlucHV0KSA6IG51bGw7XG5cblx0XHRCb2R5LmNhbGwodGhpcywgaW5wdXRCb2R5LCB7XG5cdFx0XHR0aW1lb3V0OiBpbml0LnRpbWVvdXQgfHwgaW5wdXQudGltZW91dCB8fCAwLFxuXHRcdFx0c2l6ZTogaW5pdC5zaXplIHx8IGlucHV0LnNpemUgfHwgMFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKGluaXQuaGVhZGVycyB8fCBpbnB1dC5oZWFkZXJzIHx8IHt9KTtcblxuXHRcdGlmIChpbml0LmJvZHkgIT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgY29udGVudFR5cGUgPSBleHRyYWN0Q29udGVudFR5cGUodGhpcyk7XG5cdFx0XHRpZiAoY29udGVudFR5cGUgIT09IG51bGwgJiYgIWhlYWRlcnMuaGFzKCdDb250ZW50LVR5cGUnKSkge1xuXHRcdFx0XHRoZWFkZXJzLmFwcGVuZCgnQ29udGVudC1UeXBlJywgY29udGVudFR5cGUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXNbSU5URVJOQUxTJDJdID0ge1xuXHRcdFx0bWV0aG9kLFxuXHRcdFx0cmVkaXJlY3Q6IGluaXQucmVkaXJlY3QgfHwgaW5wdXQucmVkaXJlY3QgfHwgJ2ZvbGxvdycsXG5cdFx0XHRoZWFkZXJzLFxuXHRcdFx0cGFyc2VkVVJMXG5cdFx0fTtcblxuXHRcdC8vIG5vZGUtZmV0Y2gtb25seSBvcHRpb25zXG5cdFx0dGhpcy5mb2xsb3cgPSBpbml0LmZvbGxvdyAhPT0gdW5kZWZpbmVkID8gaW5pdC5mb2xsb3cgOiBpbnB1dC5mb2xsb3cgIT09IHVuZGVmaW5lZCA/IGlucHV0LmZvbGxvdyA6IDIwO1xuXHRcdHRoaXMuY29tcHJlc3MgPSBpbml0LmNvbXByZXNzICE9PSB1bmRlZmluZWQgPyBpbml0LmNvbXByZXNzIDogaW5wdXQuY29tcHJlc3MgIT09IHVuZGVmaW5lZCA/IGlucHV0LmNvbXByZXNzIDogdHJ1ZTtcblx0XHR0aGlzLmNvdW50ZXIgPSBpbml0LmNvdW50ZXIgfHwgaW5wdXQuY291bnRlciB8fCAwO1xuXHRcdHRoaXMuYWdlbnQgPSBpbml0LmFnZW50IHx8IGlucHV0LmFnZW50O1xuXHR9XG5cblx0Z2V0IG1ldGhvZCgpIHtcblx0XHRyZXR1cm4gdGhpc1tJTlRFUk5BTFMkMl0ubWV0aG9kO1xuXHR9XG5cblx0Z2V0IHVybCgpIHtcblx0XHRyZXR1cm4gZm9ybWF0X3VybCh0aGlzW0lOVEVSTkFMUyQyXS5wYXJzZWRVUkwpO1xuXHR9XG5cblx0Z2V0IGhlYWRlcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDJdLmhlYWRlcnM7XG5cdH1cblxuXHRnZXQgcmVkaXJlY3QoKSB7XG5cdFx0cmV0dXJuIHRoaXNbSU5URVJOQUxTJDJdLnJlZGlyZWN0O1xuXHR9XG5cblx0LyoqXG4gICogQ2xvbmUgdGhpcyByZXF1ZXN0XG4gICpcbiAgKiBAcmV0dXJuICBSZXF1ZXN0XG4gICovXG5cdGNsb25lKCkge1xuXHRcdHJldHVybiBuZXcgUmVxdWVzdCh0aGlzKTtcblx0fVxufVxuXG5Cb2R5Lm1peEluKFJlcXVlc3QucHJvdG90eXBlKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlcXVlc3QucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHtcblx0dmFsdWU6ICdSZXF1ZXN0Jyxcblx0d3JpdGFibGU6IGZhbHNlLFxuXHRlbnVtZXJhYmxlOiBmYWxzZSxcblx0Y29uZmlndXJhYmxlOiB0cnVlXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVxdWVzdC5wcm90b3R5cGUsIHtcblx0bWV0aG9kOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0dXJsOiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0aGVhZGVyczogeyBlbnVtZXJhYmxlOiB0cnVlIH0sXG5cdHJlZGlyZWN0OiB7IGVudW1lcmFibGU6IHRydWUgfSxcblx0Y2xvbmU6IHsgZW51bWVyYWJsZTogdHJ1ZSB9XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgUmVxdWVzdCB0byBOb2RlLmpzIGh0dHAgcmVxdWVzdCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSAgIFJlcXVlc3QgIEEgUmVxdWVzdCBpbnN0YW5jZVxuICogQHJldHVybiAgT2JqZWN0ICAgVGhlIG9wdGlvbnMgb2JqZWN0IHRvIGJlIHBhc3NlZCB0byBodHRwLnJlcXVlc3RcbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZVJlcXVlc3RPcHRpb25zKHJlcXVlc3QpIHtcblx0Y29uc3QgcGFyc2VkVVJMID0gcmVxdWVzdFtJTlRFUk5BTFMkMl0ucGFyc2VkVVJMO1xuXHRjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMocmVxdWVzdFtJTlRFUk5BTFMkMl0uaGVhZGVycyk7XG5cblx0Ly8gZmV0Y2ggc3RlcCAxLjNcblx0aWYgKCFoZWFkZXJzLmhhcygnQWNjZXB0JykpIHtcblx0XHRoZWFkZXJzLnNldCgnQWNjZXB0JywgJyovKicpO1xuXHR9XG5cblx0Ly8gQmFzaWMgZmV0Y2hcblx0aWYgKCFwYXJzZWRVUkwucHJvdG9jb2wgfHwgIXBhcnNlZFVSTC5ob3N0bmFtZSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09ubHkgYWJzb2x1dGUgVVJMcyBhcmUgc3VwcG9ydGVkJyk7XG5cdH1cblxuXHRpZiAoIS9eaHR0cHM/OiQvLnRlc3QocGFyc2VkVVJMLnByb3RvY29sKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09ubHkgSFRUUChTKSBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZCcpO1xuXHR9XG5cblx0Ly8gSFRUUC1uZXR3b3JrLW9yLWNhY2hlIGZldGNoIHN0ZXBzIDIuNC0yLjdcblx0bGV0IGNvbnRlbnRMZW5ndGhWYWx1ZSA9IG51bGw7XG5cdGlmIChyZXF1ZXN0LmJvZHkgPT0gbnVsbCAmJiAvXihQT1NUfFBVVCkkL2kudGVzdChyZXF1ZXN0Lm1ldGhvZCkpIHtcblx0XHRjb250ZW50TGVuZ3RoVmFsdWUgPSAnMCc7XG5cdH1cblx0aWYgKHJlcXVlc3QuYm9keSAhPSBudWxsKSB7XG5cdFx0Y29uc3QgdG90YWxCeXRlcyA9IGdldFRvdGFsQnl0ZXMocmVxdWVzdCk7XG5cdFx0aWYgKHR5cGVvZiB0b3RhbEJ5dGVzID09PSAnbnVtYmVyJykge1xuXHRcdFx0Y29udGVudExlbmd0aFZhbHVlID0gU3RyaW5nKHRvdGFsQnl0ZXMpO1xuXHRcdH1cblx0fVxuXHRpZiAoY29udGVudExlbmd0aFZhbHVlKSB7XG5cdFx0aGVhZGVycy5zZXQoJ0NvbnRlbnQtTGVuZ3RoJywgY29udGVudExlbmd0aFZhbHVlKTtcblx0fVxuXG5cdC8vIEhUVFAtbmV0d29yay1vci1jYWNoZSBmZXRjaCBzdGVwIDIuMTFcblx0aWYgKCFoZWFkZXJzLmhhcygnVXNlci1BZ2VudCcpKSB7XG5cdFx0aGVhZGVycy5zZXQoJ1VzZXItQWdlbnQnLCAnbm9kZS1mZXRjaC8xLjAgKCtodHRwczovL2dpdGh1Yi5jb20vYml0aW5uL25vZGUtZmV0Y2gpJyk7XG5cdH1cblxuXHQvLyBIVFRQLW5ldHdvcmstb3ItY2FjaGUgZmV0Y2ggc3RlcCAyLjE1XG5cdGlmIChyZXF1ZXN0LmNvbXByZXNzKSB7XG5cdFx0aGVhZGVycy5zZXQoJ0FjY2VwdC1FbmNvZGluZycsICdnemlwLGRlZmxhdGUnKTtcblx0fVxuXHRpZiAoIWhlYWRlcnMuaGFzKCdDb25uZWN0aW9uJykgJiYgIXJlcXVlc3QuYWdlbnQpIHtcblx0XHRoZWFkZXJzLnNldCgnQ29ubmVjdGlvbicsICdjbG9zZScpO1xuXHR9XG5cblx0Ly8gSFRUUC1uZXR3b3JrIGZldGNoIHN0ZXAgNC4yXG5cdC8vIGNodW5rZWQgZW5jb2RpbmcgaXMgaGFuZGxlZCBieSBOb2RlLmpzXG5cblx0cmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHBhcnNlZFVSTCwge1xuXHRcdG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG5cdFx0aGVhZGVyczogZXhwb3J0Tm9kZUNvbXBhdGlibGVIZWFkZXJzKGhlYWRlcnMpLFxuXHRcdGFnZW50OiByZXF1ZXN0LmFnZW50XG5cdH0pO1xufVxuXG4vKipcbiAqIGluZGV4LmpzXG4gKlxuICogYSByZXF1ZXN0IEFQSSBjb21wYXRpYmxlIHdpdGggd2luZG93LmZldGNoXG4gKlxuICogQWxsIHNwZWMgYWxnb3JpdGhtIHN0ZXAgbnVtYmVycyBhcmUgYmFzZWQgb24gaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvY29tbWl0LXNuYXBzaG90cy9hZTcxNjgyMmNiM2E2MTg0MzIyNmNkMDkwZWVmYzY1ODk0NDZjMWQyLy5cbiAqL1xuXG5jb25zdCBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xuY29uc3QgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xuXG52YXIgX3JlcXVpcmUkMyA9IHJlcXVpcmUoJ3N0cmVhbScpO1xuXG5jb25zdCBQYXNzVGhyb3VnaCQxID0gX3JlcXVpcmUkMy5QYXNzVGhyb3VnaDtcblxudmFyIF9yZXF1aXJlMiA9IHJlcXVpcmUoJ3VybCcpO1xuXG5jb25zdCByZXNvbHZlX3VybCA9IF9yZXF1aXJlMi5yZXNvbHZlO1xuXG5jb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpO1xuXG4vKipcbiAqIEZldGNoIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtICAgTWl4ZWQgICAgdXJsICAgQWJzb2x1dGUgdXJsIG9yIFJlcXVlc3QgaW5zdGFuY2VcbiAqIEBwYXJhbSAgIE9iamVjdCAgIG9wdHMgIEZldGNoIG9wdGlvbnNcbiAqIEByZXR1cm4gIFByb21pc2VcbiAqL1xuZnVuY3Rpb24gZmV0Y2godXJsLCBvcHRzKSB7XG5cblx0Ly8gYWxsb3cgY3VzdG9tIHByb21pc2Vcblx0aWYgKCFmZXRjaC5Qcm9taXNlKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCduYXRpdmUgcHJvbWlzZSBtaXNzaW5nLCBzZXQgZmV0Y2guUHJvbWlzZSB0byB5b3VyIGZhdm9yaXRlIGFsdGVybmF0aXZlJyk7XG5cdH1cblxuXHRCb2R5LlByb21pc2UgPSBmZXRjaC5Qcm9taXNlO1xuXG5cdC8vIHdyYXAgaHR0cC5yZXF1ZXN0IGludG8gZmV0Y2hcblx0cmV0dXJuIG5ldyBmZXRjaC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHQvLyBidWlsZCByZXF1ZXN0IG9iamVjdFxuXHRcdGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIG9wdHMpO1xuXHRcdGNvbnN0IG9wdGlvbnMgPSBnZXROb2RlUmVxdWVzdE9wdGlvbnMocmVxdWVzdCk7XG5cblx0XHRjb25zdCBzZW5kID0gKG9wdGlvbnMucHJvdG9jb2wgPT09ICdodHRwczonID8gaHR0cHMgOiBodHRwKS5yZXF1ZXN0O1xuXG5cdFx0Ly8gc2VuZCByZXF1ZXN0XG5cdFx0Y29uc3QgcmVxID0gc2VuZChvcHRpb25zKTtcblx0XHRsZXQgcmVxVGltZW91dDtcblxuXHRcdGZ1bmN0aW9uIGZpbmFsaXplKCkge1xuXHRcdFx0cmVxLmFib3J0KCk7XG5cdFx0XHRjbGVhclRpbWVvdXQocmVxVGltZW91dCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlcXVlc3QudGltZW91dCkge1xuXHRcdFx0cmVxLm9uY2UoJ3NvY2tldCcsIGZ1bmN0aW9uIChzb2NrZXQpIHtcblx0XHRcdFx0cmVxVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJlamVjdChuZXcgRmV0Y2hFcnJvcihgbmV0d29yayB0aW1lb3V0IGF0OiAke3JlcXVlc3QudXJsfWAsICdyZXF1ZXN0LXRpbWVvdXQnKSk7XG5cdFx0XHRcdFx0ZmluYWxpemUoKTtcblx0XHRcdFx0fSwgcmVxdWVzdC50aW1lb3V0KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJlcS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG5cdFx0XHRyZWplY3QobmV3IEZldGNoRXJyb3IoYHJlcXVlc3QgdG8gJHtyZXF1ZXN0LnVybH0gZmFpbGVkLCByZWFzb246ICR7ZXJyLm1lc3NhZ2V9YCwgJ3N5c3RlbScsIGVycikpO1xuXHRcdFx0ZmluYWxpemUoKTtcblx0XHR9KTtcblxuXHRcdHJlcS5vbigncmVzcG9uc2UnLCBmdW5jdGlvbiAocmVzKSB7XG5cdFx0XHRjbGVhclRpbWVvdXQocmVxVGltZW91dCk7XG5cblx0XHRcdGNvbnN0IGhlYWRlcnMgPSBjcmVhdGVIZWFkZXJzTGVuaWVudChyZXMuaGVhZGVycyk7XG5cblx0XHRcdC8vIEhUVFAgZmV0Y2ggc3RlcCA1XG5cdFx0XHRpZiAoZmV0Y2guaXNSZWRpcmVjdChyZXMuc3RhdHVzQ29kZSkpIHtcblx0XHRcdFx0Ly8gSFRUUCBmZXRjaCBzdGVwIDUuMlxuXHRcdFx0XHRjb25zdCBsb2NhdGlvbiA9IGhlYWRlcnMuZ2V0KCdMb2NhdGlvbicpO1xuXG5cdFx0XHRcdC8vIEhUVFAgZmV0Y2ggc3RlcCA1LjNcblx0XHRcdFx0Y29uc3QgbG9jYXRpb25VUkwgPSBsb2NhdGlvbiA9PT0gbnVsbCA/IG51bGwgOiByZXNvbHZlX3VybChyZXF1ZXN0LnVybCwgbG9jYXRpb24pO1xuXG5cdFx0XHRcdC8vIEhUVFAgZmV0Y2ggc3RlcCA1LjVcblx0XHRcdFx0c3dpdGNoIChyZXF1ZXN0LnJlZGlyZWN0KSB7XG5cdFx0XHRcdFx0Y2FzZSAnZXJyb3InOlxuXHRcdFx0XHRcdFx0cmVqZWN0KG5ldyBGZXRjaEVycm9yKGByZWRpcmVjdCBtb2RlIGlzIHNldCB0byBlcnJvcjogJHtyZXF1ZXN0LnVybH1gLCAnbm8tcmVkaXJlY3QnKSk7XG5cdFx0XHRcdFx0XHRmaW5hbGl6ZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdGNhc2UgJ21hbnVhbCc6XG5cdFx0XHRcdFx0XHQvLyBub2RlLWZldGNoLXNwZWNpZmljIHN0ZXA6IG1ha2UgbWFudWFsIHJlZGlyZWN0IGEgYml0IGVhc2llciB0byB1c2UgYnkgc2V0dGluZyB0aGUgTG9jYXRpb24gaGVhZGVyIHZhbHVlIHRvIHRoZSByZXNvbHZlZCBVUkwuXG5cdFx0XHRcdFx0XHRpZiAobG9jYXRpb25VUkwgIT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0aGVhZGVycy5zZXQoJ0xvY2F0aW9uJywgbG9jYXRpb25VUkwpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZm9sbG93Jzpcblx0XHRcdFx0XHRcdC8vIEhUVFAtcmVkaXJlY3QgZmV0Y2ggc3RlcCAyXG5cdFx0XHRcdFx0XHRpZiAobG9jYXRpb25VUkwgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEhUVFAtcmVkaXJlY3QgZmV0Y2ggc3RlcCA1XG5cdFx0XHRcdFx0XHRpZiAocmVxdWVzdC5jb3VudGVyID49IHJlcXVlc3QuZm9sbG93KSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChuZXcgRmV0Y2hFcnJvcihgbWF4aW11bSByZWRpcmVjdCByZWFjaGVkIGF0OiAke3JlcXVlc3QudXJsfWAsICdtYXgtcmVkaXJlY3QnKSk7XG5cdFx0XHRcdFx0XHRcdGZpbmFsaXplKCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSFRUUC1yZWRpcmVjdCBmZXRjaCBzdGVwIDYgKGNvdW50ZXIgaW5jcmVtZW50KVxuXHRcdFx0XHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IFJlcXVlc3Qgb2JqZWN0LlxuXHRcdFx0XHRcdFx0Y29uc3QgcmVxdWVzdE9wdHMgPSB7XG5cdFx0XHRcdFx0XHRcdGhlYWRlcnM6IG5ldyBIZWFkZXJzKHJlcXVlc3QuaGVhZGVycyksXG5cdFx0XHRcdFx0XHRcdGZvbGxvdzogcmVxdWVzdC5mb2xsb3csXG5cdFx0XHRcdFx0XHRcdGNvdW50ZXI6IHJlcXVlc3QuY291bnRlciArIDEsXG5cdFx0XHRcdFx0XHRcdGFnZW50OiByZXF1ZXN0LmFnZW50LFxuXHRcdFx0XHRcdFx0XHRjb21wcmVzczogcmVxdWVzdC5jb21wcmVzcyxcblx0XHRcdFx0XHRcdFx0bWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcblx0XHRcdFx0XHRcdFx0Ym9keTogcmVxdWVzdC5ib2R5XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgOVxuXHRcdFx0XHRcdFx0aWYgKHJlcy5zdGF0dXNDb2RlICE9PSAzMDMgJiYgcmVxdWVzdC5ib2R5ICYmIGdldFRvdGFsQnl0ZXMocmVxdWVzdCkgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KG5ldyBGZXRjaEVycm9yKCdDYW5ub3QgZm9sbG93IHJlZGlyZWN0IHdpdGggYm9keSBiZWluZyBhIHJlYWRhYmxlIHN0cmVhbScsICd1bnN1cHBvcnRlZC1yZWRpcmVjdCcpKTtcblx0XHRcdFx0XHRcdFx0ZmluYWxpemUoKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgMTFcblx0XHRcdFx0XHRcdGlmIChyZXMuc3RhdHVzQ29kZSA9PT0gMzAzIHx8IChyZXMuc3RhdHVzQ29kZSA9PT0gMzAxIHx8IHJlcy5zdGF0dXNDb2RlID09PSAzMDIpICYmIHJlcXVlc3QubWV0aG9kID09PSAnUE9TVCcpIHtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE9wdHMubWV0aG9kID0gJ0dFVCc7XG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RPcHRzLmJvZHkgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RPcHRzLmhlYWRlcnMuZGVsZXRlKCdjb250ZW50LWxlbmd0aCcpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBIVFRQLXJlZGlyZWN0IGZldGNoIHN0ZXAgMTVcblx0XHRcdFx0XHRcdHJlc29sdmUoZmV0Y2gobmV3IFJlcXVlc3QobG9jYXRpb25VUkwsIHJlcXVlc3RPcHRzKSkpO1xuXHRcdFx0XHRcdFx0ZmluYWxpemUoKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBwcmVwYXJlIHJlc3BvbnNlXG5cdFx0XHRsZXQgYm9keSA9IHJlcy5waXBlKG5ldyBQYXNzVGhyb3VnaCQxKCkpO1xuXHRcdFx0Y29uc3QgcmVzcG9uc2Vfb3B0aW9ucyA9IHtcblx0XHRcdFx0dXJsOiByZXF1ZXN0LnVybCxcblx0XHRcdFx0c3RhdHVzOiByZXMuc3RhdHVzQ29kZSxcblx0XHRcdFx0c3RhdHVzVGV4dDogcmVzLnN0YXR1c01lc3NhZ2UsXG5cdFx0XHRcdGhlYWRlcnM6IGhlYWRlcnMsXG5cdFx0XHRcdHNpemU6IHJlcXVlc3Quc2l6ZSxcblx0XHRcdFx0dGltZW91dDogcmVxdWVzdC50aW1lb3V0XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBIVFRQLW5ldHdvcmsgZmV0Y2ggc3RlcCAxMi4xLjEuM1xuXHRcdFx0Y29uc3QgY29kaW5ncyA9IGhlYWRlcnMuZ2V0KCdDb250ZW50LUVuY29kaW5nJyk7XG5cblx0XHRcdC8vIEhUVFAtbmV0d29yayBmZXRjaCBzdGVwIDEyLjEuMS40OiBoYW5kbGUgY29udGVudCBjb2RpbmdzXG5cblx0XHRcdC8vIGluIGZvbGxvd2luZyBzY2VuYXJpb3Mgd2UgaWdub3JlIGNvbXByZXNzaW9uIHN1cHBvcnRcblx0XHRcdC8vIDEuIGNvbXByZXNzaW9uIHN1cHBvcnQgaXMgZGlzYWJsZWRcblx0XHRcdC8vIDIuIEhFQUQgcmVxdWVzdFxuXHRcdFx0Ly8gMy4gbm8gQ29udGVudC1FbmNvZGluZyBoZWFkZXJcblx0XHRcdC8vIDQuIG5vIGNvbnRlbnQgcmVzcG9uc2UgKDIwNClcblx0XHRcdC8vIDUuIGNvbnRlbnQgbm90IG1vZGlmaWVkIHJlc3BvbnNlICgzMDQpXG5cdFx0XHRpZiAoIXJlcXVlc3QuY29tcHJlc3MgfHwgcmVxdWVzdC5tZXRob2QgPT09ICdIRUFEJyB8fCBjb2RpbmdzID09PSBudWxsIHx8IHJlcy5zdGF0dXNDb2RlID09PSAyMDQgfHwgcmVzLnN0YXR1c0NvZGUgPT09IDMwNCkge1xuXHRcdFx0XHRyZXNvbHZlKG5ldyBSZXNwb25zZShib2R5LCByZXNwb25zZV9vcHRpb25zKSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yIE5vZGUgdjYrXG5cdFx0XHQvLyBCZSBsZXNzIHN0cmljdCB3aGVuIGRlY29kaW5nIGNvbXByZXNzZWQgcmVzcG9uc2VzLCBzaW5jZSBzb21ldGltZXNcblx0XHRcdC8vIHNlcnZlcnMgc2VuZCBzbGlnaHRseSBpbnZhbGlkIHJlc3BvbnNlcyB0aGF0IGFyZSBzdGlsbCBhY2NlcHRlZFxuXHRcdFx0Ly8gYnkgY29tbW9uIGJyb3dzZXJzLlxuXHRcdFx0Ly8gQWx3YXlzIHVzaW5nIFpfU1lOQ19GTFVTSCBpcyB3aGF0IGNVUkwgZG9lcy5cblx0XHRcdGNvbnN0IHpsaWJPcHRpb25zID0ge1xuXHRcdFx0XHRmbHVzaDogemxpYi5aX1NZTkNfRkxVU0gsXG5cdFx0XHRcdGZpbmlzaEZsdXNoOiB6bGliLlpfU1lOQ19GTFVTSFxuXHRcdFx0fTtcblxuXHRcdFx0Ly8gZm9yIGd6aXBcblx0XHRcdGlmIChjb2RpbmdzID09ICdnemlwJyB8fCBjb2RpbmdzID09ICd4LWd6aXAnKSB7XG5cdFx0XHRcdGJvZHkgPSBib2R5LnBpcGUoemxpYi5jcmVhdGVHdW56aXAoemxpYk9wdGlvbnMpKTtcblx0XHRcdFx0cmVzb2x2ZShuZXcgUmVzcG9uc2UoYm9keSwgcmVzcG9uc2Vfb3B0aW9ucykpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIGZvciBkZWZsYXRlXG5cdFx0XHRpZiAoY29kaW5ncyA9PSAnZGVmbGF0ZScgfHwgY29kaW5ncyA9PSAneC1kZWZsYXRlJykge1xuXHRcdFx0XHQvLyBoYW5kbGUgdGhlIGluZmFtb3VzIHJhdyBkZWZsYXRlIHJlc3BvbnNlIGZyb20gb2xkIHNlcnZlcnNcblx0XHRcdFx0Ly8gYSBoYWNrIGZvciBvbGQgSUlTIGFuZCBBcGFjaGUgc2VydmVyc1xuXHRcdFx0XHRjb25zdCByYXcgPSByZXMucGlwZShuZXcgUGFzc1Rocm91Z2gkMSgpKTtcblx0XHRcdFx0cmF3Lm9uY2UoJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcblx0XHRcdFx0XHQvLyBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzUxOTgyOFxuXHRcdFx0XHRcdGlmICgoY2h1bmtbMF0gJiAweDBGKSA9PT0gMHgwOCkge1xuXHRcdFx0XHRcdFx0Ym9keSA9IGJvZHkucGlwZSh6bGliLmNyZWF0ZUluZmxhdGUoKSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGJvZHkgPSBib2R5LnBpcGUoemxpYi5jcmVhdGVJbmZsYXRlUmF3KCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXNvbHZlKG5ldyBSZXNwb25zZShib2R5LCByZXNwb25zZV9vcHRpb25zKSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIG90aGVyd2lzZSwgdXNlIHJlc3BvbnNlIGFzLWlzXG5cdFx0XHRyZXNvbHZlKG5ldyBSZXNwb25zZShib2R5LCByZXNwb25zZV9vcHRpb25zKSk7XG5cdFx0fSk7XG5cblx0XHR3cml0ZVRvU3RyZWFtKHJlcSwgcmVxdWVzdCk7XG5cdH0pO1xufVxuXG4vKipcbiAqIFJlZGlyZWN0IGNvZGUgbWF0Y2hpbmdcbiAqXG4gKiBAcGFyYW0gICBOdW1iZXIgICBjb2RlICBTdGF0dXMgY29kZVxuICogQHJldHVybiAgQm9vbGVhblxuICovXG5mZXRjaC5pc1JlZGlyZWN0ID0gZnVuY3Rpb24gKGNvZGUpIHtcblx0cmV0dXJuIGNvZGUgPT09IDMwMSB8fCBjb2RlID09PSAzMDIgfHwgY29kZSA9PT0gMzAzIHx8IGNvZGUgPT09IDMwNyB8fCBjb2RlID09PSAzMDg7XG59O1xuXG4vLyBOZWVkZWQgZm9yIFR5cGVTY3JpcHQuXG5mZXRjaC5kZWZhdWx0ID0gZmV0Y2g7XG5cbi8vIGV4cG9zZSBQcm9taXNlXG5mZXRjaC5Qcm9taXNlID0gZ2xvYmFsLlByb21pc2U7XG5cbmV4cG9ydCBkZWZhdWx0IGZldGNoO1xuZXhwb3J0IHsgSGVhZGVycywgUmVxdWVzdCwgUmVzcG9uc2UsIEZldGNoRXJyb3IgfTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4uL25vZGVfbW9kdWxlcy9ub2RlLWZldGNoL2xpYi9pbmRleC5lcy5qc1xuLy8gbW9kdWxlIGlkID0gMjQxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImh0dHBzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIFwiaHR0cHNcIlxuLy8gbW9kdWxlIGlkID0gMjQyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/server/package.json b/server/package.json index ea22861..628e87a 100644 --- a/server/package.json +++ b/server/package.json @@ -18,11 +18,6 @@ }, "homepage": "https://github.com/hastic/hastic-server#readme", "dependencies": { - "encoding": "^0.1.12", - "event-stream": "^3.3.4", - "express": "^4.16.3", - "fast-csv": "^2.4.1", - "node-fetch": "^2.1.2" }, "devDependencies": { "@types/express": "^4.11.1", @@ -37,6 +32,11 @@ "nodemon": "^1.17.3", "ts-loader": "^3.5.0", "typescript": "^2.8.3", - "webpack": "^3.5.6" + "webpack": "^3.5.6", + "encoding": "^0.1.12", + "event-stream": "^3.3.4", + "express": "^4.16.3", + "fast-csv": "^2.4.1", + "node-fetch": "^2.1.2" } } diff --git a/server/src/config.ts b/server/src/config.ts index a6ada60..3abd103 100644 --- a/server/src/config.ts +++ b/server/src/config.ts @@ -1,9 +1,8 @@ import * as path from 'path'; -const DATA_PATH = path.join(__dirname, '../data'); -const ANALYTICS_PATH = path.join(__dirname, '../../src'); -const ANOMALIES_PATH = path.join(ANALYTICS_PATH, 'anomalies'); -const SEGMENTS_PATH = path.join(ANALYTICS_PATH, 'segments'); -const METRICS_PATH = path.join(ANALYTICS_PATH, 'metrics'); +export const ANALYTICS_PATH = path.join(__dirname, '../../src'); -export { DATA_PATH, ANALYTICS_PATH, ANOMALIES_PATH, SEGMENTS_PATH, METRICS_PATH } +export const DATA_PATH = path.join(__dirname, '../../data'); +export const ANOMALIES_PATH = path.join(DATA_PATH, 'anomalies'); +export const SEGMENTS_PATH = path.join(DATA_PATH, 'segments'); +export const METRICS_PATH = path.join(DATA_PATH, 'metrics'); diff --git a/server/src/index.ts b/server/src/index.ts index d819e42..150163f 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -5,6 +5,10 @@ import { router as anomaliesRouter } from './routes/anomalies'; import { router as segmentsRouter } from './routes/segments'; import { router as alertsRouter } from './routes/alerts'; +import { checkDataFolders } from './services/data'; + +checkDataFolders(); + const app = express(); const PORT = process.env.HASTIC_PORT || 8000; diff --git a/server/src/services/analytics.ts b/server/src/services/analytics.ts index 0430aad..e3359a1 100644 --- a/server/src/services/analytics.ts +++ b/server/src/services/analytics.ts @@ -12,12 +12,7 @@ import { getLabeledSegments, insertSegments, removeSegments } from './segments'; import { split, map, mapSync } from 'event-stream'; const learnWorker = spawn('python3', ['worker.py'], { cwd: ANALYTICS_PATH }) -learnWorker.stdout.pipe(split()) - .pipe( - mapSync(function(line){ - onMessage(line) - }) - ); +learnWorker.stdout.pipe(split()).pipe(mapSync(onMessage)); learnWorker.stderr.on('data', data => console.error(`worker stderr: ${data}`)); diff --git a/server/src/services/data.ts b/server/src/services/data.ts new file mode 100644 index 0000000..6aac1ec --- /dev/null +++ b/server/src/services/data.ts @@ -0,0 +1,14 @@ +import * as config from '../config' +import * as fs from 'fs'; + + + +export function checkDataFolders() { + if(fs.existsSync(config.DATA_PATH)) { + return; + } + fs.mkdirSync(config.DATA_PATH); + fs.mkdirSync(config.ANOMALIES_PATH); + fs.mkdirSync(config.SEGMENTS_PATH); + fs.mkdirSync(config.METRICS_PATH); +} \ No newline at end of file