{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/es6-promise/dist/es6-promise.js","node_modules/events/events.js","node_modules/process/browser.js","node_modules/webworkify/index.js","src/config.js","src/core/features.js","src/core/media-info.js","src/core/media-segment-info.js","src/core/mse-controller.js","src/core/mse-events.js","src/core/transmuxer.js","src/core/transmuxing-controller.js","src/core/transmuxing-events.js","src/core/transmuxing-worker.js","src/demux/amf-parser.js","src/demux/demux-errors.js","src/demux/exp-golomb.js","src/demux/flv-demuxer.js","src/demux/sps-parser.js","src/flv.js","src/index.js","src/io/fetch-stream-loader.js","src/io/io-controller.js","src/io/loader.js","src/io/param-seek-handler.js","src/io/range-seek-handler.js","src/io/speed-sampler.js","src/io/websocket-loader.js","src/io/xhr-moz-chunked-loader.js","src/io/xhr-msstream-loader.js","src/io/xhr-range-loader.js","src/player/flv-player.js","src/player/native-player.js","src/player/player-errors.js","src/player/player-events.js","src/remux/aac-silent.js","src/remux/mp4-generator.js","src/remux/mp4-remuxer.js","src/utils/browser.js","src/utils/exception.js","src/utils/logger.js","src/utils/logging-control.js","src/utils/polyfill.js","src/utils/utf8-conv.js"],"names":[],"mappings":"AAAA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC/pCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;AACA;AACA;AACA;AACA;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","file":"flv.js","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n if (isFunction(callback)) {\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n }\n\n return promise.then(callback, callback);\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n//# sourceMappingURL=es6-promise.map\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n var er, handler, len, args, i, listeners;\n\n if (!this._events)\n this._events = {};\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n }\n }\n\n handler = this._events[type];\n\n if (isUndefined(handler))\n return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n args = Array.prototype.slice.call(arguments, 1);\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++)\n listeners[i].apply(this, args);\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n var m;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events)\n this._events = {};\n\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (this._events.newListener)\n this.emit('newListener', type,\n isFunction(listener.listener) ?\n listener.listener : listener);\n\n if (!this._events[type])\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n else if (isObject(this._events[type]))\n // If we've already got an array, just append.\n this._events[type].push(listener);\n else\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n\n // Check for listener leak\n if (isObject(this._events[type]) && !this._events[type].warned) {\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n\n return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n var list, position, length, i;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events || !this._events[type])\n return this;\n\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener ||\n (isFunction(list.listener) && list.listener === listener)) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n var key, listeners;\n\n if (!this._events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!this._events.removeListener) {\n if (arguments.length === 0)\n this._events = {};\n else if (this._events[type])\n delete this._events[type];\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n var ret;\n if (!this._events || !this._events[type])\n ret = [];\n else if (isFunction(this._events[type]))\n ret = [this._events[type]];\n else\n ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n if (this._events) {\n var evlistener = this._events[type];\n\n if (isFunction(evlistener))\n return 1;\n else if (evlistener)\n return evlistener.length;\n }\n return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","var bundleFn = arguments[3];\nvar sources = arguments[4];\nvar cache = arguments[5];\n\nvar stringify = JSON.stringify;\n\nmodule.exports = function (fn, options) {\n var wkey;\n var cacheKeys = Object.keys(cache);\n\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n var exp = cache[key].exports;\n // Using babel as a transpiler to use esmodule, the export will always\n // be an object with the default export as a property of it. To ensure\n // the existing api and babel esmodule exports are both supported we\n // check for both\n if (exp === fn || exp && exp.default === fn) {\n wkey = key;\n break;\n }\n }\n\n if (!wkey) {\n wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n var wcache = {};\n for (var i = 0, l = cacheKeys.length; i < l; i++) {\n var key = cacheKeys[i];\n wcache[key] = key;\n }\n sources[wkey] = [\n 'function(require,module,exports){' + fn + '(self); }',\n wcache\n ];\n }\n var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);\n\n var scache = {}; scache[wkey] = wkey;\n sources[skey] = [\n 'function(require,module,exports){' +\n // try to call default if defined to also support babel esmodule exports\n 'var f = require(' + stringify(wkey) + ');' +\n '(f.default ? f.default : f)(self);' +\n '}',\n scache\n ];\n\n var workerSources = {};\n resolveSources(skey);\n\n function resolveSources(key) {\n workerSources[key] = true;\n\n for (var depPath in sources[key][1]) {\n var depKey = sources[key][1][depPath];\n if (!workerSources[depKey]) {\n resolveSources(depKey);\n }\n }\n }\n\n var src = '(' + bundleFn + ')({'\n + Object.keys(workerSources).map(function (key) {\n return stringify(key) + ':['\n + sources[key][0]\n + ',' + stringify(sources[key][1]) + ']'\n ;\n }).join(',')\n + '},{},[' + stringify(skey) + '])'\n ;\n\n var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;\n\n var blob = new Blob([src], { type: 'text/javascript' });\n if (options && options.bare) { return blob; }\n var workerUrl = URL.createObjectURL(blob);\n var worker = new Worker(workerUrl);\n worker.objectURL = workerUrl;\n return worker;\n};\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const defaultConfig = {\n enableWorker: false,\n enableStashBuffer: true,\n stashInitialSize: undefined,\n\n isLive: false,\n\n lazyLoad: true,\n lazyLoadMaxDuration: 3 * 60,\n lazyLoadRecoverDuration: 30,\n deferLoadAfterSourceOpen: true,\n\n // autoCleanupSourceBuffer: default as false, leave unspecified\n autoCleanupMaxBackwardDuration: 3 * 60,\n autoCleanupMinBackwardDuration: 2 * 60,\n\n statisticsInfoReportInterval: 600,\n\n fixAudioTimestampGap: true,\n\n accurateSeek: false,\n seekType: 'range', // [range, param, custom]\n seekParamStart: 'bstart',\n seekParamEnd: 'bend',\n rangeLoadZeroStart: false,\n customSeekHandler: undefined,\n reuseRedirectedURL: false,\n // referrerPolicy: leave as unspecified\n\n headers: undefined,\n customLoader: undefined\n};\n\nexport function createDefaultConfig() {\n return Object.assign({}, defaultConfig);\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport IOController from '../io/io-controller.js';\nimport {createDefaultConfig} from '../config.js';\n\nclass Features {\n\n static supportMSEH264Playback() {\n return window.MediaSource &&\n window.MediaSource.isTypeSupported('video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"');\n }\n\n static supportNetworkStreamIO() {\n let ioctl = new IOController({}, createDefaultConfig());\n let loaderType = ioctl.loaderType;\n ioctl.destroy();\n return loaderType == 'fetch-stream-loader' || loaderType == 'xhr-moz-chunked-loader';\n }\n\n static getNetworkLoaderTypeName() {\n let ioctl = new IOController({}, createDefaultConfig());\n let loaderType = ioctl.loaderType;\n ioctl.destroy();\n return loaderType;\n }\n\n static supportNativeMediaPlayback(mimeType) {\n if (Features.videoElement == undefined) {\n Features.videoElement = window.document.createElement('video');\n }\n let canPlay = Features.videoElement.canPlayType(mimeType);\n return canPlay === 'probably' || canPlay == 'maybe';\n }\n\n static getFeatureList() {\n let features = {\n mseFlvPlayback: false,\n mseLiveFlvPlayback: false,\n networkStreamIO: false,\n networkLoaderName: '',\n nativeMP4H264Playback: false,\n nativeWebmVP8Playback: false,\n nativeWebmVP9Playback: false\n };\n\n features.mseFlvPlayback = Features.supportMSEH264Playback();\n features.networkStreamIO = Features.supportNetworkStreamIO();\n features.networkLoaderName = Features.getNetworkLoaderTypeName();\n features.mseLiveFlvPlayback = features.mseFlvPlayback && features.networkStreamIO;\n features.nativeMP4H264Playback = Features.supportNativeMediaPlayback('video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"');\n features.nativeWebmVP8Playback = Features.supportNativeMediaPlayback('video/webm; codecs=\"vp8.0, vorbis\"');\n features.nativeWebmVP9Playback = Features.supportNativeMediaPlayback('video/webm; codecs=\"vp9\"');\n\n return features;\n }\n\n}\n\nexport default Features;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass MediaInfo {\n\n constructor() {\n this.mimeType = null;\n this.duration = null;\n\n this.hasAudio = null;\n this.hasVideo = null;\n this.audioCodec = null;\n this.videoCodec = null;\n this.audioDataRate = null;\n this.videoDataRate = null;\n\n this.audioSampleRate = null;\n this.audioChannelCount = null;\n\n this.width = null;\n this.height = null;\n this.fps = null;\n this.profile = null;\n this.level = null;\n this.refFrames = null;\n this.chromaFormat = null;\n this.sarNum = null;\n this.sarDen = null;\n\n this.metadata = null;\n this.segments = null; // MediaInfo[]\n this.segmentCount = null;\n this.hasKeyframesIndex = null;\n this.keyframesIndex = null;\n }\n\n isComplete() {\n let audioInfoComplete = (this.hasAudio === false) ||\n (this.hasAudio === true &&\n this.audioCodec != null &&\n this.audioSampleRate != null &&\n this.audioChannelCount != null);\n\n let videoInfoComplete = (this.hasVideo === false) ||\n (this.hasVideo === true &&\n this.videoCodec != null &&\n this.width != null &&\n this.height != null &&\n this.fps != null &&\n this.profile != null &&\n this.level != null &&\n this.refFrames != null &&\n this.chromaFormat != null &&\n this.sarNum != null &&\n this.sarDen != null);\n\n // keyframesIndex may not be present\n return this.mimeType != null &&\n this.duration != null &&\n this.metadata != null &&\n this.hasKeyframesIndex != null &&\n audioInfoComplete &&\n videoInfoComplete;\n }\n\n isSeekable() {\n return this.hasKeyframesIndex === true;\n }\n\n getNearestKeyframe(milliseconds) {\n if (this.keyframesIndex == null) {\n return null;\n }\n\n let table = this.keyframesIndex;\n let keyframeIdx = this._search(table.times, milliseconds);\n\n return {\n index: keyframeIdx,\n milliseconds: table.times[keyframeIdx],\n fileposition: table.filepositions[keyframeIdx]\n };\n }\n\n _search(list, value) {\n let idx = 0;\n\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (value < list[0]) {\n idx = 0;\n lbound = ubound + 1; // skip search\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (value >= list[mid] && value < list[mid + 1])) {\n idx = mid;\n break;\n } else if (list[mid] < value) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n\n return idx;\n }\n\n}\n\nexport default MediaInfo;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Represents an media sample (audio / video)\nexport class SampleInfo {\n\n constructor(dts, pts, duration, originalDts, isSync) {\n this.dts = dts;\n this.pts = pts;\n this.duration = duration;\n this.originalDts = originalDts;\n this.isSyncPoint = isSync;\n this.fileposition = null;\n }\n\n}\n\n// Media Segment concept is defined in Media Source Extensions spec.\n// Particularly in ISO BMFF format, an Media Segment contains a moof box followed by a mdat box.\nexport class MediaSegmentInfo {\n\n constructor() {\n this.beginDts = 0;\n this.endDts = 0;\n this.beginPts = 0;\n this.endPts = 0;\n this.originalBeginDts = 0;\n this.originalEndDts = 0;\n this.syncPoints = []; // SampleInfo[n], for video IDR frames only\n this.firstSample = null; // SampleInfo\n this.lastSample = null; // SampleInfo\n }\n\n appendSyncPoint(sampleInfo) { // also called Random Access Point\n sampleInfo.isSyncPoint = true;\n this.syncPoints.push(sampleInfo);\n }\n\n}\n\n// Ordered list for recording video IDR frames, sorted by originalDts\nexport class IDRSampleList {\n\n constructor() {\n this._list = [];\n }\n\n clear() {\n this._list = [];\n }\n\n appendArray(syncPoints) {\n let list = this._list;\n\n if (syncPoints.length === 0) {\n return;\n }\n\n if (list.length > 0 && syncPoints[0].originalDts < list[list.length - 1].originalDts) {\n this.clear();\n }\n\n Array.prototype.push.apply(list, syncPoints);\n }\n\n getLastSyncPointBeforeDts(dts) {\n if (this._list.length == 0) {\n return null;\n }\n\n let list = this._list;\n let idx = 0;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (dts < list[0].dts) {\n idx = 0;\n lbound = ubound + 1;\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (dts >= list[mid].dts && dts < list[mid + 1].dts)) {\n idx = mid;\n break;\n } else if (list[mid].dts < dts) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n return this._list[idx];\n }\n\n}\n\n// Data structure for recording information of media segments in single track.\nexport class MediaSegmentInfoList {\n\n constructor(type) {\n this._type = type;\n this._list = [];\n this._lastAppendLocation = -1; // cached last insert location\n }\n\n get type() {\n return this._type;\n }\n\n get length() {\n return this._list.length;\n }\n\n isEmpty() {\n return this._list.length === 0;\n }\n\n clear() {\n this._list = [];\n this._lastAppendLocation = -1;\n }\n\n _searchNearestSegmentBefore(originalBeginDts) {\n let list = this._list;\n if (list.length === 0) {\n return -2;\n }\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n let idx = 0;\n\n if (originalBeginDts < list[0].originalBeginDts) {\n idx = -1;\n return idx;\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (originalBeginDts > list[mid].lastSample.originalDts &&\n (originalBeginDts < list[mid + 1].originalBeginDts))) {\n idx = mid;\n break;\n } else if (list[mid].originalBeginDts < originalBeginDts) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n return idx;\n }\n\n _searchNearestSegmentAfter(originalBeginDts) {\n return this._searchNearestSegmentBefore(originalBeginDts) + 1;\n }\n\n append(mediaSegmentInfo) {\n let list = this._list;\n let msi = mediaSegmentInfo;\n let lastAppendIdx = this._lastAppendLocation;\n let insertIdx = 0;\n\n if (lastAppendIdx !== -1 && lastAppendIdx < list.length &&\n msi.originalBeginDts >= list[lastAppendIdx].lastSample.originalDts &&\n ((lastAppendIdx === list.length - 1) ||\n (lastAppendIdx < list.length - 1 &&\n msi.originalBeginDts < list[lastAppendIdx + 1].originalBeginDts))) {\n insertIdx = lastAppendIdx + 1; // use cached location idx\n } else {\n if (list.length > 0) {\n insertIdx = this._searchNearestSegmentBefore(msi.originalBeginDts) + 1;\n }\n }\n\n this._lastAppendLocation = insertIdx;\n this._list.splice(insertIdx, 0, msi);\n }\n\n getLastSegmentBefore(originalBeginDts) {\n let idx = this._searchNearestSegmentBefore(originalBeginDts);\n if (idx >= 0) {\n return this._list[idx];\n } else { // -1\n return null;\n }\n }\n\n getLastSampleBefore(originalBeginDts) {\n let segment = this.getLastSegmentBefore(originalBeginDts);\n if (segment != null) {\n return segment.lastSample;\n } else {\n return null;\n }\n }\n\n getLastSyncPointBefore(originalBeginDts) {\n let segmentIdx = this._searchNearestSegmentBefore(originalBeginDts);\n let syncPoints = this._list[segmentIdx].syncPoints;\n while (syncPoints.length === 0 && segmentIdx > 0) {\n segmentIdx--;\n syncPoints = this._list[segmentIdx].syncPoints;\n }\n if (syncPoints.length > 0) {\n return syncPoints[syncPoints.length - 1];\n } else {\n return null;\n }\n }\n\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport MSEEvents from './mse-events.js';\nimport {SampleInfo, IDRSampleList} from './media-segment-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\n// Media Source Extensions controller\nclass MSEController {\n\n constructor(config) {\n this.TAG = 'MSEController';\n\n this._config = config;\n this._emitter = new EventEmitter();\n\n if (this._config.isLive && this._config.autoCleanupSourceBuffer == undefined) {\n // For live stream, do auto cleanup by default\n this._config.autoCleanupSourceBuffer = true;\n }\n\n this.e = {\n onSourceOpen: this._onSourceOpen.bind(this),\n onSourceEnded: this._onSourceEnded.bind(this),\n onSourceClose: this._onSourceClose.bind(this),\n onSourceBufferError: this._onSourceBufferError.bind(this),\n onSourceBufferUpdateEnd: this._onSourceBufferUpdateEnd.bind(this)\n };\n\n this._mediaSource = null;\n this._mediaSourceObjectURL = null;\n this._mediaElement = null;\n\n this._isBufferFull = false;\n this._hasPendingEos = false;\n\n this._requireSetMediaDuration = false;\n this._pendingMediaDuration = 0;\n\n this._pendingSourceBufferInit = [];\n this._mimeTypes = {\n video: null,\n audio: null\n };\n this._sourceBuffers = {\n video: null,\n audio: null\n };\n this._lastInitSegments = {\n video: null,\n audio: null\n };\n this._pendingSegments = {\n video: [],\n audio: []\n };\n this._pendingRemoveRanges = {\n video: [],\n audio: []\n };\n this._idrList = new IDRSampleList();\n }\n\n destroy() {\n if (this._mediaElement || this._mediaSource) {\n this.detachMediaElement();\n }\n this.e = null;\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n if (this._mediaSource) {\n throw new IllegalStateException('MediaSource has been attached to an HTMLMediaElement!');\n }\n let ms = this._mediaSource = new window.MediaSource();\n ms.addEventListener('sourceopen', this.e.onSourceOpen);\n ms.addEventListener('sourceended', this.e.onSourceEnded);\n ms.addEventListener('sourceclose', this.e.onSourceClose);\n\n this._mediaElement = mediaElement;\n this._mediaSourceObjectURL = window.URL.createObjectURL(this._mediaSource);\n mediaElement.src = this._mediaSourceObjectURL;\n }\n\n detachMediaElement() {\n if (this._mediaSource) {\n let ms = this._mediaSource;\n for (let type in this._sourceBuffers) {\n // pending segments should be discard\n let ps = this._pendingSegments[type];\n ps.splice(0, ps.length);\n this._pendingSegments[type] = null;\n this._pendingRemoveRanges[type] = null;\n this._lastInitSegments[type] = null;\n\n // remove all sourcebuffers\n let sb = this._sourceBuffers[type];\n if (sb) {\n if (ms.readyState !== 'closed') {\n // ms edge can throw an error: Unexpected call to method or property access\n try {\n ms.removeSourceBuffer(sb);\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n sb.removeEventListener('error', this.e.onSourceBufferError);\n sb.removeEventListener('updateend', this.e.onSourceBufferUpdateEnd);\n }\n this._mimeTypes[type] = null;\n this._sourceBuffers[type] = null;\n }\n }\n if (ms.readyState === 'open') {\n try {\n ms.endOfStream();\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n }\n ms.removeEventListener('sourceopen', this.e.onSourceOpen);\n ms.removeEventListener('sourceended', this.e.onSourceEnded);\n ms.removeEventListener('sourceclose', this.e.onSourceClose);\n this._pendingSourceBufferInit = [];\n this._isBufferFull = false;\n this._idrList.clear();\n this._mediaSource = null;\n }\n\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n this._mediaElement = null;\n }\n if (this._mediaSourceObjectURL) {\n window.URL.revokeObjectURL(this._mediaSourceObjectURL);\n this._mediaSourceObjectURL = null;\n }\n }\n\n appendInitSegment(initSegment, deferred) {\n if (!this._mediaSource || this._mediaSource.readyState !== 'open') {\n // sourcebuffer creation requires mediaSource.readyState === 'open'\n // so we defer the sourcebuffer creation, until sourceopen event triggered\n this._pendingSourceBufferInit.push(initSegment);\n // make sure that this InitSegment is in the front of pending segments queue\n this._pendingSegments[initSegment.type].push(initSegment);\n return;\n }\n\n let is = initSegment;\n let mimeType = `${is.container}`;\n if (is.codec && is.codec.length > 0) {\n mimeType += `;codecs=${is.codec}`;\n }\n\n let firstInitSegment = false;\n\n Log.v(this.TAG, 'Received Initialization Segment, mimeType: ' + mimeType);\n this._lastInitSegments[is.type] = is;\n\n if (mimeType !== this._mimeTypes[is.type]) {\n if (!this._mimeTypes[is.type]) { // empty, first chance create sourcebuffer\n firstInitSegment = true;\n try {\n let sb = this._sourceBuffers[is.type] = this._mediaSource.addSourceBuffer(mimeType);\n sb.addEventListener('error', this.e.onSourceBufferError);\n sb.addEventListener('updateend', this.e.onSourceBufferUpdateEnd);\n } catch (error) {\n Log.e(this.TAG, error.message);\n this._emitter.emit(MSEEvents.ERROR, {code: error.code, msg: error.message});\n return;\n }\n } else {\n Log.v(this.TAG, `Notice: ${is.type} mimeType changed, origin: ${this._mimeTypes[is.type]}, target: ${mimeType}`);\n }\n this._mimeTypes[is.type] = mimeType;\n }\n\n if (!deferred) {\n // deferred means this InitSegment has been pushed to pendingSegments queue\n this._pendingSegments[is.type].push(is);\n }\n if (!firstInitSegment) { // append immediately only if init segment in subsequence\n if (this._sourceBuffers[is.type] && !this._sourceBuffers[is.type].updating) {\n this._doAppendSegments();\n }\n }\n if (Browser.safari && is.container === 'audio/mpeg' && is.mediaDuration > 0) {\n // 'audio/mpeg' track under Safari may cause MediaElement's duration to be NaN\n // Manually correct MediaSource.duration to make progress bar seekable, and report right duration\n this._requireSetMediaDuration = true;\n this._pendingMediaDuration = is.mediaDuration / 1000; // in seconds\n this._updateMediaSourceDuration();\n }\n }\n\n appendMediaSegment(mediaSegment) {\n let ms = mediaSegment;\n this._pendingSegments[ms.type].push(ms);\n\n if (this._config.autoCleanupSourceBuffer && this._needCleanupSourceBuffer()) {\n this._doCleanupSourceBuffer();\n }\n\n let sb = this._sourceBuffers[ms.type];\n if (sb && !sb.updating && !this._hasPendingRemoveRanges()) {\n this._doAppendSegments();\n }\n }\n\n seek(seconds) {\n // remove all appended buffers\n for (let type in this._sourceBuffers) {\n if (!this._sourceBuffers[type]) {\n continue;\n }\n\n // abort current buffer append algorithm\n let sb = this._sourceBuffers[type];\n if (this._mediaSource.readyState === 'open') {\n try {\n // If range removal algorithm is running, InvalidStateError will be throwed\n // Ignore it.\n sb.abort();\n } catch (error) {\n Log.e(this.TAG, error.message);\n }\n }\n\n // IDRList should be clear\n this._idrList.clear();\n\n // pending segments should be discard\n let ps = this._pendingSegments[type];\n ps.splice(0, ps.length);\n\n if (this._mediaSource.readyState === 'closed') {\n // Parent MediaSource object has been detached from HTMLMediaElement\n continue;\n }\n\n // record ranges to be remove from SourceBuffer\n for (let i = 0; i < sb.buffered.length; i++) {\n let start = sb.buffered.start(i);\n let end = sb.buffered.end(i);\n this._pendingRemoveRanges[type].push({start, end});\n }\n\n // if sb is not updating, let's remove ranges now!\n if (!sb.updating) {\n this._doRemoveRanges();\n }\n\n // Safari 10 may get InvalidStateError in the later appendBuffer() after SourceBuffer.remove() call\n // Internal parser's state may be invalid at this time. Re-append last InitSegment to workaround.\n // Related issue: https://bugs.webkit.org/show_bug.cgi?id=159230\n if (Browser.safari) {\n let lastInitSegment = this._lastInitSegments[type];\n if (lastInitSegment) {\n this._pendingSegments[type].push(lastInitSegment);\n if (!sb.updating) {\n this._doAppendSegments();\n }\n }\n }\n }\n }\n\n endOfStream() {\n let ms = this._mediaSource;\n let sb = this._sourceBuffers;\n if (!ms || ms.readyState !== 'open') {\n if (ms && ms.readyState === 'closed' && this._hasPendingSegments()) {\n // If MediaSource hasn't turned into open state, and there're pending segments\n // Mark pending endOfStream, defer call until all pending segments appended complete\n this._hasPendingEos = true;\n }\n return;\n }\n if (sb.video && sb.video.updating || sb.audio && sb.audio.updating) {\n // If any sourcebuffer is updating, defer endOfStream operation\n // See _onSourceBufferUpdateEnd()\n this._hasPendingEos = true;\n } else {\n this._hasPendingEos = false;\n // Notify media data loading complete\n // This is helpful for correcting total duration to match last media segment\n // Otherwise MediaElement's ended event may not be triggered\n ms.endOfStream();\n }\n }\n\n getNearestKeyframe(dts) {\n return this._idrList.getLastSyncPointBeforeDts(dts);\n }\n\n _needCleanupSourceBuffer() {\n if (!this._config.autoCleanupSourceBuffer) {\n return false;\n }\n\n let currentTime = this._mediaElement.currentTime;\n\n for (let type in this._sourceBuffers) {\n let sb = this._sourceBuffers[type];\n if (sb) {\n let buffered = sb.buffered;\n if (buffered.length >= 1) {\n if (currentTime - buffered.start(0) >= this._config.autoCleanupMaxBackwardDuration) {\n return true;\n }\n }\n }\n }\n\n return false;\n }\n\n _doCleanupSourceBuffer() {\n let currentTime = this._mediaElement.currentTime;\n\n for (let type in this._sourceBuffers) {\n let sb = this._sourceBuffers[type];\n if (sb) {\n let buffered = sb.buffered;\n let doRemove = false;\n\n for (let i = 0; i < buffered.length; i++) {\n let start = buffered.start(i);\n let end = buffered.end(i);\n\n if (start <= currentTime && currentTime < end + 3) { // padding 3 seconds\n if (currentTime - start >= this._config.autoCleanupMaxBackwardDuration) {\n doRemove = true;\n let removeEnd = currentTime - this._config.autoCleanupMinBackwardDuration;\n this._pendingRemoveRanges[type].push({start: start, end: removeEnd});\n }\n } else if (end < currentTime) {\n doRemove = true;\n this._pendingRemoveRanges[type].push({start: start, end: end});\n }\n }\n\n if (doRemove && !sb.updating) {\n this._doRemoveRanges();\n }\n }\n }\n }\n\n _updateMediaSourceDuration() {\n let sb = this._sourceBuffers;\n if (this._mediaElement.readyState === 0 || this._mediaSource.readyState !== 'open') {\n return;\n }\n if ((sb.video && sb.video.updating) || (sb.audio && sb.audio.updating)) {\n return;\n }\n\n let current = this._mediaSource.duration;\n let target = this._pendingMediaDuration;\n\n if (target > 0 && (isNaN(current) || target > current)) {\n Log.v(this.TAG, `Update MediaSource duration from ${current} to ${target}`);\n this._mediaSource.duration = target;\n }\n\n this._requireSetMediaDuration = false;\n this._pendingMediaDuration = 0;\n }\n\n _doRemoveRanges() {\n for (let type in this._pendingRemoveRanges) {\n if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {\n continue;\n }\n let sb = this._sourceBuffers[type];\n let ranges = this._pendingRemoveRanges[type];\n while (ranges.length && !sb.updating) {\n let range = ranges.shift();\n sb.remove(range.start, range.end);\n }\n }\n }\n\n _doAppendSegments() {\n let pendingSegments = this._pendingSegments;\n\n for (let type in pendingSegments) {\n if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {\n continue;\n }\n\n if (pendingSegments[type].length > 0) {\n let segment = pendingSegments[type].shift();\n\n if (segment.timestampOffset) {\n // For MPEG audio stream in MSE, if unbuffered-seeking occurred\n // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.\n let currentOffset = this._sourceBuffers[type].timestampOffset;\n let targetOffset = segment.timestampOffset / 1000; // in seconds\n\n let delta = Math.abs(currentOffset - targetOffset);\n if (delta > 0.1) { // If time delta > 100ms\n Log.v(this.TAG, `Update MPEG audio timestampOffset from ${currentOffset} to ${targetOffset}`);\n this._sourceBuffers[type].timestampOffset = targetOffset;\n }\n delete segment.timestampOffset;\n }\n\n if (!segment.data || segment.data.byteLength === 0) {\n // Ignore empty buffer\n continue;\n }\n\n try {\n this._sourceBuffers[type].appendBuffer(segment.data);\n this._isBufferFull = false;\n if (type === 'video' && segment.hasOwnProperty('info')) {\n this._idrList.appendArray(segment.info.syncPoints);\n }\n } catch (error) {\n this._pendingSegments[type].unshift(segment);\n if (error.code === 22) { // QuotaExceededError\n /* Notice that FireFox may not throw QuotaExceededError if SourceBuffer is full\n * Currently we can only do lazy-load to avoid SourceBuffer become scattered.\n * SourceBuffer eviction policy may be changed in future version of FireFox.\n *\n * Related issues:\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1279885\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1280023\n */\n\n // report buffer full, abort network IO\n if (!this._isBufferFull) {\n this._emitter.emit(MSEEvents.BUFFER_FULL);\n }\n this._isBufferFull = true;\n } else {\n Log.e(this.TAG, error.message);\n this._emitter.emit(MSEEvents.ERROR, {code: error.code, msg: error.message});\n }\n }\n }\n }\n }\n\n _onSourceOpen() {\n Log.v(this.TAG, 'MediaSource onSourceOpen');\n this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);\n // deferred sourcebuffer creation / initialization\n if (this._pendingSourceBufferInit.length > 0) {\n let pendings = this._pendingSourceBufferInit;\n while (pendings.length) {\n let segment = pendings.shift();\n this.appendInitSegment(segment, true);\n }\n }\n // there may be some pending media segments, append them\n if (this._hasPendingSegments()) {\n this._doAppendSegments();\n }\n this._emitter.emit(MSEEvents.SOURCE_OPEN);\n }\n\n _onSourceEnded() {\n // fired on endOfStream\n Log.v(this.TAG, 'MediaSource onSourceEnded');\n }\n\n _onSourceClose() {\n // fired on detaching from media element\n Log.v(this.TAG, 'MediaSource onSourceClose');\n if (this._mediaSource && this.e != null) {\n this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);\n this._mediaSource.removeEventListener('sourceended', this.e.onSourceEnded);\n this._mediaSource.removeEventListener('sourceclose', this.e.onSourceClose);\n }\n }\n\n _hasPendingSegments() {\n let ps = this._pendingSegments;\n return ps.video.length > 0 || ps.audio.length > 0;\n }\n\n _hasPendingRemoveRanges() {\n let prr = this._pendingRemoveRanges;\n return prr.video.length > 0 || prr.audio.length > 0;\n }\n\n _onSourceBufferUpdateEnd() {\n if (this._requireSetMediaDuration) {\n this._updateMediaSourceDuration();\n } else if (this._hasPendingRemoveRanges()) {\n this._doRemoveRanges();\n } else if (this._hasPendingSegments()) {\n this._doAppendSegments();\n } else if (this._hasPendingEos) {\n this.endOfStream();\n }\n this._emitter.emit(MSEEvents.UPDATE_END);\n }\n\n _onSourceBufferError(e) {\n Log.e(this.TAG, `SourceBuffer Error: ${e}`);\n // this error might not always be fatal, just ignore it\n }\n\n}\n\nexport default MSEController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst MSEEvents = {\n ERROR: 'error',\n SOURCE_OPEN: 'source_open',\n UPDATE_END: 'update_end',\n BUFFER_FULL: 'buffer_full'\n};\n\nexport default MSEEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport LoggingControl from '../utils/logging-control.js';\nimport TransmuxingController from './transmuxing-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\nimport TransmuxingWorker from './transmuxing-worker.js';\nimport MediaInfo from './media-info.js';\n\nclass Transmuxer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'Transmuxer';\n this._emitter = new EventEmitter();\n\n if (config.enableWorker && typeof (Worker) !== 'undefined') {\n try {\n let work = require('webworkify');\n this._worker = work(TransmuxingWorker);\n this._workerDestroying = false;\n this._worker.addEventListener('message', this._onWorkerMessage.bind(this));\n this._worker.postMessage({cmd: 'init', param: [mediaDataSource, config]});\n this.e = {\n onLoggingConfigChanged: this._onLoggingConfigChanged.bind(this)\n };\n LoggingControl.registerListener(this.e.onLoggingConfigChanged);\n this._worker.postMessage({cmd: 'logging_config', param: LoggingControl.getConfig()});\n } catch (error) {\n Log.e(this.TAG, 'Error while initialize transmuxing worker, fallback to inline transmuxing');\n this._worker = null;\n this._controller = new TransmuxingController(mediaDataSource, config);\n }\n } else {\n this._controller = new TransmuxingController(mediaDataSource, config);\n }\n\n if (this._controller) {\n let ctl = this._controller;\n ctl.on(TransmuxingEvents.IO_ERROR, this._onIOError.bind(this));\n ctl.on(TransmuxingEvents.DEMUX_ERROR, this._onDemuxError.bind(this));\n ctl.on(TransmuxingEvents.INIT_SEGMENT, this._onInitSegment.bind(this));\n ctl.on(TransmuxingEvents.MEDIA_SEGMENT, this._onMediaSegment.bind(this));\n ctl.on(TransmuxingEvents.LOADING_COMPLETE, this._onLoadingComplete.bind(this));\n ctl.on(TransmuxingEvents.RECOVERED_EARLY_EOF, this._onRecoveredEarlyEof.bind(this));\n ctl.on(TransmuxingEvents.MEDIA_INFO, this._onMediaInfo.bind(this));\n ctl.on(TransmuxingEvents.METADATA_ARRIVED, this._onMetaDataArrived.bind(this));\n ctl.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, this._onScriptDataArrived.bind(this));\n ctl.on(TransmuxingEvents.STATISTICS_INFO, this._onStatisticsInfo.bind(this));\n ctl.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, this._onRecommendSeekpoint.bind(this));\n }\n }\n\n destroy() {\n if (this._worker) {\n if (!this._workerDestroying) {\n this._workerDestroying = true;\n this._worker.postMessage({cmd: 'destroy'});\n LoggingControl.removeListener(this.e.onLoggingConfigChanged);\n this.e = null;\n }\n } else {\n this._controller.destroy();\n this._controller = null;\n }\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n hasWorker() {\n return this._worker != null;\n }\n\n open() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'start'});\n } else {\n this._controller.start();\n }\n }\n\n close() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'stop'});\n } else {\n this._controller.stop();\n }\n }\n\n seek(milliseconds) {\n if (this._worker) {\n this._worker.postMessage({cmd: 'seek', param: milliseconds});\n } else {\n this._controller.seek(milliseconds);\n }\n }\n\n pause() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'pause'});\n } else {\n this._controller.pause();\n }\n }\n\n resume() {\n if (this._worker) {\n this._worker.postMessage({cmd: 'resume'});\n } else {\n this._controller.resume();\n }\n }\n\n _onInitSegment(type, initSegment) {\n // do async invoke\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.INIT_SEGMENT, type, initSegment);\n });\n }\n\n _onMediaSegment(type, mediaSegment) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.MEDIA_SEGMENT, type, mediaSegment);\n });\n }\n\n _onLoadingComplete() {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.LOADING_COMPLETE);\n });\n }\n\n _onRecoveredEarlyEof() {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.RECOVERED_EARLY_EOF);\n });\n }\n\n _onMediaInfo(mediaInfo) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.MEDIA_INFO, mediaInfo);\n });\n }\n\n _onMetaDataArrived(metadata) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.METADATA_ARRIVED, metadata);\n });\n }\n\n _onScriptDataArrived(data) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.SCRIPTDATA_ARRIVED, data);\n });\n }\n\n _onStatisticsInfo(statisticsInfo) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.STATISTICS_INFO, statisticsInfo);\n });\n }\n\n _onIOError(type, info) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.IO_ERROR, type, info);\n });\n }\n\n _onDemuxError(type, info) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, type, info);\n });\n }\n\n _onRecommendSeekpoint(milliseconds) {\n Promise.resolve().then(() => {\n this._emitter.emit(TransmuxingEvents.RECOMMEND_SEEKPOINT, milliseconds);\n });\n }\n\n _onLoggingConfigChanged(config) {\n if (this._worker) {\n this._worker.postMessage({cmd: 'logging_config', param: config});\n }\n }\n\n _onWorkerMessage(e) {\n let message = e.data;\n let data = message.data;\n\n if (message.msg === 'destroyed' || this._workerDestroying) {\n this._workerDestroying = false;\n this._worker.terminate();\n this._worker = null;\n return;\n }\n\n switch (message.msg) {\n case TransmuxingEvents.INIT_SEGMENT:\n case TransmuxingEvents.MEDIA_SEGMENT:\n this._emitter.emit(message.msg, data.type, data.data);\n break;\n case TransmuxingEvents.LOADING_COMPLETE:\n case TransmuxingEvents.RECOVERED_EARLY_EOF:\n this._emitter.emit(message.msg);\n break;\n case TransmuxingEvents.MEDIA_INFO:\n Object.setPrototypeOf(data, MediaInfo.prototype);\n this._emitter.emit(message.msg, data);\n break;\n case TransmuxingEvents.METADATA_ARRIVED:\n case TransmuxingEvents.SCRIPTDATA_ARRIVED:\n case TransmuxingEvents.STATISTICS_INFO:\n this._emitter.emit(message.msg, data);\n break;\n case TransmuxingEvents.IO_ERROR:\n case TransmuxingEvents.DEMUX_ERROR:\n this._emitter.emit(message.msg, data.type, data.info);\n break;\n case TransmuxingEvents.RECOMMEND_SEEKPOINT:\n this._emitter.emit(message.msg, data);\n break;\n case 'logcat_callback':\n Log.emitter.emit('log', data.type, data.logcat);\n break;\n default:\n break;\n }\n }\n\n}\n\nexport default Transmuxer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport MediaInfo from './media-info.js';\nimport FLVDemuxer from '../demux/flv-demuxer.js';\nimport MP4Remuxer from '../remux/mp4-remuxer.js';\nimport DemuxErrors from '../demux/demux-errors.js';\nimport IOController from '../io/io-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\nimport {LoaderStatus, LoaderErrors} from '../io/loader.js';\n\n// Transmuxing (IO, Demuxing, Remuxing) controller, with multipart support\nclass TransmuxingController {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'TransmuxingController';\n this._emitter = new EventEmitter();\n\n this._config = config;\n\n // treat single part media as multipart media, which has only one segment\n if (!mediaDataSource.segments) {\n mediaDataSource.segments = [{\n duration: mediaDataSource.duration,\n filesize: mediaDataSource.filesize,\n url: mediaDataSource.url\n }];\n }\n\n // fill in default IO params if not exists\n if (typeof mediaDataSource.cors !== 'boolean') {\n mediaDataSource.cors = true;\n }\n if (typeof mediaDataSource.withCredentials !== 'boolean') {\n mediaDataSource.withCredentials = false;\n }\n\n this._mediaDataSource = mediaDataSource;\n this._currentSegmentIndex = 0;\n let totalDuration = 0;\n\n this._mediaDataSource.segments.forEach((segment) => {\n // timestampBase for each segment, and calculate total duration\n segment.timestampBase = totalDuration;\n totalDuration += segment.duration;\n // params needed by IOController\n segment.cors = mediaDataSource.cors;\n segment.withCredentials = mediaDataSource.withCredentials;\n // referrer policy control, if exist\n if (config.referrerPolicy) {\n segment.referrerPolicy = config.referrerPolicy;\n }\n });\n\n if (!isNaN(totalDuration) && this._mediaDataSource.duration !== totalDuration) {\n this._mediaDataSource.duration = totalDuration;\n }\n\n this._mediaInfo = null;\n this._demuxer = null;\n this._remuxer = null;\n this._ioctl = null;\n\n this._pendingSeekTime = null;\n this._pendingResolveSeekPoint = null;\n\n this._statisticsReporter = null;\n }\n\n destroy() {\n this._mediaInfo = null;\n this._mediaDataSource = null;\n\n if (this._statisticsReporter) {\n this._disableStatisticsReporter();\n }\n if (this._ioctl) {\n this._ioctl.destroy();\n this._ioctl = null;\n }\n if (this._demuxer) {\n this._demuxer.destroy();\n this._demuxer = null;\n }\n if (this._remuxer) {\n this._remuxer.destroy();\n this._remuxer = null;\n }\n\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n start() {\n this._loadSegment(0);\n this._enableStatisticsReporter();\n }\n\n _loadSegment(segmentIndex, optionalFrom) {\n this._currentSegmentIndex = segmentIndex;\n let dataSource = this._mediaDataSource.segments[segmentIndex];\n\n let ioctl = this._ioctl = new IOController(dataSource, this._config, segmentIndex);\n ioctl.onError = this._onIOException.bind(this);\n ioctl.onSeeked = this._onIOSeeked.bind(this);\n ioctl.onComplete = this._onIOComplete.bind(this);\n ioctl.onRedirect = this._onIORedirect.bind(this);\n ioctl.onRecoveredEarlyEof = this._onIORecoveredEarlyEof.bind(this);\n\n if (optionalFrom) {\n this._demuxer.bindDataSource(this._ioctl);\n } else {\n ioctl.onDataArrival = this._onInitChunkArrival.bind(this);\n }\n\n ioctl.open(optionalFrom);\n }\n\n stop() {\n this._internalAbort();\n this._disableStatisticsReporter();\n }\n\n _internalAbort() {\n if (this._ioctl) {\n this._ioctl.destroy();\n this._ioctl = null;\n }\n }\n\n pause() { // take a rest\n if (this._ioctl && this._ioctl.isWorking()) {\n this._ioctl.pause();\n this._disableStatisticsReporter();\n }\n }\n\n resume() {\n if (this._ioctl && this._ioctl.isPaused()) {\n this._ioctl.resume();\n this._enableStatisticsReporter();\n }\n }\n\n seek(milliseconds) {\n if (this._mediaInfo == null || !this._mediaInfo.isSeekable()) {\n return;\n }\n\n let targetSegmentIndex = this._searchSegmentIndexContains(milliseconds);\n\n if (targetSegmentIndex === this._currentSegmentIndex) {\n // intra-segment seeking\n let segmentInfo = this._mediaInfo.segments[targetSegmentIndex];\n\n if (segmentInfo == undefined) {\n // current segment loading started, but mediainfo hasn't received yet\n // wait for the metadata loaded, then seek to expected position\n this._pendingSeekTime = milliseconds;\n } else {\n let keyframe = segmentInfo.getNearestKeyframe(milliseconds);\n this._remuxer.seek(keyframe.milliseconds);\n this._ioctl.seek(keyframe.fileposition);\n // Will be resolved in _onRemuxerMediaSegmentArrival()\n this._pendingResolveSeekPoint = keyframe.milliseconds;\n }\n } else {\n // cross-segment seeking\n let targetSegmentInfo = this._mediaInfo.segments[targetSegmentIndex];\n\n if (targetSegmentInfo == undefined) {\n // target segment hasn't been loaded. We need metadata then seek to expected time\n this._pendingSeekTime = milliseconds;\n this._internalAbort();\n this._remuxer.seek();\n this._remuxer.insertDiscontinuity();\n this._loadSegment(targetSegmentIndex);\n // Here we wait for the metadata loaded, then seek to expected position\n } else {\n // We have target segment's metadata, direct seek to target position\n let keyframe = targetSegmentInfo.getNearestKeyframe(milliseconds);\n this._internalAbort();\n this._remuxer.seek(milliseconds);\n this._remuxer.insertDiscontinuity();\n this._demuxer.resetMediaInfo();\n this._demuxer.timestampBase = this._mediaDataSource.segments[targetSegmentIndex].timestampBase;\n this._loadSegment(targetSegmentIndex, keyframe.fileposition);\n this._pendingResolveSeekPoint = keyframe.milliseconds;\n this._reportSegmentMediaInfo(targetSegmentIndex);\n }\n }\n\n this._enableStatisticsReporter();\n }\n\n _searchSegmentIndexContains(milliseconds) {\n let segments = this._mediaDataSource.segments;\n let idx = segments.length - 1;\n\n for (let i = 0; i < segments.length; i++) {\n if (milliseconds < segments[i].timestampBase) {\n idx = i - 1;\n break;\n }\n }\n return idx;\n }\n\n _onInitChunkArrival(data, byteStart) {\n let probeData = null;\n let consumed = 0;\n\n if (byteStart > 0) {\n // IOController seeked immediately after opened, byteStart > 0 callback may received\n this._demuxer.bindDataSource(this._ioctl);\n this._demuxer.timestampBase = this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase;\n\n consumed = this._demuxer.parseChunks(data, byteStart);\n } else if ((probeData = FLVDemuxer.probe(data)).match) {\n // Always create new FLVDemuxer\n this._demuxer = new FLVDemuxer(probeData, this._config);\n\n if (!this._remuxer) {\n this._remuxer = new MP4Remuxer(this._config);\n }\n\n let mds = this._mediaDataSource;\n if (mds.duration != undefined && !isNaN(mds.duration)) {\n this._demuxer.overridedDuration = mds.duration;\n }\n if (typeof mds.hasAudio === 'boolean') {\n this._demuxer.overridedHasAudio = mds.hasAudio;\n }\n if (typeof mds.hasVideo === 'boolean') {\n this._demuxer.overridedHasVideo = mds.hasVideo;\n }\n\n this._demuxer.timestampBase = mds.segments[this._currentSegmentIndex].timestampBase;\n\n this._demuxer.onError = this._onDemuxException.bind(this);\n this._demuxer.onMediaInfo = this._onMediaInfo.bind(this);\n this._demuxer.onMetaDataArrived = this._onMetaDataArrived.bind(this);\n this._demuxer.onScriptDataArrived = this._onScriptDataArrived.bind(this);\n\n this._remuxer.bindDataSource(this._demuxer\n .bindDataSource(this._ioctl\n ));\n\n this._remuxer.onInitSegment = this._onRemuxerInitSegmentArrival.bind(this);\n this._remuxer.onMediaSegment = this._onRemuxerMediaSegmentArrival.bind(this);\n\n consumed = this._demuxer.parseChunks(data, byteStart);\n } else {\n probeData = null;\n Log.e(this.TAG, 'Non-FLV, Unsupported media type!');\n Promise.resolve().then(() => {\n this._internalAbort();\n });\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, DemuxErrors.FORMAT_UNSUPPORTED, 'Non-FLV, Unsupported media type');\n\n consumed = 0;\n }\n\n return consumed;\n }\n\n _onMediaInfo(mediaInfo) {\n if (this._mediaInfo == null) {\n // Store first segment's mediainfo as global mediaInfo\n this._mediaInfo = Object.assign({}, mediaInfo);\n this._mediaInfo.keyframesIndex = null;\n this._mediaInfo.segments = [];\n this._mediaInfo.segmentCount = this._mediaDataSource.segments.length;\n Object.setPrototypeOf(this._mediaInfo, MediaInfo.prototype);\n }\n\n let segmentInfo = Object.assign({}, mediaInfo);\n Object.setPrototypeOf(segmentInfo, MediaInfo.prototype);\n this._mediaInfo.segments[this._currentSegmentIndex] = segmentInfo;\n\n // notify mediaInfo update\n this._reportSegmentMediaInfo(this._currentSegmentIndex);\n\n if (this._pendingSeekTime != null) {\n Promise.resolve().then(() => {\n let target = this._pendingSeekTime;\n this._pendingSeekTime = null;\n this.seek(target);\n });\n }\n }\n\n _onMetaDataArrived(metadata) {\n this._emitter.emit(TransmuxingEvents.METADATA_ARRIVED, metadata);\n }\n\n _onScriptDataArrived(data) {\n this._emitter.emit(TransmuxingEvents.SCRIPTDATA_ARRIVED, data);\n }\n\n _onIOSeeked() {\n this._remuxer.insertDiscontinuity();\n }\n\n _onIOComplete(extraData) {\n let segmentIndex = extraData;\n let nextSegmentIndex = segmentIndex + 1;\n\n if (nextSegmentIndex < this._mediaDataSource.segments.length) {\n this._internalAbort();\n this._remuxer.flushStashedSamples();\n this._loadSegment(nextSegmentIndex);\n } else {\n this._remuxer.flushStashedSamples();\n this._emitter.emit(TransmuxingEvents.LOADING_COMPLETE);\n this._disableStatisticsReporter();\n }\n }\n\n _onIORedirect(redirectedURL) {\n let segmentIndex = this._ioctl.extraData;\n this._mediaDataSource.segments[segmentIndex].redirectedURL = redirectedURL;\n }\n\n _onIORecoveredEarlyEof() {\n this._emitter.emit(TransmuxingEvents.RECOVERED_EARLY_EOF);\n }\n\n _onIOException(type, info) {\n Log.e(this.TAG, `IOException: type = ${type}, code = ${info.code}, msg = ${info.msg}`);\n this._emitter.emit(TransmuxingEvents.IO_ERROR, type, info);\n this._disableStatisticsReporter();\n }\n\n _onDemuxException(type, info) {\n Log.e(this.TAG, `DemuxException: type = ${type}, info = ${info}`);\n this._emitter.emit(TransmuxingEvents.DEMUX_ERROR, type, info);\n }\n\n _onRemuxerInitSegmentArrival(type, initSegment) {\n this._emitter.emit(TransmuxingEvents.INIT_SEGMENT, type, initSegment);\n }\n\n _onRemuxerMediaSegmentArrival(type, mediaSegment) {\n if (this._pendingSeekTime != null) {\n // Media segments after new-segment cross-seeking should be dropped.\n return;\n }\n this._emitter.emit(TransmuxingEvents.MEDIA_SEGMENT, type, mediaSegment);\n\n // Resolve pending seekPoint\n if (this._pendingResolveSeekPoint != null && type === 'video') {\n let syncPoints = mediaSegment.info.syncPoints;\n let seekpoint = this._pendingResolveSeekPoint;\n this._pendingResolveSeekPoint = null;\n\n // Safari: Pass PTS for recommend_seekpoint\n if (Browser.safari && syncPoints.length > 0 && syncPoints[0].originalDts === seekpoint) {\n seekpoint = syncPoints[0].pts;\n }\n // else: use original DTS (keyframe.milliseconds)\n\n this._emitter.emit(TransmuxingEvents.RECOMMEND_SEEKPOINT, seekpoint);\n }\n }\n\n _enableStatisticsReporter() {\n if (this._statisticsReporter == null) {\n this._statisticsReporter = self.setInterval(\n this._reportStatisticsInfo.bind(this),\n this._config.statisticsInfoReportInterval);\n }\n }\n\n _disableStatisticsReporter() {\n if (this._statisticsReporter) {\n self.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n _reportSegmentMediaInfo(segmentIndex) {\n let segmentInfo = this._mediaInfo.segments[segmentIndex];\n let exportInfo = Object.assign({}, segmentInfo);\n\n exportInfo.duration = this._mediaInfo.duration;\n exportInfo.segmentCount = this._mediaInfo.segmentCount;\n delete exportInfo.segments;\n delete exportInfo.keyframesIndex;\n\n this._emitter.emit(TransmuxingEvents.MEDIA_INFO, exportInfo);\n }\n\n _reportStatisticsInfo() {\n let info = {};\n\n info.url = this._ioctl.currentURL;\n info.hasRedirect = this._ioctl.hasRedirect;\n if (info.hasRedirect) {\n info.redirectedURL = this._ioctl.currentRedirectedURL;\n }\n\n info.speed = this._ioctl.currentSpeed;\n info.loaderType = this._ioctl.loaderType;\n info.currentSegmentIndex = this._currentSegmentIndex;\n info.totalSegmentCount = this._mediaDataSource.segments.length;\n\n this._emitter.emit(TransmuxingEvents.STATISTICS_INFO, info);\n }\n\n}\n\nexport default TransmuxingController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst TransmuxingEvents = {\n IO_ERROR: 'io_error',\n DEMUX_ERROR: 'demux_error',\n INIT_SEGMENT: 'init_segment',\n MEDIA_SEGMENT: 'media_segment',\n LOADING_COMPLETE: 'loading_complete',\n RECOVERED_EARLY_EOF: 'recovered_early_eof',\n MEDIA_INFO: 'media_info',\n METADATA_ARRIVED: 'metadata_arrived',\n SCRIPTDATA_ARRIVED: 'scriptdata_arrived',\n STATISTICS_INFO: 'statistics_info',\n RECOMMEND_SEEKPOINT: 'recommend_seekpoint'\n};\n\nexport default TransmuxingEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport LoggingControl from '../utils/logging-control.js';\nimport Polyfill from '../utils/polyfill.js';\nimport TransmuxingController from './transmuxing-controller.js';\nimport TransmuxingEvents from './transmuxing-events.js';\n\n/* post message to worker:\n data: {\n cmd: string\n param: any\n }\n\n receive message from worker:\n data: {\n msg: string,\n data: any\n }\n */\n\nlet TransmuxingWorker = function (self) {\n\n let TAG = 'TransmuxingWorker';\n let controller = null;\n let logcatListener = onLogcatCallback.bind(this);\n\n Polyfill.install();\n\n self.addEventListener('message', function (e) {\n switch (e.data.cmd) {\n case 'init':\n controller = new TransmuxingController(e.data.param[0], e.data.param[1]);\n controller.on(TransmuxingEvents.IO_ERROR, onIOError.bind(this));\n controller.on(TransmuxingEvents.DEMUX_ERROR, onDemuxError.bind(this));\n controller.on(TransmuxingEvents.INIT_SEGMENT, onInitSegment.bind(this));\n controller.on(TransmuxingEvents.MEDIA_SEGMENT, onMediaSegment.bind(this));\n controller.on(TransmuxingEvents.LOADING_COMPLETE, onLoadingComplete.bind(this));\n controller.on(TransmuxingEvents.RECOVERED_EARLY_EOF, onRecoveredEarlyEof.bind(this));\n controller.on(TransmuxingEvents.MEDIA_INFO, onMediaInfo.bind(this));\n controller.on(TransmuxingEvents.METADATA_ARRIVED, onMetaDataArrived.bind(this));\n controller.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, onScriptDataArrived.bind(this));\n controller.on(TransmuxingEvents.STATISTICS_INFO, onStatisticsInfo.bind(this));\n controller.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, onRecommendSeekpoint.bind(this));\n break;\n case 'destroy':\n if (controller) {\n controller.destroy();\n controller = null;\n }\n self.postMessage({msg: 'destroyed'});\n break;\n case 'start':\n controller.start();\n break;\n case 'stop':\n controller.stop();\n break;\n case 'seek':\n controller.seek(e.data.param);\n break;\n case 'pause':\n controller.pause();\n break;\n case 'resume':\n controller.resume();\n break;\n case 'logging_config': {\n let config = e.data.param;\n LoggingControl.applyConfig(config);\n\n if (config.enableCallback === true) {\n LoggingControl.addLogListener(logcatListener);\n } else {\n LoggingControl.removeLogListener(logcatListener);\n }\n break;\n }\n }\n });\n\n function onInitSegment(type, initSegment) {\n let obj = {\n msg: TransmuxingEvents.INIT_SEGMENT,\n data: {\n type: type,\n data: initSegment\n }\n };\n self.postMessage(obj, [initSegment.data]); // data: ArrayBuffer\n }\n\n function onMediaSegment(type, mediaSegment) {\n let obj = {\n msg: TransmuxingEvents.MEDIA_SEGMENT,\n data: {\n type: type,\n data: mediaSegment\n }\n };\n self.postMessage(obj, [mediaSegment.data]); // data: ArrayBuffer\n }\n\n function onLoadingComplete() {\n let obj = {\n msg: TransmuxingEvents.LOADING_COMPLETE\n };\n self.postMessage(obj);\n }\n\n function onRecoveredEarlyEof() {\n let obj = {\n msg: TransmuxingEvents.RECOVERED_EARLY_EOF\n };\n self.postMessage(obj);\n }\n\n function onMediaInfo(mediaInfo) {\n let obj = {\n msg: TransmuxingEvents.MEDIA_INFO,\n data: mediaInfo\n };\n self.postMessage(obj);\n }\n\n function onMetaDataArrived(metadata) {\n let obj = {\n msg: TransmuxingEvents.METADATA_ARRIVED,\n data: metadata\n };\n self.postMessage(obj);\n }\n\n function onScriptDataArrived(data) {\n let obj = {\n msg: TransmuxingEvents.SCRIPTDATA_ARRIVED,\n data: data\n };\n self.postMessage(obj);\n }\n\n function onStatisticsInfo(statInfo) {\n let obj = {\n msg: TransmuxingEvents.STATISTICS_INFO,\n data: statInfo\n };\n self.postMessage(obj);\n }\n\n function onIOError(type, info) {\n self.postMessage({\n msg: TransmuxingEvents.IO_ERROR,\n data: {\n type: type,\n info: info\n }\n });\n }\n\n function onDemuxError(type, info) {\n self.postMessage({\n msg: TransmuxingEvents.DEMUX_ERROR,\n data: {\n type: type,\n info: info\n }\n });\n }\n\n function onRecommendSeekpoint(milliseconds) {\n self.postMessage({\n msg: TransmuxingEvents.RECOMMEND_SEEKPOINT,\n data: milliseconds\n });\n }\n\n function onLogcatCallback(type, str) {\n self.postMessage({\n msg: 'logcat_callback',\n data: {\n type: type,\n logcat: str\n }\n });\n }\n\n};\n\nexport default TransmuxingWorker;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport decodeUTF8 from '../utils/utf8-conv.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\nlet le = (function () {\n let buf = new ArrayBuffer(2);\n (new DataView(buf)).setInt16(0, 256, true); // little-endian write\n return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE\n})();\n\nclass AMF {\n\n static parseScriptData(arrayBuffer, dataOffset, dataSize) {\n let data = {};\n\n try {\n let name = AMF.parseValue(arrayBuffer, dataOffset, dataSize);\n let value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);\n\n data[name.data] = value.data;\n } catch (e) {\n Log.e('AMF', e.toString());\n }\n\n return data;\n }\n\n static parseObject(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 3) {\n throw new IllegalStateException('Data not enough when parse ScriptDataObject');\n }\n let name = AMF.parseString(arrayBuffer, dataOffset, dataSize);\n let value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);\n let isObjectEnd = value.objectEnd;\n\n return {\n data: {\n name: name.data,\n value: value.data\n },\n size: name.size + value.size,\n objectEnd: isObjectEnd\n };\n }\n\n static parseVariable(arrayBuffer, dataOffset, dataSize) {\n return AMF.parseObject(arrayBuffer, dataOffset, dataSize);\n }\n\n static parseString(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 2) {\n throw new IllegalStateException('Data not enough when parse String');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let length = v.getUint16(0, !le);\n\n let str;\n if (length > 0) {\n str = decodeUTF8(new Uint8Array(arrayBuffer, dataOffset + 2, length));\n } else {\n str = '';\n }\n\n return {\n data: str,\n size: 2 + length\n };\n }\n\n static parseLongString(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 4) {\n throw new IllegalStateException('Data not enough when parse LongString');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let length = v.getUint32(0, !le);\n\n let str;\n if (length > 0) {\n str = decodeUTF8(new Uint8Array(arrayBuffer, dataOffset + 4, length));\n } else {\n str = '';\n }\n\n return {\n data: str,\n size: 4 + length\n };\n }\n\n static parseDate(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 10) {\n throw new IllegalStateException('Data size invalid when parse Date');\n }\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n let timestamp = v.getFloat64(0, !le);\n let localTimeOffset = v.getInt16(8, !le);\n timestamp += localTimeOffset * 60 * 1000; // get UTC time\n\n return {\n data: new Date(timestamp),\n size: 8 + 2\n };\n }\n\n static parseValue(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 1) {\n throw new IllegalStateException('Data not enough when parse Value');\n }\n\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let offset = 1;\n let type = v.getUint8(0);\n let value;\n let objectEnd = false;\n\n try {\n switch (type) {\n case 0: // Number(Double) type\n value = v.getFloat64(1, !le);\n offset += 8;\n break;\n case 1: { // Boolean type\n let b = v.getUint8(1);\n value = b ? true : false;\n offset += 1;\n break;\n }\n case 2: { // String type\n let amfstr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = amfstr.data;\n offset += amfstr.size;\n break;\n }\n case 3: { // Object(s) type\n value = {};\n let terminal = 0; // workaround for malformed Objects which has missing ScriptDataObjectEnd\n if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {\n terminal = 3;\n }\n while (offset < dataSize - 4) { // 4 === type(UI8) + ScriptDataObjectEnd(UI24)\n let amfobj = AMF.parseObject(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);\n if (amfobj.objectEnd)\n break;\n value[amfobj.data.name] = amfobj.data.value;\n offset += amfobj.size;\n }\n if (offset <= dataSize - 3) {\n let marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;\n if (marker === 9) {\n offset += 3;\n }\n }\n break;\n }\n case 8: { // ECMA array type (Mixed array)\n value = {};\n offset += 4; // ECMAArrayLength(UI32)\n let terminal = 0; // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd\n if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {\n terminal = 3;\n }\n while (offset < dataSize - 8) { // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24)\n let amfvar = AMF.parseVariable(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);\n if (amfvar.objectEnd)\n break;\n value[amfvar.data.name] = amfvar.data.value;\n offset += amfvar.size;\n }\n if (offset <= dataSize - 3) {\n let marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;\n if (marker === 9) {\n offset += 3;\n }\n }\n break;\n }\n case 9: // ScriptDataObjectEnd\n value = undefined;\n offset = 1;\n objectEnd = true;\n break;\n case 10: { // Strict array type\n // ScriptDataValue[n]. NOTE: according to video_file_format_spec_v10_1.pdf\n value = [];\n let strictArrayLength = v.getUint32(1, !le);\n offset += 4;\n for (let i = 0; i < strictArrayLength; i++) {\n let val = AMF.parseValue(arrayBuffer, dataOffset + offset, dataSize - offset);\n value.push(val.data);\n offset += val.size;\n }\n break;\n }\n case 11: { // Date type\n let date = AMF.parseDate(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = date.data;\n offset += date.size;\n break;\n }\n case 12: { // Long string type\n let amfLongStr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);\n value = amfLongStr.data;\n offset += amfLongStr.size;\n break;\n }\n default:\n // ignore and skip\n offset = dataSize;\n Log.w('AMF', 'Unsupported AMF value type ' + type);\n }\n } catch (e) {\n Log.e('AMF', e.toString());\n }\n\n return {\n data: value,\n size: offset,\n objectEnd: objectEnd\n };\n }\n\n}\n\nexport default AMF;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst DemuxErrors = {\n OK: 'OK',\n FORMAT_ERROR: 'FormatError',\n FORMAT_UNSUPPORTED: 'FormatUnsupported',\n CODEC_UNSUPPORTED: 'CodecUnsupported'\n};\n\nexport default DemuxErrors;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {IllegalStateException, InvalidArgumentException} from '../utils/exception.js';\n\n// Exponential-Golomb buffer decoder\nclass ExpGolomb {\n\n constructor(uint8array) {\n this.TAG = 'ExpGolomb';\n\n this._buffer = uint8array;\n this._buffer_index = 0;\n this._total_bytes = uint8array.byteLength;\n this._total_bits = uint8array.byteLength * 8;\n this._current_word = 0;\n this._current_word_bits_left = 0;\n }\n\n destroy() {\n this._buffer = null;\n }\n\n _fillCurrentWord() {\n let buffer_bytes_left = this._total_bytes - this._buffer_index;\n if (buffer_bytes_left <= 0)\n throw new IllegalStateException('ExpGolomb: _fillCurrentWord() but no bytes available');\n\n let bytes_read = Math.min(4, buffer_bytes_left);\n let word = new Uint8Array(4);\n word.set(this._buffer.subarray(this._buffer_index, this._buffer_index + bytes_read));\n this._current_word = new DataView(word.buffer).getUint32(0, false);\n\n this._buffer_index += bytes_read;\n this._current_word_bits_left = bytes_read * 8;\n }\n\n readBits(bits) {\n if (bits > 32)\n throw new InvalidArgumentException('ExpGolomb: readBits() bits exceeded max 32bits!');\n\n if (bits <= this._current_word_bits_left) {\n let result = this._current_word >>> (32 - bits);\n this._current_word <<= bits;\n this._current_word_bits_left -= bits;\n return result;\n }\n\n let result = this._current_word_bits_left ? this._current_word : 0;\n result = result >>> (32 - this._current_word_bits_left);\n let bits_need_left = bits - this._current_word_bits_left;\n\n this._fillCurrentWord();\n let bits_read_next = Math.min(bits_need_left, this._current_word_bits_left);\n\n let result2 = this._current_word >>> (32 - bits_read_next);\n this._current_word <<= bits_read_next;\n this._current_word_bits_left -= bits_read_next;\n\n result = (result << bits_read_next) | result2;\n return result;\n }\n\n readBool() {\n return this.readBits(1) === 1;\n }\n\n readByte() {\n return this.readBits(8);\n }\n\n _skipLeadingZero() {\n let zero_count;\n for (zero_count = 0; zero_count < this._current_word_bits_left; zero_count++) {\n if (0 !== (this._current_word & (0x80000000 >>> zero_count))) {\n this._current_word <<= zero_count;\n this._current_word_bits_left -= zero_count;\n return zero_count;\n }\n }\n this._fillCurrentWord();\n return zero_count + this._skipLeadingZero();\n }\n\n readUEG() { // unsigned exponential golomb\n let leading_zeros = this._skipLeadingZero();\n return this.readBits(leading_zeros + 1) - 1;\n }\n\n readSEG() { // signed exponential golomb\n let value = this.readUEG();\n if (value & 0x01) {\n return (value + 1) >>> 1;\n } else {\n return -1 * (value >>> 1);\n }\n }\n\n}\n\nexport default ExpGolomb;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport AMF from './amf-parser.js';\nimport SPSParser from './sps-parser.js';\nimport DemuxErrors from './demux-errors.js';\nimport MediaInfo from '../core/media-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\nfunction Swap16(src) {\n return (((src >>> 8) & 0xFF) |\n ((src & 0xFF) << 8));\n}\n\nfunction Swap32(src) {\n return (((src & 0xFF000000) >>> 24) |\n ((src & 0x00FF0000) >>> 8) |\n ((src & 0x0000FF00) << 8) |\n ((src & 0x000000FF) << 24));\n}\n\nfunction ReadBig32(array, index) {\n return ((array[index] << 24) |\n (array[index + 1] << 16) |\n (array[index + 2] << 8) |\n (array[index + 3]));\n}\n\n\nclass FLVDemuxer {\n\n constructor(probeData, config) {\n this.TAG = 'FLVDemuxer';\n\n this._config = config;\n\n this._onError = null;\n this._onMediaInfo = null;\n this._onMetaDataArrived = null;\n this._onScriptDataArrived = null;\n this._onTrackMetadata = null;\n this._onDataAvailable = null;\n\n this._dataOffset = probeData.dataOffset;\n this._firstParse = true;\n this._dispatch = false;\n\n this._hasAudio = probeData.hasAudioTrack;\n this._hasVideo = probeData.hasVideoTrack;\n\n this._hasAudioFlagOverrided = false;\n this._hasVideoFlagOverrided = false;\n\n this._audioInitialMetadataDispatched = false;\n this._videoInitialMetadataDispatched = false;\n\n this._mediaInfo = new MediaInfo();\n this._mediaInfo.hasAudio = this._hasAudio;\n this._mediaInfo.hasVideo = this._hasVideo;\n this._metadata = null;\n this._audioMetadata = null;\n this._videoMetadata = null;\n\n this._naluLengthSize = 4;\n this._timestampBase = 0; // int32, in milliseconds\n this._timescale = 1000;\n this._duration = 0; // int32, in milliseconds\n this._durationOverrided = false;\n this._referenceFrameRate = {\n fixed: true,\n fps: 23.976,\n fps_num: 23976,\n fps_den: 1000\n };\n\n this._flvSoundRateTable = [5500, 11025, 22050, 44100, 48000];\n\n this._mpegSamplingRates = [\n 96000, 88200, 64000, 48000, 44100, 32000,\n 24000, 22050, 16000, 12000, 11025, 8000, 7350\n ];\n\n this._mpegAudioV10SampleRateTable = [44100, 48000, 32000, 0];\n this._mpegAudioV20SampleRateTable = [22050, 24000, 16000, 0];\n this._mpegAudioV25SampleRateTable = [11025, 12000, 8000, 0];\n\n this._mpegAudioL1BitRateTable = [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1];\n this._mpegAudioL2BitRateTable = [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1];\n this._mpegAudioL3BitRateTable = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1];\n\n this._videoTrack = {type: 'video', id: 1, sequenceNumber: 0, samples: [], length: 0};\n this._audioTrack = {type: 'audio', id: 2, sequenceNumber: 0, samples: [], length: 0};\n\n this._littleEndian = (function () {\n let buf = new ArrayBuffer(2);\n (new DataView(buf)).setInt16(0, 256, true); // little-endian write\n return (new Int16Array(buf))[0] === 256; // platform-spec read, if equal then LE\n })();\n }\n\n destroy() {\n this._mediaInfo = null;\n this._metadata = null;\n this._audioMetadata = null;\n this._videoMetadata = null;\n this._videoTrack = null;\n this._audioTrack = null;\n\n this._onError = null;\n this._onMediaInfo = null;\n this._onMetaDataArrived = null;\n this._onScriptDataArrived = null;\n this._onTrackMetadata = null;\n this._onDataAvailable = null;\n }\n\n static probe(buffer) {\n let data = new Uint8Array(buffer);\n let mismatch = {match: false};\n\n if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) {\n return mismatch;\n }\n\n let hasAudio = ((data[4] & 4) >>> 2) !== 0;\n let hasVideo = (data[4] & 1) !== 0;\n\n let offset = ReadBig32(data, 5);\n\n if (offset < 9) {\n return mismatch;\n }\n\n return {\n match: true,\n consumed: offset,\n dataOffset: offset,\n hasAudioTrack: hasAudio,\n hasVideoTrack: hasVideo\n };\n }\n\n bindDataSource(loader) {\n loader.onDataArrival = this.parseChunks.bind(this);\n return this;\n }\n\n // prototype: function(type: string, metadata: any): void\n get onTrackMetadata() {\n return this._onTrackMetadata;\n }\n\n set onTrackMetadata(callback) {\n this._onTrackMetadata = callback;\n }\n\n // prototype: function(mediaInfo: MediaInfo): void\n get onMediaInfo() {\n return this._onMediaInfo;\n }\n\n set onMediaInfo(callback) {\n this._onMediaInfo = callback;\n }\n\n get onMetaDataArrived() {\n return this._onMetaDataArrived;\n }\n\n set onMetaDataArrived(callback) {\n this._onMetaDataArrived = callback;\n }\n\n get onScriptDataArrived() {\n return this._onScriptDataArrived;\n }\n\n set onScriptDataArrived(callback) {\n this._onScriptDataArrived = callback;\n }\n\n // prototype: function(type: number, info: string): void\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n // prototype: function(videoTrack: any, audioTrack: any): void\n get onDataAvailable() {\n return this._onDataAvailable;\n }\n\n set onDataAvailable(callback) {\n this._onDataAvailable = callback;\n }\n\n // timestamp base for output samples, must be in milliseconds\n get timestampBase() {\n return this._timestampBase;\n }\n\n set timestampBase(base) {\n this._timestampBase = base;\n }\n\n get overridedDuration() {\n return this._duration;\n }\n\n // Force-override media duration. Must be in milliseconds, int32\n set overridedDuration(duration) {\n this._durationOverrided = true;\n this._duration = duration;\n this._mediaInfo.duration = duration;\n }\n\n // Force-override audio track present flag, boolean\n set overridedHasAudio(hasAudio) {\n this._hasAudioFlagOverrided = true;\n this._hasAudio = hasAudio;\n this._mediaInfo.hasAudio = hasAudio;\n }\n\n // Force-override video track present flag, boolean\n set overridedHasVideo(hasVideo) {\n this._hasVideoFlagOverrided = true;\n this._hasVideo = hasVideo;\n this._mediaInfo.hasVideo = hasVideo;\n }\n\n resetMediaInfo() {\n this._mediaInfo = new MediaInfo();\n }\n\n _isInitialMetadataDispatched() {\n if (this._hasAudio && this._hasVideo) { // both audio & video\n return this._audioInitialMetadataDispatched && this._videoInitialMetadataDispatched;\n }\n if (this._hasAudio && !this._hasVideo) { // audio only\n return this._audioInitialMetadataDispatched;\n }\n if (!this._hasAudio && this._hasVideo) { // video only\n return this._videoInitialMetadataDispatched;\n }\n return false;\n }\n\n // function parseChunks(chunk: ArrayBuffer, byteStart: number): number;\n parseChunks(chunk, byteStart) {\n if (!this._onError || !this._onMediaInfo || !this._onTrackMetadata || !this._onDataAvailable) {\n throw new IllegalStateException('Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified');\n }\n\n let offset = 0;\n let le = this._littleEndian;\n\n if (byteStart === 0) { // buffer with FLV header\n if (chunk.byteLength > 13) {\n let probeData = FLVDemuxer.probe(chunk);\n offset = probeData.dataOffset;\n } else {\n return 0;\n }\n }\n\n if (this._firstParse) { // handle PreviousTagSize0 before Tag1\n this._firstParse = false;\n if (byteStart + offset !== this._dataOffset) {\n Log.w(this.TAG, 'First time parsing but chunk byteStart invalid!');\n }\n\n let v = new DataView(chunk, offset);\n let prevTagSize0 = v.getUint32(0, !le);\n if (prevTagSize0 !== 0) {\n Log.w(this.TAG, 'PrevTagSize0 !== 0 !!!');\n }\n offset += 4;\n }\n\n while (offset < chunk.byteLength) {\n this._dispatch = true;\n\n let v = new DataView(chunk, offset);\n\n if (offset + 11 + 4 > chunk.byteLength) {\n // data not enough for parsing an flv tag\n break;\n }\n\n let tagType = v.getUint8(0);\n let dataSize = v.getUint32(0, !le) & 0x00FFFFFF;\n\n if (offset + 11 + dataSize + 4 > chunk.byteLength) {\n // data not enough for parsing actual data body\n break;\n }\n\n if (tagType !== 8 && tagType !== 9 && tagType !== 18) {\n Log.w(this.TAG, `Unsupported tag type ${tagType}, skipped`);\n // consume the whole tag (skip it)\n offset += 11 + dataSize + 4;\n continue;\n }\n\n let ts2 = v.getUint8(4);\n let ts1 = v.getUint8(5);\n let ts0 = v.getUint8(6);\n let ts3 = v.getUint8(7);\n\n let timestamp = ts0 | (ts1 << 8) | (ts2 << 16) | (ts3 << 24);\n\n let streamId = v.getUint32(7, !le) & 0x00FFFFFF;\n if (streamId !== 0) {\n Log.w(this.TAG, 'Meet tag which has StreamID != 0!');\n }\n\n let dataOffset = offset + 11;\n\n switch (tagType) {\n case 8: // Audio\n this._parseAudioData(chunk, dataOffset, dataSize, timestamp);\n break;\n case 9: // Video\n this._parseVideoData(chunk, dataOffset, dataSize, timestamp, byteStart + offset);\n break;\n case 18: // ScriptDataObject\n this._parseScriptData(chunk, dataOffset, dataSize);\n break;\n }\n\n let prevTagSize = v.getUint32(11 + dataSize, !le);\n if (prevTagSize !== 11 + dataSize) {\n Log.w(this.TAG, `Invalid PrevTagSize ${prevTagSize}`);\n }\n\n offset += 11 + dataSize + 4; // tagBody + dataSize + prevTagSize\n }\n\n // dispatch parsed frames to consumer (typically, the remuxer)\n if (this._isInitialMetadataDispatched()) {\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n }\n\n return offset; // consumed bytes, just equals latest offset index\n }\n\n _parseScriptData(arrayBuffer, dataOffset, dataSize) {\n let scriptData = AMF.parseScriptData(arrayBuffer, dataOffset, dataSize);\n\n if (scriptData.hasOwnProperty('onMetaData')) {\n if (scriptData.onMetaData == null || typeof scriptData.onMetaData !== 'object') {\n Log.w(this.TAG, 'Invalid onMetaData structure!');\n return;\n }\n if (this._metadata) {\n Log.w(this.TAG, 'Found another onMetaData tag!');\n }\n this._metadata = scriptData;\n let onMetaData = this._metadata.onMetaData;\n\n if (this._onMetaDataArrived) {\n this._onMetaDataArrived(Object.assign({}, onMetaData));\n }\n\n if (typeof onMetaData.hasAudio === 'boolean') { // hasAudio\n if (this._hasAudioFlagOverrided === false) {\n this._hasAudio = onMetaData.hasAudio;\n this._mediaInfo.hasAudio = this._hasAudio;\n }\n }\n if (typeof onMetaData.hasVideo === 'boolean') { // hasVideo\n if (this._hasVideoFlagOverrided === false) {\n this._hasVideo = onMetaData.hasVideo;\n this._mediaInfo.hasVideo = this._hasVideo;\n }\n }\n if (typeof onMetaData.audiodatarate === 'number') { // audiodatarate\n this._mediaInfo.audioDataRate = onMetaData.audiodatarate;\n }\n if (typeof onMetaData.videodatarate === 'number') { // videodatarate\n this._mediaInfo.videoDataRate = onMetaData.videodatarate;\n }\n if (typeof onMetaData.width === 'number') { // width\n this._mediaInfo.width = onMetaData.width;\n }\n if (typeof onMetaData.height === 'number') { // height\n this._mediaInfo.height = onMetaData.height;\n }\n if (typeof onMetaData.duration === 'number') { // duration\n if (!this._durationOverrided) {\n let duration = Math.floor(onMetaData.duration * this._timescale);\n this._duration = duration;\n this._mediaInfo.duration = duration;\n }\n } else {\n this._mediaInfo.duration = 0;\n }\n if (typeof onMetaData.framerate === 'number') { // framerate\n let fps_num = Math.floor(onMetaData.framerate * 1000);\n if (fps_num > 0) {\n let fps = fps_num / 1000;\n this._referenceFrameRate.fixed = true;\n this._referenceFrameRate.fps = fps;\n this._referenceFrameRate.fps_num = fps_num;\n this._referenceFrameRate.fps_den = 1000;\n this._mediaInfo.fps = fps;\n }\n }\n if (typeof onMetaData.keyframes === 'object') { // keyframes\n this._mediaInfo.hasKeyframesIndex = true;\n let keyframes = onMetaData.keyframes;\n this._mediaInfo.keyframesIndex = this._parseKeyframesIndex(keyframes);\n onMetaData.keyframes = null; // keyframes has been extracted, remove it\n } else {\n this._mediaInfo.hasKeyframesIndex = false;\n }\n this._dispatch = false;\n this._mediaInfo.metadata = onMetaData;\n Log.v(this.TAG, 'Parsed onMetaData');\n if (this._mediaInfo.isComplete()) {\n this._onMediaInfo(this._mediaInfo);\n }\n }\n\n if (Object.keys(scriptData).length > 0) {\n if (this._onScriptDataArrived) {\n this._onScriptDataArrived(Object.assign({}, scriptData));\n }\n }\n }\n\n _parseKeyframesIndex(keyframes) {\n let times = [];\n let filepositions = [];\n\n // ignore first keyframe which is actually AVC Sequence Header (AVCDecoderConfigurationRecord)\n for (let i = 1; i < keyframes.times.length; i++) {\n let time = this._timestampBase + Math.floor(keyframes.times[i] * 1000);\n times.push(time);\n filepositions.push(keyframes.filepositions[i]);\n }\n\n return {\n times: times,\n filepositions: filepositions\n };\n }\n\n _parseAudioData(arrayBuffer, dataOffset, dataSize, tagTimestamp) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid audio packet, missing SoundData payload!');\n return;\n }\n\n if (this._hasAudioFlagOverrided === true && this._hasAudio === false) {\n // If hasAudio: false indicated explicitly in MediaDataSource,\n // Ignore all the audio packets\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let soundSpec = v.getUint8(0);\n\n let soundFormat = soundSpec >>> 4;\n if (soundFormat !== 2 && soundFormat !== 10) { // MP3 or AAC\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, 'Flv: Unsupported audio codec idx: ' + soundFormat);\n return;\n }\n\n let soundRate = 0;\n let soundRateIndex = (soundSpec & 12) >>> 2;\n if (soundRateIndex >= 0 && soundRateIndex <= 4) {\n soundRate = this._flvSoundRateTable[soundRateIndex];\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid audio sample rate idx: ' + soundRateIndex);\n return;\n }\n\n let soundSize = (soundSpec & 2) >>> 1; // unused\n let soundType = (soundSpec & 1);\n\n\n let meta = this._audioMetadata;\n let track = this._audioTrack;\n\n if (!meta) {\n if (this._hasAudio === false && this._hasAudioFlagOverrided === false) {\n this._hasAudio = true;\n this._mediaInfo.hasAudio = true;\n }\n\n // initial metadata\n meta = this._audioMetadata = {};\n meta.type = 'audio';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n meta.audioSampleRate = soundRate;\n meta.channelCount = (soundType === 0 ? 1 : 2);\n }\n\n if (soundFormat === 10) { // AAC\n let aacData = this._parseAACAudioData(arrayBuffer, dataOffset + 1, dataSize - 1);\n if (aacData == undefined) {\n return;\n }\n\n if (aacData.packetType === 0) { // AAC sequence header (AudioSpecificConfig)\n if (meta.config) {\n Log.w(this.TAG, 'Found another AudioSpecificConfig!');\n }\n let misc = aacData.data;\n meta.audioSampleRate = misc.samplingRate;\n meta.channelCount = misc.channelCount;\n meta.codec = misc.codec;\n meta.originalCodec = misc.originalCodec;\n meta.config = misc.config;\n // The decode result of an aac sample is 1024 PCM samples\n meta.refSampleDuration = 1024 / meta.audioSampleRate * meta.timescale;\n Log.v(this.TAG, 'Parsed AudioSpecificConfig');\n\n if (this._isInitialMetadataDispatched()) {\n // Non-initial metadata, force dispatch (or flush) parsed frames to remuxer\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._audioInitialMetadataDispatched = true;\n }\n // then notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('audio', meta);\n\n let mi = this._mediaInfo;\n mi.audioCodec = meta.originalCodec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n if (mi.hasVideo) {\n if (mi.videoCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.audioCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n } else if (aacData.packetType === 1) { // AAC raw frame data\n let dts = this._timestampBase + tagTimestamp;\n let aacSample = {unit: aacData.data, length: aacData.data.byteLength, dts: dts, pts: dts};\n track.samples.push(aacSample);\n track.length += aacData.data.length;\n } else {\n Log.e(this.TAG, `Flv: Unsupported AAC data type ${aacData.packetType}`);\n }\n } else if (soundFormat === 2) { // MP3\n if (!meta.codec) {\n // We need metadata for mp3 audio track, extract info from frame header\n let misc = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, true);\n if (misc == undefined) {\n return;\n }\n meta.audioSampleRate = misc.samplingRate;\n meta.channelCount = misc.channelCount;\n meta.codec = misc.codec;\n meta.originalCodec = misc.originalCodec;\n // The decode result of an mp3 sample is 1152 PCM samples\n meta.refSampleDuration = 1152 / meta.audioSampleRate * meta.timescale;\n Log.v(this.TAG, 'Parsed MPEG Audio Frame Header');\n\n this._audioInitialMetadataDispatched = true;\n this._onTrackMetadata('audio', meta);\n\n let mi = this._mediaInfo;\n mi.audioCodec = meta.codec;\n mi.audioSampleRate = meta.audioSampleRate;\n mi.audioChannelCount = meta.channelCount;\n mi.audioDataRate = misc.bitRate;\n if (mi.hasVideo) {\n if (mi.videoCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.audioCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n }\n\n // This packet is always a valid audio packet, extract it\n let data = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, false);\n if (data == undefined) {\n return;\n }\n let dts = this._timestampBase + tagTimestamp;\n let mp3Sample = {unit: data, length: data.byteLength, dts: dts, pts: dts};\n track.samples.push(mp3Sample);\n track.length += data.length;\n }\n }\n\n _parseAACAudioData(arrayBuffer, dataOffset, dataSize) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid AAC packet, missing AACPacketType or/and Data!');\n return;\n }\n\n let result = {};\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n\n result.packetType = array[0];\n\n if (array[0] === 0) {\n result.data = this._parseAACAudioSpecificConfig(arrayBuffer, dataOffset + 1, dataSize - 1);\n } else {\n result.data = array.subarray(1);\n }\n\n return result;\n }\n\n _parseAACAudioSpecificConfig(arrayBuffer, dataOffset, dataSize) {\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n let config = null;\n\n /* Audio Object Type:\n 0: Null\n 1: AAC Main\n 2: AAC LC\n 3: AAC SSR (Scalable Sample Rate)\n 4: AAC LTP (Long Term Prediction)\n 5: HE-AAC / SBR (Spectral Band Replication)\n 6: AAC Scalable\n */\n\n let audioObjectType = 0;\n let originalAudioObjectType = 0;\n let audioExtensionObjectType = null;\n let samplingIndex = 0;\n let extensionSamplingIndex = null;\n\n // 5 bits\n audioObjectType = originalAudioObjectType = array[0] >>> 3;\n // 4 bits\n samplingIndex = ((array[0] & 0x07) << 1) | (array[1] >>> 7);\n if (samplingIndex < 0 || samplingIndex >= this._mpegSamplingRates.length) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: AAC invalid sampling frequency index!');\n return;\n }\n\n let samplingFrequence = this._mpegSamplingRates[samplingIndex];\n\n // 4 bits\n let channelConfig = (array[1] & 0x78) >>> 3;\n if (channelConfig < 0 || channelConfig >= 8) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: AAC invalid channel configuration');\n return;\n }\n\n if (audioObjectType === 5) { // HE-AAC?\n // 4 bits\n extensionSamplingIndex = ((array[1] & 0x07) << 1) | (array[2] >>> 7);\n // 5 bits\n audioExtensionObjectType = (array[2] & 0x7C) >>> 2;\n }\n\n // workarounds for various browsers\n let userAgent = self.navigator.userAgent.toLowerCase();\n\n if (userAgent.indexOf('firefox') !== -1) {\n // firefox: use SBR (HE-AAC) if freq less than 24kHz\n if (samplingIndex >= 6) {\n audioObjectType = 5;\n config = new Array(4);\n extensionSamplingIndex = samplingIndex - 3;\n } else { // use LC-AAC\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n }\n } else if (userAgent.indexOf('android') !== -1) {\n // android: always use LC-AAC\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n } else {\n // for other browsers, e.g. chrome...\n // Always use HE-AAC to make it easier to switch aac codec profile\n audioObjectType = 5;\n extensionSamplingIndex = samplingIndex;\n config = new Array(4);\n\n if (samplingIndex >= 6) {\n extensionSamplingIndex = samplingIndex - 3;\n } else if (channelConfig === 1) { // Mono channel\n audioObjectType = 2;\n config = new Array(2);\n extensionSamplingIndex = samplingIndex;\n }\n }\n\n config[0] = audioObjectType << 3;\n config[0] |= (samplingIndex & 0x0F) >>> 1;\n config[1] = (samplingIndex & 0x0F) << 7;\n config[1] |= (channelConfig & 0x0F) << 3;\n if (audioObjectType === 5) {\n config[1] |= ((extensionSamplingIndex & 0x0F) >>> 1);\n config[2] = (extensionSamplingIndex & 0x01) << 7;\n // extended audio object type: force to 2 (LC-AAC)\n config[2] |= (2 << 2);\n config[3] = 0;\n }\n\n return {\n config: config,\n samplingRate: samplingFrequence,\n channelCount: channelConfig,\n codec: 'mp4a.40.' + audioObjectType,\n originalCodec: 'mp4a.40.' + originalAudioObjectType\n };\n }\n\n _parseMP3AudioData(arrayBuffer, dataOffset, dataSize, requestHeader) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid MP3 packet, header missing!');\n return;\n }\n\n let le = this._littleEndian;\n let array = new Uint8Array(arrayBuffer, dataOffset, dataSize);\n let result = null;\n\n if (requestHeader) {\n if (array[0] !== 0xFF) {\n return;\n }\n let ver = (array[1] >>> 3) & 0x03;\n let layer = (array[1] & 0x06) >> 1;\n\n let bitrate_index = (array[2] & 0xF0) >>> 4;\n let sampling_freq_index = (array[2] & 0x0C) >>> 2;\n\n let channel_mode = (array[3] >>> 6) & 0x03;\n let channel_count = channel_mode !== 3 ? 2 : 1;\n\n let sample_rate = 0;\n let bit_rate = 0;\n let object_type = 34; // Layer-3, listed in MPEG-4 Audio Object Types\n\n let codec = 'mp3';\n\n switch (ver) {\n case 0: // MPEG 2.5\n sample_rate = this._mpegAudioV25SampleRateTable[sampling_freq_index];\n break;\n case 2: // MPEG 2\n sample_rate = this._mpegAudioV20SampleRateTable[sampling_freq_index];\n break;\n case 3: // MPEG 1\n sample_rate = this._mpegAudioV10SampleRateTable[sampling_freq_index];\n break;\n }\n\n switch (layer) {\n case 1: // Layer 3\n object_type = 34;\n if (bitrate_index < this._mpegAudioL3BitRateTable.length) {\n bit_rate = this._mpegAudioL3BitRateTable[bitrate_index];\n }\n break;\n case 2: // Layer 2\n object_type = 33;\n if (bitrate_index < this._mpegAudioL2BitRateTable.length) {\n bit_rate = this._mpegAudioL2BitRateTable[bitrate_index];\n }\n break;\n case 3: // Layer 1\n object_type = 32;\n if (bitrate_index < this._mpegAudioL1BitRateTable.length) {\n bit_rate = this._mpegAudioL1BitRateTable[bitrate_index];\n }\n break;\n }\n\n result = {\n bitRate: bit_rate,\n samplingRate: sample_rate,\n channelCount: channel_count,\n codec: codec,\n originalCodec: codec\n };\n } else {\n result = array;\n }\n\n return result;\n }\n\n _parseVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition) {\n if (dataSize <= 1) {\n Log.w(this.TAG, 'Flv: Invalid video packet, missing VideoData payload!');\n return;\n }\n\n if (this._hasVideoFlagOverrided === true && this._hasVideo === false) {\n // If hasVideo: false indicated explicitly in MediaDataSource,\n // Ignore all the video packets\n return;\n }\n\n let spec = (new Uint8Array(arrayBuffer, dataOffset, dataSize))[0];\n\n let frameType = (spec & 240) >>> 4;\n let codecId = spec & 15;\n\n if (codecId !== 7) {\n this._onError(DemuxErrors.CODEC_UNSUPPORTED, `Flv: Unsupported codec in video frame: ${codecId}`);\n return;\n }\n\n this._parseAVCVideoPacket(arrayBuffer, dataOffset + 1, dataSize - 1, tagTimestamp, tagPosition, frameType);\n }\n\n _parseAVCVideoPacket(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType) {\n if (dataSize < 4) {\n Log.w(this.TAG, 'Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime');\n return;\n }\n\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let packetType = v.getUint8(0);\n let cts_unsigned = v.getUint32(0, !le) & 0x00FFFFFF;\n let cts = (cts_unsigned << 8) >> 8; // convert to 24-bit signed int\n\n if (packetType === 0) { // AVCDecoderConfigurationRecord\n this._parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset + 4, dataSize - 4);\n } else if (packetType === 1) { // One or more Nalus\n this._parseAVCVideoData(arrayBuffer, dataOffset + 4, dataSize - 4, tagTimestamp, tagPosition, frameType, cts);\n } else if (packetType === 2) {\n // empty, AVC end of sequence\n } else {\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Invalid video packet type ${packetType}`);\n return;\n }\n }\n\n _parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset, dataSize) {\n if (dataSize < 7) {\n Log.w(this.TAG, 'Flv: Invalid AVCDecoderConfigurationRecord, lack of data!');\n return;\n }\n\n let meta = this._videoMetadata;\n let track = this._videoTrack;\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n if (!meta) {\n if (this._hasVideo === false && this._hasVideoFlagOverrided === false) {\n this._hasVideo = true;\n this._mediaInfo.hasVideo = true;\n }\n\n meta = this._videoMetadata = {};\n meta.type = 'video';\n meta.id = track.id;\n meta.timescale = this._timescale;\n meta.duration = this._duration;\n } else {\n if (typeof meta.avcc !== 'undefined') {\n Log.w(this.TAG, 'Found another AVCDecoderConfigurationRecord!');\n }\n }\n\n let version = v.getUint8(0); // configurationVersion\n let avcProfile = v.getUint8(1); // avcProfileIndication\n let profileCompatibility = v.getUint8(2); // profile_compatibility\n let avcLevel = v.getUint8(3); // AVCLevelIndication\n\n if (version !== 1 || avcProfile === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord');\n return;\n }\n\n this._naluLengthSize = (v.getUint8(4) & 3) + 1; // lengthSizeMinusOne\n if (this._naluLengthSize !== 3 && this._naluLengthSize !== 4) { // holy shit!!!\n this._onError(DemuxErrors.FORMAT_ERROR, `Flv: Strange NaluLengthSizeMinusOne: ${this._naluLengthSize - 1}`);\n return;\n }\n\n let spsCount = v.getUint8(5) & 31; // numOfSequenceParameterSets\n if (spsCount === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No SPS');\n return;\n } else if (spsCount > 1) {\n Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: SPS Count = ${spsCount}`);\n }\n\n let offset = 6;\n\n for (let i = 0; i < spsCount; i++) {\n let len = v.getUint16(offset, !le); // sequenceParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // Notice: Nalu without startcode header (00 00 00 01)\n let sps = new Uint8Array(arrayBuffer, dataOffset + offset, len);\n offset += len;\n\n let config = SPSParser.parseSPS(sps);\n if (i !== 0) {\n // ignore other sps's config\n continue;\n }\n\n meta.codecWidth = config.codec_size.width;\n meta.codecHeight = config.codec_size.height;\n meta.presentWidth = config.present_size.width;\n meta.presentHeight = config.present_size.height;\n\n meta.profile = config.profile_string;\n meta.level = config.level_string;\n meta.bitDepth = config.bit_depth;\n meta.chromaFormat = config.chroma_format;\n meta.sarRatio = config.sar_ratio;\n meta.frameRate = config.frame_rate;\n\n if (config.frame_rate.fixed === false ||\n config.frame_rate.fps_num === 0 ||\n config.frame_rate.fps_den === 0) {\n meta.frameRate = this._referenceFrameRate;\n }\n\n let fps_den = meta.frameRate.fps_den;\n let fps_num = meta.frameRate.fps_num;\n meta.refSampleDuration = meta.timescale * (fps_den / fps_num);\n\n let codecArray = sps.subarray(1, 4);\n let codecString = 'avc1.';\n for (let j = 0; j < 3; j++) {\n let h = codecArray[j].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n codecString += h;\n }\n meta.codec = codecString;\n\n let mi = this._mediaInfo;\n mi.width = meta.codecWidth;\n mi.height = meta.codecHeight;\n mi.fps = meta.frameRate.fps;\n mi.profile = meta.profile;\n mi.level = meta.level;\n mi.refFrames = config.ref_frames;\n mi.chromaFormat = config.chroma_format_string;\n mi.sarNum = meta.sarRatio.width;\n mi.sarDen = meta.sarRatio.height;\n mi.videoCodec = codecString;\n\n if (mi.hasAudio) {\n if (mi.audioCodec != null) {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + ',' + mi.audioCodec + '\"';\n }\n } else {\n mi.mimeType = 'video/x-flv; codecs=\"' + mi.videoCodec + '\"';\n }\n if (mi.isComplete()) {\n this._onMediaInfo(mi);\n }\n }\n\n let ppsCount = v.getUint8(offset); // numOfPictureParameterSets\n if (ppsCount === 0) {\n this._onError(DemuxErrors.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No PPS');\n return;\n } else if (ppsCount > 1) {\n Log.w(this.TAG, `Flv: Strange AVCDecoderConfigurationRecord: PPS Count = ${ppsCount}`);\n }\n\n offset++;\n\n for (let i = 0; i < ppsCount; i++) {\n let len = v.getUint16(offset, !le); // pictureParameterSetLength\n offset += 2;\n\n if (len === 0) {\n continue;\n }\n\n // pps is useless for extracting video information\n offset += len;\n }\n\n meta.avcc = new Uint8Array(dataSize);\n meta.avcc.set(new Uint8Array(arrayBuffer, dataOffset, dataSize), 0);\n Log.v(this.TAG, 'Parsed AVCDecoderConfigurationRecord');\n\n if (this._isInitialMetadataDispatched()) {\n // flush parsed frames\n if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {\n this._onDataAvailable(this._audioTrack, this._videoTrack);\n }\n } else {\n this._videoInitialMetadataDispatched = true;\n }\n // notify new metadata\n this._dispatch = false;\n this._onTrackMetadata('video', meta);\n }\n\n _parseAVCVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, cts) {\n let le = this._littleEndian;\n let v = new DataView(arrayBuffer, dataOffset, dataSize);\n\n let units = [], length = 0;\n\n let offset = 0;\n const lengthSize = this._naluLengthSize;\n let dts = this._timestampBase + tagTimestamp;\n let keyframe = (frameType === 1); // from FLV Frame Type constants\n\n while (offset < dataSize) {\n if (offset + 4 >= dataSize) {\n Log.w(this.TAG, `Malformed Nalu near timestamp ${dts}, offset = ${offset}, dataSize = ${dataSize}`);\n break; // data not enough for next Nalu\n }\n // Nalu with length-header (AVC1)\n let naluSize = v.getUint32(offset, !le); // Big-Endian read\n if (lengthSize === 3) {\n naluSize >>>= 8;\n }\n if (naluSize > dataSize - lengthSize) {\n Log.w(this.TAG, `Malformed Nalus near timestamp ${dts}, NaluSize > DataSize!`);\n return;\n }\n\n let unitType = v.getUint8(offset + lengthSize) & 0x1F;\n\n if (unitType === 5) { // IDR\n keyframe = true;\n }\n\n let data = new Uint8Array(arrayBuffer, dataOffset + offset, lengthSize + naluSize);\n let unit = {type: unitType, data: data};\n units.push(unit);\n length += data.byteLength;\n\n offset += lengthSize + naluSize;\n }\n\n if (units.length) {\n let track = this._videoTrack;\n let avcSample = {\n units: units,\n length: length,\n isKeyframe: keyframe,\n dts: dts,\n cts: cts,\n pts: (dts + cts)\n };\n if (keyframe) {\n avcSample.fileposition = tagPosition;\n }\n track.samples.push(avcSample);\n track.length += length;\n }\n }\n\n}\n\nexport default FLVDemuxer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ExpGolomb from './exp-golomb.js';\n\nclass SPSParser {\n\n static _ebsp2rbsp(uint8array) {\n let src = uint8array;\n let src_length = src.byteLength;\n let dst = new Uint8Array(src_length);\n let dst_idx = 0;\n\n for (let i = 0; i < src_length; i++) {\n if (i >= 2) {\n // Unescape: Skip 0x03 after 00 00\n if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {\n continue;\n }\n }\n dst[dst_idx] = src[i];\n dst_idx++;\n }\n\n return new Uint8Array(dst.buffer, 0, dst_idx);\n }\n\n static parseSPS(uint8array) {\n let rbsp = SPSParser._ebsp2rbsp(uint8array);\n let gb = new ExpGolomb(rbsp);\n\n gb.readByte();\n let profile_idc = gb.readByte(); // profile_idc\n gb.readByte(); // constraint_set_flags[5] + reserved_zero[3]\n let level_idc = gb.readByte(); // level_idc\n gb.readUEG(); // seq_parameter_set_id\n\n let profile_string = SPSParser.getProfileString(profile_idc);\n let level_string = SPSParser.getLevelString(level_idc);\n let chroma_format_idc = 1;\n let chroma_format = 420;\n let chroma_format_table = [0, 420, 422, 444];\n let bit_depth = 8;\n\n if (profile_idc === 100 || profile_idc === 110 || profile_idc === 122 ||\n profile_idc === 244 || profile_idc === 44 || profile_idc === 83 ||\n profile_idc === 86 || profile_idc === 118 || profile_idc === 128 ||\n profile_idc === 138 || profile_idc === 144) {\n\n chroma_format_idc = gb.readUEG();\n if (chroma_format_idc === 3) {\n gb.readBits(1); // separate_colour_plane_flag\n }\n if (chroma_format_idc <= 3) {\n chroma_format = chroma_format_table[chroma_format_idc];\n }\n\n bit_depth = gb.readUEG() + 8; // bit_depth_luma_minus8\n gb.readUEG(); // bit_depth_chroma_minus8\n gb.readBits(1); // qpprime_y_zero_transform_bypass_flag\n if (gb.readBool()) { // seq_scaling_matrix_present_flag\n let scaling_list_count = (chroma_format_idc !== 3) ? 8 : 12;\n for (let i = 0; i < scaling_list_count; i++) {\n if (gb.readBool()) { // seq_scaling_list_present_flag\n if (i < 6) {\n SPSParser._skipScalingList(gb, 16);\n } else {\n SPSParser._skipScalingList(gb, 64);\n }\n }\n }\n }\n }\n gb.readUEG(); // log2_max_frame_num_minus4\n let pic_order_cnt_type = gb.readUEG();\n if (pic_order_cnt_type === 0) {\n gb.readUEG(); // log2_max_pic_order_cnt_lsb_minus_4\n } else if (pic_order_cnt_type === 1) {\n gb.readBits(1); // delta_pic_order_always_zero_flag\n gb.readSEG(); // offset_for_non_ref_pic\n gb.readSEG(); // offset_for_top_to_bottom_field\n let num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG();\n for (let i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++) {\n gb.readSEG(); // offset_for_ref_frame\n }\n }\n let ref_frames = gb.readUEG(); // max_num_ref_frames\n gb.readBits(1); // gaps_in_frame_num_value_allowed_flag\n\n let pic_width_in_mbs_minus1 = gb.readUEG();\n let pic_height_in_map_units_minus1 = gb.readUEG();\n\n let frame_mbs_only_flag = gb.readBits(1);\n if (frame_mbs_only_flag === 0) {\n gb.readBits(1); // mb_adaptive_frame_field_flag\n }\n gb.readBits(1); // direct_8x8_inference_flag\n\n let frame_crop_left_offset = 0;\n let frame_crop_right_offset = 0;\n let frame_crop_top_offset = 0;\n let frame_crop_bottom_offset = 0;\n\n let frame_cropping_flag = gb.readBool();\n if (frame_cropping_flag) {\n frame_crop_left_offset = gb.readUEG();\n frame_crop_right_offset = gb.readUEG();\n frame_crop_top_offset = gb.readUEG();\n frame_crop_bottom_offset = gb.readUEG();\n }\n\n let sar_width = 1, sar_height = 1;\n let fps = 0, fps_fixed = true, fps_num = 0, fps_den = 0;\n\n let vui_parameters_present_flag = gb.readBool();\n if (vui_parameters_present_flag) {\n if (gb.readBool()) { // aspect_ratio_info_present_flag\n let aspect_ratio_idc = gb.readByte();\n let sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];\n let sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n\n if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {\n sar_width = sar_w_table[aspect_ratio_idc - 1];\n sar_height = sar_h_table[aspect_ratio_idc - 1];\n } else if (aspect_ratio_idc === 255) {\n sar_width = gb.readByte() << 8 | gb.readByte();\n sar_height = gb.readByte() << 8 | gb.readByte();\n }\n }\n\n if (gb.readBool()) { // overscan_info_present_flag\n gb.readBool(); // overscan_appropriate_flag\n }\n if (gb.readBool()) { // video_signal_type_present_flag\n gb.readBits(4); // video_format & video_full_range_flag\n if (gb.readBool()) { // colour_description_present_flag\n gb.readBits(24); // colour_primaries & transfer_characteristics & matrix_coefficients\n }\n }\n if (gb.readBool()) { // chroma_loc_info_present_flag\n gb.readUEG(); // chroma_sample_loc_type_top_field\n gb.readUEG(); // chroma_sample_loc_type_bottom_field\n }\n if (gb.readBool()) { // timing_info_present_flag\n let num_units_in_tick = gb.readBits(32);\n let time_scale = gb.readBits(32);\n fps_fixed = gb.readBool(); // fixed_frame_rate_flag\n\n fps_num = time_scale;\n fps_den = num_units_in_tick * 2;\n fps = fps_num / fps_den;\n }\n }\n\n let sarScale = 1;\n if (sar_width !== 1 || sar_height !== 1) {\n sarScale = sar_width / sar_height;\n }\n\n let crop_unit_x = 0, crop_unit_y = 0;\n if (chroma_format_idc === 0) {\n crop_unit_x = 1;\n crop_unit_y = 2 - frame_mbs_only_flag;\n } else {\n let sub_wc = (chroma_format_idc === 3) ? 1 : 2;\n let sub_hc = (chroma_format_idc === 1) ? 2 : 1;\n crop_unit_x = sub_wc;\n crop_unit_y = sub_hc * (2 - frame_mbs_only_flag);\n }\n\n let codec_width = (pic_width_in_mbs_minus1 + 1) * 16;\n let codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16);\n\n codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x;\n codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y;\n\n let present_width = Math.ceil(codec_width * sarScale);\n\n gb.destroy();\n gb = null;\n\n return {\n profile_string: profile_string, // baseline, high, high10, ...\n level_string: level_string, // 3, 3.1, 4, 4.1, 5, 5.1, ...\n bit_depth: bit_depth, // 8bit, 10bit, ...\n ref_frames: ref_frames,\n chroma_format: chroma_format, // 4:2:0, 4:2:2, ...\n chroma_format_string: SPSParser.getChromaFormatString(chroma_format),\n\n frame_rate: {\n fixed: fps_fixed,\n fps: fps,\n fps_den: fps_den,\n fps_num: fps_num\n },\n\n sar_ratio: {\n width: sar_width,\n height: sar_height\n },\n\n codec_size: {\n width: codec_width,\n height: codec_height\n },\n\n present_size: {\n width: present_width,\n height: codec_height\n }\n };\n }\n\n static _skipScalingList(gb, count) {\n let last_scale = 8, next_scale = 8;\n let delta_scale = 0;\n for (let i = 0; i < count; i++) {\n if (next_scale !== 0) {\n delta_scale = gb.readSEG();\n next_scale = (last_scale + delta_scale + 256) % 256;\n }\n last_scale = (next_scale === 0) ? last_scale : next_scale;\n }\n }\n\n static getProfileString(profile_idc) {\n switch (profile_idc) {\n case 66:\n return 'Baseline';\n case 77:\n return 'Main';\n case 88:\n return 'Extended';\n case 100:\n return 'High';\n case 110:\n return 'High10';\n case 122:\n return 'High422';\n case 244:\n return 'High444';\n default:\n return 'Unknown';\n }\n }\n\n static getLevelString(level_idc) {\n return (level_idc / 10).toFixed(1);\n }\n\n static getChromaFormatString(chroma) {\n switch (chroma) {\n case 420:\n return '4:2:0';\n case 422:\n return '4:2:2';\n case 444:\n return '4:4:4';\n default:\n return 'Unknown';\n }\n }\n\n}\n\nexport default SPSParser;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Polyfill from './utils/polyfill.js';\nimport Features from './core/features.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './io/loader.js';\nimport FlvPlayer from './player/flv-player.js';\nimport NativePlayer from './player/native-player.js';\nimport PlayerEvents from './player/player-events.js';\nimport {ErrorTypes, ErrorDetails} from './player/player-errors.js';\nimport LoggingControl from './utils/logging-control.js';\nimport {InvalidArgumentException} from './utils/exception.js';\n\n// here are all the interfaces\n\n// install polyfills\nPolyfill.install();\n\n\n// factory method\nfunction createPlayer(mediaDataSource, optionalConfig) {\n let mds = mediaDataSource;\n if (mds == null || typeof mds !== 'object') {\n throw new InvalidArgumentException('MediaDataSource must be an javascript object!');\n }\n\n if (!mds.hasOwnProperty('type')) {\n throw new InvalidArgumentException('MediaDataSource must has type field to indicate video file type!');\n }\n\n switch (mds.type) {\n case 'flv':\n return new FlvPlayer(mds, optionalConfig);\n default:\n return new NativePlayer(mds, optionalConfig);\n }\n}\n\n\n// feature detection\nfunction isSupported() {\n return Features.supportMSEH264Playback();\n}\n\nfunction getFeatureList() {\n return Features.getFeatureList();\n}\n\n\n// interfaces\nlet flvjs = {};\n\nflvjs.createPlayer = createPlayer;\nflvjs.isSupported = isSupported;\nflvjs.getFeatureList = getFeatureList;\n\nflvjs.BaseLoader = BaseLoader;\nflvjs.LoaderStatus = LoaderStatus;\nflvjs.LoaderErrors = LoaderErrors;\n\nflvjs.Events = PlayerEvents;\nflvjs.ErrorTypes = ErrorTypes;\nflvjs.ErrorDetails = ErrorDetails;\n\nflvjs.FlvPlayer = FlvPlayer;\nflvjs.NativePlayer = NativePlayer;\nflvjs.LoggingControl = LoggingControl;\n\nObject.defineProperty(flvjs, 'version', {\n enumerable: true,\n get: function () {\n // replaced by browserify-versionify transform\n return '__VERSION__';\n }\n});\n\nexport default flvjs;","// entry/index file\n\n// make it compatible with browserify's umd wrapper\nmodule.exports = require('./flv.js').default;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n/* fetch + stream IO loader. Currently working on chrome 43+.\n * fetch provides a better alternative http API to XMLHttpRequest\n *\n * fetch spec https://fetch.spec.whatwg.org/\n * stream spec https://streams.spec.whatwg.org/\n */\nclass FetchStreamLoader extends BaseLoader {\n\n static isSupported() {\n try {\n // fetch + stream is broken on Microsoft Edge. Disable before build 15048.\n // see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8196907/\n // Fixed in Jan 10, 2017. Build 15048+ removed from blacklist.\n let isWorkWellEdge = Browser.msedge && Browser.version.minor >= 15048;\n let browserNotBlacklisted = Browser.msedge ? isWorkWellEdge : true;\n return (self.fetch && self.ReadableStream && browserNotBlacklisted);\n } catch (e) {\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('fetch-stream-loader');\n this.TAG = 'FetchStreamLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._requestAbort = false;\n this._contentLength = null;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n\n let headers = new self.Headers();\n\n if (typeof seekConfig.headers === 'object') {\n let configHeaders = seekConfig.headers;\n for (let key in configHeaders) {\n if (configHeaders.hasOwnProperty(key)) {\n headers.append(key, configHeaders[key]);\n }\n }\n }\n\n let params = {\n method: 'GET',\n headers: headers,\n mode: 'cors',\n cache: 'default',\n // The default policy of Fetch API in the whatwg standard\n // Safari incorrectly indicates 'no-referrer' as default policy, fuck it\n referrerPolicy: 'no-referrer-when-downgrade'\n };\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n for (let key in this._config.headers) {\n headers.append(key, this._config.headers[key]);\n }\n }\n\n // cors is enabled by default\n if (dataSource.cors === false) {\n // no-cors means 'disregard cors policy', which can only be used in ServiceWorker\n params.mode = 'same-origin';\n }\n\n // withCredentials is disabled by default\n if (dataSource.withCredentials) {\n params.credentials = 'include';\n }\n\n // referrerPolicy from config\n if (dataSource.referrerPolicy) {\n params.referrerPolicy = dataSource.referrerPolicy;\n }\n\n this._status = LoaderStatus.kConnecting;\n self.fetch(seekConfig.url, params).then((res) => {\n if (this._requestAbort) {\n this._requestAbort = false;\n this._status = LoaderStatus.kIdle;\n return;\n }\n if (res.ok && (res.status >= 200 && res.status <= 299)) {\n if (res.url !== seekConfig.url) {\n if (this._onURLRedirect) {\n let redirectedURL = this._seekHandler.removeURLParameters(res.url);\n this._onURLRedirect(redirectedURL);\n }\n }\n\n let lengthHeader = res.headers.get('Content-Length');\n if (lengthHeader != null) {\n this._contentLength = parseInt(lengthHeader);\n if (this._contentLength !== 0) {\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n\n return this._pump.call(this, res.body.getReader());\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: res.status, msg: res.statusText});\n } else {\n throw new RuntimeException('FetchStreamLoader: Http code invalid, ' + res.status + ' ' + res.statusText);\n }\n }\n }).catch((e) => {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, {code: -1, msg: e.message});\n } else {\n throw e;\n }\n });\n }\n\n abort() {\n this._requestAbort = true;\n }\n\n _pump(reader) { // ReadableStreamReader\n return reader.read().then((result) => {\n if (result.done) {\n // First check received length\n if (this._contentLength !== null && this._receivedLength < this._contentLength) {\n // Report Early-EOF\n this._status = LoaderStatus.kError;\n let type = LoaderErrors.EARLY_EOF;\n let info = {code: -1, msg: 'Fetch stream meet Early-EOF'};\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n } else {\n // OK. Download complete\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n } else {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n this._status = LoaderStatus.kComplete;\n return reader.cancel();\n }\n\n this._status = LoaderStatus.kBuffering;\n\n let chunk = result.value.buffer;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n\n this._pump(reader);\n }\n }).catch((e) => {\n if (e.code === 11 && Browser.msedge) { // InvalidStateError on Microsoft Edge\n // Workaround: Edge may throw InvalidStateError after ReadableStreamReader.cancel() call\n // Ignore the unknown exception.\n // Related issue: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11265202/\n return;\n }\n\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if ((e.code === 19 || e.message === 'network error') && // NETWORK_ERR\n (this._contentLength === null ||\n (this._contentLength !== null && this._receivedLength < this._contentLength))) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: e.code, msg: 'Fetch stream meet Early-EOF'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: e.code, msg: e.message};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n });\n }\n\n}\n\nexport default FetchStreamLoader;\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport SpeedSampler from './speed-sampler.js';\nimport {LoaderStatus, LoaderErrors} from './loader.js';\nimport FetchStreamLoader from './fetch-stream-loader.js';\nimport MozChunkedLoader from './xhr-moz-chunked-loader.js';\nimport MSStreamLoader from './xhr-msstream-loader.js';\nimport RangeLoader from './xhr-range-loader.js';\nimport WebSocketLoader from './websocket-loader.js';\nimport RangeSeekHandler from './range-seek-handler.js';\nimport ParamSeekHandler from './param-seek-handler.js';\nimport {RuntimeException, IllegalStateException, InvalidArgumentException} from '../utils/exception.js';\n\n/**\n * DataSource: {\n * url: string,\n * filesize: number,\n * cors: boolean,\n * withCredentials: boolean\n * }\n * \n */\n\n// Manage IO Loaders\nclass IOController {\n\n constructor(dataSource, config, extraData) {\n this.TAG = 'IOController';\n\n this._config = config;\n this._extraData = extraData;\n\n this._stashInitialSize = 1024 * 384; // default initial size: 384KB\n if (config.stashInitialSize != undefined && config.stashInitialSize > 0) {\n // apply from config\n this._stashInitialSize = config.stashInitialSize;\n }\n\n this._stashUsed = 0;\n this._stashSize = this._stashInitialSize;\n this._bufferSize = 1024 * 1024 * 3; // initial size: 3MB\n this._stashBuffer = new ArrayBuffer(this._bufferSize);\n this._stashByteStart = 0;\n this._enableStash = true;\n if (config.enableStashBuffer === false) {\n this._enableStash = false;\n }\n\n this._loader = null;\n this._loaderClass = null;\n this._seekHandler = null;\n\n this._dataSource = dataSource;\n this._isWebSocketURL = /wss?:\\/\\/(.+?)/.test(dataSource.url);\n this._refTotalLength = dataSource.filesize ? dataSource.filesize : null;\n this._totalLength = this._refTotalLength;\n this._fullRequestFlag = false;\n this._currentRange = null;\n this._redirectedURL = null;\n\n this._speedNormalized = 0;\n this._speedSampler = new SpeedSampler();\n this._speedNormalizeList = [64, 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096];\n\n this._isEarlyEofReconnecting = false;\n\n this._paused = false;\n this._resumeFrom = 0;\n\n this._onDataArrival = null;\n this._onSeeked = null;\n this._onError = null;\n this._onComplete = null;\n this._onRedirect = null;\n this._onRecoveredEarlyEof = null;\n\n this._selectSeekHandler();\n this._selectLoader();\n this._createLoader();\n }\n\n destroy() {\n if (this._loader.isWorking()) {\n this._loader.abort();\n }\n this._loader.destroy();\n this._loader = null;\n this._loaderClass = null;\n this._dataSource = null;\n this._stashBuffer = null;\n this._stashUsed = this._stashSize = this._bufferSize = this._stashByteStart = 0;\n this._currentRange = null;\n this._speedSampler = null;\n\n this._isEarlyEofReconnecting = false;\n\n this._onDataArrival = null;\n this._onSeeked = null;\n this._onError = null;\n this._onComplete = null;\n this._onRedirect = null;\n this._onRecoveredEarlyEof = null;\n\n this._extraData = null;\n }\n\n isWorking() {\n return this._loader && this._loader.isWorking() && !this._paused;\n }\n\n isPaused() {\n return this._paused;\n }\n\n get status() {\n return this._loader.status;\n }\n\n get extraData() {\n return this._extraData;\n }\n\n set extraData(data) {\n this._extraData = data;\n }\n\n // prototype: function onDataArrival(chunks: ArrayBuffer, byteStart: number): number\n get onDataArrival() {\n return this._onDataArrival;\n }\n\n set onDataArrival(callback) {\n this._onDataArrival = callback;\n }\n\n get onSeeked() {\n return this._onSeeked;\n }\n\n set onSeeked(callback) {\n this._onSeeked = callback;\n }\n\n // prototype: function onError(type: number, info: {code: number, msg: string}): void\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n get onComplete() {\n return this._onComplete;\n }\n\n set onComplete(callback) {\n this._onComplete = callback;\n }\n\n get onRedirect() {\n return this._onRedirect;\n }\n\n set onRedirect(callback) {\n this._onRedirect = callback;\n }\n\n get onRecoveredEarlyEof() {\n return this._onRecoveredEarlyEof;\n }\n\n set onRecoveredEarlyEof(callback) {\n this._onRecoveredEarlyEof = callback;\n }\n\n get currentURL() {\n return this._dataSource.url;\n }\n\n get hasRedirect() {\n return (this._redirectedURL != null || this._dataSource.redirectedURL != undefined);\n }\n\n get currentRedirectedURL() {\n return this._redirectedURL || this._dataSource.redirectedURL;\n }\n\n // in KB/s\n get currentSpeed() {\n if (this._loaderClass === RangeLoader) {\n // SpeedSampler is inaccuracy if loader is RangeLoader\n return this._loader.currentSpeed;\n }\n return this._speedSampler.lastSecondKBps;\n }\n\n get loaderType() {\n return this._loader.type;\n }\n\n _selectSeekHandler() {\n let config = this._config;\n\n if (config.seekType === 'range') {\n this._seekHandler = new RangeSeekHandler(this._config.rangeLoadZeroStart);\n } else if (config.seekType === 'param') {\n let paramStart = config.seekParamStart || 'bstart';\n let paramEnd = config.seekParamEnd || 'bend';\n\n this._seekHandler = new ParamSeekHandler(paramStart, paramEnd);\n } else if (config.seekType === 'custom') {\n if (typeof config.customSeekHandler !== 'function') {\n throw new InvalidArgumentException('Custom seekType specified in config but invalid customSeekHandler!');\n }\n this._seekHandler = new config.customSeekHandler();\n } else {\n throw new InvalidArgumentException(`Invalid seekType in config: ${config.seekType}`);\n }\n }\n\n _selectLoader() {\n if (this._config.customLoader != null) {\n this._loaderClass = this._config.customLoader;\n } else if (this._isWebSocketURL) {\n this._loaderClass = WebSocketLoader;\n } else if (FetchStreamLoader.isSupported()) {\n this._loaderClass = FetchStreamLoader;\n } else if (MozChunkedLoader.isSupported()) {\n this._loaderClass = MozChunkedLoader;\n } else if (RangeLoader.isSupported()) {\n this._loaderClass = RangeLoader;\n } else {\n throw new RuntimeException('Your browser doesn\\'t support xhr with arraybuffer responseType!');\n }\n }\n\n _createLoader() {\n this._loader = new this._loaderClass(this._seekHandler, this._config);\n if (this._loader.needStashBuffer === false) {\n this._enableStash = false;\n }\n this._loader.onContentLengthKnown = this._onContentLengthKnown.bind(this);\n this._loader.onURLRedirect = this._onURLRedirect.bind(this);\n this._loader.onDataArrival = this._onLoaderChunkArrival.bind(this);\n this._loader.onComplete = this._onLoaderComplete.bind(this);\n this._loader.onError = this._onLoaderError.bind(this);\n }\n\n open(optionalFrom) {\n this._currentRange = {from: 0, to: -1};\n if (optionalFrom) {\n this._currentRange.from = optionalFrom;\n }\n\n this._speedSampler.reset();\n if (!optionalFrom) {\n this._fullRequestFlag = true;\n }\n\n this._loader.open(this._dataSource, Object.assign({}, this._currentRange));\n }\n\n abort() {\n this._loader.abort();\n\n if (this._paused) {\n this._paused = false;\n this._resumeFrom = 0;\n }\n }\n\n pause() {\n if (this.isWorking()) {\n this._loader.abort();\n\n if (this._stashUsed !== 0) {\n this._resumeFrom = this._stashByteStart;\n this._currentRange.to = this._stashByteStart - 1;\n } else {\n this._resumeFrom = this._currentRange.to + 1;\n }\n this._stashUsed = 0;\n this._stashByteStart = 0;\n this._paused = true;\n }\n }\n\n resume() {\n if (this._paused) {\n this._paused = false;\n let bytes = this._resumeFrom;\n this._resumeFrom = 0;\n this._internalSeek(bytes, true);\n }\n }\n\n seek(bytes) {\n this._paused = false;\n this._stashUsed = 0;\n this._stashByteStart = 0;\n this._internalSeek(bytes, true);\n }\n\n /**\n * When seeking request is from media seeking, unconsumed stash data should be dropped\n * However, stash data shouldn't be dropped if seeking requested from http reconnection\n *\n * @dropUnconsumed: Ignore and discard all unconsumed data in stash buffer\n */\n _internalSeek(bytes, dropUnconsumed) {\n if (this._loader.isWorking()) {\n this._loader.abort();\n }\n\n // dispatch & flush stash buffer before seek\n this._flushStashBuffer(dropUnconsumed);\n\n this._loader.destroy();\n this._loader = null;\n\n let requestRange = {from: bytes, to: -1};\n this._currentRange = {from: requestRange.from, to: -1};\n\n this._speedSampler.reset();\n this._stashSize = this._stashInitialSize;\n this._createLoader();\n this._loader.open(this._dataSource, requestRange);\n\n if (this._onSeeked) {\n this._onSeeked();\n }\n }\n\n updateUrl(url) {\n if (!url || typeof url !== 'string' || url.length === 0) {\n throw new InvalidArgumentException('Url must be a non-empty string!');\n }\n\n this._dataSource.url = url;\n\n // TODO: replace with new url\n }\n\n _expandBuffer(expectedBytes) {\n let bufferNewSize = this._stashSize;\n while (bufferNewSize + 1024 * 1024 * 1 < expectedBytes) {\n bufferNewSize *= 2;\n }\n\n bufferNewSize += 1024 * 1024 * 1; // bufferSize = stashSize + 1MB\n if (bufferNewSize === this._bufferSize) {\n return;\n }\n\n let newBuffer = new ArrayBuffer(bufferNewSize);\n\n if (this._stashUsed > 0) { // copy existing data into new buffer\n let stashOldArray = new Uint8Array(this._stashBuffer, 0, this._stashUsed);\n let stashNewArray = new Uint8Array(newBuffer, 0, bufferNewSize);\n stashNewArray.set(stashOldArray, 0);\n }\n\n this._stashBuffer = newBuffer;\n this._bufferSize = bufferNewSize;\n }\n\n _normalizeSpeed(input) {\n let list = this._speedNormalizeList;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (input < list[0]) {\n return list[0];\n }\n\n // binary search\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (input >= list[mid] && input < list[mid + 1])) {\n return list[mid];\n } else if (list[mid] < input) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n }\n\n _adjustStashSize(normalized) {\n let stashSizeKB = 0;\n\n if (this._config.isLive) {\n // live stream: always use single normalized speed for size of stashSizeKB\n stashSizeKB = normalized;\n } else {\n if (normalized < 512) {\n stashSizeKB = normalized;\n } else if (normalized >= 512 && normalized <= 1024) {\n stashSizeKB = Math.floor(normalized * 1.5);\n } else {\n stashSizeKB = normalized * 2;\n }\n }\n\n if (stashSizeKB > 8192) {\n stashSizeKB = 8192;\n }\n\n let bufferSize = stashSizeKB * 1024 + 1024 * 1024 * 1; // stashSize + 1MB\n if (this._bufferSize < bufferSize) {\n this._expandBuffer(bufferSize);\n }\n this._stashSize = stashSizeKB * 1024;\n }\n\n _dispatchChunks(chunks, byteStart) {\n this._currentRange.to = byteStart + chunks.byteLength - 1;\n return this._onDataArrival(chunks, byteStart);\n }\n\n _onURLRedirect(redirectedURL) {\n this._redirectedURL = redirectedURL;\n if (this._onRedirect) {\n this._onRedirect(redirectedURL);\n }\n }\n\n _onContentLengthKnown(contentLength) {\n if (contentLength && this._fullRequestFlag) {\n this._totalLength = contentLength;\n this._fullRequestFlag = false;\n }\n }\n\n _onLoaderChunkArrival(chunk, byteStart, receivedLength) {\n if (!this._onDataArrival) {\n throw new IllegalStateException('IOController: No existing consumer (onDataArrival) callback!');\n }\n if (this._paused) {\n return;\n }\n if (this._isEarlyEofReconnecting) {\n // Auto-reconnect for EarlyEof succeed, notify to upper-layer by callback\n this._isEarlyEofReconnecting = false;\n if (this._onRecoveredEarlyEof) {\n this._onRecoveredEarlyEof();\n }\n }\n\n this._speedSampler.addBytes(chunk.byteLength);\n\n // adjust stash buffer size according to network speed dynamically\n let KBps = this._speedSampler.lastSecondKBps;\n if (KBps !== 0) {\n let normalized = this._normalizeSpeed(KBps);\n if (this._speedNormalized !== normalized) {\n this._speedNormalized = normalized;\n this._adjustStashSize(normalized);\n }\n }\n\n if (!this._enableStash) { // disable stash\n if (this._stashUsed === 0) {\n // dispatch chunk directly to consumer;\n // check ret value (consumed bytes) and stash unconsumed to stashBuffer\n let consumed = this._dispatchChunks(chunk, byteStart);\n if (consumed < chunk.byteLength) { // unconsumed data remain.\n let remain = chunk.byteLength - consumed;\n if (remain > this._bufferSize) {\n this._expandBuffer(remain);\n }\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n stashArray.set(new Uint8Array(chunk, consumed), 0);\n this._stashUsed += remain;\n this._stashByteStart = byteStart + consumed;\n }\n } else {\n // else: Merge chunk into stashBuffer, and dispatch stashBuffer to consumer.\n if (this._stashUsed + chunk.byteLength > this._bufferSize) {\n this._expandBuffer(this._stashUsed + chunk.byteLength);\n }\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n let consumed = this._dispatchChunks(this._stashBuffer.slice(0, this._stashUsed), this._stashByteStart);\n if (consumed < this._stashUsed && consumed > 0) { // unconsumed data remain\n let remainArray = new Uint8Array(this._stashBuffer, consumed);\n stashArray.set(remainArray, 0);\n }\n this._stashUsed -= consumed;\n this._stashByteStart += consumed;\n }\n } else { // enable stash\n if (this._stashUsed === 0 && this._stashByteStart === 0) { // seeked? or init chunk?\n // This is the first chunk after seek action\n this._stashByteStart = byteStart;\n }\n if (this._stashUsed + chunk.byteLength <= this._stashSize) {\n // just stash\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._stashSize);\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n } else { // stashUsed + chunkSize > stashSize, size limit exceeded\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n if (this._stashUsed > 0) { // There're stash datas in buffer\n // dispatch the whole stashBuffer, and stash remain data\n // then append chunk to stashBuffer (stash)\n let buffer = this._stashBuffer.slice(0, this._stashUsed);\n let consumed = this._dispatchChunks(buffer, this._stashByteStart);\n if (consumed < buffer.byteLength) {\n if (consumed > 0) {\n let remainArray = new Uint8Array(buffer, consumed);\n stashArray.set(remainArray, 0);\n this._stashUsed = remainArray.byteLength;\n this._stashByteStart += consumed;\n }\n } else {\n this._stashUsed = 0;\n this._stashByteStart += consumed;\n }\n if (this._stashUsed + chunk.byteLength > this._bufferSize) {\n this._expandBuffer(this._stashUsed + chunk.byteLength);\n stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n }\n stashArray.set(new Uint8Array(chunk), this._stashUsed);\n this._stashUsed += chunk.byteLength;\n } else { // stash buffer empty, but chunkSize > stashSize (oh, holy shit)\n // dispatch chunk directly and stash remain data\n let consumed = this._dispatchChunks(chunk, byteStart);\n if (consumed < chunk.byteLength) {\n let remain = chunk.byteLength - consumed;\n if (remain > this._bufferSize) {\n this._expandBuffer(remain);\n stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n }\n stashArray.set(new Uint8Array(chunk, consumed), 0);\n this._stashUsed += remain;\n this._stashByteStart = byteStart + consumed;\n }\n }\n }\n }\n }\n\n _flushStashBuffer(dropUnconsumed) {\n if (this._stashUsed > 0) {\n let buffer = this._stashBuffer.slice(0, this._stashUsed);\n let consumed = this._dispatchChunks(buffer, this._stashByteStart);\n let remain = buffer.byteLength - consumed;\n\n if (consumed < buffer.byteLength) {\n if (dropUnconsumed) {\n Log.w(this.TAG, `${remain} bytes unconsumed data remain when flush buffer, dropped`);\n } else {\n if (consumed > 0) {\n let stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);\n let remainArray = new Uint8Array(buffer, consumed);\n stashArray.set(remainArray, 0);\n this._stashUsed = remainArray.byteLength;\n this._stashByteStart += consumed;\n }\n return 0;\n }\n }\n this._stashUsed = 0;\n this._stashByteStart = 0;\n return remain;\n }\n return 0;\n }\n\n _onLoaderComplete(from, to) {\n // Force-flush stash buffer, and drop unconsumed data\n this._flushStashBuffer(true);\n\n if (this._onComplete) {\n this._onComplete(this._extraData);\n }\n }\n\n _onLoaderError(type, data) {\n Log.e(this.TAG, `Loader error, code = ${data.code}, msg = ${data.msg}`);\n\n this._flushStashBuffer(false);\n\n if (this._isEarlyEofReconnecting) {\n // Auto-reconnect for EarlyEof failed, throw UnrecoverableEarlyEof error to upper-layer\n this._isEarlyEofReconnecting = false;\n type = LoaderErrors.UNRECOVERABLE_EARLY_EOF;\n }\n\n switch (type) {\n case LoaderErrors.EARLY_EOF: {\n if (!this._config.isLive) {\n // Do internal http reconnect if not live stream\n if (this._totalLength) {\n let nextFrom = this._currentRange.to + 1;\n if (nextFrom < this._totalLength) {\n Log.w(this.TAG, 'Connection lost, trying reconnect...');\n this._isEarlyEofReconnecting = true;\n this._internalSeek(nextFrom, false);\n }\n return;\n }\n // else: We don't know totalLength, throw UnrecoverableEarlyEof\n }\n // live stream: throw UnrecoverableEarlyEof error to upper-layer\n type = LoaderErrors.UNRECOVERABLE_EARLY_EOF;\n break;\n }\n case LoaderErrors.UNRECOVERABLE_EARLY_EOF:\n case LoaderErrors.CONNECTING_TIMEOUT:\n case LoaderErrors.HTTP_STATUS_CODE_INVALID:\n case LoaderErrors.EXCEPTION:\n break;\n }\n\n if (this._onError) {\n this._onError(type, data);\n } else {\n throw new RuntimeException('IOException: ' + data.msg);\n }\n }\n\n}\n\nexport default IOController;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {NotImplementedException} from '../utils/exception.js';\n\nexport const LoaderStatus = {\n kIdle: 0,\n kConnecting: 1,\n kBuffering: 2,\n kError: 3,\n kComplete: 4\n};\n\nexport const LoaderErrors = {\n OK: 'OK',\n EXCEPTION: 'Exception',\n HTTP_STATUS_CODE_INVALID: 'HttpStatusCodeInvalid',\n CONNECTING_TIMEOUT: 'ConnectingTimeout',\n EARLY_EOF: 'EarlyEof',\n UNRECOVERABLE_EARLY_EOF: 'UnrecoverableEarlyEof'\n};\n\n/* Loader has callbacks which have following prototypes:\n * function onContentLengthKnown(contentLength: number): void\n * function onURLRedirect(url: string): void\n * function onDataArrival(chunk: ArrayBuffer, byteStart: number, receivedLength: number): void\n * function onError(errorType: number, errorInfo: {code: number, msg: string}): void\n * function onComplete(rangeFrom: number, rangeTo: number): void\n */\nexport class BaseLoader {\n\n constructor(typeName) {\n this._type = typeName || 'undefined';\n this._status = LoaderStatus.kIdle;\n this._needStash = false;\n // callbacks\n this._onContentLengthKnown = null;\n this._onURLRedirect = null;\n this._onDataArrival = null;\n this._onError = null;\n this._onComplete = null;\n }\n\n destroy() {\n this._status = LoaderStatus.kIdle;\n this._onContentLengthKnown = null;\n this._onURLRedirect = null;\n this._onDataArrival = null;\n this._onError = null;\n this._onComplete = null;\n }\n\n isWorking() {\n return this._status === LoaderStatus.kConnecting || this._status === LoaderStatus.kBuffering;\n }\n\n get type() {\n return this._type;\n }\n\n get status() {\n return this._status;\n }\n\n get needStashBuffer() {\n return this._needStash;\n }\n\n get onContentLengthKnown() {\n return this._onContentLengthKnown;\n }\n\n set onContentLengthKnown(callback) {\n this._onContentLengthKnown = callback;\n }\n\n get onURLRedirect() {\n return this._onURLRedirect;\n }\n\n set onURLRedirect(callback) {\n this._onURLRedirect = callback;\n }\n\n get onDataArrival() {\n return this._onDataArrival;\n }\n\n set onDataArrival(callback) {\n this._onDataArrival = callback;\n }\n\n get onError() {\n return this._onError;\n }\n\n set onError(callback) {\n this._onError = callback;\n }\n\n get onComplete() {\n return this._onComplete;\n }\n\n set onComplete(callback) {\n this._onComplete = callback;\n }\n\n // pure virtual\n open(dataSource, range) {\n throw new NotImplementedException('Unimplemented abstract function!');\n }\n\n abort() {\n throw new NotImplementedException('Unimplemented abstract function!');\n }\n\n\n}","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass ParamSeekHandler {\n\n constructor(paramStart, paramEnd) {\n this._startName = paramStart;\n this._endName = paramEnd;\n }\n\n getConfig(baseUrl, range) {\n let url = baseUrl;\n\n if (range.from !== 0 || range.to !== -1) {\n let needAnd = true;\n if (url.indexOf('?') === -1) {\n url += '?';\n needAnd = false;\n }\n\n if (needAnd) {\n url += '&';\n }\n\n url += `${this._startName}=${range.from.toString()}`;\n\n if (range.to !== -1) {\n url += `&${this._endName}=${range.to.toString()}`;\n }\n }\n\n return {\n url: url,\n headers: {}\n };\n }\n\n removeURLParameters(seekedURL) {\n let baseURL = seekedURL.split('?')[0];\n let params = undefined;\n\n let queryIndex = seekedURL.indexOf('?');\n if (queryIndex !== -1) {\n params = seekedURL.substring(queryIndex + 1);\n }\n\n let resultParams = '';\n\n if (params != undefined && params.length > 0) {\n let pairs = params.split('&');\n\n for (let i = 0; i < pairs.length; i++) {\n let pair = pairs[i].split('=');\n let requireAnd = (i > 0);\n\n if (pair[0] !== this._startName && pair[0] !== this._endName) {\n if (requireAnd) {\n resultParams += '&';\n }\n resultParams += pairs[i];\n }\n }\n }\n\n return (resultParams.length === 0) ? baseURL : baseURL + '?' + resultParams;\n }\n\n}\n\nexport default ParamSeekHandler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass RangeSeekHandler {\n\n constructor(zeroStart) {\n this._zeroStart = zeroStart || false;\n }\n\n getConfig(url, range) {\n let headers = {};\n\n if (range.from !== 0 || range.to !== -1) {\n let param;\n if (range.to !== -1) {\n param = `bytes=${range.from.toString()}-${range.to.toString()}`;\n } else {\n param = `bytes=${range.from.toString()}-`;\n }\n headers['Range'] = param;\n } else if (this._zeroStart) {\n headers['Range'] = 'bytes=0-';\n }\n\n return {\n url: url,\n headers: headers\n };\n }\n\n removeURLParameters(seekedURL) {\n return seekedURL;\n }\n\n}\n\nexport default RangeSeekHandler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// Utility class to calculate realtime network I/O speed\nclass SpeedSampler {\n\n constructor() {\n // milliseconds\n this._firstCheckpoint = 0;\n this._lastCheckpoint = 0;\n this._intervalBytes = 0;\n this._totalBytes = 0;\n this._lastSecondBytes = 0;\n\n // compatibility detection\n if (self.performance && self.performance.now) {\n this._now = self.performance.now.bind(self.performance);\n } else {\n this._now = Date.now;\n }\n }\n\n reset() {\n this._firstCheckpoint = this._lastCheckpoint = 0;\n this._totalBytes = this._intervalBytes = 0;\n this._lastSecondBytes = 0;\n }\n\n addBytes(bytes) {\n if (this._firstCheckpoint === 0) {\n this._firstCheckpoint = this._now();\n this._lastCheckpoint = this._firstCheckpoint;\n this._intervalBytes += bytes;\n this._totalBytes += bytes;\n } else if (this._now() - this._lastCheckpoint < 1000) {\n this._intervalBytes += bytes;\n this._totalBytes += bytes;\n } else { // duration >= 1000\n this._lastSecondBytes = this._intervalBytes;\n this._intervalBytes = bytes;\n this._totalBytes += bytes;\n this._lastCheckpoint = this._now();\n }\n }\n\n get currentKBps() {\n this.addBytes(0);\n\n let durationSeconds = (this._now() - this._lastCheckpoint) / 1000;\n if (durationSeconds == 0) durationSeconds = 1;\n return (this._intervalBytes / durationSeconds) / 1024;\n }\n\n get lastSecondKBps() {\n this.addBytes(0);\n\n if (this._lastSecondBytes !== 0) {\n return this._lastSecondBytes / 1024;\n } else { // lastSecondBytes === 0\n if (this._now() - this._lastCheckpoint >= 500) {\n // if time interval since last checkpoint has exceeded 500ms\n // the speed is nearly accurate\n return this.currentKBps;\n } else {\n // We don't know\n return 0;\n }\n }\n }\n\n get averageKBps() {\n let durationSeconds = (this._now() - this._firstCheckpoint) / 1000;\n return (this._totalBytes / durationSeconds) / 1024;\n }\n\n}\n\nexport default SpeedSampler;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// For FLV over WebSocket live stream\nclass WebSocketLoader extends BaseLoader {\n\n static isSupported() {\n try {\n return (typeof self.WebSocket !== 'undefined');\n } catch (e) {\n return false;\n }\n }\n\n constructor() {\n super('websocket-loader');\n this.TAG = 'WebSocketLoader';\n\n this._needStash = true;\n\n this._ws = null;\n this._requestAbort = false;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this._ws) {\n this.abort();\n }\n super.destroy();\n }\n\n open(dataSource) {\n try {\n let ws = this._ws = new self.WebSocket(dataSource.url);\n ws.binaryType = 'arraybuffer';\n ws.onopen = this._onWebSocketOpen.bind(this);\n ws.onclose = this._onWebSocketClose.bind(this);\n ws.onmessage = this._onWebSocketMessage.bind(this);\n ws.onerror = this._onWebSocketError.bind(this);\n\n this._status = LoaderStatus.kConnecting;\n } catch (e) {\n this._status = LoaderStatus.kError;\n\n let info = {code: e.code, msg: e.message};\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n }\n\n abort() {\n let ws = this._ws;\n if (ws && (ws.readyState === 0 || ws.readyState === 1)) { // CONNECTING || OPEN\n this._requestAbort = true;\n ws.close();\n }\n\n this._ws = null;\n this._status = LoaderStatus.kComplete;\n }\n\n _onWebSocketOpen(e) {\n this._status = LoaderStatus.kBuffering;\n }\n\n _onWebSocketClose(e) {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n return;\n }\n\n this._status = LoaderStatus.kComplete;\n\n if (this._onComplete) {\n this._onComplete(0, this._receivedLength - 1);\n }\n }\n\n _onWebSocketMessage(e) {\n if (e.data instanceof ArrayBuffer) {\n this._dispatchArrayBuffer(e.data);\n } else if (e.data instanceof Blob) {\n let reader = new FileReader();\n reader.onload = () => {\n this._dispatchArrayBuffer(reader.result);\n };\n reader.readAsArrayBuffer(e.data);\n } else {\n this._status = LoaderStatus.kError;\n let info = {code: -1, msg: 'Unsupported WebSocket message type: ' + e.data.constructor.name};\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n }\n\n _dispatchArrayBuffer(arraybuffer) {\n let chunk = arraybuffer;\n let byteStart = this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n }\n\n _onWebSocketError(e) {\n this._status = LoaderStatus.kError;\n\n let info = {\n code: e.code,\n msg: e.message\n };\n\n if (this._onError) {\n this._onError(LoaderErrors.EXCEPTION, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default WebSocketLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// For FireFox browser which supports `xhr.responseType = 'moz-chunked-arraybuffer'`\nclass MozChunkedLoader extends BaseLoader {\n\n static isSupported() {\n try {\n let xhr = new XMLHttpRequest();\n // Firefox 37- requires .open() to be called before setting responseType\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'moz-chunked-arraybuffer';\n return (xhr.responseType === 'moz-chunked-arraybuffer');\n } catch (e) {\n Log.w('MozChunkedLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-moz-chunked-loader');\n this.TAG = 'MozChunkedLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._xhr = null;\n this._requestAbort = false;\n this._contentLength = null;\n this._receivedLength = 0;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onloadend = null;\n this._xhr.onerror = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._requestURL = seekConfig.url;\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'moz-chunked-arraybuffer';\n xhr.onreadystatechange = this._onReadyStateChange.bind(this);\n xhr.onprogress = this._onProgress.bind(this);\n xhr.onloadend = this._onLoadEnd.bind(this);\n xhr.onerror = this._onXhrError.bind(this);\n\n // cors is auto detected and enabled by xhr\n\n // withCredentials is disabled by default\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n let headers = this._config.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n this._status = LoaderStatus.kConnecting;\n xhr.send();\n }\n\n abort() {\n this._requestAbort = true;\n if (this._xhr) {\n this._xhr.abort();\n }\n this._status = LoaderStatus.kComplete;\n }\n\n _onReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.responseURL != undefined && xhr.responseURL !== this._requestURL) {\n if (this._onURLRedirect) {\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n this._onURLRedirect(redirectedURL);\n }\n }\n\n if (xhr.status !== 0 && (xhr.status < 200 || xhr.status > 299)) {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('MozChunkedLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n } else {\n this._status = LoaderStatus.kBuffering;\n }\n }\n }\n\n _onProgress(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._contentLength === null) {\n if (e.total !== null && e.total !== 0) {\n this._contentLength = e.total;\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n\n let chunk = e.target.response;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n }\n\n _onLoadEnd(e) {\n if (this._requestAbort === true) {\n this._requestAbort = false;\n return;\n } else if (this._status === LoaderStatus.kError) {\n return;\n }\n\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n\n _onXhrError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && e.loaded < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'Moz-Chunked stream meet Early-Eof'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default MozChunkedLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n/* Notice: ms-stream may cause IE/Edge browser crash if seek too frequently!!!\n * The browser may crash in wininet.dll. Disable for now.\n *\n * For IE11/Edge browser by microsoft which supports `xhr.responseType = 'ms-stream'`\n * Notice that ms-stream API sucks. The buffer is always expanding along with downloading.\n *\n * We need to abort the xhr if buffer size exceeded limit size (e.g. 16 MiB), then do reconnect.\n * in order to release previous ArrayBuffer to avoid memory leak\n *\n * Otherwise, the ArrayBuffer will increase to a terrible size that equals final file size.\n */\nclass MSStreamLoader extends BaseLoader {\n\n static isSupported() {\n try {\n if (typeof self.MSStream === 'undefined' || typeof self.MSStreamReader === 'undefined') {\n return false;\n }\n\n let xhr = new XMLHttpRequest();\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'ms-stream';\n return (xhr.responseType === 'ms-stream');\n } catch (e) {\n Log.w('MSStreamLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-msstream-loader');\n this.TAG = 'MSStreamLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = true;\n\n this._xhr = null;\n this._reader = null; // MSStreamReader\n\n this._totalRange = null;\n this._currentRange = null;\n\n this._currentRequestURL = null;\n this._currentRedirectedURL = null;\n\n this._contentLength = null;\n this._receivedLength = 0;\n\n this._bufferLimit = 16 * 1024 * 1024; // 16MB\n this._lastTimeBufferSize = 0;\n this._isReconnecting = false;\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._reader) {\n this._reader.onprogress = null;\n this._reader.onload = null;\n this._reader.onerror = null;\n this._reader = null;\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n open(dataSource, range) {\n this._internalOpen(dataSource, range, false);\n }\n\n _internalOpen(dataSource, range, isSubrange) {\n this._dataSource = dataSource;\n\n if (!isSubrange) {\n this._totalRange = range;\n } else {\n this._currentRange = range;\n }\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL) {\n if (this._currentRedirectedURL != undefined) {\n sourceURL = this._currentRedirectedURL;\n } else if (dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._currentRequestURL = seekConfig.url;\n\n let reader = this._reader = new self.MSStreamReader();\n reader.onprogress = this._msrOnProgress.bind(this);\n reader.onload = this._msrOnLoad.bind(this);\n reader.onerror = this._msrOnError.bind(this);\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'ms-stream';\n xhr.onreadystatechange = this._xhrOnReadyStateChange.bind(this);\n xhr.onerror = this._xhrOnError.bind(this);\n\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n let headers = this._config.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n if (this._isReconnecting) {\n this._isReconnecting = false;\n } else {\n this._status = LoaderStatus.kConnecting;\n }\n xhr.send();\n }\n\n abort() {\n this._internalAbort();\n this._status = LoaderStatus.kComplete;\n }\n\n _internalAbort() {\n if (this._reader) {\n if (this._reader.readyState === 1) { // LOADING\n this._reader.abort();\n }\n this._reader.onprogress = null;\n this._reader.onload = null;\n this._reader.onerror = null;\n this._reader = null;\n }\n if (this._xhr) {\n this._xhr.abort();\n this._xhr.onreadystatechange = null;\n this._xhr = null;\n }\n }\n\n _xhrOnReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.status >= 200 && xhr.status <= 299) {\n this._status = LoaderStatus.kBuffering;\n\n if (xhr.responseURL != undefined) {\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n if (xhr.responseURL !== this._currentRequestURL && redirectedURL !== this._currentRedirectedURL) {\n this._currentRedirectedURL = redirectedURL;\n if (this._onURLRedirect) {\n this._onURLRedirect(redirectedURL);\n }\n }\n }\n\n let lengthHeader = xhr.getResponseHeader('Content-Length');\n if (lengthHeader != null && this._contentLength == null) {\n let length = parseInt(lengthHeader);\n if (length > 0) {\n this._contentLength = length;\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n }\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('MSStreamLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n }\n } else if (xhr.readyState === 3) { // LOADING\n if (xhr.status >= 200 && xhr.status <= 299) {\n this._status = LoaderStatus.kBuffering;\n\n let msstream = xhr.response;\n this._reader.readAsArrayBuffer(msstream);\n }\n }\n }\n\n _xhrOnError(e) {\n this._status = LoaderStatus.kError;\n let type = LoaderErrors.EXCEPTION;\n let info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n _msrOnProgress(e) {\n let reader = e.target;\n let bigbuffer = reader.result;\n if (bigbuffer == null) { // result may be null, workaround for buggy M$\n this._doReconnectIfNeeded();\n return;\n }\n\n let slice = bigbuffer.slice(this._lastTimeBufferSize);\n this._lastTimeBufferSize = bigbuffer.byteLength;\n let byteStart = this._totalRange.from + this._receivedLength;\n this._receivedLength += slice.byteLength;\n\n if (this._onDataArrival) {\n this._onDataArrival(slice, byteStart, this._receivedLength);\n }\n\n if (bigbuffer.byteLength >= this._bufferLimit) {\n Log.v(this.TAG, `MSStream buffer exceeded max size near ${byteStart + slice.byteLength}, reconnecting...`);\n this._doReconnectIfNeeded();\n }\n }\n\n _doReconnectIfNeeded() {\n if (this._contentLength == null || this._receivedLength < this._contentLength) {\n this._isReconnecting = true;\n this._lastTimeBufferSize = 0;\n this._internalAbort();\n\n let range = {\n from: this._totalRange.from + this._receivedLength,\n to: -1\n };\n this._internalOpen(this._dataSource, range, true);\n }\n }\n\n _msrOnLoad(e) { // actually it is onComplete event\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._totalRange.from, this._totalRange.from + this._receivedLength - 1);\n }\n }\n\n _msrOnError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && this._receivedLength < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'MSStream meet Early-Eof'};\n } else {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n}\n\nexport default MSStreamLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport SpeedSampler from './speed-sampler.js';\nimport {BaseLoader, LoaderStatus, LoaderErrors} from './loader.js';\nimport {RuntimeException} from '../utils/exception.js';\n\n// Universal IO Loader, implemented by adding Range header in xhr's request header\nclass RangeLoader extends BaseLoader {\n\n static isSupported() {\n try {\n let xhr = new XMLHttpRequest();\n xhr.open('GET', 'https://example.com', true);\n xhr.responseType = 'arraybuffer';\n return (xhr.responseType === 'arraybuffer');\n } catch (e) {\n Log.w('RangeLoader', e.message);\n return false;\n }\n }\n\n constructor(seekHandler, config) {\n super('xhr-range-loader');\n this.TAG = 'RangeLoader';\n\n this._seekHandler = seekHandler;\n this._config = config;\n this._needStash = false;\n\n this._chunkSizeKBList = [\n 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192\n ];\n this._currentChunkSizeKB = 384;\n this._currentSpeedNormalized = 0;\n this._zeroSpeedChunkCount = 0;\n\n this._xhr = null;\n this._speedSampler = new SpeedSampler();\n\n this._requestAbort = false;\n this._waitForTotalLength = false;\n this._totalLengthReceived = false;\n\n this._currentRequestURL = null;\n this._currentRedirectedURL = null;\n this._currentRequestRange = null;\n this._totalLength = null; // size of the entire file\n this._contentLength = null; // Content-Length of entire request range\n this._receivedLength = 0; // total received bytes\n this._lastTimeLoaded = 0; // received bytes of current request sub-range\n }\n\n destroy() {\n if (this.isWorking()) {\n this.abort();\n }\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onload = null;\n this._xhr.onerror = null;\n this._xhr = null;\n }\n super.destroy();\n }\n\n get currentSpeed() {\n return this._speedSampler.lastSecondKBps;\n }\n\n open(dataSource, range) {\n this._dataSource = dataSource;\n this._range = range;\n this._status = LoaderStatus.kConnecting;\n\n let useRefTotalLength = false;\n if (this._dataSource.filesize != undefined && this._dataSource.filesize !== 0) {\n useRefTotalLength = true;\n this._totalLength = this._dataSource.filesize;\n }\n\n if (!this._totalLengthReceived && !useRefTotalLength) {\n // We need total filesize\n this._waitForTotalLength = true;\n this._internalOpen(this._dataSource, {from: 0, to: -1});\n } else {\n // We have filesize, start loading\n this._openSubRange();\n }\n }\n\n _openSubRange() {\n let chunkSize = this._currentChunkSizeKB * 1024;\n\n let from = this._range.from + this._receivedLength;\n let to = from + chunkSize;\n\n if (this._contentLength != null) {\n if (to - this._range.from >= this._contentLength) {\n to = this._range.from + this._contentLength - 1;\n }\n }\n\n this._currentRequestRange = {from, to};\n this._internalOpen(this._dataSource, this._currentRequestRange);\n }\n\n _internalOpen(dataSource, range) {\n this._lastTimeLoaded = 0;\n\n let sourceURL = dataSource.url;\n if (this._config.reuseRedirectedURL) {\n if (this._currentRedirectedURL != undefined) {\n sourceURL = this._currentRedirectedURL;\n } else if (dataSource.redirectedURL != undefined) {\n sourceURL = dataSource.redirectedURL;\n }\n }\n\n let seekConfig = this._seekHandler.getConfig(sourceURL, range);\n this._currentRequestURL = seekConfig.url;\n\n let xhr = this._xhr = new XMLHttpRequest();\n xhr.open('GET', seekConfig.url, true);\n xhr.responseType = 'arraybuffer';\n xhr.onreadystatechange = this._onReadyStateChange.bind(this);\n xhr.onprogress = this._onProgress.bind(this);\n xhr.onload = this._onLoad.bind(this);\n xhr.onerror = this._onXhrError.bind(this);\n\n if (dataSource.withCredentials) {\n xhr.withCredentials = true;\n }\n\n if (typeof seekConfig.headers === 'object') {\n let headers = seekConfig.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n // add additional headers\n if (typeof this._config.headers === 'object') {\n let headers = this._config.headers;\n\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n xhr.send();\n }\n\n abort() {\n this._requestAbort = true;\n this._internalAbort();\n this._status = LoaderStatus.kComplete;\n }\n\n _internalAbort() {\n if (this._xhr) {\n this._xhr.onreadystatechange = null;\n this._xhr.onprogress = null;\n this._xhr.onload = null;\n this._xhr.onerror = null;\n this._xhr.abort();\n this._xhr = null;\n }\n }\n\n _onReadyStateChange(e) {\n let xhr = e.target;\n\n if (xhr.readyState === 2) { // HEADERS_RECEIVED\n if (xhr.responseURL != undefined) { // if the browser support this property\n let redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);\n if (xhr.responseURL !== this._currentRequestURL && redirectedURL !== this._currentRedirectedURL) {\n this._currentRedirectedURL = redirectedURL;\n if (this._onURLRedirect) {\n this._onURLRedirect(redirectedURL);\n }\n }\n }\n\n if ((xhr.status >= 200 && xhr.status <= 299)) {\n if (this._waitForTotalLength) {\n return;\n }\n this._status = LoaderStatus.kBuffering;\n } else {\n this._status = LoaderStatus.kError;\n if (this._onError) {\n this._onError(LoaderErrors.HTTP_STATUS_CODE_INVALID, {code: xhr.status, msg: xhr.statusText});\n } else {\n throw new RuntimeException('RangeLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);\n }\n }\n }\n }\n\n _onProgress(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._contentLength === null) {\n let openNextRange = false;\n\n if (this._waitForTotalLength) {\n this._waitForTotalLength = false;\n this._totalLengthReceived = true;\n openNextRange = true;\n\n let total = e.total;\n this._internalAbort();\n if (total != null & total !== 0) {\n this._totalLength = total;\n }\n }\n\n // calculate currrent request range's contentLength\n if (this._range.to === -1) {\n this._contentLength = this._totalLength - this._range.from;\n } else { // to !== -1\n this._contentLength = this._range.to - this._range.from + 1;\n }\n\n if (openNextRange) {\n this._openSubRange();\n return;\n }\n if (this._onContentLengthKnown) {\n this._onContentLengthKnown(this._contentLength);\n }\n }\n\n let delta = e.loaded - this._lastTimeLoaded;\n this._lastTimeLoaded = e.loaded;\n this._speedSampler.addBytes(delta);\n }\n\n _normalizeSpeed(input) {\n let list = this._chunkSizeKBList;\n let last = list.length - 1;\n let mid = 0;\n let lbound = 0;\n let ubound = last;\n\n if (input < list[0]) {\n return list[0];\n }\n\n while (lbound <= ubound) {\n mid = lbound + Math.floor((ubound - lbound) / 2);\n if (mid === last || (input >= list[mid] && input < list[mid + 1])) {\n return list[mid];\n } else if (list[mid] < input) {\n lbound = mid + 1;\n } else {\n ubound = mid - 1;\n }\n }\n }\n\n _onLoad(e) {\n if (this._status === LoaderStatus.kError) {\n // Ignore error response\n return;\n }\n\n if (this._waitForTotalLength) {\n this._waitForTotalLength = false;\n return;\n }\n\n this._lastTimeLoaded = 0;\n let KBps = this._speedSampler.lastSecondKBps;\n if (KBps === 0) {\n this._zeroSpeedChunkCount++;\n if (this._zeroSpeedChunkCount >= 3) {\n // Try get currentKBps after 3 chunks\n KBps = this._speedSampler.currentKBps;\n }\n }\n\n if (KBps !== 0) {\n let normalized = this._normalizeSpeed(KBps);\n if (this._currentSpeedNormalized !== normalized) {\n this._currentSpeedNormalized = normalized;\n this._currentChunkSizeKB = normalized;\n }\n }\n\n let chunk = e.target.response;\n let byteStart = this._range.from + this._receivedLength;\n this._receivedLength += chunk.byteLength;\n\n let reportComplete = false;\n\n if (this._contentLength != null && this._receivedLength < this._contentLength) {\n // continue load next chunk\n this._openSubRange();\n } else {\n reportComplete = true;\n }\n\n // dispatch received chunk\n if (this._onDataArrival) {\n this._onDataArrival(chunk, byteStart, this._receivedLength);\n }\n\n if (reportComplete) {\n this._status = LoaderStatus.kComplete;\n if (this._onComplete) {\n this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);\n }\n }\n }\n\n _onXhrError(e) {\n this._status = LoaderStatus.kError;\n let type = 0;\n let info = null;\n\n if (this._contentLength && this._receivedLength > 0\n && this._receivedLength < this._contentLength) {\n type = LoaderErrors.EARLY_EOF;\n info = {code: -1, msg: 'RangeLoader meet Early-Eof'};\n } else {\n type = LoaderErrors.EXCEPTION;\n info = {code: -1, msg: e.constructor.name + ' ' + e.type};\n }\n\n if (this._onError) {\n this._onError(type, info);\n } else {\n throw new RuntimeException(info.msg);\n }\n }\n\n}\n\nexport default RangeLoader;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from '../utils/logger.js';\nimport Browser from '../utils/browser.js';\nimport PlayerEvents from './player-events.js';\nimport Transmuxer from '../core/transmuxer.js';\nimport TransmuxingEvents from '../core/transmuxing-events.js';\nimport MSEController from '../core/mse-controller.js';\nimport MSEEvents from '../core/mse-events.js';\nimport {ErrorTypes, ErrorDetails} from './player-errors.js';\nimport {createDefaultConfig} from '../config.js';\nimport {InvalidArgumentException, IllegalStateException} from '../utils/exception.js';\n\nclass FlvPlayer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'FlvPlayer';\n this._type = 'FlvPlayer';\n this._emitter = new EventEmitter();\n\n this._config = createDefaultConfig();\n if (typeof config === 'object') {\n Object.assign(this._config, config);\n }\n\n if (mediaDataSource.type.toLowerCase() !== 'flv') {\n throw new InvalidArgumentException('FlvPlayer requires an flv MediaDataSource input!');\n }\n\n if (mediaDataSource.isLive === true) {\n this._config.isLive = true;\n }\n\n this.e = {\n onvLoadedMetadata: this._onvLoadedMetadata.bind(this),\n onvSeeking: this._onvSeeking.bind(this),\n onvCanPlay: this._onvCanPlay.bind(this),\n onvStalled: this._onvStalled.bind(this),\n onvProgress: this._onvProgress.bind(this)\n };\n\n if (self.performance && self.performance.now) {\n this._now = self.performance.now.bind(self.performance);\n } else {\n this._now = Date.now;\n }\n\n this._pendingSeekTime = null; // in seconds\n this._requestSetTime = false;\n this._seekpointRecord = null;\n this._progressChecker = null;\n\n this._mediaDataSource = mediaDataSource;\n this._mediaElement = null;\n this._msectl = null;\n this._transmuxer = null;\n\n this._mseSourceOpened = false;\n this._hasPendingLoad = false;\n this._receivedCanPlay = false;\n\n this._mediaInfo = null;\n this._statisticsInfo = null;\n\n let chromeNeedIDRFix = (Browser.chrome &&\n (Browser.version.major < 50 ||\n (Browser.version.major === 50 && Browser.version.build < 2661)));\n this._alwaysSeekKeyframe = (chromeNeedIDRFix || Browser.msedge || Browser.msie) ? true : false;\n\n if (this._alwaysSeekKeyframe) {\n this._config.accurateSeek = false;\n }\n }\n\n destroy() {\n if (this._progressChecker != null) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n }\n if (this._transmuxer) {\n this.unload();\n }\n if (this._mediaElement) {\n this.detachMediaElement();\n }\n this.e = null;\n this._mediaDataSource = null;\n\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n if (event === PlayerEvents.MEDIA_INFO) {\n if (this._mediaInfo != null) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n });\n }\n } else if (event === PlayerEvents.STATISTICS_INFO) {\n if (this._statisticsInfo != null) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n });\n }\n }\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n this._mediaElement = mediaElement;\n mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n mediaElement.addEventListener('seeking', this.e.onvSeeking);\n mediaElement.addEventListener('canplay', this.e.onvCanPlay);\n mediaElement.addEventListener('stalled', this.e.onvStalled);\n mediaElement.addEventListener('progress', this.e.onvProgress);\n\n this._msectl = new MSEController(this._config);\n\n this._msectl.on(MSEEvents.UPDATE_END, this._onmseUpdateEnd.bind(this));\n this._msectl.on(MSEEvents.BUFFER_FULL, this._onmseBufferFull.bind(this));\n this._msectl.on(MSEEvents.SOURCE_OPEN, () => {\n this._mseSourceOpened = true;\n if (this._hasPendingLoad) {\n this._hasPendingLoad = false;\n this.load();\n }\n });\n this._msectl.on(MSEEvents.ERROR, (info) => {\n this._emitter.emit(PlayerEvents.ERROR,\n ErrorTypes.MEDIA_ERROR,\n ErrorDetails.MEDIA_MSE_ERROR,\n info\n );\n });\n\n this._msectl.attachMediaElement(mediaElement);\n\n if (this._pendingSeekTime != null) {\n try {\n mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n } catch (e) {\n // IE11 may throw InvalidStateError if readyState === 0\n // We can defer set currentTime operation after loadedmetadata\n }\n }\n }\n\n detachMediaElement() {\n if (this._mediaElement) {\n this._msectl.detachMediaElement();\n this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n this._mediaElement.removeEventListener('seeking', this.e.onvSeeking);\n this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);\n this._mediaElement.removeEventListener('stalled', this.e.onvStalled);\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n this._mediaElement = null;\n }\n if (this._msectl) {\n this._msectl.destroy();\n this._msectl = null;\n }\n }\n\n load() {\n if (!this._mediaElement) {\n throw new IllegalStateException('HTMLMediaElement must be attached before load()!');\n }\n if (this._transmuxer) {\n throw new IllegalStateException('FlvPlayer.load() has been called, please call unload() first!');\n }\n if (this._hasPendingLoad) {\n return;\n }\n\n if (this._config.deferLoadAfterSourceOpen && this._mseSourceOpened === false) {\n this._hasPendingLoad = true;\n return;\n }\n\n if (this._mediaElement.readyState > 0) {\n this._requestSetTime = true;\n // IE11 may throw InvalidStateError if readyState === 0\n this._mediaElement.currentTime = 0;\n }\n\n this._transmuxer = new Transmuxer(this._mediaDataSource, this._config);\n\n this._transmuxer.on(TransmuxingEvents.INIT_SEGMENT, (type, is) => {\n this._msectl.appendInitSegment(is);\n });\n this._transmuxer.on(TransmuxingEvents.MEDIA_SEGMENT, (type, ms) => {\n this._msectl.appendMediaSegment(ms);\n\n // lazyLoad check\n if (this._config.lazyLoad && !this._config.isLive) {\n let currentTime = this._mediaElement.currentTime;\n if (ms.info.endDts >= (currentTime + this._config.lazyLoadMaxDuration) * 1000) {\n if (this._progressChecker == null) {\n Log.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');\n this._suspendTransmuxer();\n }\n }\n }\n });\n this._transmuxer.on(TransmuxingEvents.LOADING_COMPLETE, () => {\n this._msectl.endOfStream();\n this._emitter.emit(PlayerEvents.LOADING_COMPLETE);\n });\n this._transmuxer.on(TransmuxingEvents.RECOVERED_EARLY_EOF, () => {\n this._emitter.emit(PlayerEvents.RECOVERED_EARLY_EOF);\n });\n this._transmuxer.on(TransmuxingEvents.IO_ERROR, (detail, info) => {\n this._emitter.emit(PlayerEvents.ERROR, ErrorTypes.NETWORK_ERROR, detail, info);\n });\n this._transmuxer.on(TransmuxingEvents.DEMUX_ERROR, (detail, info) => {\n this._emitter.emit(PlayerEvents.ERROR, ErrorTypes.MEDIA_ERROR, detail, {code: -1, msg: info});\n });\n this._transmuxer.on(TransmuxingEvents.MEDIA_INFO, (mediaInfo) => {\n this._mediaInfo = mediaInfo;\n this._emitter.emit(PlayerEvents.MEDIA_INFO, Object.assign({}, mediaInfo));\n });\n this._transmuxer.on(TransmuxingEvents.METADATA_ARRIVED, (metadata) => {\n this._emitter.emit(PlayerEvents.METADATA_ARRIVED, metadata);\n });\n this._transmuxer.on(TransmuxingEvents.SCRIPTDATA_ARRIVED, (data) => {\n this._emitter.emit(PlayerEvents.SCRIPTDATA_ARRIVED, data);\n });\n this._transmuxer.on(TransmuxingEvents.STATISTICS_INFO, (statInfo) => {\n this._statisticsInfo = this._fillStatisticsInfo(statInfo);\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, Object.assign({}, this._statisticsInfo));\n });\n this._transmuxer.on(TransmuxingEvents.RECOMMEND_SEEKPOINT, (milliseconds) => {\n if (this._mediaElement && !this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = milliseconds / 1000;\n }\n });\n\n this._transmuxer.open();\n }\n\n unload() {\n if (this._mediaElement) {\n this._mediaElement.pause();\n }\n if (this._msectl) {\n this._msectl.seek(0);\n }\n if (this._transmuxer) {\n this._transmuxer.close();\n this._transmuxer.destroy();\n this._transmuxer = null;\n }\n }\n\n play() {\n return this._mediaElement.play();\n }\n\n pause() {\n this._mediaElement.pause();\n }\n\n get type() {\n return this._type;\n }\n\n get buffered() {\n return this._mediaElement.buffered;\n }\n\n get duration() {\n return this._mediaElement.duration;\n }\n\n get volume() {\n return this._mediaElement.volume;\n }\n\n set volume(value) {\n this._mediaElement.volume = value;\n }\n\n get muted() {\n return this._mediaElement.muted;\n }\n\n set muted(muted) {\n this._mediaElement.muted = muted;\n }\n\n get currentTime() {\n if (this._mediaElement) {\n return this._mediaElement.currentTime;\n }\n return 0;\n }\n\n set currentTime(seconds) {\n if (this._mediaElement) {\n this._internalSeek(seconds);\n } else {\n this._pendingSeekTime = seconds;\n }\n }\n\n get mediaInfo() {\n return Object.assign({}, this._mediaInfo);\n }\n\n get statisticsInfo() {\n if (this._statisticsInfo == null) {\n this._statisticsInfo = {};\n }\n this._statisticsInfo = this._fillStatisticsInfo(this._statisticsInfo);\n return Object.assign({}, this._statisticsInfo);\n }\n\n _fillStatisticsInfo(statInfo) {\n statInfo.playerType = this._type;\n\n if (!(this._mediaElement instanceof HTMLVideoElement)) {\n return statInfo;\n }\n\n let hasQualityInfo = true;\n let decoded = 0;\n let dropped = 0;\n\n if (this._mediaElement.getVideoPlaybackQuality) {\n let quality = this._mediaElement.getVideoPlaybackQuality();\n decoded = quality.totalVideoFrames;\n dropped = quality.droppedVideoFrames;\n } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {\n decoded = this._mediaElement.webkitDecodedFrameCount;\n dropped = this._mediaElement.webkitDroppedFrameCount;\n } else {\n hasQualityInfo = false;\n }\n\n if (hasQualityInfo) {\n statInfo.decodedFrames = decoded;\n statInfo.droppedFrames = dropped;\n }\n\n return statInfo;\n }\n\n _onmseUpdateEnd() {\n if (!this._config.lazyLoad || this._config.isLive) {\n return;\n }\n\n let buffered = this._mediaElement.buffered;\n let currentTime = this._mediaElement.currentTime;\n let currentRangeStart = 0;\n let currentRangeEnd = 0;\n\n for (let i = 0; i < buffered.length; i++) {\n let start = buffered.start(i);\n let end = buffered.end(i);\n if (start <= currentTime && currentTime < end) {\n currentRangeStart = start;\n currentRangeEnd = end;\n break;\n }\n }\n\n if (currentRangeEnd >= currentTime + this._config.lazyLoadMaxDuration && this._progressChecker == null) {\n Log.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');\n this._suspendTransmuxer();\n }\n }\n\n _onmseBufferFull() {\n Log.v(this.TAG, 'MSE SourceBuffer is full, suspend transmuxing task');\n if (this._progressChecker == null) {\n this._suspendTransmuxer();\n }\n }\n\n _suspendTransmuxer() {\n if (this._transmuxer) {\n this._transmuxer.pause();\n\n if (this._progressChecker == null) {\n this._progressChecker = window.setInterval(this._checkProgressAndResume.bind(this), 1000);\n }\n }\n }\n\n _checkProgressAndResume() {\n let currentTime = this._mediaElement.currentTime;\n let buffered = this._mediaElement.buffered;\n\n let needResume = false;\n\n for (let i = 0; i < buffered.length; i++) {\n let from = buffered.start(i);\n let to = buffered.end(i);\n if (currentTime >= from && currentTime < to) {\n if (currentTime >= to - this._config.lazyLoadRecoverDuration) {\n needResume = true;\n }\n break;\n }\n }\n\n if (needResume) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n if (needResume) {\n Log.v(this.TAG, 'Continue loading from paused position');\n this._transmuxer.resume();\n }\n }\n }\n\n _isTimepointBuffered(seconds) {\n let buffered = this._mediaElement.buffered;\n\n for (let i = 0; i < buffered.length; i++) {\n let from = buffered.start(i);\n let to = buffered.end(i);\n if (seconds >= from && seconds < to) {\n return true;\n }\n }\n return false;\n }\n\n _internalSeek(seconds) {\n let directSeek = this._isTimepointBuffered(seconds);\n\n let directSeekBegin = false;\n let directSeekBeginTime = 0;\n\n if (seconds < 1.0 && this._mediaElement.buffered.length > 0) {\n let videoBeginTime = this._mediaElement.buffered.start(0);\n if ((videoBeginTime < 1.0 && seconds < videoBeginTime) || Browser.safari) {\n directSeekBegin = true;\n // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid\n directSeekBeginTime = Browser.safari ? 0.1 : videoBeginTime;\n }\n }\n\n if (directSeekBegin) { // seek to video begin, set currentTime directly if beginPTS buffered\n this._requestSetTime = true;\n this._mediaElement.currentTime = directSeekBeginTime;\n } else if (directSeek) { // buffered position\n if (!this._alwaysSeekKeyframe) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = seconds;\n } else {\n let idr = this._msectl.getNearestKeyframe(Math.floor(seconds * 1000));\n this._requestSetTime = true;\n if (idr != null) {\n this._mediaElement.currentTime = idr.dts / 1000;\n } else {\n this._mediaElement.currentTime = seconds;\n }\n }\n if (this._progressChecker != null) {\n this._checkProgressAndResume();\n }\n } else {\n if (this._progressChecker != null) {\n window.clearInterval(this._progressChecker);\n this._progressChecker = null;\n }\n this._msectl.seek(seconds);\n this._transmuxer.seek(Math.floor(seconds * 1000)); // in milliseconds\n // no need to set mediaElement.currentTime if non-accurateSeek,\n // just wait for the recommend_seekpoint callback\n if (this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = seconds;\n }\n }\n }\n\n _checkAndApplyUnbufferedSeekpoint() {\n if (this._seekpointRecord) {\n if (this._seekpointRecord.recordTime <= this._now() - 100) {\n let target = this._mediaElement.currentTime;\n this._seekpointRecord = null;\n if (!this._isTimepointBuffered(target)) {\n if (this._progressChecker != null) {\n window.clearTimeout(this._progressChecker);\n this._progressChecker = null;\n }\n // .currentTime is consists with .buffered timestamp\n // Chrome/Edge use DTS, while FireFox/Safari use PTS\n this._msectl.seek(target);\n this._transmuxer.seek(Math.floor(target * 1000));\n // set currentTime if accurateSeek, or wait for recommend_seekpoint callback\n if (this._config.accurateSeek) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = target;\n }\n }\n } else {\n window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);\n }\n }\n }\n\n _checkAndResumeStuckPlayback(stalled) {\n let media = this._mediaElement;\n if (stalled || !this._receivedCanPlay || media.readyState < 2) { // HAVE_CURRENT_DATA\n let buffered = media.buffered;\n if (buffered.length > 0 && media.currentTime < buffered.start(0)) {\n Log.w(this.TAG, `Playback seems stuck at ${media.currentTime}, seek to ${buffered.start(0)}`);\n this._requestSetTime = true;\n this._mediaElement.currentTime = buffered.start(0);\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n }\n } else {\n // Playback didn't stuck, remove progress event listener\n this._mediaElement.removeEventListener('progress', this.e.onvProgress);\n }\n }\n\n _onvLoadedMetadata(e) {\n if (this._pendingSeekTime != null) {\n this._mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n }\n }\n\n _onvSeeking(e) { // handle seeking request from browser's progress bar\n let target = this._mediaElement.currentTime;\n let buffered = this._mediaElement.buffered;\n\n if (this._requestSetTime) {\n this._requestSetTime = false;\n return;\n }\n\n if (target < 1.0 && buffered.length > 0) {\n // seek to video begin, set currentTime directly if beginPTS buffered\n let videoBeginTime = buffered.start(0);\n if ((videoBeginTime < 1.0 && target < videoBeginTime) || Browser.safari) {\n this._requestSetTime = true;\n // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid\n this._mediaElement.currentTime = Browser.safari ? 0.1 : videoBeginTime;\n return;\n }\n }\n\n if (this._isTimepointBuffered(target)) {\n if (this._alwaysSeekKeyframe) {\n let idr = this._msectl.getNearestKeyframe(Math.floor(target * 1000));\n if (idr != null) {\n this._requestSetTime = true;\n this._mediaElement.currentTime = idr.dts / 1000;\n }\n }\n if (this._progressChecker != null) {\n this._checkProgressAndResume();\n }\n return;\n }\n\n this._seekpointRecord = {\n seekPoint: target,\n recordTime: this._now()\n };\n window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);\n }\n\n _onvCanPlay(e) {\n this._receivedCanPlay = true;\n this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);\n }\n\n _onvStalled(e) {\n this._checkAndResumeStuckPlayback(true);\n }\n\n _onvProgress(e) {\n this._checkAndResumeStuckPlayback();\n }\n\n}\n\nexport default FlvPlayer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport PlayerEvents from './player-events.js';\nimport {createDefaultConfig} from '../config.js';\nimport {InvalidArgumentException, IllegalStateException} from '../utils/exception.js';\n\n// Player wrapper for browser's native player (HTMLVideoElement) without MediaSource src. \nclass NativePlayer {\n\n constructor(mediaDataSource, config) {\n this.TAG = 'NativePlayer';\n this._type = 'NativePlayer';\n this._emitter = new EventEmitter();\n\n this._config = createDefaultConfig();\n if (typeof config === 'object') {\n Object.assign(this._config, config);\n }\n\n if (mediaDataSource.type.toLowerCase() === 'flv') {\n throw new InvalidArgumentException('NativePlayer does\\'t support flv MediaDataSource input!');\n }\n if (mediaDataSource.hasOwnProperty('segments')) {\n throw new InvalidArgumentException(`NativePlayer(${mediaDataSource.type}) doesn't support multipart playback!`);\n }\n\n this.e = {\n onvLoadedMetadata: this._onvLoadedMetadata.bind(this)\n };\n\n this._pendingSeekTime = null;\n this._statisticsReporter = null;\n\n this._mediaDataSource = mediaDataSource;\n this._mediaElement = null;\n }\n\n destroy() {\n if (this._mediaElement) {\n this.unload();\n this.detachMediaElement();\n }\n this.e = null;\n this._mediaDataSource = null;\n this._emitter.removeAllListeners();\n this._emitter = null;\n }\n\n on(event, listener) {\n if (event === PlayerEvents.MEDIA_INFO) {\n if (this._mediaElement != null && this._mediaElement.readyState !== 0) { // HAVE_NOTHING\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n });\n }\n } else if (event === PlayerEvents.STATISTICS_INFO) {\n if (this._mediaElement != null && this._mediaElement.readyState !== 0) {\n Promise.resolve().then(() => {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n });\n }\n }\n this._emitter.addListener(event, listener);\n }\n\n off(event, listener) {\n this._emitter.removeListener(event, listener);\n }\n\n attachMediaElement(mediaElement) {\n this._mediaElement = mediaElement;\n mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n\n if (this._pendingSeekTime != null) {\n try {\n mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n } catch (e) {\n // IE11 may throw InvalidStateError if readyState === 0\n // Defer set currentTime operation after loadedmetadata\n }\n }\n }\n\n detachMediaElement() {\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);\n this._mediaElement = null;\n }\n if (this._statisticsReporter != null) {\n window.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n load() {\n if (!this._mediaElement) {\n throw new IllegalStateException('HTMLMediaElement must be attached before load()!');\n }\n this._mediaElement.src = this._mediaDataSource.url;\n\n if (this._mediaElement.readyState > 0) {\n this._mediaElement.currentTime = 0;\n }\n\n this._mediaElement.preload = 'auto';\n this._mediaElement.load();\n this._statisticsReporter = window.setInterval(\n this._reportStatisticsInfo.bind(this),\n this._config.statisticsInfoReportInterval);\n }\n\n unload() {\n if (this._mediaElement) {\n this._mediaElement.src = '';\n this._mediaElement.removeAttribute('src');\n }\n if (this._statisticsReporter != null) {\n window.clearInterval(this._statisticsReporter);\n this._statisticsReporter = null;\n }\n }\n\n play() {\n return this._mediaElement.play();\n }\n\n pause() {\n this._mediaElement.pause();\n }\n\n get type() {\n return this._type;\n }\n\n get buffered() {\n return this._mediaElement.buffered;\n }\n\n get duration() {\n return this._mediaElement.duration;\n }\n\n get volume() {\n return this._mediaElement.volume;\n }\n\n set volume(value) {\n this._mediaElement.volume = value;\n }\n\n get muted() {\n return this._mediaElement.muted;\n }\n\n set muted(muted) {\n this._mediaElement.muted = muted;\n }\n\n get currentTime() {\n if (this._mediaElement) {\n return this._mediaElement.currentTime;\n }\n return 0;\n }\n\n set currentTime(seconds) {\n if (this._mediaElement) {\n this._mediaElement.currentTime = seconds;\n } else {\n this._pendingSeekTime = seconds;\n }\n }\n\n get mediaInfo() {\n let mediaPrefix = (this._mediaElement instanceof HTMLAudioElement) ? 'audio/' : 'video/';\n let info = {\n mimeType: mediaPrefix + this._mediaDataSource.type\n };\n if (this._mediaElement) {\n info.duration = Math.floor(this._mediaElement.duration * 1000);\n if (this._mediaElement instanceof HTMLVideoElement) {\n info.width = this._mediaElement.videoWidth;\n info.height = this._mediaElement.videoHeight;\n }\n }\n return info;\n }\n\n get statisticsInfo() {\n let info = {\n playerType: this._type,\n url: this._mediaDataSource.url\n };\n\n if (!(this._mediaElement instanceof HTMLVideoElement)) {\n return info;\n }\n\n let hasQualityInfo = true;\n let decoded = 0;\n let dropped = 0;\n\n if (this._mediaElement.getVideoPlaybackQuality) {\n let quality = this._mediaElement.getVideoPlaybackQuality();\n decoded = quality.totalVideoFrames;\n dropped = quality.droppedVideoFrames;\n } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {\n decoded = this._mediaElement.webkitDecodedFrameCount;\n dropped = this._mediaElement.webkitDroppedFrameCount;\n } else {\n hasQualityInfo = false;\n }\n\n if (hasQualityInfo) {\n info.decodedFrames = decoded;\n info.droppedFrames = dropped;\n }\n \n return info;\n }\n\n _onvLoadedMetadata(e) {\n if (this._pendingSeekTime != null) {\n this._mediaElement.currentTime = this._pendingSeekTime;\n this._pendingSeekTime = null;\n }\n this._emitter.emit(PlayerEvents.MEDIA_INFO, this.mediaInfo);\n }\n\n _reportStatisticsInfo() {\n this._emitter.emit(PlayerEvents.STATISTICS_INFO, this.statisticsInfo);\n }\n\n}\n\nexport default NativePlayer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {LoaderErrors} from '../io/loader.js';\nimport DemuxErrors from '../demux/demux-errors.js';\n\nexport const ErrorTypes = {\n NETWORK_ERROR: 'NetworkError',\n MEDIA_ERROR: 'MediaError',\n OTHER_ERROR: 'OtherError'\n};\n\nexport const ErrorDetails = {\n NETWORK_EXCEPTION: LoaderErrors.EXCEPTION,\n NETWORK_STATUS_CODE_INVALID: LoaderErrors.HTTP_STATUS_CODE_INVALID,\n NETWORK_TIMEOUT: LoaderErrors.CONNECTING_TIMEOUT,\n NETWORK_UNRECOVERABLE_EARLY_EOF: LoaderErrors.UNRECOVERABLE_EARLY_EOF,\n\n MEDIA_MSE_ERROR: 'MediaMSEError',\n\n MEDIA_FORMAT_ERROR: DemuxErrors.FORMAT_ERROR,\n MEDIA_FORMAT_UNSUPPORTED: DemuxErrors.FORMAT_UNSUPPORTED,\n MEDIA_CODEC_UNSUPPORTED: DemuxErrors.CODEC_UNSUPPORTED\n};","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst PlayerEvents = {\n ERROR: 'error',\n LOADING_COMPLETE: 'loading_complete',\n RECOVERED_EARLY_EOF: 'recovered_early_eof',\n MEDIA_INFO: 'media_info',\n METADATA_ARRIVED: 'metadata_arrived',\n SCRIPTDATA_ARRIVED: 'scriptdata_arrived',\n STATISTICS_INFO: 'statistics_info'\n};\n\nexport default PlayerEvents;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is modified from dailymotion's hls.js library (hls.js/src/helper/aac.js)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass AAC {\n\n static getSilentFrame(codec, channelCount) {\n if (codec === 'mp4a.40.2') {\n // handle LC-AAC\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]);\n } else if (channelCount === 2) {\n return new Uint8Array([0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80]);\n } else if (channelCount === 3) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x8e]);\n } else if (channelCount === 4) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38]);\n } else if (channelCount === 5) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38]);\n } else if (channelCount === 6) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2, 0x00, 0x20, 0x08, 0xe0]);\n }\n } else {\n // handle HE-AAC (mp4a.40.5 / mp4a.40.29)\n if (channelCount === 1) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0:d=0.05\" -c:a libfdk_aac -profile:a aac_he -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n } else if (channelCount === 2) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n } else if (channelCount === 3) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);\n }\n }\n return null;\n }\n\n}\n\nexport default AAC;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is derived from dailymotion's hls.js library (hls.js/src/remux/mp4-generator.js)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// MP4 boxes generator for ISO BMFF (ISO Base Media File Format, defined in ISO/IEC 14496-12)\nclass MP4 {\n\n static init() {\n MP4.types = {\n avc1: [], avcC: [], btrt: [], dinf: [],\n dref: [], esds: [], ftyp: [], hdlr: [],\n mdat: [], mdhd: [], mdia: [], mfhd: [],\n minf: [], moof: [], moov: [], mp4a: [],\n mvex: [], mvhd: [], sdtp: [], stbl: [],\n stco: [], stsc: [], stsd: [], stsz: [],\n stts: [], tfdt: [], tfhd: [], traf: [],\n trak: [], trun: [], trex: [], tkhd: [],\n vmhd: [], smhd: [], '.mp3': []\n };\n\n for (let name in MP4.types) {\n if (MP4.types.hasOwnProperty(name)) {\n MP4.types[name] = [\n name.charCodeAt(0),\n name.charCodeAt(1),\n name.charCodeAt(2),\n name.charCodeAt(3)\n ];\n }\n }\n\n let constants = MP4.constants = {};\n\n constants.FTYP = new Uint8Array([\n 0x69, 0x73, 0x6F, 0x6D, // major_brand: isom\n 0x0, 0x0, 0x0, 0x1, // minor_version: 0x01\n 0x69, 0x73, 0x6F, 0x6D, // isom\n 0x61, 0x76, 0x63, 0x31 // avc1\n ]);\n\n constants.STSD_PREFIX = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01 // entry_count\n ]);\n\n constants.STTS = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // entry_count\n ]);\n\n constants.STSC = constants.STCO = constants.STTS;\n\n constants.STSZ = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // sample_size\n 0x00, 0x00, 0x00, 0x00 // sample_count\n ]);\n\n constants.HDLR_VIDEO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x56, 0x69, 0x64, 0x65,\n 0x6F, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: VideoHandler\n ]);\n\n constants.HDLR_AUDIO = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // pre_defined\n 0x73, 0x6F, 0x75, 0x6E, // handler_type: 'soun'\n 0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x53, 0x6F, 0x75, 0x6E,\n 0x64, 0x48, 0x61, 0x6E,\n 0x64, 0x6C, 0x65, 0x72, 0x00 // name: SoundHandler\n ]);\n\n constants.DREF = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x01, // entry_count\n 0x00, 0x00, 0x00, 0x0C, // entry_size\n 0x75, 0x72, 0x6C, 0x20, // type 'url '\n 0x00, 0x00, 0x00, 0x01 // version(0) + flags\n ]);\n\n // Sound media header\n constants.SMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00 // balance(2) + reserved(2)\n ]);\n\n // video media header\n constants.VMHD = new Uint8Array([\n 0x00, 0x00, 0x00, 0x01, // version(0) + flags\n 0x00, 0x00, // graphicsmode: 2 bytes\n 0x00, 0x00, 0x00, 0x00, // opcolor: 3 * 2 bytes\n 0x00, 0x00\n ]);\n }\n\n // Generate a box\n static box(type) {\n let size = 8;\n let result = null;\n let datas = Array.prototype.slice.call(arguments, 1);\n let arrayCount = datas.length;\n\n for (let i = 0; i < arrayCount; i++) {\n size += datas[i].byteLength;\n }\n\n result = new Uint8Array(size);\n result[0] = (size >>> 24) & 0xFF; // size\n result[1] = (size >>> 16) & 0xFF;\n result[2] = (size >>> 8) & 0xFF;\n result[3] = (size) & 0xFF;\n\n result.set(type, 4); // type\n\n let offset = 8;\n for (let i = 0; i < arrayCount; i++) { // data body\n result.set(datas[i], offset);\n offset += datas[i].byteLength;\n }\n\n return result;\n }\n\n // emit ftyp & moov\n static generateInitSegment(meta) {\n let ftyp = MP4.box(MP4.types.ftyp, MP4.constants.FTYP);\n let moov = MP4.moov(meta);\n\n let result = new Uint8Array(ftyp.byteLength + moov.byteLength);\n result.set(ftyp, 0);\n result.set(moov, ftyp.byteLength);\n return result;\n }\n\n // Movie metadata box\n static moov(meta) {\n let mvhd = MP4.mvhd(meta.timescale, meta.duration);\n let trak = MP4.trak(meta);\n let mvex = MP4.mvex(meta);\n return MP4.box(MP4.types.moov, mvhd, trak, mvex);\n }\n\n // Movie header box\n static mvhd(timescale, duration) {\n return MP4.box(MP4.types.mvhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x01, 0x00, 0x00, // Preferred rate: 1.0\n 0x01, 0x00, 0x00, 0x00, // PreferredVolume(1.0, 2bytes) + reserved(2bytes)\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 + 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n 0x00, 0x00, 0x00, 0x00, // ----begin pre_defined 6 * 4 bytes----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // ----end pre_defined 6 * 4 bytes----\n 0xFF, 0xFF, 0xFF, 0xFF // next_track_ID\n ]));\n }\n\n // Track box\n static trak(meta) {\n return MP4.box(MP4.types.trak, MP4.tkhd(meta), MP4.mdia(meta));\n }\n\n // Track header box\n static tkhd(meta) {\n let trackId = meta.id, duration = meta.duration;\n let width = meta.presentWidth, height = meta.presentHeight;\n\n return MP4.box(MP4.types.tkhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x07, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (trackId >>> 24) & 0xFF, // track_ID: 4 bytes\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, // layer(2bytes) + alternate_group(2bytes)\n 0x00, 0x00, 0x00, 0x00, // volume(2bytes) + reserved(2bytes)\n 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x01, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----\n (width >>> 8) & 0xFF, // width and height\n (width) & 0xFF,\n 0x00, 0x00,\n (height >>> 8) & 0xFF,\n (height) & 0xFF,\n 0x00, 0x00\n ]));\n }\n\n // Media Box\n static mdia(meta) {\n return MP4.box(MP4.types.mdia, MP4.mdhd(meta), MP4.hdlr(meta), MP4.minf(meta));\n }\n\n // Media header box\n static mdhd(meta) {\n let timescale = meta.timescale;\n let duration = meta.duration;\n return MP4.box(MP4.types.mdhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n 0x00, 0x00, 0x00, 0x00, // creation_time\n 0x00, 0x00, 0x00, 0x00, // modification_time\n (timescale >>> 24) & 0xFF, // timescale: 4 bytes\n (timescale >>> 16) & 0xFF,\n (timescale >>> 8) & 0xFF,\n (timescale) & 0xFF,\n (duration >>> 24) & 0xFF, // duration: 4 bytes\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n 0x55, 0xC4, // language: und (undetermined)\n 0x00, 0x00 // pre_defined = 0\n ]));\n }\n\n // Media handler reference box\n static hdlr(meta) {\n let data = null;\n if (meta.type === 'audio') {\n data = MP4.constants.HDLR_AUDIO;\n } else {\n data = MP4.constants.HDLR_VIDEO;\n }\n return MP4.box(MP4.types.hdlr, data);\n }\n\n // Media infomation box\n static minf(meta) {\n let xmhd = null;\n if (meta.type === 'audio') {\n xmhd = MP4.box(MP4.types.smhd, MP4.constants.SMHD);\n } else {\n xmhd = MP4.box(MP4.types.vmhd, MP4.constants.VMHD);\n }\n return MP4.box(MP4.types.minf, xmhd, MP4.dinf(), MP4.stbl(meta));\n }\n\n // Data infomation box\n static dinf() {\n let result = MP4.box(MP4.types.dinf,\n MP4.box(MP4.types.dref, MP4.constants.DREF)\n );\n return result;\n }\n\n // Sample table box\n static stbl(meta) {\n let result = MP4.box(MP4.types.stbl, // type: stbl\n MP4.stsd(meta), // Sample Description Table\n MP4.box(MP4.types.stts, MP4.constants.STTS), // Time-To-Sample\n MP4.box(MP4.types.stsc, MP4.constants.STSC), // Sample-To-Chunk\n MP4.box(MP4.types.stsz, MP4.constants.STSZ), // Sample size\n MP4.box(MP4.types.stco, MP4.constants.STCO) // Chunk offset\n ); \n return result; \n }\n\n // Sample description box\n static stsd(meta) {\n if (meta.type === 'audio') {\n if (meta.codec === 'mp3') {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp3(meta));\n }\n // else: aac -> mp4a\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp4a(meta));\n } else {\n return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.avc1(meta));\n }\n }\n\n static mp3(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types['.mp3'], data);\n }\n\n static mp4a(meta) {\n let channelCount = meta.channelCount;\n let sampleRate = meta.audioSampleRate;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, channelCount, // channelCount(2)\n 0x00, 0x10, // sampleSize(2)\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n (sampleRate >>> 8) & 0xFF, // Audio sample rate\n (sampleRate) & 0xFF,\n 0x00, 0x00\n ]);\n\n return MP4.box(MP4.types.mp4a, data, MP4.esds(meta));\n }\n\n static esds(meta) {\n let config = meta.config || [];\n let configSize = config.length;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version 0 + flags\n\n 0x03, // descriptor_type\n 0x17 + configSize, // length3\n 0x00, 0x01, // es_id\n 0x00, // stream_priority\n\n 0x04, // descriptor_type\n 0x0F + configSize, // length\n 0x40, // codec: mpeg4_audio\n 0x15, // stream_type: Audio\n 0x00, 0x00, 0x00, // buffer_size\n 0x00, 0x00, 0x00, 0x00, // maxBitrate\n 0x00, 0x00, 0x00, 0x00, // avgBitrate\n\n 0x05 // descriptor_type\n ].concat([\n configSize\n ]).concat(\n config\n ).concat([\n 0x06, 0x01, 0x02 // GASpecificConfig\n ]));\n return MP4.box(MP4.types.esds, data);\n }\n\n static avc1(meta) {\n let avcc = meta.avcc;\n let width = meta.codecWidth, height = meta.codecHeight;\n\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // reserved(4)\n 0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined(2) + reserved(2)\n 0x00, 0x00, 0x00, 0x00, // pre_defined: 3 * 4 bytes\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n (width >>> 8) & 0xFF, // width: 2 bytes\n (width) & 0xFF,\n (height >>> 8) & 0xFF, // height: 2 bytes\n (height) & 0xFF,\n 0x00, 0x48, 0x00, 0x00, // horizresolution: 4 bytes\n 0x00, 0x48, 0x00, 0x00, // vertresolution: 4 bytes\n 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes\n 0x00, 0x01, // frame_count\n 0x0A, // strlen\n 0x78, 0x71, 0x71, 0x2F, // compressorname: 32 bytes\n 0x66, 0x6C, 0x76, 0x2E,\n 0x6A, 0x73, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00,\n 0x00, 0x18, // depth\n 0xFF, 0xFF // pre_defined = -1\n ]);\n return MP4.box(MP4.types.avc1, data, MP4.box(MP4.types.avcC, avcc));\n }\n\n // Movie Extends box\n static mvex(meta) {\n return MP4.box(MP4.types.mvex, MP4.trex(meta));\n }\n\n // Track Extends box\n static trex(meta) {\n let trackId = meta.id;\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) + flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF,\n 0x00, 0x00, 0x00, 0x01, // default_sample_description_index\n 0x00, 0x00, 0x00, 0x00, // default_sample_duration\n 0x00, 0x00, 0x00, 0x00, // default_sample_size\n 0x00, 0x01, 0x00, 0x01 // default_sample_flags\n ]);\n return MP4.box(MP4.types.trex, data);\n }\n\n // Movie fragment box\n static moof(track, baseMediaDecodeTime) {\n return MP4.box(MP4.types.moof, MP4.mfhd(track.sequenceNumber), MP4.traf(track, baseMediaDecodeTime));\n }\n\n static mfhd(sequenceNumber) {\n let data = new Uint8Array([\n 0x00, 0x00, 0x00, 0x00,\n (sequenceNumber >>> 24) & 0xFF, // sequence_number: int32\n (sequenceNumber >>> 16) & 0xFF,\n (sequenceNumber >>> 8) & 0xFF,\n (sequenceNumber) & 0xFF\n ]);\n return MP4.box(MP4.types.mfhd, data);\n }\n\n // Track fragment box\n static traf(track, baseMediaDecodeTime) {\n let trackId = track.id;\n\n // Track fragment header box\n let tfhd = MP4.box(MP4.types.tfhd, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (trackId >>> 24) & 0xFF, // track_ID\n (trackId >>> 16) & 0xFF,\n (trackId >>> 8) & 0xFF,\n (trackId) & 0xFF\n ]));\n // Track Fragment Decode Time\n let tfdt = MP4.box(MP4.types.tfdt, new Uint8Array([\n 0x00, 0x00, 0x00, 0x00, // version(0) & flags\n (baseMediaDecodeTime >>> 24) & 0xFF, // baseMediaDecodeTime: int32\n (baseMediaDecodeTime >>> 16) & 0xFF,\n (baseMediaDecodeTime >>> 8) & 0xFF,\n (baseMediaDecodeTime) & 0xFF\n ]));\n let sdtp = MP4.sdtp(track);\n let trun = MP4.trun(track, sdtp.byteLength + 16 + 16 + 8 + 16 + 8 + 8);\n\n return MP4.box(MP4.types.traf, tfhd, tfdt, trun, sdtp);\n }\n\n // Sample Dependency Type box\n static sdtp(track) {\n let samples = track.samples || [];\n let sampleCount = samples.length;\n let data = new Uint8Array(4 + sampleCount);\n // 0~4 bytes: version(0) & flags\n for (let i = 0; i < sampleCount; i++) {\n let flags = samples[i].flags;\n data[i + 4] = (flags.isLeading << 6) // is_leading: 2 (bit)\n | (flags.dependsOn << 4) // sample_depends_on\n | (flags.isDependedOn << 2) // sample_is_depended_on\n | (flags.hasRedundancy); // sample_has_redundancy\n }\n return MP4.box(MP4.types.sdtp, data);\n }\n\n // Track fragment run box\n static trun(track, offset) {\n let samples = track.samples || [];\n let sampleCount = samples.length;\n let dataSize = 12 + 16 * sampleCount;\n let data = new Uint8Array(dataSize);\n offset += 8 + dataSize;\n\n data.set([\n 0x00, 0x00, 0x0F, 0x01, // version(0) & flags\n (sampleCount >>> 24) & 0xFF, // sample_count\n (sampleCount >>> 16) & 0xFF,\n (sampleCount >>> 8) & 0xFF,\n (sampleCount) & 0xFF,\n (offset >>> 24) & 0xFF, // data_offset\n (offset >>> 16) & 0xFF,\n (offset >>> 8) & 0xFF,\n (offset) & 0xFF\n ], 0);\n\n for (let i = 0; i < sampleCount; i++) {\n let duration = samples[i].duration;\n let size = samples[i].size;\n let flags = samples[i].flags;\n let cts = samples[i].cts;\n data.set([\n (duration >>> 24) & 0xFF, // sample_duration\n (duration >>> 16) & 0xFF,\n (duration >>> 8) & 0xFF,\n (duration) & 0xFF,\n (size >>> 24) & 0xFF, // sample_size\n (size >>> 16) & 0xFF,\n (size >>> 8) & 0xFF,\n (size) & 0xFF,\n (flags.isLeading << 2) | flags.dependsOn, // sample_flags\n (flags.isDependedOn << 6) | (flags.hasRedundancy << 4) | flags.isNonSync,\n 0x00, 0x00, // sample_degradation_priority\n (cts >>> 24) & 0xFF, // sample_composition_time_offset\n (cts >>> 16) & 0xFF,\n (cts >>> 8) & 0xFF,\n (cts) & 0xFF\n ], 12 + 16 * i);\n }\n return MP4.box(MP4.types.trun, data);\n }\n\n static mdat(data) {\n return MP4.box(MP4.types.mdat, data);\n }\n\n}\n\nMP4.init();\n\nexport default MP4;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Log from '../utils/logger.js';\nimport MP4 from './mp4-generator.js';\nimport AAC from './aac-silent.js';\nimport Browser from '../utils/browser.js';\nimport {SampleInfo, MediaSegmentInfo, MediaSegmentInfoList} from '../core/media-segment-info.js';\nimport {IllegalStateException} from '../utils/exception.js';\n\n\n// Fragmented mp4 remuxer\nclass MP4Remuxer {\n\n constructor(config) {\n this.TAG = 'MP4Remuxer';\n\n this._config = config;\n this._isLive = (config.isLive === true) ? true : false;\n\n this._dtsBase = -1;\n this._dtsBaseInited = false;\n this._audioDtsBase = Infinity;\n this._videoDtsBase = Infinity;\n this._audioNextDts = undefined;\n this._videoNextDts = undefined;\n this._audioStashedLastSample = null;\n this._videoStashedLastSample = null;\n\n this._audioMeta = null;\n this._videoMeta = null;\n\n this._audioSegmentInfoList = new MediaSegmentInfoList('audio');\n this._videoSegmentInfoList = new MediaSegmentInfoList('video');\n\n this._onInitSegment = null;\n this._onMediaSegment = null;\n\n // Workaround for chrome < 50: Always force first sample as a Random Access Point in media segment\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412\n this._forceFirstIDR = (Browser.chrome &&\n (Browser.version.major < 50 ||\n (Browser.version.major === 50 && Browser.version.build < 2661))) ? true : false;\n\n // Workaround for IE11/Edge: Fill silent aac frame after keyframe-seeking\n // Make audio beginDts equals with video beginDts, in order to fix seek freeze\n this._fillSilentAfterSeek = (Browser.msedge || Browser.msie);\n\n // While only FireFox supports 'audio/mp4, codecs=\"mp3\"', use 'audio/mpeg' for chrome, safari, ...\n this._mp3UseMpegAudio = !Browser.firefox;\n\n this._fillAudioTimestampGap = this._config.fixAudioTimestampGap;\n }\n\n destroy() {\n this._dtsBase = -1;\n this._dtsBaseInited = false;\n this._audioMeta = null;\n this._videoMeta = null;\n this._audioSegmentInfoList.clear();\n this._audioSegmentInfoList = null;\n this._videoSegmentInfoList.clear();\n this._videoSegmentInfoList = null;\n this._onInitSegment = null;\n this._onMediaSegment = null;\n }\n\n bindDataSource(producer) {\n producer.onDataAvailable = this.remux.bind(this);\n producer.onTrackMetadata = this._onTrackMetadataReceived.bind(this);\n return this;\n }\n\n /* prototype: function onInitSegment(type: string, initSegment: ArrayBuffer): void\n InitSegment: {\n type: string,\n data: ArrayBuffer,\n codec: string,\n container: string\n }\n */\n get onInitSegment() {\n return this._onInitSegment;\n }\n\n set onInitSegment(callback) {\n this._onInitSegment = callback;\n }\n\n /* prototype: function onMediaSegment(type: string, mediaSegment: MediaSegment): void\n MediaSegment: {\n type: string,\n data: ArrayBuffer,\n sampleCount: int32\n info: MediaSegmentInfo\n }\n */\n get onMediaSegment() {\n return this._onMediaSegment;\n }\n\n set onMediaSegment(callback) {\n this._onMediaSegment = callback;\n }\n\n insertDiscontinuity() {\n this._audioNextDts = this._videoNextDts = undefined;\n }\n\n seek(originalDts) {\n this._audioStashedLastSample = null;\n this._videoStashedLastSample = null;\n this._videoSegmentInfoList.clear();\n this._audioSegmentInfoList.clear();\n }\n\n remux(audioTrack, videoTrack) {\n if (!this._onMediaSegment) {\n throw new IllegalStateException('MP4Remuxer: onMediaSegment callback must be specificed!');\n }\n if (!this._dtsBaseInited) {\n this._calculateDtsBase(audioTrack, videoTrack);\n }\n this._remuxVideo(videoTrack);\n this._remuxAudio(audioTrack);\n }\n\n _onTrackMetadataReceived(type, metadata) {\n let metabox = null;\n\n let container = 'mp4';\n let codec = metadata.codec;\n\n if (type === 'audio') {\n this._audioMeta = metadata;\n if (metadata.codec === 'mp3' && this._mp3UseMpegAudio) {\n // 'audio/mpeg' for MP3 audio track\n container = 'mpeg';\n codec = '';\n metabox = new Uint8Array();\n } else {\n // 'audio/mp4, codecs=\"codec\"'\n metabox = MP4.generateInitSegment(metadata);\n }\n } else if (type === 'video') {\n this._videoMeta = metadata;\n metabox = MP4.generateInitSegment(metadata);\n } else {\n return;\n }\n\n // dispatch metabox (Initialization Segment)\n if (!this._onInitSegment) {\n throw new IllegalStateException('MP4Remuxer: onInitSegment callback must be specified!');\n }\n this._onInitSegment(type, {\n type: type,\n data: metabox.buffer,\n codec: codec,\n container: `${type}/${container}`,\n mediaDuration: metadata.duration // in timescale 1000 (milliseconds)\n });\n }\n\n _calculateDtsBase(audioTrack, videoTrack) {\n if (this._dtsBaseInited) {\n return;\n }\n\n if (audioTrack.samples && audioTrack.samples.length) {\n this._audioDtsBase = audioTrack.samples[0].dts;\n }\n if (videoTrack.samples && videoTrack.samples.length) {\n this._videoDtsBase = videoTrack.samples[0].dts;\n }\n\n this._dtsBase = Math.min(this._audioDtsBase, this._videoDtsBase);\n this._dtsBaseInited = true;\n }\n\n flushStashedSamples() {\n let videoSample = this._videoStashedLastSample;\n let audioSample = this._audioStashedLastSample;\n\n let videoTrack = {\n type: 'video',\n id: 1,\n sequenceNumber: 0,\n samples: [],\n length: 0\n };\n\n if (videoSample != null) {\n videoTrack.samples.push(videoSample);\n videoTrack.length = videoSample.length;\n }\n\n let audioTrack = {\n type: 'audio',\n id: 2,\n sequenceNumber: 0,\n samples: [],\n length: 0\n };\n\n if (audioSample != null) {\n audioTrack.samples.push(audioSample);\n audioTrack.length = audioSample.length;\n }\n\n this._videoStashedLastSample = null;\n this._audioStashedLastSample = null;\n\n this._remuxVideo(videoTrack, true);\n this._remuxAudio(audioTrack, true);\n }\n\n _remuxAudio(audioTrack, force) {\n if (this._audioMeta == null) {\n return;\n }\n\n let track = audioTrack;\n let samples = track.samples;\n let dtsCorrection = undefined;\n let firstDts = -1, lastDts = -1, lastPts = -1;\n let refSampleDuration = this._audioMeta.refSampleDuration;\n\n let mpegRawTrack = this._audioMeta.codec === 'mp3' && this._mp3UseMpegAudio;\n let firstSegmentAfterSeek = this._dtsBaseInited && this._audioNextDts === undefined;\n\n let insertPrefixSilentFrame = false;\n\n if (!samples || samples.length === 0) {\n return;\n }\n if (samples.length === 1 && !force) {\n // If [sample count in current batch] === 1 && (force != true)\n // Ignore and keep in demuxer's queue\n return;\n } // else if (force === true) do remux\n\n let offset = 0;\n let mdatbox = null;\n let mdatBytes = 0;\n\n // calculate initial mdat size\n if (mpegRawTrack) {\n // for raw mpeg buffer\n offset = 0;\n mdatBytes = track.length;\n } else {\n // for fmp4 mdat box\n offset = 8; // size + type\n mdatBytes = 8 + track.length;\n }\n\n\n let lastSample = null;\n\n // Pop the lastSample and waiting for stash\n if (samples.length > 1) {\n lastSample = samples.pop();\n mdatBytes -= lastSample.length;\n }\n\n // Insert [stashed lastSample in the previous batch] to the front\n if (this._audioStashedLastSample != null) {\n let sample = this._audioStashedLastSample;\n this._audioStashedLastSample = null;\n samples.unshift(sample);\n mdatBytes += sample.length;\n }\n\n // Stash the lastSample of current batch, waiting for next batch\n if (lastSample != null) {\n this._audioStashedLastSample = lastSample;\n }\n\n\n let firstSampleOriginalDts = samples[0].dts - this._dtsBase;\n\n // calculate dtsCorrection\n if (this._audioNextDts) {\n dtsCorrection = firstSampleOriginalDts - this._audioNextDts;\n } else { // this._audioNextDts == undefined\n if (this._audioSegmentInfoList.isEmpty()) {\n dtsCorrection = 0;\n if (this._fillSilentAfterSeek && !this._videoSegmentInfoList.isEmpty()) {\n if (this._audioMeta.originalCodec !== 'mp3') {\n insertPrefixSilentFrame = true;\n }\n }\n } else {\n let lastSample = this._audioSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);\n if (lastSample != null) {\n let distance = (firstSampleOriginalDts - (lastSample.originalDts + lastSample.duration));\n if (distance <= 3) {\n distance = 0;\n }\n let expectedDts = lastSample.dts + lastSample.duration + distance;\n dtsCorrection = firstSampleOriginalDts - expectedDts;\n } else { // lastSample == null, cannot found\n dtsCorrection = 0;\n }\n }\n }\n\n if (insertPrefixSilentFrame) {\n // align audio segment beginDts to match with current video segment's beginDts\n let firstSampleDts = firstSampleOriginalDts - dtsCorrection;\n let videoSegment = this._videoSegmentInfoList.getLastSegmentBefore(firstSampleOriginalDts);\n if (videoSegment != null && videoSegment.beginDts < firstSampleDts) {\n let silentUnit = AAC.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);\n if (silentUnit) {\n let dts = videoSegment.beginDts;\n let silentFrameDuration = firstSampleDts - videoSegment.beginDts;\n Log.v(this.TAG, `InsertPrefixSilentAudio: dts: ${dts}, duration: ${silentFrameDuration}`);\n samples.unshift({unit: silentUnit, dts: dts, pts: dts});\n mdatBytes += silentUnit.byteLength;\n } // silentUnit == null: Cannot generate, skip\n } else {\n insertPrefixSilentFrame = false;\n }\n }\n\n let mp4Samples = [];\n\n // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples\n for (let i = 0; i < samples.length; i++) {\n let sample = samples[i];\n let unit = sample.unit;\n let originalDts = sample.dts - this._dtsBase;\n let dts = originalDts - dtsCorrection;\n\n if (firstDts === -1) {\n firstDts = dts;\n }\n\n let sampleDuration = 0;\n\n if (i !== samples.length - 1) {\n let nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else { // the last sample\n if (lastSample != null) { // use stashed sample's dts to calculate sample duration\n let nextDts = lastSample.dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else if (mp4Samples.length >= 1) { // use second last sample duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else { // the only one sample, use reference sample duration\n sampleDuration = Math.floor(refSampleDuration);\n }\n }\n\n let needFillSilentFrames = false;\n let silentFrames = null;\n\n // Silent frame generation, if large timestamp gap detected && config.fixAudioTimestampGap\n if (sampleDuration > refSampleDuration * 1.5 && this._audioMeta.codec !== 'mp3' && this._fillAudioTimestampGap && !Browser.safari) {\n // We need to insert silent frames to fill timestamp gap\n needFillSilentFrames = true;\n let delta = Math.abs(sampleDuration - refSampleDuration);\n let frameCount = Math.ceil(delta / refSampleDuration);\n let currentDts = dts + refSampleDuration; // Notice: in float\n\n Log.w(this.TAG, 'Large audio timestamp gap detected, may cause AV sync to drift. ' +\n 'Silent frames will be generated to avoid unsync.\\n' +\n `dts: ${dts + sampleDuration} ms, expected: ${dts + Math.round(refSampleDuration)} ms, ` +\n `delta: ${Math.round(delta)} ms, generate: ${frameCount} frames`);\n\n let silentUnit = AAC.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);\n if (silentUnit == null) {\n Log.w(this.TAG, 'Unable to generate silent frame for ' +\n `${this._audioMeta.originalCodec} with ${this._audioMeta.channelCount} channels, repeat last frame`);\n // Repeat last frame\n silentUnit = unit;\n }\n silentFrames = [];\n\n for (let j = 0; j < frameCount; j++) {\n let intDts = Math.round(currentDts); // round to integer\n if (silentFrames.length > 0) {\n // Set previous frame sample duration\n let previousFrame = silentFrames[silentFrames.length - 1];\n previousFrame.duration = intDts - previousFrame.dts;\n }\n let frame = {\n dts: intDts,\n pts: intDts,\n cts: 0,\n unit: silentUnit,\n size: silentUnit.byteLength,\n duration: 0, // wait for next sample\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0\n }\n };\n silentFrames.push(frame);\n mdatBytes += frame.size;\n currentDts += refSampleDuration;\n }\n\n // last frame: align end time to next frame dts\n let lastFrame = silentFrames[silentFrames.length - 1];\n lastFrame.duration = dts + sampleDuration - lastFrame.dts;\n\n // silentFrames.forEach((frame) => {\n // Log.w(this.TAG, `SilentAudio: dts: ${frame.dts}, duration: ${frame.duration}`);\n // });\n\n // Set correct sample duration for current frame\n sampleDuration = Math.round(refSampleDuration);\n }\n\n mp4Samples.push({\n dts: dts,\n pts: dts,\n cts: 0,\n unit: sample.unit,\n size: sample.unit.byteLength,\n duration: sampleDuration,\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: 1,\n isDependedOn: 0,\n hasRedundancy: 0\n }\n });\n\n if (needFillSilentFrames) {\n // Silent frames should be inserted after wrong-duration frame\n mp4Samples.push.apply(mp4Samples, silentFrames);\n }\n }\n\n // allocate mdatbox\n if (mpegRawTrack) {\n // allocate for raw mpeg buffer\n mdatbox = new Uint8Array(mdatBytes);\n } else {\n // allocate for fmp4 mdat box\n mdatbox = new Uint8Array(mdatBytes);\n // size field\n mdatbox[0] = (mdatBytes >>> 24) & 0xFF;\n mdatbox[1] = (mdatBytes >>> 16) & 0xFF;\n mdatbox[2] = (mdatBytes >>> 8) & 0xFF;\n mdatbox[3] = (mdatBytes) & 0xFF;\n // type field (fourCC)\n mdatbox.set(MP4.types.mdat, 4);\n }\n\n // Write samples into mdatbox\n for (let i = 0; i < mp4Samples.length; i++) {\n let unit = mp4Samples[i].unit;\n mdatbox.set(unit, offset);\n offset += unit.byteLength;\n }\n\n let latest = mp4Samples[mp4Samples.length - 1];\n lastDts = latest.dts + latest.duration;\n this._audioNextDts = lastDts;\n\n // fill media segment info & add to info list\n let info = new MediaSegmentInfo();\n info.beginDts = firstDts;\n info.endDts = lastDts;\n info.beginPts = firstDts;\n info.endPts = lastDts;\n info.originalBeginDts = mp4Samples[0].originalDts;\n info.originalEndDts = latest.originalDts + latest.duration;\n info.firstSample = new SampleInfo(mp4Samples[0].dts,\n mp4Samples[0].pts,\n mp4Samples[0].duration,\n mp4Samples[0].originalDts,\n false);\n info.lastSample = new SampleInfo(latest.dts,\n latest.pts,\n latest.duration,\n latest.originalDts,\n false);\n if (!this._isLive) {\n this._audioSegmentInfoList.append(info);\n }\n\n track.samples = mp4Samples;\n track.sequenceNumber++;\n\n let moofbox = null;\n\n if (mpegRawTrack) {\n // Generate empty buffer, because useless for raw mpeg\n moofbox = new Uint8Array();\n } else {\n // Generate moof for fmp4 segment\n moofbox = MP4.moof(track, firstDts);\n }\n\n track.samples = [];\n track.length = 0;\n\n let segment = {\n type: 'audio',\n data: this._mergeBoxes(moofbox, mdatbox).buffer,\n sampleCount: mp4Samples.length,\n info: info\n };\n\n if (mpegRawTrack && firstSegmentAfterSeek) {\n // For MPEG audio stream in MSE, if seeking occurred, before appending new buffer\n // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.\n segment.timestampOffset = firstDts;\n }\n\n this._onMediaSegment('audio', segment);\n }\n\n _remuxVideo(videoTrack, force) {\n if (this._videoMeta == null) {\n return;\n }\n\n let track = videoTrack;\n let samples = track.samples;\n let dtsCorrection = undefined;\n let firstDts = -1, lastDts = -1;\n let firstPts = -1, lastPts = -1;\n\n if (!samples || samples.length === 0) {\n return;\n }\n if (samples.length === 1 && !force) {\n // If [sample count in current batch] === 1 && (force != true)\n // Ignore and keep in demuxer's queue\n return;\n } // else if (force === true) do remux\n\n let offset = 8;\n let mdatbox = null;\n let mdatBytes = 8 + videoTrack.length;\n\n\n let lastSample = null;\n\n // Pop the lastSample and waiting for stash\n if (samples.length > 1) {\n lastSample = samples.pop();\n mdatBytes -= lastSample.length;\n }\n\n // Insert [stashed lastSample in the previous batch] to the front\n if (this._videoStashedLastSample != null) {\n let sample = this._videoStashedLastSample;\n this._videoStashedLastSample = null;\n samples.unshift(sample);\n mdatBytes += sample.length;\n }\n\n // Stash the lastSample of current batch, waiting for next batch\n if (lastSample != null) {\n this._videoStashedLastSample = lastSample;\n }\n\n\n let firstSampleOriginalDts = samples[0].dts - this._dtsBase;\n\n // calculate dtsCorrection\n if (this._videoNextDts) {\n dtsCorrection = firstSampleOriginalDts - this._videoNextDts;\n } else { // this._videoNextDts == undefined\n if (this._videoSegmentInfoList.isEmpty()) {\n dtsCorrection = 0;\n } else {\n let lastSample = this._videoSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);\n if (lastSample != null) {\n let distance = (firstSampleOriginalDts - (lastSample.originalDts + lastSample.duration));\n if (distance <= 3) {\n distance = 0;\n }\n let expectedDts = lastSample.dts + lastSample.duration + distance;\n dtsCorrection = firstSampleOriginalDts - expectedDts;\n } else { // lastSample == null, cannot found\n dtsCorrection = 0;\n }\n }\n }\n\n let info = new MediaSegmentInfo();\n let mp4Samples = [];\n\n // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples\n for (let i = 0; i < samples.length; i++) {\n let sample = samples[i];\n let originalDts = sample.dts - this._dtsBase;\n let isKeyframe = sample.isKeyframe;\n let dts = originalDts - dtsCorrection;\n let cts = sample.cts;\n let pts = dts + cts;\n\n if (firstDts === -1) {\n firstDts = dts;\n firstPts = pts;\n }\n\n let sampleDuration = 0;\n\n if (i !== samples.length - 1) {\n let nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else { // the last sample\n if (lastSample != null) { // use stashed sample's dts to calculate sample duration\n let nextDts = lastSample.dts - this._dtsBase - dtsCorrection;\n sampleDuration = nextDts - dts;\n } else if (mp4Samples.length >= 1) { // use second last sample duration\n sampleDuration = mp4Samples[mp4Samples.length - 1].duration;\n } else { // the only one sample, use reference sample duration\n sampleDuration = Math.floor(this._videoMeta.refSampleDuration);\n }\n }\n\n if (isKeyframe) {\n let syncPoint = new SampleInfo(dts, pts, sampleDuration, sample.dts, true);\n syncPoint.fileposition = sample.fileposition;\n info.appendSyncPoint(syncPoint);\n }\n\n mp4Samples.push({\n dts: dts,\n pts: pts,\n cts: cts,\n units: sample.units,\n size: sample.length,\n isKeyframe: isKeyframe,\n duration: sampleDuration,\n originalDts: originalDts,\n flags: {\n isLeading: 0,\n dependsOn: isKeyframe ? 2 : 1,\n isDependedOn: isKeyframe ? 1 : 0,\n hasRedundancy: 0,\n isNonSync: isKeyframe ? 0 : 1\n }\n });\n }\n\n // allocate mdatbox\n mdatbox = new Uint8Array(mdatBytes);\n mdatbox[0] = (mdatBytes >>> 24) & 0xFF;\n mdatbox[1] = (mdatBytes >>> 16) & 0xFF;\n mdatbox[2] = (mdatBytes >>> 8) & 0xFF;\n mdatbox[3] = (mdatBytes) & 0xFF;\n mdatbox.set(MP4.types.mdat, 4);\n\n // Write samples into mdatbox\n for (let i = 0; i < mp4Samples.length; i++) {\n let units = mp4Samples[i].units;\n while (units.length) {\n let unit = units.shift();\n let data = unit.data;\n mdatbox.set(data, offset);\n offset += data.byteLength;\n }\n }\n\n let latest = mp4Samples[mp4Samples.length - 1];\n lastDts = latest.dts + latest.duration;\n lastPts = latest.pts + latest.duration;\n this._videoNextDts = lastDts;\n\n // fill media segment info & add to info list\n info.beginDts = firstDts;\n info.endDts = lastDts;\n info.beginPts = firstPts;\n info.endPts = lastPts;\n info.originalBeginDts = mp4Samples[0].originalDts;\n info.originalEndDts = latest.originalDts + latest.duration;\n info.firstSample = new SampleInfo(mp4Samples[0].dts,\n mp4Samples[0].pts,\n mp4Samples[0].duration,\n mp4Samples[0].originalDts,\n mp4Samples[0].isKeyframe);\n info.lastSample = new SampleInfo(latest.dts,\n latest.pts,\n latest.duration,\n latest.originalDts,\n latest.isKeyframe);\n if (!this._isLive) {\n this._videoSegmentInfoList.append(info);\n }\n\n track.samples = mp4Samples;\n track.sequenceNumber++;\n\n // workaround for chrome < 50: force first sample as a random access point\n // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412\n if (this._forceFirstIDR) {\n let flags = mp4Samples[0].flags;\n flags.dependsOn = 2;\n flags.isNonSync = 0;\n }\n\n let moofbox = MP4.moof(track, firstDts);\n track.samples = [];\n track.length = 0;\n\n this._onMediaSegment('video', {\n type: 'video',\n data: this._mergeBoxes(moofbox, mdatbox).buffer,\n sampleCount: mp4Samples.length,\n info: info\n });\n }\n\n _mergeBoxes(moof, mdat) {\n let result = new Uint8Array(moof.byteLength + mdat.byteLength);\n result.set(moof, 0);\n result.set(mdat, moof.byteLength);\n return result;\n }\n\n}\n\nexport default MP4Remuxer;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nlet Browser = {};\n\nfunction detect() {\n // modified from jquery-browser-plugin\n\n let ua = self.navigator.userAgent.toLowerCase();\n\n let match = /(edge)\\/([\\w.]+)/.exec(ua) ||\n /(opr)[\\/]([\\w.]+)/.exec(ua) ||\n /(chrome)[ \\/]([\\w.]+)/.exec(ua) ||\n /(iemobile)[\\/]([\\w.]+)/.exec(ua) ||\n /(version)(applewebkit)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec(ua) ||\n /(webkit)[ \\/]([\\w.]+).*(version)[ \\/]([\\w.]+).*(safari)[ \\/]([\\w.]+)/.exec(ua) ||\n /(webkit)[ \\/]([\\w.]+)/.exec(ua) ||\n /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec(ua) ||\n /(msie) ([\\w.]+)/.exec(ua) ||\n ua.indexOf('trident') >= 0 && /(rv)(?::| )([\\w.]+)/.exec(ua) ||\n ua.indexOf('compatible') < 0 && /(firefox)[ \\/]([\\w.]+)/.exec(ua) ||\n [];\n\n let platform_match = /(ipad)/.exec(ua) ||\n /(ipod)/.exec(ua) ||\n /(windows phone)/.exec(ua) ||\n /(iphone)/.exec(ua) ||\n /(kindle)/.exec(ua) ||\n /(android)/.exec(ua) ||\n /(windows)/.exec(ua) ||\n /(mac)/.exec(ua) ||\n /(linux)/.exec(ua) ||\n /(cros)/.exec(ua) ||\n [];\n\n let matched = {\n browser: match[5] || match[3] || match[1] || '',\n version: match[2] || match[4] || '0',\n majorVersion: match[4] || match[2] || '0',\n platform: platform_match[0] || ''\n };\n\n let browser = {};\n if (matched.browser) {\n browser[matched.browser] = true;\n\n let versionArray = matched.majorVersion.split('.');\n browser.version = {\n major: parseInt(matched.majorVersion, 10),\n string: matched.version\n };\n if (versionArray.length > 1) {\n browser.version.minor = parseInt(versionArray[1], 10);\n }\n if (versionArray.length > 2) {\n browser.version.build = parseInt(versionArray[2], 10);\n }\n }\n\n if (matched.platform) {\n browser[matched.platform] = true;\n }\n\n if (browser.chrome || browser.opr || browser.safari) {\n browser.webkit = true;\n }\n\n // MSIE. IE11 has 'rv' identifer\n if (browser.rv || browser.iemobile) {\n if (browser.rv) {\n delete browser.rv;\n }\n let msie = 'msie';\n matched.browser = msie;\n browser[msie] = true;\n }\n\n // Microsoft Edge\n if (browser.edge) {\n delete browser.edge;\n let msedge = 'msedge';\n matched.browser = msedge;\n browser[msedge] = true;\n }\n\n // Opera 15+\n if (browser.opr) {\n let opera = 'opera';\n matched.browser = opera;\n browser[opera] = true;\n }\n\n // Stock android browsers are marked as Safari\n if (browser.safari && browser.android) {\n let android = 'android';\n matched.browser = android;\n browser[android] = true;\n }\n\n browser.name = matched.browser;\n browser.platform = matched.platform;\n\n for (let key in Browser) {\n if (Browser.hasOwnProperty(key)) {\n delete Browser[key];\n }\n }\n Object.assign(Browser, browser);\n}\n\ndetect();\n\nexport default Browser;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class RuntimeException {\n\n constructor(message) {\n this._message = message;\n }\n\n get name() {\n return 'RuntimeException';\n }\n\n get message() {\n return this._message;\n }\n\n toString() {\n return this.name + ': ' + this.message;\n }\n\n}\n\nexport class IllegalStateException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'IllegalStateException';\n }\n\n}\n\nexport class InvalidArgumentException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'InvalidArgumentException';\n }\n\n}\n\nexport class NotImplementedException extends RuntimeException {\n\n constructor(message) {\n super(message);\n }\n\n get name() {\n return 'NotImplementedException';\n }\n\n}\n","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\n\nclass Log {\n\n static e(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'error', str);\n }\n\n if (!Log.ENABLE_ERROR) {\n return;\n }\n\n if (console.error) {\n console.error(str);\n } else if (console.warn) {\n console.warn(str);\n } else {\n console.log(str);\n }\n }\n\n static i(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'info', str);\n }\n\n if (!Log.ENABLE_INFO) {\n return;\n }\n\n if (console.info) {\n console.info(str);\n } else {\n console.log(str);\n }\n }\n\n static w(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'warn', str);\n }\n\n if (!Log.ENABLE_WARN) {\n return;\n }\n\n if (console.warn) {\n console.warn(str);\n } else {\n console.log(str);\n }\n }\n\n static d(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'debug', str);\n }\n\n if (!Log.ENABLE_DEBUG) {\n return;\n }\n\n if (console.debug) {\n console.debug(str);\n } else {\n console.log(str);\n }\n }\n\n static v(tag, msg) {\n if (!tag || Log.FORCE_GLOBAL_TAG)\n tag = Log.GLOBAL_TAG;\n\n let str = `[${tag}] > ${msg}`;\n\n if (Log.ENABLE_CALLBACK) {\n Log.emitter.emit('log', 'verbose', str);\n }\n\n if (!Log.ENABLE_VERBOSE) {\n return;\n }\n\n console.log(str);\n }\n\n}\n\nLog.GLOBAL_TAG = 'flv.js';\nLog.FORCE_GLOBAL_TAG = false;\nLog.ENABLE_ERROR = true;\nLog.ENABLE_INFO = true;\nLog.ENABLE_WARN = true;\nLog.ENABLE_DEBUG = true;\nLog.ENABLE_VERBOSE = true;\n\nLog.ENABLE_CALLBACK = false;\n\nLog.emitter = new EventEmitter();\n\nexport default Log;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport EventEmitter from 'events';\nimport Log from './logger.js';\n\nclass LoggingControl {\n\n static get forceGlobalTag() {\n return Log.FORCE_GLOBAL_TAG;\n }\n\n static set forceGlobalTag(enable) {\n Log.FORCE_GLOBAL_TAG = enable;\n LoggingControl._notifyChange();\n }\n\n static get globalTag() {\n return Log.GLOBAL_TAG;\n }\n\n static set globalTag(tag) {\n Log.GLOBAL_TAG = tag;\n LoggingControl._notifyChange();\n }\n\n static get enableAll() {\n return Log.ENABLE_VERBOSE\n && Log.ENABLE_DEBUG\n && Log.ENABLE_INFO\n && Log.ENABLE_WARN\n && Log.ENABLE_ERROR;\n }\n\n static set enableAll(enable) {\n Log.ENABLE_VERBOSE = enable;\n Log.ENABLE_DEBUG = enable;\n Log.ENABLE_INFO = enable;\n Log.ENABLE_WARN = enable;\n Log.ENABLE_ERROR = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableDebug() {\n return Log.ENABLE_DEBUG;\n }\n\n static set enableDebug(enable) {\n Log.ENABLE_DEBUG = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableVerbose() {\n return Log.ENABLE_VERBOSE;\n }\n\n static set enableVerbose(enable) {\n Log.ENABLE_VERBOSE = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableInfo() {\n return Log.ENABLE_INFO;\n }\n\n static set enableInfo(enable) {\n Log.ENABLE_INFO = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableWarn() {\n return Log.ENABLE_WARN;\n }\n\n static set enableWarn(enable) {\n Log.ENABLE_WARN = enable;\n LoggingControl._notifyChange();\n }\n\n static get enableError() {\n return Log.ENABLE_ERROR;\n }\n\n static set enableError(enable) {\n Log.ENABLE_ERROR = enable;\n LoggingControl._notifyChange();\n }\n\n static getConfig() {\n return {\n globalTag: Log.GLOBAL_TAG,\n forceGlobalTag: Log.FORCE_GLOBAL_TAG,\n enableVerbose: Log.ENABLE_VERBOSE,\n enableDebug: Log.ENABLE_DEBUG,\n enableInfo: Log.ENABLE_INFO,\n enableWarn: Log.ENABLE_WARN,\n enableError: Log.ENABLE_ERROR,\n enableCallback: Log.ENABLE_CALLBACK\n };\n }\n\n static applyConfig(config) {\n Log.GLOBAL_TAG = config.globalTag;\n Log.FORCE_GLOBAL_TAG = config.forceGlobalTag;\n Log.ENABLE_VERBOSE = config.enableVerbose;\n Log.ENABLE_DEBUG = config.enableDebug;\n Log.ENABLE_INFO = config.enableInfo;\n Log.ENABLE_WARN = config.enableWarn;\n Log.ENABLE_ERROR = config.enableError;\n Log.ENABLE_CALLBACK = config.enableCallback;\n }\n\n static _notifyChange() {\n let emitter = LoggingControl.emitter;\n\n if (emitter.listenerCount('change') > 0) {\n let config = LoggingControl.getConfig();\n emitter.emit('change', config);\n }\n }\n\n static registerListener(listener) {\n LoggingControl.emitter.addListener('change', listener);\n }\n\n static removeListener(listener) {\n LoggingControl.emitter.removeListener('change', listener);\n }\n\n static addLogListener(listener) {\n Log.emitter.addListener('log', listener);\n if (Log.emitter.listenerCount('log') > 0) {\n Log.ENABLE_CALLBACK = true;\n LoggingControl._notifyChange();\n }\n }\n\n static removeLogListener(listener) {\n Log.emitter.removeListener('log', listener);\n if (Log.emitter.listenerCount('log') === 0) {\n Log.ENABLE_CALLBACK = false;\n LoggingControl._notifyChange();\n }\n }\n\n}\n\nLoggingControl.emitter = new EventEmitter();\n\nexport default LoggingControl;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nclass Polyfill {\n\n static install() {\n // ES6 Object.setPrototypeOf\n Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {\n obj.__proto__ = proto;\n return obj;\n };\n\n // ES6 Object.assign\n Object.assign = Object.assign || function (target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n let output = Object(target);\n for (let i = 1; i < arguments.length; i++) {\n let source = arguments[i];\n if (source !== undefined && source !== null) {\n for (let key in source) {\n if (source.hasOwnProperty(key)) {\n output[key] = source[key];\n }\n }\n }\n }\n return output;\n };\n\n // ES6 Promise (missing support in IE11)\n if (typeof self.Promise !== 'function') {\n require('es6-promise').polyfill();\n }\n }\n\n}\n\nPolyfill.install();\n\nexport default Polyfill;","/*\n * Copyright (C) 2016 Bilibili. All Rights Reserved.\n *\n * This file is derived from C++ project libWinTF8 (https://github.com/m13253/libWinTF8)\n * @author zheng qian \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nfunction checkContinuation(uint8array, start, checkLength) {\n let array = uint8array;\n if (start + checkLength < array.length) {\n while (checkLength--) {\n if ((array[++start] & 0xC0) !== 0x80)\n return false;\n }\n return true;\n } else {\n return false;\n }\n}\n\nfunction decodeUTF8(uint8array) {\n let out = [];\n let input = uint8array;\n let i = 0;\n let length = uint8array.length;\n\n while (i < length) {\n if (input[i] < 0x80) {\n out.push(String.fromCharCode(input[i]));\n ++i;\n continue;\n } else if (input[i] < 0xC0) {\n // fallthrough\n } else if (input[i] < 0xE0) {\n if (checkContinuation(input, i, 1)) {\n let ucs4 = (input[i] & 0x1F) << 6 | (input[i + 1] & 0x3F);\n if (ucs4 >= 0x80) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF));\n i += 2;\n continue;\n }\n }\n } else if (input[i] < 0xF0) {\n if (checkContinuation(input, i, 2)) {\n let ucs4 = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F;\n if (ucs4 >= 0x800 && (ucs4 & 0xF800) !== 0xD800) {\n out.push(String.fromCharCode(ucs4 & 0xFFFF));\n i += 3;\n continue;\n }\n }\n } else if (input[i] < 0xF8) {\n if (checkContinuation(input, i, 3)) {\n let ucs4 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12\n | (input[i + 2] & 0x3F) << 6 | (input[i + 3] & 0x3F);\n if (ucs4 > 0x10000 && ucs4 < 0x110000) {\n ucs4 -= 0x10000;\n out.push(String.fromCharCode((ucs4 >>> 10) | 0xD800));\n out.push(String.fromCharCode((ucs4 & 0x3FF) | 0xDC00));\n i += 4;\n continue;\n }\n }\n }\n out.push(String.fromCharCode(0xFFFD));\n ++i;\n }\n\n return out.join('');\n}\n\nexport default decodeUTF8;"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvZXM2LXByb21pc2UvZGlzdC9lczYtcHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy93ZWJ3b3JraWZ5L2luZGV4LmpzIiwic3JjXFxjb25maWcuanMiLCJzcmNcXGNvcmVcXGZlYXR1cmVzLmpzIiwic3JjXFxjb3JlXFxtZWRpYS1pbmZvLmpzIiwic3JjXFxjb3JlXFxtZWRpYS1zZWdtZW50LWluZm8uanMiLCJzcmNcXGNvcmVcXG1zZS1jb250cm9sbGVyLmpzIiwic3JjXFxjb3JlXFxtc2UtZXZlbnRzLmpzIiwic3JjXFxjb3JlXFx0cmFuc211eGVyLmpzIiwic3JjXFxjb3JlXFx0cmFuc211eGluZy1jb250cm9sbGVyLmpzIiwic3JjXFxjb3JlXFx0cmFuc211eGluZy1ldmVudHMuanMiLCJzcmNcXGNvcmVcXHRyYW5zbXV4aW5nLXdvcmtlci5qcyIsInNyY1xcZGVtdXhcXGFtZi1wYXJzZXIuanMiLCJzcmNcXGRlbXV4XFxkZW11eC1lcnJvcnMuanMiLCJzcmNcXGRlbXV4XFxleHAtZ29sb21iLmpzIiwic3JjXFxkZW11eFxcZmx2LWRlbXV4ZXIuanMiLCJzcmNcXGRlbXV4XFxzcHMtcGFyc2VyLmpzIiwic3JjXFxmbHYuanMiLCJzcmNcXGluZGV4LmpzIiwic3JjXFxpb1xcZmV0Y2gtc3RyZWFtLWxvYWRlci5qcyIsInNyY1xcaW9cXGlvLWNvbnRyb2xsZXIuanMiLCJzcmNcXGlvXFxsb2FkZXIuanMiLCJzcmNcXGlvXFxwYXJhbS1zZWVrLWhhbmRsZXIuanMiLCJzcmNcXGlvXFxyYW5nZS1zZWVrLWhhbmRsZXIuanMiLCJzcmNcXGlvXFxzcGVlZC1zYW1wbGVyLmpzIiwic3JjXFxpb1xcd2Vic29ja2V0LWxvYWRlci5qcyIsInNyY1xcaW9cXHhoci1tb3otY2h1bmtlZC1sb2FkZXIuanMiLCJzcmNcXGlvXFx4aHItbXNzdHJlYW0tbG9hZGVyLmpzIiwic3JjXFxpb1xceGhyLXJhbmdlLWxvYWRlci5qcyIsInNyY1xccGxheWVyXFxmbHYtcGxheWVyLmpzIiwic3JjXFxwbGF5ZXJcXG5hdGl2ZS1wbGF5ZXIuanMiLCJzcmNcXHBsYXllclxccGxheWVyLWVycm9ycy5qcyIsInNyY1xccGxheWVyXFxwbGF5ZXItZXZlbnRzLmpzIiwic3JjXFxyZW11eFxcYWFjLXNpbGVudC5qcyIsInNyY1xccmVtdXhcXG1wNC1nZW5lcmF0b3IuanMiLCJzcmNcXHJlbXV4XFxtcDQtcmVtdXhlci5qcyIsInNyY1xcdXRpbHNcXGJyb3dzZXIuanMiLCJzcmNcXHV0aWxzXFxleGNlcHRpb24uanMiLCJzcmNcXHV0aWxzXFxsb2dnZXIuanMiLCJzcmNcXHV0aWxzXFxsb2dnaW5nLWNvbnRyb2wuanMiLCJzcmNcXHV0aWxzXFxwb2x5ZmlsbC5qcyIsInNyY1xcdXRpbHNcXHV0ZjgtY29udi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDL3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztRQzdCZ0IsbUIsR0FBQSxtQjtBQW5EaEI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCTyxJQUFNLHdDQUFnQjtBQUN6QixrQkFBYyxLQURXO0FBRXpCLHVCQUFtQixJQUZNO0FBR3pCLHNCQUFrQixTQUhPOztBQUt6QixZQUFRLEtBTGlCOztBQU96QixjQUFVLElBUGU7QUFRekIseUJBQXFCLElBQUksRUFSQTtBQVN6Qiw2QkFBeUIsRUFUQTtBQVV6Qiw4QkFBMEIsSUFWRDs7QUFZekI7QUFDQSxvQ0FBZ0MsSUFBSSxFQWJYO0FBY3pCLG9DQUFnQyxJQUFJLEVBZFg7O0FBZ0J6QixrQ0FBOEIsR0FoQkw7O0FBa0J6QiwwQkFBc0IsSUFsQkc7O0FBb0J6QixrQkFBYyxLQXBCVztBQXFCekIsY0FBVSxPQXJCZSxFQXFCTDtBQUNwQixvQkFBZ0IsUUF0QlM7QUF1QnpCLGtCQUFjLE1BdkJXO0FBd0J6Qix3QkFBb0IsS0F4Qks7QUF5QnpCLHVCQUFtQixTQXpCTTtBQTBCekIsd0JBQW9CLEtBMUJLO0FBMkJ6Qjs7QUFFQSxhQUFTLFNBN0JnQjtBQThCekIsa0JBQWM7QUE5QlcsQ0FBdEI7O0FBaUNBLFNBQVMsbUJBQVQsR0FBK0I7QUFDbEMsV0FBTyxPQUFPLE1BQVAsQ0FBYyxFQUFkLEVBQWtCLGFBQWxCLENBQVA7QUFDSDs7Ozs7Ozs7O3FqQkNyREQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTs7OztBQUNBOzs7Ozs7SUFFTSxROzs7Ozs7O2lEQUU4QjtBQUM1QixtQkFBTyxPQUFPLFdBQVAsSUFDQSxPQUFPLFdBQVAsQ0FBbUIsZUFBbkIsQ0FBbUMsMkNBQW5DLENBRFA7QUFFSDs7O2lEQUUrQjtBQUM1QixnQkFBSSxRQUFRLDJCQUFpQixFQUFqQixFQUFxQixrQ0FBckIsQ0FBWjtBQUNBLGdCQUFJLGFBQWEsTUFBTSxVQUF2QjtBQUNBLGtCQUFNLE9BQU47QUFDQSxtQkFBTyxjQUFjLHFCQUFkLElBQXVDLGNBQWMsd0JBQTVEO0FBQ0g7OzttREFFaUM7QUFDOUIsZ0JBQUksUUFBUSwyQkFBaUIsRUFBakIsRUFBcUIsa0NBQXJCLENBQVo7QUFDQSxnQkFBSSxhQUFhLE1BQU0sVUFBdkI7QUFDQSxrQkFBTSxPQUFOO0FBQ0EsbUJBQU8sVUFBUDtBQUNIOzs7bURBRWlDLFEsRUFBVTtBQUN4QyxnQkFBSSxTQUFTLFlBQVQsSUFBeUIsU0FBN0IsRUFBd0M7QUFDcEMseUJBQVMsWUFBVCxHQUF3QixPQUFPLFFBQVAsQ0FBZ0IsYUFBaEIsQ0FBOEIsT0FBOUIsQ0FBeEI7QUFDSDtBQUNELGdCQUFJLFVBQVUsU0FBUyxZQUFULENBQXNCLFdBQXRCLENBQWtDLFFBQWxDLENBQWQ7QUFDQSxtQkFBTyxZQUFZLFVBQVosSUFBMEIsV0FBVyxPQUE1QztBQUNIOzs7eUNBRXVCO0FBQ3BCLGdCQUFJLFdBQVc7QUFDWCxnQ0FBZ0IsS0FETDtBQUVYLG9DQUFvQixLQUZUO0FBR1gsaUNBQWlCLEtBSE47QUFJWCxtQ0FBbUIsRUFKUjtBQUtYLHVDQUF1QixLQUxaO0FBTVgsdUNBQXVCLEtBTlo7QUFPWCx1Q0FBdUI7QUFQWixhQUFmOztBQVVBLHFCQUFTLGNBQVQsR0FBMEIsU0FBUyxzQkFBVCxFQUExQjtBQUNBLHFCQUFTLGVBQVQsR0FBMkIsU0FBUyxzQkFBVCxFQUEzQjtBQUNBLHFCQUFTLGlCQUFULEdBQTZCLFNBQVMsd0JBQVQsRUFBN0I7QUFDQSxxQkFBUyxrQkFBVCxHQUE4QixTQUFTLGNBQVQsSUFBMkIsU0FBUyxlQUFsRTtBQUNBLHFCQUFTLHFCQUFULEdBQWlDLFNBQVMsMEJBQVQsQ0FBb0MsNENBQXBDLENBQWpDO0FBQ0EscUJBQVMscUJBQVQsR0FBaUMsU0FBUywwQkFBVCxDQUFvQyxvQ0FBcEMsQ0FBakM7QUFDQSxxQkFBUyxxQkFBVCxHQUFpQyxTQUFTLDBCQUFULENBQW9DLDBCQUFwQyxDQUFqQzs7QUFFQSxtQkFBTyxRQUFQO0FBQ0g7Ozs7OztrQkFJVSxROzs7Ozs7Ozs7Ozs7O0FDMUVmOzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFrQk0sUztBQUVGLHlCQUFjO0FBQUE7O0FBQ1YsYUFBSyxRQUFMLEdBQWdCLElBQWhCO0FBQ0EsYUFBSyxRQUFMLEdBQWdCLElBQWhCOztBQUVBLGFBQUssUUFBTCxHQUFnQixJQUFoQjtBQUNBLGFBQUssUUFBTCxHQUFnQixJQUFoQjtBQUNBLGFBQUssVUFBTCxHQUFrQixJQUFsQjtBQUNBLGFBQUssVUFBTCxHQUFrQixJQUFsQjtBQUNBLGFBQUssYUFBTCxHQUFxQixJQUFyQjtBQUNBLGFBQUssYUFBTCxHQUFxQixJQUFyQjs7QUFFQSxhQUFLLGVBQUwsR0FBdUIsSUFBdkI7QUFDQSxhQUFLLGlCQUFMLEdBQXlCLElBQXpCOztBQUVBLGFBQUssS0FBTCxHQUFhLElBQWI7QUFDQSxhQUFLLE1BQUwsR0FBYyxJQUFkO0FBQ0EsYUFBSyxHQUFMLEdBQVcsSUFBWDtBQUNBLGFBQUssT0FBTCxHQUFlLElBQWY7QUFDQSxhQUFLLEtBQUwsR0FBYSxJQUFiO0FBQ0EsYUFBSyxTQUFMLEdBQWlCLElBQWpCO0FBQ0EsYUFBSyxZQUFMLEdBQW9CLElBQXBCO0FBQ0EsYUFBSyxNQUFMLEdBQWMsSUFBZDtBQUNBLGFBQUssTUFBTCxHQUFjLElBQWQ7O0FBRUEsYUFBSyxRQUFMLEdBQWdCLElBQWhCO0FBQ0EsYUFBSyxRQUFMLEdBQWdCLElBQWhCLENBekJVLENBeUJhO0FBQ3ZCLGFBQUssWUFBTCxHQUFvQixJQUFwQjtBQUNBLGFBQUssaUJBQUwsR0FBeUIsSUFBekI7QUFDQSxhQUFLLGNBQUwsR0FBc0IsSUFBdEI7QUFDSDs7OztxQ0FFWTtBQUNULGdCQUFJLG9CQUFxQixLQUFLLFFBQUwsS0FBa0IsS0FBbkIsSUFDQyxLQUFLLFFBQUwsS0FBa0IsSUFBbEIsSUFDQSxLQUFLLFVBQUwsSUFBbUIsSUFEbkIsSUFFQSxLQUFLLGVBQUwsSUFBd0IsSUFGeEIsSUFHQSxLQUFLLGlCQUFMLElBQTBCLElBSm5EOztBQU1BLGdCQUFJLG9CQUFxQixLQUFLLFFBQUwsS0FBa0IsS0FBbkIsSUFDQyxLQUFLLFFBQUwsS0FBa0IsSUFBbEIsSUFDQSxLQUFLLFVBQUwsSUFBbUIsSUFEbkIsSUFFQSxLQUFLLEtBQUwsSUFBYyxJQUZkLElBR0EsS0FBSyxNQUFMLElBQWUsSUFIZixJQUlBLEtBQUssR0FBTCxJQUFZLElBSlosSUFLQSxLQUFLLE9BQUwsSUFBZ0IsSUFMaEIsSUFNQSxLQUFLLEtBQUwsSUFBYyxJQU5kLElBT0EsS0FBSyxTQUFMLElBQWtCLElBUGxCLElBUUEsS0FBSyxZQUFMLElBQXFCLElBUnJCLElBU0EsS0FBSyxNQUFMLElBQWUsSUFUZixJQVVBLEtBQUssTUFBTCxJQUFlLElBWHhDOztBQWFBO0FBQ0EsbUJBQU8sS0FBSyxRQUFMLElBQWlCLElBQWpCLElBQ0EsS0FBSyxRQUFMLElBQWlCLElBRGpCLElBRUEsS0FBSyxRQUFMLElBQWlCLElBRmpCLElBR0EsS0FBSyxpQkFBTCxJQUEwQixJQUgxQixJQUlBLGlCQUpBLElBS0EsaUJBTFA7QUFNSDs7O3FDQUVZO0FBQ1QsbUJBQU8sS0FBSyxpQkFBTCxLQUEyQixJQUFsQztBQUNIOzs7MkNBRWtCLFksRUFBYztBQUM3QixnQkFBSSxLQUFLLGNBQUwsSUFBdUIsSUFBM0IsRUFBaUM7QUFDN0IsdUJBQU8sSUFBUDtBQUNIOztBQUVELGdCQUFJLFFBQVEsS0FBSyxjQUFqQjtBQUNBLGdCQUFJLGNBQWMsS0FBSyxPQUFMLENBQWEsTUFBTSxLQUFuQixFQUEwQixZQUExQixDQUFsQjs7QUFFQSxtQkFBTztBQUNILHVCQUFPLFdBREo7QUFFSCw4QkFBYyxNQUFNLEtBQU4sQ0FBWSxXQUFaLENBRlg7QUFHSCw4QkFBYyxNQUFNLGFBQU4sQ0FBb0IsV0FBcEI7QUFIWCxhQUFQO0FBS0g7OztnQ0FFTyxJLEVBQU0sSyxFQUFPO0FBQ2pCLGdCQUFJLE1BQU0sQ0FBVjs7QUFFQSxnQkFBSSxPQUFPLEtBQUssTUFBTCxHQUFjLENBQXpCO0FBQ0EsZ0JBQUksTUFBTSxDQUFWO0FBQ0EsZ0JBQUksU0FBUyxDQUFiO0FBQ0EsZ0JBQUksU0FBUyxJQUFiOztBQUVBLGdCQUFJLFFBQVEsS0FBSyxDQUFMLENBQVosRUFBcUI7QUFDakIsc0JBQU0sQ0FBTjtBQUNBLHlCQUFTLFNBQVMsQ0FBbEIsQ0FGaUIsQ0FFSztBQUN6Qjs7QUFFRCxtQkFBTyxVQUFVLE1BQWpCLEVBQXlCO0FBQ3JCLHNCQUFNLFNBQVMsS0FBSyxLQUFMLENBQVcsQ0FBQyxTQUFTLE1BQVYsSUFBb0IsQ0FBL0IsQ0FBZjtBQUNBLG9CQUFJLFFBQVEsSUFBUixJQUFpQixTQUFTLEtBQUssR0FBTCxDQUFULElBQXNCLFFBQVEsS0FBSyxNQUFNLENBQVgsQ0FBbkQsRUFBbUU7QUFDL0QsMEJBQU0sR0FBTjtBQUNBO0FBQ0gsaUJBSEQsTUFHTyxJQUFJLEtBQUssR0FBTCxJQUFZLEtBQWhCLEVBQXVCO0FBQzFCLDZCQUFTLE1BQU0sQ0FBZjtBQUNILGlCQUZNLE1BRUE7QUFDSCw2QkFBUyxNQUFNLENBQWY7QUFDSDtBQUNKOztBQUVELG1CQUFPLEdBQVA7QUFDSDs7Ozs7O2tCQUlVLFM7Ozs7Ozs7Ozs7Ozs7QUNqSWY7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTtJQUNhLFUsV0FBQSxVLEdBRVQsb0JBQVksR0FBWixFQUFpQixHQUFqQixFQUFzQixRQUF0QixFQUFnQyxXQUFoQyxFQUE2QyxNQUE3QyxFQUFxRDtBQUFBOztBQUNqRCxTQUFLLEdBQUwsR0FBVyxHQUFYO0FBQ0EsU0FBSyxHQUFMLEdBQVcsR0FBWDtBQUNBLFNBQUssUUFBTCxHQUFnQixRQUFoQjtBQUNBLFNBQUssV0FBTCxHQUFtQixXQUFuQjtBQUNBLFNBQUssV0FBTCxHQUFtQixNQUFuQjtBQUNBLFNBQUssWUFBTCxHQUFvQixJQUFwQjtBQUNILEM7O0FBSUw7QUFDQTs7O0lBQ2EsZ0IsV0FBQSxnQjtBQUVULGdDQUFjO0FBQUE7O0FBQ1YsYUFBSyxRQUFMLEdBQWdCLENBQWhCO0FBQ0EsYUFBSyxNQUFMLEdBQWMsQ0FBZDtBQUNBLGFBQUssUUFBTCxHQUFnQixDQUFoQjtBQUNBLGFBQUssTUFBTCxHQUFjLENBQWQ7QUFDQSxhQUFLLGdCQUFMLEdBQXdCLENBQXhCO0FBQ0EsYUFBSyxjQUFMLEdBQXNCLENBQXRCO0FBQ0EsYUFBSyxVQUFMLEdBQWtCLEVBQWxCLENBUFUsQ0FPZ0I7QUFDMUIsYUFBSyxXQUFMLEdBQW1CLElBQW5CLENBUlUsQ0FRZ0I7QUFDMUIsYUFBSyxVQUFMLEdBQWtCLElBQWxCLENBVFUsQ0FTZ0I7QUFDN0I7Ozs7d0NBRWUsVSxFQUFZO0FBQUc7QUFDM0IsdUJBQVcsV0FBWCxHQUF5QixJQUF6QjtBQUNBLGlCQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBcUIsVUFBckI7QUFDSDs7Ozs7O0FBSUw7OztJQUNhLGEsV0FBQSxhO0FBRVQsNkJBQWM7QUFBQTs7QUFDVixhQUFLLEtBQUwsR0FBYSxFQUFiO0FBQ0g7Ozs7Z0NBRU87QUFDSixpQkFBSyxLQUFMLEdBQWEsRUFBYjtBQUNIOzs7b0NBRVcsVSxFQUFZO0FBQ3BCLGdCQUFJLE9BQU8sS0FBSyxLQUFoQjs7QUFFQSxnQkFBSSxXQUFXLE1BQVgsS0FBc0IsQ0FBMUIsRUFBNkI7QUFDekI7QUFDSDs7QUFFRCxnQkFBSSxLQUFLLE1BQUwsR0FBYyxDQUFkLElBQW1CLFdBQVcsQ0FBWCxFQUFjLFdBQWQsR0FBNEIsS0FBSyxLQUFLLE1BQUwsR0FBYyxDQUFuQixFQUFzQixXQUF6RSxFQUFzRjtBQUNsRixxQkFBSyxLQUFMO0FBQ0g7O0FBRUQsa0JBQU0sU0FBTixDQUFnQixJQUFoQixDQUFxQixLQUFyQixDQUEyQixJQUEzQixFQUFpQyxVQUFqQztBQUNIOzs7a0RBRXlCLEcsRUFBSztBQUMzQixnQkFBSSxLQUFLLEtBQUwsQ0FBVyxNQUFYLElBQXFCLENBQXpCLEVBQTRCO0FBQ3hCLHVCQUFPLElBQVA7QUFDSDs7QUFFRCxnQkFBSSxPQUFPLEtBQUssS0FBaEI7QUFDQSxnQkFBSSxNQUFNLENBQVY7QUFDQSxnQkFBSSxPQUFPLEtBQUssTUFBTCxHQUFjLENBQXpCO0FBQ0EsZ0JBQUksTUFBTSxDQUFWO0FBQ0EsZ0JBQUksU0FBUyxDQUFiO0FBQ0EsZ0JBQUksU0FBUyxJQUFiOztBQUVBLGdCQUFJLE1BQU0sS0FBSyxDQUFMLEVBQVEsR0FBbEIsRUFBdUI7QUFDbkIsc0JBQU0sQ0FBTjtBQUNBLHlCQUFTLFNBQVMsQ0FBbEI7QUFDSDs7QUFFRCxtQkFBTyxVQUFVLE1BQWpCLEVBQXlCO0FBQ3JCLHNCQUFNLFNBQVMsS0FBSyxLQUFMLENBQVcsQ0FBQyxTQUFTLE1BQVYsSUFBb0IsQ0FBL0IsQ0FBZjtBQUNBLG9CQUFJLFFBQVEsSUFBUixJQUFpQixPQUFPLEtBQUssR0FBTCxFQUFVLEdBQWpCLElBQXdCLE1BQU0sS0FBSyxNQUFNLENBQVgsRUFBYyxHQUFqRSxFQUF1RTtBQUNuRSwwQkFBTSxHQUFOO0FBQ0E7QUFDSCxpQkFIRCxNQUdPLElBQUksS0FBSyxHQUFMLEVBQVUsR0FBVixHQUFnQixHQUFwQixFQUF5QjtBQUM1Qiw2QkFBUyxNQUFNLENBQWY7QUFDSCxpQkFGTSxNQUVBO0FBQ0gsNkJBQVMsTUFBTSxDQUFmO0FBQ0g7QUFDSjtBQUNELG1CQUFPLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBUDtBQUNIOzs7Ozs7QUFJTDs7O0lBQ2Esb0IsV0FBQSxvQjtBQUVULGtDQUFZLElBQVosRUFBa0I7QUFBQTs7QUFDZCxhQUFLLEtBQUwsR0FBYSxJQUFiO0FBQ0EsYUFBSyxLQUFMLEdBQWEsRUFBYjtBQUNBLGFBQUssbUJBQUwsR0FBMkIsQ0FBQyxDQUE1QixDQUhjLENBR2tCO0FBQ25DOzs7O2tDQVVTO0FBQ04sbUJBQU8sS0FBSyxLQUFMLENBQVcsTUFBWCxLQUFzQixDQUE3QjtBQUNIOzs7Z0NBRU87QUFDSixpQkFBSyxLQUFMLEdBQWEsRUFBYjtBQUNBLGlCQUFLLG1CQUFMLEdBQTJCLENBQUMsQ0FBNUI7QUFDSDs7O29EQUUyQixnQixFQUFrQjtBQUMxQyxnQkFBSSxPQUFPLEtBQUssS0FBaEI7QUFDQSxnQkFBSSxLQUFLLE1BQUwsS0FBZ0IsQ0FBcEIsRUFBdUI7QUFDbkIsdUJBQU8sQ0FBQyxDQUFSO0FBQ0g7QUFDRCxnQkFBSSxPQUFPLEtBQUssTUFBTCxHQUFjLENBQXpCO0FBQ0EsZ0JBQUksTUFBTSxDQUFWO0FBQ0EsZ0JBQUksU0FBUyxDQUFiO0FBQ0EsZ0JBQUksU0FBUyxJQUFiOztBQUVBLGdCQUFJLE1BQU0sQ0FBVjs7QUFFQSxnQkFBSSxtQkFBbUIsS0FBSyxDQUFMLEVBQVEsZ0JBQS9CLEVBQWlEO0FBQzdDLHNCQUFNLENBQUMsQ0FBUDtBQUNBLHVCQUFPLEdBQVA7QUFDSDs7QUFFRCxtQkFBTyxVQUFVLE1BQWpCLEVBQXlCO0FBQ3JCLHNCQUFNLFNBQVMsS0FBSyxLQUFMLENBQVcsQ0FBQyxTQUFTLE1BQVYsSUFBb0IsQ0FBL0IsQ0FBZjtBQUNBLG9CQUFJLFFBQVEsSUFBUixJQUFpQixtQkFBbUIsS0FBSyxHQUFMLEVBQVUsVUFBVixDQUFxQixXQUF4QyxJQUNBLG1CQUFtQixLQUFLLE1BQU0sQ0FBWCxFQUFjLGdCQUR0RCxFQUMwRTtBQUN0RSwwQkFBTSxHQUFOO0FBQ0E7QUFDSCxpQkFKRCxNQUlPLElBQUksS0FBSyxHQUFMLEVBQVUsZ0JBQVYsR0FBNkIsZ0JBQWpDLEVBQW1EO0FBQ3RELDZCQUFTLE1BQU0sQ0FBZjtBQUNILGlCQUZNLE1BRUE7QUFDSCw2QkFBUyxNQUFNLENBQWY7QUFDSDtBQUNKO0FBQ0QsbUJBQU8sR0FBUDtBQUNIOzs7bURBRTBCLGdCLEVBQWtCO0FBQ3pDLG1CQUFPLEtBQUssMkJBQUwsQ0FBaUMsZ0JBQWpDLElBQXFELENBQTVEO0FBQ0g7OzsrQkFFTSxnQixFQUFrQjtBQUNyQixnQkFBSSxPQUFPLEtBQUssS0FBaEI7QUFDQSxnQkFBSSxNQUFNLGdCQUFWO0FBQ0EsZ0JBQUksZ0JBQWdCLEtBQUssbUJBQXpCO0FBQ0EsZ0JBQUksWUFBWSxDQUFoQjs7QUFFQSxnQkFBSSxrQkFBa0IsQ0FBQyxDQUFuQixJQUF3QixnQkFBZ0IsS0FBSyxNQUE3QyxJQUN3QixJQUFJLGdCQUFKLElBQXdCLEtBQUssYUFBTCxFQUFvQixVQUFwQixDQUErQixXQUQvRSxLQUUwQixrQkFBa0IsS0FBSyxNQUFMLEdBQWMsQ0FBakMsSUFDQSxnQkFBZ0IsS0FBSyxNQUFMLEdBQWMsQ0FBOUIsSUFDRCxJQUFJLGdCQUFKLEdBQXVCLEtBQUssZ0JBQWdCLENBQXJCLEVBQXdCLGdCQUp2RSxDQUFKLEVBSStGO0FBQzNGLDRCQUFZLGdCQUFnQixDQUE1QixDQUQyRixDQUMzRDtBQUNuQyxhQU5ELE1BTU87QUFDSCxvQkFBSSxLQUFLLE1BQUwsR0FBYyxDQUFsQixFQUFxQjtBQUNqQixnQ0FBWSxLQUFLLDJCQUFMLENBQWlDLElBQUksZ0JBQXJDLElBQXlELENBQXJFO0FBQ0g7QUFDSjs7QUFFRCxpQkFBSyxtQkFBTCxHQUEyQixTQUEzQjtBQUNBLGlCQUFLLEtBQUwsQ0FBVyxNQUFYLENBQWtCLFNBQWxCLEVBQTZCLENBQTdCLEVBQWdDLEdBQWhDO0FBQ0g7Ozs2Q0FFb0IsZ0IsRUFBa0I7QUFDbkMsZ0JBQUksTUFBTSxLQUFLLDJCQUFMLENBQWlDLGdCQUFqQyxDQUFWO0FBQ0EsZ0JBQUksT0FBTyxDQUFYLEVBQWM7QUFDVix1QkFBTyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQVA7QUFDSCxhQUZELE1BRU87QUFBRztBQUNOLHVCQUFPLElBQVA7QUFDSDtBQUNKOzs7NENBRW1CLGdCLEVBQWtCO0FBQ2xDLGdCQUFJLFVBQVUsS0FBSyxvQkFBTCxDQUEwQixnQkFBMUIsQ0FBZDtBQUNBLGdCQUFJLFdBQVcsSUFBZixFQUFxQjtBQUNqQix1QkFBTyxRQUFRLFVBQWY7QUFDSCxhQUZELE1BRU87QUFDSCx1QkFBTyxJQUFQO0FBQ0g7QUFDSjs7OytDQUVzQixnQixFQUFrQjtBQUNyQyxnQkFBSSxhQUFhLEtBQUssMkJBQUwsQ0FBaUMsZ0JBQWpDLENBQWpCO0FBQ0EsZ0JBQUksYUFBYSxLQUFLLEtBQUwsQ0FBVyxVQUFYLEVBQXVCLFVBQXhDO0FBQ0EsbUJBQU8sV0FBVyxNQUFYLEtBQXNCLENBQXRCLElBQTJCLGFBQWEsQ0FBL0MsRUFBa0Q7QUFDOUM7QUFDQSw2QkFBYSxLQUFLLEtBQUwsQ0FBVyxVQUFYLEVBQXVCLFVBQXBDO0FBQ0g7QUFDRCxnQkFBSSxXQUFXLE1BQVgsR0FBb0IsQ0FBeEIsRUFBMkI7QUFDdkIsdUJBQU8sV0FBVyxXQUFXLE1BQVgsR0FBb0IsQ0FBL0IsQ0FBUDtBQUNILGFBRkQsTUFFTztBQUNILHVCQUFPLElBQVA7QUFDSDtBQUNKOzs7NEJBekdVO0FBQ1AsbUJBQU8sS0FBSyxLQUFaO0FBQ0g7Ozs0QkFFWTtBQUNULG1CQUFPLEtBQUssS0FBTCxDQUFXLE1BQWxCO0FBQ0g7Ozs7Ozs7Ozs7Ozs7cWpCQ2hJTDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVBO0lBQ00sYTtBQUVGLDJCQUFZLE1BQVosRUFBb0I7QUFBQTs7QUFDaEIsYUFBSyxHQUFMLEdBQVcsZUFBWDs7QUFFQSxhQUFLLE9BQUwsR0FBZSxNQUFmO0FBQ0EsYUFBSyxRQUFMLEdBQWdCLHNCQUFoQjs7QUFFQSxZQUFJLEtBQUssT0FBTCxDQUFhLE1BQWIsSUFBdUIsS0FBSyxPQUFMLENBQWEsdUJBQWIsSUFBd0MsU0FBbkUsRUFBOEU7QUFDMUU7QUFDQSxpQkFBSyxPQUFMLENBQWEsdUJBQWIsR0FBdUMsSUFBdkM7QUFDSDs7QUFFRCxhQUFLLENBQUwsR0FBUztBQUNMLDBCQUFjLEtBQUssYUFBTCxDQUFtQixJQUFuQixDQUF3QixJQUF4QixDQURUO0FBRUwsMkJBQWUsS0FBSyxjQUFMLENBQW9CLElBQXBCLENBQXlCLElBQXpCLENBRlY7QUFHTCwyQkFBZSxLQUFLLGNBQUwsQ0FBb0IsSUFBcEIsQ0FBeUIsSUFBekIsQ0FIVjtBQUlMLGlDQUFxQixLQUFLLG9CQUFMLENBQTBCLElBQTFCLENBQStCLElBQS9CLENBSmhCO0FBS0wscUNBQXlCLEtBQUssd0JBQUwsQ0FBOEIsSUFBOUIsQ0FBbUMsSUFBbkM7QUFMcEIsU0FBVDs7QUFRQSxhQUFLLFlBQUwsR0FBb0IsSUFBcEI7QUFDQSxhQUFLLHFCQUFMLEdBQTZCLElBQTdCO0FBQ0EsYUFBSyxhQUFMLEdBQXFCLElBQXJCOztBQUVBLGFBQUssYUFBTCxHQUFxQixLQUFyQjtBQUNBLGFBQUssY0FBTCxHQUFzQixLQUF0Qjs7QUFFQSxhQUFLLHdCQUFMLEdBQWdDLEtBQWhDO0FBQ0EsYUFBSyxxQkFBTCxHQUE2QixDQUE3Qjs7QUFFQSxhQUFLLHdCQUFMLEdBQWdDLEVBQWhDO0FBQ0EsYUFBSyxVQUFMLEdBQWtCO0FBQ2QsbUJBQU8sSUFETztBQUVkLG1CQUFPO0FBRk8sU0FBbEI7QUFJQSxhQUFLLGNBQUwsR0FBc0I7QUFDbEIsbUJBQU8sSUFEVztBQUVsQixtQkFBTztBQUZXLFNBQXRCO0FBSUEsYUFBSyxpQkFBTCxHQUF5QjtBQUNyQixtQkFBTyxJQURjO0FBRXJCLG1CQUFPO0FBRmMsU0FBekI7QUFJQSxhQUFLLGdCQUFMLEdBQXdCO0FBQ3BCLG1CQUFPLEVBRGE7QUFFcEIsbUJBQU87QUFGYSxTQUF4QjtBQUlBLGFBQUssb0JBQUwsR0FBNEI7QUFDeEIsbUJBQU8sRUFEaUI7QUFFeEIsbUJBQU87QUFGaUIsU0FBNUI7QUFJQSxhQUFLLFFBQUwsR0FBZ0IscUNBQWhCO0FBQ0g7Ozs7a0NBRVM7QUFDTixnQkFBSSxLQUFLLGFBQUwsSUFBc0IsS0FBSyxZQUEvQixFQUE2QztBQUN6QyxxQkFBSyxrQkFBTDtBQUNIO0FBQ0QsaUJBQUssQ0FBTCxHQUFTLElBQVQ7QUFDQSxpQkFBSyxRQUFMLENBQWMsa0JBQWQ7QUFDQSxpQkFBSyxRQUFMLEdBQWdCLElBQWhCO0FBQ0g7OzsyQkFFRSxLLEVBQU8sUSxFQUFVO0FBQ2hCLGlCQUFLLFFBQUwsQ0FBYyxXQUFkLENBQTBCLEtBQTFCLEVBQWlDLFFBQWpDO0FBQ0g7Ozs0QkFFRyxLLEVBQU8sUSxFQUFVO0FBQ2pCLGlCQUFLLFFBQUwsQ0FBYyxjQUFkLENBQTZCLEtBQTdCLEVBQW9DLFFBQXBDO0FBQ0g7OzsyQ0FFa0IsWSxFQUFjO0FBQzdCLGdCQUFJLEtBQUssWUFBVCxFQUF1QjtBQUNuQixzQkFBTSxxQ0FBMEIsdURBQTFCLENBQU47QUFDSDtBQUNELGdCQUFJLEtBQUssS0FBSyxZQUFMLEdBQW9CLElBQUksT0FBTyxXQUFYLEVBQTdCO0FBQ0EsZUFBRyxnQkFBSCxDQUFvQixZQUFwQixFQUFrQyxLQUFLLENBQUwsQ0FBTyxZQUF6QztBQUNBLGVBQUcsZ0JBQUgsQ0FBb0IsYUFBcEIsRUFBbUMsS0FBSyxDQUFMLENBQU8sYUFBMUM7QUFDQSxlQUFHLGdCQUFILENBQW9CLGFBQXBCLEVBQW1DLEtBQUssQ0FBTCxDQUFPLGFBQTFDOztBQUVBLGlCQUFLLGFBQUwsR0FBcUIsWUFBckI7QUFDQSxpQkFBSyxxQkFBTCxHQUE2QixPQUFPLEdBQVAsQ0FBVyxlQUFYLENBQTJCLEtBQUssWUFBaEMsQ0FBN0I7QUFDQSx5QkFBYSxHQUFiLEdBQW1CLEtBQUsscUJBQXhCO0FBQ0g7Ozs2Q0FFb0I7QUFDakIsZ0JBQUksS0FBSyxZQUFULEVBQXVCO0FBQ25CLG9CQUFJLEtBQUssS0FBSyxZQUFkO0FBQ0EscUJBQUssSUFBSSxJQUFULElBQWlCLEtBQUssY0FBdEIsRUFBc0M7QUFDbEM7QUFDQSx3QkFBSSxLQUFLLEtBQUssZ0JBQUwsQ0FBc0IsSUFBdEIsQ0FBVDtBQUNBLHVCQUFHLE1BQUgsQ0FBVSxDQUFWLEVBQWEsR0FBRyxNQUFoQjtBQUNBLHlCQUFLLGdCQUFMLENBQXNCLElBQXRCLElBQThCLElBQTlCO0FBQ0EseUJBQUssb0JBQUwsQ0FBMEIsSUFBMUIsSUFBa0MsSUFBbEM7QUFDQSx5QkFBSyxpQkFBTCxDQUF1QixJQUF2QixJQUErQixJQUEvQjs7QUFFQTtBQUNBLHdCQUFJLEtBQUssS0FBSyxjQUFMLENBQW9CLElBQXBCLENBQVQ7QUFDQSx3QkFBSSxFQUFKLEVBQVE7QUFDSiw0QkFBSSxHQUFHLFVBQUgsS0FBa0IsUUFBdEIsRUFBZ0M7QUFDNUI7QUFDQSxnQ0FBSTtBQUNBLG1DQUFHLGtCQUFILENBQXNCLEVBQXRCO0FBQ0gsNkJBRkQsQ0FFRSxPQUFPLEtBQVAsRUFBYztBQUNaLGlEQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0IsTUFBTSxPQUF0QjtBQUNIO0FBQ0QsK0JBQUcsbUJBQUgsQ0FBdUIsT0FBdkIsRUFBZ0MsS0FBSyxDQUFMLENBQU8sbUJBQXZDO0FBQ0EsK0JBQUcsbUJBQUgsQ0FBdUIsV0FBdkIsRUFBb0MsS0FBSyxDQUFMLENBQU8sdUJBQTNDO0FBQ0g7QUFDRCw2QkFBSyxVQUFMLENBQWdCLElBQWhCLElBQXdCLElBQXhCO0FBQ0EsNkJBQUssY0FBTCxDQUFvQixJQUFwQixJQUE0QixJQUE1QjtBQUNIO0FBQ0o7QUFDRCxvQkFBSSxHQUFHLFVBQUgsS0FBa0IsTUFBdEIsRUFBOEI7QUFDMUIsd0JBQUk7QUFDQSwyQkFBRyxXQUFIO0FBQ0gscUJBRkQsQ0FFRSxPQUFPLEtBQVAsRUFBYztBQUNaLHlDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0IsTUFBTSxPQUF0QjtBQUNIO0FBQ0o7QUFDRCxtQkFBRyxtQkFBSCxDQUF1QixZQUF2QixFQUFxQyxLQUFLLENBQUwsQ0FBTyxZQUE1QztBQUNBLG1CQUFHLG1CQUFILENBQXVCLGFBQXZCLEVBQXNDLEtBQUssQ0FBTCxDQUFPLGFBQTdDO0FBQ0EsbUJBQUcsbUJBQUgsQ0FBdUIsYUFBdkIsRUFBc0MsS0FBSyxDQUFMLENBQU8sYUFBN0M7QUFDQSxxQkFBSyx3QkFBTCxHQUFnQyxFQUFoQztBQUNBLHFCQUFLLGFBQUwsR0FBcUIsS0FBckI7QUFDQSxxQkFBSyxRQUFMLENBQWMsS0FBZDtBQUNBLHFCQUFLLFlBQUwsR0FBb0IsSUFBcEI7QUFDSDs7QUFFRCxnQkFBSSxLQUFLLGFBQVQsRUFBd0I7QUFDcEIscUJBQUssYUFBTCxDQUFtQixHQUFuQixHQUF5QixFQUF6QjtBQUNBLHFCQUFLLGFBQUwsQ0FBbUIsZUFBbkIsQ0FBbUMsS0FBbkM7QUFDQSxxQkFBSyxhQUFMLEdBQXFCLElBQXJCO0FBQ0g7QUFDRCxnQkFBSSxLQUFLLHFCQUFULEVBQWdDO0FBQzVCLHVCQUFPLEdBQVAsQ0FBVyxlQUFYLENBQTJCLEtBQUsscUJBQWhDO0FBQ0EscUJBQUsscUJBQUwsR0FBNkIsSUFBN0I7QUFDSDtBQUNKOzs7MENBRWlCLFcsRUFBYSxRLEVBQVU7QUFDckMsZ0JBQUksQ0FBQyxLQUFLLFlBQU4sSUFBc0IsS0FBSyxZQUFMLENBQWtCLFVBQWxCLEtBQWlDLE1BQTNELEVBQW1FO0FBQy9EO0FBQ0E7QUFDQSxxQkFBSyx3QkFBTCxDQUE4QixJQUE5QixDQUFtQyxXQUFuQztBQUNBO0FBQ0EscUJBQUssZ0JBQUwsQ0FBc0IsWUFBWSxJQUFsQyxFQUF3QyxJQUF4QyxDQUE2QyxXQUE3QztBQUNBO0FBQ0g7O0FBRUQsZ0JBQUksS0FBSyxXQUFUO0FBQ0EsZ0JBQUksZ0JBQWMsR0FBRyxTQUFyQjtBQUNBLGdCQUFJLEdBQUcsS0FBSCxJQUFZLEdBQUcsS0FBSCxDQUFTLE1BQVQsR0FBa0IsQ0FBbEMsRUFBcUM7QUFDakMseUNBQXVCLEdBQUcsS0FBMUI7QUFDSDs7QUFFRCxnQkFBSSxtQkFBbUIsS0FBdkI7O0FBRUEsNkJBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxFQUFnQixnREFBZ0QsUUFBaEU7QUFDQSxpQkFBSyxpQkFBTCxDQUF1QixHQUFHLElBQTFCLElBQWtDLEVBQWxDOztBQUVBLGdCQUFJLGFBQWEsS0FBSyxVQUFMLENBQWdCLEdBQUcsSUFBbkIsQ0FBakIsRUFBMkM7QUFDdkMsb0JBQUksQ0FBQyxLQUFLLFVBQUwsQ0FBZ0IsR0FBRyxJQUFuQixDQUFMLEVBQStCO0FBQUc7QUFDOUIsdUNBQW1CLElBQW5CO0FBQ0Esd0JBQUk7QUFDQSw0QkFBSSxLQUFLLEtBQUssY0FBTCxDQUFvQixHQUFHLElBQXZCLElBQStCLEtBQUssWUFBTCxDQUFrQixlQUFsQixDQUFrQyxRQUFsQyxDQUF4QztBQUNBLDJCQUFHLGdCQUFILENBQW9CLE9BQXBCLEVBQTZCLEtBQUssQ0FBTCxDQUFPLG1CQUFwQztBQUNBLDJCQUFHLGdCQUFILENBQW9CLFdBQXBCLEVBQWlDLEtBQUssQ0FBTCxDQUFPLHVCQUF4QztBQUNILHFCQUpELENBSUUsT0FBTyxLQUFQLEVBQWM7QUFDWix5Q0FBSSxDQUFKLENBQU0sS0FBSyxHQUFYLEVBQWdCLE1BQU0sT0FBdEI7QUFDQSw2QkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQixvQkFBVSxLQUE3QixFQUFvQyxFQUFDLE1BQU0sTUFBTSxJQUFiLEVBQW1CLEtBQUssTUFBTSxPQUE5QixFQUFwQztBQUNBO0FBQ0g7QUFDSixpQkFYRCxNQVdPO0FBQ0gscUNBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxlQUEyQixHQUFHLElBQTlCLG1DQUFnRSxLQUFLLFVBQUwsQ0FBZ0IsR0FBRyxJQUFuQixDQUFoRSxrQkFBcUcsUUFBckc7QUFDSDtBQUNELHFCQUFLLFVBQUwsQ0FBZ0IsR0FBRyxJQUFuQixJQUEyQixRQUEzQjtBQUNIOztBQUVELGdCQUFJLENBQUMsUUFBTCxFQUFlO0FBQ1g7QUFDQSxxQkFBSyxnQkFBTCxDQUFzQixHQUFHLElBQXpCLEVBQStCLElBQS9CLENBQW9DLEVBQXBDO0FBQ0g7QUFDRCxnQkFBSSxDQUFDLGdCQUFMLEVBQXVCO0FBQUc7QUFDdEIsb0JBQUksS0FBSyxjQUFMLENBQW9CLEdBQUcsSUFBdkIsS0FBZ0MsQ0FBQyxLQUFLLGNBQUwsQ0FBb0IsR0FBRyxJQUF2QixFQUE2QixRQUFsRSxFQUE0RTtBQUN4RSx5QkFBSyxpQkFBTDtBQUNIO0FBQ0o7QUFDRCxnQkFBSSxrQkFBUSxNQUFSLElBQWtCLEdBQUcsU0FBSCxLQUFpQixZQUFuQyxJQUFtRCxHQUFHLGFBQUgsR0FBbUIsQ0FBMUUsRUFBNkU7QUFDekU7QUFDQTtBQUNBLHFCQUFLLHdCQUFMLEdBQWdDLElBQWhDO0FBQ0EscUJBQUsscUJBQUwsR0FBNkIsR0FBRyxhQUFILEdBQW1CLElBQWhELENBSnlFLENBSWxCO0FBQ3ZELHFCQUFLLDBCQUFMO0FBQ0g7QUFDSjs7OzJDQUVrQixZLEVBQWM7QUFDN0IsZ0JBQUksS0FBSyxZQUFUO0FBQ0EsaUJBQUssZ0JBQUwsQ0FBc0IsR0FBRyxJQUF6QixFQUErQixJQUEvQixDQUFvQyxFQUFwQzs7QUFFQSxnQkFBSSxLQUFLLE9BQUwsQ0FBYSx1QkFBYixJQUF3QyxLQUFLLHdCQUFMLEVBQTVDLEVBQTZFO0FBQ3pFLHFCQUFLLHNCQUFMO0FBQ0g7O0FBRUQsZ0JBQUksS0FBSyxLQUFLLGNBQUwsQ0FBb0IsR0FBRyxJQUF2QixDQUFUO0FBQ0EsZ0JBQUksTUFBTSxDQUFDLEdBQUcsUUFBVixJQUFzQixDQUFDLEtBQUssdUJBQUwsRUFBM0IsRUFBMkQ7QUFDdkQscUJBQUssaUJBQUw7QUFDSDtBQUNKOzs7NkJBRUksTyxFQUFTO0FBQ1Y7QUFDQSxpQkFBSyxJQUFJLElBQVQsSUFBaUIsS0FBSyxjQUF0QixFQUFzQztBQUNsQyxvQkFBSSxDQUFDLEtBQUssY0FBTCxDQUFvQixJQUFwQixDQUFMLEVBQWdDO0FBQzVCO0FBQ0g7O0FBRUQ7QUFDQSxvQkFBSSxLQUFLLEtBQUssY0FBTCxDQUFvQixJQUFwQixDQUFUO0FBQ0Esb0JBQUksS0FBSyxZQUFMLENBQWtCLFVBQWxCLEtBQWlDLE1BQXJDLEVBQTZDO0FBQ3pDLHdCQUFJO0FBQ0E7QUFDQTtBQUNBLDJCQUFHLEtBQUg7QUFDSCxxQkFKRCxDQUlFLE9BQU8sS0FBUCxFQUFjO0FBQ1oseUNBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxFQUFnQixNQUFNLE9BQXRCO0FBQ0g7QUFDSjs7QUFFRDtBQUNBLHFCQUFLLFFBQUwsQ0FBYyxLQUFkOztBQUVBO0FBQ0Esb0JBQUksS0FBSyxLQUFLLGdCQUFMLENBQXNCLElBQXRCLENBQVQ7QUFDQSxtQkFBRyxNQUFILENBQVUsQ0FBVixFQUFhLEdBQUcsTUFBaEI7O0FBRUEsb0JBQUksS0FBSyxZQUFMLENBQWtCLFVBQWxCLEtBQWlDLFFBQXJDLEVBQStDO0FBQzNDO0FBQ0E7QUFDSDs7QUFFRDtBQUNBLHFCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksR0FBRyxRQUFILENBQVksTUFBaEMsRUFBd0MsR0FBeEMsRUFBNkM7QUFDekMsd0JBQUksUUFBUSxHQUFHLFFBQUgsQ0FBWSxLQUFaLENBQWtCLENBQWxCLENBQVo7QUFDQSx3QkFBSSxNQUFNLEdBQUcsUUFBSCxDQUFZLEdBQVosQ0FBZ0IsQ0FBaEIsQ0FBVjtBQUNBLHlCQUFLLG9CQUFMLENBQTBCLElBQTFCLEVBQWdDLElBQWhDLENBQXFDLEVBQUMsWUFBRCxFQUFRLFFBQVIsRUFBckM7QUFDSDs7QUFFRDtBQUNBLG9CQUFJLENBQUMsR0FBRyxRQUFSLEVBQWtCO0FBQ2QseUJBQUssZUFBTDtBQUNIOztBQUVEO0FBQ0E7QUFDQTtBQUNBLG9CQUFJLGtCQUFRLE1BQVosRUFBb0I7QUFDaEIsd0JBQUksa0JBQWtCLEtBQUssaUJBQUwsQ0FBdUIsSUFBdkIsQ0FBdEI7QUFDQSx3QkFBSSxlQUFKLEVBQXFCO0FBQ2pCLDZCQUFLLGdCQUFMLENBQXNCLElBQXRCLEVBQTRCLElBQTVCLENBQWlDLGVBQWpDO0FBQ0EsNEJBQUksQ0FBQyxHQUFHLFFBQVIsRUFBa0I7QUFDZCxpQ0FBSyxpQkFBTDtBQUNIO0FBQ0o7QUFDSjtBQUNKO0FBQ0o7OztzQ0FFYTtBQUNWLGdCQUFJLEtBQUssS0FBSyxZQUFkO0FBQ0EsZ0JBQUksS0FBSyxLQUFLLGNBQWQ7QUFDQSxnQkFBSSxDQUFDLEVBQUQsSUFBTyxHQUFHLFVBQUgsS0FBa0IsTUFBN0IsRUFBcUM7QUFDakMsb0JBQUksTUFBTSxHQUFHLFVBQUgsS0FBa0IsUUFBeEIsSUFBb0MsS0FBSyxtQkFBTCxFQUF4QyxFQUFvRTtBQUNoRTtBQUNBO0FBQ0EseUJBQUssY0FBTCxHQUFzQixJQUF0QjtBQUNIO0FBQ0Q7QUFDSDtBQUNELGdCQUFJLEdBQUcsS0FBSCxJQUFZLEdBQUcsS0FBSCxDQUFTLFFBQXJCLElBQWlDLEdBQUcsS0FBSCxJQUFZLEdBQUcsS0FBSCxDQUFTLFFBQTFELEVBQW9FO0FBQ2hFO0FBQ0E7QUFDQSxxQkFBSyxjQUFMLEdBQXNCLElBQXRCO0FBQ0gsYUFKRCxNQUlPO0FBQ0gscUJBQUssY0FBTCxHQUFzQixLQUF0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFHLFdBQUg7QUFDSDtBQUNKOzs7MkNBRWtCLEcsRUFBSztBQUNwQixtQkFBTyxLQUFLLFFBQUwsQ0FBYyx5QkFBZCxDQUF3QyxHQUF4QyxDQUFQO0FBQ0g7OzttREFFMEI7QUFDdkIsZ0JBQUksQ0FBQyxLQUFLLE9BQUwsQ0FBYSx1QkFBbEIsRUFBMkM7QUFDdkMsdUJBQU8sS0FBUDtBQUNIOztBQUVELGdCQUFJLGNBQWMsS0FBSyxhQUFMLENBQW1CLFdBQXJDOztBQUVBLGlCQUFLLElBQUksSUFBVCxJQUFpQixLQUFLLGNBQXRCLEVBQXNDO0FBQ2xDLG9CQUFJLEtBQUssS0FBSyxjQUFMLENBQW9CLElBQXBCLENBQVQ7QUFDQSxvQkFBSSxFQUFKLEVBQVE7QUFDSix3QkFBSSxXQUFXLEdBQUcsUUFBbEI7QUFDQSx3QkFBSSxTQUFTLE1BQVQsSUFBbUIsQ0FBdkIsRUFBMEI7QUFDdEIsNEJBQUksY0FBYyxTQUFTLEtBQVQsQ0FBZSxDQUFmLENBQWQsSUFBbUMsS0FBSyxPQUFMLENBQWEsOEJBQXBELEVBQW9GO0FBQ2hGLG1DQUFPLElBQVA7QUFDSDtBQUNKO0FBQ0o7QUFDSjs7QUFFRCxtQkFBTyxLQUFQO0FBQ0g7OztpREFFd0I7QUFDckIsZ0JBQUksY0FBYyxLQUFLLGFBQUwsQ0FBbUIsV0FBckM7O0FBRUEsaUJBQUssSUFBSSxJQUFULElBQWlCLEtBQUssY0FBdEIsRUFBc0M7QUFDbEMsb0JBQUksS0FBSyxLQUFLLGNBQUwsQ0FBb0IsSUFBcEIsQ0FBVDtBQUNBLG9CQUFJLEVBQUosRUFBUTtBQUNKLHdCQUFJLFdBQVcsR0FBRyxRQUFsQjtBQUNBLHdCQUFJLFdBQVcsS0FBZjs7QUFFQSx5QkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFNBQVMsTUFBN0IsRUFBcUMsR0FBckMsRUFBMEM7QUFDdEMsNEJBQUksUUFBUSxTQUFTLEtBQVQsQ0FBZSxDQUFmLENBQVo7QUFDQSw0QkFBSSxNQUFNLFNBQVMsR0FBVCxDQUFhLENBQWIsQ0FBVjs7QUFFQSw0QkFBSSxTQUFTLFdBQVQsSUFBd0IsY0FBYyxNQUFNLENBQWhELEVBQW1EO0FBQUc7QUFDbEQsZ0NBQUksY0FBYyxLQUFkLElBQXVCLEtBQUssT0FBTCxDQUFhLDhCQUF4QyxFQUF3RTtBQUNwRSwyQ0FBVyxJQUFYO0FBQ0Esb0NBQUksWUFBWSxjQUFjLEtBQUssT0FBTCxDQUFhLDhCQUEzQztBQUNBLHFDQUFLLG9CQUFMLENBQTBCLElBQTFCLEVBQWdDLElBQWhDLENBQXFDLEVBQUMsT0FBTyxLQUFSLEVBQWUsS0FBSyxTQUFwQixFQUFyQztBQUNIO0FBQ0oseUJBTkQsTUFNTyxJQUFJLE1BQU0sV0FBVixFQUF1QjtBQUMxQix1Q0FBVyxJQUFYO0FBQ0EsaUNBQUssb0JBQUwsQ0FBMEIsSUFBMUIsRUFBZ0MsSUFBaEMsQ0FBcUMsRUFBQyxPQUFPLEtBQVIsRUFBZSxLQUFLLEdBQXBCLEVBQXJDO0FBQ0g7QUFDSjs7QUFFRCx3QkFBSSxZQUFZLENBQUMsR0FBRyxRQUFwQixFQUE4QjtBQUMxQiw2QkFBSyxlQUFMO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7OztxREFFNEI7QUFDekIsZ0JBQUksS0FBSyxLQUFLLGNBQWQ7QUFDQSxnQkFBSSxLQUFLLGFBQUwsQ0FBbUIsVUFBbkIsS0FBa0MsQ0FBbEMsSUFBdUMsS0FBSyxZQUFMLENBQWtCLFVBQWxCLEtBQWlDLE1BQTVFLEVBQW9GO0FBQ2hGO0FBQ0g7QUFDRCxnQkFBSyxHQUFHLEtBQUgsSUFBWSxHQUFHLEtBQUgsQ0FBUyxRQUF0QixJQUFvQyxHQUFHLEtBQUgsSUFBWSxHQUFHLEtBQUgsQ0FBUyxRQUE3RCxFQUF3RTtBQUNwRTtBQUNIOztBQUVELGdCQUFJLFVBQVUsS0FBSyxZQUFMLENBQWtCLFFBQWhDO0FBQ0EsZ0JBQUksU0FBUyxLQUFLLHFCQUFsQjs7QUFFQSxnQkFBSSxTQUFTLENBQVQsS0FBZSxNQUFNLE9BQU4sS0FBa0IsU0FBUyxPQUExQyxDQUFKLEVBQXdEO0FBQ3BELGlDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsd0NBQW9ELE9BQXBELFlBQWtFLE1BQWxFO0FBQ0EscUJBQUssWUFBTCxDQUFrQixRQUFsQixHQUE2QixNQUE3QjtBQUNIOztBQUVELGlCQUFLLHdCQUFMLEdBQWdDLEtBQWhDO0FBQ0EsaUJBQUsscUJBQUwsR0FBNkIsQ0FBN0I7QUFDSDs7OzBDQUVpQjtBQUNkLGlCQUFLLElBQUksSUFBVCxJQUFpQixLQUFLLG9CQUF0QixFQUE0QztBQUN4QyxvQkFBSSxDQUFDLEtBQUssY0FBTCxDQUFvQixJQUFwQixDQUFELElBQThCLEtBQUssY0FBTCxDQUFvQixJQUFwQixFQUEwQixRQUE1RCxFQUFzRTtBQUNsRTtBQUNIO0FBQ0Qsb0JBQUksS0FBSyxLQUFLLGNBQUwsQ0FBb0IsSUFBcEIsQ0FBVDtBQUNBLG9CQUFJLFNBQVMsS0FBSyxvQkFBTCxDQUEwQixJQUExQixDQUFiO0FBQ0EsdUJBQU8sT0FBTyxNQUFQLElBQWlCLENBQUMsR0FBRyxRQUE1QixFQUFzQztBQUNsQyx3QkFBSSxRQUFRLE9BQU8sS0FBUCxFQUFaO0FBQ0EsdUJBQUcsTUFBSCxDQUFVLE1BQU0sS0FBaEIsRUFBdUIsTUFBTSxHQUE3QjtBQUNIO0FBQ0o7QUFDSjs7OzRDQUVtQjtBQUNoQixnQkFBSSxrQkFBa0IsS0FBSyxnQkFBM0I7O0FBRUEsaUJBQUssSUFBSSxJQUFULElBQWlCLGVBQWpCLEVBQWtDO0FBQzlCLG9CQUFJLENBQUMsS0FBSyxjQUFMLENBQW9CLElBQXBCLENBQUQsSUFBOEIsS0FBSyxjQUFMLENBQW9CLElBQXBCLEVBQTBCLFFBQTVELEVBQXNFO0FBQ2xFO0FBQ0g7O0FBRUQsb0JBQUksZ0JBQWdCLElBQWhCLEVBQXNCLE1BQXRCLEdBQStCLENBQW5DLEVBQXNDO0FBQ2xDLHdCQUFJLFVBQVUsZ0JBQWdCLElBQWhCLEVBQXNCLEtBQXRCLEVBQWQ7O0FBRUEsd0JBQUksUUFBUSxlQUFaLEVBQTZCO0FBQ3pCO0FBQ0E7QUFDQSw0QkFBSSxnQkFBZ0IsS0FBSyxjQUFMLENBQW9CLElBQXBCLEVBQTBCLGVBQTlDO0FBQ0EsNEJBQUksZUFBZSxRQUFRLGVBQVIsR0FBMEIsSUFBN0MsQ0FKeUIsQ0FJMkI7O0FBRXBELDRCQUFJLFFBQVEsS0FBSyxHQUFMLENBQVMsZ0JBQWdCLFlBQXpCLENBQVo7QUFDQSw0QkFBSSxRQUFRLEdBQVosRUFBaUI7QUFBRztBQUNoQiw2Q0FBSSxDQUFKLENBQU0sS0FBSyxHQUFYLDhDQUEwRCxhQUExRCxZQUE4RSxZQUE5RTtBQUNBLGlDQUFLLGNBQUwsQ0FBb0IsSUFBcEIsRUFBMEIsZUFBMUIsR0FBNEMsWUFBNUM7QUFDSDtBQUNELCtCQUFPLFFBQVEsZUFBZjtBQUNIOztBQUVELHdCQUFJLENBQUMsUUFBUSxJQUFULElBQWlCLFFBQVEsSUFBUixDQUFhLFVBQWIsS0FBNEIsQ0FBakQsRUFBb0Q7QUFDaEQ7QUFDQTtBQUNIOztBQUVELHdCQUFJO0FBQ0EsNkJBQUssY0FBTCxDQUFvQixJQUFwQixFQUEwQixZQUExQixDQUF1QyxRQUFRLElBQS9DO0FBQ0EsNkJBQUssYUFBTCxHQUFxQixLQUFyQjtBQUNBLDRCQUFJLFNBQVMsT0FBVCxJQUFvQixRQUFRLGNBQVIsQ0FBdUIsTUFBdkIsQ0FBeEIsRUFBd0Q7QUFDcEQsaUNBQUssUUFBTCxDQUFjLFdBQWQsQ0FBMEIsUUFBUSxJQUFSLENBQWEsVUFBdkM7QUFDSDtBQUNKLHFCQU5ELENBTUUsT0FBTyxLQUFQLEVBQWM7QUFDWiw2QkFBSyxnQkFBTCxDQUFzQixJQUF0QixFQUE0QixPQUE1QixDQUFvQyxPQUFwQztBQUNBLDRCQUFJLE1BQU0sSUFBTixLQUFlLEVBQW5CLEVBQXVCO0FBQUc7QUFDdEI7Ozs7Ozs7OztBQVNBO0FBQ0EsZ0NBQUksQ0FBQyxLQUFLLGFBQVYsRUFBeUI7QUFDckIscUNBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsb0JBQVUsV0FBN0I7QUFDSDtBQUNELGlDQUFLLGFBQUwsR0FBcUIsSUFBckI7QUFDSCx5QkFmRCxNQWVPO0FBQ0gsNkNBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxFQUFnQixNQUFNLE9BQXRCO0FBQ0EsaUNBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsb0JBQVUsS0FBN0IsRUFBb0MsRUFBQyxNQUFNLE1BQU0sSUFBYixFQUFtQixLQUFLLE1BQU0sT0FBOUIsRUFBcEM7QUFDSDtBQUNKO0FBQ0o7QUFDSjtBQUNKOzs7d0NBRWU7QUFDWiw2QkFBSSxDQUFKLENBQU0sS0FBSyxHQUFYLEVBQWdCLDBCQUFoQjtBQUNBLGlCQUFLLFlBQUwsQ0FBa0IsbUJBQWxCLENBQXNDLFlBQXRDLEVBQW9ELEtBQUssQ0FBTCxDQUFPLFlBQTNEO0FBQ0E7QUFDQSxnQkFBSSxLQUFLLHdCQUFMLENBQThCLE1BQTlCLEdBQXVDLENBQTNDLEVBQThDO0FBQzFDLG9CQUFJLFdBQVcsS0FBSyx3QkFBcEI7QUFDQSx1QkFBTyxTQUFTLE1BQWhCLEVBQXdCO0FBQ3BCLHdCQUFJLFVBQVUsU0FBUyxLQUFULEVBQWQ7QUFDQSx5QkFBSyxpQkFBTCxDQUF1QixPQUF2QixFQUFnQyxJQUFoQztBQUNIO0FBQ0o7QUFDRDtBQUNBLGdCQUFJLEtBQUssbUJBQUwsRUFBSixFQUFnQztBQUM1QixxQkFBSyxpQkFBTDtBQUNIO0FBQ0QsaUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsb0JBQVUsV0FBN0I7QUFDSDs7O3lDQUVnQjtBQUNiO0FBQ0EsNkJBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxFQUFnQiwyQkFBaEI7QUFDSDs7O3lDQUVnQjtBQUNiO0FBQ0EsNkJBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxFQUFnQiwyQkFBaEI7QUFDQSxnQkFBSSxLQUFLLFlBQUwsSUFBcUIsS0FBSyxDQUFMLElBQVUsSUFBbkMsRUFBeUM7QUFDckMscUJBQUssWUFBTCxDQUFrQixtQkFBbEIsQ0FBc0MsWUFBdEMsRUFBb0QsS0FBSyxDQUFMLENBQU8sWUFBM0Q7QUFDQSxxQkFBSyxZQUFMLENBQWtCLG1CQUFsQixDQUFzQyxhQUF0QyxFQUFxRCxLQUFLLENBQUwsQ0FBTyxhQUE1RDtBQUNBLHFCQUFLLFlBQUwsQ0FBa0IsbUJBQWxCLENBQXNDLGFBQXRDLEVBQXFELEtBQUssQ0FBTCxDQUFPLGFBQTVEO0FBQ0g7QUFDSjs7OzhDQUVxQjtBQUNsQixnQkFBSSxLQUFLLEtBQUssZ0JBQWQ7QUFDQSxtQkFBTyxHQUFHLEtBQUgsQ0FBUyxNQUFULEdBQWtCLENBQWxCLElBQXVCLEdBQUcsS0FBSCxDQUFTLE1BQVQsR0FBa0IsQ0FBaEQ7QUFDSDs7O2tEQUV5QjtBQUN0QixnQkFBSSxNQUFNLEtBQUssb0JBQWY7QUFDQSxtQkFBTyxJQUFJLEtBQUosQ0FBVSxNQUFWLEdBQW1CLENBQW5CLElBQXdCLElBQUksS0FBSixDQUFVLE1BQVYsR0FBbUIsQ0FBbEQ7QUFDSDs7O21EQUUwQjtBQUN2QixnQkFBSSxLQUFLLHdCQUFULEVBQW1DO0FBQy9CLHFCQUFLLDBCQUFMO0FBQ0gsYUFGRCxNQUVPLElBQUksS0FBSyx1QkFBTCxFQUFKLEVBQW9DO0FBQ3ZDLHFCQUFLLGVBQUw7QUFDSCxhQUZNLE1BRUEsSUFBSSxLQUFLLG1CQUFMLEVBQUosRUFBZ0M7QUFDbkMscUJBQUssaUJBQUw7QUFDSCxhQUZNLE1BRUEsSUFBSSxLQUFLLGNBQVQsRUFBeUI7QUFDNUIscUJBQUssV0FBTDtBQUNIO0FBQ0QsaUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsb0JBQVUsVUFBN0I7QUFDSDs7OzZDQUVvQixDLEVBQUc7QUFDcEIsNkJBQUksQ0FBSixDQUFNLEtBQUssR0FBWCwyQkFBdUMsQ0FBdkM7QUFDQTtBQUNIOzs7Ozs7a0JBSVUsYTs7Ozs7Ozs7QUMxaEJmOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsSUFBTSxZQUFZO0FBQ2QsU0FBTyxPQURPO0FBRWQsZUFBYSxhQUZDO0FBR2QsY0FBWSxZQUhFO0FBSWQsZUFBYTtBQUpDLENBQWxCOztrQkFPZSxTOzs7Ozs7Ozs7cWpCQ3pCZjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7OztJQUVNLFU7QUFFRix3QkFBWSxlQUFaLEVBQTZCLE1BQTdCLEVBQXFDO0FBQUE7O0FBQ2pDLGFBQUssR0FBTCxHQUFXLFlBQVg7QUFDQSxhQUFLLFFBQUwsR0FBZ0Isc0JBQWhCOztBQUVBLFlBQUksT0FBTyxZQUFQLElBQXVCLE9BQVEsTUFBUixLQUFvQixXQUEvQyxFQUE0RDtBQUN4RCxnQkFBSTtBQUNBLG9CQUFJLE9BQU8sUUFBUSxZQUFSLENBQVg7QUFDQSxxQkFBSyxPQUFMLEdBQWUsaUNBQWY7QUFDQSxxQkFBSyxpQkFBTCxHQUF5QixLQUF6QjtBQUNBLHFCQUFLLE9BQUwsQ0FBYSxnQkFBYixDQUE4QixTQUE5QixFQUF5QyxLQUFLLGdCQUFMLENBQXNCLElBQXRCLENBQTJCLElBQTNCLENBQXpDO0FBQ0EscUJBQUssT0FBTCxDQUFhLFdBQWIsQ0FBeUIsRUFBQyxLQUFLLE1BQU4sRUFBYyxPQUFPLENBQUMsZUFBRCxFQUFrQixNQUFsQixDQUFyQixFQUF6QjtBQUNBLHFCQUFLLENBQUwsR0FBUztBQUNMLDRDQUF3QixLQUFLLHVCQUFMLENBQTZCLElBQTdCLENBQWtDLElBQWxDO0FBRG5CLGlCQUFUO0FBR0EseUNBQWUsZ0JBQWYsQ0FBZ0MsS0FBSyxDQUFMLENBQU8sc0JBQXZDO0FBQ0EscUJBQUssT0FBTCxDQUFhLFdBQWIsQ0FBeUIsRUFBQyxLQUFLLGdCQUFOLEVBQXdCLE9BQU8seUJBQWUsU0FBZixFQUEvQixFQUF6QjtBQUNILGFBWEQsQ0FXRSxPQUFPLEtBQVAsRUFBYztBQUNaLGlDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0IsMkVBQWhCO0FBQ0EscUJBQUssT0FBTCxHQUFlLElBQWY7QUFDQSxxQkFBSyxXQUFMLEdBQW1CLG9DQUEwQixlQUExQixFQUEyQyxNQUEzQyxDQUFuQjtBQUNIO0FBQ0osU0FqQkQsTUFpQk87QUFDSCxpQkFBSyxXQUFMLEdBQW1CLG9DQUEwQixlQUExQixFQUEyQyxNQUEzQyxDQUFuQjtBQUNIOztBQUVELFlBQUksS0FBSyxXQUFULEVBQXNCO0FBQ2xCLGdCQUFJLE1BQU0sS0FBSyxXQUFmO0FBQ0EsZ0JBQUksRUFBSixDQUFPLDRCQUFrQixRQUF6QixFQUFtQyxLQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBcUIsSUFBckIsQ0FBbkM7QUFDQSxnQkFBSSxFQUFKLENBQU8sNEJBQWtCLFdBQXpCLEVBQXNDLEtBQUssYUFBTCxDQUFtQixJQUFuQixDQUF3QixJQUF4QixDQUF0QztBQUNBLGdCQUFJLEVBQUosQ0FBTyw0QkFBa0IsWUFBekIsRUFBdUMsS0FBSyxjQUFMLENBQW9CLElBQXBCLENBQXlCLElBQXpCLENBQXZDO0FBQ0EsZ0JBQUksRUFBSixDQUFPLDRCQUFrQixhQUF6QixFQUF3QyxLQUFLLGVBQUwsQ0FBcUIsSUFBckIsQ0FBMEIsSUFBMUIsQ0FBeEM7QUFDQSxnQkFBSSxFQUFKLENBQU8sNEJBQWtCLGdCQUF6QixFQUEyQyxLQUFLLGtCQUFMLENBQXdCLElBQXhCLENBQTZCLElBQTdCLENBQTNDO0FBQ0EsZ0JBQUksRUFBSixDQUFPLDRCQUFrQixtQkFBekIsRUFBOEMsS0FBSyxvQkFBTCxDQUEwQixJQUExQixDQUErQixJQUEvQixDQUE5QztBQUNBLGdCQUFJLEVBQUosQ0FBTyw0QkFBa0IsVUFBekIsRUFBcUMsS0FBSyxZQUFMLENBQWtCLElBQWxCLENBQXVCLElBQXZCLENBQXJDO0FBQ0EsZ0JBQUksRUFBSixDQUFPLDRCQUFrQixnQkFBekIsRUFBMkMsS0FBSyxrQkFBTCxDQUF3QixJQUF4QixDQUE2QixJQUE3QixDQUEzQztBQUNBLGdCQUFJLEVBQUosQ0FBTyw0QkFBa0Isa0JBQXpCLEVBQTZDLEtBQUssb0JBQUwsQ0FBMEIsSUFBMUIsQ0FBK0IsSUFBL0IsQ0FBN0M7QUFDQSxnQkFBSSxFQUFKLENBQU8sNEJBQWtCLGVBQXpCLEVBQTBDLEtBQUssaUJBQUwsQ0FBdUIsSUFBdkIsQ0FBNEIsSUFBNUIsQ0FBMUM7QUFDQSxnQkFBSSxFQUFKLENBQU8sNEJBQWtCLG1CQUF6QixFQUE4QyxLQUFLLHFCQUFMLENBQTJCLElBQTNCLENBQWdDLElBQWhDLENBQTlDO0FBQ0g7QUFDSjs7OztrQ0FFUztBQUNOLGdCQUFJLEtBQUssT0FBVCxFQUFrQjtBQUNkLG9CQUFJLENBQUMsS0FBSyxpQkFBVixFQUE2QjtBQUN6Qix5QkFBSyxpQkFBTCxHQUF5QixJQUF6QjtBQUNBLHlCQUFLLE9BQUwsQ0FBYSxXQUFiLENBQXlCLEVBQUMsS0FBSyxTQUFOLEVBQXpCO0FBQ0EsNkNBQWUsY0FBZixDQUE4QixLQUFLLENBQUwsQ0FBTyxzQkFBckM7QUFDQSx5QkFBSyxDQUFMLEdBQVMsSUFBVDtBQUNIO0FBQ0osYUFQRCxNQU9PO0FBQ0gscUJBQUssV0FBTCxDQUFpQixPQUFqQjtBQUNBLHFCQUFLLFdBQUwsR0FBbUIsSUFBbkI7QUFDSDtBQUNELGlCQUFLLFFBQUwsQ0FBYyxrQkFBZDtBQUNBLGlCQUFLLFFBQUwsR0FBZ0IsSUFBaEI7QUFDSDs7OzJCQUVFLEssRUFBTyxRLEVBQVU7QUFDaEIsaUJBQUssUUFBTCxDQUFjLFdBQWQsQ0FBMEIsS0FBMUIsRUFBaUMsUUFBakM7QUFDSDs7OzRCQUVHLEssRUFBTyxRLEVBQVU7QUFDakIsaUJBQUssUUFBTCxDQUFjLGNBQWQsQ0FBNkIsS0FBN0IsRUFBb0MsUUFBcEM7QUFDSDs7O29DQUVXO0FBQ1IsbUJBQU8sS0FBSyxPQUFMLElBQWdCLElBQXZCO0FBQ0g7OzsrQkFFTTtBQUNILGdCQUFJLEtBQUssT0FBVCxFQUFrQjtBQUNkLHFCQUFLLE9BQUwsQ0FBYSxXQUFiLENBQXlCLEVBQUMsS0FBSyxPQUFOLEVBQXpCO0FBQ0gsYUFGRCxNQUVPO0FBQ0gscUJBQUssV0FBTCxDQUFpQixLQUFqQjtBQUNIO0FBQ0o7OztnQ0FFTztBQUNKLGdCQUFJLEtBQUssT0FBVCxFQUFrQjtBQUNkLHFCQUFLLE9BQUwsQ0FBYSxXQUFiLENBQXlCLEVBQUMsS0FBSyxNQUFOLEVBQXpCO0FBQ0gsYUFGRCxNQUVPO0FBQ0gscUJBQUssV0FBTCxDQUFpQixJQUFqQjtBQUNIO0FBQ0o7Ozs2QkFFSSxZLEVBQWM7QUFDZixnQkFBSSxLQUFLLE9BQVQsRUFBa0I7QUFDZCxxQkFBSyxPQUFMLENBQWEsV0FBYixDQUF5QixFQUFDLEtBQUssTUFBTixFQUFjLE9BQU8sWUFBckIsRUFBekI7QUFDSCxhQUZELE1BRU87QUFDSCxxQkFBSyxXQUFMLENBQWlCLElBQWpCLENBQXNCLFlBQXRCO0FBQ0g7QUFDSjs7O2dDQUVPO0FBQ0osZ0JBQUksS0FBSyxPQUFULEVBQWtCO0FBQ2QscUJBQUssT0FBTCxDQUFhLFdBQWIsQ0FBeUIsRUFBQyxLQUFLLE9BQU4sRUFBekI7QUFDSCxhQUZELE1BRU87QUFDSCxxQkFBSyxXQUFMLENBQWlCLEtBQWpCO0FBQ0g7QUFDSjs7O2lDQUVRO0FBQ0wsZ0JBQUksS0FBSyxPQUFULEVBQWtCO0FBQ2QscUJBQUssT0FBTCxDQUFhLFdBQWIsQ0FBeUIsRUFBQyxLQUFLLFFBQU4sRUFBekI7QUFDSCxhQUZELE1BRU87QUFDSCxxQkFBSyxXQUFMLENBQWlCLE1BQWpCO0FBQ0g7QUFDSjs7O3VDQUVjLEksRUFBTSxXLEVBQWE7QUFBQTs7QUFDOUI7QUFDQSxvQkFBUSxPQUFSLEdBQWtCLElBQWxCLENBQXVCLFlBQU07QUFDekIsc0JBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsNEJBQWtCLFlBQXJDLEVBQW1ELElBQW5ELEVBQXlELFdBQXpEO0FBQ0gsYUFGRDtBQUdIOzs7d0NBRWUsSSxFQUFNLFksRUFBYztBQUFBOztBQUNoQyxvQkFBUSxPQUFSLEdBQWtCLElBQWxCLENBQXVCLFlBQU07QUFDekIsdUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsNEJBQWtCLGFBQXJDLEVBQW9ELElBQXBELEVBQTBELFlBQTFEO0FBQ0gsYUFGRDtBQUdIOzs7NkNBRW9CO0FBQUE7O0FBQ2pCLG9CQUFRLE9BQVIsR0FBa0IsSUFBbEIsQ0FBdUIsWUFBTTtBQUN6Qix1QkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQiw0QkFBa0IsZ0JBQXJDO0FBQ0gsYUFGRDtBQUdIOzs7K0NBRXNCO0FBQUE7O0FBQ25CLG9CQUFRLE9BQVIsR0FBa0IsSUFBbEIsQ0FBdUIsWUFBTTtBQUN6Qix1QkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQiw0QkFBa0IsbUJBQXJDO0FBQ0gsYUFGRDtBQUdIOzs7cUNBRVksUyxFQUFXO0FBQUE7O0FBQ3BCLG9CQUFRLE9BQVIsR0FBa0IsSUFBbEIsQ0FBdUIsWUFBTTtBQUN6Qix1QkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQiw0QkFBa0IsVUFBckMsRUFBaUQsU0FBakQ7QUFDSCxhQUZEO0FBR0g7OzsyQ0FFa0IsUSxFQUFVO0FBQUE7O0FBQ3pCLG9CQUFRLE9BQVIsR0FBa0IsSUFBbEIsQ0FBdUIsWUFBTTtBQUN6Qix1QkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQiw0QkFBa0IsZ0JBQXJDLEVBQXVELFFBQXZEO0FBQ0gsYUFGRDtBQUdIOzs7NkNBRW9CLEksRUFBTTtBQUFBOztBQUN2QixvQkFBUSxPQUFSLEdBQWtCLElBQWxCLENBQXVCLFlBQU07QUFDekIsdUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsNEJBQWtCLGtCQUFyQyxFQUF5RCxJQUF6RDtBQUNILGFBRkQ7QUFHSDs7OzBDQUVpQixjLEVBQWdCO0FBQUE7O0FBQzlCLG9CQUFRLE9BQVIsR0FBa0IsSUFBbEIsQ0FBdUIsWUFBTTtBQUN6Qix1QkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQiw0QkFBa0IsZUFBckMsRUFBc0QsY0FBdEQ7QUFDSCxhQUZEO0FBR0g7OzttQ0FFVSxJLEVBQU0sSSxFQUFNO0FBQUE7O0FBQ25CLG9CQUFRLE9BQVIsR0FBa0IsSUFBbEIsQ0FBdUIsWUFBTTtBQUN6Qix1QkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQiw0QkFBa0IsUUFBckMsRUFBK0MsSUFBL0MsRUFBcUQsSUFBckQ7QUFDSCxhQUZEO0FBR0g7OztzQ0FFYSxJLEVBQU0sSSxFQUFNO0FBQUE7O0FBQ3RCLG9CQUFRLE9BQVIsR0FBa0IsSUFBbEIsQ0FBdUIsWUFBTTtBQUN6Qix3QkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQiw0QkFBa0IsV0FBckMsRUFBa0QsSUFBbEQsRUFBd0QsSUFBeEQ7QUFDSCxhQUZEO0FBR0g7Ozs4Q0FFcUIsWSxFQUFjO0FBQUE7O0FBQ2hDLG9CQUFRLE9BQVIsR0FBa0IsSUFBbEIsQ0FBdUIsWUFBTTtBQUN6Qix3QkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQiw0QkFBa0IsbUJBQXJDLEVBQTBELFlBQTFEO0FBQ0gsYUFGRDtBQUdIOzs7Z0RBRXVCLE0sRUFBUTtBQUM1QixnQkFBSSxLQUFLLE9BQVQsRUFBa0I7QUFDZCxxQkFBSyxPQUFMLENBQWEsV0FBYixDQUF5QixFQUFDLEtBQUssZ0JBQU4sRUFBd0IsT0FBTyxNQUEvQixFQUF6QjtBQUNIO0FBQ0o7Ozt5Q0FFZ0IsQyxFQUFHO0FBQ2hCLGdCQUFJLFVBQVUsRUFBRSxJQUFoQjtBQUNBLGdCQUFJLE9BQU8sUUFBUSxJQUFuQjs7QUFFQSxnQkFBSSxRQUFRLEdBQVIsS0FBZ0IsV0FBaEIsSUFBK0IsS0FBSyxpQkFBeEMsRUFBMkQ7QUFDdkQscUJBQUssaUJBQUwsR0FBeUIsS0FBekI7QUFDQSxxQkFBSyxPQUFMLENBQWEsU0FBYjtBQUNBLHFCQUFLLE9BQUwsR0FBZSxJQUFmO0FBQ0E7QUFDSDs7QUFFRCxvQkFBUSxRQUFRLEdBQWhCO0FBQ0kscUJBQUssNEJBQWtCLFlBQXZCO0FBQ0EscUJBQUssNEJBQWtCLGFBQXZCO0FBQ0kseUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsUUFBUSxHQUEzQixFQUFnQyxLQUFLLElBQXJDLEVBQTJDLEtBQUssSUFBaEQ7QUFDQTtBQUNKLHFCQUFLLDRCQUFrQixnQkFBdkI7QUFDQSxxQkFBSyw0QkFBa0IsbUJBQXZCO0FBQ0kseUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsUUFBUSxHQUEzQjtBQUNBO0FBQ0oscUJBQUssNEJBQWtCLFVBQXZCO0FBQ0ksMkJBQU8sY0FBUCxDQUFzQixJQUF0QixFQUE0QixvQkFBVSxTQUF0QztBQUNBLHlCQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLFFBQVEsR0FBM0IsRUFBZ0MsSUFBaEM7QUFDQTtBQUNKLHFCQUFLLDRCQUFrQixnQkFBdkI7QUFDQSxxQkFBSyw0QkFBa0Isa0JBQXZCO0FBQ0EscUJBQUssNEJBQWtCLGVBQXZCO0FBQ0kseUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsUUFBUSxHQUEzQixFQUFnQyxJQUFoQztBQUNBO0FBQ0oscUJBQUssNEJBQWtCLFFBQXZCO0FBQ0EscUJBQUssNEJBQWtCLFdBQXZCO0FBQ0kseUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsUUFBUSxHQUEzQixFQUFnQyxLQUFLLElBQXJDLEVBQTJDLEtBQUssSUFBaEQ7QUFDQTtBQUNKLHFCQUFLLDRCQUFrQixtQkFBdkI7QUFDSSx5QkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQixRQUFRLEdBQTNCLEVBQWdDLElBQWhDO0FBQ0E7QUFDSixxQkFBSyxpQkFBTDtBQUNJLHFDQUFJLE9BQUosQ0FBWSxJQUFaLENBQWlCLEtBQWpCLEVBQXdCLEtBQUssSUFBN0IsRUFBbUMsS0FBSyxNQUF4QztBQUNBO0FBQ0o7QUFDSTtBQTdCUjtBQStCSDs7Ozs7O2tCQUlVLFU7Ozs7Ozs7OztxakJDaFFmOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUVBO0lBQ00scUI7QUFFRixtQ0FBWSxlQUFaLEVBQTZCLE1BQTdCLEVBQXFDO0FBQUE7O0FBQ2pDLGFBQUssR0FBTCxHQUFXLHVCQUFYO0FBQ0EsYUFBSyxRQUFMLEdBQWdCLHNCQUFoQjs7QUFFQSxhQUFLLE9BQUwsR0FBZSxNQUFmOztBQUVBO0FBQ0EsWUFBSSxDQUFDLGdCQUFnQixRQUFyQixFQUErQjtBQUMzQiw0QkFBZ0IsUUFBaEIsR0FBMkIsQ0FBQztBQUN4QiwwQkFBVSxnQkFBZ0IsUUFERjtBQUV4QiwwQkFBVSxnQkFBZ0IsUUFGRjtBQUd4QixxQkFBSyxnQkFBZ0I7QUFIRyxhQUFELENBQTNCO0FBS0g7O0FBRUQ7QUFDQSxZQUFJLE9BQU8sZ0JBQWdCLElBQXZCLEtBQWdDLFNBQXBDLEVBQStDO0FBQzNDLDRCQUFnQixJQUFoQixHQUF1QixJQUF2QjtBQUNIO0FBQ0QsWUFBSSxPQUFPLGdCQUFnQixlQUF2QixLQUEyQyxTQUEvQyxFQUEwRDtBQUN0RCw0QkFBZ0IsZUFBaEIsR0FBa0MsS0FBbEM7QUFDSDs7QUFFRCxhQUFLLGdCQUFMLEdBQXdCLGVBQXhCO0FBQ0EsYUFBSyxvQkFBTCxHQUE0QixDQUE1QjtBQUNBLFlBQUksZ0JBQWdCLENBQXBCOztBQUVBLGFBQUssZ0JBQUwsQ0FBc0IsUUFBdEIsQ0FBK0IsT0FBL0IsQ0FBdUMsVUFBQyxPQUFELEVBQWE7QUFDaEQ7QUFDQSxvQkFBUSxhQUFSLEdBQXdCLGFBQXhCO0FBQ0EsNkJBQWlCLFFBQVEsUUFBekI7QUFDQTtBQUNBLG9CQUFRLElBQVIsR0FBZSxnQkFBZ0IsSUFBL0I7QUFDQSxvQkFBUSxlQUFSLEdBQTBCLGdCQUFnQixlQUExQztBQUNBO0FBQ0EsZ0JBQUksT0FBTyxjQUFYLEVBQTJCO0FBQ3ZCLHdCQUFRLGNBQVIsR0FBeUIsT0FBTyxjQUFoQztBQUNIO0FBQ0osU0FYRDs7QUFhQSxZQUFJLENBQUMsTUFBTSxhQUFOLENBQUQsSUFBeUIsS0FBSyxnQkFBTCxDQUFzQixRQUF0QixLQUFtQyxhQUFoRSxFQUErRTtBQUMzRSxpQkFBSyxnQkFBTCxDQUFzQixRQUF0QixHQUFpQyxhQUFqQztBQUNIOztBQUVELGFBQUssVUFBTCxHQUFrQixJQUFsQjtBQUNBLGFBQUssUUFBTCxHQUFnQixJQUFoQjtBQUNBLGFBQUssUUFBTCxHQUFnQixJQUFoQjtBQUNBLGFBQUssTUFBTCxHQUFjLElBQWQ7O0FBRUEsYUFBSyxnQkFBTCxHQUF3QixJQUF4QjtBQUNBLGFBQUssd0JBQUwsR0FBZ0MsSUFBaEM7O0FBRUEsYUFBSyxtQkFBTCxHQUEyQixJQUEzQjtBQUNIOzs7O2tDQUVTO0FBQ04saUJBQUssVUFBTCxHQUFrQixJQUFsQjtBQUNBLGlCQUFLLGdCQUFMLEdBQXdCLElBQXhCOztBQUVBLGdCQUFJLEtBQUssbUJBQVQsRUFBOEI7QUFDMUIscUJBQUssMEJBQUw7QUFDSDtBQUNELGdCQUFJLEtBQUssTUFBVCxFQUFpQjtBQUNiLHFCQUFLLE1BQUwsQ0FBWSxPQUFaO0FBQ0EscUJBQUssTUFBTCxHQUFjLElBQWQ7QUFDSDtBQUNELGdCQUFJLEtBQUssUUFBVCxFQUFtQjtBQUNmLHFCQUFLLFFBQUwsQ0FBYyxPQUFkO0FBQ0EscUJBQUssUUFBTCxHQUFnQixJQUFoQjtBQUNIO0FBQ0QsZ0JBQUksS0FBSyxRQUFULEVBQW1CO0FBQ2YscUJBQUssUUFBTCxDQUFjLE9BQWQ7QUFDQSxxQkFBSyxRQUFMLEdBQWdCLElBQWhCO0FBQ0g7O0FBRUQsaUJBQUssUUFBTCxDQUFjLGtCQUFkO0FBQ0EsaUJBQUssUUFBTCxHQUFnQixJQUFoQjtBQUNIOzs7MkJBRUUsSyxFQUFPLFEsRUFBVTtBQUNoQixpQkFBSyxRQUFMLENBQWMsV0FBZCxDQUEwQixLQUExQixFQUFpQyxRQUFqQztBQUNIOzs7NEJBRUcsSyxFQUFPLFEsRUFBVTtBQUNqQixpQkFBSyxRQUFMLENBQWMsY0FBZCxDQUE2QixLQUE3QixFQUFvQyxRQUFwQztBQUNIOzs7Z0NBRU87QUFDSixpQkFBSyxZQUFMLENBQWtCLENBQWxCO0FBQ0EsaUJBQUsseUJBQUw7QUFDSDs7O3FDQUVZLFksRUFBYyxZLEVBQWM7QUFDckMsaUJBQUssb0JBQUwsR0FBNEIsWUFBNUI7QUFDQSxnQkFBSSxhQUFhLEtBQUssZ0JBQUwsQ0FBc0IsUUFBdEIsQ0FBK0IsWUFBL0IsQ0FBakI7O0FBRUEsZ0JBQUksUUFBUSxLQUFLLE1BQUwsR0FBYywyQkFBaUIsVUFBakIsRUFBNkIsS0FBSyxPQUFsQyxFQUEyQyxZQUEzQyxDQUExQjtBQUNBLGtCQUFNLE9BQU4sR0FBZ0IsS0FBSyxjQUFMLENBQW9CLElBQXBCLENBQXlCLElBQXpCLENBQWhCO0FBQ0Esa0JBQU0sUUFBTixHQUFpQixLQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBc0IsSUFBdEIsQ0FBakI7QUFDQSxrQkFBTSxVQUFOLEdBQW1CLEtBQUssYUFBTCxDQUFtQixJQUFuQixDQUF3QixJQUF4QixDQUFuQjtBQUNBLGtCQUFNLFVBQU4sR0FBbUIsS0FBSyxhQUFMLENBQW1CLElBQW5CLENBQXdCLElBQXhCLENBQW5CO0FBQ0Esa0JBQU0sbUJBQU4sR0FBNEIsS0FBSyxzQkFBTCxDQUE0QixJQUE1QixDQUFpQyxJQUFqQyxDQUE1Qjs7QUFFQSxnQkFBSSxZQUFKLEVBQWtCO0FBQ2QscUJBQUssUUFBTCxDQUFjLGNBQWQsQ0FBNkIsS0FBSyxNQUFsQztBQUNILGFBRkQsTUFFTztBQUNILHNCQUFNLGFBQU4sR0FBc0IsS0FBSyxtQkFBTCxDQUF5QixJQUF6QixDQUE4QixJQUE5QixDQUF0QjtBQUNIOztBQUVELGtCQUFNLElBQU4sQ0FBVyxZQUFYO0FBQ0g7OzsrQkFFTTtBQUNILGlCQUFLLGNBQUw7QUFDQSxpQkFBSywwQkFBTDtBQUNIOzs7eUNBRWdCO0FBQ2IsZ0JBQUksS0FBSyxNQUFULEVBQWlCO0FBQ2IscUJBQUssTUFBTCxDQUFZLE9BQVo7QUFDQSxxQkFBSyxNQUFMLEdBQWMsSUFBZDtBQUNIO0FBQ0o7OztnQ0FFTztBQUFHO0FBQ1AsZ0JBQUksS0FBSyxNQUFMLElBQWUsS0FBSyxNQUFMLENBQVksU0FBWixFQUFuQixFQUE0QztBQUN4QyxxQkFBSyxNQUFMLENBQVksS0FBWjtBQUNBLHFCQUFLLDBCQUFMO0FBQ0g7QUFDSjs7O2lDQUVRO0FBQ0wsZ0JBQUksS0FBSyxNQUFMLElBQWUsS0FBSyxNQUFMLENBQVksUUFBWixFQUFuQixFQUEyQztBQUN2QyxxQkFBSyxNQUFMLENBQVksTUFBWjtBQUNBLHFCQUFLLHlCQUFMO0FBQ0g7QUFDSjs7OzZCQUVJLFksRUFBYztBQUNmLGdCQUFJLEtBQUssVUFBTCxJQUFtQixJQUFuQixJQUEyQixDQUFDLEtBQUssVUFBTCxDQUFnQixVQUFoQixFQUFoQyxFQUE4RDtBQUMxRDtBQUNIOztBQUVELGdCQUFJLHFCQUFxQixLQUFLLDJCQUFMLENBQWlDLFlBQWpDLENBQXpCOztBQUVBLGdCQUFJLHVCQUF1QixLQUFLLG9CQUFoQyxFQUFzRDtBQUNsRDtBQUNBLG9CQUFJLGNBQWMsS0FBSyxVQUFMLENBQWdCLFFBQWhCLENBQXlCLGtCQUF6QixDQUFsQjs7QUFFQSxvQkFBSSxlQUFlLFNBQW5CLEVBQThCO0FBQzFCO0FBQ0E7QUFDQSx5QkFBSyxnQkFBTCxHQUF3QixZQUF4QjtBQUNILGlCQUpELE1BSU87QUFDSCx3QkFBSSxXQUFXLFlBQVksa0JBQVosQ0FBK0IsWUFBL0IsQ0FBZjtBQUNBLHlCQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLFNBQVMsWUFBNUI7QUFDQSx5QkFBSyxNQUFMLENBQVksSUFBWixDQUFpQixTQUFTLFlBQTFCO0FBQ0E7QUFDQSx5QkFBSyx3QkFBTCxHQUFnQyxTQUFTLFlBQXpDO0FBQ0g7QUFDSixhQWZELE1BZU87QUFDSDtBQUNBLG9CQUFJLG9CQUFvQixLQUFLLFVBQUwsQ0FBZ0IsUUFBaEIsQ0FBeUIsa0JBQXpCLENBQXhCOztBQUVBLG9CQUFJLHFCQUFxQixTQUF6QixFQUFvQztBQUNoQztBQUNBLHlCQUFLLGdCQUFMLEdBQXdCLFlBQXhCO0FBQ0EseUJBQUssY0FBTDtBQUNBLHlCQUFLLFFBQUwsQ0FBYyxJQUFkO0FBQ0EseUJBQUssUUFBTCxDQUFjLG1CQUFkO0FBQ0EseUJBQUssWUFBTCxDQUFrQixrQkFBbEI7QUFDQTtBQUNILGlCQVJELE1BUU87QUFDSDtBQUNBLHdCQUFJLFlBQVcsa0JBQWtCLGtCQUFsQixDQUFxQyxZQUFyQyxDQUFmO0FBQ0EseUJBQUssY0FBTDtBQUNBLHlCQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLFlBQW5CO0FBQ0EseUJBQUssUUFBTCxDQUFjLG1CQUFkO0FBQ0EseUJBQUssUUFBTCxDQUFjLGNBQWQ7QUFDQSx5QkFBSyxRQUFMLENBQWMsYUFBZCxHQUE4QixLQUFLLGdCQUFMLENBQXNCLFFBQXRCLENBQStCLGtCQUEvQixFQUFtRCxhQUFqRjtBQUNBLHlCQUFLLFlBQUwsQ0FBa0Isa0JBQWxCLEVBQXNDLFVBQVMsWUFBL0M7QUFDQSx5QkFBSyx3QkFBTCxHQUFnQyxVQUFTLFlBQXpDO0FBQ0EseUJBQUssdUJBQUwsQ0FBNkIsa0JBQTdCO0FBQ0g7QUFDSjs7QUFFRCxpQkFBSyx5QkFBTDtBQUNIOzs7b0RBRTJCLFksRUFBYztBQUN0QyxnQkFBSSxXQUFXLEtBQUssZ0JBQUwsQ0FBc0IsUUFBckM7QUFDQSxnQkFBSSxNQUFNLFNBQVMsTUFBVCxHQUFrQixDQUE1Qjs7QUFFQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFNBQVMsTUFBN0IsRUFBcUMsR0FBckMsRUFBMEM7QUFDdEMsb0JBQUksZUFBZSxTQUFTLENBQVQsRUFBWSxhQUEvQixFQUE4QztBQUMxQywwQkFBTSxJQUFJLENBQVY7QUFDQTtBQUNIO0FBQ0o7QUFDRCxtQkFBTyxHQUFQO0FBQ0g7Ozs0Q0FFbUIsSSxFQUFNLFMsRUFBVztBQUFBOztBQUNqQyxnQkFBSSxZQUFZLElBQWhCO0FBQ0EsZ0JBQUksV0FBVyxDQUFmOztBQUVBLGdCQUFJLFlBQVksQ0FBaEIsRUFBbUI7QUFDZjtBQUNBLHFCQUFLLFFBQUwsQ0FBYyxjQUFkLENBQTZCLEtBQUssTUFBbEM7QUFDQSxxQkFBSyxRQUFMLENBQWMsYUFBZCxHQUE4QixLQUFLLGdCQUFMLENBQXNCLFFBQXRCLENBQStCLEtBQUssb0JBQXBDLEVBQTBELGFBQXhGOztBQUVBLDJCQUFXLEtBQUssUUFBTCxDQUFjLFdBQWQsQ0FBMEIsSUFBMUIsRUFBZ0MsU0FBaEMsQ0FBWDtBQUNILGFBTkQsTUFNTyxJQUFJLENBQUMsWUFBWSxxQkFBVyxLQUFYLENBQWlCLElBQWpCLENBQWIsRUFBcUMsS0FBekMsRUFBZ0Q7QUFDbkQ7QUFDQSxxQkFBSyxRQUFMLEdBQWdCLHlCQUFlLFNBQWYsRUFBMEIsS0FBSyxPQUEvQixDQUFoQjs7QUFFQSxvQkFBSSxDQUFDLEtBQUssUUFBVixFQUFvQjtBQUNoQix5QkFBSyxRQUFMLEdBQWdCLHlCQUFlLEtBQUssT0FBcEIsQ0FBaEI7QUFDSDs7QUFFRCxvQkFBSSxNQUFNLEtBQUssZ0JBQWY7QUFDQSxvQkFBSSxJQUFJLFFBQUosSUFBZ0IsU0FBaEIsSUFBNkIsQ0FBQyxNQUFNLElBQUksUUFBVixDQUFsQyxFQUF1RDtBQUNuRCx5QkFBSyxRQUFMLENBQWMsaUJBQWQsR0FBa0MsSUFBSSxRQUF0QztBQUNIO0FBQ0Qsb0JBQUksT0FBTyxJQUFJLFFBQVgsS0FBd0IsU0FBNUIsRUFBdUM7QUFDbkMseUJBQUssUUFBTCxDQUFjLGlCQUFkLEdBQWtDLElBQUksUUFBdEM7QUFDSDtBQUNELG9CQUFJLE9BQU8sSUFBSSxRQUFYLEtBQXdCLFNBQTVCLEVBQXVDO0FBQ25DLHlCQUFLLFFBQUwsQ0FBYyxpQkFBZCxHQUFrQyxJQUFJLFFBQXRDO0FBQ0g7O0FBRUQscUJBQUssUUFBTCxDQUFjLGFBQWQsR0FBOEIsSUFBSSxRQUFKLENBQWEsS0FBSyxvQkFBbEIsRUFBd0MsYUFBdEU7O0FBRUEscUJBQUssUUFBTCxDQUFjLE9BQWQsR0FBd0IsS0FBSyxpQkFBTCxDQUF1QixJQUF2QixDQUE0QixJQUE1QixDQUF4QjtBQUNBLHFCQUFLLFFBQUwsQ0FBYyxXQUFkLEdBQTRCLEtBQUssWUFBTCxDQUFrQixJQUFsQixDQUF1QixJQUF2QixDQUE1QjtBQUNBLHFCQUFLLFFBQUwsQ0FBYyxpQkFBZCxHQUFrQyxLQUFLLGtCQUFMLENBQXdCLElBQXhCLENBQTZCLElBQTdCLENBQWxDO0FBQ0EscUJBQUssUUFBTCxDQUFjLG1CQUFkLEdBQW9DLEtBQUssb0JBQUwsQ0FBMEIsSUFBMUIsQ0FBK0IsSUFBL0IsQ0FBcEM7O0FBRUEscUJBQUssUUFBTCxDQUFjLGNBQWQsQ0FBNkIsS0FBSyxRQUFMLENBQ2YsY0FEZSxDQUNBLEtBQUssTUFETCxDQUE3Qjs7QUFJQSxxQkFBSyxRQUFMLENBQWMsYUFBZCxHQUE4QixLQUFLLDRCQUFMLENBQWtDLElBQWxDLENBQXVDLElBQXZDLENBQTlCO0FBQ0EscUJBQUssUUFBTCxDQUFjLGNBQWQsR0FBK0IsS0FBSyw2QkFBTCxDQUFtQyxJQUFuQyxDQUF3QyxJQUF4QyxDQUEvQjs7QUFFQSwyQkFBVyxLQUFLLFFBQUwsQ0FBYyxXQUFkLENBQTBCLElBQTFCLEVBQWdDLFNBQWhDLENBQVg7QUFDSCxhQWxDTSxNQWtDQTtBQUNILDRCQUFZLElBQVo7QUFDQSxpQ0FBSSxDQUFKLENBQU0sS0FBSyxHQUFYLEVBQWdCLGtDQUFoQjtBQUNBLHdCQUFRLE9BQVIsR0FBa0IsSUFBbEIsQ0FBdUIsWUFBTTtBQUN6QiwwQkFBSyxjQUFMO0FBQ0gsaUJBRkQ7QUFHQSxxQkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQiw0QkFBa0IsV0FBckMsRUFBa0Qsc0JBQVksa0JBQTlELEVBQWtGLGlDQUFsRjs7QUFFQSwyQkFBVyxDQUFYO0FBQ0g7O0FBRUQsbUJBQU8sUUFBUDtBQUNIOzs7cUNBRVksUyxFQUFXO0FBQUE7O0FBQ3BCLGdCQUFJLEtBQUssVUFBTCxJQUFtQixJQUF2QixFQUE2QjtBQUN6QjtBQUNBLHFCQUFLLFVBQUwsR0FBa0IsT0FBTyxNQUFQLENBQWMsRUFBZCxFQUFrQixTQUFsQixDQUFsQjtBQUNBLHFCQUFLLFVBQUwsQ0FBZ0IsY0FBaEIsR0FBaUMsSUFBakM7QUFDQSxxQkFBSyxVQUFMLENBQWdCLFFBQWhCLEdBQTJCLEVBQTNCO0FBQ0EscUJBQUssVUFBTCxDQUFnQixZQUFoQixHQUErQixLQUFLLGdCQUFMLENBQXNCLFFBQXRCLENBQStCLE1BQTlEO0FBQ0EsdUJBQU8sY0FBUCxDQUFzQixLQUFLLFVBQTNCLEVBQXVDLG9CQUFVLFNBQWpEO0FBQ0g7O0FBRUQsZ0JBQUksY0FBYyxPQUFPLE1BQVAsQ0FBYyxFQUFkLEVBQWtCLFNBQWxCLENBQWxCO0FBQ0EsbUJBQU8sY0FBUCxDQUFzQixXQUF0QixFQUFtQyxvQkFBVSxTQUE3QztBQUNBLGlCQUFLLFVBQUwsQ0FBZ0IsUUFBaEIsQ0FBeUIsS0FBSyxvQkFBOUIsSUFBc0QsV0FBdEQ7O0FBRUE7QUFDQSxpQkFBSyx1QkFBTCxDQUE2QixLQUFLLG9CQUFsQzs7QUFFQSxnQkFBSSxLQUFLLGdCQUFMLElBQXlCLElBQTdCLEVBQW1DO0FBQy9CLHdCQUFRLE9BQVIsR0FBa0IsSUFBbEIsQ0FBdUIsWUFBTTtBQUN6Qix3QkFBSSxTQUFTLE9BQUssZ0JBQWxCO0FBQ0EsMkJBQUssZ0JBQUwsR0FBd0IsSUFBeEI7QUFDQSwyQkFBSyxJQUFMLENBQVUsTUFBVjtBQUNILGlCQUpEO0FBS0g7QUFDSjs7OzJDQUVrQixRLEVBQVU7QUFDekIsaUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsNEJBQWtCLGdCQUFyQyxFQUF1RCxRQUF2RDtBQUNIOzs7NkNBRW9CLEksRUFBTTtBQUN2QixpQkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQiw0QkFBa0Isa0JBQXJDLEVBQXlELElBQXpEO0FBQ0g7OztzQ0FFYTtBQUNWLGlCQUFLLFFBQUwsQ0FBYyxtQkFBZDtBQUNIOzs7c0NBRWEsUyxFQUFXO0FBQ3JCLGdCQUFJLGVBQWUsU0FBbkI7QUFDQSxnQkFBSSxtQkFBbUIsZUFBZSxDQUF0Qzs7QUFFQSxnQkFBSSxtQkFBbUIsS0FBSyxnQkFBTCxDQUFzQixRQUF0QixDQUErQixNQUF0RCxFQUE4RDtBQUMxRCxxQkFBSyxjQUFMO0FBQ0EscUJBQUssUUFBTCxDQUFjLG1CQUFkO0FBQ0EscUJBQUssWUFBTCxDQUFrQixnQkFBbEI7QUFDSCxhQUpELE1BSU87QUFDSCxxQkFBSyxRQUFMLENBQWMsbUJBQWQ7QUFDQSxxQkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQiw0QkFBa0IsZ0JBQXJDO0FBQ0EscUJBQUssMEJBQUw7QUFDSDtBQUNKOzs7c0NBRWEsYSxFQUFlO0FBQ3pCLGdCQUFJLGVBQWUsS0FBSyxNQUFMLENBQVksU0FBL0I7QUFDQSxpQkFBSyxnQkFBTCxDQUFzQixRQUF0QixDQUErQixZQUEvQixFQUE2QyxhQUE3QyxHQUE2RCxhQUE3RDtBQUNIOzs7aURBRXdCO0FBQ3JCLGlCQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLDRCQUFrQixtQkFBckM7QUFDSDs7O3VDQUVjLEksRUFBTSxJLEVBQU07QUFDdkIsNkJBQUksQ0FBSixDQUFNLEtBQUssR0FBWCwyQkFBdUMsSUFBdkMsaUJBQXVELEtBQUssSUFBNUQsZ0JBQTJFLEtBQUssR0FBaEY7QUFDQSxpQkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQiw0QkFBa0IsUUFBckMsRUFBK0MsSUFBL0MsRUFBcUQsSUFBckQ7QUFDQSxpQkFBSywwQkFBTDtBQUNIOzs7MENBRWlCLEksRUFBTSxJLEVBQU07QUFDMUIsNkJBQUksQ0FBSixDQUFNLEtBQUssR0FBWCw4QkFBMEMsSUFBMUMsaUJBQTBELElBQTFEO0FBQ0EsaUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsNEJBQWtCLFdBQXJDLEVBQWtELElBQWxELEVBQXdELElBQXhEO0FBQ0g7OztxREFFNEIsSSxFQUFNLFcsRUFBYTtBQUM1QyxpQkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQiw0QkFBa0IsWUFBckMsRUFBbUQsSUFBbkQsRUFBeUQsV0FBekQ7QUFDSDs7O3NEQUU2QixJLEVBQU0sWSxFQUFjO0FBQzlDLGdCQUFJLEtBQUssZ0JBQUwsSUFBeUIsSUFBN0IsRUFBbUM7QUFDL0I7QUFDQTtBQUNIO0FBQ0QsaUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsNEJBQWtCLGFBQXJDLEVBQW9ELElBQXBELEVBQTBELFlBQTFEOztBQUVBO0FBQ0EsZ0JBQUksS0FBSyx3QkFBTCxJQUFpQyxJQUFqQyxJQUF5QyxTQUFTLE9BQXRELEVBQStEO0FBQzNELG9CQUFJLGFBQWEsYUFBYSxJQUFiLENBQWtCLFVBQW5DO0FBQ0Esb0JBQUksWUFBWSxLQUFLLHdCQUFyQjtBQUNBLHFCQUFLLHdCQUFMLEdBQWdDLElBQWhDOztBQUVBO0FBQ0Esb0JBQUksa0JBQVEsTUFBUixJQUFrQixXQUFXLE1BQVgsR0FBb0IsQ0FBdEMsSUFBMkMsV0FBVyxDQUFYLEVBQWMsV0FBZCxLQUE4QixTQUE3RSxFQUF3RjtBQUNwRixnQ0FBWSxXQUFXLENBQVgsRUFBYyxHQUExQjtBQUNIO0FBQ0Q7O0FBRUEscUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsNEJBQWtCLG1CQUFyQyxFQUEwRCxTQUExRDtBQUNIO0FBQ0o7OztvREFFMkI7QUFDeEIsZ0JBQUksS0FBSyxtQkFBTCxJQUE0QixJQUFoQyxFQUFzQztBQUNsQyxxQkFBSyxtQkFBTCxHQUEyQixLQUFLLFdBQUwsQ0FDdkIsS0FBSyxxQkFBTCxDQUEyQixJQUEzQixDQUFnQyxJQUFoQyxDQUR1QixFQUUzQixLQUFLLE9BQUwsQ0FBYSw0QkFGYyxDQUEzQjtBQUdIO0FBQ0o7OztxREFFNEI7QUFDekIsZ0JBQUksS0FBSyxtQkFBVCxFQUE4QjtBQUMxQixxQkFBSyxhQUFMLENBQW1CLEtBQUssbUJBQXhCO0FBQ0EscUJBQUssbUJBQUwsR0FBMkIsSUFBM0I7QUFDSDtBQUNKOzs7Z0RBRXVCLFksRUFBYztBQUNsQyxnQkFBSSxjQUFjLEtBQUssVUFBTCxDQUFnQixRQUFoQixDQUF5QixZQUF6QixDQUFsQjtBQUNBLGdCQUFJLGFBQWEsT0FBTyxNQUFQLENBQWMsRUFBZCxFQUFrQixXQUFsQixDQUFqQjs7QUFFQSx1QkFBVyxRQUFYLEdBQXNCLEtBQUssVUFBTCxDQUFnQixRQUF0QztBQUNBLHVCQUFXLFlBQVgsR0FBMEIsS0FBSyxVQUFMLENBQWdCLFlBQTFDO0FBQ0EsbUJBQU8sV0FBVyxRQUFsQjtBQUNBLG1CQUFPLFdBQVcsY0FBbEI7O0FBRUEsaUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsNEJBQWtCLFVBQXJDLEVBQWlELFVBQWpEO0FBQ0g7OztnREFFdUI7QUFDcEIsZ0JBQUksT0FBTyxFQUFYOztBQUVBLGlCQUFLLEdBQUwsR0FBVyxLQUFLLE1BQUwsQ0FBWSxVQUF2QjtBQUNBLGlCQUFLLFdBQUwsR0FBbUIsS0FBSyxNQUFMLENBQVksV0FBL0I7QUFDQSxnQkFBSSxLQUFLLFdBQVQsRUFBc0I7QUFDbEIscUJBQUssYUFBTCxHQUFxQixLQUFLLE1BQUwsQ0FBWSxvQkFBakM7QUFDSDs7QUFFRCxpQkFBSyxLQUFMLEdBQWEsS0FBSyxNQUFMLENBQVksWUFBekI7QUFDQSxpQkFBSyxVQUFMLEdBQWtCLEtBQUssTUFBTCxDQUFZLFVBQTlCO0FBQ0EsaUJBQUssbUJBQUwsR0FBMkIsS0FBSyxvQkFBaEM7QUFDQSxpQkFBSyxpQkFBTCxHQUF5QixLQUFLLGdCQUFMLENBQXNCLFFBQXRCLENBQStCLE1BQXhEOztBQUVBLGlCQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLDRCQUFrQixlQUFyQyxFQUFzRCxJQUF0RDtBQUNIOzs7Ozs7a0JBSVUscUI7Ozs7Ozs7O0FDdGJmOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsSUFBTSxvQkFBb0I7QUFDdEIsWUFBVSxVQURZO0FBRXRCLGVBQWEsYUFGUztBQUd0QixnQkFBYyxjQUhRO0FBSXRCLGlCQUFlLGVBSk87QUFLdEIsb0JBQWtCLGtCQUxJO0FBTXRCLHVCQUFxQixxQkFOQztBQU90QixjQUFZLFlBUFU7QUFRdEIsb0JBQWtCLGtCQVJJO0FBU3RCLHNCQUFvQixvQkFURTtBQVV0QixtQkFBaUIsaUJBVks7QUFXdEIsdUJBQXFCO0FBWEMsQ0FBMUI7O2tCQWNlLGlCOzs7Ozs7Ozs7QUNkZjs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUFFQTs7Ozs7Ozs7Ozs7OztBQWFBLElBQUksb0JBQW9CLFNBQXBCLGlCQUFvQixDQUFVLElBQVYsRUFBZ0I7O0FBRXBDLFFBQUksTUFBTSxtQkFBVjtBQUNBLFFBQUksYUFBYSxJQUFqQjtBQUNBLFFBQUksaUJBQWlCLGlCQUFpQixJQUFqQixDQUFzQixJQUF0QixDQUFyQjs7QUFFQSx1QkFBUyxPQUFUOztBQUVBLFNBQUssZ0JBQUwsQ0FBc0IsU0FBdEIsRUFBaUMsVUFBVSxDQUFWLEVBQWE7QUFDMUMsZ0JBQVEsRUFBRSxJQUFGLENBQU8sR0FBZjtBQUNJLGlCQUFLLE1BQUw7QUFDSSw2QkFBYSxvQ0FBMEIsRUFBRSxJQUFGLENBQU8sS0FBUCxDQUFhLENBQWIsQ0FBMUIsRUFBMkMsRUFBRSxJQUFGLENBQU8sS0FBUCxDQUFhLENBQWIsQ0FBM0MsQ0FBYjtBQUNBLDJCQUFXLEVBQVgsQ0FBYyw0QkFBa0IsUUFBaEMsRUFBMEMsVUFBVSxJQUFWLENBQWUsSUFBZixDQUExQztBQUNBLDJCQUFXLEVBQVgsQ0FBYyw0QkFBa0IsV0FBaEMsRUFBNkMsYUFBYSxJQUFiLENBQWtCLElBQWxCLENBQTdDO0FBQ0EsMkJBQVcsRUFBWCxDQUFjLDRCQUFrQixZQUFoQyxFQUE4QyxjQUFjLElBQWQsQ0FBbUIsSUFBbkIsQ0FBOUM7QUFDQSwyQkFBVyxFQUFYLENBQWMsNEJBQWtCLGFBQWhDLEVBQStDLGVBQWUsSUFBZixDQUFvQixJQUFwQixDQUEvQztBQUNBLDJCQUFXLEVBQVgsQ0FBYyw0QkFBa0IsZ0JBQWhDLEVBQWtELGtCQUFrQixJQUFsQixDQUF1QixJQUF2QixDQUFsRDtBQUNBLDJCQUFXLEVBQVgsQ0FBYyw0QkFBa0IsbUJBQWhDLEVBQXFELG9CQUFvQixJQUFwQixDQUF5QixJQUF6QixDQUFyRDtBQUNBLDJCQUFXLEVBQVgsQ0FBYyw0QkFBa0IsVUFBaEMsRUFBNEMsWUFBWSxJQUFaLENBQWlCLElBQWpCLENBQTVDO0FBQ0EsMkJBQVcsRUFBWCxDQUFjLDRCQUFrQixnQkFBaEMsRUFBa0Qsa0JBQWtCLElBQWxCLENBQXVCLElBQXZCLENBQWxEO0FBQ0EsMkJBQVcsRUFBWCxDQUFjLDRCQUFrQixrQkFBaEMsRUFBb0Qsb0JBQW9CLElBQXBCLENBQXlCLElBQXpCLENBQXBEO0FBQ0EsMkJBQVcsRUFBWCxDQUFjLDRCQUFrQixlQUFoQyxFQUFpRCxpQkFBaUIsSUFBakIsQ0FBc0IsSUFBdEIsQ0FBakQ7QUFDQSwyQkFBVyxFQUFYLENBQWMsNEJBQWtCLG1CQUFoQyxFQUFxRCxxQkFBcUIsSUFBckIsQ0FBMEIsSUFBMUIsQ0FBckQ7QUFDQTtBQUNKLGlCQUFLLFNBQUw7QUFDSSxvQkFBSSxVQUFKLEVBQWdCO0FBQ1osK0JBQVcsT0FBWDtBQUNBLGlDQUFhLElBQWI7QUFDSDtBQUNELHFCQUFLLFdBQUwsQ0FBaUIsRUFBQyxLQUFLLFdBQU4sRUFBakI7QUFDQTtBQUNKLGlCQUFLLE9BQUw7QUFDSSwyQkFBVyxLQUFYO0FBQ0E7QUFDSixpQkFBSyxNQUFMO0FBQ0ksMkJBQVcsSUFBWDtBQUNBO0FBQ0osaUJBQUssTUFBTDtBQUNJLDJCQUFXLElBQVgsQ0FBZ0IsRUFBRSxJQUFGLENBQU8sS0FBdkI7QUFDQTtBQUNKLGlCQUFLLE9BQUw7QUFDSSwyQkFBVyxLQUFYO0FBQ0E7QUFDSixpQkFBSyxRQUFMO0FBQ0ksMkJBQVcsTUFBWDtBQUNBO0FBQ0osaUJBQUssZ0JBQUw7QUFBdUI7QUFDbkIsd0JBQUksU0FBUyxFQUFFLElBQUYsQ0FBTyxLQUFwQjtBQUNBLDZDQUFlLFdBQWYsQ0FBMkIsTUFBM0I7O0FBRUEsd0JBQUksT0FBTyxjQUFQLEtBQTBCLElBQTlCLEVBQW9DO0FBQ2hDLGlEQUFlLGNBQWYsQ0FBOEIsY0FBOUI7QUFDSCxxQkFGRCxNQUVPO0FBQ0gsaURBQWUsaUJBQWYsQ0FBaUMsY0FBakM7QUFDSDtBQUNEO0FBQ0g7QUEvQ0w7QUFpREgsS0FsREQ7O0FBb0RBLGFBQVMsYUFBVCxDQUF1QixJQUF2QixFQUE2QixXQUE3QixFQUEwQztBQUN0QyxZQUFJLE1BQU07QUFDTixpQkFBSyw0QkFBa0IsWUFEakI7QUFFTixrQkFBTTtBQUNGLHNCQUFNLElBREo7QUFFRixzQkFBTTtBQUZKO0FBRkEsU0FBVjtBQU9BLGFBQUssV0FBTCxDQUFpQixHQUFqQixFQUFzQixDQUFDLFlBQVksSUFBYixDQUF0QixFQVJzQyxDQVFNO0FBQy9DOztBQUVELGFBQVMsY0FBVCxDQUF3QixJQUF4QixFQUE4QixZQUE5QixFQUE0QztBQUN4QyxZQUFJLE1BQU07QUFDTixpQkFBSyw0QkFBa0IsYUFEakI7QUFFTixrQkFBTTtBQUNGLHNCQUFNLElBREo7QUFFRixzQkFBTTtBQUZKO0FBRkEsU0FBVjtBQU9BLGFBQUssV0FBTCxDQUFpQixHQUFqQixFQUFzQixDQUFDLGFBQWEsSUFBZCxDQUF0QixFQVJ3QyxDQVFLO0FBQ2hEOztBQUVELGFBQVMsaUJBQVQsR0FBNkI7QUFDekIsWUFBSSxNQUFNO0FBQ04saUJBQUssNEJBQWtCO0FBRGpCLFNBQVY7QUFHQSxhQUFLLFdBQUwsQ0FBaUIsR0FBakI7QUFDSDs7QUFFRCxhQUFTLG1CQUFULEdBQStCO0FBQzNCLFlBQUksTUFBTTtBQUNOLGlCQUFLLDRCQUFrQjtBQURqQixTQUFWO0FBR0EsYUFBSyxXQUFMLENBQWlCLEdBQWpCO0FBQ0g7O0FBRUQsYUFBUyxXQUFULENBQXFCLFNBQXJCLEVBQWdDO0FBQzVCLFlBQUksTUFBTTtBQUNOLGlCQUFLLDRCQUFrQixVQURqQjtBQUVOLGtCQUFNO0FBRkEsU0FBVjtBQUlBLGFBQUssV0FBTCxDQUFpQixHQUFqQjtBQUNIOztBQUVELGFBQVMsaUJBQVQsQ0FBMkIsUUFBM0IsRUFBcUM7QUFDakMsWUFBSSxNQUFNO0FBQ04saUJBQUssNEJBQWtCLGdCQURqQjtBQUVOLGtCQUFNO0FBRkEsU0FBVjtBQUlBLGFBQUssV0FBTCxDQUFpQixHQUFqQjtBQUNIOztBQUVELGFBQVMsbUJBQVQsQ0FBNkIsSUFBN0IsRUFBbUM7QUFDL0IsWUFBSSxNQUFNO0FBQ04saUJBQUssNEJBQWtCLGtCQURqQjtBQUVOLGtCQUFNO0FBRkEsU0FBVjtBQUlBLGFBQUssV0FBTCxDQUFpQixHQUFqQjtBQUNIOztBQUVELGFBQVMsZ0JBQVQsQ0FBMEIsUUFBMUIsRUFBb0M7QUFDaEMsWUFBSSxNQUFNO0FBQ04saUJBQUssNEJBQWtCLGVBRGpCO0FBRU4sa0JBQU07QUFGQSxTQUFWO0FBSUEsYUFBSyxXQUFMLENBQWlCLEdBQWpCO0FBQ0g7O0FBRUQsYUFBUyxTQUFULENBQW1CLElBQW5CLEVBQXlCLElBQXpCLEVBQStCO0FBQzNCLGFBQUssV0FBTCxDQUFpQjtBQUNiLGlCQUFLLDRCQUFrQixRQURWO0FBRWIsa0JBQU07QUFDRixzQkFBTSxJQURKO0FBRUYsc0JBQU07QUFGSjtBQUZPLFNBQWpCO0FBT0g7O0FBRUQsYUFBUyxZQUFULENBQXNCLElBQXRCLEVBQTRCLElBQTVCLEVBQWtDO0FBQzlCLGFBQUssV0FBTCxDQUFpQjtBQUNiLGlCQUFLLDRCQUFrQixXQURWO0FBRWIsa0JBQU07QUFDRixzQkFBTSxJQURKO0FBRUYsc0JBQU07QUFGSjtBQUZPLFNBQWpCO0FBT0g7O0FBRUQsYUFBUyxvQkFBVCxDQUE4QixZQUE5QixFQUE0QztBQUN4QyxhQUFLLFdBQUwsQ0FBaUI7QUFDYixpQkFBSyw0QkFBa0IsbUJBRFY7QUFFYixrQkFBTTtBQUZPLFNBQWpCO0FBSUg7O0FBRUQsYUFBUyxnQkFBVCxDQUEwQixJQUExQixFQUFnQyxHQUFoQyxFQUFxQztBQUNqQyxhQUFLLFdBQUwsQ0FBaUI7QUFDYixpQkFBSyxpQkFEUTtBQUViLGtCQUFNO0FBQ0Ysc0JBQU0sSUFESjtBQUVGLHdCQUFRO0FBRk47QUFGTyxTQUFqQjtBQU9IO0FBRUosQ0FyS0QsQyxDQXJDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQTRNZSxpQjs7Ozs7Ozs7O3FqQkM1TWY7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUVBLElBQUksS0FBTSxZQUFZO0FBQ2xCLFFBQUksTUFBTSxJQUFJLFdBQUosQ0FBZ0IsQ0FBaEIsQ0FBVjtBQUNDLFFBQUksUUFBSixDQUFhLEdBQWIsQ0FBRCxDQUFvQixRQUFwQixDQUE2QixDQUE3QixFQUFnQyxHQUFoQyxFQUFxQyxJQUFyQyxFQUZrQixDQUUyQjtBQUM3QyxXQUFRLElBQUksVUFBSixDQUFlLEdBQWYsQ0FBRCxDQUFzQixDQUF0QixNQUE2QixHQUFwQyxDQUhrQixDQUd3QjtBQUM3QyxDQUpRLEVBQVQ7O0lBTU0sRzs7Ozs7Ozt3Q0FFcUIsVyxFQUFhLFUsRUFBWSxRLEVBQVU7QUFDdEQsZ0JBQUksT0FBTyxFQUFYOztBQUVBLGdCQUFJO0FBQ0Esb0JBQUksT0FBTyxJQUFJLFVBQUosQ0FBZSxXQUFmLEVBQTRCLFVBQTVCLEVBQXdDLFFBQXhDLENBQVg7QUFDQSxvQkFBSSxRQUFRLElBQUksVUFBSixDQUFlLFdBQWYsRUFBNEIsYUFBYSxLQUFLLElBQTlDLEVBQW9ELFdBQVcsS0FBSyxJQUFwRSxDQUFaOztBQUVBLHFCQUFLLEtBQUssSUFBVixJQUFrQixNQUFNLElBQXhCO0FBQ0gsYUFMRCxDQUtFLE9BQU8sQ0FBUCxFQUFVO0FBQ1IsaUNBQUksQ0FBSixDQUFNLEtBQU4sRUFBYSxFQUFFLFFBQUYsRUFBYjtBQUNIOztBQUVELG1CQUFPLElBQVA7QUFDSDs7O29DQUVrQixXLEVBQWEsVSxFQUFZLFEsRUFBVTtBQUNsRCxnQkFBSSxXQUFXLENBQWYsRUFBa0I7QUFDZCxzQkFBTSxxQ0FBMEIsNkNBQTFCLENBQU47QUFDSDtBQUNELGdCQUFJLE9BQU8sSUFBSSxXQUFKLENBQWdCLFdBQWhCLEVBQTZCLFVBQTdCLEVBQXlDLFFBQXpDLENBQVg7QUFDQSxnQkFBSSxRQUFRLElBQUksVUFBSixDQUFlLFdBQWYsRUFBNEIsYUFBYSxLQUFLLElBQTlDLEVBQW9ELFdBQVcsS0FBSyxJQUFwRSxDQUFaO0FBQ0EsZ0JBQUksY0FBYyxNQUFNLFNBQXhCOztBQUVBLG1CQUFPO0FBQ0gsc0JBQU07QUFDRiwwQkFBTSxLQUFLLElBRFQ7QUFFRiwyQkFBTyxNQUFNO0FBRlgsaUJBREg7QUFLSCxzQkFBTSxLQUFLLElBQUwsR0FBWSxNQUFNLElBTHJCO0FBTUgsMkJBQVc7QUFOUixhQUFQO0FBUUg7OztzQ0FFb0IsVyxFQUFhLFUsRUFBWSxRLEVBQVU7QUFDcEQsbUJBQU8sSUFBSSxXQUFKLENBQWdCLFdBQWhCLEVBQTZCLFVBQTdCLEVBQXlDLFFBQXpDLENBQVA7QUFDSDs7O29DQUVrQixXLEVBQWEsVSxFQUFZLFEsRUFBVTtBQUNsRCxnQkFBSSxXQUFXLENBQWYsRUFBa0I7QUFDZCxzQkFBTSxxQ0FBMEIsbUNBQTFCLENBQU47QUFDSDtBQUNELGdCQUFJLElBQUksSUFBSSxRQUFKLENBQWEsV0FBYixFQUEwQixVQUExQixFQUFzQyxRQUF0QyxDQUFSO0FBQ0EsZ0JBQUksU0FBUyxFQUFFLFNBQUYsQ0FBWSxDQUFaLEVBQWUsQ0FBQyxFQUFoQixDQUFiOztBQUVBLGdCQUFJLFlBQUo7QUFDQSxnQkFBSSxTQUFTLENBQWIsRUFBZ0I7QUFDWixzQkFBTSx3QkFBVyxJQUFJLFVBQUosQ0FBZSxXQUFmLEVBQTRCLGFBQWEsQ0FBekMsRUFBNEMsTUFBNUMsQ0FBWCxDQUFOO0FBQ0gsYUFGRCxNQUVPO0FBQ0gsc0JBQU0sRUFBTjtBQUNIOztBQUVELG1CQUFPO0FBQ0gsc0JBQU0sR0FESDtBQUVILHNCQUFNLElBQUk7QUFGUCxhQUFQO0FBSUg7Ozt3Q0FFc0IsVyxFQUFhLFUsRUFBWSxRLEVBQVU7QUFDdEQsZ0JBQUksV0FBVyxDQUFmLEVBQWtCO0FBQ2Qsc0JBQU0scUNBQTBCLHVDQUExQixDQUFOO0FBQ0g7QUFDRCxnQkFBSSxJQUFJLElBQUksUUFBSixDQUFhLFdBQWIsRUFBMEIsVUFBMUIsRUFBc0MsUUFBdEMsQ0FBUjtBQUNBLGdCQUFJLFNBQVMsRUFBRSxTQUFGLENBQVksQ0FBWixFQUFlLENBQUMsRUFBaEIsQ0FBYjs7QUFFQSxnQkFBSSxZQUFKO0FBQ0EsZ0JBQUksU0FBUyxDQUFiLEVBQWdCO0FBQ1osc0JBQU0sd0JBQVcsSUFBSSxVQUFKLENBQWUsV0FBZixFQUE0QixhQUFhLENBQXpDLEVBQTRDLE1BQTVDLENBQVgsQ0FBTjtBQUNILGFBRkQsTUFFTztBQUNILHNCQUFNLEVBQU47QUFDSDs7QUFFRCxtQkFBTztBQUNILHNCQUFNLEdBREg7QUFFSCxzQkFBTSxJQUFJO0FBRlAsYUFBUDtBQUlIOzs7a0NBRWdCLFcsRUFBYSxVLEVBQVksUSxFQUFVO0FBQ2hELGdCQUFJLFdBQVcsRUFBZixFQUFtQjtBQUNmLHNCQUFNLHFDQUEwQixtQ0FBMUIsQ0FBTjtBQUNIO0FBQ0QsZ0JBQUksSUFBSSxJQUFJLFFBQUosQ0FBYSxXQUFiLEVBQTBCLFVBQTFCLEVBQXNDLFFBQXRDLENBQVI7QUFDQSxnQkFBSSxZQUFZLEVBQUUsVUFBRixDQUFhLENBQWIsRUFBZ0IsQ0FBQyxFQUFqQixDQUFoQjtBQUNBLGdCQUFJLGtCQUFrQixFQUFFLFFBQUYsQ0FBVyxDQUFYLEVBQWMsQ0FBQyxFQUFmLENBQXRCO0FBQ0EseUJBQWEsa0JBQWtCLEVBQWxCLEdBQXVCLElBQXBDLENBUGdELENBT0w7O0FBRTNDLG1CQUFPO0FBQ0gsc0JBQU0sSUFBSSxJQUFKLENBQVMsU0FBVCxDQURIO0FBRUgsc0JBQU0sSUFBSTtBQUZQLGFBQVA7QUFJSDs7O21DQUVpQixXLEVBQWEsVSxFQUFZLFEsRUFBVTtBQUNqRCxnQkFBSSxXQUFXLENBQWYsRUFBa0I7QUFDZCxzQkFBTSxxQ0FBMEIsa0NBQTFCLENBQU47QUFDSDs7QUFFRCxnQkFBSSxJQUFJLElBQUksUUFBSixDQUFhLFdBQWIsRUFBMEIsVUFBMUIsRUFBc0MsUUFBdEMsQ0FBUjs7QUFFQSxnQkFBSSxTQUFTLENBQWI7QUFDQSxnQkFBSSxPQUFPLEVBQUUsUUFBRixDQUFXLENBQVgsQ0FBWDtBQUNBLGdCQUFJLGNBQUo7QUFDQSxnQkFBSSxZQUFZLEtBQWhCOztBQUVBLGdCQUFJO0FBQ0Esd0JBQVEsSUFBUjtBQUNJLHlCQUFLLENBQUw7QUFBUztBQUNMLGdDQUFRLEVBQUUsVUFBRixDQUFhLENBQWIsRUFBZ0IsQ0FBQyxFQUFqQixDQUFSO0FBQ0Esa0NBQVUsQ0FBVjtBQUNBO0FBQ0oseUJBQUssQ0FBTDtBQUFRO0FBQUc7QUFDUCxnQ0FBSSxJQUFJLEVBQUUsUUFBRixDQUFXLENBQVgsQ0FBUjtBQUNBLG9DQUFRLElBQUksSUFBSixHQUFXLEtBQW5CO0FBQ0Esc0NBQVUsQ0FBVjtBQUNBO0FBQ0g7QUFDRCx5QkFBSyxDQUFMO0FBQVE7QUFBRztBQUNQLGdDQUFJLFNBQVMsSUFBSSxXQUFKLENBQWdCLFdBQWhCLEVBQTZCLGFBQWEsQ0FBMUMsRUFBNkMsV0FBVyxDQUF4RCxDQUFiO0FBQ0Esb0NBQVEsT0FBTyxJQUFmO0FBQ0Esc0NBQVUsT0FBTyxJQUFqQjtBQUNBO0FBQ0g7QUFDRCx5QkFBSyxDQUFMO0FBQVE7QUFBRTtBQUNOLG9DQUFRLEVBQVI7QUFDQSxnQ0FBSSxXQUFXLENBQWYsQ0FGSSxDQUVlO0FBQ25CLGdDQUFJLENBQUMsRUFBRSxTQUFGLENBQVksV0FBVyxDQUF2QixFQUEwQixDQUFDLEVBQTNCLElBQWlDLFVBQWxDLE1BQWtELENBQXRELEVBQXlEO0FBQ3JELDJDQUFXLENBQVg7QUFDSDtBQUNELG1DQUFPLFNBQVMsV0FBVyxDQUEzQixFQUE4QjtBQUFHO0FBQzdCLG9DQUFJLFNBQVMsSUFBSSxXQUFKLENBQWdCLFdBQWhCLEVBQTZCLGFBQWEsTUFBMUMsRUFBa0QsV0FBVyxNQUFYLEdBQW9CLFFBQXRFLENBQWI7QUFDQSxvQ0FBSSxPQUFPLFNBQVgsRUFDSTtBQUNKLHNDQUFNLE9BQU8sSUFBUCxDQUFZLElBQWxCLElBQTBCLE9BQU8sSUFBUCxDQUFZLEtBQXRDO0FBQ0EsMENBQVUsT0FBTyxJQUFqQjtBQUNIO0FBQ0QsZ0NBQUksVUFBVSxXQUFXLENBQXpCLEVBQTRCO0FBQ3hCLG9DQUFJLFNBQVMsRUFBRSxTQUFGLENBQVksU0FBUyxDQUFyQixFQUF3QixDQUFDLEVBQXpCLElBQStCLFVBQTVDO0FBQ0Esb0NBQUksV0FBVyxDQUFmLEVBQWtCO0FBQ2QsOENBQVUsQ0FBVjtBQUNIO0FBQ0o7QUFDRDtBQUNIO0FBQ0QseUJBQUssQ0FBTDtBQUFRO0FBQUU7QUFDTixvQ0FBUSxFQUFSO0FBQ0Esc0NBQVUsQ0FBVixDQUZJLENBRVU7QUFDZCxnQ0FBSSxZQUFXLENBQWYsQ0FISSxDQUdlO0FBQ25CLGdDQUFJLENBQUMsRUFBRSxTQUFGLENBQVksV0FBVyxDQUF2QixFQUEwQixDQUFDLEVBQTNCLElBQWlDLFVBQWxDLE1BQWtELENBQXRELEVBQXlEO0FBQ3JELDRDQUFXLENBQVg7QUFDSDtBQUNELG1DQUFPLFNBQVMsV0FBVyxDQUEzQixFQUE4QjtBQUFHO0FBQzdCLG9DQUFJLFNBQVMsSUFBSSxhQUFKLENBQWtCLFdBQWxCLEVBQStCLGFBQWEsTUFBNUMsRUFBb0QsV0FBVyxNQUFYLEdBQW9CLFNBQXhFLENBQWI7QUFDQSxvQ0FBSSxPQUFPLFNBQVgsRUFDSTtBQUNKLHNDQUFNLE9BQU8sSUFBUCxDQUFZLElBQWxCLElBQTBCLE9BQU8sSUFBUCxDQUFZLEtBQXRDO0FBQ0EsMENBQVUsT0FBTyxJQUFqQjtBQUNIO0FBQ0QsZ0NBQUksVUFBVSxXQUFXLENBQXpCLEVBQTRCO0FBQ3hCLG9DQUFJLFVBQVMsRUFBRSxTQUFGLENBQVksU0FBUyxDQUFyQixFQUF3QixDQUFDLEVBQXpCLElBQStCLFVBQTVDO0FBQ0Esb0NBQUksWUFBVyxDQUFmLEVBQWtCO0FBQ2QsOENBQVUsQ0FBVjtBQUNIO0FBQ0o7QUFDRDtBQUNIO0FBQ0QseUJBQUssQ0FBTDtBQUFTO0FBQ0wsZ0NBQVEsU0FBUjtBQUNBLGlDQUFTLENBQVQ7QUFDQSxvQ0FBWSxJQUFaO0FBQ0E7QUFDSix5QkFBSyxFQUFMO0FBQVM7QUFBRztBQUNSO0FBQ0Esb0NBQVEsRUFBUjtBQUNBLGdDQUFJLG9CQUFvQixFQUFFLFNBQUYsQ0FBWSxDQUFaLEVBQWUsQ0FBQyxFQUFoQixDQUF4QjtBQUNBLHNDQUFVLENBQVY7QUFDQSxpQ0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLGlCQUFwQixFQUF1QyxHQUF2QyxFQUE0QztBQUN4QyxvQ0FBSSxNQUFNLElBQUksVUFBSixDQUFlLFdBQWYsRUFBNEIsYUFBYSxNQUF6QyxFQUFpRCxXQUFXLE1BQTVELENBQVY7QUFDQSxzQ0FBTSxJQUFOLENBQVcsSUFBSSxJQUFmO0FBQ0EsMENBQVUsSUFBSSxJQUFkO0FBQ0g7QUFDRDtBQUNIO0FBQ0QseUJBQUssRUFBTDtBQUFTO0FBQUc7QUFDUixnQ0FBSSxPQUFPLElBQUksU0FBSixDQUFjLFdBQWQsRUFBMkIsYUFBYSxDQUF4QyxFQUEyQyxXQUFXLENBQXRELENBQVg7QUFDQSxvQ0FBUSxLQUFLLElBQWI7QUFDQSxzQ0FBVSxLQUFLLElBQWY7QUFDQTtBQUNIO0FBQ0QseUJBQUssRUFBTDtBQUFTO0FBQUc7QUFDUixnQ0FBSSxhQUFhLElBQUksV0FBSixDQUFnQixXQUFoQixFQUE2QixhQUFhLENBQTFDLEVBQTZDLFdBQVcsQ0FBeEQsQ0FBakI7QUFDQSxvQ0FBUSxXQUFXLElBQW5CO0FBQ0Esc0NBQVUsV0FBVyxJQUFyQjtBQUNBO0FBQ0g7QUFDRDtBQUNJO0FBQ0EsaUNBQVMsUUFBVDtBQUNBLHlDQUFJLENBQUosQ0FBTSxLQUFOLEVBQWEsZ0NBQWdDLElBQTdDO0FBNUZSO0FBOEZILGFBL0ZELENBK0ZFLE9BQU8sQ0FBUCxFQUFVO0FBQ1IsaUNBQUksQ0FBSixDQUFNLEtBQU4sRUFBYSxFQUFFLFFBQUYsRUFBYjtBQUNIOztBQUVELG1CQUFPO0FBQ0gsc0JBQU0sS0FESDtBQUVILHNCQUFNLE1BRkg7QUFHSCwyQkFBVztBQUhSLGFBQVA7QUFLSDs7Ozs7O2tCQUlVLEc7Ozs7Ozs7O0FDbFBmOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsSUFBTSxjQUFjO0FBQ2hCLE1BQUksSUFEWTtBQUVoQixnQkFBYyxhQUZFO0FBR2hCLHNCQUFvQixtQkFISjtBQUloQixxQkFBbUI7QUFKSCxDQUFwQjs7a0JBT2UsVzs7Ozs7Ozs7O3FqQkN6QmY7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTs7OztBQUVBO0lBQ00sUztBQUVGLHVCQUFZLFVBQVosRUFBd0I7QUFBQTs7QUFDcEIsYUFBSyxHQUFMLEdBQVcsV0FBWDs7QUFFQSxhQUFLLE9BQUwsR0FBZSxVQUFmO0FBQ0EsYUFBSyxhQUFMLEdBQXFCLENBQXJCO0FBQ0EsYUFBSyxZQUFMLEdBQW9CLFdBQVcsVUFBL0I7QUFDQSxhQUFLLFdBQUwsR0FBbUIsV0FBVyxVQUFYLEdBQXdCLENBQTNDO0FBQ0EsYUFBSyxhQUFMLEdBQXFCLENBQXJCO0FBQ0EsYUFBSyx1QkFBTCxHQUErQixDQUEvQjtBQUNIOzs7O2tDQUVTO0FBQ04saUJBQUssT0FBTCxHQUFlLElBQWY7QUFDSDs7OzJDQUVrQjtBQUNmLGdCQUFJLG9CQUFvQixLQUFLLFlBQUwsR0FBb0IsS0FBSyxhQUFqRDtBQUNBLGdCQUFJLHFCQUFxQixDQUF6QixFQUNJLE1BQU0scUNBQTBCLHNEQUExQixDQUFOOztBQUVKLGdCQUFJLGFBQWEsS0FBSyxHQUFMLENBQVMsQ0FBVCxFQUFZLGlCQUFaLENBQWpCO0FBQ0EsZ0JBQUksT0FBTyxJQUFJLFVBQUosQ0FBZSxDQUFmLENBQVg7QUFDQSxpQkFBSyxHQUFMLENBQVMsS0FBSyxPQUFMLENBQWEsUUFBYixDQUFzQixLQUFLLGFBQTNCLEVBQTBDLEtBQUssYUFBTCxHQUFxQixVQUEvRCxDQUFUO0FBQ0EsaUJBQUssYUFBTCxHQUFxQixJQUFJLFFBQUosQ0FBYSxLQUFLLE1BQWxCLEVBQTBCLFNBQTFCLENBQW9DLENBQXBDLEVBQXVDLEtBQXZDLENBQXJCOztBQUVBLGlCQUFLLGFBQUwsSUFBc0IsVUFBdEI7QUFDQSxpQkFBSyx1QkFBTCxHQUErQixhQUFhLENBQTVDO0FBQ0g7OztpQ0FFUSxJLEVBQU07QUFDWCxnQkFBSSxPQUFPLEVBQVgsRUFDSSxNQUFNLHdDQUE2QixpREFBN0IsQ0FBTjs7QUFFSixnQkFBSSxRQUFRLEtBQUssdUJBQWpCLEVBQTBDO0FBQ3RDLG9CQUFJLFVBQVMsS0FBSyxhQUFMLEtBQXdCLEtBQUssSUFBMUM7QUFDQSxxQkFBSyxhQUFMLEtBQXVCLElBQXZCO0FBQ0EscUJBQUssdUJBQUwsSUFBZ0MsSUFBaEM7QUFDQSx1QkFBTyxPQUFQO0FBQ0g7O0FBRUQsZ0JBQUksU0FBUyxLQUFLLHVCQUFMLEdBQStCLEtBQUssYUFBcEMsR0FBb0QsQ0FBakU7QUFDQSxxQkFBUyxXQUFZLEtBQUssS0FBSyx1QkFBL0I7QUFDQSxnQkFBSSxpQkFBaUIsT0FBTyxLQUFLLHVCQUFqQzs7QUFFQSxpQkFBSyxnQkFBTDtBQUNBLGdCQUFJLGlCQUFpQixLQUFLLEdBQUwsQ0FBUyxjQUFULEVBQXlCLEtBQUssdUJBQTlCLENBQXJCOztBQUVBLGdCQUFJLFVBQVUsS0FBSyxhQUFMLEtBQXdCLEtBQUssY0FBM0M7QUFDQSxpQkFBSyxhQUFMLEtBQXVCLGNBQXZCO0FBQ0EsaUJBQUssdUJBQUwsSUFBZ0MsY0FBaEM7O0FBRUEscUJBQVUsVUFBVSxjQUFYLEdBQTZCLE9BQXRDO0FBQ0EsbUJBQU8sTUFBUDtBQUNIOzs7bUNBRVU7QUFDUCxtQkFBTyxLQUFLLFFBQUwsQ0FBYyxDQUFkLE1BQXFCLENBQTVCO0FBQ0g7OzttQ0FFVTtBQUNQLG1CQUFPLEtBQUssUUFBTCxDQUFjLENBQWQsQ0FBUDtBQUNIOzs7MkNBRWtCO0FBQ2YsZ0JBQUksbUJBQUo7QUFDQSxpQkFBSyxhQUFhLENBQWxCLEVBQXFCLGFBQWEsS0FBSyx1QkFBdkMsRUFBZ0UsWUFBaEUsRUFBOEU7QUFDMUUsb0JBQUksT0FBTyxLQUFLLGFBQUwsR0FBc0IsZUFBZSxVQUE1QyxDQUFKLEVBQThEO0FBQzFELHlCQUFLLGFBQUwsS0FBdUIsVUFBdkI7QUFDQSx5QkFBSyx1QkFBTCxJQUFnQyxVQUFoQztBQUNBLDJCQUFPLFVBQVA7QUFDSDtBQUNKO0FBQ0QsaUJBQUssZ0JBQUw7QUFDQSxtQkFBTyxhQUFhLEtBQUssZ0JBQUwsRUFBcEI7QUFDSDs7O2tDQUVTO0FBQUc7QUFDVCxnQkFBSSxnQkFBZ0IsS0FBSyxnQkFBTCxFQUFwQjtBQUNBLG1CQUFPLEtBQUssUUFBTCxDQUFjLGdCQUFnQixDQUE5QixJQUFtQyxDQUExQztBQUNIOzs7a0NBRVM7QUFBRztBQUNULGdCQUFJLFFBQVEsS0FBSyxPQUFMLEVBQVo7QUFDQSxnQkFBSSxRQUFRLElBQVosRUFBa0I7QUFDZCx1QkFBUSxRQUFRLENBQVQsS0FBZ0IsQ0FBdkI7QUFDSCxhQUZELE1BRU87QUFDSCx1QkFBTyxDQUFDLENBQUQsSUFBTSxVQUFVLENBQWhCLENBQVA7QUFDSDtBQUNKOzs7Ozs7a0JBSVUsUzs7Ozs7Ozs7Ozs7cWpCQ25IZjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsU0FBUyxNQUFULENBQWdCLEdBQWhCLEVBQXFCO0FBQ2pCLFdBQVUsUUFBUSxDQUFULEdBQWMsSUFBZixHQUNDLENBQUMsTUFBTSxJQUFQLEtBQWdCLENBRHpCO0FBRUg7O0FBRUQsU0FBUyxNQUFULENBQWdCLEdBQWhCLEVBQXFCO0FBQ2pCLFdBQVMsQ0FBQyxNQUFNLFVBQVAsTUFBdUIsRUFBeEIsR0FDQyxDQUFDLE1BQU0sVUFBUCxNQUF1QixDQUR4QixHQUVDLENBQUMsTUFBTSxVQUFQLEtBQXNCLENBRnZCLEdBR0MsQ0FBQyxNQUFNLFVBQVAsS0FBc0IsRUFIL0I7QUFJSDs7QUFFRCxTQUFTLFNBQVQsQ0FBbUIsS0FBbkIsRUFBMEIsS0FBMUIsRUFBaUM7QUFDN0IsV0FBUyxNQUFNLEtBQU4sS0FBZ0IsRUFBakIsR0FDQyxNQUFNLFFBQVEsQ0FBZCxLQUFvQixFQURyQixHQUVDLE1BQU0sUUFBUSxDQUFkLEtBQW9CLENBRnJCLEdBR0MsTUFBTSxRQUFRLENBQWQsQ0FIVDtBQUlIOztJQUdLLFU7QUFFRix3QkFBWSxTQUFaLEVBQXVCLE1BQXZCLEVBQStCO0FBQUE7O0FBQzNCLGFBQUssR0FBTCxHQUFXLFlBQVg7O0FBRUEsYUFBSyxPQUFMLEdBQWUsTUFBZjs7QUFFQSxhQUFLLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQSxhQUFLLFlBQUwsR0FBb0IsSUFBcEI7QUFDQSxhQUFLLGtCQUFMLEdBQTBCLElBQTFCO0FBQ0EsYUFBSyxvQkFBTCxHQUE0QixJQUE1QjtBQUNBLGFBQUssZ0JBQUwsR0FBd0IsSUFBeEI7QUFDQSxhQUFLLGdCQUFMLEdBQXdCLElBQXhCOztBQUVBLGFBQUssV0FBTCxHQUFtQixVQUFVLFVBQTdCO0FBQ0EsYUFBSyxXQUFMLEdBQW1CLElBQW5CO0FBQ0EsYUFBSyxTQUFMLEdBQWlCLEtBQWpCOztBQUVBLGFBQUssU0FBTCxHQUFpQixVQUFVLGFBQTNCO0FBQ0EsYUFBSyxTQUFMLEdBQWlCLFVBQVUsYUFBM0I7O0FBRUEsYUFBSyxzQkFBTCxHQUE4QixLQUE5QjtBQUNBLGFBQUssc0JBQUwsR0FBOEIsS0FBOUI7O0FBRUEsYUFBSywrQkFBTCxHQUF1QyxLQUF2QztBQUNBLGFBQUssK0JBQUwsR0FBdUMsS0FBdkM7O0FBRUEsYUFBSyxVQUFMLEdBQWtCLHlCQUFsQjtBQUNBLGFBQUssVUFBTCxDQUFnQixRQUFoQixHQUEyQixLQUFLLFNBQWhDO0FBQ0EsYUFBSyxVQUFMLENBQWdCLFFBQWhCLEdBQTJCLEtBQUssU0FBaEM7QUFDQSxhQUFLLFNBQUwsR0FBaUIsSUFBakI7QUFDQSxhQUFLLGNBQUwsR0FBc0IsSUFBdEI7QUFDQSxhQUFLLGNBQUwsR0FBc0IsSUFBdEI7O0FBRUEsYUFBSyxlQUFMLEdBQXVCLENBQXZCO0FBQ0EsYUFBSyxjQUFMLEdBQXNCLENBQXRCLENBakMyQixDQWlDRDtBQUMxQixhQUFLLFVBQUwsR0FBa0IsSUFBbEI7QUFDQSxhQUFLLFNBQUwsR0FBaUIsQ0FBakIsQ0FuQzJCLENBbUNOO0FBQ3JCLGFBQUssa0JBQUwsR0FBMEIsS0FBMUI7QUFDQSxhQUFLLG1CQUFMLEdBQTJCO0FBQ3ZCLG1CQUFPLElBRGdCO0FBRXZCLGlCQUFLLE1BRmtCO0FBR3ZCLHFCQUFTLEtBSGM7QUFJdkIscUJBQVM7QUFKYyxTQUEzQjs7QUFPQSxhQUFLLGtCQUFMLEdBQTBCLENBQUMsSUFBRCxFQUFPLEtBQVAsRUFBYyxLQUFkLEVBQXFCLEtBQXJCLEVBQTRCLEtBQTVCLENBQTFCOztBQUVBLGFBQUssa0JBQUwsR0FBMEIsQ0FDdEIsS0FEc0IsRUFDZixLQURlLEVBQ1IsS0FEUSxFQUNELEtBREMsRUFDTSxLQUROLEVBQ2EsS0FEYixFQUV0QixLQUZzQixFQUVmLEtBRmUsRUFFUixLQUZRLEVBRUQsS0FGQyxFQUVNLEtBRk4sRUFFYSxJQUZiLEVBRW1CLElBRm5CLENBQTFCOztBQUtBLGFBQUssNEJBQUwsR0FBb0MsQ0FBQyxLQUFELEVBQVEsS0FBUixFQUFlLEtBQWYsRUFBc0IsQ0FBdEIsQ0FBcEM7QUFDQSxhQUFLLDRCQUFMLEdBQW9DLENBQUMsS0FBRCxFQUFRLEtBQVIsRUFBZSxLQUFmLEVBQXNCLENBQXRCLENBQXBDO0FBQ0EsYUFBSyw0QkFBTCxHQUFvQyxDQUFDLEtBQUQsRUFBUSxLQUFSLEVBQWUsSUFBZixFQUFzQixDQUF0QixDQUFwQzs7QUFFQSxhQUFLLHdCQUFMLEdBQWdDLENBQUMsQ0FBRCxFQUFJLEVBQUosRUFBUSxFQUFSLEVBQVksRUFBWixFQUFnQixHQUFoQixFQUFxQixHQUFyQixFQUEwQixHQUExQixFQUErQixHQUEvQixFQUFvQyxHQUFwQyxFQUF5QyxHQUF6QyxFQUE4QyxHQUE5QyxFQUFtRCxHQUFuRCxFQUF3RCxHQUF4RCxFQUE2RCxHQUE3RCxFQUFrRSxHQUFsRSxFQUF1RSxDQUFDLENBQXhFLENBQWhDO0FBQ0EsYUFBSyx3QkFBTCxHQUFnQyxDQUFDLENBQUQsRUFBSSxFQUFKLEVBQVEsRUFBUixFQUFZLEVBQVosRUFBaUIsRUFBakIsRUFBc0IsRUFBdEIsRUFBMkIsRUFBM0IsRUFBK0IsR0FBL0IsRUFBb0MsR0FBcEMsRUFBeUMsR0FBekMsRUFBOEMsR0FBOUMsRUFBbUQsR0FBbkQsRUFBd0QsR0FBeEQsRUFBNkQsR0FBN0QsRUFBa0UsR0FBbEUsRUFBdUUsQ0FBQyxDQUF4RSxDQUFoQztBQUNBLGFBQUssd0JBQUwsR0FBZ0MsQ0FBQyxDQUFELEVBQUksRUFBSixFQUFRLEVBQVIsRUFBWSxFQUFaLEVBQWlCLEVBQWpCLEVBQXNCLEVBQXRCLEVBQTJCLEVBQTNCLEVBQWdDLEVBQWhDLEVBQW9DLEdBQXBDLEVBQXlDLEdBQXpDLEVBQThDLEdBQTlDLEVBQW1ELEdBQW5ELEVBQXdELEdBQXhELEVBQTZELEdBQTdELEVBQWtFLEdBQWxFLEVBQXVFLENBQUMsQ0FBeEUsQ0FBaEM7O0FBRUEsYUFBSyxXQUFMLEdBQW1CLEVBQUMsTUFBTSxPQUFQLEVBQWdCLElBQUksQ0FBcEIsRUFBdUIsZ0JBQWdCLENBQXZDLEVBQTBDLFNBQVMsRUFBbkQsRUFBdUQsUUFBUSxDQUEvRCxFQUFuQjtBQUNBLGFBQUssV0FBTCxHQUFtQixFQUFDLE1BQU0sT0FBUCxFQUFnQixJQUFJLENBQXBCLEVBQXVCLGdCQUFnQixDQUF2QyxFQUEwQyxTQUFTLEVBQW5ELEVBQXVELFFBQVEsQ0FBL0QsRUFBbkI7O0FBRUEsYUFBSyxhQUFMLEdBQXNCLFlBQVk7QUFDOUIsZ0JBQUksTUFBTSxJQUFJLFdBQUosQ0FBZ0IsQ0FBaEIsQ0FBVjtBQUNDLGdCQUFJLFFBQUosQ0FBYSxHQUFiLENBQUQsQ0FBb0IsUUFBcEIsQ0FBNkIsQ0FBN0IsRUFBZ0MsR0FBaEMsRUFBcUMsSUFBckMsRUFGOEIsQ0FFZTtBQUM3QyxtQkFBUSxJQUFJLFVBQUosQ0FBZSxHQUFmLENBQUQsQ0FBc0IsQ0FBdEIsTUFBNkIsR0FBcEMsQ0FIOEIsQ0FHWTtBQUM3QyxTQUpvQixFQUFyQjtBQUtIOzs7O2tDQUVTO0FBQ04saUJBQUssVUFBTCxHQUFrQixJQUFsQjtBQUNBLGlCQUFLLFNBQUwsR0FBaUIsSUFBakI7QUFDQSxpQkFBSyxjQUFMLEdBQXNCLElBQXRCO0FBQ0EsaUJBQUssY0FBTCxHQUFzQixJQUF0QjtBQUNBLGlCQUFLLFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxpQkFBSyxXQUFMLEdBQW1CLElBQW5COztBQUVBLGlCQUFLLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQSxpQkFBSyxZQUFMLEdBQW9CLElBQXBCO0FBQ0EsaUJBQUssa0JBQUwsR0FBMEIsSUFBMUI7QUFDQSxpQkFBSyxvQkFBTCxHQUE0QixJQUE1QjtBQUNBLGlCQUFLLGdCQUFMLEdBQXdCLElBQXhCO0FBQ0EsaUJBQUssZ0JBQUwsR0FBd0IsSUFBeEI7QUFDSDs7O3VDQTRCYyxNLEVBQVE7QUFDbkIsbUJBQU8sYUFBUCxHQUF1QixLQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBc0IsSUFBdEIsQ0FBdkI7QUFDQSxtQkFBTyxJQUFQO0FBQ0g7O0FBRUQ7Ozs7eUNBc0ZpQjtBQUNiLGlCQUFLLFVBQUwsR0FBa0IseUJBQWxCO0FBQ0g7Ozt1REFFOEI7QUFDM0IsZ0JBQUksS0FBSyxTQUFMLElBQWtCLEtBQUssU0FBM0IsRUFBc0M7QUFBRztBQUNyQyx1QkFBTyxLQUFLLCtCQUFMLElBQXdDLEtBQUssK0JBQXBEO0FBQ0g7QUFDRCxnQkFBSSxLQUFLLFNBQUwsSUFBa0IsQ0FBQyxLQUFLLFNBQTVCLEVBQXVDO0FBQUc7QUFDdEMsdUJBQU8sS0FBSywrQkFBWjtBQUNIO0FBQ0QsZ0JBQUksQ0FBQyxLQUFLLFNBQU4sSUFBbUIsS0FBSyxTQUE1QixFQUF1QztBQUFHO0FBQ3RDLHVCQUFPLEtBQUssK0JBQVo7QUFDSDtBQUNELG1CQUFPLEtBQVA7QUFDSDs7QUFFRDs7OztvQ0FDWSxLLEVBQU8sUyxFQUFXO0FBQzFCLGdCQUFJLENBQUMsS0FBSyxRQUFOLElBQWtCLENBQUMsS0FBSyxZQUF4QixJQUF3QyxDQUFDLEtBQUssZ0JBQTlDLElBQWtFLENBQUMsS0FBSyxnQkFBNUUsRUFBOEY7QUFDMUYsc0JBQU0scUNBQTBCLDJGQUExQixDQUFOO0FBQ0g7O0FBRUQsZ0JBQUksU0FBUyxDQUFiO0FBQ0EsZ0JBQUksS0FBSyxLQUFLLGFBQWQ7O0FBRUEsZ0JBQUksY0FBYyxDQUFsQixFQUFxQjtBQUFHO0FBQ3BCLG9CQUFJLE1BQU0sVUFBTixHQUFtQixFQUF2QixFQUEyQjtBQUN2Qix3QkFBSSxZQUFZLFdBQVcsS0FBWCxDQUFpQixLQUFqQixDQUFoQjtBQUNBLDZCQUFTLFVBQVUsVUFBbkI7QUFDSCxpQkFIRCxNQUdPO0FBQ0gsMkJBQU8sQ0FBUDtBQUNIO0FBQ0o7O0FBRUQsZ0JBQUksS0FBSyxXQUFULEVBQXNCO0FBQUc7QUFDckIscUJBQUssV0FBTCxHQUFtQixLQUFuQjtBQUNBLG9CQUFJLFlBQVksTUFBWixLQUF1QixLQUFLLFdBQWhDLEVBQTZDO0FBQ3pDLHFDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0IsaURBQWhCO0FBQ0g7O0FBRUQsb0JBQUksSUFBSSxJQUFJLFFBQUosQ0FBYSxLQUFiLEVBQW9CLE1BQXBCLENBQVI7QUFDQSxvQkFBSSxlQUFlLEVBQUUsU0FBRixDQUFZLENBQVosRUFBZSxDQUFDLEVBQWhCLENBQW5CO0FBQ0Esb0JBQUksaUJBQWlCLENBQXJCLEVBQXdCO0FBQ3BCLHFDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0Isd0JBQWhCO0FBQ0g7QUFDRCwwQkFBVSxDQUFWO0FBQ0g7O0FBRUQsbUJBQU8sU0FBUyxNQUFNLFVBQXRCLEVBQWtDO0FBQzlCLHFCQUFLLFNBQUwsR0FBaUIsSUFBakI7O0FBRUEsb0JBQUksS0FBSSxJQUFJLFFBQUosQ0FBYSxLQUFiLEVBQW9CLE1BQXBCLENBQVI7O0FBRUEsb0JBQUksU0FBUyxFQUFULEdBQWMsQ0FBZCxHQUFrQixNQUFNLFVBQTVCLEVBQXdDO0FBQ3BDO0FBQ0E7QUFDSDs7QUFFRCxvQkFBSSxVQUFVLEdBQUUsUUFBRixDQUFXLENBQVgsQ0FBZDtBQUNBLG9CQUFJLFdBQVcsR0FBRSxTQUFGLENBQVksQ0FBWixFQUFlLENBQUMsRUFBaEIsSUFBc0IsVUFBckM7O0FBRUEsb0JBQUksU0FBUyxFQUFULEdBQWMsUUFBZCxHQUF5QixDQUF6QixHQUE2QixNQUFNLFVBQXZDLEVBQW1EO0FBQy9DO0FBQ0E7QUFDSDs7QUFFRCxvQkFBSSxZQUFZLENBQVosSUFBaUIsWUFBWSxDQUE3QixJQUFrQyxZQUFZLEVBQWxELEVBQXNEO0FBQ2xELHFDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsNEJBQXdDLE9BQXhDO0FBQ0E7QUFDQSw4QkFBVSxLQUFLLFFBQUwsR0FBZ0IsQ0FBMUI7QUFDQTtBQUNIOztBQUVELG9CQUFJLE1BQU0sR0FBRSxRQUFGLENBQVcsQ0FBWCxDQUFWO0FBQ0Esb0JBQUksTUFBTSxHQUFFLFFBQUYsQ0FBVyxDQUFYLENBQVY7QUFDQSxvQkFBSSxNQUFNLEdBQUUsUUFBRixDQUFXLENBQVgsQ0FBVjtBQUNBLG9CQUFJLE1BQU0sR0FBRSxRQUFGLENBQVcsQ0FBWCxDQUFWOztBQUVBLG9CQUFJLFlBQVksTUFBTyxPQUFPLENBQWQsR0FBb0IsT0FBTyxFQUEzQixHQUFrQyxPQUFPLEVBQXpEOztBQUVBLG9CQUFJLFdBQVcsR0FBRSxTQUFGLENBQVksQ0FBWixFQUFlLENBQUMsRUFBaEIsSUFBc0IsVUFBckM7QUFDQSxvQkFBSSxhQUFhLENBQWpCLEVBQW9CO0FBQ2hCLHFDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0IsbUNBQWhCO0FBQ0g7O0FBRUQsb0JBQUksYUFBYSxTQUFTLEVBQTFCOztBQUVBLHdCQUFRLE9BQVI7QUFDSSx5QkFBSyxDQUFMO0FBQVM7QUFDTCw2QkFBSyxlQUFMLENBQXFCLEtBQXJCLEVBQTRCLFVBQTVCLEVBQXdDLFFBQXhDLEVBQWtELFNBQWxEO0FBQ0E7QUFDSix5QkFBSyxDQUFMO0FBQVM7QUFDTCw2QkFBSyxlQUFMLENBQXFCLEtBQXJCLEVBQTRCLFVBQTVCLEVBQXdDLFFBQXhDLEVBQWtELFNBQWxELEVBQTZELFlBQVksTUFBekU7QUFDQTtBQUNKLHlCQUFLLEVBQUw7QUFBVTtBQUNOLDZCQUFLLGdCQUFMLENBQXNCLEtBQXRCLEVBQTZCLFVBQTdCLEVBQXlDLFFBQXpDO0FBQ0E7QUFUUjs7QUFZQSxvQkFBSSxjQUFjLEdBQUUsU0FBRixDQUFZLEtBQUssUUFBakIsRUFBMkIsQ0FBQyxFQUE1QixDQUFsQjtBQUNBLG9CQUFJLGdCQUFnQixLQUFLLFFBQXpCLEVBQW1DO0FBQy9CLHFDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsMkJBQXVDLFdBQXZDO0FBQ0g7O0FBRUQsMEJBQVUsS0FBSyxRQUFMLEdBQWdCLENBQTFCLENBeEQ4QixDQXdEQTtBQUNqQzs7QUFFRDtBQUNBLGdCQUFJLEtBQUssNEJBQUwsRUFBSixFQUF5QztBQUNyQyxvQkFBSSxLQUFLLFNBQUwsS0FBbUIsS0FBSyxXQUFMLENBQWlCLE1BQWpCLElBQTJCLEtBQUssV0FBTCxDQUFpQixNQUEvRCxDQUFKLEVBQTRFO0FBQ3hFLHlCQUFLLGdCQUFMLENBQXNCLEtBQUssV0FBM0IsRUFBd0MsS0FBSyxXQUE3QztBQUNIO0FBQ0o7O0FBRUQsbUJBQU8sTUFBUCxDQWpHMEIsQ0FpR1Y7QUFDbkI7Ozt5Q0FFZ0IsVyxFQUFhLFUsRUFBWSxRLEVBQVU7QUFDaEQsZ0JBQUksYUFBYSxvQkFBSSxlQUFKLENBQW9CLFdBQXBCLEVBQWlDLFVBQWpDLEVBQTZDLFFBQTdDLENBQWpCOztBQUVBLGdCQUFJLFdBQVcsY0FBWCxDQUEwQixZQUExQixDQUFKLEVBQTZDO0FBQ3pDLG9CQUFJLFdBQVcsVUFBWCxJQUF5QixJQUF6QixJQUFpQyxRQUFPLFdBQVcsVUFBbEIsTUFBaUMsUUFBdEUsRUFBZ0Y7QUFDNUUscUNBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxFQUFnQiwrQkFBaEI7QUFDQTtBQUNIO0FBQ0Qsb0JBQUksS0FBSyxTQUFULEVBQW9CO0FBQ2hCLHFDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0IsK0JBQWhCO0FBQ0g7QUFDRCxxQkFBSyxTQUFMLEdBQWlCLFVBQWpCO0FBQ0Esb0JBQUksYUFBYSxLQUFLLFNBQUwsQ0FBZSxVQUFoQzs7QUFFQSxvQkFBSSxLQUFLLGtCQUFULEVBQTZCO0FBQ3pCLHlCQUFLLGtCQUFMLENBQXdCLE9BQU8sTUFBUCxDQUFjLEVBQWQsRUFBa0IsVUFBbEIsQ0FBeEI7QUFDSDs7QUFFRCxvQkFBSSxPQUFPLFdBQVcsUUFBbEIsS0FBK0IsU0FBbkMsRUFBOEM7QUFBRztBQUM3Qyx3QkFBSSxLQUFLLHNCQUFMLEtBQWdDLEtBQXBDLEVBQTJDO0FBQ3ZDLDZCQUFLLFNBQUwsR0FBaUIsV0FBVyxRQUE1QjtBQUNBLDZCQUFLLFVBQUwsQ0FBZ0IsUUFBaEIsR0FBMkIsS0FBSyxTQUFoQztBQUNIO0FBQ0o7QUFDRCxvQkFBSSxPQUFPLFdBQVcsUUFBbEIsS0FBK0IsU0FBbkMsRUFBOEM7QUFBRztBQUM3Qyx3QkFBSSxLQUFLLHNCQUFMLEtBQWdDLEtBQXBDLEVBQTJDO0FBQ3ZDLDZCQUFLLFNBQUwsR0FBaUIsV0FBVyxRQUE1QjtBQUNBLDZCQUFLLFVBQUwsQ0FBZ0IsUUFBaEIsR0FBMkIsS0FBSyxTQUFoQztBQUNIO0FBQ0o7QUFDRCxvQkFBSSxPQUFPLFdBQVcsYUFBbEIsS0FBb0MsUUFBeEMsRUFBa0Q7QUFBRztBQUNqRCx5QkFBSyxVQUFMLENBQWdCLGFBQWhCLEdBQWdDLFdBQVcsYUFBM0M7QUFDSDtBQUNELG9CQUFJLE9BQU8sV0FBVyxhQUFsQixLQUFvQyxRQUF4QyxFQUFrRDtBQUFHO0FBQ2pELHlCQUFLLFVBQUwsQ0FBZ0IsYUFBaEIsR0FBZ0MsV0FBVyxhQUEzQztBQUNIO0FBQ0Qsb0JBQUksT0FBTyxXQUFXLEtBQWxCLEtBQTRCLFFBQWhDLEVBQTBDO0FBQUc7QUFDekMseUJBQUssVUFBTCxDQUFnQixLQUFoQixHQUF3QixXQUFXLEtBQW5DO0FBQ0g7QUFDRCxvQkFBSSxPQUFPLFdBQVcsTUFBbEIsS0FBNkIsUUFBakMsRUFBMkM7QUFBRztBQUMxQyx5QkFBSyxVQUFMLENBQWdCLE1BQWhCLEdBQXlCLFdBQVcsTUFBcEM7QUFDSDtBQUNELG9CQUFJLE9BQU8sV0FBVyxRQUFsQixLQUErQixRQUFuQyxFQUE2QztBQUFHO0FBQzVDLHdCQUFJLENBQUMsS0FBSyxrQkFBVixFQUE4QjtBQUMxQiw0QkFBSSxXQUFXLEtBQUssS0FBTCxDQUFXLFdBQVcsUUFBWCxHQUFzQixLQUFLLFVBQXRDLENBQWY7QUFDQSw2QkFBSyxTQUFMLEdBQWlCLFFBQWpCO0FBQ0EsNkJBQUssVUFBTCxDQUFnQixRQUFoQixHQUEyQixRQUEzQjtBQUNIO0FBQ0osaUJBTkQsTUFNTztBQUNILHlCQUFLLFVBQUwsQ0FBZ0IsUUFBaEIsR0FBMkIsQ0FBM0I7QUFDSDtBQUNELG9CQUFJLE9BQU8sV0FBVyxTQUFsQixLQUFnQyxRQUFwQyxFQUE4QztBQUFHO0FBQzdDLHdCQUFJLFVBQVUsS0FBSyxLQUFMLENBQVcsV0FBVyxTQUFYLEdBQXVCLElBQWxDLENBQWQ7QUFDQSx3QkFBSSxVQUFVLENBQWQsRUFBaUI7QUFDYiw0QkFBSSxNQUFNLFVBQVUsSUFBcEI7QUFDQSw2QkFBSyxtQkFBTCxDQUF5QixLQUF6QixHQUFpQyxJQUFqQztBQUNBLDZCQUFLLG1CQUFMLENBQXlCLEdBQXpCLEdBQStCLEdBQS9CO0FBQ0EsNkJBQUssbUJBQUwsQ0FBeUIsT0FBekIsR0FBbUMsT0FBbkM7QUFDQSw2QkFBSyxtQkFBTCxDQUF5QixPQUF6QixHQUFtQyxJQUFuQztBQUNBLDZCQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsR0FBc0IsR0FBdEI7QUFDSDtBQUNKO0FBQ0Qsb0JBQUksUUFBTyxXQUFXLFNBQWxCLE1BQWdDLFFBQXBDLEVBQThDO0FBQUc7QUFDN0MseUJBQUssVUFBTCxDQUFnQixpQkFBaEIsR0FBb0MsSUFBcEM7QUFDQSx3QkFBSSxZQUFZLFdBQVcsU0FBM0I7QUFDQSx5QkFBSyxVQUFMLENBQWdCLGNBQWhCLEdBQWlDLEtBQUssb0JBQUwsQ0FBMEIsU0FBMUIsQ0FBakM7QUFDQSwrQkFBVyxTQUFYLEdBQXVCLElBQXZCLENBSjBDLENBSVo7QUFDakMsaUJBTEQsTUFLTztBQUNILHlCQUFLLFVBQUwsQ0FBZ0IsaUJBQWhCLEdBQW9DLEtBQXBDO0FBQ0g7QUFDRCxxQkFBSyxTQUFMLEdBQWlCLEtBQWpCO0FBQ0EscUJBQUssVUFBTCxDQUFnQixRQUFoQixHQUEyQixVQUEzQjtBQUNBLGlDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0IsbUJBQWhCO0FBQ0Esb0JBQUksS0FBSyxVQUFMLENBQWdCLFVBQWhCLEVBQUosRUFBa0M7QUFDOUIseUJBQUssWUFBTCxDQUFrQixLQUFLLFVBQXZCO0FBQ0g7QUFDSjs7QUFFRCxnQkFBSSxPQUFPLElBQVAsQ0FBWSxVQUFaLEVBQXdCLE1BQXhCLEdBQWlDLENBQXJDLEVBQXdDO0FBQ3BDLG9CQUFJLEtBQUssb0JBQVQsRUFBK0I7QUFDM0IseUJBQUssb0JBQUwsQ0FBMEIsT0FBTyxNQUFQLENBQWMsRUFBZCxFQUFrQixVQUFsQixDQUExQjtBQUNIO0FBQ0o7QUFDSjs7OzZDQUVvQixTLEVBQVc7QUFDNUIsZ0JBQUksUUFBUSxFQUFaO0FBQ0EsZ0JBQUksZ0JBQWdCLEVBQXBCOztBQUVBO0FBQ0EsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxVQUFVLEtBQVYsQ0FBZ0IsTUFBcEMsRUFBNEMsR0FBNUMsRUFBaUQ7QUFDN0Msb0JBQUksT0FBTyxLQUFLLGNBQUwsR0FBc0IsS0FBSyxLQUFMLENBQVcsVUFBVSxLQUFWLENBQWdCLENBQWhCLElBQXFCLElBQWhDLENBQWpDO0FBQ0Esc0JBQU0sSUFBTixDQUFXLElBQVg7QUFDQSw4QkFBYyxJQUFkLENBQW1CLFVBQVUsYUFBVixDQUF3QixDQUF4QixDQUFuQjtBQUNIOztBQUVELG1CQUFPO0FBQ0gsdUJBQU8sS0FESjtBQUVILCtCQUFlO0FBRlosYUFBUDtBQUlIOzs7d0NBRWUsVyxFQUFhLFUsRUFBWSxRLEVBQVUsWSxFQUFjO0FBQzdELGdCQUFJLFlBQVksQ0FBaEIsRUFBbUI7QUFDZixpQ0FBSSxDQUFKLENBQU0sS0FBSyxHQUFYLEVBQWdCLHVEQUFoQjtBQUNBO0FBQ0g7O0FBRUQsZ0JBQUksS0FBSyxzQkFBTCxLQUFnQyxJQUFoQyxJQUF3QyxLQUFLLFNBQUwsS0FBbUIsS0FBL0QsRUFBc0U7QUFDbEU7QUFDQTtBQUNBO0FBQ0g7O0FBRUQsZ0JBQUksS0FBSyxLQUFLLGFBQWQ7QUFDQSxnQkFBSSxJQUFJLElBQUksUUFBSixDQUFhLFdBQWIsRUFBMEIsVUFBMUIsRUFBc0MsUUFBdEMsQ0FBUjs7QUFFQSxnQkFBSSxZQUFZLEVBQUUsUUFBRixDQUFXLENBQVgsQ0FBaEI7O0FBRUEsZ0JBQUksY0FBYyxjQUFjLENBQWhDO0FBQ0EsZ0JBQUksZ0JBQWdCLENBQWhCLElBQXFCLGdCQUFnQixFQUF6QyxFQUE2QztBQUFHO0FBQzVDLHFCQUFLLFFBQUwsQ0FBYyxzQkFBWSxpQkFBMUIsRUFBNkMsdUNBQXVDLFdBQXBGO0FBQ0E7QUFDSDs7QUFFRCxnQkFBSSxZQUFZLENBQWhCO0FBQ0EsZ0JBQUksaUJBQWlCLENBQUMsWUFBWSxFQUFiLE1BQXFCLENBQTFDO0FBQ0EsZ0JBQUksa0JBQWtCLENBQWxCLElBQXVCLGtCQUFrQixDQUE3QyxFQUFnRDtBQUM1Qyw0QkFBWSxLQUFLLGtCQUFMLENBQXdCLGNBQXhCLENBQVo7QUFDSCxhQUZELE1BRU87QUFDSCxxQkFBSyxRQUFMLENBQWMsc0JBQVksWUFBMUIsRUFBd0MseUNBQXlDLGNBQWpGO0FBQ0E7QUFDSDs7QUFFRCxnQkFBSSxZQUFZLENBQUMsWUFBWSxDQUFiLE1BQW9CLENBQXBDLENBaEM2RCxDQWdDckI7QUFDeEMsZ0JBQUksWUFBYSxZQUFZLENBQTdCOztBQUdBLGdCQUFJLE9BQU8sS0FBSyxjQUFoQjtBQUNBLGdCQUFJLFFBQVEsS0FBSyxXQUFqQjs7QUFFQSxnQkFBSSxDQUFDLElBQUwsRUFBVztBQUNQLG9CQUFJLEtBQUssU0FBTCxLQUFtQixLQUFuQixJQUE0QixLQUFLLHNCQUFMLEtBQWdDLEtBQWhFLEVBQXVFO0FBQ25FLHlCQUFLLFNBQUwsR0FBaUIsSUFBakI7QUFDQSx5QkFBSyxVQUFMLENBQWdCLFFBQWhCLEdBQTJCLElBQTNCO0FBQ0g7O0FBRUQ7QUFDQSx1QkFBTyxLQUFLLGNBQUwsR0FBc0IsRUFBN0I7QUFDQSxxQkFBSyxJQUFMLEdBQVksT0FBWjtBQUNBLHFCQUFLLEVBQUwsR0FBVSxNQUFNLEVBQWhCO0FBQ0EscUJBQUssU0FBTCxHQUFpQixLQUFLLFVBQXRCO0FBQ0EscUJBQUssUUFBTCxHQUFnQixLQUFLLFNBQXJCO0FBQ0EscUJBQUssZUFBTCxHQUF1QixTQUF2QjtBQUNBLHFCQUFLLFlBQUwsR0FBcUIsY0FBYyxDQUFkLEdBQWtCLENBQWxCLEdBQXNCLENBQTNDO0FBQ0g7O0FBRUQsZ0JBQUksZ0JBQWdCLEVBQXBCLEVBQXdCO0FBQUc7QUFDdkIsb0JBQUksVUFBVSxLQUFLLGtCQUFMLENBQXdCLFdBQXhCLEVBQXFDLGFBQWEsQ0FBbEQsRUFBcUQsV0FBVyxDQUFoRSxDQUFkO0FBQ0Esb0JBQUksV0FBVyxTQUFmLEVBQTBCO0FBQ3RCO0FBQ0g7O0FBRUQsb0JBQUksUUFBUSxVQUFSLEtBQXVCLENBQTNCLEVBQThCO0FBQUc7QUFDN0Isd0JBQUksS0FBSyxNQUFULEVBQWlCO0FBQ2IseUNBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxFQUFnQixvQ0FBaEI7QUFDSDtBQUNELHdCQUFJLE9BQU8sUUFBUSxJQUFuQjtBQUNBLHlCQUFLLGVBQUwsR0FBdUIsS0FBSyxZQUE1QjtBQUNBLHlCQUFLLFlBQUwsR0FBb0IsS0FBSyxZQUF6QjtBQUNBLHlCQUFLLEtBQUwsR0FBYSxLQUFLLEtBQWxCO0FBQ0EseUJBQUssYUFBTCxHQUFxQixLQUFLLGFBQTFCO0FBQ0EseUJBQUssTUFBTCxHQUFjLEtBQUssTUFBbkI7QUFDQTtBQUNBLHlCQUFLLGlCQUFMLEdBQXlCLE9BQU8sS0FBSyxlQUFaLEdBQThCLEtBQUssU0FBNUQ7QUFDQSxxQ0FBSSxDQUFKLENBQU0sS0FBSyxHQUFYLEVBQWdCLDRCQUFoQjs7QUFFQSx3QkFBSSxLQUFLLDRCQUFMLEVBQUosRUFBeUM7QUFDckM7QUFDQSw0QkFBSSxLQUFLLFNBQUwsS0FBbUIsS0FBSyxXQUFMLENBQWlCLE1BQWpCLElBQTJCLEtBQUssV0FBTCxDQUFpQixNQUEvRCxDQUFKLEVBQTRFO0FBQ3hFLGlDQUFLLGdCQUFMLENBQXNCLEtBQUssV0FBM0IsRUFBd0MsS0FBSyxXQUE3QztBQUNIO0FBQ0oscUJBTEQsTUFLTztBQUNILDZCQUFLLCtCQUFMLEdBQXVDLElBQXZDO0FBQ0g7QUFDRDtBQUNBLHlCQUFLLFNBQUwsR0FBaUIsS0FBakI7QUFDQSx5QkFBSyxnQkFBTCxDQUFzQixPQUF0QixFQUErQixJQUEvQjs7QUFFQSx3QkFBSSxLQUFLLEtBQUssVUFBZDtBQUNBLHVCQUFHLFVBQUgsR0FBZ0IsS0FBSyxhQUFyQjtBQUNBLHVCQUFHLGVBQUgsR0FBcUIsS0FBSyxlQUExQjtBQUNBLHVCQUFHLGlCQUFILEdBQXVCLEtBQUssWUFBNUI7QUFDQSx3QkFBSSxHQUFHLFFBQVAsRUFBaUI7QUFDYiw0QkFBSSxHQUFHLFVBQUgsSUFBaUIsSUFBckIsRUFBMkI7QUFDdkIsK0JBQUcsUUFBSCxHQUFjLDBCQUEwQixHQUFHLFVBQTdCLEdBQTBDLEdBQTFDLEdBQWdELEdBQUcsVUFBbkQsR0FBZ0UsR0FBOUU7QUFDSDtBQUNKLHFCQUpELE1BSU87QUFDSCwyQkFBRyxRQUFILEdBQWMsMEJBQTBCLEdBQUcsVUFBN0IsR0FBMEMsR0FBeEQ7QUFDSDtBQUNELHdCQUFJLEdBQUcsVUFBSCxFQUFKLEVBQXFCO0FBQ2pCLDZCQUFLLFlBQUwsQ0FBa0IsRUFBbEI7QUFDSDtBQUNKLGlCQXhDRCxNQXdDTyxJQUFJLFFBQVEsVUFBUixLQUF1QixDQUEzQixFQUE4QjtBQUFHO0FBQ3BDLHdCQUFJLE1BQU0sS0FBSyxjQUFMLEdBQXNCLFlBQWhDO0FBQ0Esd0JBQUksWUFBWSxFQUFDLE1BQU0sUUFBUSxJQUFmLEVBQXFCLFFBQVEsUUFBUSxJQUFSLENBQWEsVUFBMUMsRUFBc0QsS0FBSyxHQUEzRCxFQUFnRSxLQUFLLEdBQXJFLEVBQWhCO0FBQ0EsMEJBQU0sT0FBTixDQUFjLElBQWQsQ0FBbUIsU0FBbkI7QUFDQSwwQkFBTSxNQUFOLElBQWdCLFFBQVEsSUFBUixDQUFhLE1BQTdCO0FBQ0gsaUJBTE0sTUFLQTtBQUNILHFDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsc0NBQWtELFFBQVEsVUFBMUQ7QUFDSDtBQUNKLGFBdERELE1Bc0RPLElBQUksZ0JBQWdCLENBQXBCLEVBQXVCO0FBQUc7QUFDN0Isb0JBQUksQ0FBQyxLQUFLLEtBQVYsRUFBaUI7QUFDYjtBQUNBLHdCQUFJLFFBQU8sS0FBSyxrQkFBTCxDQUF3QixXQUF4QixFQUFxQyxhQUFhLENBQWxELEVBQXFELFdBQVcsQ0FBaEUsRUFBbUUsSUFBbkUsQ0FBWDtBQUNBLHdCQUFJLFNBQVEsU0FBWixFQUF1QjtBQUNuQjtBQUNIO0FBQ0QseUJBQUssZUFBTCxHQUF1QixNQUFLLFlBQTVCO0FBQ0EseUJBQUssWUFBTCxHQUFvQixNQUFLLFlBQXpCO0FBQ0EseUJBQUssS0FBTCxHQUFhLE1BQUssS0FBbEI7QUFDQSx5QkFBSyxhQUFMLEdBQXFCLE1BQUssYUFBMUI7QUFDQTtBQUNBLHlCQUFLLGlCQUFMLEdBQXlCLE9BQU8sS0FBSyxlQUFaLEdBQThCLEtBQUssU0FBNUQ7QUFDQSxxQ0FBSSxDQUFKLENBQU0sS0FBSyxHQUFYLEVBQWdCLGdDQUFoQjs7QUFFQSx5QkFBSywrQkFBTCxHQUF1QyxJQUF2QztBQUNBLHlCQUFLLGdCQUFMLENBQXNCLE9BQXRCLEVBQStCLElBQS9COztBQUVBLHdCQUFJLE1BQUssS0FBSyxVQUFkO0FBQ0Esd0JBQUcsVUFBSCxHQUFnQixLQUFLLEtBQXJCO0FBQ0Esd0JBQUcsZUFBSCxHQUFxQixLQUFLLGVBQTFCO0FBQ0Esd0JBQUcsaUJBQUgsR0FBdUIsS0FBSyxZQUE1QjtBQUNBLHdCQUFHLGFBQUgsR0FBbUIsTUFBSyxPQUF4QjtBQUNBLHdCQUFJLElBQUcsUUFBUCxFQUFpQjtBQUNiLDRCQUFJLElBQUcsVUFBSCxJQUFpQixJQUFyQixFQUEyQjtBQUN2QixnQ0FBRyxRQUFILEdBQWMsMEJBQTBCLElBQUcsVUFBN0IsR0FBMEMsR0FBMUMsR0FBZ0QsSUFBRyxVQUFuRCxHQUFnRSxHQUE5RTtBQUNIO0FBQ0oscUJBSkQsTUFJTztBQUNILDRCQUFHLFFBQUgsR0FBYywwQkFBMEIsSUFBRyxVQUE3QixHQUEwQyxHQUF4RDtBQUNIO0FBQ0Qsd0JBQUksSUFBRyxVQUFILEVBQUosRUFBcUI7QUFDakIsNkJBQUssWUFBTCxDQUFrQixHQUFsQjtBQUNIO0FBQ0o7O0FBRUQ7QUFDQSxvQkFBSSxPQUFPLEtBQUssa0JBQUwsQ0FBd0IsV0FBeEIsRUFBcUMsYUFBYSxDQUFsRCxFQUFxRCxXQUFXLENBQWhFLEVBQW1FLEtBQW5FLENBQVg7QUFDQSxvQkFBSSxRQUFRLFNBQVosRUFBdUI7QUFDbkI7QUFDSDtBQUNELG9CQUFJLE9BQU0sS0FBSyxjQUFMLEdBQXNCLFlBQWhDO0FBQ0Esb0JBQUksWUFBWSxFQUFDLE1BQU0sSUFBUCxFQUFhLFFBQVEsS0FBSyxVQUExQixFQUFzQyxLQUFLLElBQTNDLEVBQWdELEtBQUssSUFBckQsRUFBaEI7QUFDQSxzQkFBTSxPQUFOLENBQWMsSUFBZCxDQUFtQixTQUFuQjtBQUNBLHNCQUFNLE1BQU4sSUFBZ0IsS0FBSyxNQUFyQjtBQUNIO0FBQ0o7OzsyQ0FFa0IsVyxFQUFhLFUsRUFBWSxRLEVBQVU7QUFDbEQsZ0JBQUksWUFBWSxDQUFoQixFQUFtQjtBQUNmLGlDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0IsNkRBQWhCO0FBQ0E7QUFDSDs7QUFFRCxnQkFBSSxTQUFTLEVBQWI7QUFDQSxnQkFBSSxRQUFRLElBQUksVUFBSixDQUFlLFdBQWYsRUFBNEIsVUFBNUIsRUFBd0MsUUFBeEMsQ0FBWjs7QUFFQSxtQkFBTyxVQUFQLEdBQW9CLE1BQU0sQ0FBTixDQUFwQjs7QUFFQSxnQkFBSSxNQUFNLENBQU4sTUFBYSxDQUFqQixFQUFvQjtBQUNoQix1QkFBTyxJQUFQLEdBQWMsS0FBSyw0QkFBTCxDQUFrQyxXQUFsQyxFQUErQyxhQUFhLENBQTVELEVBQStELFdBQVcsQ0FBMUUsQ0FBZDtBQUNILGFBRkQsTUFFTztBQUNILHVCQUFPLElBQVAsR0FBYyxNQUFNLFFBQU4sQ0FBZSxDQUFmLENBQWQ7QUFDSDs7QUFFRCxtQkFBTyxNQUFQO0FBQ0g7OztxREFFNEIsVyxFQUFhLFUsRUFBWSxRLEVBQVU7QUFDNUQsZ0JBQUksUUFBUSxJQUFJLFVBQUosQ0FBZSxXQUFmLEVBQTRCLFVBQTVCLEVBQXdDLFFBQXhDLENBQVo7QUFDQSxnQkFBSSxTQUFTLElBQWI7O0FBRUE7Ozs7Ozs7Ozs7QUFVQSxnQkFBSSxrQkFBa0IsQ0FBdEI7QUFDQSxnQkFBSSwwQkFBMEIsQ0FBOUI7QUFDQSxnQkFBSSwyQkFBMkIsSUFBL0I7QUFDQSxnQkFBSSxnQkFBZ0IsQ0FBcEI7QUFDQSxnQkFBSSx5QkFBeUIsSUFBN0I7O0FBRUE7QUFDQSw4QkFBa0IsMEJBQTBCLE1BQU0sQ0FBTixNQUFhLENBQXpEO0FBQ0E7QUFDQSw0QkFBaUIsQ0FBQyxNQUFNLENBQU4sSUFBVyxJQUFaLEtBQXFCLENBQXRCLEdBQTRCLE1BQU0sQ0FBTixNQUFhLENBQXpEO0FBQ0EsZ0JBQUksZ0JBQWdCLENBQWhCLElBQXFCLGlCQUFpQixLQUFLLGtCQUFMLENBQXdCLE1BQWxFLEVBQTBFO0FBQ3RFLHFCQUFLLFFBQUwsQ0FBYyxzQkFBWSxZQUExQixFQUF3Qyw0Q0FBeEM7QUFDQTtBQUNIOztBQUVELGdCQUFJLG9CQUFvQixLQUFLLGtCQUFMLENBQXdCLGFBQXhCLENBQXhCOztBQUVBO0FBQ0EsZ0JBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFOLElBQVcsSUFBWixNQUFzQixDQUExQztBQUNBLGdCQUFJLGdCQUFnQixDQUFoQixJQUFxQixpQkFBaUIsQ0FBMUMsRUFBNkM7QUFDekMscUJBQUssUUFBTCxDQUFjLHNCQUFZLFlBQTFCLEVBQXdDLHdDQUF4QztBQUNBO0FBQ0g7O0FBRUQsZ0JBQUksb0JBQW9CLENBQXhCLEVBQTJCO0FBQUc7QUFDMUI7QUFDQSx5Q0FBMEIsQ0FBQyxNQUFNLENBQU4sSUFBVyxJQUFaLEtBQXFCLENBQXRCLEdBQTRCLE1BQU0sQ0FBTixNQUFhLENBQWxFO0FBQ0E7QUFDQSwyQ0FBMkIsQ0FBQyxNQUFNLENBQU4sSUFBVyxJQUFaLE1BQXNCLENBQWpEO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBSSxZQUFZLEtBQUssU0FBTCxDQUFlLFNBQWYsQ0FBeUIsV0FBekIsRUFBaEI7O0FBRUEsZ0JBQUksVUFBVSxPQUFWLENBQWtCLFNBQWxCLE1BQWlDLENBQUMsQ0FBdEMsRUFBeUM7QUFDckM7QUFDQSxvQkFBSSxpQkFBaUIsQ0FBckIsRUFBd0I7QUFDcEIsc0NBQWtCLENBQWxCO0FBQ0EsNkJBQVMsSUFBSSxLQUFKLENBQVUsQ0FBVixDQUFUO0FBQ0EsNkNBQXlCLGdCQUFnQixDQUF6QztBQUNILGlCQUpELE1BSU87QUFBRztBQUNOLHNDQUFrQixDQUFsQjtBQUNBLDZCQUFTLElBQUksS0FBSixDQUFVLENBQVYsQ0FBVDtBQUNBLDZDQUF5QixhQUF6QjtBQUNIO0FBQ0osYUFYRCxNQVdPLElBQUksVUFBVSxPQUFWLENBQWtCLFNBQWxCLE1BQWlDLENBQUMsQ0FBdEMsRUFBeUM7QUFDNUM7QUFDQSxrQ0FBa0IsQ0FBbEI7QUFDQSx5QkFBUyxJQUFJLEtBQUosQ0FBVSxDQUFWLENBQVQ7QUFDQSx5Q0FBeUIsYUFBekI7QUFDSCxhQUxNLE1BS0E7QUFDSDtBQUNBO0FBQ0Esa0NBQWtCLENBQWxCO0FBQ0EseUNBQXlCLGFBQXpCO0FBQ0EseUJBQVMsSUFBSSxLQUFKLENBQVUsQ0FBVixDQUFUOztBQUVBLG9CQUFJLGlCQUFpQixDQUFyQixFQUF3QjtBQUNwQiw2Q0FBeUIsZ0JBQWdCLENBQXpDO0FBQ0gsaUJBRkQsTUFFTyxJQUFJLGtCQUFrQixDQUF0QixFQUF5QjtBQUFHO0FBQy9CLHNDQUFrQixDQUFsQjtBQUNBLDZCQUFTLElBQUksS0FBSixDQUFVLENBQVYsQ0FBVDtBQUNBLDZDQUF5QixhQUF6QjtBQUNIO0FBQ0o7O0FBRUQsbUJBQU8sQ0FBUCxJQUFhLG1CQUFtQixDQUFoQztBQUNBLG1CQUFPLENBQVAsS0FBYSxDQUFDLGdCQUFnQixJQUFqQixNQUEyQixDQUF4QztBQUNBLG1CQUFPLENBQVAsSUFBYSxDQUFDLGdCQUFnQixJQUFqQixLQUEwQixDQUF2QztBQUNBLG1CQUFPLENBQVAsS0FBYSxDQUFDLGdCQUFnQixJQUFqQixLQUEwQixDQUF2QztBQUNBLGdCQUFJLG9CQUFvQixDQUF4QixFQUEyQjtBQUN2Qix1QkFBTyxDQUFQLEtBQWMsQ0FBQyx5QkFBeUIsSUFBMUIsTUFBb0MsQ0FBbEQ7QUFDQSx1QkFBTyxDQUFQLElBQWEsQ0FBQyx5QkFBeUIsSUFBMUIsS0FBbUMsQ0FBaEQ7QUFDQTtBQUNBLHVCQUFPLENBQVAsS0FBYyxLQUFLLENBQW5CO0FBQ0EsdUJBQU8sQ0FBUCxJQUFhLENBQWI7QUFDSDs7QUFFRCxtQkFBTztBQUNILHdCQUFRLE1BREw7QUFFSCw4QkFBYyxpQkFGWDtBQUdILDhCQUFjLGFBSFg7QUFJSCx1QkFBTyxhQUFhLGVBSmpCO0FBS0gsK0JBQWUsYUFBYTtBQUx6QixhQUFQO0FBT0g7OzsyQ0FFa0IsVyxFQUFhLFUsRUFBWSxRLEVBQVUsYSxFQUFlO0FBQ2pFLGdCQUFJLFdBQVcsQ0FBZixFQUFrQjtBQUNkLGlDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0IsMENBQWhCO0FBQ0E7QUFDSDs7QUFFRCxnQkFBSSxLQUFLLEtBQUssYUFBZDtBQUNBLGdCQUFJLFFBQVEsSUFBSSxVQUFKLENBQWUsV0FBZixFQUE0QixVQUE1QixFQUF3QyxRQUF4QyxDQUFaO0FBQ0EsZ0JBQUksU0FBUyxJQUFiOztBQUVBLGdCQUFJLGFBQUosRUFBbUI7QUFDZixvQkFBSSxNQUFNLENBQU4sTUFBYSxJQUFqQixFQUF1QjtBQUNuQjtBQUNIO0FBQ0Qsb0JBQUksTUFBTyxNQUFNLENBQU4sTUFBYSxDQUFkLEdBQW1CLElBQTdCO0FBQ0Esb0JBQUksUUFBUSxDQUFDLE1BQU0sQ0FBTixJQUFXLElBQVosS0FBcUIsQ0FBakM7O0FBRUEsb0JBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFOLElBQVcsSUFBWixNQUFzQixDQUExQztBQUNBLG9CQUFJLHNCQUFzQixDQUFDLE1BQU0sQ0FBTixJQUFXLElBQVosTUFBc0IsQ0FBaEQ7O0FBRUEsb0JBQUksZUFBZ0IsTUFBTSxDQUFOLE1BQWEsQ0FBZCxHQUFtQixJQUF0QztBQUNBLG9CQUFJLGdCQUFnQixpQkFBaUIsQ0FBakIsR0FBcUIsQ0FBckIsR0FBeUIsQ0FBN0M7O0FBRUEsb0JBQUksY0FBYyxDQUFsQjtBQUNBLG9CQUFJLFdBQVcsQ0FBZjtBQUNBLG9CQUFJLGNBQWMsRUFBbEIsQ0FmZSxDQWVROztBQUV2QixvQkFBSSxRQUFRLEtBQVo7O0FBRUEsd0JBQVEsR0FBUjtBQUNJLHlCQUFLLENBQUw7QUFBUztBQUNMLHNDQUFjLEtBQUssNEJBQUwsQ0FBa0MsbUJBQWxDLENBQWQ7QUFDQTtBQUNKLHlCQUFLLENBQUw7QUFBUztBQUNMLHNDQUFjLEtBQUssNEJBQUwsQ0FBa0MsbUJBQWxDLENBQWQ7QUFDQTtBQUNKLHlCQUFLLENBQUw7QUFBUztBQUNMLHNDQUFjLEtBQUssNEJBQUwsQ0FBa0MsbUJBQWxDLENBQWQ7QUFDQTtBQVRSOztBQVlBLHdCQUFRLEtBQVI7QUFDSSx5QkFBSyxDQUFMO0FBQVM7QUFDTCxzQ0FBYyxFQUFkO0FBQ0EsNEJBQUksZ0JBQWdCLEtBQUssd0JBQUwsQ0FBOEIsTUFBbEQsRUFBMEQ7QUFDdEQsdUNBQVcsS0FBSyx3QkFBTCxDQUE4QixhQUE5QixDQUFYO0FBQ0g7QUFDRDtBQUNKLHlCQUFLLENBQUw7QUFBUztBQUNMLHNDQUFjLEVBQWQ7QUFDQSw0QkFBSSxnQkFBZ0IsS0FBSyx3QkFBTCxDQUE4QixNQUFsRCxFQUEwRDtBQUN0RCx1Q0FBVyxLQUFLLHdCQUFMLENBQThCLGFBQTlCLENBQVg7QUFDSDtBQUNEO0FBQ0oseUJBQUssQ0FBTDtBQUFTO0FBQ0wsc0NBQWMsRUFBZDtBQUNBLDRCQUFJLGdCQUFnQixLQUFLLHdCQUFMLENBQThCLE1BQWxELEVBQTBEO0FBQ3RELHVDQUFXLEtBQUssd0JBQUwsQ0FBOEIsYUFBOUIsQ0FBWDtBQUNIO0FBQ0Q7QUFsQlI7O0FBcUJBLHlCQUFTO0FBQ0wsNkJBQVMsUUFESjtBQUVMLGtDQUFjLFdBRlQ7QUFHTCxrQ0FBYyxhQUhUO0FBSUwsMkJBQU8sS0FKRjtBQUtMLG1DQUFlO0FBTFYsaUJBQVQ7QUFPSCxhQTNERCxNQTJETztBQUNILHlCQUFTLEtBQVQ7QUFDSDs7QUFFRCxtQkFBTyxNQUFQO0FBQ0g7Ozt3Q0FFZSxXLEVBQWEsVSxFQUFZLFEsRUFBVSxZLEVBQWMsVyxFQUFhO0FBQzFFLGdCQUFJLFlBQVksQ0FBaEIsRUFBbUI7QUFDZixpQ0FBSSxDQUFKLENBQU0sS0FBSyxHQUFYLEVBQWdCLHVEQUFoQjtBQUNBO0FBQ0g7O0FBRUQsZ0JBQUksS0FBSyxzQkFBTCxLQUFnQyxJQUFoQyxJQUF3QyxLQUFLLFNBQUwsS0FBbUIsS0FBL0QsRUFBc0U7QUFDbEU7QUFDQTtBQUNBO0FBQ0g7O0FBRUQsZ0JBQUksT0FBUSxJQUFJLFVBQUosQ0FBZSxXQUFmLEVBQTRCLFVBQTVCLEVBQXdDLFFBQXhDLENBQUQsQ0FBb0QsQ0FBcEQsQ0FBWDs7QUFFQSxnQkFBSSxZQUFZLENBQUMsT0FBTyxHQUFSLE1BQWlCLENBQWpDO0FBQ0EsZ0JBQUksVUFBVSxPQUFPLEVBQXJCOztBQUVBLGdCQUFJLFlBQVksQ0FBaEIsRUFBbUI7QUFDZixxQkFBSyxRQUFMLENBQWMsc0JBQVksaUJBQTFCLDhDQUF1RixPQUF2RjtBQUNBO0FBQ0g7O0FBRUQsaUJBQUssb0JBQUwsQ0FBMEIsV0FBMUIsRUFBdUMsYUFBYSxDQUFwRCxFQUF1RCxXQUFXLENBQWxFLEVBQXFFLFlBQXJFLEVBQW1GLFdBQW5GLEVBQWdHLFNBQWhHO0FBQ0g7Ozs2Q0FFb0IsVyxFQUFhLFUsRUFBWSxRLEVBQVUsWSxFQUFjLFcsRUFBYSxTLEVBQVc7QUFDMUYsZ0JBQUksV0FBVyxDQUFmLEVBQWtCO0FBQ2QsaUNBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxFQUFnQix1RUFBaEI7QUFDQTtBQUNIOztBQUVELGdCQUFJLEtBQUssS0FBSyxhQUFkO0FBQ0EsZ0JBQUksSUFBSSxJQUFJLFFBQUosQ0FBYSxXQUFiLEVBQTBCLFVBQTFCLEVBQXNDLFFBQXRDLENBQVI7O0FBRUEsZ0JBQUksYUFBYSxFQUFFLFFBQUYsQ0FBVyxDQUFYLENBQWpCO0FBQ0EsZ0JBQUksZUFBZSxFQUFFLFNBQUYsQ0FBWSxDQUFaLEVBQWUsQ0FBQyxFQUFoQixJQUFzQixVQUF6QztBQUNBLGdCQUFJLE1BQU8sZ0JBQWdCLENBQWpCLElBQXVCLENBQWpDLENBWDBGLENBV3JEOztBQUVyQyxnQkFBSSxlQUFlLENBQW5CLEVBQXNCO0FBQUc7QUFDckIscUJBQUssbUNBQUwsQ0FBeUMsV0FBekMsRUFBc0QsYUFBYSxDQUFuRSxFQUFzRSxXQUFXLENBQWpGO0FBQ0gsYUFGRCxNQUVPLElBQUksZUFBZSxDQUFuQixFQUFzQjtBQUFHO0FBQzVCLHFCQUFLLGtCQUFMLENBQXdCLFdBQXhCLEVBQXFDLGFBQWEsQ0FBbEQsRUFBcUQsV0FBVyxDQUFoRSxFQUFtRSxZQUFuRSxFQUFpRixXQUFqRixFQUE4RixTQUE5RixFQUF5RyxHQUF6RztBQUNILGFBRk0sTUFFQSxJQUFJLGVBQWUsQ0FBbkIsRUFBc0I7QUFDekI7QUFDSCxhQUZNLE1BRUE7QUFDSCxxQkFBSyxRQUFMLENBQWMsc0JBQVksWUFBMUIsc0NBQTBFLFVBQTFFO0FBQ0E7QUFDSDtBQUNKOzs7NERBRW1DLFcsRUFBYSxVLEVBQVksUSxFQUFVO0FBQ25FLGdCQUFJLFdBQVcsQ0FBZixFQUFrQjtBQUNkLGlDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0IsMkRBQWhCO0FBQ0E7QUFDSDs7QUFFRCxnQkFBSSxPQUFPLEtBQUssY0FBaEI7QUFDQSxnQkFBSSxRQUFRLEtBQUssV0FBakI7QUFDQSxnQkFBSSxLQUFLLEtBQUssYUFBZDtBQUNBLGdCQUFJLElBQUksSUFBSSxRQUFKLENBQWEsV0FBYixFQUEwQixVQUExQixFQUFzQyxRQUF0QyxDQUFSOztBQUVBLGdCQUFJLENBQUMsSUFBTCxFQUFXO0FBQ1Asb0JBQUksS0FBSyxTQUFMLEtBQW1CLEtBQW5CLElBQTRCLEtBQUssc0JBQUwsS0FBZ0MsS0FBaEUsRUFBdUU7QUFDbkUseUJBQUssU0FBTCxHQUFpQixJQUFqQjtBQUNBLHlCQUFLLFVBQUwsQ0FBZ0IsUUFBaEIsR0FBMkIsSUFBM0I7QUFDSDs7QUFFRCx1QkFBTyxLQUFLLGNBQUwsR0FBc0IsRUFBN0I7QUFDQSxxQkFBSyxJQUFMLEdBQVksT0FBWjtBQUNBLHFCQUFLLEVBQUwsR0FBVSxNQUFNLEVBQWhCO0FBQ0EscUJBQUssU0FBTCxHQUFpQixLQUFLLFVBQXRCO0FBQ0EscUJBQUssUUFBTCxHQUFnQixLQUFLLFNBQXJCO0FBQ0gsYUFYRCxNQVdPO0FBQ0gsb0JBQUksT0FBTyxLQUFLLElBQVosS0FBcUIsV0FBekIsRUFBc0M7QUFDbEMscUNBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxFQUFnQiw4Q0FBaEI7QUFDSDtBQUNKOztBQUVELGdCQUFJLFVBQVUsRUFBRSxRQUFGLENBQVcsQ0FBWCxDQUFkLENBNUJtRSxDQTRCckM7QUFDOUIsZ0JBQUksYUFBYSxFQUFFLFFBQUYsQ0FBVyxDQUFYLENBQWpCLENBN0JtRSxDQTZCbEM7QUFDakMsZ0JBQUksdUJBQXVCLEVBQUUsUUFBRixDQUFXLENBQVgsQ0FBM0IsQ0E5Qm1FLENBOEJ4QjtBQUMzQyxnQkFBSSxXQUFXLEVBQUUsUUFBRixDQUFXLENBQVgsQ0FBZixDQS9CbUUsQ0ErQnBDOztBQUUvQixnQkFBSSxZQUFZLENBQVosSUFBaUIsZUFBZSxDQUFwQyxFQUF1QztBQUNuQyxxQkFBSyxRQUFMLENBQWMsc0JBQVksWUFBMUIsRUFBd0MsNENBQXhDO0FBQ0E7QUFDSDs7QUFFRCxpQkFBSyxlQUFMLEdBQXVCLENBQUMsRUFBRSxRQUFGLENBQVcsQ0FBWCxJQUFnQixDQUFqQixJQUFzQixDQUE3QyxDQXRDbUUsQ0FzQ2xCO0FBQ2pELGdCQUFJLEtBQUssZUFBTCxLQUF5QixDQUF6QixJQUE4QixLQUFLLGVBQUwsS0FBeUIsQ0FBM0QsRUFBOEQ7QUFBRztBQUM3RCxxQkFBSyxRQUFMLENBQWMsc0JBQVksWUFBMUIsNkNBQWdGLEtBQUssZUFBTCxHQUF1QixDQUF2RztBQUNBO0FBQ0g7O0FBRUQsZ0JBQUksV0FBVyxFQUFFLFFBQUYsQ0FBVyxDQUFYLElBQWdCLEVBQS9CLENBNUNtRSxDQTRDL0I7QUFDcEMsZ0JBQUksYUFBYSxDQUFqQixFQUFvQjtBQUNoQixxQkFBSyxRQUFMLENBQWMsc0JBQVksWUFBMUIsRUFBd0Msb0RBQXhDO0FBQ0E7QUFDSCxhQUhELE1BR08sSUFBSSxXQUFXLENBQWYsRUFBa0I7QUFDckIsaUNBQUksQ0FBSixDQUFNLEtBQUssR0FBWCwrREFBMkUsUUFBM0U7QUFDSDs7QUFFRCxnQkFBSSxTQUFTLENBQWI7O0FBRUEsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxRQUFwQixFQUE4QixHQUE5QixFQUFtQztBQUMvQixvQkFBSSxNQUFNLEVBQUUsU0FBRixDQUFZLE1BQVosRUFBb0IsQ0FBQyxFQUFyQixDQUFWLENBRCtCLENBQ007QUFDckMsMEJBQVUsQ0FBVjs7QUFFQSxvQkFBSSxRQUFRLENBQVosRUFBZTtBQUNYO0FBQ0g7O0FBRUQ7QUFDQSxvQkFBSSxNQUFNLElBQUksVUFBSixDQUFlLFdBQWYsRUFBNEIsYUFBYSxNQUF6QyxFQUFpRCxHQUFqRCxDQUFWO0FBQ0EsMEJBQVUsR0FBVjs7QUFFQSxvQkFBSSxTQUFTLG9CQUFVLFFBQVYsQ0FBbUIsR0FBbkIsQ0FBYjtBQUNBLG9CQUFJLE1BQU0sQ0FBVixFQUFhO0FBQ1Q7QUFDQTtBQUNIOztBQUVELHFCQUFLLFVBQUwsR0FBa0IsT0FBTyxVQUFQLENBQWtCLEtBQXBDO0FBQ0EscUJBQUssV0FBTCxHQUFtQixPQUFPLFVBQVAsQ0FBa0IsTUFBckM7QUFDQSxxQkFBSyxZQUFMLEdBQW9CLE9BQU8sWUFBUCxDQUFvQixLQUF4QztBQUNBLHFCQUFLLGFBQUwsR0FBcUIsT0FBTyxZQUFQLENBQW9CLE1BQXpDOztBQUVBLHFCQUFLLE9BQUwsR0FBZSxPQUFPLGNBQXRCO0FBQ0EscUJBQUssS0FBTCxHQUFhLE9BQU8sWUFBcEI7QUFDQSxxQkFBSyxRQUFMLEdBQWdCLE9BQU8sU0FBdkI7QUFDQSxxQkFBSyxZQUFMLEdBQW9CLE9BQU8sYUFBM0I7QUFDQSxxQkFBSyxRQUFMLEdBQWdCLE9BQU8sU0FBdkI7QUFDQSxxQkFBSyxTQUFMLEdBQWlCLE9BQU8sVUFBeEI7O0FBRUEsb0JBQUksT0FBTyxVQUFQLENBQWtCLEtBQWxCLEtBQTRCLEtBQTVCLElBQ0EsT0FBTyxVQUFQLENBQWtCLE9BQWxCLEtBQThCLENBRDlCLElBRUEsT0FBTyxVQUFQLENBQWtCLE9BQWxCLEtBQThCLENBRmxDLEVBRXFDO0FBQ2pDLHlCQUFLLFNBQUwsR0FBaUIsS0FBSyxtQkFBdEI7QUFDSDs7QUFFRCxvQkFBSSxVQUFVLEtBQUssU0FBTCxDQUFlLE9BQTdCO0FBQ0Esb0JBQUksVUFBVSxLQUFLLFNBQUwsQ0FBZSxPQUE3QjtBQUNBLHFCQUFLLGlCQUFMLEdBQXlCLEtBQUssU0FBTCxJQUFrQixVQUFVLE9BQTVCLENBQXpCOztBQUVBLG9CQUFJLGFBQWEsSUFBSSxRQUFKLENBQWEsQ0FBYixFQUFnQixDQUFoQixDQUFqQjtBQUNBLG9CQUFJLGNBQWMsT0FBbEI7QUFDQSxxQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLENBQXBCLEVBQXVCLEdBQXZCLEVBQTRCO0FBQ3hCLHdCQUFJLElBQUksV0FBVyxDQUFYLEVBQWMsUUFBZCxDQUF1QixFQUF2QixDQUFSO0FBQ0Esd0JBQUksRUFBRSxNQUFGLEdBQVcsQ0FBZixFQUFrQjtBQUNkLDRCQUFJLE1BQU0sQ0FBVjtBQUNIO0FBQ0QsbUNBQWUsQ0FBZjtBQUNIO0FBQ0QscUJBQUssS0FBTCxHQUFhLFdBQWI7O0FBRUEsb0JBQUksS0FBSyxLQUFLLFVBQWQ7QUFDQSxtQkFBRyxLQUFILEdBQVcsS0FBSyxVQUFoQjtBQUNBLG1CQUFHLE1BQUgsR0FBWSxLQUFLLFdBQWpCO0FBQ0EsbUJBQUcsR0FBSCxHQUFTLEtBQUssU0FBTCxDQUFlLEdBQXhCO0FBQ0EsbUJBQUcsT0FBSCxHQUFhLEtBQUssT0FBbEI7QUFDQSxtQkFBRyxLQUFILEdBQVcsS0FBSyxLQUFoQjtBQUNBLG1CQUFHLFNBQUgsR0FBZSxPQUFPLFVBQXRCO0FBQ0EsbUJBQUcsWUFBSCxHQUFrQixPQUFPLG9CQUF6QjtBQUNBLG1CQUFHLE1BQUgsR0FBWSxLQUFLLFFBQUwsQ0FBYyxLQUExQjtBQUNBLG1CQUFHLE1BQUgsR0FBWSxLQUFLLFFBQUwsQ0FBYyxNQUExQjtBQUNBLG1CQUFHLFVBQUgsR0FBZ0IsV0FBaEI7O0FBRUEsb0JBQUksR0FBRyxRQUFQLEVBQWlCO0FBQ2Isd0JBQUksR0FBRyxVQUFILElBQWlCLElBQXJCLEVBQTJCO0FBQ3ZCLDJCQUFHLFFBQUgsR0FBYywwQkFBMEIsR0FBRyxVQUE3QixHQUEwQyxHQUExQyxHQUFnRCxHQUFHLFVBQW5ELEdBQWdFLEdBQTlFO0FBQ0g7QUFDSixpQkFKRCxNQUlPO0FBQ0gsdUJBQUcsUUFBSCxHQUFjLDBCQUEwQixHQUFHLFVBQTdCLEdBQTBDLEdBQXhEO0FBQ0g7QUFDRCxvQkFBSSxHQUFHLFVBQUgsRUFBSixFQUFxQjtBQUNqQix5QkFBSyxZQUFMLENBQWtCLEVBQWxCO0FBQ0g7QUFDSjs7QUFFRCxnQkFBSSxXQUFXLEVBQUUsUUFBRixDQUFXLE1BQVgsQ0FBZixDQWpJbUUsQ0FpSS9CO0FBQ3BDLGdCQUFJLGFBQWEsQ0FBakIsRUFBb0I7QUFDaEIscUJBQUssUUFBTCxDQUFjLHNCQUFZLFlBQTFCLEVBQXdDLG9EQUF4QztBQUNBO0FBQ0gsYUFIRCxNQUdPLElBQUksV0FBVyxDQUFmLEVBQWtCO0FBQ3JCLGlDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsK0RBQTJFLFFBQTNFO0FBQ0g7O0FBRUQ7O0FBRUEsaUJBQUssSUFBSSxLQUFJLENBQWIsRUFBZ0IsS0FBSSxRQUFwQixFQUE4QixJQUE5QixFQUFtQztBQUMvQixvQkFBSSxPQUFNLEVBQUUsU0FBRixDQUFZLE1BQVosRUFBb0IsQ0FBQyxFQUFyQixDQUFWLENBRCtCLENBQ007QUFDckMsMEJBQVUsQ0FBVjs7QUFFQSxvQkFBSSxTQUFRLENBQVosRUFBZTtBQUNYO0FBQ0g7O0FBRUQ7QUFDQSwwQkFBVSxJQUFWO0FBQ0g7O0FBRUQsaUJBQUssSUFBTCxHQUFZLElBQUksVUFBSixDQUFlLFFBQWYsQ0FBWjtBQUNBLGlCQUFLLElBQUwsQ0FBVSxHQUFWLENBQWMsSUFBSSxVQUFKLENBQWUsV0FBZixFQUE0QixVQUE1QixFQUF3QyxRQUF4QyxDQUFkLEVBQWlFLENBQWpFO0FBQ0EsNkJBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxFQUFnQixzQ0FBaEI7O0FBRUEsZ0JBQUksS0FBSyw0QkFBTCxFQUFKLEVBQXlDO0FBQ3JDO0FBQ0Esb0JBQUksS0FBSyxTQUFMLEtBQW1CLEtBQUssV0FBTCxDQUFpQixNQUFqQixJQUEyQixLQUFLLFdBQUwsQ0FBaUIsTUFBL0QsQ0FBSixFQUE0RTtBQUN4RSx5QkFBSyxnQkFBTCxDQUFzQixLQUFLLFdBQTNCLEVBQXdDLEtBQUssV0FBN0M7QUFDSDtBQUNKLGFBTEQsTUFLTztBQUNILHFCQUFLLCtCQUFMLEdBQXVDLElBQXZDO0FBQ0g7QUFDRDtBQUNBLGlCQUFLLFNBQUwsR0FBaUIsS0FBakI7QUFDQSxpQkFBSyxnQkFBTCxDQUFzQixPQUF0QixFQUErQixJQUEvQjtBQUNIOzs7MkNBRWtCLFcsRUFBYSxVLEVBQVksUSxFQUFVLFksRUFBYyxXLEVBQWEsUyxFQUFXLEcsRUFBSztBQUM3RixnQkFBSSxLQUFLLEtBQUssYUFBZDtBQUNBLGdCQUFJLElBQUksSUFBSSxRQUFKLENBQWEsV0FBYixFQUEwQixVQUExQixFQUFzQyxRQUF0QyxDQUFSOztBQUVBLGdCQUFJLFFBQVEsRUFBWjtBQUFBLGdCQUFnQixTQUFTLENBQXpCOztBQUVBLGdCQUFJLFNBQVMsQ0FBYjtBQUNBLGdCQUFNLGFBQWEsS0FBSyxlQUF4QjtBQUNBLGdCQUFJLE1BQU0sS0FBSyxjQUFMLEdBQXNCLFlBQWhDO0FBQ0EsZ0JBQUksV0FBWSxjQUFjLENBQTlCLENBVDZGLENBUzFEOztBQUVuQyxtQkFBTyxTQUFTLFFBQWhCLEVBQTBCO0FBQ3RCLG9CQUFJLFNBQVMsQ0FBVCxJQUFjLFFBQWxCLEVBQTRCO0FBQ3hCLHFDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgscUNBQWlELEdBQWpELG1CQUFrRSxNQUFsRSxxQkFBd0YsUUFBeEY7QUFDQSwwQkFGd0IsQ0FFaEI7QUFDWDtBQUNEO0FBQ0Esb0JBQUksV0FBVyxFQUFFLFNBQUYsQ0FBWSxNQUFaLEVBQW9CLENBQUMsRUFBckIsQ0FBZixDQU5zQixDQU1vQjtBQUMxQyxvQkFBSSxlQUFlLENBQW5CLEVBQXNCO0FBQ2xCLGtDQUFjLENBQWQ7QUFDSDtBQUNELG9CQUFJLFdBQVcsV0FBVyxVQUExQixFQUFzQztBQUNsQyxxQ0FBSSxDQUFKLENBQU0sS0FBSyxHQUFYLHNDQUFrRCxHQUFsRDtBQUNBO0FBQ0g7O0FBRUQsb0JBQUksV0FBVyxFQUFFLFFBQUYsQ0FBVyxTQUFTLFVBQXBCLElBQWtDLElBQWpEOztBQUVBLG9CQUFJLGFBQWEsQ0FBakIsRUFBb0I7QUFBRztBQUNuQiwrQkFBVyxJQUFYO0FBQ0g7O0FBRUQsb0JBQUksT0FBTyxJQUFJLFVBQUosQ0FBZSxXQUFmLEVBQTRCLGFBQWEsTUFBekMsRUFBaUQsYUFBYSxRQUE5RCxDQUFYO0FBQ0Esb0JBQUksT0FBTyxFQUFDLE1BQU0sUUFBUCxFQUFpQixNQUFNLElBQXZCLEVBQVg7QUFDQSxzQkFBTSxJQUFOLENBQVcsSUFBWDtBQUNBLDBCQUFVLEtBQUssVUFBZjs7QUFFQSwwQkFBVSxhQUFhLFFBQXZCO0FBQ0g7O0FBRUQsZ0JBQUksTUFBTSxNQUFWLEVBQWtCO0FBQ2Qsb0JBQUksUUFBUSxLQUFLLFdBQWpCO0FBQ0Esb0JBQUksWUFBWTtBQUNaLDJCQUFPLEtBREs7QUFFWiw0QkFBUSxNQUZJO0FBR1osZ0NBQVksUUFIQTtBQUlaLHlCQUFLLEdBSk87QUFLWix5QkFBSyxHQUxPO0FBTVoseUJBQU0sTUFBTTtBQU5BLGlCQUFoQjtBQVFBLG9CQUFJLFFBQUosRUFBYztBQUNWLDhCQUFVLFlBQVYsR0FBeUIsV0FBekI7QUFDSDtBQUNELHNCQUFNLE9BQU4sQ0FBYyxJQUFkLENBQW1CLFNBQW5CO0FBQ0Esc0JBQU0sTUFBTixJQUFnQixNQUFoQjtBQUNIO0FBQ0o7Ozs0QkFwNkJxQjtBQUNsQixtQkFBTyxLQUFLLGdCQUFaO0FBQ0gsUzswQkFFbUIsUSxFQUFVO0FBQzFCLGlCQUFLLGdCQUFMLEdBQXdCLFFBQXhCO0FBQ0g7O0FBRUQ7Ozs7NEJBQ2tCO0FBQ2QsbUJBQU8sS0FBSyxZQUFaO0FBQ0gsUzswQkFFZSxRLEVBQVU7QUFDdEIsaUJBQUssWUFBTCxHQUFvQixRQUFwQjtBQUNIOzs7NEJBRXVCO0FBQ3BCLG1CQUFPLEtBQUssa0JBQVo7QUFDSCxTOzBCQUVxQixRLEVBQVU7QUFDNUIsaUJBQUssa0JBQUwsR0FBMEIsUUFBMUI7QUFDSDs7OzRCQUV5QjtBQUN0QixtQkFBTyxLQUFLLG9CQUFaO0FBQ0gsUzswQkFFdUIsUSxFQUFVO0FBQzlCLGlCQUFLLG9CQUFMLEdBQTRCLFFBQTVCO0FBQ0g7O0FBRUQ7Ozs7NEJBQ2M7QUFDVixtQkFBTyxLQUFLLFFBQVo7QUFDSCxTOzBCQUVXLFEsRUFBVTtBQUNsQixpQkFBSyxRQUFMLEdBQWdCLFFBQWhCO0FBQ0g7O0FBRUQ7Ozs7NEJBQ3NCO0FBQ2xCLG1CQUFPLEtBQUssZ0JBQVo7QUFDSCxTOzBCQUVtQixRLEVBQVU7QUFDMUIsaUJBQUssZ0JBQUwsR0FBd0IsUUFBeEI7QUFDSDs7QUFFRDs7Ozs0QkFDb0I7QUFDaEIsbUJBQU8sS0FBSyxjQUFaO0FBQ0gsUzswQkFFaUIsSSxFQUFNO0FBQ3BCLGlCQUFLLGNBQUwsR0FBc0IsSUFBdEI7QUFDSDs7OzRCQUV1QjtBQUNwQixtQkFBTyxLQUFLLFNBQVo7QUFDSDs7QUFFRDs7MEJBQ3NCLFEsRUFBVTtBQUM1QixpQkFBSyxrQkFBTCxHQUEwQixJQUExQjtBQUNBLGlCQUFLLFNBQUwsR0FBaUIsUUFBakI7QUFDQSxpQkFBSyxVQUFMLENBQWdCLFFBQWhCLEdBQTJCLFFBQTNCO0FBQ0g7O0FBRUQ7Ozs7MEJBQ3NCLFEsRUFBVTtBQUM1QixpQkFBSyxzQkFBTCxHQUE4QixJQUE5QjtBQUNBLGlCQUFLLFNBQUwsR0FBaUIsUUFBakI7QUFDQSxpQkFBSyxVQUFMLENBQWdCLFFBQWhCLEdBQTJCLFFBQTNCO0FBQ0g7O0FBRUQ7Ozs7MEJBQ3NCLFEsRUFBVTtBQUM1QixpQkFBSyxzQkFBTCxHQUE4QixJQUE5QjtBQUNBLGlCQUFLLFNBQUwsR0FBaUIsUUFBakI7QUFDQSxpQkFBSyxVQUFMLENBQWdCLFFBQWhCLEdBQTJCLFFBQTNCO0FBQ0g7Ozs4QkFuSFksTSxFQUFRO0FBQ2pCLGdCQUFJLE9BQU8sSUFBSSxVQUFKLENBQWUsTUFBZixDQUFYO0FBQ0EsZ0JBQUksV0FBVyxFQUFDLE9BQU8sS0FBUixFQUFmOztBQUVBLGdCQUFJLEtBQUssQ0FBTCxNQUFZLElBQVosSUFBb0IsS0FBSyxDQUFMLE1BQVksSUFBaEMsSUFBd0MsS0FBSyxDQUFMLE1BQVksSUFBcEQsSUFBNEQsS0FBSyxDQUFMLE1BQVksSUFBNUUsRUFBa0Y7QUFDOUUsdUJBQU8sUUFBUDtBQUNIOztBQUVELGdCQUFJLFdBQVksQ0FBQyxLQUFLLENBQUwsSUFBVSxDQUFYLE1BQWtCLENBQW5CLEtBQTBCLENBQXpDO0FBQ0EsZ0JBQUksV0FBVyxDQUFDLEtBQUssQ0FBTCxJQUFVLENBQVgsTUFBa0IsQ0FBakM7O0FBRUEsZ0JBQUksU0FBUyxVQUFVLElBQVYsRUFBZ0IsQ0FBaEIsQ0FBYjs7QUFFQSxnQkFBSSxTQUFTLENBQWIsRUFBZ0I7QUFDWix1QkFBTyxRQUFQO0FBQ0g7O0FBRUQsbUJBQU87QUFDSCx1QkFBTyxJQURKO0FBRUgsMEJBQVUsTUFGUDtBQUdILDRCQUFZLE1BSFQ7QUFJSCwrQkFBZSxRQUpaO0FBS0gsK0JBQWU7QUFMWixhQUFQO0FBT0g7Ozs7OztrQkFnN0JVLFU7Ozs7Ozs7OztxakJDNWtDZjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBOzs7Ozs7OztJQUVNLFM7Ozs7Ozs7bUNBRWdCLFUsRUFBWTtBQUMxQixnQkFBSSxNQUFNLFVBQVY7QUFDQSxnQkFBSSxhQUFhLElBQUksVUFBckI7QUFDQSxnQkFBSSxNQUFNLElBQUksVUFBSixDQUFlLFVBQWYsQ0FBVjtBQUNBLGdCQUFJLFVBQVUsQ0FBZDs7QUFFQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFVBQXBCLEVBQWdDLEdBQWhDLEVBQXFDO0FBQ2pDLG9CQUFJLEtBQUssQ0FBVCxFQUFZO0FBQ1I7QUFDQSx3QkFBSSxJQUFJLENBQUosTUFBVyxJQUFYLElBQW1CLElBQUksSUFBSSxDQUFSLE1BQWUsSUFBbEMsSUFBMEMsSUFBSSxJQUFJLENBQVIsTUFBZSxJQUE3RCxFQUFtRTtBQUMvRDtBQUNIO0FBQ0o7QUFDRCxvQkFBSSxPQUFKLElBQWUsSUFBSSxDQUFKLENBQWY7QUFDQTtBQUNIOztBQUVELG1CQUFPLElBQUksVUFBSixDQUFlLElBQUksTUFBbkIsRUFBMkIsQ0FBM0IsRUFBOEIsT0FBOUIsQ0FBUDtBQUNIOzs7aUNBRWUsVSxFQUFZO0FBQ3hCLGdCQUFJLE9BQU8sVUFBVSxVQUFWLENBQXFCLFVBQXJCLENBQVg7QUFDQSxnQkFBSSxLQUFLLHdCQUFjLElBQWQsQ0FBVDs7QUFFQSxlQUFHLFFBQUg7QUFDQSxnQkFBSSxjQUFjLEdBQUcsUUFBSCxFQUFsQixDQUx3QixDQUtVO0FBQ2xDLGVBQUcsUUFBSCxHQU53QixDQU1SO0FBQ2hCLGdCQUFJLFlBQVksR0FBRyxRQUFILEVBQWhCLENBUHdCLENBT1E7QUFDaEMsZUFBRyxPQUFILEdBUndCLENBUVQ7O0FBRWYsZ0JBQUksaUJBQWlCLFVBQVUsZ0JBQVYsQ0FBMkIsV0FBM0IsQ0FBckI7QUFDQSxnQkFBSSxlQUFlLFVBQVUsY0FBVixDQUF5QixTQUF6QixDQUFuQjtBQUNBLGdCQUFJLG9CQUFvQixDQUF4QjtBQUNBLGdCQUFJLGdCQUFnQixHQUFwQjtBQUNBLGdCQUFJLHNCQUFzQixDQUFDLENBQUQsRUFBSSxHQUFKLEVBQVMsR0FBVCxFQUFjLEdBQWQsQ0FBMUI7QUFDQSxnQkFBSSxZQUFZLENBQWhCOztBQUVBLGdCQUFJLGdCQUFnQixHQUFoQixJQUF1QixnQkFBZ0IsR0FBdkMsSUFBOEMsZ0JBQWdCLEdBQTlELElBQ0EsZ0JBQWdCLEdBRGhCLElBQ3VCLGdCQUFnQixFQUR2QyxJQUM2QyxnQkFBZ0IsRUFEN0QsSUFFQSxnQkFBZ0IsRUFGaEIsSUFFc0IsZ0JBQWdCLEdBRnRDLElBRTZDLGdCQUFnQixHQUY3RCxJQUdBLGdCQUFnQixHQUhoQixJQUd1QixnQkFBZ0IsR0FIM0MsRUFHZ0Q7O0FBRTVDLG9DQUFvQixHQUFHLE9BQUgsRUFBcEI7QUFDQSxvQkFBSSxzQkFBc0IsQ0FBMUIsRUFBNkI7QUFDekIsdUJBQUcsUUFBSCxDQUFZLENBQVosRUFEeUIsQ0FDUjtBQUNwQjtBQUNELG9CQUFJLHFCQUFxQixDQUF6QixFQUE0QjtBQUN4QixvQ0FBZ0Isb0JBQW9CLGlCQUFwQixDQUFoQjtBQUNIOztBQUVELDRCQUFZLEdBQUcsT0FBSCxLQUFlLENBQTNCLENBVjRDLENBVWI7QUFDL0IsbUJBQUcsT0FBSCxHQVg0QyxDQVc3QjtBQUNmLG1CQUFHLFFBQUgsQ0FBWSxDQUFaLEVBWjRDLENBWTNCO0FBQ2pCLG9CQUFJLEdBQUcsUUFBSCxFQUFKLEVBQW1CO0FBQUc7QUFDbEIsd0JBQUkscUJBQXNCLHNCQUFzQixDQUF2QixHQUE0QixDQUE1QixHQUFnQyxFQUF6RDtBQUNBLHlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksa0JBQXBCLEVBQXdDLEdBQXhDLEVBQTZDO0FBQ3pDLDRCQUFJLEdBQUcsUUFBSCxFQUFKLEVBQW1CO0FBQUc7QUFDbEIsZ0NBQUksSUFBSSxDQUFSLEVBQVc7QUFDUCwwQ0FBVSxnQkFBVixDQUEyQixFQUEzQixFQUErQixFQUEvQjtBQUNILDZCQUZELE1BRU87QUFDSCwwQ0FBVSxnQkFBVixDQUEyQixFQUEzQixFQUErQixFQUEvQjtBQUNIO0FBQ0o7QUFDSjtBQUNKO0FBQ0o7QUFDRCxlQUFHLE9BQUgsR0E5Q3dCLENBOENUO0FBQ2YsZ0JBQUkscUJBQXFCLEdBQUcsT0FBSCxFQUF6QjtBQUNBLGdCQUFJLHVCQUF1QixDQUEzQixFQUE4QjtBQUMxQixtQkFBRyxPQUFILEdBRDBCLENBQ1g7QUFDbEIsYUFGRCxNQUVPLElBQUksdUJBQXVCLENBQTNCLEVBQThCO0FBQ2pDLG1CQUFHLFFBQUgsQ0FBWSxDQUFaLEVBRGlDLENBQ2hCO0FBQ2pCLG1CQUFHLE9BQUgsR0FGaUMsQ0FFbEI7QUFDZixtQkFBRyxPQUFILEdBSGlDLENBR2xCO0FBQ2Ysb0JBQUksd0NBQXdDLEdBQUcsT0FBSCxFQUE1QztBQUNBLHFCQUFLLElBQUksS0FBSSxDQUFiLEVBQWdCLEtBQUkscUNBQXBCLEVBQTJELElBQTNELEVBQWdFO0FBQzVELHVCQUFHLE9BQUgsR0FENEQsQ0FDN0M7QUFDbEI7QUFDSjtBQUNELGdCQUFJLGFBQWEsR0FBRyxPQUFILEVBQWpCLENBM0R3QixDQTJEUTtBQUNoQyxlQUFHLFFBQUgsQ0FBWSxDQUFaLEVBNUR3QixDQTREUDs7QUFFakIsZ0JBQUksMEJBQTBCLEdBQUcsT0FBSCxFQUE5QjtBQUNBLGdCQUFJLGlDQUFpQyxHQUFHLE9BQUgsRUFBckM7O0FBRUEsZ0JBQUksc0JBQXNCLEdBQUcsUUFBSCxDQUFZLENBQVosQ0FBMUI7QUFDQSxnQkFBSSx3QkFBd0IsQ0FBNUIsRUFBK0I7QUFDM0IsbUJBQUcsUUFBSCxDQUFZLENBQVosRUFEMkIsQ0FDVjtBQUNwQjtBQUNELGVBQUcsUUFBSCxDQUFZLENBQVosRUFyRXdCLENBcUVQOztBQUVqQixnQkFBSSx5QkFBeUIsQ0FBN0I7QUFDQSxnQkFBSSwwQkFBMEIsQ0FBOUI7QUFDQSxnQkFBSSx3QkFBd0IsQ0FBNUI7QUFDQSxnQkFBSSwyQkFBMkIsQ0FBL0I7O0FBRUEsZ0JBQUksc0JBQXNCLEdBQUcsUUFBSCxFQUExQjtBQUNBLGdCQUFJLG1CQUFKLEVBQXlCO0FBQ3JCLHlDQUF5QixHQUFHLE9BQUgsRUFBekI7QUFDQSwwQ0FBMEIsR0FBRyxPQUFILEVBQTFCO0FBQ0Esd0NBQXdCLEdBQUcsT0FBSCxFQUF4QjtBQUNBLDJDQUEyQixHQUFHLE9BQUgsRUFBM0I7QUFDSDs7QUFFRCxnQkFBSSxZQUFZLENBQWhCO0FBQUEsZ0JBQW1CLGFBQWEsQ0FBaEM7QUFDQSxnQkFBSSxNQUFNLENBQVY7QUFBQSxnQkFBYSxZQUFZLElBQXpCO0FBQUEsZ0JBQStCLFVBQVUsQ0FBekM7QUFBQSxnQkFBNEMsVUFBVSxDQUF0RDs7QUFFQSxnQkFBSSw4QkFBOEIsR0FBRyxRQUFILEVBQWxDO0FBQ0EsZ0JBQUksMkJBQUosRUFBaUM7QUFDN0Isb0JBQUksR0FBRyxRQUFILEVBQUosRUFBbUI7QUFBRztBQUNsQix3QkFBSSxtQkFBbUIsR0FBRyxRQUFILEVBQXZCO0FBQ0Esd0JBQUksY0FBYyxDQUFDLENBQUQsRUFBSSxFQUFKLEVBQVEsRUFBUixFQUFZLEVBQVosRUFBZ0IsRUFBaEIsRUFBb0IsRUFBcEIsRUFBd0IsRUFBeEIsRUFBNEIsRUFBNUIsRUFBZ0MsRUFBaEMsRUFBb0MsRUFBcEMsRUFBd0MsRUFBeEMsRUFBNEMsRUFBNUMsRUFBZ0QsR0FBaEQsRUFBcUQsQ0FBckQsRUFBd0QsQ0FBeEQsRUFBMkQsQ0FBM0QsQ0FBbEI7QUFDQSx3QkFBSSxjQUFjLENBQUMsQ0FBRCxFQUFJLEVBQUosRUFBUSxFQUFSLEVBQVksRUFBWixFQUFnQixFQUFoQixFQUFvQixFQUFwQixFQUF3QixFQUF4QixFQUE0QixFQUE1QixFQUFnQyxFQUFoQyxFQUFvQyxFQUFwQyxFQUF3QyxFQUF4QyxFQUE0QyxFQUE1QyxFQUFpRCxFQUFqRCxFQUFxRCxDQUFyRCxFQUF3RCxDQUF4RCxFQUEyRCxDQUEzRCxDQUFsQjs7QUFFQSx3QkFBSSxtQkFBbUIsQ0FBbkIsSUFBd0IsbUJBQW1CLEVBQS9DLEVBQW1EO0FBQy9DLG9DQUFZLFlBQVksbUJBQW1CLENBQS9CLENBQVo7QUFDQSxxQ0FBYSxZQUFZLG1CQUFtQixDQUEvQixDQUFiO0FBQ0gscUJBSEQsTUFHTyxJQUFJLHFCQUFxQixHQUF6QixFQUE4QjtBQUNqQyxvQ0FBWSxHQUFHLFFBQUgsTUFBaUIsQ0FBakIsR0FBcUIsR0FBRyxRQUFILEVBQWpDO0FBQ0EscUNBQWEsR0FBRyxRQUFILE1BQWlCLENBQWpCLEdBQXFCLEdBQUcsUUFBSCxFQUFsQztBQUNIO0FBQ0o7O0FBRUQsb0JBQUksR0FBRyxRQUFILEVBQUosRUFBbUI7QUFBRztBQUNsQix1QkFBRyxRQUFILEdBRGUsQ0FDQztBQUNuQjtBQUNELG9CQUFJLEdBQUcsUUFBSCxFQUFKLEVBQW1CO0FBQUc7QUFDbEIsdUJBQUcsUUFBSCxDQUFZLENBQVosRUFEZSxDQUNFO0FBQ2pCLHdCQUFJLEdBQUcsUUFBSCxFQUFKLEVBQW1CO0FBQUc7QUFDbEIsMkJBQUcsUUFBSCxDQUFZLEVBQVosRUFEZSxDQUNHO0FBQ3JCO0FBQ0o7QUFDRCxvQkFBSSxHQUFHLFFBQUgsRUFBSixFQUFtQjtBQUFHO0FBQ2xCLHVCQUFHLE9BQUgsR0FEZSxDQUNBO0FBQ2YsdUJBQUcsT0FBSCxHQUZlLENBRUE7QUFDbEI7QUFDRCxvQkFBSSxHQUFHLFFBQUgsRUFBSixFQUFtQjtBQUFHO0FBQ2xCLHdCQUFJLG9CQUFvQixHQUFHLFFBQUgsQ0FBWSxFQUFaLENBQXhCO0FBQ0Esd0JBQUksYUFBYSxHQUFHLFFBQUgsQ0FBWSxFQUFaLENBQWpCO0FBQ0EsZ0NBQVksR0FBRyxRQUFILEVBQVosQ0FIZSxDQUdhOztBQUU1Qiw4QkFBVSxVQUFWO0FBQ0EsOEJBQVUsb0JBQW9CLENBQTlCO0FBQ0EsMEJBQU0sVUFBVSxPQUFoQjtBQUNIO0FBQ0o7O0FBRUQsZ0JBQUksV0FBVyxDQUFmO0FBQ0EsZ0JBQUksY0FBYyxDQUFkLElBQW1CLGVBQWUsQ0FBdEMsRUFBeUM7QUFDckMsMkJBQVcsWUFBWSxVQUF2QjtBQUNIOztBQUVELGdCQUFJLGNBQWMsQ0FBbEI7QUFBQSxnQkFBcUIsY0FBYyxDQUFuQztBQUNBLGdCQUFJLHNCQUFzQixDQUExQixFQUE2QjtBQUN6Qiw4QkFBYyxDQUFkO0FBQ0EsOEJBQWMsSUFBSSxtQkFBbEI7QUFDSCxhQUhELE1BR087QUFDSCxvQkFBSSxTQUFVLHNCQUFzQixDQUF2QixHQUE0QixDQUE1QixHQUFnQyxDQUE3QztBQUNBLG9CQUFJLFNBQVUsc0JBQXNCLENBQXZCLEdBQTRCLENBQTVCLEdBQWdDLENBQTdDO0FBQ0EsOEJBQWMsTUFBZDtBQUNBLDhCQUFjLFVBQVUsSUFBSSxtQkFBZCxDQUFkO0FBQ0g7O0FBRUQsZ0JBQUksY0FBYyxDQUFDLDBCQUEwQixDQUEzQixJQUFnQyxFQUFsRDtBQUNBLGdCQUFJLGVBQWUsQ0FBQyxJQUFJLG1CQUFMLEtBQTZCLENBQUMsaUNBQWlDLENBQWxDLElBQXVDLEVBQXBFLENBQW5COztBQUVBLDJCQUFlLENBQUMseUJBQXlCLHVCQUExQixJQUFxRCxXQUFwRTtBQUNBLDRCQUFnQixDQUFDLHdCQUF3Qix3QkFBekIsSUFBcUQsV0FBckU7O0FBRUEsZ0JBQUksZ0JBQWdCLEtBQUssSUFBTCxDQUFVLGNBQWMsUUFBeEIsQ0FBcEI7O0FBRUEsZUFBRyxPQUFIO0FBQ0EsaUJBQUssSUFBTDs7QUFFQSxtQkFBTztBQUNILGdDQUFnQixjQURiLEVBQzhCO0FBQ2pDLDhCQUFjLFlBRlgsRUFFMEI7QUFDN0IsMkJBQVcsU0FIUixFQUdvQjtBQUN2Qiw0QkFBWSxVQUpUO0FBS0gsK0JBQWUsYUFMWixFQUs0QjtBQUMvQixzQ0FBc0IsVUFBVSxxQkFBVixDQUFnQyxhQUFoQyxDQU5uQjs7QUFRSCw0QkFBWTtBQUNSLDJCQUFPLFNBREM7QUFFUix5QkFBSyxHQUZHO0FBR1IsNkJBQVMsT0FIRDtBQUlSLDZCQUFTO0FBSkQsaUJBUlQ7O0FBZUgsMkJBQVc7QUFDUCwyQkFBTyxTQURBO0FBRVAsNEJBQVE7QUFGRCxpQkFmUjs7QUFvQkgsNEJBQVk7QUFDUiwyQkFBTyxXQURDO0FBRVIsNEJBQVE7QUFGQSxpQkFwQlQ7O0FBeUJILDhCQUFjO0FBQ1YsMkJBQU8sYUFERztBQUVWLDRCQUFRO0FBRkU7QUF6QlgsYUFBUDtBQThCSDs7O3lDQUV1QixFLEVBQUksSyxFQUFPO0FBQy9CLGdCQUFJLGFBQWEsQ0FBakI7QUFBQSxnQkFBb0IsYUFBYSxDQUFqQztBQUNBLGdCQUFJLGNBQWMsQ0FBbEI7QUFDQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQXBCLEVBQTJCLEdBQTNCLEVBQWdDO0FBQzVCLG9CQUFJLGVBQWUsQ0FBbkIsRUFBc0I7QUFDbEIsa0NBQWMsR0FBRyxPQUFILEVBQWQ7QUFDQSxpQ0FBYSxDQUFDLGFBQWEsV0FBYixHQUEyQixHQUE1QixJQUFtQyxHQUFoRDtBQUNIO0FBQ0QsNkJBQWMsZUFBZSxDQUFoQixHQUFxQixVQUFyQixHQUFrQyxVQUEvQztBQUNIO0FBQ0o7Ozt5Q0FFdUIsVyxFQUFhO0FBQ2pDLG9CQUFRLFdBQVI7QUFDSSxxQkFBSyxFQUFMO0FBQ0ksMkJBQU8sVUFBUDtBQUNKLHFCQUFLLEVBQUw7QUFDSSwyQkFBTyxNQUFQO0FBQ0oscUJBQUssRUFBTDtBQUNJLDJCQUFPLFVBQVA7QUFDSixxQkFBSyxHQUFMO0FBQ0ksMkJBQU8sTUFBUDtBQUNKLHFCQUFLLEdBQUw7QUFDSSwyQkFBTyxRQUFQO0FBQ0oscUJBQUssR0FBTDtBQUNJLDJCQUFPLFNBQVA7QUFDSixxQkFBSyxHQUFMO0FBQ0ksMkJBQU8sU0FBUDtBQUNKO0FBQ0ksMkJBQU8sU0FBUDtBQWhCUjtBQWtCSDs7O3VDQUVxQixTLEVBQVc7QUFDN0IsbUJBQU8sQ0FBQyxZQUFZLEVBQWIsRUFBaUIsT0FBakIsQ0FBeUIsQ0FBekIsQ0FBUDtBQUNIOzs7OENBRTRCLE0sRUFBUTtBQUNqQyxvQkFBUSxNQUFSO0FBQ0kscUJBQUssR0FBTDtBQUNJLDJCQUFPLE9BQVA7QUFDSixxQkFBSyxHQUFMO0FBQ0ksMkJBQU8sT0FBUDtBQUNKLHFCQUFLLEdBQUw7QUFDSSwyQkFBTyxPQUFQO0FBQ0o7QUFDSSwyQkFBTyxTQUFQO0FBUlI7QUFVSDs7Ozs7O2tCQUlVLFM7Ozs7Ozs7Ozs4UUN4UmY7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBOztBQUVBO0FBQ0EsbUJBQVMsT0FBVDs7QUFHQTtBQUNBLFNBQVMsWUFBVCxDQUFzQixlQUF0QixFQUF1QyxjQUF2QyxFQUF1RDtBQUNuRCxRQUFJLE1BQU0sZUFBVjtBQUNBLFFBQUksT0FBTyxJQUFQLElBQWUsUUFBTyxHQUFQLHlDQUFPLEdBQVAsT0FBZSxRQUFsQyxFQUE0QztBQUN4QyxjQUFNLHdDQUE2QiwrQ0FBN0IsQ0FBTjtBQUNIOztBQUVELFFBQUksQ0FBQyxJQUFJLGNBQUosQ0FBbUIsTUFBbkIsQ0FBTCxFQUFpQztBQUM3QixjQUFNLHdDQUE2QixrRUFBN0IsQ0FBTjtBQUNIOztBQUVELFlBQVEsSUFBSSxJQUFaO0FBQ0ksYUFBSyxLQUFMO0FBQ0ksbUJBQU8sd0JBQWMsR0FBZCxFQUFtQixjQUFuQixDQUFQO0FBQ0o7QUFDSSxtQkFBTywyQkFBaUIsR0FBakIsRUFBc0IsY0FBdEIsQ0FBUDtBQUpSO0FBTUg7O0FBR0Q7QUFDQSxTQUFTLFdBQVQsR0FBdUI7QUFDbkIsV0FBTyxtQkFBUyxzQkFBVCxFQUFQO0FBQ0g7O0FBRUQsU0FBUyxjQUFULEdBQTBCO0FBQ3RCLFdBQU8sbUJBQVMsY0FBVCxFQUFQO0FBQ0g7O0FBR0Q7QUFDQSxJQUFJLFFBQVEsRUFBWjs7QUFFQSxNQUFNLFlBQU4sR0FBcUIsWUFBckI7QUFDQSxNQUFNLFdBQU4sR0FBb0IsV0FBcEI7QUFDQSxNQUFNLGNBQU4sR0FBdUIsY0FBdkI7O0FBRUEsTUFBTSxVQUFOO0FBQ0EsTUFBTSxZQUFOO0FBQ0EsTUFBTSxZQUFOOztBQUVBLE1BQU0sTUFBTjtBQUNBLE1BQU0sVUFBTjtBQUNBLE1BQU0sWUFBTjs7QUFFQSxNQUFNLFNBQU47QUFDQSxNQUFNLFlBQU47QUFDQSxNQUFNLGNBQU47O0FBRUEsT0FBTyxjQUFQLENBQXNCLEtBQXRCLEVBQTZCLFNBQTdCLEVBQXdDO0FBQ3BDLGdCQUFZLElBRHdCO0FBRXBDLFNBQUssZUFBWTtBQUNiO0FBQ0EsZUFBTyxhQUFQO0FBQ0g7QUFMbUMsQ0FBeEM7O2tCQVFlLEs7Ozs7O0FDM0ZmOztBQUVBO0FBQ0EsT0FBTyxPQUFQLEdBQWlCLFFBQVEsVUFBUixFQUFvQixPQUFyQzs7Ozs7Ozs7Ozs7Ozs7O0FDZUE7Ozs7QUFDQTs7OztBQUNBOztBQUNBOzs7Ozs7OzsrZUFyQkE7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7Ozs7O0lBTU0saUI7Ozs7O3NDQUVtQjtBQUNqQixnQkFBSTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFJLGlCQUFpQixrQkFBUSxNQUFSLElBQWtCLGtCQUFRLE9BQVIsQ0FBZ0IsS0FBaEIsSUFBeUIsS0FBaEU7QUFDQSxvQkFBSSx3QkFBd0Isa0JBQVEsTUFBUixHQUFpQixjQUFqQixHQUFrQyxJQUE5RDtBQUNBLHVCQUFRLEtBQUssS0FBTCxJQUFjLEtBQUssY0FBbkIsSUFBcUMscUJBQTdDO0FBQ0gsYUFQRCxDQU9FLE9BQU8sQ0FBUCxFQUFVO0FBQ1IsdUJBQU8sS0FBUDtBQUNIO0FBQ0o7OztBQUVELCtCQUFZLFdBQVosRUFBeUIsTUFBekIsRUFBaUM7QUFBQTs7QUFBQSwwSUFDdkIscUJBRHVCOztBQUU3QixjQUFLLEdBQUwsR0FBVyxtQkFBWDs7QUFFQSxjQUFLLFlBQUwsR0FBb0IsV0FBcEI7QUFDQSxjQUFLLE9BQUwsR0FBZSxNQUFmO0FBQ0EsY0FBSyxVQUFMLEdBQWtCLElBQWxCOztBQUVBLGNBQUssYUFBTCxHQUFxQixLQUFyQjtBQUNBLGNBQUssY0FBTCxHQUFzQixJQUF0QjtBQUNBLGNBQUssZUFBTCxHQUF1QixDQUF2QjtBQVY2QjtBQVdoQzs7OztrQ0FFUztBQUNOLGdCQUFJLEtBQUssU0FBTCxFQUFKLEVBQXNCO0FBQ2xCLHFCQUFLLEtBQUw7QUFDSDtBQUNEO0FBQ0g7Ozs2QkFFSSxVLEVBQVksSyxFQUFPO0FBQUE7O0FBQ3BCLGlCQUFLLFdBQUwsR0FBbUIsVUFBbkI7QUFDQSxpQkFBSyxNQUFMLEdBQWMsS0FBZDs7QUFFQSxnQkFBSSxZQUFZLFdBQVcsR0FBM0I7QUFDQSxnQkFBSSxLQUFLLE9BQUwsQ0FBYSxrQkFBYixJQUFtQyxXQUFXLGFBQVgsSUFBNEIsU0FBbkUsRUFBOEU7QUFDMUUsNEJBQVksV0FBVyxhQUF2QjtBQUNIOztBQUVELGdCQUFJLGFBQWEsS0FBSyxZQUFMLENBQWtCLFNBQWxCLENBQTRCLFNBQTVCLEVBQXVDLEtBQXZDLENBQWpCOztBQUVBLGdCQUFJLFVBQVUsSUFBSSxLQUFLLE9BQVQsRUFBZDs7QUFFQSxnQkFBSSxRQUFPLFdBQVcsT0FBbEIsTUFBOEIsUUFBbEMsRUFBNEM7QUFDeEMsb0JBQUksZ0JBQWdCLFdBQVcsT0FBL0I7QUFDQSxxQkFBSyxJQUFJLEdBQVQsSUFBZ0IsYUFBaEIsRUFBK0I7QUFDM0Isd0JBQUksY0FBYyxjQUFkLENBQTZCLEdBQTdCLENBQUosRUFBdUM7QUFDbkMsZ0NBQVEsTUFBUixDQUFlLEdBQWYsRUFBb0IsY0FBYyxHQUFkLENBQXBCO0FBQ0g7QUFDSjtBQUNKOztBQUVELGdCQUFJLFNBQVM7QUFDVCx3QkFBUSxLQURDO0FBRVQseUJBQVMsT0FGQTtBQUdULHNCQUFNLE1BSEc7QUFJVCx1QkFBTyxTQUpFO0FBS1Q7QUFDQTtBQUNBLGdDQUFnQjtBQVBQLGFBQWI7O0FBVUE7QUFDQSxnQkFBSSxRQUFPLEtBQUssT0FBTCxDQUFhLE9BQXBCLE1BQWdDLFFBQXBDLEVBQThDO0FBQzFDLHFCQUFLLElBQUksSUFBVCxJQUFnQixLQUFLLE9BQUwsQ0FBYSxPQUE3QixFQUFzQztBQUNsQyw0QkFBUSxNQUFSLENBQWUsSUFBZixFQUFvQixLQUFLLE9BQUwsQ0FBYSxPQUFiLENBQXFCLElBQXJCLENBQXBCO0FBQ0g7QUFDSjs7QUFFRDtBQUNBLGdCQUFJLFdBQVcsSUFBWCxLQUFvQixLQUF4QixFQUErQjtBQUMzQjtBQUNBLHVCQUFPLElBQVAsR0FBYyxhQUFkO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBSSxXQUFXLGVBQWYsRUFBZ0M7QUFDNUIsdUJBQU8sV0FBUCxHQUFxQixTQUFyQjtBQUNIOztBQUVEO0FBQ0EsZ0JBQUksV0FBVyxjQUFmLEVBQStCO0FBQzNCLHVCQUFPLGNBQVAsR0FBd0IsV0FBVyxjQUFuQztBQUNIOztBQUVELGlCQUFLLE9BQUwsR0FBZSxxQkFBYSxXQUE1QjtBQUNBLGlCQUFLLEtBQUwsQ0FBVyxXQUFXLEdBQXRCLEVBQTJCLE1BQTNCLEVBQW1DLElBQW5DLENBQXdDLFVBQUMsR0FBRCxFQUFTO0FBQzdDLG9CQUFJLE9BQUssYUFBVCxFQUF3QjtBQUNwQiwyQkFBSyxhQUFMLEdBQXFCLEtBQXJCO0FBQ0EsMkJBQUssT0FBTCxHQUFlLHFCQUFhLEtBQTVCO0FBQ0E7QUFDSDtBQUNELG9CQUFJLElBQUksRUFBSixJQUFXLElBQUksTUFBSixJQUFjLEdBQWQsSUFBcUIsSUFBSSxNQUFKLElBQWMsR0FBbEQsRUFBd0Q7QUFDcEQsd0JBQUksSUFBSSxHQUFKLEtBQVksV0FBVyxHQUEzQixFQUFnQztBQUM1Qiw0QkFBSSxPQUFLLGNBQVQsRUFBeUI7QUFDckIsZ0NBQUksZ0JBQWdCLE9BQUssWUFBTCxDQUFrQixtQkFBbEIsQ0FBc0MsSUFBSSxHQUExQyxDQUFwQjtBQUNBLG1DQUFLLGNBQUwsQ0FBb0IsYUFBcEI7QUFDSDtBQUNKOztBQUVELHdCQUFJLGVBQWUsSUFBSSxPQUFKLENBQVksR0FBWixDQUFnQixnQkFBaEIsQ0FBbkI7QUFDQSx3QkFBSSxnQkFBZ0IsSUFBcEIsRUFBMEI7QUFDdEIsK0JBQUssY0FBTCxHQUFzQixTQUFTLFlBQVQsQ0FBdEI7QUFDQSw0QkFBSSxPQUFLLGNBQUwsS0FBd0IsQ0FBNUIsRUFBK0I7QUFDM0IsZ0NBQUksT0FBSyxxQkFBVCxFQUFnQztBQUM1Qix1Q0FBSyxxQkFBTCxDQUEyQixPQUFLLGNBQWhDO0FBQ0g7QUFDSjtBQUNKOztBQUVELDJCQUFPLE9BQUssS0FBTCxDQUFXLElBQVgsU0FBc0IsSUFBSSxJQUFKLENBQVMsU0FBVCxFQUF0QixDQUFQO0FBQ0gsaUJBbkJELE1BbUJPO0FBQ0gsMkJBQUssT0FBTCxHQUFlLHFCQUFhLE1BQTVCO0FBQ0Esd0JBQUksT0FBSyxRQUFULEVBQW1CO0FBQ2YsK0JBQUssUUFBTCxDQUFjLHFCQUFhLHdCQUEzQixFQUFxRCxFQUFDLE1BQU0sSUFBSSxNQUFYLEVBQW1CLEtBQUssSUFBSSxVQUE1QixFQUFyRDtBQUNILHFCQUZELE1BRU87QUFDSCw4QkFBTSxnQ0FBcUIsMkNBQTJDLElBQUksTUFBL0MsR0FBd0QsR0FBeEQsR0FBOEQsSUFBSSxVQUF2RixDQUFOO0FBQ0g7QUFDSjtBQUNKLGFBakNELEVBaUNHLEtBakNILENBaUNTLFVBQUMsQ0FBRCxFQUFPO0FBQ1osdUJBQUssT0FBTCxHQUFlLHFCQUFhLE1BQTVCO0FBQ0Esb0JBQUksT0FBSyxRQUFULEVBQW1CO0FBQ2YsMkJBQUssUUFBTCxDQUFjLHFCQUFhLFNBQTNCLEVBQXNDLEVBQUMsTUFBTSxDQUFDLENBQVIsRUFBVyxLQUFLLEVBQUUsT0FBbEIsRUFBdEM7QUFDSCxpQkFGRCxNQUVPO0FBQ0gsMEJBQU0sQ0FBTjtBQUNIO0FBQ0osYUF4Q0Q7QUF5Q0g7OztnQ0FFTztBQUNKLGlCQUFLLGFBQUwsR0FBcUIsSUFBckI7QUFDSDs7OzhCQUVLLE0sRUFBUTtBQUFBOztBQUFHO0FBQ2IsbUJBQU8sT0FBTyxJQUFQLEdBQWMsSUFBZCxDQUFtQixVQUFDLE1BQUQsRUFBWTtBQUNsQyxvQkFBSSxPQUFPLElBQVgsRUFBaUI7QUFDYjtBQUNBLHdCQUFJLE9BQUssY0FBTCxLQUF3QixJQUF4QixJQUFnQyxPQUFLLGVBQUwsR0FBdUIsT0FBSyxjQUFoRSxFQUFnRjtBQUM1RTtBQUNBLCtCQUFLLE9BQUwsR0FBZSxxQkFBYSxNQUE1QjtBQUNBLDRCQUFJLE9BQU8scUJBQWEsU0FBeEI7QUFDQSw0QkFBSSxPQUFPLEVBQUMsTUFBTSxDQUFDLENBQVIsRUFBVyxLQUFLLDZCQUFoQixFQUFYO0FBQ0EsNEJBQUksT0FBSyxRQUFULEVBQW1CO0FBQ2YsbUNBQUssUUFBTCxDQUFjLElBQWQsRUFBb0IsSUFBcEI7QUFDSCx5QkFGRCxNQUVPO0FBQ0gsa0NBQU0sZ0NBQXFCLEtBQUssR0FBMUIsQ0FBTjtBQUNIO0FBQ0oscUJBVkQsTUFVTztBQUNIO0FBQ0EsK0JBQUssT0FBTCxHQUFlLHFCQUFhLFNBQTVCO0FBQ0EsNEJBQUksT0FBSyxXQUFULEVBQXNCO0FBQ2xCLG1DQUFLLFdBQUwsQ0FBaUIsT0FBSyxNQUFMLENBQVksSUFBN0IsRUFBbUMsT0FBSyxNQUFMLENBQVksSUFBWixHQUFtQixPQUFLLGVBQXhCLEdBQTBDLENBQTdFO0FBQ0g7QUFDSjtBQUNKLGlCQW5CRCxNQW1CTztBQUNILHdCQUFJLE9BQUssYUFBTCxLQUF1QixJQUEzQixFQUFpQztBQUM3QiwrQkFBSyxhQUFMLEdBQXFCLEtBQXJCO0FBQ0EsK0JBQUssT0FBTCxHQUFlLHFCQUFhLFNBQTVCO0FBQ0EsK0JBQU8sT0FBTyxNQUFQLEVBQVA7QUFDSDs7QUFFRCwyQkFBSyxPQUFMLEdBQWUscUJBQWEsVUFBNUI7O0FBRUEsd0JBQUksUUFBUSxPQUFPLEtBQVAsQ0FBYSxNQUF6QjtBQUNBLHdCQUFJLFlBQVksT0FBSyxNQUFMLENBQVksSUFBWixHQUFtQixPQUFLLGVBQXhDO0FBQ0EsMkJBQUssZUFBTCxJQUF3QixNQUFNLFVBQTlCOztBQUVBLHdCQUFJLE9BQUssY0FBVCxFQUF5QjtBQUNyQiwrQkFBSyxjQUFMLENBQW9CLEtBQXBCLEVBQTJCLFNBQTNCLEVBQXNDLE9BQUssZUFBM0M7QUFDSDs7QUFFRCwyQkFBSyxLQUFMLENBQVcsTUFBWDtBQUNIO0FBQ0osYUF2Q00sRUF1Q0osS0F2Q0ksQ0F1Q0UsVUFBQyxDQUFELEVBQU87QUFDWixvQkFBSSxFQUFFLElBQUYsS0FBVyxFQUFYLElBQWlCLGtCQUFRLE1BQTdCLEVBQXFDO0FBQUc7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDSDs7QUFFRCx1QkFBSyxPQUFMLEdBQWUscUJBQWEsTUFBNUI7QUFDQSxvQkFBSSxPQUFPLENBQVg7QUFDQSxvQkFBSSxPQUFPLElBQVg7O0FBRUEsb0JBQUksQ0FBQyxFQUFFLElBQUYsS0FBVyxFQUFYLElBQWlCLEVBQUUsT0FBRixLQUFjLGVBQWhDLE9BQW9EO0FBQ25ELHVCQUFLLGNBQUwsS0FBd0IsSUFBeEIsSUFDQSxPQUFLLGNBQUwsS0FBd0IsSUFBeEIsSUFBZ0MsT0FBSyxlQUFMLEdBQXVCLE9BQUssY0FGN0QsQ0FBSixFQUVtRjtBQUMvRSwyQkFBTyxxQkFBYSxTQUFwQjtBQUNBLDJCQUFPLEVBQUMsTUFBTSxFQUFFLElBQVQsRUFBZSxLQUFLLDZCQUFwQixFQUFQO0FBQ0gsaUJBTEQsTUFLTztBQUNILDJCQUFPLHFCQUFhLFNBQXBCO0FBQ0EsMkJBQU8sRUFBQyxNQUFNLEVBQUUsSUFBVCxFQUFlLEtBQUssRUFBRSxPQUF0QixFQUFQO0FBQ0g7O0FBRUQsb0JBQUksT0FBSyxRQUFULEVBQW1CO0FBQ2YsMkJBQUssUUFBTCxDQUFjLElBQWQsRUFBb0IsSUFBcEI7QUFDSCxpQkFGRCxNQUVPO0FBQ0gsMEJBQU0sZ0NBQXFCLEtBQUssR0FBMUIsQ0FBTjtBQUNIO0FBQ0osYUFsRU0sQ0FBUDtBQW1FSDs7Ozs7O2tCQUlVLGlCOzs7Ozs7Ozs7cWpCQy9PZjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUFFQTs7Ozs7Ozs7OztBQVVBO0lBQ00sWTtBQUVGLDBCQUFZLFVBQVosRUFBd0IsTUFBeEIsRUFBZ0MsU0FBaEMsRUFBMkM7QUFBQTs7QUFDdkMsYUFBSyxHQUFMLEdBQVcsY0FBWDs7QUFFQSxhQUFLLE9BQUwsR0FBZSxNQUFmO0FBQ0EsYUFBSyxVQUFMLEdBQWtCLFNBQWxCOztBQUVBLGFBQUssaUJBQUwsR0FBeUIsT0FBTyxHQUFoQyxDQU51QyxDQU1EO0FBQ3RDLFlBQUksT0FBTyxnQkFBUCxJQUEyQixTQUEzQixJQUF3QyxPQUFPLGdCQUFQLEdBQTBCLENBQXRFLEVBQXlFO0FBQ3JFO0FBQ0EsaUJBQUssaUJBQUwsR0FBeUIsT0FBTyxnQkFBaEM7QUFDSDs7QUFFRCxhQUFLLFVBQUwsR0FBa0IsQ0FBbEI7QUFDQSxhQUFLLFVBQUwsR0FBa0IsS0FBSyxpQkFBdkI7QUFDQSxhQUFLLFdBQUwsR0FBbUIsT0FBTyxJQUFQLEdBQWMsQ0FBakMsQ0FkdUMsQ0FjRjtBQUNyQyxhQUFLLFlBQUwsR0FBb0IsSUFBSSxXQUFKLENBQWdCLEtBQUssV0FBckIsQ0FBcEI7QUFDQSxhQUFLLGVBQUwsR0FBdUIsQ0FBdkI7QUFDQSxhQUFLLFlBQUwsR0FBb0IsSUFBcEI7QUFDQSxZQUFJLE9BQU8saUJBQVAsS0FBNkIsS0FBakMsRUFBd0M7QUFDcEMsaUJBQUssWUFBTCxHQUFvQixLQUFwQjtBQUNIOztBQUVELGFBQUssT0FBTCxHQUFlLElBQWY7QUFDQSxhQUFLLFlBQUwsR0FBb0IsSUFBcEI7QUFDQSxhQUFLLFlBQUwsR0FBb0IsSUFBcEI7O0FBRUEsYUFBSyxXQUFMLEdBQW1CLFVBQW5CO0FBQ0EsYUFBSyxlQUFMLEdBQXVCLGlCQUFpQixJQUFqQixDQUFzQixXQUFXLEdBQWpDLENBQXZCO0FBQ0EsYUFBSyxlQUFMLEdBQXVCLFdBQVcsUUFBWCxHQUFzQixXQUFXLFFBQWpDLEdBQTRDLElBQW5FO0FBQ0EsYUFBSyxZQUFMLEdBQW9CLEtBQUssZUFBekI7QUFDQSxhQUFLLGdCQUFMLEdBQXdCLEtBQXhCO0FBQ0EsYUFBSyxhQUFMLEdBQXFCLElBQXJCO0FBQ0EsYUFBSyxjQUFMLEdBQXNCLElBQXRCOztBQUVBLGFBQUssZ0JBQUwsR0FBd0IsQ0FBeEI7QUFDQSxhQUFLLGFBQUwsR0FBcUIsNEJBQXJCO0FBQ0EsYUFBSyxtQkFBTCxHQUEyQixDQUFDLEVBQUQsRUFBSyxHQUFMLEVBQVUsR0FBVixFQUFlLEdBQWYsRUFBb0IsR0FBcEIsRUFBeUIsR0FBekIsRUFBOEIsSUFBOUIsRUFBb0MsSUFBcEMsRUFBMEMsSUFBMUMsRUFBZ0QsSUFBaEQsRUFBc0QsSUFBdEQsQ0FBM0I7O0FBRUEsYUFBSyx1QkFBTCxHQUErQixLQUEvQjs7QUFFQSxhQUFLLE9BQUwsR0FBZSxLQUFmO0FBQ0EsYUFBSyxXQUFMLEdBQW1CLENBQW5COztBQUVBLGFBQUssY0FBTCxHQUFzQixJQUF0QjtBQUNBLGFBQUssU0FBTCxHQUFpQixJQUFqQjtBQUNBLGFBQUssUUFBTCxHQUFnQixJQUFoQjtBQUNBLGFBQUssV0FBTCxHQUFtQixJQUFuQjtBQUNBLGFBQUssV0FBTCxHQUFtQixJQUFuQjtBQUNBLGFBQUssb0JBQUwsR0FBNEIsSUFBNUI7O0FBRUEsYUFBSyxrQkFBTDtBQUNBLGFBQUssYUFBTDtBQUNBLGFBQUssYUFBTDtBQUNIOzs7O2tDQUVTO0FBQ04sZ0JBQUksS0FBSyxPQUFMLENBQWEsU0FBYixFQUFKLEVBQThCO0FBQzFCLHFCQUFLLE9BQUwsQ0FBYSxLQUFiO0FBQ0g7QUFDRCxpQkFBSyxPQUFMLENBQWEsT0FBYjtBQUNBLGlCQUFLLE9BQUwsR0FBZSxJQUFmO0FBQ0EsaUJBQUssWUFBTCxHQUFvQixJQUFwQjtBQUNBLGlCQUFLLFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxpQkFBSyxZQUFMLEdBQW9CLElBQXBCO0FBQ0EsaUJBQUssVUFBTCxHQUFrQixLQUFLLFVBQUwsR0FBa0IsS0FBSyxXQUFMLEdBQW1CLEtBQUssZUFBTCxHQUF1QixDQUE5RTtBQUNBLGlCQUFLLGFBQUwsR0FBcUIsSUFBckI7QUFDQSxpQkFBSyxhQUFMLEdBQXFCLElBQXJCOztBQUVBLGlCQUFLLHVCQUFMLEdBQStCLEtBQS9COztBQUVBLGlCQUFLLGNBQUwsR0FBc0IsSUFBdEI7QUFDQSxpQkFBSyxTQUFMLEdBQWlCLElBQWpCO0FBQ0EsaUJBQUssUUFBTCxHQUFnQixJQUFoQjtBQUNBLGlCQUFLLFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxpQkFBSyxXQUFMLEdBQW1CLElBQW5CO0FBQ0EsaUJBQUssb0JBQUwsR0FBNEIsSUFBNUI7O0FBRUEsaUJBQUssVUFBTCxHQUFrQixJQUFsQjtBQUNIOzs7b0NBRVc7QUFDUixtQkFBTyxLQUFLLE9BQUwsSUFBZ0IsS0FBSyxPQUFMLENBQWEsU0FBYixFQUFoQixJQUE0QyxDQUFDLEtBQUssT0FBekQ7QUFDSDs7O21DQUVVO0FBQ1AsbUJBQU8sS0FBSyxPQUFaO0FBQ0g7Ozs2Q0F5Rm9CO0FBQ2pCLGdCQUFJLFNBQVMsS0FBSyxPQUFsQjs7QUFFQSxnQkFBSSxPQUFPLFFBQVAsS0FBb0IsT0FBeEIsRUFBaUM7QUFDN0IscUJBQUssWUFBTCxHQUFvQiwrQkFBcUIsS0FBSyxPQUFMLENBQWEsa0JBQWxDLENBQXBCO0FBQ0gsYUFGRCxNQUVPLElBQUksT0FBTyxRQUFQLEtBQW9CLE9BQXhCLEVBQWlDO0FBQ3BDLG9CQUFJLGFBQWEsT0FBTyxjQUFQLElBQXlCLFFBQTFDO0FBQ0Esb0JBQUksV0FBVyxPQUFPLFlBQVAsSUFBdUIsTUFBdEM7O0FBRUEscUJBQUssWUFBTCxHQUFvQiwrQkFBcUIsVUFBckIsRUFBaUMsUUFBakMsQ0FBcEI7QUFDSCxhQUxNLE1BS0EsSUFBSSxPQUFPLFFBQVAsS0FBb0IsUUFBeEIsRUFBa0M7QUFDckMsb0JBQUksT0FBTyxPQUFPLGlCQUFkLEtBQW9DLFVBQXhDLEVBQW9EO0FBQ2hELDBCQUFNLHdDQUE2QixvRUFBN0IsQ0FBTjtBQUNIO0FBQ0QscUJBQUssWUFBTCxHQUFvQixJQUFJLE9BQU8saUJBQVgsRUFBcEI7QUFDSCxhQUxNLE1BS0E7QUFDSCxzQkFBTSx5RUFBNEQsT0FBTyxRQUFuRSxDQUFOO0FBQ0g7QUFDSjs7O3dDQUVlO0FBQ1osZ0JBQUksS0FBSyxPQUFMLENBQWEsWUFBYixJQUE2QixJQUFqQyxFQUF1QztBQUNuQyxxQkFBSyxZQUFMLEdBQW9CLEtBQUssT0FBTCxDQUFhLFlBQWpDO0FBQ0gsYUFGRCxNQUVPLElBQUksS0FBSyxlQUFULEVBQTBCO0FBQzdCLHFCQUFLLFlBQUw7QUFDSCxhQUZNLE1BRUEsSUFBSSw0QkFBa0IsV0FBbEIsRUFBSixFQUFxQztBQUN4QyxxQkFBSyxZQUFMO0FBQ0gsYUFGTSxNQUVBLElBQUksOEJBQWlCLFdBQWpCLEVBQUosRUFBb0M7QUFDdkMscUJBQUssWUFBTDtBQUNILGFBRk0sTUFFQSxJQUFJLHlCQUFZLFdBQVosRUFBSixFQUErQjtBQUNsQyxxQkFBSyxZQUFMO0FBQ0gsYUFGTSxNQUVBO0FBQ0gsc0JBQU0sZ0NBQXFCLGtFQUFyQixDQUFOO0FBQ0g7QUFDSjs7O3dDQUVlO0FBQ1osaUJBQUssT0FBTCxHQUFlLElBQUksS0FBSyxZQUFULENBQXNCLEtBQUssWUFBM0IsRUFBeUMsS0FBSyxPQUE5QyxDQUFmO0FBQ0EsZ0JBQUksS0FBSyxPQUFMLENBQWEsZUFBYixLQUFpQyxLQUFyQyxFQUE0QztBQUN4QyxxQkFBSyxZQUFMLEdBQW9CLEtBQXBCO0FBQ0g7QUFDRCxpQkFBSyxPQUFMLENBQWEsb0JBQWIsR0FBb0MsS0FBSyxxQkFBTCxDQUEyQixJQUEzQixDQUFnQyxJQUFoQyxDQUFwQztBQUNBLGlCQUFLLE9BQUwsQ0FBYSxhQUFiLEdBQTZCLEtBQUssY0FBTCxDQUFvQixJQUFwQixDQUF5QixJQUF6QixDQUE3QjtBQUNBLGlCQUFLLE9BQUwsQ0FBYSxhQUFiLEdBQTZCLEtBQUsscUJBQUwsQ0FBMkIsSUFBM0IsQ0FBZ0MsSUFBaEMsQ0FBN0I7QUFDQSxpQkFBSyxPQUFMLENBQWEsVUFBYixHQUEwQixLQUFLLGlCQUFMLENBQXVCLElBQXZCLENBQTRCLElBQTVCLENBQTFCO0FBQ0EsaUJBQUssT0FBTCxDQUFhLE9BQWIsR0FBdUIsS0FBSyxjQUFMLENBQW9CLElBQXBCLENBQXlCLElBQXpCLENBQXZCO0FBQ0g7Ozs2QkFFSSxZLEVBQWM7QUFDZixpQkFBSyxhQUFMLEdBQXFCLEVBQUMsTUFBTSxDQUFQLEVBQVUsSUFBSSxDQUFDLENBQWYsRUFBckI7QUFDQSxnQkFBSSxZQUFKLEVBQWtCO0FBQ2QscUJBQUssYUFBTCxDQUFtQixJQUFuQixHQUEwQixZQUExQjtBQUNIOztBQUVELGlCQUFLLGFBQUwsQ0FBbUIsS0FBbkI7QUFDQSxnQkFBSSxDQUFDLFlBQUwsRUFBbUI7QUFDZixxQkFBSyxnQkFBTCxHQUF3QixJQUF4QjtBQUNIOztBQUVELGlCQUFLLE9BQUwsQ0FBYSxJQUFiLENBQWtCLEtBQUssV0FBdkIsRUFBb0MsT0FBTyxNQUFQLENBQWMsRUFBZCxFQUFrQixLQUFLLGFBQXZCLENBQXBDO0FBQ0g7OztnQ0FFTztBQUNKLGlCQUFLLE9BQUwsQ0FBYSxLQUFiOztBQUVBLGdCQUFJLEtBQUssT0FBVCxFQUFrQjtBQUNkLHFCQUFLLE9BQUwsR0FBZSxLQUFmO0FBQ0EscUJBQUssV0FBTCxHQUFtQixDQUFuQjtBQUNIO0FBQ0o7OztnQ0FFTztBQUNKLGdCQUFJLEtBQUssU0FBTCxFQUFKLEVBQXNCO0FBQ2xCLHFCQUFLLE9BQUwsQ0FBYSxLQUFiOztBQUVBLG9CQUFJLEtBQUssVUFBTCxLQUFvQixDQUF4QixFQUEyQjtBQUN2Qix5QkFBSyxXQUFMLEdBQW1CLEtBQUssZUFBeEI7QUFDQSx5QkFBSyxhQUFMLENBQW1CLEVBQW5CLEdBQXdCLEtBQUssZUFBTCxHQUF1QixDQUEvQztBQUNILGlCQUhELE1BR087QUFDSCx5QkFBSyxXQUFMLEdBQW1CLEtBQUssYUFBTCxDQUFtQixFQUFuQixHQUF3QixDQUEzQztBQUNIO0FBQ0QscUJBQUssVUFBTCxHQUFrQixDQUFsQjtBQUNBLHFCQUFLLGVBQUwsR0FBdUIsQ0FBdkI7QUFDQSxxQkFBSyxPQUFMLEdBQWUsSUFBZjtBQUNIO0FBQ0o7OztpQ0FFUTtBQUNMLGdCQUFJLEtBQUssT0FBVCxFQUFrQjtBQUNkLHFCQUFLLE9BQUwsR0FBZSxLQUFmO0FBQ0Esb0JBQUksUUFBUSxLQUFLLFdBQWpCO0FBQ0EscUJBQUssV0FBTCxHQUFtQixDQUFuQjtBQUNBLHFCQUFLLGFBQUwsQ0FBbUIsS0FBbkIsRUFBMEIsSUFBMUI7QUFDSDtBQUNKOzs7NkJBRUksSyxFQUFPO0FBQ1IsaUJBQUssT0FBTCxHQUFlLEtBQWY7QUFDQSxpQkFBSyxVQUFMLEdBQWtCLENBQWxCO0FBQ0EsaUJBQUssZUFBTCxHQUF1QixDQUF2QjtBQUNBLGlCQUFLLGFBQUwsQ0FBbUIsS0FBbkIsRUFBMEIsSUFBMUI7QUFDSDs7QUFFRDs7Ozs7Ozs7O3NDQU1jLEssRUFBTyxjLEVBQWdCO0FBQ2pDLGdCQUFJLEtBQUssT0FBTCxDQUFhLFNBQWIsRUFBSixFQUE4QjtBQUMxQixxQkFBSyxPQUFMLENBQWEsS0FBYjtBQUNIOztBQUVEO0FBQ0EsaUJBQUssaUJBQUwsQ0FBdUIsY0FBdkI7O0FBRUEsaUJBQUssT0FBTCxDQUFhLE9BQWI7QUFDQSxpQkFBSyxPQUFMLEdBQWUsSUFBZjs7QUFFQSxnQkFBSSxlQUFlLEVBQUMsTUFBTSxLQUFQLEVBQWMsSUFBSSxDQUFDLENBQW5CLEVBQW5CO0FBQ0EsaUJBQUssYUFBTCxHQUFxQixFQUFDLE1BQU0sYUFBYSxJQUFwQixFQUEwQixJQUFJLENBQUMsQ0FBL0IsRUFBckI7O0FBRUEsaUJBQUssYUFBTCxDQUFtQixLQUFuQjtBQUNBLGlCQUFLLFVBQUwsR0FBa0IsS0FBSyxpQkFBdkI7QUFDQSxpQkFBSyxhQUFMO0FBQ0EsaUJBQUssT0FBTCxDQUFhLElBQWIsQ0FBa0IsS0FBSyxXQUF2QixFQUFvQyxZQUFwQzs7QUFFQSxnQkFBSSxLQUFLLFNBQVQsRUFBb0I7QUFDaEIscUJBQUssU0FBTDtBQUNIO0FBQ0o7OztrQ0FFUyxHLEVBQUs7QUFDWCxnQkFBSSxDQUFDLEdBQUQsSUFBUSxPQUFPLEdBQVAsS0FBZSxRQUF2QixJQUFtQyxJQUFJLE1BQUosS0FBZSxDQUF0RCxFQUF5RDtBQUNyRCxzQkFBTSx3Q0FBNkIsaUNBQTdCLENBQU47QUFDSDs7QUFFRCxpQkFBSyxXQUFMLENBQWlCLEdBQWpCLEdBQXVCLEdBQXZCOztBQUVBO0FBQ0g7OztzQ0FFYSxhLEVBQWU7QUFDekIsZ0JBQUksZ0JBQWdCLEtBQUssVUFBekI7QUFDQSxtQkFBTyxnQkFBZ0IsT0FBTyxJQUFQLEdBQWMsQ0FBOUIsR0FBa0MsYUFBekMsRUFBd0Q7QUFDcEQsaUNBQWlCLENBQWpCO0FBQ0g7O0FBRUQsNkJBQWlCLE9BQU8sSUFBUCxHQUFjLENBQS9CLENBTnlCLENBTVU7QUFDbkMsZ0JBQUksa0JBQWtCLEtBQUssV0FBM0IsRUFBd0M7QUFDcEM7QUFDSDs7QUFFRCxnQkFBSSxZQUFZLElBQUksV0FBSixDQUFnQixhQUFoQixDQUFoQjs7QUFFQSxnQkFBSSxLQUFLLFVBQUwsR0FBa0IsQ0FBdEIsRUFBeUI7QUFBRztBQUN4QixvQkFBSSxnQkFBZ0IsSUFBSSxVQUFKLENBQWUsS0FBSyxZQUFwQixFQUFrQyxDQUFsQyxFQUFxQyxLQUFLLFVBQTFDLENBQXBCO0FBQ0Esb0JBQUksZ0JBQWdCLElBQUksVUFBSixDQUFlLFNBQWYsRUFBMEIsQ0FBMUIsRUFBNkIsYUFBN0IsQ0FBcEI7QUFDQSw4QkFBYyxHQUFkLENBQWtCLGFBQWxCLEVBQWlDLENBQWpDO0FBQ0g7O0FBRUQsaUJBQUssWUFBTCxHQUFvQixTQUFwQjtBQUNBLGlCQUFLLFdBQUwsR0FBbUIsYUFBbkI7QUFDSDs7O3dDQUVlLEssRUFBTztBQUNuQixnQkFBSSxPQUFPLEtBQUssbUJBQWhCO0FBQ0EsZ0JBQUksT0FBTyxLQUFLLE1BQUwsR0FBYyxDQUF6QjtBQUNBLGdCQUFJLE1BQU0sQ0FBVjtBQUNBLGdCQUFJLFNBQVMsQ0FBYjtBQUNBLGdCQUFJLFNBQVMsSUFBYjs7QUFFQSxnQkFBSSxRQUFRLEtBQUssQ0FBTCxDQUFaLEVBQXFCO0FBQ2pCLHVCQUFPLEtBQUssQ0FBTCxDQUFQO0FBQ0g7O0FBRUQ7QUFDQSxtQkFBTyxVQUFVLE1BQWpCLEVBQXlCO0FBQ3JCLHNCQUFNLFNBQVMsS0FBSyxLQUFMLENBQVcsQ0FBQyxTQUFTLE1BQVYsSUFBb0IsQ0FBL0IsQ0FBZjtBQUNBLG9CQUFJLFFBQVEsSUFBUixJQUFpQixTQUFTLEtBQUssR0FBTCxDQUFULElBQXNCLFFBQVEsS0FBSyxNQUFNLENBQVgsQ0FBbkQsRUFBbUU7QUFDL0QsMkJBQU8sS0FBSyxHQUFMLENBQVA7QUFDSCxpQkFGRCxNQUVPLElBQUksS0FBSyxHQUFMLElBQVksS0FBaEIsRUFBdUI7QUFDMUIsNkJBQVMsTUFBTSxDQUFmO0FBQ0gsaUJBRk0sTUFFQTtBQUNILDZCQUFTLE1BQU0sQ0FBZjtBQUNIO0FBQ0o7QUFDSjs7O3lDQUVnQixVLEVBQVk7QUFDekIsZ0JBQUksY0FBYyxDQUFsQjs7QUFFQSxnQkFBSSxLQUFLLE9BQUwsQ0FBYSxNQUFqQixFQUF5QjtBQUNyQjtBQUNBLDhCQUFjLFVBQWQ7QUFDSCxhQUhELE1BR087QUFDSCxvQkFBSSxhQUFhLEdBQWpCLEVBQXNCO0FBQ2xCLGtDQUFjLFVBQWQ7QUFDSCxpQkFGRCxNQUVPLElBQUksY0FBYyxHQUFkLElBQXFCLGNBQWMsSUFBdkMsRUFBNkM7QUFDaEQsa0NBQWMsS0FBSyxLQUFMLENBQVcsYUFBYSxHQUF4QixDQUFkO0FBQ0gsaUJBRk0sTUFFQTtBQUNILGtDQUFjLGFBQWEsQ0FBM0I7QUFDSDtBQUNKOztBQUVELGdCQUFJLGNBQWMsSUFBbEIsRUFBd0I7QUFDcEIsOEJBQWMsSUFBZDtBQUNIOztBQUVELGdCQUFJLGFBQWEsY0FBYyxJQUFkLEdBQXFCLE9BQU8sSUFBUCxHQUFjLENBQXBELENBcEJ5QixDQW9CK0I7QUFDeEQsZ0JBQUksS0FBSyxXQUFMLEdBQW1CLFVBQXZCLEVBQW1DO0FBQy9CLHFCQUFLLGFBQUwsQ0FBbUIsVUFBbkI7QUFDSDtBQUNELGlCQUFLLFVBQUwsR0FBa0IsY0FBYyxJQUFoQztBQUNIOzs7d0NBRWUsTSxFQUFRLFMsRUFBVztBQUMvQixpQkFBSyxhQUFMLENBQW1CLEVBQW5CLEdBQXdCLFlBQVksT0FBTyxVQUFuQixHQUFnQyxDQUF4RDtBQUNBLG1CQUFPLEtBQUssY0FBTCxDQUFvQixNQUFwQixFQUE0QixTQUE1QixDQUFQO0FBQ0g7Ozt1Q0FFYyxhLEVBQWU7QUFDMUIsaUJBQUssY0FBTCxHQUFzQixhQUF0QjtBQUNBLGdCQUFJLEtBQUssV0FBVCxFQUFzQjtBQUNsQixxQkFBSyxXQUFMLENBQWlCLGFBQWpCO0FBQ0g7QUFDSjs7OzhDQUVxQixhLEVBQWU7QUFDakMsZ0JBQUksaUJBQWlCLEtBQUssZ0JBQTFCLEVBQTRDO0FBQ3hDLHFCQUFLLFlBQUwsR0FBb0IsYUFBcEI7QUFDQSxxQkFBSyxnQkFBTCxHQUF3QixLQUF4QjtBQUNIO0FBQ0o7Ozs4Q0FFcUIsSyxFQUFPLFMsRUFBVyxjLEVBQWdCO0FBQ3BELGdCQUFJLENBQUMsS0FBSyxjQUFWLEVBQTBCO0FBQ3RCLHNCQUFNLHFDQUEwQiw4REFBMUIsQ0FBTjtBQUNIO0FBQ0QsZ0JBQUksS0FBSyxPQUFULEVBQWtCO0FBQ2Q7QUFDSDtBQUNELGdCQUFJLEtBQUssdUJBQVQsRUFBa0M7QUFDOUI7QUFDQSxxQkFBSyx1QkFBTCxHQUErQixLQUEvQjtBQUNBLG9CQUFJLEtBQUssb0JBQVQsRUFBK0I7QUFDM0IseUJBQUssb0JBQUw7QUFDSDtBQUNKOztBQUVELGlCQUFLLGFBQUwsQ0FBbUIsUUFBbkIsQ0FBNEIsTUFBTSxVQUFsQzs7QUFFQTtBQUNBLGdCQUFJLE9BQU8sS0FBSyxhQUFMLENBQW1CLGNBQTlCO0FBQ0EsZ0JBQUksU0FBUyxDQUFiLEVBQWdCO0FBQ1osb0JBQUksYUFBYSxLQUFLLGVBQUwsQ0FBcUIsSUFBckIsQ0FBakI7QUFDQSxvQkFBSSxLQUFLLGdCQUFMLEtBQTBCLFVBQTlCLEVBQTBDO0FBQ3RDLHlCQUFLLGdCQUFMLEdBQXdCLFVBQXhCO0FBQ0EseUJBQUssZ0JBQUwsQ0FBc0IsVUFBdEI7QUFDSDtBQUNKOztBQUVELGdCQUFJLENBQUMsS0FBSyxZQUFWLEVBQXdCO0FBQUc7QUFDdkIsb0JBQUksS0FBSyxVQUFMLEtBQW9CLENBQXhCLEVBQTJCO0FBQ3ZCO0FBQ0E7QUFDQSx3QkFBSSxXQUFXLEtBQUssZUFBTCxDQUFxQixLQUFyQixFQUE0QixTQUE1QixDQUFmO0FBQ0Esd0JBQUksV0FBVyxNQUFNLFVBQXJCLEVBQWlDO0FBQUc7QUFDaEMsNEJBQUksU0FBUyxNQUFNLFVBQU4sR0FBbUIsUUFBaEM7QUFDQSw0QkFBSSxTQUFTLEtBQUssV0FBbEIsRUFBK0I7QUFDM0IsaUNBQUssYUFBTCxDQUFtQixNQUFuQjtBQUNIO0FBQ0QsNEJBQUksYUFBYSxJQUFJLFVBQUosQ0FBZSxLQUFLLFlBQXBCLEVBQWtDLENBQWxDLEVBQXFDLEtBQUssV0FBMUMsQ0FBakI7QUFDQSxtQ0FBVyxHQUFYLENBQWUsSUFBSSxVQUFKLENBQWUsS0FBZixFQUFzQixRQUF0QixDQUFmLEVBQWdELENBQWhEO0FBQ0EsNkJBQUssVUFBTCxJQUFtQixNQUFuQjtBQUNBLDZCQUFLLGVBQUwsR0FBdUIsWUFBWSxRQUFuQztBQUNIO0FBQ0osaUJBZEQsTUFjTztBQUNIO0FBQ0Esd0JBQUksS0FBSyxVQUFMLEdBQWtCLE1BQU0sVUFBeEIsR0FBcUMsS0FBSyxXQUE5QyxFQUEyRDtBQUN2RCw2QkFBSyxhQUFMLENBQW1CLEtBQUssVUFBTCxHQUFrQixNQUFNLFVBQTNDO0FBQ0g7QUFDRCx3QkFBSSxjQUFhLElBQUksVUFBSixDQUFlLEtBQUssWUFBcEIsRUFBa0MsQ0FBbEMsRUFBcUMsS0FBSyxXQUExQyxDQUFqQjtBQUNBLGdDQUFXLEdBQVgsQ0FBZSxJQUFJLFVBQUosQ0FBZSxLQUFmLENBQWYsRUFBc0MsS0FBSyxVQUEzQztBQUNBLHlCQUFLLFVBQUwsSUFBbUIsTUFBTSxVQUF6QjtBQUNBLHdCQUFJLFlBQVcsS0FBSyxlQUFMLENBQXFCLEtBQUssWUFBTCxDQUFrQixLQUFsQixDQUF3QixDQUF4QixFQUEyQixLQUFLLFVBQWhDLENBQXJCLEVBQWtFLEtBQUssZUFBdkUsQ0FBZjtBQUNBLHdCQUFJLFlBQVcsS0FBSyxVQUFoQixJQUE4QixZQUFXLENBQTdDLEVBQWdEO0FBQUc7QUFDL0MsNEJBQUksY0FBYyxJQUFJLFVBQUosQ0FBZSxLQUFLLFlBQXBCLEVBQWtDLFNBQWxDLENBQWxCO0FBQ0Esb0NBQVcsR0FBWCxDQUFlLFdBQWYsRUFBNEIsQ0FBNUI7QUFDSDtBQUNELHlCQUFLLFVBQUwsSUFBbUIsU0FBbkI7QUFDQSx5QkFBSyxlQUFMLElBQXdCLFNBQXhCO0FBQ0g7QUFDSixhQS9CRCxNQStCTztBQUFHO0FBQ04sb0JBQUksS0FBSyxVQUFMLEtBQW9CLENBQXBCLElBQXlCLEtBQUssZUFBTCxLQUF5QixDQUF0RCxFQUF5RDtBQUFHO0FBQ3hEO0FBQ0EseUJBQUssZUFBTCxHQUF1QixTQUF2QjtBQUNIO0FBQ0Qsb0JBQUksS0FBSyxVQUFMLEdBQWtCLE1BQU0sVUFBeEIsSUFBc0MsS0FBSyxVQUEvQyxFQUEyRDtBQUN2RDtBQUNBLHdCQUFJLGVBQWEsSUFBSSxVQUFKLENBQWUsS0FBSyxZQUFwQixFQUFrQyxDQUFsQyxFQUFxQyxLQUFLLFVBQTFDLENBQWpCO0FBQ0EsaUNBQVcsR0FBWCxDQUFlLElBQUksVUFBSixDQUFlLEtBQWYsQ0FBZixFQUFzQyxLQUFLLFVBQTNDO0FBQ0EseUJBQUssVUFBTCxJQUFtQixNQUFNLFVBQXpCO0FBQ0gsaUJBTEQsTUFLTztBQUFHO0FBQ04sd0JBQUksZUFBYSxJQUFJLFVBQUosQ0FBZSxLQUFLLFlBQXBCLEVBQWtDLENBQWxDLEVBQXFDLEtBQUssV0FBMUMsQ0FBakI7QUFDQSx3QkFBSSxLQUFLLFVBQUwsR0FBa0IsQ0FBdEIsRUFBeUI7QUFBRztBQUN4QjtBQUNBO0FBQ0EsNEJBQUksU0FBUyxLQUFLLFlBQUwsQ0FBa0IsS0FBbEIsQ0FBd0IsQ0FBeEIsRUFBMkIsS0FBSyxVQUFoQyxDQUFiO0FBQ0EsNEJBQUksYUFBVyxLQUFLLGVBQUwsQ0FBcUIsTUFBckIsRUFBNkIsS0FBSyxlQUFsQyxDQUFmO0FBQ0EsNEJBQUksYUFBVyxPQUFPLFVBQXRCLEVBQWtDO0FBQzlCLGdDQUFJLGFBQVcsQ0FBZixFQUFrQjtBQUNkLG9DQUFJLGVBQWMsSUFBSSxVQUFKLENBQWUsTUFBZixFQUF1QixVQUF2QixDQUFsQjtBQUNBLDZDQUFXLEdBQVgsQ0FBZSxZQUFmLEVBQTRCLENBQTVCO0FBQ0EscUNBQUssVUFBTCxHQUFrQixhQUFZLFVBQTlCO0FBQ0EscUNBQUssZUFBTCxJQUF3QixVQUF4QjtBQUNIO0FBQ0oseUJBUEQsTUFPTztBQUNILGlDQUFLLFVBQUwsR0FBa0IsQ0FBbEI7QUFDQSxpQ0FBSyxlQUFMLElBQXdCLFVBQXhCO0FBQ0g7QUFDRCw0QkFBSSxLQUFLLFVBQUwsR0FBa0IsTUFBTSxVQUF4QixHQUFxQyxLQUFLLFdBQTlDLEVBQTJEO0FBQ3ZELGlDQUFLLGFBQUwsQ0FBbUIsS0FBSyxVQUFMLEdBQWtCLE1BQU0sVUFBM0M7QUFDQSwyQ0FBYSxJQUFJLFVBQUosQ0FBZSxLQUFLLFlBQXBCLEVBQWtDLENBQWxDLEVBQXFDLEtBQUssV0FBMUMsQ0FBYjtBQUNIO0FBQ0QscUNBQVcsR0FBWCxDQUFlLElBQUksVUFBSixDQUFlLEtBQWYsQ0FBZixFQUFzQyxLQUFLLFVBQTNDO0FBQ0EsNkJBQUssVUFBTCxJQUFtQixNQUFNLFVBQXpCO0FBQ0gscUJBdEJELE1Bc0JPO0FBQUc7QUFDTjtBQUNBLDRCQUFJLGFBQVcsS0FBSyxlQUFMLENBQXFCLEtBQXJCLEVBQTRCLFNBQTVCLENBQWY7QUFDQSw0QkFBSSxhQUFXLE1BQU0sVUFBckIsRUFBaUM7QUFDN0IsZ0NBQUksVUFBUyxNQUFNLFVBQU4sR0FBbUIsVUFBaEM7QUFDQSxnQ0FBSSxVQUFTLEtBQUssV0FBbEIsRUFBK0I7QUFDM0IscUNBQUssYUFBTCxDQUFtQixPQUFuQjtBQUNBLCtDQUFhLElBQUksVUFBSixDQUFlLEtBQUssWUFBcEIsRUFBa0MsQ0FBbEMsRUFBcUMsS0FBSyxXQUExQyxDQUFiO0FBQ0g7QUFDRCx5Q0FBVyxHQUFYLENBQWUsSUFBSSxVQUFKLENBQWUsS0FBZixFQUFzQixVQUF0QixDQUFmLEVBQWdELENBQWhEO0FBQ0EsaUNBQUssVUFBTCxJQUFtQixPQUFuQjtBQUNBLGlDQUFLLGVBQUwsR0FBdUIsWUFBWSxVQUFuQztBQUNIO0FBQ0o7QUFDSjtBQUNKO0FBQ0o7OzswQ0FFaUIsYyxFQUFnQjtBQUM5QixnQkFBSSxLQUFLLFVBQUwsR0FBa0IsQ0FBdEIsRUFBeUI7QUFDckIsb0JBQUksU0FBUyxLQUFLLFlBQUwsQ0FBa0IsS0FBbEIsQ0FBd0IsQ0FBeEIsRUFBMkIsS0FBSyxVQUFoQyxDQUFiO0FBQ0Esb0JBQUksV0FBVyxLQUFLLGVBQUwsQ0FBcUIsTUFBckIsRUFBNkIsS0FBSyxlQUFsQyxDQUFmO0FBQ0Esb0JBQUksU0FBUyxPQUFPLFVBQVAsR0FBb0IsUUFBakM7O0FBRUEsb0JBQUksV0FBVyxPQUFPLFVBQXRCLEVBQWtDO0FBQzlCLHdCQUFJLGNBQUosRUFBb0I7QUFDaEIseUNBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxFQUFtQixNQUFuQjtBQUNILHFCQUZELE1BRU87QUFDSCw0QkFBSSxXQUFXLENBQWYsRUFBa0I7QUFDZCxnQ0FBSSxhQUFhLElBQUksVUFBSixDQUFlLEtBQUssWUFBcEIsRUFBa0MsQ0FBbEMsRUFBcUMsS0FBSyxXQUExQyxDQUFqQjtBQUNBLGdDQUFJLGNBQWMsSUFBSSxVQUFKLENBQWUsTUFBZixFQUF1QixRQUF2QixDQUFsQjtBQUNBLHVDQUFXLEdBQVgsQ0FBZSxXQUFmLEVBQTRCLENBQTVCO0FBQ0EsaUNBQUssVUFBTCxHQUFrQixZQUFZLFVBQTlCO0FBQ0EsaUNBQUssZUFBTCxJQUF3QixRQUF4QjtBQUNIO0FBQ0QsK0JBQU8sQ0FBUDtBQUNIO0FBQ0o7QUFDRCxxQkFBSyxVQUFMLEdBQWtCLENBQWxCO0FBQ0EscUJBQUssZUFBTCxHQUF1QixDQUF2QjtBQUNBLHVCQUFPLE1BQVA7QUFDSDtBQUNELG1CQUFPLENBQVA7QUFDSDs7OzBDQUVpQixJLEVBQU0sRSxFQUFJO0FBQ3hCO0FBQ0EsaUJBQUssaUJBQUwsQ0FBdUIsSUFBdkI7O0FBRUEsZ0JBQUksS0FBSyxXQUFULEVBQXNCO0FBQ2xCLHFCQUFLLFdBQUwsQ0FBaUIsS0FBSyxVQUF0QjtBQUNIO0FBQ0o7Ozt1Q0FFYyxJLEVBQU0sSSxFQUFNO0FBQ3ZCLDZCQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsNEJBQXdDLEtBQUssSUFBN0MsZ0JBQTRELEtBQUssR0FBakU7O0FBRUEsaUJBQUssaUJBQUwsQ0FBdUIsS0FBdkI7O0FBRUEsZ0JBQUksS0FBSyx1QkFBVCxFQUFrQztBQUM5QjtBQUNBLHFCQUFLLHVCQUFMLEdBQStCLEtBQS9CO0FBQ0EsdUJBQU8scUJBQWEsdUJBQXBCO0FBQ0g7O0FBRUQsb0JBQVEsSUFBUjtBQUNJLHFCQUFLLHFCQUFhLFNBQWxCO0FBQTZCO0FBQ3pCLDRCQUFJLENBQUMsS0FBSyxPQUFMLENBQWEsTUFBbEIsRUFBMEI7QUFDdEI7QUFDQSxnQ0FBSSxLQUFLLFlBQVQsRUFBdUI7QUFDbkIsb0NBQUksV0FBVyxLQUFLLGFBQUwsQ0FBbUIsRUFBbkIsR0FBd0IsQ0FBdkM7QUFDQSxvQ0FBSSxXQUFXLEtBQUssWUFBcEIsRUFBa0M7QUFDOUIscURBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxFQUFnQixzQ0FBaEI7QUFDQSx5Q0FBSyx1QkFBTCxHQUErQixJQUEvQjtBQUNBLHlDQUFLLGFBQUwsQ0FBbUIsUUFBbkIsRUFBNkIsS0FBN0I7QUFDSDtBQUNEO0FBQ0g7QUFDRDtBQUNIO0FBQ0Q7QUFDQSwrQkFBTyxxQkFBYSx1QkFBcEI7QUFDQTtBQUNIO0FBQ0QscUJBQUsscUJBQWEsdUJBQWxCO0FBQ0EscUJBQUsscUJBQWEsa0JBQWxCO0FBQ0EscUJBQUsscUJBQWEsd0JBQWxCO0FBQ0EscUJBQUsscUJBQWEsU0FBbEI7QUFDSTtBQXZCUjs7QUEwQkEsZ0JBQUksS0FBSyxRQUFULEVBQW1CO0FBQ2YscUJBQUssUUFBTCxDQUFjLElBQWQsRUFBb0IsSUFBcEI7QUFDSCxhQUZELE1BRU87QUFDSCxzQkFBTSxnQ0FBcUIsa0JBQWtCLEtBQUssR0FBNUMsQ0FBTjtBQUNIO0FBQ0o7Ozs0QkEvZlk7QUFDVCxtQkFBTyxLQUFLLE9BQUwsQ0FBYSxNQUFwQjtBQUNIOzs7NEJBRWU7QUFDWixtQkFBTyxLQUFLLFVBQVo7QUFDSCxTOzBCQUVhLEksRUFBTTtBQUNoQixpQkFBSyxVQUFMLEdBQWtCLElBQWxCO0FBQ0g7O0FBRUQ7Ozs7NEJBQ29CO0FBQ2hCLG1CQUFPLEtBQUssY0FBWjtBQUNILFM7MEJBRWlCLFEsRUFBVTtBQUN4QixpQkFBSyxjQUFMLEdBQXNCLFFBQXRCO0FBQ0g7Ozs0QkFFYztBQUNYLG1CQUFPLEtBQUssU0FBWjtBQUNILFM7MEJBRVksUSxFQUFVO0FBQ25CLGlCQUFLLFNBQUwsR0FBaUIsUUFBakI7QUFDSDs7QUFFRDs7Ozs0QkFDYztBQUNWLG1CQUFPLEtBQUssUUFBWjtBQUNILFM7MEJBRVcsUSxFQUFVO0FBQ2xCLGlCQUFLLFFBQUwsR0FBZ0IsUUFBaEI7QUFDSDs7OzRCQUVnQjtBQUNiLG1CQUFPLEtBQUssV0FBWjtBQUNILFM7MEJBRWMsUSxFQUFVO0FBQ3JCLGlCQUFLLFdBQUwsR0FBbUIsUUFBbkI7QUFDSDs7OzRCQUVnQjtBQUNiLG1CQUFPLEtBQUssV0FBWjtBQUNILFM7MEJBRWMsUSxFQUFVO0FBQ3JCLGlCQUFLLFdBQUwsR0FBbUIsUUFBbkI7QUFDSDs7OzRCQUV5QjtBQUN0QixtQkFBTyxLQUFLLG9CQUFaO0FBQ0gsUzswQkFFdUIsUSxFQUFVO0FBQzlCLGlCQUFLLG9CQUFMLEdBQTRCLFFBQTVCO0FBQ0g7Ozs0QkFFZ0I7QUFDYixtQkFBTyxLQUFLLFdBQUwsQ0FBaUIsR0FBeEI7QUFDSDs7OzRCQUVpQjtBQUNkLG1CQUFRLEtBQUssY0FBTCxJQUF1QixJQUF2QixJQUErQixLQUFLLFdBQUwsQ0FBaUIsYUFBakIsSUFBa0MsU0FBekU7QUFDSDs7OzRCQUUwQjtBQUN2QixtQkFBTyxLQUFLLGNBQUwsSUFBdUIsS0FBSyxXQUFMLENBQWlCLGFBQS9DO0FBQ0g7O0FBRUQ7Ozs7NEJBQ21CO0FBQ2YsZ0JBQUksS0FBSyxZQUFMLDZCQUFKLEVBQXVDO0FBQ25DO0FBQ0EsdUJBQU8sS0FBSyxPQUFMLENBQWEsWUFBcEI7QUFDSDtBQUNELG1CQUFPLEtBQUssYUFBTCxDQUFtQixjQUExQjtBQUNIOzs7NEJBRWdCO0FBQ2IsbUJBQU8sS0FBSyxPQUFMLENBQWEsSUFBcEI7QUFDSDs7Ozs7O2tCQThhVSxZOzs7Ozs7Ozs7O3FqQkN0b0JmOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkE7Ozs7QUFFTyxJQUFNLHNDQUFlO0FBQ3hCLFdBQU8sQ0FEaUI7QUFFeEIsaUJBQWEsQ0FGVztBQUd4QixnQkFBWSxDQUhZO0FBSXhCLFlBQVEsQ0FKZ0I7QUFLeEIsZUFBVztBQUxhLENBQXJCOztBQVFBLElBQU0sc0NBQWU7QUFDeEIsUUFBSSxJQURvQjtBQUV4QixlQUFXLFdBRmE7QUFHeEIsOEJBQTBCLHVCQUhGO0FBSXhCLHdCQUFvQixtQkFKSTtBQUt4QixlQUFXLFVBTGE7QUFNeEIsNkJBQXlCO0FBTkQsQ0FBckI7O0FBU1A7Ozs7Ozs7O0lBT2EsVSxXQUFBLFU7QUFFVCx3QkFBWSxRQUFaLEVBQXNCO0FBQUE7O0FBQ2xCLGFBQUssS0FBTCxHQUFhLFlBQVksV0FBekI7QUFDQSxhQUFLLE9BQUwsR0FBZSxhQUFhLEtBQTVCO0FBQ0EsYUFBSyxVQUFMLEdBQWtCLEtBQWxCO0FBQ0E7QUFDQSxhQUFLLHFCQUFMLEdBQTZCLElBQTdCO0FBQ0EsYUFBSyxjQUFMLEdBQXNCLElBQXRCO0FBQ0EsYUFBSyxjQUFMLEdBQXNCLElBQXRCO0FBQ0EsYUFBSyxRQUFMLEdBQWdCLElBQWhCO0FBQ0EsYUFBSyxXQUFMLEdBQW1CLElBQW5CO0FBQ0g7Ozs7a0NBRVM7QUFDTixpQkFBSyxPQUFMLEdBQWUsYUFBYSxLQUE1QjtBQUNBLGlCQUFLLHFCQUFMLEdBQTZCLElBQTdCO0FBQ0EsaUJBQUssY0FBTCxHQUFzQixJQUF0QjtBQUNBLGlCQUFLLGNBQUwsR0FBc0IsSUFBdEI7QUFDQSxpQkFBSyxRQUFMLEdBQWdCLElBQWhCO0FBQ0EsaUJBQUssV0FBTCxHQUFtQixJQUFuQjtBQUNIOzs7b0NBRVc7QUFDUixtQkFBTyxLQUFLLE9BQUwsS0FBaUIsYUFBYSxXQUE5QixJQUE2QyxLQUFLLE9BQUwsS0FBaUIsYUFBYSxVQUFsRjtBQUNIOzs7OztBQXNERDs2QkFDSyxVLEVBQVksSyxFQUFPO0FBQ3BCLGtCQUFNLHVDQUE0QixrQ0FBNUIsQ0FBTjtBQUNIOzs7Z0NBRU87QUFDSixrQkFBTSx1Q0FBNEIsa0NBQTVCLENBQU47QUFDSDs7OzRCQTNEVTtBQUNQLG1CQUFPLEtBQUssS0FBWjtBQUNIOzs7NEJBRVk7QUFDVCxtQkFBTyxLQUFLLE9BQVo7QUFDSDs7OzRCQUVxQjtBQUNsQixtQkFBTyxLQUFLLFVBQVo7QUFDSDs7OzRCQUUwQjtBQUN2QixtQkFBTyxLQUFLLHFCQUFaO0FBQ0gsUzswQkFFd0IsUSxFQUFVO0FBQy9CLGlCQUFLLHFCQUFMLEdBQTZCLFFBQTdCO0FBQ0g7Ozs0QkFFbUI7QUFDaEIsbUJBQU8sS0FBSyxjQUFaO0FBQ0gsUzswQkFFaUIsUSxFQUFVO0FBQ3hCLGlCQUFLLGNBQUwsR0FBc0IsUUFBdEI7QUFDSDs7OzRCQUVtQjtBQUNoQixtQkFBTyxLQUFLLGNBQVo7QUFDSCxTOzBCQUVpQixRLEVBQVU7QUFDeEIsaUJBQUssY0FBTCxHQUFzQixRQUF0QjtBQUNIOzs7NEJBRWE7QUFDVixtQkFBTyxLQUFLLFFBQVo7QUFDSCxTOzBCQUVXLFEsRUFBVTtBQUNsQixpQkFBSyxRQUFMLEdBQWdCLFFBQWhCO0FBQ0g7Ozs0QkFFZ0I7QUFDYixtQkFBTyxLQUFLLFdBQVo7QUFDSCxTOzBCQUVjLFEsRUFBVTtBQUNyQixpQkFBSyxXQUFMLEdBQW1CLFFBQW5CO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekhMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFrQk0sZ0I7QUFFRiw4QkFBWSxVQUFaLEVBQXdCLFFBQXhCLEVBQWtDO0FBQUE7O0FBQzlCLGFBQUssVUFBTCxHQUFrQixVQUFsQjtBQUNBLGFBQUssUUFBTCxHQUFnQixRQUFoQjtBQUNIOzs7O2tDQUVTLE8sRUFBUyxLLEVBQU87QUFDdEIsZ0JBQUksTUFBTSxPQUFWOztBQUVBLGdCQUFJLE1BQU0sSUFBTixLQUFlLENBQWYsSUFBb0IsTUFBTSxFQUFOLEtBQWEsQ0FBQyxDQUF0QyxFQUF5QztBQUNyQyxvQkFBSSxVQUFVLElBQWQ7QUFDQSxvQkFBSSxJQUFJLE9BQUosQ0FBWSxHQUFaLE1BQXFCLENBQUMsQ0FBMUIsRUFBNkI7QUFDekIsMkJBQU8sR0FBUDtBQUNBLDhCQUFVLEtBQVY7QUFDSDs7QUFFRCxvQkFBSSxPQUFKLEVBQWE7QUFDVCwyQkFBTyxHQUFQO0FBQ0g7O0FBRUQsdUJBQVUsS0FBSyxVQUFmLFNBQTZCLE1BQU0sSUFBTixDQUFXLFFBQVgsRUFBN0I7O0FBRUEsb0JBQUksTUFBTSxFQUFOLEtBQWEsQ0FBQyxDQUFsQixFQUFxQjtBQUNqQixpQ0FBVyxLQUFLLFFBQWhCLFNBQTRCLE1BQU0sRUFBTixDQUFTLFFBQVQsRUFBNUI7QUFDSDtBQUNKOztBQUVELG1CQUFPO0FBQ0gscUJBQUssR0FERjtBQUVILHlCQUFTO0FBRk4sYUFBUDtBQUlIOzs7NENBRW1CLFMsRUFBVztBQUMzQixnQkFBSSxVQUFVLFVBQVUsS0FBVixDQUFnQixHQUFoQixFQUFxQixDQUFyQixDQUFkO0FBQ0EsZ0JBQUksU0FBUyxTQUFiOztBQUVBLGdCQUFJLGFBQWEsVUFBVSxPQUFWLENBQWtCLEdBQWxCLENBQWpCO0FBQ0EsZ0JBQUksZUFBZSxDQUFDLENBQXBCLEVBQXVCO0FBQ25CLHlCQUFTLFVBQVUsU0FBVixDQUFvQixhQUFhLENBQWpDLENBQVQ7QUFDSDs7QUFFRCxnQkFBSSxlQUFlLEVBQW5COztBQUVBLGdCQUFJLFVBQVUsU0FBVixJQUF1QixPQUFPLE1BQVAsR0FBZ0IsQ0FBM0MsRUFBOEM7QUFDMUMsb0JBQUksUUFBUSxPQUFPLEtBQVAsQ0FBYSxHQUFiLENBQVo7O0FBRUEscUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxNQUFNLE1BQTFCLEVBQWtDLEdBQWxDLEVBQXVDO0FBQ25DLHdCQUFJLE9BQU8sTUFBTSxDQUFOLEVBQVMsS0FBVCxDQUFlLEdBQWYsQ0FBWDtBQUNBLHdCQUFJLGFBQWMsSUFBSSxDQUF0Qjs7QUFFQSx3QkFBSSxLQUFLLENBQUwsTUFBWSxLQUFLLFVBQWpCLElBQStCLEtBQUssQ0FBTCxNQUFZLEtBQUssUUFBcEQsRUFBOEQ7QUFDMUQsNEJBQUksVUFBSixFQUFnQjtBQUNaLDRDQUFnQixHQUFoQjtBQUNIO0FBQ0Qsd0NBQWdCLE1BQU0sQ0FBTixDQUFoQjtBQUNIO0FBQ0o7QUFDSjs7QUFFRCxtQkFBUSxhQUFhLE1BQWIsS0FBd0IsQ0FBekIsR0FBOEIsT0FBOUIsR0FBd0MsVUFBVSxHQUFWLEdBQWdCLFlBQS9EO0FBQ0g7Ozs7OztrQkFJVSxnQjs7Ozs7Ozs7Ozs7OztBQ3BGZjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBa0JNLGdCO0FBRUYsOEJBQVksU0FBWixFQUF1QjtBQUFBOztBQUNuQixhQUFLLFVBQUwsR0FBa0IsYUFBYSxLQUEvQjtBQUNIOzs7O2tDQUVTLEcsRUFBSyxLLEVBQU87QUFDbEIsZ0JBQUksVUFBVSxFQUFkOztBQUVBLGdCQUFJLE1BQU0sSUFBTixLQUFlLENBQWYsSUFBb0IsTUFBTSxFQUFOLEtBQWEsQ0FBQyxDQUF0QyxFQUF5QztBQUNyQyxvQkFBSSxjQUFKO0FBQ0Esb0JBQUksTUFBTSxFQUFOLEtBQWEsQ0FBQyxDQUFsQixFQUFxQjtBQUNqQix1Q0FBaUIsTUFBTSxJQUFOLENBQVcsUUFBWCxFQUFqQixTQUEwQyxNQUFNLEVBQU4sQ0FBUyxRQUFULEVBQTFDO0FBQ0gsaUJBRkQsTUFFTztBQUNILHVDQUFpQixNQUFNLElBQU4sQ0FBVyxRQUFYLEVBQWpCO0FBQ0g7QUFDRCx3QkFBUSxPQUFSLElBQW1CLEtBQW5CO0FBQ0gsYUFSRCxNQVFPLElBQUksS0FBSyxVQUFULEVBQXFCO0FBQ3hCLHdCQUFRLE9BQVIsSUFBbUIsVUFBbkI7QUFDSDs7QUFFRCxtQkFBTztBQUNILHFCQUFLLEdBREY7QUFFSCx5QkFBUztBQUZOLGFBQVA7QUFJSDs7OzRDQUVtQixTLEVBQVc7QUFDM0IsbUJBQU8sU0FBUDtBQUNIOzs7Ozs7a0JBSVUsZ0I7Ozs7Ozs7Ozs7Ozs7QUNuRGY7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTtJQUNNLFk7QUFFRiw0QkFBYztBQUFBOztBQUNWO0FBQ0EsYUFBSyxnQkFBTCxHQUF3QixDQUF4QjtBQUNBLGFBQUssZUFBTCxHQUF1QixDQUF2QjtBQUNBLGFBQUssY0FBTCxHQUFzQixDQUF0QjtBQUNBLGFBQUssV0FBTCxHQUFtQixDQUFuQjtBQUNBLGFBQUssZ0JBQUwsR0FBd0IsQ0FBeEI7O0FBRUE7QUFDQSxZQUFJLEtBQUssV0FBTCxJQUFvQixLQUFLLFdBQUwsQ0FBaUIsR0FBekMsRUFBOEM7QUFDMUMsaUJBQUssSUFBTCxHQUFZLEtBQUssV0FBTCxDQUFpQixHQUFqQixDQUFxQixJQUFyQixDQUEwQixLQUFLLFdBQS9CLENBQVo7QUFDSCxTQUZELE1BRU87QUFDSCxpQkFBSyxJQUFMLEdBQVksS0FBSyxHQUFqQjtBQUNIO0FBQ0o7Ozs7Z0NBRU87QUFDSixpQkFBSyxnQkFBTCxHQUF3QixLQUFLLGVBQUwsR0FBdUIsQ0FBL0M7QUFDQSxpQkFBSyxXQUFMLEdBQW1CLEtBQUssY0FBTCxHQUFzQixDQUF6QztBQUNBLGlCQUFLLGdCQUFMLEdBQXdCLENBQXhCO0FBQ0g7OztpQ0FFUSxLLEVBQU87QUFDWixnQkFBSSxLQUFLLGdCQUFMLEtBQTBCLENBQTlCLEVBQWlDO0FBQzdCLHFCQUFLLGdCQUFMLEdBQXdCLEtBQUssSUFBTCxFQUF4QjtBQUNBLHFCQUFLLGVBQUwsR0FBdUIsS0FBSyxnQkFBNUI7QUFDQSxxQkFBSyxjQUFMLElBQXVCLEtBQXZCO0FBQ0EscUJBQUssV0FBTCxJQUFvQixLQUFwQjtBQUNILGFBTEQsTUFLTyxJQUFJLEtBQUssSUFBTCxLQUFjLEtBQUssZUFBbkIsR0FBcUMsSUFBekMsRUFBK0M7QUFDbEQscUJBQUssY0FBTCxJQUF1QixLQUF2QjtBQUNBLHFCQUFLLFdBQUwsSUFBb0IsS0FBcEI7QUFDSCxhQUhNLE1BR0E7QUFBRztBQUNOLHFCQUFLLGdCQUFMLEdBQXdCLEtBQUssY0FBN0I7QUFDQSxxQkFBSyxjQUFMLEdBQXNCLEtBQXRCO0FBQ0EscUJBQUssV0FBTCxJQUFvQixLQUFwQjtBQUNBLHFCQUFLLGVBQUwsR0FBdUIsS0FBSyxJQUFMLEVBQXZCO0FBQ0g7QUFDSjs7OzRCQUVpQjtBQUNkLGlCQUFLLFFBQUwsQ0FBYyxDQUFkOztBQUVBLGdCQUFJLGtCQUFrQixDQUFDLEtBQUssSUFBTCxLQUFjLEtBQUssZUFBcEIsSUFBdUMsSUFBN0Q7QUFDQSxnQkFBSSxtQkFBbUIsQ0FBdkIsRUFBMEIsa0JBQWtCLENBQWxCO0FBQzFCLG1CQUFRLEtBQUssY0FBTCxHQUFzQixlQUF2QixHQUEwQyxJQUFqRDtBQUNIOzs7NEJBRW9CO0FBQ2pCLGlCQUFLLFFBQUwsQ0FBYyxDQUFkOztBQUVBLGdCQUFJLEtBQUssZ0JBQUwsS0FBMEIsQ0FBOUIsRUFBaUM7QUFDN0IsdUJBQU8sS0FBSyxnQkFBTCxHQUF3QixJQUEvQjtBQUNILGFBRkQsTUFFTztBQUFHO0FBQ04sb0JBQUksS0FBSyxJQUFMLEtBQWMsS0FBSyxlQUFuQixJQUFzQyxHQUExQyxFQUErQztBQUMzQztBQUNBO0FBQ0EsMkJBQU8sS0FBSyxXQUFaO0FBQ0gsaUJBSkQsTUFJTztBQUNIO0FBQ0EsMkJBQU8sQ0FBUDtBQUNIO0FBQ0o7QUFDSjs7OzRCQUVpQjtBQUNkLGdCQUFJLGtCQUFrQixDQUFDLEtBQUssSUFBTCxLQUFjLEtBQUssZ0JBQXBCLElBQXdDLElBQTlEO0FBQ0EsbUJBQVEsS0FBSyxXQUFMLEdBQW1CLGVBQXBCLEdBQXVDLElBQTlDO0FBQ0g7Ozs7OztrQkFJVSxZOzs7Ozs7Ozs7Ozs7O0FDMUVmOzs7O0FBQ0E7O0FBQ0E7Ozs7Ozs7OytlQXBCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBO0lBQ00sZTs7Ozs7c0NBRW1CO0FBQ2pCLGdCQUFJO0FBQ0EsdUJBQVEsT0FBTyxLQUFLLFNBQVosS0FBMEIsV0FBbEM7QUFDSCxhQUZELENBRUUsT0FBTyxDQUFQLEVBQVU7QUFDUix1QkFBTyxLQUFQO0FBQ0g7QUFDSjs7O0FBRUQsK0JBQWM7QUFBQTs7QUFBQSxzSUFDSixrQkFESTs7QUFFVixjQUFLLEdBQUwsR0FBVyxpQkFBWDs7QUFFQSxjQUFLLFVBQUwsR0FBa0IsSUFBbEI7O0FBRUEsY0FBSyxHQUFMLEdBQVcsSUFBWDtBQUNBLGNBQUssYUFBTCxHQUFxQixLQUFyQjtBQUNBLGNBQUssZUFBTCxHQUF1QixDQUF2QjtBQVJVO0FBU2I7Ozs7a0NBRVM7QUFDTixnQkFBSSxLQUFLLEdBQVQsRUFBYztBQUNWLHFCQUFLLEtBQUw7QUFDSDtBQUNEO0FBQ0g7Ozs2QkFFSSxVLEVBQVk7QUFDYixnQkFBSTtBQUNBLG9CQUFJLEtBQUssS0FBSyxHQUFMLEdBQVcsSUFBSSxLQUFLLFNBQVQsQ0FBbUIsV0FBVyxHQUE5QixDQUFwQjtBQUNBLG1CQUFHLFVBQUgsR0FBZ0IsYUFBaEI7QUFDQSxtQkFBRyxNQUFILEdBQVksS0FBSyxnQkFBTCxDQUFzQixJQUF0QixDQUEyQixJQUEzQixDQUFaO0FBQ0EsbUJBQUcsT0FBSCxHQUFhLEtBQUssaUJBQUwsQ0FBdUIsSUFBdkIsQ0FBNEIsSUFBNUIsQ0FBYjtBQUNBLG1CQUFHLFNBQUgsR0FBZSxLQUFLLG1CQUFMLENBQXlCLElBQXpCLENBQThCLElBQTlCLENBQWY7QUFDQSxtQkFBRyxPQUFILEdBQWEsS0FBSyxpQkFBTCxDQUF1QixJQUF2QixDQUE0QixJQUE1QixDQUFiOztBQUVBLHFCQUFLLE9BQUwsR0FBZSxxQkFBYSxXQUE1QjtBQUNILGFBVEQsQ0FTRSxPQUFPLENBQVAsRUFBVTtBQUNSLHFCQUFLLE9BQUwsR0FBZSxxQkFBYSxNQUE1Qjs7QUFFQSxvQkFBSSxPQUFPLEVBQUMsTUFBTSxFQUFFLElBQVQsRUFBZSxLQUFLLEVBQUUsT0FBdEIsRUFBWDs7QUFFQSxvQkFBSSxLQUFLLFFBQVQsRUFBbUI7QUFDZix5QkFBSyxRQUFMLENBQWMscUJBQWEsU0FBM0IsRUFBc0MsSUFBdEM7QUFDSCxpQkFGRCxNQUVPO0FBQ0gsMEJBQU0sZ0NBQXFCLEtBQUssR0FBMUIsQ0FBTjtBQUNIO0FBQ0o7QUFDSjs7O2dDQUVPO0FBQ0osZ0JBQUksS0FBSyxLQUFLLEdBQWQ7QUFDQSxnQkFBSSxPQUFPLEdBQUcsVUFBSCxLQUFrQixDQUFsQixJQUF1QixHQUFHLFVBQUgsS0FBa0IsQ0FBaEQsQ0FBSixFQUF3RDtBQUFHO0FBQ3ZELHFCQUFLLGFBQUwsR0FBcUIsSUFBckI7QUFDQSxtQkFBRyxLQUFIO0FBQ0g7O0FBRUQsaUJBQUssR0FBTCxHQUFXLElBQVg7QUFDQSxpQkFBSyxPQUFMLEdBQWUscUJBQWEsU0FBNUI7QUFDSDs7O3lDQUVnQixDLEVBQUc7QUFDaEIsaUJBQUssT0FBTCxHQUFlLHFCQUFhLFVBQTVCO0FBQ0g7OzswQ0FFaUIsQyxFQUFHO0FBQ2pCLGdCQUFJLEtBQUssYUFBTCxLQUF1QixJQUEzQixFQUFpQztBQUM3QixxQkFBSyxhQUFMLEdBQXFCLEtBQXJCO0FBQ0E7QUFDSDs7QUFFRCxpQkFBSyxPQUFMLEdBQWUscUJBQWEsU0FBNUI7O0FBRUEsZ0JBQUksS0FBSyxXQUFULEVBQXNCO0FBQ2xCLHFCQUFLLFdBQUwsQ0FBaUIsQ0FBakIsRUFBb0IsS0FBSyxlQUFMLEdBQXVCLENBQTNDO0FBQ0g7QUFDSjs7OzRDQUVtQixDLEVBQUc7QUFBQTs7QUFDbkIsZ0JBQUksRUFBRSxJQUFGLFlBQWtCLFdBQXRCLEVBQW1DO0FBQy9CLHFCQUFLLG9CQUFMLENBQTBCLEVBQUUsSUFBNUI7QUFDSCxhQUZELE1BRU8sSUFBSSxFQUFFLElBQUYsWUFBa0IsSUFBdEIsRUFBNEI7QUFDL0Isb0JBQUksU0FBUyxJQUFJLFVBQUosRUFBYjtBQUNBLHVCQUFPLE1BQVAsR0FBZ0IsWUFBTTtBQUNsQiwyQkFBSyxvQkFBTCxDQUEwQixPQUFPLE1BQWpDO0FBQ0gsaUJBRkQ7QUFHQSx1QkFBTyxpQkFBUCxDQUF5QixFQUFFLElBQTNCO0FBQ0gsYUFOTSxNQU1BO0FBQ0gscUJBQUssT0FBTCxHQUFlLHFCQUFhLE1BQTVCO0FBQ0Esb0JBQUksT0FBTyxFQUFDLE1BQU0sQ0FBQyxDQUFSLEVBQVcsS0FBSyx5Q0FBeUMsRUFBRSxJQUFGLENBQU8sV0FBUCxDQUFtQixJQUE1RSxFQUFYOztBQUVBLG9CQUFJLEtBQUssUUFBVCxFQUFtQjtBQUNmLHlCQUFLLFFBQUwsQ0FBYyxxQkFBYSxTQUEzQixFQUFzQyxJQUF0QztBQUNILGlCQUZELE1BRU87QUFDSCwwQkFBTSxnQ0FBcUIsS0FBSyxHQUExQixDQUFOO0FBQ0g7QUFDSjtBQUNKOzs7NkNBRW9CLFcsRUFBYTtBQUM5QixnQkFBSSxRQUFRLFdBQVo7QUFDQSxnQkFBSSxZQUFZLEtBQUssZUFBckI7QUFDQSxpQkFBSyxlQUFMLElBQXdCLE1BQU0sVUFBOUI7O0FBRUEsZ0JBQUksS0FBSyxjQUFULEVBQXlCO0FBQ3JCLHFCQUFLLGNBQUwsQ0FBb0IsS0FBcEIsRUFBMkIsU0FBM0IsRUFBc0MsS0FBSyxlQUEzQztBQUNIO0FBQ0o7OzswQ0FFaUIsQyxFQUFHO0FBQ2pCLGlCQUFLLE9BQUwsR0FBZSxxQkFBYSxNQUE1Qjs7QUFFQSxnQkFBSSxPQUFPO0FBQ1Asc0JBQU0sRUFBRSxJQUREO0FBRVAscUJBQUssRUFBRTtBQUZBLGFBQVg7O0FBS0EsZ0JBQUksS0FBSyxRQUFULEVBQW1CO0FBQ2YscUJBQUssUUFBTCxDQUFjLHFCQUFhLFNBQTNCLEVBQXNDLElBQXRDO0FBQ0gsYUFGRCxNQUVPO0FBQ0gsc0JBQU0sZ0NBQXFCLEtBQUssR0FBMUIsQ0FBTjtBQUNIO0FBQ0o7Ozs7OztrQkFJVSxlOzs7Ozs7Ozs7Ozs7Ozs7QUNwSWY7Ozs7QUFDQTs7QUFDQTs7Ozs7Ozs7K2VBcEJBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7SUFDTSxnQjs7Ozs7c0NBRW1CO0FBQ2pCLGdCQUFJO0FBQ0Esb0JBQUksTUFBTSxJQUFJLGNBQUosRUFBVjtBQUNBO0FBQ0Esb0JBQUksSUFBSixDQUFTLEtBQVQsRUFBZ0IscUJBQWhCLEVBQXVDLElBQXZDO0FBQ0Esb0JBQUksWUFBSixHQUFtQix5QkFBbkI7QUFDQSx1QkFBUSxJQUFJLFlBQUosS0FBcUIseUJBQTdCO0FBQ0gsYUFORCxDQU1FLE9BQU8sQ0FBUCxFQUFVO0FBQ1IsaUNBQUksQ0FBSixDQUFNLGtCQUFOLEVBQTBCLEVBQUUsT0FBNUI7QUFDQSx1QkFBTyxLQUFQO0FBQ0g7QUFDSjs7O0FBRUQsOEJBQVksV0FBWixFQUF5QixNQUF6QixFQUFpQztBQUFBOztBQUFBLHdJQUN2Qix3QkFEdUI7O0FBRTdCLGNBQUssR0FBTCxHQUFXLGtCQUFYOztBQUVBLGNBQUssWUFBTCxHQUFvQixXQUFwQjtBQUNBLGNBQUssT0FBTCxHQUFlLE1BQWY7QUFDQSxjQUFLLFVBQUwsR0FBa0IsSUFBbEI7O0FBRUEsY0FBSyxJQUFMLEdBQVksSUFBWjtBQUNBLGNBQUssYUFBTCxHQUFxQixLQUFyQjtBQUNBLGNBQUssY0FBTCxHQUFzQixJQUF0QjtBQUNBLGNBQUssZUFBTCxHQUF1QixDQUF2QjtBQVg2QjtBQVloQzs7OztrQ0FFUztBQUNOLGdCQUFJLEtBQUssU0FBTCxFQUFKLEVBQXNCO0FBQ2xCLHFCQUFLLEtBQUw7QUFDSDtBQUNELGdCQUFJLEtBQUssSUFBVCxFQUFlO0FBQ1gscUJBQUssSUFBTCxDQUFVLGtCQUFWLEdBQStCLElBQS9CO0FBQ0EscUJBQUssSUFBTCxDQUFVLFVBQVYsR0FBdUIsSUFBdkI7QUFDQSxxQkFBSyxJQUFMLENBQVUsU0FBVixHQUFzQixJQUF0QjtBQUNBLHFCQUFLLElBQUwsQ0FBVSxPQUFWLEdBQW9CLElBQXBCO0FBQ0EscUJBQUssSUFBTCxHQUFZLElBQVo7QUFDSDtBQUNEO0FBQ0g7Ozs2QkFFSSxVLEVBQVksSyxFQUFPO0FBQ3BCLGlCQUFLLFdBQUwsR0FBbUIsVUFBbkI7QUFDQSxpQkFBSyxNQUFMLEdBQWMsS0FBZDs7QUFFQSxnQkFBSSxZQUFZLFdBQVcsR0FBM0I7QUFDQSxnQkFBSSxLQUFLLE9BQUwsQ0FBYSxrQkFBYixJQUFtQyxXQUFXLGFBQVgsSUFBNEIsU0FBbkUsRUFBOEU7QUFDMUUsNEJBQVksV0FBVyxhQUF2QjtBQUNIOztBQUVELGdCQUFJLGFBQWEsS0FBSyxZQUFMLENBQWtCLFNBQWxCLENBQTRCLFNBQTVCLEVBQXVDLEtBQXZDLENBQWpCO0FBQ0EsaUJBQUssV0FBTCxHQUFtQixXQUFXLEdBQTlCOztBQUVBLGdCQUFJLE1BQU0sS0FBSyxJQUFMLEdBQVksSUFBSSxjQUFKLEVBQXRCO0FBQ0EsZ0JBQUksSUFBSixDQUFTLEtBQVQsRUFBZ0IsV0FBVyxHQUEzQixFQUFnQyxJQUFoQztBQUNBLGdCQUFJLFlBQUosR0FBbUIseUJBQW5CO0FBQ0EsZ0JBQUksa0JBQUosR0FBeUIsS0FBSyxtQkFBTCxDQUF5QixJQUF6QixDQUE4QixJQUE5QixDQUF6QjtBQUNBLGdCQUFJLFVBQUosR0FBaUIsS0FBSyxXQUFMLENBQWlCLElBQWpCLENBQXNCLElBQXRCLENBQWpCO0FBQ0EsZ0JBQUksU0FBSixHQUFnQixLQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBcUIsSUFBckIsQ0FBaEI7QUFDQSxnQkFBSSxPQUFKLEdBQWMsS0FBSyxXQUFMLENBQWlCLElBQWpCLENBQXNCLElBQXRCLENBQWQ7O0FBRUE7O0FBRUE7QUFDQSxnQkFBSSxXQUFXLGVBQWYsRUFBZ0M7QUFDNUIsb0JBQUksZUFBSixHQUFzQixJQUF0QjtBQUNIOztBQUVELGdCQUFJLFFBQU8sV0FBVyxPQUFsQixNQUE4QixRQUFsQyxFQUE0QztBQUN4QyxvQkFBSSxVQUFVLFdBQVcsT0FBekI7O0FBRUEscUJBQUssSUFBSSxHQUFULElBQWdCLE9BQWhCLEVBQXlCO0FBQ3JCLHdCQUFJLFFBQVEsY0FBUixDQUF1QixHQUF2QixDQUFKLEVBQWlDO0FBQzdCLDRCQUFJLGdCQUFKLENBQXFCLEdBQXJCLEVBQTBCLFFBQVEsR0FBUixDQUExQjtBQUNIO0FBQ0o7QUFDSjs7QUFFRDtBQUNBLGdCQUFJLFFBQU8sS0FBSyxPQUFMLENBQWEsT0FBcEIsTUFBZ0MsUUFBcEMsRUFBOEM7QUFDMUMsb0JBQUksV0FBVSxLQUFLLE9BQUwsQ0FBYSxPQUEzQjs7QUFFQSxxQkFBSyxJQUFJLElBQVQsSUFBZ0IsUUFBaEIsRUFBeUI7QUFDckIsd0JBQUksU0FBUSxjQUFSLENBQXVCLElBQXZCLENBQUosRUFBaUM7QUFDN0IsNEJBQUksZ0JBQUosQ0FBcUIsSUFBckIsRUFBMEIsU0FBUSxJQUFSLENBQTFCO0FBQ0g7QUFDSjtBQUNKOztBQUVELGlCQUFLLE9BQUwsR0FBZSxxQkFBYSxXQUE1QjtBQUNBLGdCQUFJLElBQUo7QUFDSDs7O2dDQUVPO0FBQ0osaUJBQUssYUFBTCxHQUFxQixJQUFyQjtBQUNBLGdCQUFJLEtBQUssSUFBVCxFQUFlO0FBQ1gscUJBQUssSUFBTCxDQUFVLEtBQVY7QUFDSDtBQUNELGlCQUFLLE9BQUwsR0FBZSxxQkFBYSxTQUE1QjtBQUNIOzs7NENBRW1CLEMsRUFBRztBQUNuQixnQkFBSSxNQUFNLEVBQUUsTUFBWjs7QUFFQSxnQkFBSSxJQUFJLFVBQUosS0FBbUIsQ0FBdkIsRUFBMEI7QUFBRztBQUN6QixvQkFBSSxJQUFJLFdBQUosSUFBbUIsU0FBbkIsSUFBZ0MsSUFBSSxXQUFKLEtBQW9CLEtBQUssV0FBN0QsRUFBMEU7QUFDdEUsd0JBQUksS0FBSyxjQUFULEVBQXlCO0FBQ3JCLDRCQUFJLGdCQUFnQixLQUFLLFlBQUwsQ0FBa0IsbUJBQWxCLENBQXNDLElBQUksV0FBMUMsQ0FBcEI7QUFDQSw2QkFBSyxjQUFMLENBQW9CLGFBQXBCO0FBQ0g7QUFDSjs7QUFFRCxvQkFBSSxJQUFJLE1BQUosS0FBZSxDQUFmLEtBQXFCLElBQUksTUFBSixHQUFhLEdBQWIsSUFBb0IsSUFBSSxNQUFKLEdBQWEsR0FBdEQsQ0FBSixFQUFnRTtBQUM1RCx5QkFBSyxPQUFMLEdBQWUscUJBQWEsTUFBNUI7QUFDQSx3QkFBSSxLQUFLLFFBQVQsRUFBbUI7QUFDZiw2QkFBSyxRQUFMLENBQWMscUJBQWEsd0JBQTNCLEVBQXFELEVBQUMsTUFBTSxJQUFJLE1BQVgsRUFBbUIsS0FBSyxJQUFJLFVBQTVCLEVBQXJEO0FBQ0gscUJBRkQsTUFFTztBQUNILDhCQUFNLGdDQUFxQiwwQ0FBMEMsSUFBSSxNQUE5QyxHQUF1RCxHQUF2RCxHQUE2RCxJQUFJLFVBQXRGLENBQU47QUFDSDtBQUNKLGlCQVBELE1BT087QUFDSCx5QkFBSyxPQUFMLEdBQWUscUJBQWEsVUFBNUI7QUFDSDtBQUNKO0FBQ0o7OztvQ0FFVyxDLEVBQUc7QUFDWCxnQkFBSSxLQUFLLE9BQUwsS0FBaUIscUJBQWEsTUFBbEMsRUFBMEM7QUFDdEM7QUFDQTtBQUNIOztBQUVELGdCQUFJLEtBQUssY0FBTCxLQUF3QixJQUE1QixFQUFrQztBQUM5QixvQkFBSSxFQUFFLEtBQUYsS0FBWSxJQUFaLElBQW9CLEVBQUUsS0FBRixLQUFZLENBQXBDLEVBQXVDO0FBQ25DLHlCQUFLLGNBQUwsR0FBc0IsRUFBRSxLQUF4QjtBQUNBLHdCQUFJLEtBQUsscUJBQVQsRUFBZ0M7QUFDNUIsNkJBQUsscUJBQUwsQ0FBMkIsS0FBSyxjQUFoQztBQUNIO0FBQ0o7QUFDSjs7QUFFRCxnQkFBSSxRQUFRLEVBQUUsTUFBRixDQUFTLFFBQXJCO0FBQ0EsZ0JBQUksWUFBWSxLQUFLLE1BQUwsQ0FBWSxJQUFaLEdBQW1CLEtBQUssZUFBeEM7QUFDQSxpQkFBSyxlQUFMLElBQXdCLE1BQU0sVUFBOUI7O0FBRUEsZ0JBQUksS0FBSyxjQUFULEVBQXlCO0FBQ3JCLHFCQUFLLGNBQUwsQ0FBb0IsS0FBcEIsRUFBMkIsU0FBM0IsRUFBc0MsS0FBSyxlQUEzQztBQUNIO0FBQ0o7OzttQ0FFVSxDLEVBQUc7QUFDVixnQkFBSSxLQUFLLGFBQUwsS0FBdUIsSUFBM0IsRUFBaUM7QUFDN0IscUJBQUssYUFBTCxHQUFxQixLQUFyQjtBQUNBO0FBQ0gsYUFIRCxNQUdPLElBQUksS0FBSyxPQUFMLEtBQWlCLHFCQUFhLE1BQWxDLEVBQTBDO0FBQzdDO0FBQ0g7O0FBRUQsaUJBQUssT0FBTCxHQUFlLHFCQUFhLFNBQTVCO0FBQ0EsZ0JBQUksS0FBSyxXQUFULEVBQXNCO0FBQ2xCLHFCQUFLLFdBQUwsQ0FBaUIsS0FBSyxNQUFMLENBQVksSUFBN0IsRUFBbUMsS0FBSyxNQUFMLENBQVksSUFBWixHQUFtQixLQUFLLGVBQXhCLEdBQTBDLENBQTdFO0FBQ0g7QUFDSjs7O29DQUVXLEMsRUFBRztBQUNYLGlCQUFLLE9BQUwsR0FBZSxxQkFBYSxNQUE1QjtBQUNBLGdCQUFJLE9BQU8sQ0FBWDtBQUNBLGdCQUFJLE9BQU8sSUFBWDs7QUFFQSxnQkFBSSxLQUFLLGNBQUwsSUFBdUIsRUFBRSxNQUFGLEdBQVcsS0FBSyxjQUEzQyxFQUEyRDtBQUN2RCx1QkFBTyxxQkFBYSxTQUFwQjtBQUNBLHVCQUFPLEVBQUMsTUFBTSxDQUFDLENBQVIsRUFBVyxLQUFLLG1DQUFoQixFQUFQO0FBQ0gsYUFIRCxNQUdPO0FBQ0gsdUJBQU8scUJBQWEsU0FBcEI7QUFDQSx1QkFBTyxFQUFDLE1BQU0sQ0FBQyxDQUFSLEVBQVcsS0FBSyxFQUFFLFdBQUYsQ0FBYyxJQUFkLEdBQXFCLEdBQXJCLEdBQTJCLEVBQUUsSUFBN0MsRUFBUDtBQUNIOztBQUVELGdCQUFJLEtBQUssUUFBVCxFQUFtQjtBQUNmLHFCQUFLLFFBQUwsQ0FBYyxJQUFkLEVBQW9CLElBQXBCO0FBQ0gsYUFGRCxNQUVPO0FBQ0gsc0JBQU0sZ0NBQXFCLEtBQUssR0FBMUIsQ0FBTjtBQUNIO0FBQ0o7Ozs7OztrQkFJVSxnQjs7Ozs7Ozs7Ozs7Ozs7O0FDaE1mOzs7O0FBQ0E7O0FBQ0E7Ozs7Ozs7OytlQXBCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBOzs7Ozs7Ozs7OztJQVdNLGM7Ozs7O3NDQUVtQjtBQUNqQixnQkFBSTtBQUNBLG9CQUFJLE9BQU8sS0FBSyxRQUFaLEtBQXlCLFdBQXpCLElBQXdDLE9BQU8sS0FBSyxjQUFaLEtBQStCLFdBQTNFLEVBQXdGO0FBQ3BGLDJCQUFPLEtBQVA7QUFDSDs7QUFFRCxvQkFBSSxNQUFNLElBQUksY0FBSixFQUFWO0FBQ0Esb0JBQUksSUFBSixDQUFTLEtBQVQsRUFBZ0IscUJBQWhCLEVBQXVDLElBQXZDO0FBQ0Esb0JBQUksWUFBSixHQUFtQixXQUFuQjtBQUNBLHVCQUFRLElBQUksWUFBSixLQUFxQixXQUE3QjtBQUNILGFBVEQsQ0FTRSxPQUFPLENBQVAsRUFBVTtBQUNSLGlDQUFJLENBQUosQ0FBTSxnQkFBTixFQUF3QixFQUFFLE9BQTFCO0FBQ0EsdUJBQU8sS0FBUDtBQUNIO0FBQ0o7OztBQUVELDRCQUFZLFdBQVosRUFBeUIsTUFBekIsRUFBaUM7QUFBQTs7QUFBQSxvSUFDdkIscUJBRHVCOztBQUU3QixjQUFLLEdBQUwsR0FBVyxnQkFBWDs7QUFFQSxjQUFLLFlBQUwsR0FBb0IsV0FBcEI7QUFDQSxjQUFLLE9BQUwsR0FBZSxNQUFmO0FBQ0EsY0FBSyxVQUFMLEdBQWtCLElBQWxCOztBQUVBLGNBQUssSUFBTCxHQUFZLElBQVo7QUFDQSxjQUFLLE9BQUwsR0FBZSxJQUFmLENBVDZCLENBU1A7O0FBRXRCLGNBQUssV0FBTCxHQUFtQixJQUFuQjtBQUNBLGNBQUssYUFBTCxHQUFxQixJQUFyQjs7QUFFQSxjQUFLLGtCQUFMLEdBQTBCLElBQTFCO0FBQ0EsY0FBSyxxQkFBTCxHQUE2QixJQUE3Qjs7QUFFQSxjQUFLLGNBQUwsR0FBc0IsSUFBdEI7QUFDQSxjQUFLLGVBQUwsR0FBdUIsQ0FBdkI7O0FBRUEsY0FBSyxZQUFMLEdBQW9CLEtBQUssSUFBTCxHQUFZLElBQWhDLENBcEI2QixDQW9CVTtBQUN2QyxjQUFLLG1CQUFMLEdBQTJCLENBQTNCO0FBQ0EsY0FBSyxlQUFMLEdBQXVCLEtBQXZCO0FBdEI2QjtBQXVCaEM7Ozs7a0NBRVM7QUFDTixnQkFBSSxLQUFLLFNBQUwsRUFBSixFQUFzQjtBQUNsQixxQkFBSyxLQUFMO0FBQ0g7QUFDRCxnQkFBSSxLQUFLLE9BQVQsRUFBa0I7QUFDZCxxQkFBSyxPQUFMLENBQWEsVUFBYixHQUEwQixJQUExQjtBQUNBLHFCQUFLLE9BQUwsQ0FBYSxNQUFiLEdBQXNCLElBQXRCO0FBQ0EscUJBQUssT0FBTCxDQUFhLE9BQWIsR0FBdUIsSUFBdkI7QUFDQSxxQkFBSyxPQUFMLEdBQWUsSUFBZjtBQUNIO0FBQ0QsZ0JBQUksS0FBSyxJQUFULEVBQWU7QUFDWCxxQkFBSyxJQUFMLENBQVUsa0JBQVYsR0FBK0IsSUFBL0I7QUFDQSxxQkFBSyxJQUFMLEdBQVksSUFBWjtBQUNIO0FBQ0Q7QUFDSDs7OzZCQUVJLFUsRUFBWSxLLEVBQU87QUFDcEIsaUJBQUssYUFBTCxDQUFtQixVQUFuQixFQUErQixLQUEvQixFQUFzQyxLQUF0QztBQUNIOzs7c0NBRWEsVSxFQUFZLEssRUFBTyxVLEVBQVk7QUFDekMsaUJBQUssV0FBTCxHQUFtQixVQUFuQjs7QUFFQSxnQkFBSSxDQUFDLFVBQUwsRUFBaUI7QUFDYixxQkFBSyxXQUFMLEdBQW1CLEtBQW5CO0FBQ0gsYUFGRCxNQUVPO0FBQ0gscUJBQUssYUFBTCxHQUFxQixLQUFyQjtBQUNIOztBQUVELGdCQUFJLFlBQVksV0FBVyxHQUEzQjtBQUNBLGdCQUFJLEtBQUssT0FBTCxDQUFhLGtCQUFqQixFQUFxQztBQUNqQyxvQkFBSSxLQUFLLHFCQUFMLElBQThCLFNBQWxDLEVBQTZDO0FBQ3pDLGdDQUFZLEtBQUsscUJBQWpCO0FBQ0gsaUJBRkQsTUFFTyxJQUFJLFdBQVcsYUFBWCxJQUE0QixTQUFoQyxFQUEyQztBQUM5QyxnQ0FBWSxXQUFXLGFBQXZCO0FBQ0g7QUFDSjs7QUFFRCxnQkFBSSxhQUFhLEtBQUssWUFBTCxDQUFrQixTQUFsQixDQUE0QixTQUE1QixFQUF1QyxLQUF2QyxDQUFqQjtBQUNBLGlCQUFLLGtCQUFMLEdBQTBCLFdBQVcsR0FBckM7O0FBRUEsZ0JBQUksU0FBUyxLQUFLLE9BQUwsR0FBZSxJQUFJLEtBQUssY0FBVCxFQUE1QjtBQUNBLG1CQUFPLFVBQVAsR0FBb0IsS0FBSyxjQUFMLENBQW9CLElBQXBCLENBQXlCLElBQXpCLENBQXBCO0FBQ0EsbUJBQU8sTUFBUCxHQUFnQixLQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBcUIsSUFBckIsQ0FBaEI7QUFDQSxtQkFBTyxPQUFQLEdBQWlCLEtBQUssV0FBTCxDQUFpQixJQUFqQixDQUFzQixJQUF0QixDQUFqQjs7QUFFQSxnQkFBSSxNQUFNLEtBQUssSUFBTCxHQUFZLElBQUksY0FBSixFQUF0QjtBQUNBLGdCQUFJLElBQUosQ0FBUyxLQUFULEVBQWdCLFdBQVcsR0FBM0IsRUFBZ0MsSUFBaEM7QUFDQSxnQkFBSSxZQUFKLEdBQW1CLFdBQW5CO0FBQ0EsZ0JBQUksa0JBQUosR0FBeUIsS0FBSyxzQkFBTCxDQUE0QixJQUE1QixDQUFpQyxJQUFqQyxDQUF6QjtBQUNBLGdCQUFJLE9BQUosR0FBYyxLQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBc0IsSUFBdEIsQ0FBZDs7QUFFQSxnQkFBSSxXQUFXLGVBQWYsRUFBZ0M7QUFDNUIsb0JBQUksZUFBSixHQUFzQixJQUF0QjtBQUNIOztBQUVELGdCQUFJLFFBQU8sV0FBVyxPQUFsQixNQUE4QixRQUFsQyxFQUE0QztBQUN4QyxvQkFBSSxVQUFVLFdBQVcsT0FBekI7O0FBRUEscUJBQUssSUFBSSxHQUFULElBQWdCLE9BQWhCLEVBQXlCO0FBQ3JCLHdCQUFJLFFBQVEsY0FBUixDQUF1QixHQUF2QixDQUFKLEVBQWlDO0FBQzdCLDRCQUFJLGdCQUFKLENBQXFCLEdBQXJCLEVBQTBCLFFBQVEsR0FBUixDQUExQjtBQUNIO0FBQ0o7QUFDSjs7QUFFRDtBQUNBLGdCQUFJLFFBQU8sS0FBSyxPQUFMLENBQWEsT0FBcEIsTUFBZ0MsUUFBcEMsRUFBOEM7QUFDMUMsb0JBQUksV0FBVSxLQUFLLE9BQUwsQ0FBYSxPQUEzQjs7QUFFQSxxQkFBSyxJQUFJLElBQVQsSUFBZ0IsUUFBaEIsRUFBeUI7QUFDckIsd0JBQUksU0FBUSxjQUFSLENBQXVCLElBQXZCLENBQUosRUFBaUM7QUFDN0IsNEJBQUksZ0JBQUosQ0FBcUIsSUFBckIsRUFBMEIsU0FBUSxJQUFSLENBQTFCO0FBQ0g7QUFDSjtBQUNKOztBQUVELGdCQUFJLEtBQUssZUFBVCxFQUEwQjtBQUN0QixxQkFBSyxlQUFMLEdBQXVCLEtBQXZCO0FBQ0gsYUFGRCxNQUVPO0FBQ0gscUJBQUssT0FBTCxHQUFlLHFCQUFhLFdBQTVCO0FBQ0g7QUFDRCxnQkFBSSxJQUFKO0FBQ0g7OztnQ0FFTztBQUNKLGlCQUFLLGNBQUw7QUFDQSxpQkFBSyxPQUFMLEdBQWUscUJBQWEsU0FBNUI7QUFDSDs7O3lDQUVnQjtBQUNiLGdCQUFJLEtBQUssT0FBVCxFQUFrQjtBQUNkLG9CQUFJLEtBQUssT0FBTCxDQUFhLFVBQWIsS0FBNEIsQ0FBaEMsRUFBbUM7QUFBRztBQUNsQyx5QkFBSyxPQUFMLENBQWEsS0FBYjtBQUNIO0FBQ0QscUJBQUssT0FBTCxDQUFhLFVBQWIsR0FBMEIsSUFBMUI7QUFDQSxxQkFBSyxPQUFMLENBQWEsTUFBYixHQUFzQixJQUF0QjtBQUNBLHFCQUFLLE9BQUwsQ0FBYSxPQUFiLEdBQXVCLElBQXZCO0FBQ0EscUJBQUssT0FBTCxHQUFlLElBQWY7QUFDSDtBQUNELGdCQUFJLEtBQUssSUFBVCxFQUFlO0FBQ1gscUJBQUssSUFBTCxDQUFVLEtBQVY7QUFDQSxxQkFBSyxJQUFMLENBQVUsa0JBQVYsR0FBK0IsSUFBL0I7QUFDQSxxQkFBSyxJQUFMLEdBQVksSUFBWjtBQUNIO0FBQ0o7OzsrQ0FFc0IsQyxFQUFHO0FBQ3RCLGdCQUFJLE1BQU0sRUFBRSxNQUFaOztBQUVBLGdCQUFJLElBQUksVUFBSixLQUFtQixDQUF2QixFQUEwQjtBQUFHO0FBQ3pCLG9CQUFJLElBQUksTUFBSixJQUFjLEdBQWQsSUFBcUIsSUFBSSxNQUFKLElBQWMsR0FBdkMsRUFBNEM7QUFDeEMseUJBQUssT0FBTCxHQUFlLHFCQUFhLFVBQTVCOztBQUVBLHdCQUFJLElBQUksV0FBSixJQUFtQixTQUF2QixFQUFrQztBQUM5Qiw0QkFBSSxnQkFBZ0IsS0FBSyxZQUFMLENBQWtCLG1CQUFsQixDQUFzQyxJQUFJLFdBQTFDLENBQXBCO0FBQ0EsNEJBQUksSUFBSSxXQUFKLEtBQW9CLEtBQUssa0JBQXpCLElBQStDLGtCQUFrQixLQUFLLHFCQUExRSxFQUFpRztBQUM3RixpQ0FBSyxxQkFBTCxHQUE2QixhQUE3QjtBQUNBLGdDQUFJLEtBQUssY0FBVCxFQUF5QjtBQUNyQixxQ0FBSyxjQUFMLENBQW9CLGFBQXBCO0FBQ0g7QUFDSjtBQUNKOztBQUVELHdCQUFJLGVBQWUsSUFBSSxpQkFBSixDQUFzQixnQkFBdEIsQ0FBbkI7QUFDQSx3QkFBSSxnQkFBZ0IsSUFBaEIsSUFBd0IsS0FBSyxjQUFMLElBQXVCLElBQW5ELEVBQXlEO0FBQ3JELDRCQUFJLFNBQVMsU0FBUyxZQUFULENBQWI7QUFDQSw0QkFBSSxTQUFTLENBQWIsRUFBZ0I7QUFDWixpQ0FBSyxjQUFMLEdBQXNCLE1BQXRCO0FBQ0EsZ0NBQUksS0FBSyxxQkFBVCxFQUFnQztBQUM1QixxQ0FBSyxxQkFBTCxDQUEyQixLQUFLLGNBQWhDO0FBQ0g7QUFDSjtBQUNKO0FBQ0osaUJBdkJELE1BdUJPO0FBQ0gseUJBQUssT0FBTCxHQUFlLHFCQUFhLE1BQTVCO0FBQ0Esd0JBQUksS0FBSyxRQUFULEVBQW1CO0FBQ2YsNkJBQUssUUFBTCxDQUFjLHFCQUFhLHdCQUEzQixFQUFxRCxFQUFDLE1BQU0sSUFBSSxNQUFYLEVBQW1CLEtBQUssSUFBSSxVQUE1QixFQUFyRDtBQUNILHFCQUZELE1BRU87QUFDSCw4QkFBTSxnQ0FBcUIsd0NBQXdDLElBQUksTUFBNUMsR0FBcUQsR0FBckQsR0FBMkQsSUFBSSxVQUFwRixDQUFOO0FBQ0g7QUFDSjtBQUNKLGFBaENELE1BZ0NPLElBQUksSUFBSSxVQUFKLEtBQW1CLENBQXZCLEVBQTBCO0FBQUc7QUFDaEMsb0JBQUksSUFBSSxNQUFKLElBQWMsR0FBZCxJQUFxQixJQUFJLE1BQUosSUFBYyxHQUF2QyxFQUE0QztBQUN4Qyx5QkFBSyxPQUFMLEdBQWUscUJBQWEsVUFBNUI7O0FBRUEsd0JBQUksV0FBVyxJQUFJLFFBQW5CO0FBQ0EseUJBQUssT0FBTCxDQUFhLGlCQUFiLENBQStCLFFBQS9CO0FBQ0g7QUFDSjtBQUNKOzs7b0NBRVcsQyxFQUFHO0FBQ1gsaUJBQUssT0FBTCxHQUFlLHFCQUFhLE1BQTVCO0FBQ0EsZ0JBQUksT0FBTyxxQkFBYSxTQUF4QjtBQUNBLGdCQUFJLE9BQU8sRUFBQyxNQUFNLENBQUMsQ0FBUixFQUFXLEtBQUssRUFBRSxXQUFGLENBQWMsSUFBZCxHQUFxQixHQUFyQixHQUEyQixFQUFFLElBQTdDLEVBQVg7O0FBRUEsZ0JBQUksS0FBSyxRQUFULEVBQW1CO0FBQ2YscUJBQUssUUFBTCxDQUFjLElBQWQsRUFBb0IsSUFBcEI7QUFDSCxhQUZELE1BRU87QUFDSCxzQkFBTSxnQ0FBcUIsS0FBSyxHQUExQixDQUFOO0FBQ0g7QUFDSjs7O3VDQUVjLEMsRUFBRztBQUNkLGdCQUFJLFNBQVMsRUFBRSxNQUFmO0FBQ0EsZ0JBQUksWUFBWSxPQUFPLE1BQXZCO0FBQ0EsZ0JBQUksYUFBYSxJQUFqQixFQUF1QjtBQUFHO0FBQ3RCLHFCQUFLLG9CQUFMO0FBQ0E7QUFDSDs7QUFFRCxnQkFBSSxRQUFRLFVBQVUsS0FBVixDQUFnQixLQUFLLG1CQUFyQixDQUFaO0FBQ0EsaUJBQUssbUJBQUwsR0FBMkIsVUFBVSxVQUFyQztBQUNBLGdCQUFJLFlBQVksS0FBSyxXQUFMLENBQWlCLElBQWpCLEdBQXdCLEtBQUssZUFBN0M7QUFDQSxpQkFBSyxlQUFMLElBQXdCLE1BQU0sVUFBOUI7O0FBRUEsZ0JBQUksS0FBSyxjQUFULEVBQXlCO0FBQ3JCLHFCQUFLLGNBQUwsQ0FBb0IsS0FBcEIsRUFBMkIsU0FBM0IsRUFBc0MsS0FBSyxlQUEzQztBQUNIOztBQUVELGdCQUFJLFVBQVUsVUFBVixJQUF3QixLQUFLLFlBQWpDLEVBQStDO0FBQzNDLGlDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsK0NBQTBELFlBQVksTUFBTSxVQUE1RTtBQUNBLHFCQUFLLG9CQUFMO0FBQ0g7QUFDSjs7OytDQUVzQjtBQUNuQixnQkFBSSxLQUFLLGNBQUwsSUFBdUIsSUFBdkIsSUFBK0IsS0FBSyxlQUFMLEdBQXVCLEtBQUssY0FBL0QsRUFBK0U7QUFDM0UscUJBQUssZUFBTCxHQUF1QixJQUF2QjtBQUNBLHFCQUFLLG1CQUFMLEdBQTJCLENBQTNCO0FBQ0EscUJBQUssY0FBTDs7QUFFQSxvQkFBSSxRQUFRO0FBQ1IsMEJBQU0sS0FBSyxXQUFMLENBQWlCLElBQWpCLEdBQXdCLEtBQUssZUFEM0I7QUFFUix3QkFBSSxDQUFDO0FBRkcsaUJBQVo7QUFJQSxxQkFBSyxhQUFMLENBQW1CLEtBQUssV0FBeEIsRUFBcUMsS0FBckMsRUFBNEMsSUFBNUM7QUFDSDtBQUNKOzs7bUNBRVUsQyxFQUFHO0FBQUc7QUFDYixpQkFBSyxPQUFMLEdBQWUscUJBQWEsU0FBNUI7QUFDQSxnQkFBSSxLQUFLLFdBQVQsRUFBc0I7QUFDbEIscUJBQUssV0FBTCxDQUFpQixLQUFLLFdBQUwsQ0FBaUIsSUFBbEMsRUFBd0MsS0FBSyxXQUFMLENBQWlCLElBQWpCLEdBQXdCLEtBQUssZUFBN0IsR0FBK0MsQ0FBdkY7QUFDSDtBQUNKOzs7b0NBRVcsQyxFQUFHO0FBQ1gsaUJBQUssT0FBTCxHQUFlLHFCQUFhLE1BQTVCO0FBQ0EsZ0JBQUksT0FBTyxDQUFYO0FBQ0EsZ0JBQUksT0FBTyxJQUFYOztBQUVBLGdCQUFJLEtBQUssY0FBTCxJQUF1QixLQUFLLGVBQUwsR0FBdUIsS0FBSyxjQUF2RCxFQUF1RTtBQUNuRSx1QkFBTyxxQkFBYSxTQUFwQjtBQUNBLHVCQUFPLEVBQUMsTUFBTSxDQUFDLENBQVIsRUFBVyxLQUFLLHlCQUFoQixFQUFQO0FBQ0gsYUFIRCxNQUdPO0FBQ0gsdUJBQU8scUJBQWEsU0FBcEI7QUFDQSx1QkFBTyxFQUFDLE1BQU0sQ0FBQyxDQUFSLEVBQVcsS0FBSyxFQUFFLFdBQUYsQ0FBYyxJQUFkLEdBQXFCLEdBQXJCLEdBQTJCLEVBQUUsSUFBN0MsRUFBUDtBQUNIOztBQUVELGdCQUFJLEtBQUssUUFBVCxFQUFtQjtBQUNmLHFCQUFLLFFBQUwsQ0FBYyxJQUFkLEVBQW9CLElBQXBCO0FBQ0gsYUFGRCxNQUVPO0FBQ0gsc0JBQU0sZ0NBQXFCLEtBQUssR0FBMUIsQ0FBTjtBQUNIO0FBQ0o7Ozs7OztrQkFHVSxjOzs7Ozs7Ozs7Ozs7Ozs7QUNoU2Y7Ozs7QUFDQTs7OztBQUNBOztBQUNBOzs7Ozs7OzsrZUFyQkE7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtJQUNNLFc7Ozs7O3NDQUVtQjtBQUNqQixnQkFBSTtBQUNBLG9CQUFJLE1BQU0sSUFBSSxjQUFKLEVBQVY7QUFDQSxvQkFBSSxJQUFKLENBQVMsS0FBVCxFQUFnQixxQkFBaEIsRUFBdUMsSUFBdkM7QUFDQSxvQkFBSSxZQUFKLEdBQW1CLGFBQW5CO0FBQ0EsdUJBQVEsSUFBSSxZQUFKLEtBQXFCLGFBQTdCO0FBQ0gsYUFMRCxDQUtFLE9BQU8sQ0FBUCxFQUFVO0FBQ1IsaUNBQUksQ0FBSixDQUFNLGFBQU4sRUFBcUIsRUFBRSxPQUF2QjtBQUNBLHVCQUFPLEtBQVA7QUFDSDtBQUNKOzs7QUFFRCx5QkFBWSxXQUFaLEVBQXlCLE1BQXpCLEVBQWlDO0FBQUE7O0FBQUEsOEhBQ3ZCLGtCQUR1Qjs7QUFFN0IsY0FBSyxHQUFMLEdBQVcsYUFBWDs7QUFFQSxjQUFLLFlBQUwsR0FBb0IsV0FBcEI7QUFDQSxjQUFLLE9BQUwsR0FBZSxNQUFmO0FBQ0EsY0FBSyxVQUFMLEdBQWtCLEtBQWxCOztBQUVBLGNBQUssZ0JBQUwsR0FBd0IsQ0FDcEIsR0FEb0IsRUFDZixHQURlLEVBQ1YsR0FEVSxFQUNMLEdBREssRUFDQSxHQURBLEVBQ0ssSUFETCxFQUNXLElBRFgsRUFDaUIsSUFEakIsRUFDdUIsSUFEdkIsRUFDNkIsSUFEN0IsRUFDbUMsSUFEbkMsRUFDeUMsSUFEekMsRUFDK0MsSUFEL0MsRUFDcUQsSUFEckQsQ0FBeEI7QUFHQSxjQUFLLG1CQUFMLEdBQTJCLEdBQTNCO0FBQ0EsY0FBSyx1QkFBTCxHQUErQixDQUEvQjtBQUNBLGNBQUssb0JBQUwsR0FBNEIsQ0FBNUI7O0FBRUEsY0FBSyxJQUFMLEdBQVksSUFBWjtBQUNBLGNBQUssYUFBTCxHQUFxQiw0QkFBckI7O0FBRUEsY0FBSyxhQUFMLEdBQXFCLEtBQXJCO0FBQ0EsY0FBSyxtQkFBTCxHQUEyQixLQUEzQjtBQUNBLGNBQUssb0JBQUwsR0FBNEIsS0FBNUI7O0FBRUEsY0FBSyxrQkFBTCxHQUEwQixJQUExQjtBQUNBLGNBQUsscUJBQUwsR0FBNkIsSUFBN0I7QUFDQSxjQUFLLG9CQUFMLEdBQTRCLElBQTVCO0FBQ0EsY0FBSyxZQUFMLEdBQW9CLElBQXBCLENBekI2QixDQXlCRjtBQUMzQixjQUFLLGNBQUwsR0FBc0IsSUFBdEIsQ0ExQjZCLENBMEJBO0FBQzdCLGNBQUssZUFBTCxHQUF1QixDQUF2QixDQTNCNkIsQ0EyQkY7QUFDM0IsY0FBSyxlQUFMLEdBQXVCLENBQXZCLENBNUI2QixDQTRCRjtBQTVCRTtBQTZCaEM7Ozs7a0NBRVM7QUFDTixnQkFBSSxLQUFLLFNBQUwsRUFBSixFQUFzQjtBQUNsQixxQkFBSyxLQUFMO0FBQ0g7QUFDRCxnQkFBSSxLQUFLLElBQVQsRUFBZTtBQUNYLHFCQUFLLElBQUwsQ0FBVSxrQkFBVixHQUErQixJQUEvQjtBQUNBLHFCQUFLLElBQUwsQ0FBVSxVQUFWLEdBQXVCLElBQXZCO0FBQ0EscUJBQUssSUFBTCxDQUFVLE1BQVYsR0FBbUIsSUFBbkI7QUFDQSxxQkFBSyxJQUFMLENBQVUsT0FBVixHQUFvQixJQUFwQjtBQUNBLHFCQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0g7QUFDRDtBQUNIOzs7NkJBTUksVSxFQUFZLEssRUFBTztBQUNwQixpQkFBSyxXQUFMLEdBQW1CLFVBQW5CO0FBQ0EsaUJBQUssTUFBTCxHQUFjLEtBQWQ7QUFDQSxpQkFBSyxPQUFMLEdBQWUscUJBQWEsV0FBNUI7O0FBRUEsZ0JBQUksb0JBQW9CLEtBQXhCO0FBQ0EsZ0JBQUksS0FBSyxXQUFMLENBQWlCLFFBQWpCLElBQTZCLFNBQTdCLElBQTBDLEtBQUssV0FBTCxDQUFpQixRQUFqQixLQUE4QixDQUE1RSxFQUErRTtBQUMzRSxvQ0FBb0IsSUFBcEI7QUFDQSxxQkFBSyxZQUFMLEdBQW9CLEtBQUssV0FBTCxDQUFpQixRQUFyQztBQUNIOztBQUVELGdCQUFJLENBQUMsS0FBSyxvQkFBTixJQUE4QixDQUFDLGlCQUFuQyxFQUFzRDtBQUNsRDtBQUNBLHFCQUFLLG1CQUFMLEdBQTJCLElBQTNCO0FBQ0EscUJBQUssYUFBTCxDQUFtQixLQUFLLFdBQXhCLEVBQXFDLEVBQUMsTUFBTSxDQUFQLEVBQVUsSUFBSSxDQUFDLENBQWYsRUFBckM7QUFDSCxhQUpELE1BSU87QUFDSDtBQUNBLHFCQUFLLGFBQUw7QUFDSDtBQUNKOzs7d0NBRWU7QUFDWixnQkFBSSxZQUFZLEtBQUssbUJBQUwsR0FBMkIsSUFBM0M7O0FBRUEsZ0JBQUksT0FBTyxLQUFLLE1BQUwsQ0FBWSxJQUFaLEdBQW1CLEtBQUssZUFBbkM7QUFDQSxnQkFBSSxLQUFLLE9BQU8sU0FBaEI7O0FBRUEsZ0JBQUksS0FBSyxjQUFMLElBQXVCLElBQTNCLEVBQWlDO0FBQzdCLG9CQUFJLEtBQUssS0FBSyxNQUFMLENBQVksSUFBakIsSUFBeUIsS0FBSyxjQUFsQyxFQUFrRDtBQUM5Qyx5QkFBSyxLQUFLLE1BQUwsQ0FBWSxJQUFaLEdBQW1CLEtBQUssY0FBeEIsR0FBeUMsQ0FBOUM7QUFDSDtBQUNKOztBQUVELGlCQUFLLG9CQUFMLEdBQTRCLEVBQUMsVUFBRCxFQUFPLE1BQVAsRUFBNUI7QUFDQSxpQkFBSyxhQUFMLENBQW1CLEtBQUssV0FBeEIsRUFBcUMsS0FBSyxvQkFBMUM7QUFDSDs7O3NDQUVhLFUsRUFBWSxLLEVBQU87QUFDN0IsaUJBQUssZUFBTCxHQUF1QixDQUF2Qjs7QUFFQSxnQkFBSSxZQUFZLFdBQVcsR0FBM0I7QUFDQSxnQkFBSSxLQUFLLE9BQUwsQ0FBYSxrQkFBakIsRUFBcUM7QUFDakMsb0JBQUksS0FBSyxxQkFBTCxJQUE4QixTQUFsQyxFQUE2QztBQUN6QyxnQ0FBWSxLQUFLLHFCQUFqQjtBQUNILGlCQUZELE1BRU8sSUFBSSxXQUFXLGFBQVgsSUFBNEIsU0FBaEMsRUFBMkM7QUFDOUMsZ0NBQVksV0FBVyxhQUF2QjtBQUNIO0FBQ0o7O0FBRUQsZ0JBQUksYUFBYSxLQUFLLFlBQUwsQ0FBa0IsU0FBbEIsQ0FBNEIsU0FBNUIsRUFBdUMsS0FBdkMsQ0FBakI7QUFDQSxpQkFBSyxrQkFBTCxHQUEwQixXQUFXLEdBQXJDOztBQUVBLGdCQUFJLE1BQU0sS0FBSyxJQUFMLEdBQVksSUFBSSxjQUFKLEVBQXRCO0FBQ0EsZ0JBQUksSUFBSixDQUFTLEtBQVQsRUFBZ0IsV0FBVyxHQUEzQixFQUFnQyxJQUFoQztBQUNBLGdCQUFJLFlBQUosR0FBbUIsYUFBbkI7QUFDQSxnQkFBSSxrQkFBSixHQUF5QixLQUFLLG1CQUFMLENBQXlCLElBQXpCLENBQThCLElBQTlCLENBQXpCO0FBQ0EsZ0JBQUksVUFBSixHQUFpQixLQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBc0IsSUFBdEIsQ0FBakI7QUFDQSxnQkFBSSxNQUFKLEdBQWEsS0FBSyxPQUFMLENBQWEsSUFBYixDQUFrQixJQUFsQixDQUFiO0FBQ0EsZ0JBQUksT0FBSixHQUFjLEtBQUssV0FBTCxDQUFpQixJQUFqQixDQUFzQixJQUF0QixDQUFkOztBQUVBLGdCQUFJLFdBQVcsZUFBZixFQUFnQztBQUM1QixvQkFBSSxlQUFKLEdBQXNCLElBQXRCO0FBQ0g7O0FBRUQsZ0JBQUksUUFBTyxXQUFXLE9BQWxCLE1BQThCLFFBQWxDLEVBQTRDO0FBQ3hDLG9CQUFJLFVBQVUsV0FBVyxPQUF6Qjs7QUFFQSxxQkFBSyxJQUFJLEdBQVQsSUFBZ0IsT0FBaEIsRUFBeUI7QUFDckIsd0JBQUksUUFBUSxjQUFSLENBQXVCLEdBQXZCLENBQUosRUFBaUM7QUFDN0IsNEJBQUksZ0JBQUosQ0FBcUIsR0FBckIsRUFBMEIsUUFBUSxHQUFSLENBQTFCO0FBQ0g7QUFDSjtBQUNKOztBQUVEO0FBQ0EsZ0JBQUksUUFBTyxLQUFLLE9BQUwsQ0FBYSxPQUFwQixNQUFnQyxRQUFwQyxFQUE4QztBQUMxQyxvQkFBSSxXQUFVLEtBQUssT0FBTCxDQUFhLE9BQTNCOztBQUVBLHFCQUFLLElBQUksSUFBVCxJQUFnQixRQUFoQixFQUF5QjtBQUNyQix3QkFBSSxTQUFRLGNBQVIsQ0FBdUIsSUFBdkIsQ0FBSixFQUFpQztBQUM3Qiw0QkFBSSxnQkFBSixDQUFxQixJQUFyQixFQUEwQixTQUFRLElBQVIsQ0FBMUI7QUFDSDtBQUNKO0FBQ0o7O0FBRUQsZ0JBQUksSUFBSjtBQUNIOzs7Z0NBRU87QUFDSixpQkFBSyxhQUFMLEdBQXFCLElBQXJCO0FBQ0EsaUJBQUssY0FBTDtBQUNBLGlCQUFLLE9BQUwsR0FBZSxxQkFBYSxTQUE1QjtBQUNIOzs7eUNBRWdCO0FBQ2IsZ0JBQUksS0FBSyxJQUFULEVBQWU7QUFDWCxxQkFBSyxJQUFMLENBQVUsa0JBQVYsR0FBK0IsSUFBL0I7QUFDQSxxQkFBSyxJQUFMLENBQVUsVUFBVixHQUF1QixJQUF2QjtBQUNBLHFCQUFLLElBQUwsQ0FBVSxNQUFWLEdBQW1CLElBQW5CO0FBQ0EscUJBQUssSUFBTCxDQUFVLE9BQVYsR0FBb0IsSUFBcEI7QUFDQSxxQkFBSyxJQUFMLENBQVUsS0FBVjtBQUNBLHFCQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0g7QUFDSjs7OzRDQUVtQixDLEVBQUc7QUFDbkIsZ0JBQUksTUFBTSxFQUFFLE1BQVo7O0FBRUEsZ0JBQUksSUFBSSxVQUFKLEtBQW1CLENBQXZCLEVBQTBCO0FBQUc7QUFDekIsb0JBQUksSUFBSSxXQUFKLElBQW1CLFNBQXZCLEVBQWtDO0FBQUc7QUFDakMsd0JBQUksZ0JBQWdCLEtBQUssWUFBTCxDQUFrQixtQkFBbEIsQ0FBc0MsSUFBSSxXQUExQyxDQUFwQjtBQUNBLHdCQUFJLElBQUksV0FBSixLQUFvQixLQUFLLGtCQUF6QixJQUErQyxrQkFBa0IsS0FBSyxxQkFBMUUsRUFBaUc7QUFDN0YsNkJBQUsscUJBQUwsR0FBNkIsYUFBN0I7QUFDQSw0QkFBSSxLQUFLLGNBQVQsRUFBeUI7QUFDckIsaUNBQUssY0FBTCxDQUFvQixhQUFwQjtBQUNIO0FBQ0o7QUFDSjs7QUFFRCxvQkFBSyxJQUFJLE1BQUosSUFBYyxHQUFkLElBQXFCLElBQUksTUFBSixJQUFjLEdBQXhDLEVBQThDO0FBQzFDLHdCQUFJLEtBQUssbUJBQVQsRUFBOEI7QUFDMUI7QUFDSDtBQUNELHlCQUFLLE9BQUwsR0FBZSxxQkFBYSxVQUE1QjtBQUNILGlCQUxELE1BS087QUFDSCx5QkFBSyxPQUFMLEdBQWUscUJBQWEsTUFBNUI7QUFDQSx3QkFBSSxLQUFLLFFBQVQsRUFBbUI7QUFDZiw2QkFBSyxRQUFMLENBQWMscUJBQWEsd0JBQTNCLEVBQXFELEVBQUMsTUFBTSxJQUFJLE1BQVgsRUFBbUIsS0FBSyxJQUFJLFVBQTVCLEVBQXJEO0FBQ0gscUJBRkQsTUFFTztBQUNILDhCQUFNLGdDQUFxQixxQ0FBcUMsSUFBSSxNQUF6QyxHQUFrRCxHQUFsRCxHQUF3RCxJQUFJLFVBQWpGLENBQU47QUFDSDtBQUNKO0FBQ0o7QUFDSjs7O29DQUVXLEMsRUFBRztBQUNYLGdCQUFJLEtBQUssT0FBTCxLQUFpQixxQkFBYSxNQUFsQyxFQUEwQztBQUN0QztBQUNBO0FBQ0g7O0FBRUQsZ0JBQUksS0FBSyxjQUFMLEtBQXdCLElBQTVCLEVBQWtDO0FBQzlCLG9CQUFJLGdCQUFnQixLQUFwQjs7QUFFQSxvQkFBSSxLQUFLLG1CQUFULEVBQThCO0FBQzFCLHlCQUFLLG1CQUFMLEdBQTJCLEtBQTNCO0FBQ0EseUJBQUssb0JBQUwsR0FBNEIsSUFBNUI7QUFDQSxvQ0FBZ0IsSUFBaEI7O0FBRUEsd0JBQUksUUFBUSxFQUFFLEtBQWQ7QUFDQSx5QkFBSyxjQUFMO0FBQ0Esd0JBQUksU0FBUyxJQUFULEdBQWdCLFVBQVUsQ0FBOUIsRUFBaUM7QUFDN0IsNkJBQUssWUFBTCxHQUFvQixLQUFwQjtBQUNIO0FBQ0o7O0FBRUQ7QUFDQSxvQkFBSSxLQUFLLE1BQUwsQ0FBWSxFQUFaLEtBQW1CLENBQUMsQ0FBeEIsRUFBMkI7QUFDdkIseUJBQUssY0FBTCxHQUFzQixLQUFLLFlBQUwsR0FBb0IsS0FBSyxNQUFMLENBQVksSUFBdEQ7QUFDSCxpQkFGRCxNQUVPO0FBQUc7QUFDTix5QkFBSyxjQUFMLEdBQXNCLEtBQUssTUFBTCxDQUFZLEVBQVosR0FBaUIsS0FBSyxNQUFMLENBQVksSUFBN0IsR0FBb0MsQ0FBMUQ7QUFDSDs7QUFFRCxvQkFBSSxhQUFKLEVBQW1CO0FBQ2YseUJBQUssYUFBTDtBQUNBO0FBQ0g7QUFDRCxvQkFBSSxLQUFLLHFCQUFULEVBQWdDO0FBQzVCLHlCQUFLLHFCQUFMLENBQTJCLEtBQUssY0FBaEM7QUFDSDtBQUNKOztBQUVELGdCQUFJLFFBQVEsRUFBRSxNQUFGLEdBQVcsS0FBSyxlQUE1QjtBQUNBLGlCQUFLLGVBQUwsR0FBdUIsRUFBRSxNQUF6QjtBQUNBLGlCQUFLLGFBQUwsQ0FBbUIsUUFBbkIsQ0FBNEIsS0FBNUI7QUFDSDs7O3dDQUVlLEssRUFBTztBQUNuQixnQkFBSSxPQUFPLEtBQUssZ0JBQWhCO0FBQ0EsZ0JBQUksT0FBTyxLQUFLLE1BQUwsR0FBYyxDQUF6QjtBQUNBLGdCQUFJLE1BQU0sQ0FBVjtBQUNBLGdCQUFJLFNBQVMsQ0FBYjtBQUNBLGdCQUFJLFNBQVMsSUFBYjs7QUFFQSxnQkFBSSxRQUFRLEtBQUssQ0FBTCxDQUFaLEVBQXFCO0FBQ2pCLHVCQUFPLEtBQUssQ0FBTCxDQUFQO0FBQ0g7O0FBRUQsbUJBQU8sVUFBVSxNQUFqQixFQUF5QjtBQUNyQixzQkFBTSxTQUFTLEtBQUssS0FBTCxDQUFXLENBQUMsU0FBUyxNQUFWLElBQW9CLENBQS9CLENBQWY7QUFDQSxvQkFBSSxRQUFRLElBQVIsSUFBaUIsU0FBUyxLQUFLLEdBQUwsQ0FBVCxJQUFzQixRQUFRLEtBQUssTUFBTSxDQUFYLENBQW5ELEVBQW1FO0FBQy9ELDJCQUFPLEtBQUssR0FBTCxDQUFQO0FBQ0gsaUJBRkQsTUFFTyxJQUFJLEtBQUssR0FBTCxJQUFZLEtBQWhCLEVBQXVCO0FBQzFCLDZCQUFTLE1BQU0sQ0FBZjtBQUNILGlCQUZNLE1BRUE7QUFDSCw2QkFBUyxNQUFNLENBQWY7QUFDSDtBQUNKO0FBQ0o7OztnQ0FFTyxDLEVBQUc7QUFDUCxnQkFBSSxLQUFLLE9BQUwsS0FBaUIscUJBQWEsTUFBbEMsRUFBMEM7QUFDdEM7QUFDQTtBQUNIOztBQUVELGdCQUFJLEtBQUssbUJBQVQsRUFBOEI7QUFDMUIscUJBQUssbUJBQUwsR0FBMkIsS0FBM0I7QUFDQTtBQUNIOztBQUVELGlCQUFLLGVBQUwsR0FBdUIsQ0FBdkI7QUFDQSxnQkFBSSxPQUFPLEtBQUssYUFBTCxDQUFtQixjQUE5QjtBQUNBLGdCQUFJLFNBQVMsQ0FBYixFQUFnQjtBQUNaLHFCQUFLLG9CQUFMO0FBQ0Esb0JBQUksS0FBSyxvQkFBTCxJQUE2QixDQUFqQyxFQUFvQztBQUNoQztBQUNBLDJCQUFPLEtBQUssYUFBTCxDQUFtQixXQUExQjtBQUNIO0FBQ0o7O0FBRUQsZ0JBQUksU0FBUyxDQUFiLEVBQWdCO0FBQ1osb0JBQUksYUFBYSxLQUFLLGVBQUwsQ0FBcUIsSUFBckIsQ0FBakI7QUFDQSxvQkFBSSxLQUFLLHVCQUFMLEtBQWlDLFVBQXJDLEVBQWlEO0FBQzdDLHlCQUFLLHVCQUFMLEdBQStCLFVBQS9CO0FBQ0EseUJBQUssbUJBQUwsR0FBMkIsVUFBM0I7QUFDSDtBQUNKOztBQUVELGdCQUFJLFFBQVEsRUFBRSxNQUFGLENBQVMsUUFBckI7QUFDQSxnQkFBSSxZQUFZLEtBQUssTUFBTCxDQUFZLElBQVosR0FBbUIsS0FBSyxlQUF4QztBQUNBLGlCQUFLLGVBQUwsSUFBd0IsTUFBTSxVQUE5Qjs7QUFFQSxnQkFBSSxpQkFBaUIsS0FBckI7O0FBRUEsZ0JBQUksS0FBSyxjQUFMLElBQXVCLElBQXZCLElBQStCLEtBQUssZUFBTCxHQUF1QixLQUFLLGNBQS9ELEVBQStFO0FBQzNFO0FBQ0EscUJBQUssYUFBTDtBQUNILGFBSEQsTUFHTztBQUNILGlDQUFpQixJQUFqQjtBQUNIOztBQUVEO0FBQ0EsZ0JBQUksS0FBSyxjQUFULEVBQXlCO0FBQ3JCLHFCQUFLLGNBQUwsQ0FBb0IsS0FBcEIsRUFBMkIsU0FBM0IsRUFBc0MsS0FBSyxlQUEzQztBQUNIOztBQUVELGdCQUFJLGNBQUosRUFBb0I7QUFDaEIscUJBQUssT0FBTCxHQUFlLHFCQUFhLFNBQTVCO0FBQ0Esb0JBQUksS0FBSyxXQUFULEVBQXNCO0FBQ2xCLHlCQUFLLFdBQUwsQ0FBaUIsS0FBSyxNQUFMLENBQVksSUFBN0IsRUFBbUMsS0FBSyxNQUFMLENBQVksSUFBWixHQUFtQixLQUFLLGVBQXhCLEdBQTBDLENBQTdFO0FBQ0g7QUFDSjtBQUNKOzs7b0NBRVcsQyxFQUFHO0FBQ1gsaUJBQUssT0FBTCxHQUFlLHFCQUFhLE1BQTVCO0FBQ0EsZ0JBQUksT0FBTyxDQUFYO0FBQ0EsZ0JBQUksT0FBTyxJQUFYOztBQUVBLGdCQUFJLEtBQUssY0FBTCxJQUF1QixLQUFLLGVBQUwsR0FBdUIsQ0FBOUMsSUFDdUIsS0FBSyxlQUFMLEdBQXVCLEtBQUssY0FEdkQsRUFDdUU7QUFDbkUsdUJBQU8scUJBQWEsU0FBcEI7QUFDQSx1QkFBTyxFQUFDLE1BQU0sQ0FBQyxDQUFSLEVBQVcsS0FBSyw0QkFBaEIsRUFBUDtBQUNILGFBSkQsTUFJTztBQUNILHVCQUFPLHFCQUFhLFNBQXBCO0FBQ0EsdUJBQU8sRUFBQyxNQUFNLENBQUMsQ0FBUixFQUFXLEtBQUssRUFBRSxXQUFGLENBQWMsSUFBZCxHQUFxQixHQUFyQixHQUEyQixFQUFFLElBQTdDLEVBQVA7QUFDSDs7QUFFRCxnQkFBSSxLQUFLLFFBQVQsRUFBbUI7QUFDZixxQkFBSyxRQUFMLENBQWMsSUFBZCxFQUFvQixJQUFwQjtBQUNILGFBRkQsTUFFTztBQUNILHNCQUFNLGdDQUFxQixLQUFLLEdBQTFCLENBQU47QUFDSDtBQUNKOzs7NEJBdFJrQjtBQUNmLG1CQUFPLEtBQUssYUFBTCxDQUFtQixjQUExQjtBQUNIOzs7Ozs7a0JBd1JVLFc7Ozs7Ozs7Ozs7O3FqQkM3V2Y7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztJQUVNLFM7QUFFRix1QkFBWSxlQUFaLEVBQTZCLE1BQTdCLEVBQXFDO0FBQUE7O0FBQ2pDLGFBQUssR0FBTCxHQUFXLFdBQVg7QUFDQSxhQUFLLEtBQUwsR0FBYSxXQUFiO0FBQ0EsYUFBSyxRQUFMLEdBQWdCLHNCQUFoQjs7QUFFQSxhQUFLLE9BQUwsR0FBZSxrQ0FBZjtBQUNBLFlBQUksUUFBTyxNQUFQLHlDQUFPLE1BQVAsT0FBa0IsUUFBdEIsRUFBZ0M7QUFDNUIsbUJBQU8sTUFBUCxDQUFjLEtBQUssT0FBbkIsRUFBNEIsTUFBNUI7QUFDSDs7QUFFRCxZQUFJLGdCQUFnQixJQUFoQixDQUFxQixXQUFyQixPQUF1QyxLQUEzQyxFQUFrRDtBQUM5QyxrQkFBTSx3Q0FBNkIsa0RBQTdCLENBQU47QUFDSDs7QUFFRCxZQUFJLGdCQUFnQixNQUFoQixLQUEyQixJQUEvQixFQUFxQztBQUNqQyxpQkFBSyxPQUFMLENBQWEsTUFBYixHQUFzQixJQUF0QjtBQUNIOztBQUVELGFBQUssQ0FBTCxHQUFTO0FBQ0wsK0JBQW1CLEtBQUssa0JBQUwsQ0FBd0IsSUFBeEIsQ0FBNkIsSUFBN0IsQ0FEZDtBQUVMLHdCQUFZLEtBQUssV0FBTCxDQUFpQixJQUFqQixDQUFzQixJQUF0QixDQUZQO0FBR0wsd0JBQVksS0FBSyxXQUFMLENBQWlCLElBQWpCLENBQXNCLElBQXRCLENBSFA7QUFJTCx3QkFBWSxLQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBc0IsSUFBdEIsQ0FKUDtBQUtMLHlCQUFhLEtBQUssWUFBTCxDQUFrQixJQUFsQixDQUF1QixJQUF2QjtBQUxSLFNBQVQ7O0FBUUEsWUFBSSxLQUFLLFdBQUwsSUFBb0IsS0FBSyxXQUFMLENBQWlCLEdBQXpDLEVBQThDO0FBQzFDLGlCQUFLLElBQUwsR0FBWSxLQUFLLFdBQUwsQ0FBaUIsR0FBakIsQ0FBcUIsSUFBckIsQ0FBMEIsS0FBSyxXQUEvQixDQUFaO0FBQ0gsU0FGRCxNQUVPO0FBQ0gsaUJBQUssSUFBTCxHQUFZLEtBQUssR0FBakI7QUFDSDs7QUFFRCxhQUFLLGdCQUFMLEdBQXdCLElBQXhCLENBaENpQyxDQWdDRjtBQUMvQixhQUFLLGVBQUwsR0FBdUIsS0FBdkI7QUFDQSxhQUFLLGdCQUFMLEdBQXdCLElBQXhCO0FBQ0EsYUFBSyxnQkFBTCxHQUF3QixJQUF4Qjs7QUFFQSxhQUFLLGdCQUFMLEdBQXdCLGVBQXhCO0FBQ0EsYUFBSyxhQUFMLEdBQXFCLElBQXJCO0FBQ0EsYUFBSyxPQUFMLEdBQWUsSUFBZjtBQUNBLGFBQUssV0FBTCxHQUFtQixJQUFuQjs7QUFFQSxhQUFLLGdCQUFMLEdBQXdCLEtBQXhCO0FBQ0EsYUFBSyxlQUFMLEdBQXVCLEtBQXZCO0FBQ0EsYUFBSyxnQkFBTCxHQUF3QixLQUF4Qjs7QUFFQSxhQUFLLFVBQUwsR0FBa0IsSUFBbEI7QUFDQSxhQUFLLGVBQUwsR0FBdUIsSUFBdkI7O0FBRUEsWUFBSSxtQkFBb0Isa0JBQVEsTUFBUixLQUNBLGtCQUFRLE9BQVIsQ0FBZ0IsS0FBaEIsR0FBd0IsRUFBeEIsSUFDQSxrQkFBUSxPQUFSLENBQWdCLEtBQWhCLEtBQTBCLEVBQTFCLElBQWdDLGtCQUFRLE9BQVIsQ0FBZ0IsS0FBaEIsR0FBd0IsSUFGeEQsQ0FBeEI7QUFHQSxhQUFLLG1CQUFMLEdBQTRCLG9CQUFvQixrQkFBUSxNQUE1QixJQUFzQyxrQkFBUSxJQUEvQyxHQUF1RCxJQUF2RCxHQUE4RCxLQUF6Rjs7QUFFQSxZQUFJLEtBQUssbUJBQVQsRUFBOEI7QUFDMUIsaUJBQUssT0FBTCxDQUFhLFlBQWIsR0FBNEIsS0FBNUI7QUFDSDtBQUNKOzs7O2tDQUVTO0FBQ04sZ0JBQUksS0FBSyxnQkFBTCxJQUF5QixJQUE3QixFQUFtQztBQUMvQix1QkFBTyxhQUFQLENBQXFCLEtBQUssZ0JBQTFCO0FBQ0EscUJBQUssZ0JBQUwsR0FBd0IsSUFBeEI7QUFDSDtBQUNELGdCQUFJLEtBQUssV0FBVCxFQUFzQjtBQUNsQixxQkFBSyxNQUFMO0FBQ0g7QUFDRCxnQkFBSSxLQUFLLGFBQVQsRUFBd0I7QUFDcEIscUJBQUssa0JBQUw7QUFDSDtBQUNELGlCQUFLLENBQUwsR0FBUyxJQUFUO0FBQ0EsaUJBQUssZ0JBQUwsR0FBd0IsSUFBeEI7O0FBRUEsaUJBQUssUUFBTCxDQUFjLGtCQUFkO0FBQ0EsaUJBQUssUUFBTCxHQUFnQixJQUFoQjtBQUNIOzs7MkJBRUUsSyxFQUFPLFEsRUFBVTtBQUFBOztBQUNoQixnQkFBSSxVQUFVLHVCQUFhLFVBQTNCLEVBQXVDO0FBQ25DLG9CQUFJLEtBQUssVUFBTCxJQUFtQixJQUF2QixFQUE2QjtBQUN6Qiw0QkFBUSxPQUFSLEdBQWtCLElBQWxCLENBQXVCLFlBQU07QUFDekIsOEJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsdUJBQWEsVUFBaEMsRUFBNEMsTUFBSyxTQUFqRDtBQUNILHFCQUZEO0FBR0g7QUFDSixhQU5ELE1BTU8sSUFBSSxVQUFVLHVCQUFhLGVBQTNCLEVBQTRDO0FBQy9DLG9CQUFJLEtBQUssZUFBTCxJQUF3QixJQUE1QixFQUFrQztBQUM5Qiw0QkFBUSxPQUFSLEdBQWtCLElBQWxCLENBQXVCLFlBQU07QUFDekIsOEJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsdUJBQWEsZUFBaEMsRUFBaUQsTUFBSyxjQUF0RDtBQUNILHFCQUZEO0FBR0g7QUFDSjtBQUNELGlCQUFLLFFBQUwsQ0FBYyxXQUFkLENBQTBCLEtBQTFCLEVBQWlDLFFBQWpDO0FBQ0g7Ozs0QkFFRyxLLEVBQU8sUSxFQUFVO0FBQ2pCLGlCQUFLLFFBQUwsQ0FBYyxjQUFkLENBQTZCLEtBQTdCLEVBQW9DLFFBQXBDO0FBQ0g7OzsyQ0FFa0IsWSxFQUFjO0FBQUE7O0FBQzdCLGlCQUFLLGFBQUwsR0FBcUIsWUFBckI7QUFDQSx5QkFBYSxnQkFBYixDQUE4QixnQkFBOUIsRUFBZ0QsS0FBSyxDQUFMLENBQU8saUJBQXZEO0FBQ0EseUJBQWEsZ0JBQWIsQ0FBOEIsU0FBOUIsRUFBeUMsS0FBSyxDQUFMLENBQU8sVUFBaEQ7QUFDQSx5QkFBYSxnQkFBYixDQUE4QixTQUE5QixFQUF5QyxLQUFLLENBQUwsQ0FBTyxVQUFoRDtBQUNBLHlCQUFhLGdCQUFiLENBQThCLFNBQTlCLEVBQXlDLEtBQUssQ0FBTCxDQUFPLFVBQWhEO0FBQ0EseUJBQWEsZ0JBQWIsQ0FBOEIsVUFBOUIsRUFBMEMsS0FBSyxDQUFMLENBQU8sV0FBakQ7O0FBRUEsaUJBQUssT0FBTCxHQUFlLDRCQUFrQixLQUFLLE9BQXZCLENBQWY7O0FBRUEsaUJBQUssT0FBTCxDQUFhLEVBQWIsQ0FBZ0Isb0JBQVUsVUFBMUIsRUFBc0MsS0FBSyxlQUFMLENBQXFCLElBQXJCLENBQTBCLElBQTFCLENBQXRDO0FBQ0EsaUJBQUssT0FBTCxDQUFhLEVBQWIsQ0FBZ0Isb0JBQVUsV0FBMUIsRUFBdUMsS0FBSyxnQkFBTCxDQUFzQixJQUF0QixDQUEyQixJQUEzQixDQUF2QztBQUNBLGlCQUFLLE9BQUwsQ0FBYSxFQUFiLENBQWdCLG9CQUFVLFdBQTFCLEVBQXVDLFlBQU07QUFDekMsdUJBQUssZ0JBQUwsR0FBd0IsSUFBeEI7QUFDQSxvQkFBSSxPQUFLLGVBQVQsRUFBMEI7QUFDdEIsMkJBQUssZUFBTCxHQUF1QixLQUF2QjtBQUNBLDJCQUFLLElBQUw7QUFDSDtBQUNKLGFBTkQ7QUFPQSxpQkFBSyxPQUFMLENBQWEsRUFBYixDQUFnQixvQkFBVSxLQUExQixFQUFpQyxVQUFDLElBQUQsRUFBVTtBQUN2Qyx1QkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQix1QkFBYSxLQUFoQyxFQUNtQix5QkFBVyxXQUQ5QixFQUVtQiwyQkFBYSxlQUZoQyxFQUdtQixJQUhuQjtBQUtILGFBTkQ7O0FBUUEsaUJBQUssT0FBTCxDQUFhLGtCQUFiLENBQWdDLFlBQWhDOztBQUVBLGdCQUFJLEtBQUssZ0JBQUwsSUFBeUIsSUFBN0IsRUFBbUM7QUFDL0Isb0JBQUk7QUFDQSxpQ0FBYSxXQUFiLEdBQTJCLEtBQUssZ0JBQWhDO0FBQ0EseUJBQUssZ0JBQUwsR0FBd0IsSUFBeEI7QUFDSCxpQkFIRCxDQUdFLE9BQU8sQ0FBUCxFQUFVO0FBQ1I7QUFDQTtBQUNIO0FBQ0o7QUFDSjs7OzZDQUVvQjtBQUNqQixnQkFBSSxLQUFLLGFBQVQsRUFBd0I7QUFDcEIscUJBQUssT0FBTCxDQUFhLGtCQUFiO0FBQ0EscUJBQUssYUFBTCxDQUFtQixtQkFBbkIsQ0FBdUMsZ0JBQXZDLEVBQXlELEtBQUssQ0FBTCxDQUFPLGlCQUFoRTtBQUNBLHFCQUFLLGFBQUwsQ0FBbUIsbUJBQW5CLENBQXVDLFNBQXZDLEVBQWtELEtBQUssQ0FBTCxDQUFPLFVBQXpEO0FBQ0EscUJBQUssYUFBTCxDQUFtQixtQkFBbkIsQ0FBdUMsU0FBdkMsRUFBa0QsS0FBSyxDQUFMLENBQU8sVUFBekQ7QUFDQSxxQkFBSyxhQUFMLENBQW1CLG1CQUFuQixDQUF1QyxTQUF2QyxFQUFrRCxLQUFLLENBQUwsQ0FBTyxVQUF6RDtBQUNBLHFCQUFLLGFBQUwsQ0FBbUIsbUJBQW5CLENBQXVDLFVBQXZDLEVBQW1ELEtBQUssQ0FBTCxDQUFPLFdBQTFEO0FBQ0EscUJBQUssYUFBTCxHQUFxQixJQUFyQjtBQUNIO0FBQ0QsZ0JBQUksS0FBSyxPQUFULEVBQWtCO0FBQ2QscUJBQUssT0FBTCxDQUFhLE9BQWI7QUFDQSxxQkFBSyxPQUFMLEdBQWUsSUFBZjtBQUNIO0FBQ0o7OzsrQkFFTTtBQUFBOztBQUNILGdCQUFJLENBQUMsS0FBSyxhQUFWLEVBQXlCO0FBQ3JCLHNCQUFNLHFDQUEwQixrREFBMUIsQ0FBTjtBQUNIO0FBQ0QsZ0JBQUksS0FBSyxXQUFULEVBQXNCO0FBQ2xCLHNCQUFNLHFDQUEwQiwrREFBMUIsQ0FBTjtBQUNIO0FBQ0QsZ0JBQUksS0FBSyxlQUFULEVBQTBCO0FBQ3RCO0FBQ0g7O0FBRUQsZ0JBQUksS0FBSyxPQUFMLENBQWEsd0JBQWIsSUFBeUMsS0FBSyxnQkFBTCxLQUEwQixLQUF2RSxFQUE4RTtBQUMxRSxxQkFBSyxlQUFMLEdBQXVCLElBQXZCO0FBQ0E7QUFDSDs7QUFFRCxnQkFBSSxLQUFLLGFBQUwsQ0FBbUIsVUFBbkIsR0FBZ0MsQ0FBcEMsRUFBdUM7QUFDbkMscUJBQUssZUFBTCxHQUF1QixJQUF2QjtBQUNBO0FBQ0EscUJBQUssYUFBTCxDQUFtQixXQUFuQixHQUFpQyxDQUFqQztBQUNIOztBQUVELGlCQUFLLFdBQUwsR0FBbUIseUJBQWUsS0FBSyxnQkFBcEIsRUFBc0MsS0FBSyxPQUEzQyxDQUFuQjs7QUFFQSxpQkFBSyxXQUFMLENBQWlCLEVBQWpCLENBQW9CLDRCQUFrQixZQUF0QyxFQUFvRCxVQUFDLElBQUQsRUFBTyxFQUFQLEVBQWM7QUFDOUQsdUJBQUssT0FBTCxDQUFhLGlCQUFiLENBQStCLEVBQS9CO0FBQ0gsYUFGRDtBQUdBLGlCQUFLLFdBQUwsQ0FBaUIsRUFBakIsQ0FBb0IsNEJBQWtCLGFBQXRDLEVBQXFELFVBQUMsSUFBRCxFQUFPLEVBQVAsRUFBYztBQUMvRCx1QkFBSyxPQUFMLENBQWEsa0JBQWIsQ0FBZ0MsRUFBaEM7O0FBRUE7QUFDQSxvQkFBSSxPQUFLLE9BQUwsQ0FBYSxRQUFiLElBQXlCLENBQUMsT0FBSyxPQUFMLENBQWEsTUFBM0MsRUFBbUQ7QUFDL0Msd0JBQUksY0FBYyxPQUFLLGFBQUwsQ0FBbUIsV0FBckM7QUFDQSx3QkFBSSxHQUFHLElBQUgsQ0FBUSxNQUFSLElBQWtCLENBQUMsY0FBYyxPQUFLLE9BQUwsQ0FBYSxtQkFBNUIsSUFBbUQsSUFBekUsRUFBK0U7QUFDM0UsNEJBQUksT0FBSyxnQkFBTCxJQUF5QixJQUE3QixFQUFtQztBQUMvQiw2Q0FBSSxDQUFKLENBQU0sT0FBSyxHQUFYLEVBQWdCLCtEQUFoQjtBQUNBLG1DQUFLLGtCQUFMO0FBQ0g7QUFDSjtBQUNKO0FBQ0osYUFiRDtBQWNBLGlCQUFLLFdBQUwsQ0FBaUIsRUFBakIsQ0FBb0IsNEJBQWtCLGdCQUF0QyxFQUF3RCxZQUFNO0FBQzFELHVCQUFLLE9BQUwsQ0FBYSxXQUFiO0FBQ0EsdUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsdUJBQWEsZ0JBQWhDO0FBQ0gsYUFIRDtBQUlBLGlCQUFLLFdBQUwsQ0FBaUIsRUFBakIsQ0FBb0IsNEJBQWtCLG1CQUF0QyxFQUEyRCxZQUFNO0FBQzdELHVCQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLHVCQUFhLG1CQUFoQztBQUNILGFBRkQ7QUFHQSxpQkFBSyxXQUFMLENBQWlCLEVBQWpCLENBQW9CLDRCQUFrQixRQUF0QyxFQUFnRCxVQUFDLE1BQUQsRUFBUyxJQUFULEVBQWtCO0FBQzlELHVCQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLHVCQUFhLEtBQWhDLEVBQXVDLHlCQUFXLGFBQWxELEVBQWlFLE1BQWpFLEVBQXlFLElBQXpFO0FBQ0gsYUFGRDtBQUdBLGlCQUFLLFdBQUwsQ0FBaUIsRUFBakIsQ0FBb0IsNEJBQWtCLFdBQXRDLEVBQW1ELFVBQUMsTUFBRCxFQUFTLElBQVQsRUFBa0I7QUFDakUsdUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsdUJBQWEsS0FBaEMsRUFBdUMseUJBQVcsV0FBbEQsRUFBK0QsTUFBL0QsRUFBdUUsRUFBQyxNQUFNLENBQUMsQ0FBUixFQUFXLEtBQUssSUFBaEIsRUFBdkU7QUFDSCxhQUZEO0FBR0EsaUJBQUssV0FBTCxDQUFpQixFQUFqQixDQUFvQiw0QkFBa0IsVUFBdEMsRUFBa0QsVUFBQyxTQUFELEVBQWU7QUFDN0QsdUJBQUssVUFBTCxHQUFrQixTQUFsQjtBQUNBLHVCQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLHVCQUFhLFVBQWhDLEVBQTRDLE9BQU8sTUFBUCxDQUFjLEVBQWQsRUFBa0IsU0FBbEIsQ0FBNUM7QUFDSCxhQUhEO0FBSUEsaUJBQUssV0FBTCxDQUFpQixFQUFqQixDQUFvQiw0QkFBa0IsZ0JBQXRDLEVBQXdELFVBQUMsUUFBRCxFQUFjO0FBQ2xFLHVCQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLHVCQUFhLGdCQUFoQyxFQUFrRCxRQUFsRDtBQUNILGFBRkQ7QUFHQSxpQkFBSyxXQUFMLENBQWlCLEVBQWpCLENBQW9CLDRCQUFrQixrQkFBdEMsRUFBMEQsVUFBQyxJQUFELEVBQVU7QUFDaEUsdUJBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsdUJBQWEsa0JBQWhDLEVBQW9ELElBQXBEO0FBQ0gsYUFGRDtBQUdBLGlCQUFLLFdBQUwsQ0FBaUIsRUFBakIsQ0FBb0IsNEJBQWtCLGVBQXRDLEVBQXVELFVBQUMsUUFBRCxFQUFjO0FBQ2pFLHVCQUFLLGVBQUwsR0FBdUIsT0FBSyxtQkFBTCxDQUF5QixRQUF6QixDQUF2QjtBQUNBLHVCQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLHVCQUFhLGVBQWhDLEVBQWlELE9BQU8sTUFBUCxDQUFjLEVBQWQsRUFBa0IsT0FBSyxlQUF2QixDQUFqRDtBQUNILGFBSEQ7QUFJQSxpQkFBSyxXQUFMLENBQWlCLEVBQWpCLENBQW9CLDRCQUFrQixtQkFBdEMsRUFBMkQsVUFBQyxZQUFELEVBQWtCO0FBQ3pFLG9CQUFJLE9BQUssYUFBTCxJQUFzQixDQUFDLE9BQUssT0FBTCxDQUFhLFlBQXhDLEVBQXNEO0FBQ2xELDJCQUFLLGVBQUwsR0FBdUIsSUFBdkI7QUFDQSwyQkFBSyxhQUFMLENBQW1CLFdBQW5CLEdBQWlDLGVBQWUsSUFBaEQ7QUFDSDtBQUNKLGFBTEQ7O0FBT0EsaUJBQUssV0FBTCxDQUFpQixJQUFqQjtBQUNIOzs7aUNBRVE7QUFDTCxnQkFBSSxLQUFLLGFBQVQsRUFBd0I7QUFDcEIscUJBQUssYUFBTCxDQUFtQixLQUFuQjtBQUNIO0FBQ0QsZ0JBQUksS0FBSyxPQUFULEVBQWtCO0FBQ2QscUJBQUssT0FBTCxDQUFhLElBQWIsQ0FBa0IsQ0FBbEI7QUFDSDtBQUNELGdCQUFJLEtBQUssV0FBVCxFQUFzQjtBQUNsQixxQkFBSyxXQUFMLENBQWlCLEtBQWpCO0FBQ0EscUJBQUssV0FBTCxDQUFpQixPQUFqQjtBQUNBLHFCQUFLLFdBQUwsR0FBbUIsSUFBbkI7QUFDSDtBQUNKOzs7K0JBRU07QUFDSCxtQkFBTyxLQUFLLGFBQUwsQ0FBbUIsSUFBbkIsRUFBUDtBQUNIOzs7Z0NBRU87QUFDSixpQkFBSyxhQUFMLENBQW1CLEtBQW5CO0FBQ0g7Ozs0Q0F5RG1CLFEsRUFBVTtBQUMxQixxQkFBUyxVQUFULEdBQXNCLEtBQUssS0FBM0I7O0FBRUEsZ0JBQUksRUFBRSxLQUFLLGFBQUwsWUFBOEIsZ0JBQWhDLENBQUosRUFBdUQ7QUFDbkQsdUJBQU8sUUFBUDtBQUNIOztBQUVELGdCQUFJLGlCQUFpQixJQUFyQjtBQUNBLGdCQUFJLFVBQVUsQ0FBZDtBQUNBLGdCQUFJLFVBQVUsQ0FBZDs7QUFFQSxnQkFBSSxLQUFLLGFBQUwsQ0FBbUIsdUJBQXZCLEVBQWdEO0FBQzVDLG9CQUFJLFVBQVUsS0FBSyxhQUFMLENBQW1CLHVCQUFuQixFQUFkO0FBQ0EsMEJBQVUsUUFBUSxnQkFBbEI7QUFDQSwwQkFBVSxRQUFRLGtCQUFsQjtBQUNILGFBSkQsTUFJTyxJQUFJLEtBQUssYUFBTCxDQUFtQix1QkFBbkIsSUFBOEMsU0FBbEQsRUFBNkQ7QUFDaEUsMEJBQVUsS0FBSyxhQUFMLENBQW1CLHVCQUE3QjtBQUNBLDBCQUFVLEtBQUssYUFBTCxDQUFtQix1QkFBN0I7QUFDSCxhQUhNLE1BR0E7QUFDSCxpQ0FBaUIsS0FBakI7QUFDSDs7QUFFRCxnQkFBSSxjQUFKLEVBQW9CO0FBQ2hCLHlCQUFTLGFBQVQsR0FBeUIsT0FBekI7QUFDQSx5QkFBUyxhQUFULEdBQXlCLE9BQXpCO0FBQ0g7O0FBRUQsbUJBQU8sUUFBUDtBQUNIOzs7MENBRWlCO0FBQ2QsZ0JBQUksQ0FBQyxLQUFLLE9BQUwsQ0FBYSxRQUFkLElBQTBCLEtBQUssT0FBTCxDQUFhLE1BQTNDLEVBQW1EO0FBQy9DO0FBQ0g7O0FBRUQsZ0JBQUksV0FBVyxLQUFLLGFBQUwsQ0FBbUIsUUFBbEM7QUFDQSxnQkFBSSxjQUFjLEtBQUssYUFBTCxDQUFtQixXQUFyQztBQUNBLGdCQUFJLG9CQUFvQixDQUF4QjtBQUNBLGdCQUFJLGtCQUFrQixDQUF0Qjs7QUFFQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFNBQVMsTUFBN0IsRUFBcUMsR0FBckMsRUFBMEM7QUFDdEMsb0JBQUksUUFBUSxTQUFTLEtBQVQsQ0FBZSxDQUFmLENBQVo7QUFDQSxvQkFBSSxNQUFNLFNBQVMsR0FBVCxDQUFhLENBQWIsQ0FBVjtBQUNBLG9CQUFJLFNBQVMsV0FBVCxJQUF3QixjQUFjLEdBQTFDLEVBQStDO0FBQzNDLHdDQUFvQixLQUFwQjtBQUNBLHNDQUFrQixHQUFsQjtBQUNBO0FBQ0g7QUFDSjs7QUFFRCxnQkFBSSxtQkFBbUIsY0FBYyxLQUFLLE9BQUwsQ0FBYSxtQkFBOUMsSUFBcUUsS0FBSyxnQkFBTCxJQUF5QixJQUFsRyxFQUF3RztBQUNwRyxpQ0FBSSxDQUFKLENBQU0sS0FBSyxHQUFYLEVBQWdCLCtEQUFoQjtBQUNBLHFCQUFLLGtCQUFMO0FBQ0g7QUFDSjs7OzJDQUVrQjtBQUNmLDZCQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0Isb0RBQWhCO0FBQ0EsZ0JBQUksS0FBSyxnQkFBTCxJQUF5QixJQUE3QixFQUFtQztBQUMvQixxQkFBSyxrQkFBTDtBQUNIO0FBQ0o7Ozs2Q0FFb0I7QUFDakIsZ0JBQUksS0FBSyxXQUFULEVBQXNCO0FBQ2xCLHFCQUFLLFdBQUwsQ0FBaUIsS0FBakI7O0FBRUEsb0JBQUksS0FBSyxnQkFBTCxJQUF5QixJQUE3QixFQUFtQztBQUMvQix5QkFBSyxnQkFBTCxHQUF3QixPQUFPLFdBQVAsQ0FBbUIsS0FBSyx1QkFBTCxDQUE2QixJQUE3QixDQUFrQyxJQUFsQyxDQUFuQixFQUE0RCxJQUE1RCxDQUF4QjtBQUNIO0FBQ0o7QUFDSjs7O2tEQUV5QjtBQUN0QixnQkFBSSxjQUFjLEtBQUssYUFBTCxDQUFtQixXQUFyQztBQUNBLGdCQUFJLFdBQVcsS0FBSyxhQUFMLENBQW1CLFFBQWxDOztBQUVBLGdCQUFJLGFBQWEsS0FBakI7O0FBRUEsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxTQUFTLE1BQTdCLEVBQXFDLEdBQXJDLEVBQTBDO0FBQ3RDLG9CQUFJLE9BQU8sU0FBUyxLQUFULENBQWUsQ0FBZixDQUFYO0FBQ0Esb0JBQUksS0FBSyxTQUFTLEdBQVQsQ0FBYSxDQUFiLENBQVQ7QUFDQSxvQkFBSSxlQUFlLElBQWYsSUFBdUIsY0FBYyxFQUF6QyxFQUE2QztBQUN6Qyx3QkFBSSxlQUFlLEtBQUssS0FBSyxPQUFMLENBQWEsdUJBQXJDLEVBQThEO0FBQzFELHFDQUFhLElBQWI7QUFDSDtBQUNEO0FBQ0g7QUFDSjs7QUFFRCxnQkFBSSxVQUFKLEVBQWdCO0FBQ1osdUJBQU8sYUFBUCxDQUFxQixLQUFLLGdCQUExQjtBQUNBLHFCQUFLLGdCQUFMLEdBQXdCLElBQXhCO0FBQ0Esb0JBQUksVUFBSixFQUFnQjtBQUNaLHFDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0IsdUNBQWhCO0FBQ0EseUJBQUssV0FBTCxDQUFpQixNQUFqQjtBQUNIO0FBQ0o7QUFDSjs7OzZDQUVvQixPLEVBQVM7QUFDMUIsZ0JBQUksV0FBVyxLQUFLLGFBQUwsQ0FBbUIsUUFBbEM7O0FBRUEsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxTQUFTLE1BQTdCLEVBQXFDLEdBQXJDLEVBQTBDO0FBQ3RDLG9CQUFJLE9BQU8sU0FBUyxLQUFULENBQWUsQ0FBZixDQUFYO0FBQ0Esb0JBQUksS0FBSyxTQUFTLEdBQVQsQ0FBYSxDQUFiLENBQVQ7QUFDQSxvQkFBSSxXQUFXLElBQVgsSUFBbUIsVUFBVSxFQUFqQyxFQUFxQztBQUNqQywyQkFBTyxJQUFQO0FBQ0g7QUFDSjtBQUNELG1CQUFPLEtBQVA7QUFDSDs7O3NDQUVhLE8sRUFBUztBQUNuQixnQkFBSSxhQUFhLEtBQUssb0JBQUwsQ0FBMEIsT0FBMUIsQ0FBakI7O0FBRUEsZ0JBQUksa0JBQWtCLEtBQXRCO0FBQ0EsZ0JBQUksc0JBQXNCLENBQTFCOztBQUVBLGdCQUFJLFVBQVUsR0FBVixJQUFpQixLQUFLLGFBQUwsQ0FBbUIsUUFBbkIsQ0FBNEIsTUFBNUIsR0FBcUMsQ0FBMUQsRUFBNkQ7QUFDekQsb0JBQUksaUJBQWlCLEtBQUssYUFBTCxDQUFtQixRQUFuQixDQUE0QixLQUE1QixDQUFrQyxDQUFsQyxDQUFyQjtBQUNBLG9CQUFLLGlCQUFpQixHQUFqQixJQUF3QixVQUFVLGNBQW5DLElBQXNELGtCQUFRLE1BQWxFLEVBQTBFO0FBQ3RFLHNDQUFrQixJQUFsQjtBQUNBO0FBQ0EsMENBQXNCLGtCQUFRLE1BQVIsR0FBaUIsR0FBakIsR0FBdUIsY0FBN0M7QUFDSDtBQUNKOztBQUVELGdCQUFJLGVBQUosRUFBcUI7QUFBRztBQUNwQixxQkFBSyxlQUFMLEdBQXVCLElBQXZCO0FBQ0EscUJBQUssYUFBTCxDQUFtQixXQUFuQixHQUFpQyxtQkFBakM7QUFDSCxhQUhELE1BR1EsSUFBSSxVQUFKLEVBQWdCO0FBQUc7QUFDdkIsb0JBQUksQ0FBQyxLQUFLLG1CQUFWLEVBQStCO0FBQzNCLHlCQUFLLGVBQUwsR0FBdUIsSUFBdkI7QUFDQSx5QkFBSyxhQUFMLENBQW1CLFdBQW5CLEdBQWlDLE9BQWpDO0FBQ0gsaUJBSEQsTUFHTztBQUNILHdCQUFJLE1BQU0sS0FBSyxPQUFMLENBQWEsa0JBQWIsQ0FBZ0MsS0FBSyxLQUFMLENBQVcsVUFBVSxJQUFyQixDQUFoQyxDQUFWO0FBQ0EseUJBQUssZUFBTCxHQUF1QixJQUF2QjtBQUNBLHdCQUFJLE9BQU8sSUFBWCxFQUFpQjtBQUNiLDZCQUFLLGFBQUwsQ0FBbUIsV0FBbkIsR0FBaUMsSUFBSSxHQUFKLEdBQVUsSUFBM0M7QUFDSCxxQkFGRCxNQUVPO0FBQ0gsNkJBQUssYUFBTCxDQUFtQixXQUFuQixHQUFpQyxPQUFqQztBQUNIO0FBQ0o7QUFDRCxvQkFBSSxLQUFLLGdCQUFMLElBQXlCLElBQTdCLEVBQW1DO0FBQy9CLHlCQUFLLHVCQUFMO0FBQ0g7QUFDSixhQWhCTyxNQWdCRDtBQUNILG9CQUFJLEtBQUssZ0JBQUwsSUFBeUIsSUFBN0IsRUFBbUM7QUFDL0IsMkJBQU8sYUFBUCxDQUFxQixLQUFLLGdCQUExQjtBQUNBLHlCQUFLLGdCQUFMLEdBQXdCLElBQXhCO0FBQ0g7QUFDRCxxQkFBSyxPQUFMLENBQWEsSUFBYixDQUFrQixPQUFsQjtBQUNBLHFCQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBc0IsS0FBSyxLQUFMLENBQVcsVUFBVSxJQUFyQixDQUF0QixFQU5HLENBTWlEO0FBQ3BEO0FBQ0E7QUFDQSxvQkFBSSxLQUFLLE9BQUwsQ0FBYSxZQUFqQixFQUErQjtBQUMzQix5QkFBSyxlQUFMLEdBQXVCLElBQXZCO0FBQ0EseUJBQUssYUFBTCxDQUFtQixXQUFuQixHQUFpQyxPQUFqQztBQUNIO0FBQ0o7QUFDSjs7OzREQUVtQztBQUNoQyxnQkFBSSxLQUFLLGdCQUFULEVBQTJCO0FBQ3ZCLG9CQUFJLEtBQUssZ0JBQUwsQ0FBc0IsVUFBdEIsSUFBb0MsS0FBSyxJQUFMLEtBQWMsR0FBdEQsRUFBMkQ7QUFDdkQsd0JBQUksU0FBUyxLQUFLLGFBQUwsQ0FBbUIsV0FBaEM7QUFDQSx5QkFBSyxnQkFBTCxHQUF3QixJQUF4QjtBQUNBLHdCQUFJLENBQUMsS0FBSyxvQkFBTCxDQUEwQixNQUExQixDQUFMLEVBQXdDO0FBQ3BDLDRCQUFJLEtBQUssZ0JBQUwsSUFBeUIsSUFBN0IsRUFBbUM7QUFDL0IsbUNBQU8sWUFBUCxDQUFvQixLQUFLLGdCQUF6QjtBQUNBLGlDQUFLLGdCQUFMLEdBQXdCLElBQXhCO0FBQ0g7QUFDRDtBQUNBO0FBQ0EsNkJBQUssT0FBTCxDQUFhLElBQWIsQ0FBa0IsTUFBbEI7QUFDQSw2QkFBSyxXQUFMLENBQWlCLElBQWpCLENBQXNCLEtBQUssS0FBTCxDQUFXLFNBQVMsSUFBcEIsQ0FBdEI7QUFDQTtBQUNBLDRCQUFJLEtBQUssT0FBTCxDQUFhLFlBQWpCLEVBQStCO0FBQzNCLGlDQUFLLGVBQUwsR0FBdUIsSUFBdkI7QUFDQSxpQ0FBSyxhQUFMLENBQW1CLFdBQW5CLEdBQWlDLE1BQWpDO0FBQ0g7QUFDSjtBQUNKLGlCQWxCRCxNQWtCTztBQUNILDJCQUFPLFVBQVAsQ0FBa0IsS0FBSyxpQ0FBTCxDQUF1QyxJQUF2QyxDQUE0QyxJQUE1QyxDQUFsQixFQUFxRSxFQUFyRTtBQUNIO0FBQ0o7QUFDSjs7O3FEQUU0QixPLEVBQVM7QUFDbEMsZ0JBQUksUUFBUSxLQUFLLGFBQWpCO0FBQ0EsZ0JBQUksV0FBVyxDQUFDLEtBQUssZ0JBQWpCLElBQXFDLE1BQU0sVUFBTixHQUFtQixDQUE1RCxFQUErRDtBQUFHO0FBQzlELG9CQUFJLFdBQVcsTUFBTSxRQUFyQjtBQUNBLG9CQUFJLFNBQVMsTUFBVCxHQUFrQixDQUFsQixJQUF1QixNQUFNLFdBQU4sR0FBb0IsU0FBUyxLQUFULENBQWUsQ0FBZixDQUEvQyxFQUFrRTtBQUM5RCxxQ0FBSSxDQUFKLENBQU0sS0FBSyxHQUFYLCtCQUEyQyxNQUFNLFdBQWpELGtCQUF5RSxTQUFTLEtBQVQsQ0FBZSxDQUFmLENBQXpFO0FBQ0EseUJBQUssZUFBTCxHQUF1QixJQUF2QjtBQUNBLHlCQUFLLGFBQUwsQ0FBbUIsV0FBbkIsR0FBaUMsU0FBUyxLQUFULENBQWUsQ0FBZixDQUFqQztBQUNBLHlCQUFLLGFBQUwsQ0FBbUIsbUJBQW5CLENBQXVDLFVBQXZDLEVBQW1ELEtBQUssQ0FBTCxDQUFPLFdBQTFEO0FBQ0g7QUFDSixhQVJELE1BUU87QUFDSDtBQUNBLHFCQUFLLGFBQUwsQ0FBbUIsbUJBQW5CLENBQXVDLFVBQXZDLEVBQW1ELEtBQUssQ0FBTCxDQUFPLFdBQTFEO0FBQ0g7QUFDSjs7OzJDQUVrQixDLEVBQUc7QUFDbEIsZ0JBQUksS0FBSyxnQkFBTCxJQUF5QixJQUE3QixFQUFtQztBQUMvQixxQkFBSyxhQUFMLENBQW1CLFdBQW5CLEdBQWlDLEtBQUssZ0JBQXRDO0FBQ0EscUJBQUssZ0JBQUwsR0FBd0IsSUFBeEI7QUFDSDtBQUNKOzs7b0NBRVcsQyxFQUFHO0FBQUc7QUFDZCxnQkFBSSxTQUFTLEtBQUssYUFBTCxDQUFtQixXQUFoQztBQUNBLGdCQUFJLFdBQVcsS0FBSyxhQUFMLENBQW1CLFFBQWxDOztBQUVBLGdCQUFJLEtBQUssZUFBVCxFQUEwQjtBQUN0QixxQkFBSyxlQUFMLEdBQXVCLEtBQXZCO0FBQ0E7QUFDSDs7QUFFRCxnQkFBSSxTQUFTLEdBQVQsSUFBZ0IsU0FBUyxNQUFULEdBQWtCLENBQXRDLEVBQXlDO0FBQ3JDO0FBQ0Esb0JBQUksaUJBQWlCLFNBQVMsS0FBVCxDQUFlLENBQWYsQ0FBckI7QUFDQSxvQkFBSyxpQkFBaUIsR0FBakIsSUFBd0IsU0FBUyxjQUFsQyxJQUFxRCxrQkFBUSxNQUFqRSxFQUF5RTtBQUNyRSx5QkFBSyxlQUFMLEdBQXVCLElBQXZCO0FBQ0E7QUFDQSx5QkFBSyxhQUFMLENBQW1CLFdBQW5CLEdBQWlDLGtCQUFRLE1BQVIsR0FBaUIsR0FBakIsR0FBdUIsY0FBeEQ7QUFDQTtBQUNIO0FBQ0o7O0FBRUQsZ0JBQUksS0FBSyxvQkFBTCxDQUEwQixNQUExQixDQUFKLEVBQXVDO0FBQ25DLG9CQUFJLEtBQUssbUJBQVQsRUFBOEI7QUFDMUIsd0JBQUksTUFBTSxLQUFLLE9BQUwsQ0FBYSxrQkFBYixDQUFnQyxLQUFLLEtBQUwsQ0FBVyxTQUFTLElBQXBCLENBQWhDLENBQVY7QUFDQSx3QkFBSSxPQUFPLElBQVgsRUFBaUI7QUFDYiw2QkFBSyxlQUFMLEdBQXVCLElBQXZCO0FBQ0EsNkJBQUssYUFBTCxDQUFtQixXQUFuQixHQUFpQyxJQUFJLEdBQUosR0FBVSxJQUEzQztBQUNIO0FBQ0o7QUFDRCxvQkFBSSxLQUFLLGdCQUFMLElBQXlCLElBQTdCLEVBQW1DO0FBQy9CLHlCQUFLLHVCQUFMO0FBQ0g7QUFDRDtBQUNIOztBQUVELGlCQUFLLGdCQUFMLEdBQXdCO0FBQ3BCLDJCQUFXLE1BRFM7QUFFcEIsNEJBQVksS0FBSyxJQUFMO0FBRlEsYUFBeEI7QUFJQSxtQkFBTyxVQUFQLENBQWtCLEtBQUssaUNBQUwsQ0FBdUMsSUFBdkMsQ0FBNEMsSUFBNUMsQ0FBbEIsRUFBcUUsRUFBckU7QUFDSDs7O29DQUVXLEMsRUFBRztBQUNYLGlCQUFLLGdCQUFMLEdBQXdCLElBQXhCO0FBQ0EsaUJBQUssYUFBTCxDQUFtQixtQkFBbkIsQ0FBdUMsU0FBdkMsRUFBa0QsS0FBSyxDQUFMLENBQU8sVUFBekQ7QUFDSDs7O29DQUVXLEMsRUFBRztBQUNYLGlCQUFLLDRCQUFMLENBQWtDLElBQWxDO0FBQ0g7OztxQ0FFWSxDLEVBQUc7QUFDWixpQkFBSyw0QkFBTDtBQUNIOzs7NEJBL1RVO0FBQ1AsbUJBQU8sS0FBSyxLQUFaO0FBQ0g7Ozs0QkFFYztBQUNYLG1CQUFPLEtBQUssYUFBTCxDQUFtQixRQUExQjtBQUNIOzs7NEJBRWM7QUFDWCxtQkFBTyxLQUFLLGFBQUwsQ0FBbUIsUUFBMUI7QUFDSDs7OzRCQUVZO0FBQ1QsbUJBQU8sS0FBSyxhQUFMLENBQW1CLE1BQTFCO0FBQ0gsUzswQkFFVSxLLEVBQU87QUFDZCxpQkFBSyxhQUFMLENBQW1CLE1BQW5CLEdBQTRCLEtBQTVCO0FBQ0g7Ozs0QkFFVztBQUNSLG1CQUFPLEtBQUssYUFBTCxDQUFtQixLQUExQjtBQUNILFM7MEJBRVMsSyxFQUFPO0FBQ2IsaUJBQUssYUFBTCxDQUFtQixLQUFuQixHQUEyQixLQUEzQjtBQUNIOzs7NEJBRWlCO0FBQ2QsZ0JBQUksS0FBSyxhQUFULEVBQXdCO0FBQ3BCLHVCQUFPLEtBQUssYUFBTCxDQUFtQixXQUExQjtBQUNIO0FBQ0QsbUJBQU8sQ0FBUDtBQUNILFM7MEJBRWUsTyxFQUFTO0FBQ3JCLGdCQUFJLEtBQUssYUFBVCxFQUF3QjtBQUNwQixxQkFBSyxhQUFMLENBQW1CLE9BQW5CO0FBQ0gsYUFGRCxNQUVPO0FBQ0gscUJBQUssZ0JBQUwsR0FBd0IsT0FBeEI7QUFDSDtBQUNKOzs7NEJBRWU7QUFDWixtQkFBTyxPQUFPLE1BQVAsQ0FBYyxFQUFkLEVBQWtCLEtBQUssVUFBdkIsQ0FBUDtBQUNIOzs7NEJBRW9CO0FBQ2pCLGdCQUFJLEtBQUssZUFBTCxJQUF3QixJQUE1QixFQUFrQztBQUM5QixxQkFBSyxlQUFMLEdBQXVCLEVBQXZCO0FBQ0g7QUFDRCxpQkFBSyxlQUFMLEdBQXVCLEtBQUssbUJBQUwsQ0FBeUIsS0FBSyxlQUE5QixDQUF2QjtBQUNBLG1CQUFPLE9BQU8sTUFBUCxDQUFjLEVBQWQsRUFBa0IsS0FBSyxlQUF2QixDQUFQO0FBQ0g7Ozs7OztrQkE4UVUsUzs7Ozs7Ozs7Ozs7cWpCQ2ptQmY7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVBO0lBQ00sWTtBQUVGLDBCQUFZLGVBQVosRUFBNkIsTUFBN0IsRUFBcUM7QUFBQTs7QUFDakMsYUFBSyxHQUFMLEdBQVcsY0FBWDtBQUNBLGFBQUssS0FBTCxHQUFhLGNBQWI7QUFDQSxhQUFLLFFBQUwsR0FBZ0Isc0JBQWhCOztBQUVBLGFBQUssT0FBTCxHQUFlLGtDQUFmO0FBQ0EsWUFBSSxRQUFPLE1BQVAseUNBQU8sTUFBUCxPQUFrQixRQUF0QixFQUFnQztBQUM1QixtQkFBTyxNQUFQLENBQWMsS0FBSyxPQUFuQixFQUE0QixNQUE1QjtBQUNIOztBQUVELFlBQUksZ0JBQWdCLElBQWhCLENBQXFCLFdBQXJCLE9BQXVDLEtBQTNDLEVBQWtEO0FBQzlDLGtCQUFNLHdDQUE2Qix5REFBN0IsQ0FBTjtBQUNIO0FBQ0QsWUFBSSxnQkFBZ0IsY0FBaEIsQ0FBK0IsVUFBL0IsQ0FBSixFQUFnRDtBQUM1QyxrQkFBTSwwREFBNkMsZ0JBQWdCLElBQTdELDRDQUFOO0FBQ0g7O0FBRUQsYUFBSyxDQUFMLEdBQVM7QUFDTCwrQkFBbUIsS0FBSyxrQkFBTCxDQUF3QixJQUF4QixDQUE2QixJQUE3QjtBQURkLFNBQVQ7O0FBSUEsYUFBSyxnQkFBTCxHQUF3QixJQUF4QjtBQUNBLGFBQUssbUJBQUwsR0FBMkIsSUFBM0I7O0FBRUEsYUFBSyxnQkFBTCxHQUF3QixlQUF4QjtBQUNBLGFBQUssYUFBTCxHQUFxQixJQUFyQjtBQUNIOzs7O2tDQUVTO0FBQ04sZ0JBQUksS0FBSyxhQUFULEVBQXdCO0FBQ3BCLHFCQUFLLE1BQUw7QUFDQSxxQkFBSyxrQkFBTDtBQUNIO0FBQ0QsaUJBQUssQ0FBTCxHQUFTLElBQVQ7QUFDQSxpQkFBSyxnQkFBTCxHQUF3QixJQUF4QjtBQUNBLGlCQUFLLFFBQUwsQ0FBYyxrQkFBZDtBQUNBLGlCQUFLLFFBQUwsR0FBZ0IsSUFBaEI7QUFDSDs7OzJCQUVFLEssRUFBTyxRLEVBQVU7QUFBQTs7QUFDaEIsZ0JBQUksVUFBVSx1QkFBYSxVQUEzQixFQUF1QztBQUNuQyxvQkFBSSxLQUFLLGFBQUwsSUFBc0IsSUFBdEIsSUFBOEIsS0FBSyxhQUFMLENBQW1CLFVBQW5CLEtBQWtDLENBQXBFLEVBQXVFO0FBQUc7QUFDdEUsNEJBQVEsT0FBUixHQUFrQixJQUFsQixDQUF1QixZQUFNO0FBQ3pCLDhCQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLHVCQUFhLFVBQWhDLEVBQTRDLE1BQUssU0FBakQ7QUFDSCxxQkFGRDtBQUdIO0FBQ0osYUFORCxNQU1PLElBQUksVUFBVSx1QkFBYSxlQUEzQixFQUE0QztBQUMvQyxvQkFBSSxLQUFLLGFBQUwsSUFBc0IsSUFBdEIsSUFBOEIsS0FBSyxhQUFMLENBQW1CLFVBQW5CLEtBQWtDLENBQXBFLEVBQXVFO0FBQ25FLDRCQUFRLE9BQVIsR0FBa0IsSUFBbEIsQ0FBdUIsWUFBTTtBQUN6Qiw4QkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQix1QkFBYSxlQUFoQyxFQUFpRCxNQUFLLGNBQXREO0FBQ0gscUJBRkQ7QUFHSDtBQUNKO0FBQ0QsaUJBQUssUUFBTCxDQUFjLFdBQWQsQ0FBMEIsS0FBMUIsRUFBaUMsUUFBakM7QUFDSDs7OzRCQUVHLEssRUFBTyxRLEVBQVU7QUFDakIsaUJBQUssUUFBTCxDQUFjLGNBQWQsQ0FBNkIsS0FBN0IsRUFBb0MsUUFBcEM7QUFDSDs7OzJDQUVrQixZLEVBQWM7QUFDN0IsaUJBQUssYUFBTCxHQUFxQixZQUFyQjtBQUNBLHlCQUFhLGdCQUFiLENBQThCLGdCQUE5QixFQUFnRCxLQUFLLENBQUwsQ0FBTyxpQkFBdkQ7O0FBRUEsZ0JBQUksS0FBSyxnQkFBTCxJQUF5QixJQUE3QixFQUFtQztBQUMvQixvQkFBSTtBQUNBLGlDQUFhLFdBQWIsR0FBMkIsS0FBSyxnQkFBaEM7QUFDQSx5QkFBSyxnQkFBTCxHQUF3QixJQUF4QjtBQUNILGlCQUhELENBR0UsT0FBTyxDQUFQLEVBQVU7QUFDUjtBQUNBO0FBQ0g7QUFDSjtBQUNKOzs7NkNBRW9CO0FBQ2pCLGdCQUFJLEtBQUssYUFBVCxFQUF3QjtBQUNwQixxQkFBSyxhQUFMLENBQW1CLEdBQW5CLEdBQXlCLEVBQXpCO0FBQ0EscUJBQUssYUFBTCxDQUFtQixlQUFuQixDQUFtQyxLQUFuQztBQUNBLHFCQUFLLGFBQUwsQ0FBbUIsbUJBQW5CLENBQXVDLGdCQUF2QyxFQUF5RCxLQUFLLENBQUwsQ0FBTyxpQkFBaEU7QUFDQSxxQkFBSyxhQUFMLEdBQXFCLElBQXJCO0FBQ0g7QUFDRCxnQkFBSSxLQUFLLG1CQUFMLElBQTRCLElBQWhDLEVBQXNDO0FBQ2xDLHVCQUFPLGFBQVAsQ0FBcUIsS0FBSyxtQkFBMUI7QUFDQSxxQkFBSyxtQkFBTCxHQUEyQixJQUEzQjtBQUNIO0FBQ0o7OzsrQkFFTTtBQUNILGdCQUFJLENBQUMsS0FBSyxhQUFWLEVBQXlCO0FBQ3JCLHNCQUFNLHFDQUEwQixrREFBMUIsQ0FBTjtBQUNIO0FBQ0QsaUJBQUssYUFBTCxDQUFtQixHQUFuQixHQUF5QixLQUFLLGdCQUFMLENBQXNCLEdBQS9DOztBQUVBLGdCQUFJLEtBQUssYUFBTCxDQUFtQixVQUFuQixHQUFnQyxDQUFwQyxFQUF1QztBQUNuQyxxQkFBSyxhQUFMLENBQW1CLFdBQW5CLEdBQWlDLENBQWpDO0FBQ0g7O0FBRUQsaUJBQUssYUFBTCxDQUFtQixPQUFuQixHQUE2QixNQUE3QjtBQUNBLGlCQUFLLGFBQUwsQ0FBbUIsSUFBbkI7QUFDQSxpQkFBSyxtQkFBTCxHQUEyQixPQUFPLFdBQVAsQ0FDdkIsS0FBSyxxQkFBTCxDQUEyQixJQUEzQixDQUFnQyxJQUFoQyxDQUR1QixFQUUzQixLQUFLLE9BQUwsQ0FBYSw0QkFGYyxDQUEzQjtBQUdIOzs7aUNBRVE7QUFDTCxnQkFBSSxLQUFLLGFBQVQsRUFBd0I7QUFDcEIscUJBQUssYUFBTCxDQUFtQixHQUFuQixHQUF5QixFQUF6QjtBQUNBLHFCQUFLLGFBQUwsQ0FBbUIsZUFBbkIsQ0FBbUMsS0FBbkM7QUFDSDtBQUNELGdCQUFJLEtBQUssbUJBQUwsSUFBNEIsSUFBaEMsRUFBc0M7QUFDbEMsdUJBQU8sYUFBUCxDQUFxQixLQUFLLG1CQUExQjtBQUNBLHFCQUFLLG1CQUFMLEdBQTJCLElBQTNCO0FBQ0g7QUFDSjs7OytCQUVNO0FBQ0gsbUJBQU8sS0FBSyxhQUFMLENBQW1CLElBQW5CLEVBQVA7QUFDSDs7O2dDQUVPO0FBQ0osaUJBQUssYUFBTCxDQUFtQixLQUFuQjtBQUNIOzs7MkNBNkZrQixDLEVBQUc7QUFDbEIsZ0JBQUksS0FBSyxnQkFBTCxJQUF5QixJQUE3QixFQUFtQztBQUMvQixxQkFBSyxhQUFMLENBQW1CLFdBQW5CLEdBQWlDLEtBQUssZ0JBQXRDO0FBQ0EscUJBQUssZ0JBQUwsR0FBd0IsSUFBeEI7QUFDSDtBQUNELGlCQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLHVCQUFhLFVBQWhDLEVBQTRDLEtBQUssU0FBakQ7QUFDSDs7O2dEQUV1QjtBQUNwQixpQkFBSyxRQUFMLENBQWMsSUFBZCxDQUFtQix1QkFBYSxlQUFoQyxFQUFpRCxLQUFLLGNBQXREO0FBQ0g7Ozs0QkFyR1U7QUFDUCxtQkFBTyxLQUFLLEtBQVo7QUFDSDs7OzRCQUVjO0FBQ1gsbUJBQU8sS0FBSyxhQUFMLENBQW1CLFFBQTFCO0FBQ0g7Ozs0QkFFYztBQUNYLG1CQUFPLEtBQUssYUFBTCxDQUFtQixRQUExQjtBQUNIOzs7NEJBRVk7QUFDVCxtQkFBTyxLQUFLLGFBQUwsQ0FBbUIsTUFBMUI7QUFDSCxTOzBCQUVVLEssRUFBTztBQUNkLGlCQUFLLGFBQUwsQ0FBbUIsTUFBbkIsR0FBNEIsS0FBNUI7QUFDSDs7OzRCQUVXO0FBQ1IsbUJBQU8sS0FBSyxhQUFMLENBQW1CLEtBQTFCO0FBQ0gsUzswQkFFUyxLLEVBQU87QUFDYixpQkFBSyxhQUFMLENBQW1CLEtBQW5CLEdBQTJCLEtBQTNCO0FBQ0g7Ozs0QkFFaUI7QUFDZCxnQkFBSSxLQUFLLGFBQVQsRUFBd0I7QUFDcEIsdUJBQU8sS0FBSyxhQUFMLENBQW1CLFdBQTFCO0FBQ0g7QUFDRCxtQkFBTyxDQUFQO0FBQ0gsUzswQkFFZSxPLEVBQVM7QUFDckIsZ0JBQUksS0FBSyxhQUFULEVBQXdCO0FBQ3BCLHFCQUFLLGFBQUwsQ0FBbUIsV0FBbkIsR0FBaUMsT0FBakM7QUFDSCxhQUZELE1BRU87QUFDSCxxQkFBSyxnQkFBTCxHQUF3QixPQUF4QjtBQUNIO0FBQ0o7Ozs0QkFFZTtBQUNaLGdCQUFJLGNBQWUsS0FBSyxhQUFMLFlBQThCLGdCQUEvQixHQUFtRCxRQUFuRCxHQUE4RCxRQUFoRjtBQUNBLGdCQUFJLE9BQU87QUFDUCwwQkFBVSxjQUFjLEtBQUssZ0JBQUwsQ0FBc0I7QUFEdkMsYUFBWDtBQUdBLGdCQUFJLEtBQUssYUFBVCxFQUF3QjtBQUNwQixxQkFBSyxRQUFMLEdBQWdCLEtBQUssS0FBTCxDQUFXLEtBQUssYUFBTCxDQUFtQixRQUFuQixHQUE4QixJQUF6QyxDQUFoQjtBQUNBLG9CQUFJLEtBQUssYUFBTCxZQUE4QixnQkFBbEMsRUFBb0Q7QUFDaEQseUJBQUssS0FBTCxHQUFhLEtBQUssYUFBTCxDQUFtQixVQUFoQztBQUNBLHlCQUFLLE1BQUwsR0FBYyxLQUFLLGFBQUwsQ0FBbUIsV0FBakM7QUFDSDtBQUNKO0FBQ0QsbUJBQU8sSUFBUDtBQUNIOzs7NEJBRW9CO0FBQ2pCLGdCQUFJLE9BQU87QUFDUCw0QkFBWSxLQUFLLEtBRFY7QUFFUCxxQkFBSyxLQUFLLGdCQUFMLENBQXNCO0FBRnBCLGFBQVg7O0FBS0EsZ0JBQUksRUFBRSxLQUFLLGFBQUwsWUFBOEIsZ0JBQWhDLENBQUosRUFBdUQ7QUFDbkQsdUJBQU8sSUFBUDtBQUNIOztBQUVELGdCQUFJLGlCQUFpQixJQUFyQjtBQUNBLGdCQUFJLFVBQVUsQ0FBZDtBQUNBLGdCQUFJLFVBQVUsQ0FBZDs7QUFFQSxnQkFBSSxLQUFLLGFBQUwsQ0FBbUIsdUJBQXZCLEVBQWdEO0FBQzVDLG9CQUFJLFVBQVUsS0FBSyxhQUFMLENBQW1CLHVCQUFuQixFQUFkO0FBQ0EsMEJBQVUsUUFBUSxnQkFBbEI7QUFDQSwwQkFBVSxRQUFRLGtCQUFsQjtBQUNILGFBSkQsTUFJTyxJQUFJLEtBQUssYUFBTCxDQUFtQix1QkFBbkIsSUFBOEMsU0FBbEQsRUFBNkQ7QUFDaEUsMEJBQVUsS0FBSyxhQUFMLENBQW1CLHVCQUE3QjtBQUNBLDBCQUFVLEtBQUssYUFBTCxDQUFtQix1QkFBN0I7QUFDSCxhQUhNLE1BR0E7QUFDSCxpQ0FBaUIsS0FBakI7QUFDSDs7QUFFRCxnQkFBSSxjQUFKLEVBQW9CO0FBQ2hCLHFCQUFLLGFBQUwsR0FBcUIsT0FBckI7QUFDQSxxQkFBSyxhQUFMLEdBQXFCLE9BQXJCO0FBQ0g7O0FBRUQsbUJBQU8sSUFBUDtBQUNIOzs7Ozs7a0JBZ0JVLFk7Ozs7Ozs7Ozs7QUM3T2Y7O0FBQ0E7Ozs7OztBQW5CQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJPLElBQU0sa0NBQWE7QUFDdEIsbUJBQWUsY0FETztBQUV0QixpQkFBYSxZQUZTO0FBR3RCLGlCQUFhO0FBSFMsQ0FBbkI7O0FBTUEsSUFBTSxzQ0FBZTtBQUN4Qix1QkFBbUIscUJBQWEsU0FEUjtBQUV4QixpQ0FBNkIscUJBQWEsd0JBRmxCO0FBR3hCLHFCQUFpQixxQkFBYSxrQkFITjtBQUl4QixxQ0FBaUMscUJBQWEsdUJBSnRCOztBQU14QixxQkFBaUIsZUFOTzs7QUFReEIsd0JBQW9CLHNCQUFZLFlBUlI7QUFTeEIsOEJBQTBCLHNCQUFZLGtCQVRkO0FBVXhCLDZCQUF5QixzQkFBWTtBQVZiLENBQXJCOzs7Ozs7OztBQzNCUDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLElBQU0sZUFBZTtBQUNqQixTQUFPLE9BRFU7QUFFakIsb0JBQWtCLGtCQUZEO0FBR2pCLHVCQUFxQixxQkFISjtBQUlqQixjQUFZLFlBSks7QUFLakIsb0JBQWtCLGtCQUxEO0FBTWpCLHNCQUFvQixvQkFOSDtBQU9qQixtQkFBaUI7QUFQQSxDQUFyQjs7a0JBVWUsWTs7Ozs7Ozs7Ozs7OztBQzVCZjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW1CTSxHOzs7Ozs7O3VDQUVvQixLLEVBQU8sWSxFQUFjO0FBQ3ZDLGdCQUFJLFVBQVUsV0FBZCxFQUEyQjtBQUN2QjtBQUNBLG9CQUFJLGlCQUFpQixDQUFyQixFQUF3QjtBQUNwQiwyQkFBTyxJQUFJLFVBQUosQ0FBZSxDQUFDLElBQUQsRUFBTyxJQUFQLEVBQWEsSUFBYixFQUFtQixJQUFuQixFQUF5QixJQUF6QixFQUErQixJQUEvQixDQUFmLENBQVA7QUFDSCxpQkFGRCxNQUVPLElBQUksaUJBQWlCLENBQXJCLEVBQXdCO0FBQzNCLDJCQUFPLElBQUksVUFBSixDQUFlLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxJQUFiLEVBQW1CLElBQW5CLEVBQXlCLElBQXpCLEVBQStCLElBQS9CLEVBQXFDLElBQXJDLEVBQTJDLElBQTNDLEVBQWlELElBQWpELENBQWYsQ0FBUDtBQUNILGlCQUZNLE1BRUEsSUFBSSxpQkFBaUIsQ0FBckIsRUFBd0I7QUFDM0IsMkJBQU8sSUFBSSxVQUFKLENBQWUsQ0FBQyxJQUFELEVBQU8sSUFBUCxFQUFhLElBQWIsRUFBbUIsSUFBbkIsRUFBeUIsSUFBekIsRUFBK0IsSUFBL0IsRUFBcUMsSUFBckMsRUFBMkMsSUFBM0MsRUFBaUQsSUFBakQsRUFBdUQsSUFBdkQsRUFBNkQsSUFBN0QsRUFBbUUsSUFBbkUsRUFBeUUsSUFBekUsQ0FBZixDQUFQO0FBQ0gsaUJBRk0sTUFFQSxJQUFJLGlCQUFpQixDQUFyQixFQUF3QjtBQUMzQiwyQkFBTyxJQUFJLFVBQUosQ0FBZSxDQUFDLElBQUQsRUFBTyxJQUFQLEVBQWEsSUFBYixFQUFtQixJQUFuQixFQUF5QixJQUF6QixFQUErQixJQUEvQixFQUFxQyxJQUFyQyxFQUEyQyxJQUEzQyxFQUFpRCxJQUFqRCxFQUF1RCxJQUF2RCxFQUE2RCxJQUE3RCxFQUFtRSxJQUFuRSxFQUF5RSxJQUF6RSxFQUErRSxJQUEvRSxFQUFxRixJQUFyRixFQUEyRixJQUEzRixFQUFpRyxJQUFqRyxFQUF1RyxJQUF2RyxDQUFmLENBQVA7QUFDSCxpQkFGTSxNQUVBLElBQUksaUJBQWlCLENBQXJCLEVBQXdCO0FBQzNCLDJCQUFPLElBQUksVUFBSixDQUFlLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxJQUFiLEVBQW1CLElBQW5CLEVBQXlCLElBQXpCLEVBQStCLElBQS9CLEVBQXFDLElBQXJDLEVBQTJDLElBQTNDLEVBQWlELElBQWpELEVBQXVELElBQXZELEVBQTZELElBQTdELEVBQW1FLElBQW5FLEVBQXlFLElBQXpFLEVBQStFLElBQS9FLEVBQXFGLElBQXJGLEVBQTJGLElBQTNGLEVBQWlHLElBQWpHLEVBQXVHLElBQXZHLEVBQTZHLElBQTdHLEVBQW1ILElBQW5ILEVBQXlILElBQXpILENBQWYsQ0FBUDtBQUNILGlCQUZNLE1BRUEsSUFBSSxpQkFBaUIsQ0FBckIsRUFBd0I7QUFDM0IsMkJBQU8sSUFBSSxVQUFKLENBQWUsQ0FBQyxJQUFELEVBQU8sSUFBUCxFQUFhLElBQWIsRUFBbUIsSUFBbkIsRUFBeUIsSUFBekIsRUFBK0IsSUFBL0IsRUFBcUMsSUFBckMsRUFBMkMsSUFBM0MsRUFBaUQsSUFBakQsRUFBdUQsSUFBdkQsRUFBNkQsSUFBN0QsRUFBbUUsSUFBbkUsRUFBeUUsSUFBekUsRUFBK0UsSUFBL0UsRUFBcUYsSUFBckYsRUFBMkYsSUFBM0YsRUFBaUcsSUFBakcsRUFBdUcsSUFBdkcsRUFBNkcsSUFBN0csRUFBbUgsSUFBbkgsRUFBeUgsSUFBekgsRUFBK0gsSUFBL0gsRUFBcUksSUFBckksRUFBMkksSUFBM0ksRUFBaUosSUFBakosRUFBdUosSUFBdkosQ0FBZixDQUFQO0FBQ0g7QUFDSixhQWZELE1BZU87QUFDSDtBQUNBLG9CQUFJLGlCQUFpQixDQUFyQixFQUF3QjtBQUNwQjtBQUNBLDJCQUFPLElBQUksVUFBSixDQUFlLENBQUMsR0FBRCxFQUFNLElBQU4sRUFBWSxJQUFaLEVBQWtCLElBQWxCLEVBQXdCLElBQXhCLEVBQThCLElBQTlCLEVBQW9DLElBQXBDLEVBQTBDLElBQTFDLEVBQWdELElBQWhELEVBQXNELEdBQXRELEVBQTJELEdBQTNELEVBQWdFLEdBQWhFLEVBQXFFLEdBQXJFLEVBQTBFLElBQTFFLEVBQWdGLEdBQWhGLEVBQXFGLElBQXJGLEVBQTJGLElBQTNGLEVBQWlHLEdBQWpHLEVBQXNHLElBQXRHLEVBQTRHLElBQTVHLEVBQWtILElBQWxILEVBQXdILElBQXhILEVBQThILElBQTlILEVBQW9JLElBQXBJLEVBQTBJLElBQTFJLEVBQWdKLElBQWhKLEVBQXNKLElBQXRKLEVBQTRKLElBQTVKLEVBQWtLLElBQWxLLEVBQXdLLElBQXhLLEVBQThLLElBQTlLLEVBQW9MLElBQXBMLEVBQTBMLElBQTFMLEVBQWdNLElBQWhNLEVBQXNNLElBQXRNLEVBQTRNLElBQTVNLEVBQWtOLElBQWxOLEVBQXdOLElBQXhOLEVBQThOLElBQTlOLEVBQW9PLElBQXBPLEVBQTBPLElBQTFPLEVBQWdQLElBQWhQLEVBQXNQLElBQXRQLEVBQTRQLElBQTVQLEVBQWtRLElBQWxRLEVBQXdRLElBQXhRLEVBQThRLElBQTlRLEVBQW9SLElBQXBSLEVBQTBSLElBQTFSLEVBQWdTLElBQWhTLEVBQXNTLElBQXRTLEVBQTRTLElBQTVTLEVBQWtULElBQWxULEVBQXdULElBQXhULEVBQThULElBQTlULEVBQW9VLElBQXBVLEVBQTBVLElBQTFVLEVBQWdWLElBQWhWLEVBQXNWLElBQXRWLENBQWYsQ0FBUDtBQUNILGlCQUhELE1BR08sSUFBSSxpQkFBaUIsQ0FBckIsRUFBd0I7QUFDM0I7QUFDQSwyQkFBTyxJQUFJLFVBQUosQ0FBZSxDQUFDLEdBQUQsRUFBTSxJQUFOLEVBQVksSUFBWixFQUFrQixJQUFsQixFQUF3QixJQUF4QixFQUE4QixJQUE5QixFQUFvQyxJQUFwQyxFQUEwQyxJQUExQyxFQUFnRCxJQUFoRCxFQUFzRCxHQUF0RCxFQUEyRCxHQUEzRCxFQUFnRSxHQUFoRSxFQUFxRSxHQUFyRSxFQUEwRSxHQUExRSxFQUErRSxJQUEvRSxFQUFxRixHQUFyRixFQUEwRixHQUExRixFQUErRixJQUEvRixFQUFxRyxJQUFyRyxFQUEyRyxHQUEzRyxFQUFnSCxJQUFoSCxFQUFzSCxJQUF0SCxFQUE0SCxJQUE1SCxFQUFrSSxJQUFsSSxFQUF3SSxJQUF4SSxFQUE4SSxJQUE5SSxFQUFvSixJQUFwSixFQUEwSixJQUExSixFQUFnSyxJQUFoSyxFQUFzSyxJQUF0SyxFQUE0SyxJQUE1SyxFQUFrTCxJQUFsTCxFQUF3TCxJQUF4TCxFQUE4TCxJQUE5TCxFQUFvTSxJQUFwTSxFQUEwTSxJQUExTSxFQUFnTixJQUFoTixFQUFzTixJQUF0TixFQUE0TixJQUE1TixFQUFrTyxJQUFsTyxFQUF3TyxJQUF4TyxFQUE4TyxJQUE5TyxFQUFvUCxJQUFwUCxFQUEwUCxJQUExUCxFQUFnUSxJQUFoUSxFQUFzUSxJQUF0USxFQUE0USxJQUE1USxFQUFrUixJQUFsUixFQUF3UixJQUF4UixFQUE4UixJQUE5UixFQUFvUyxJQUFwUyxFQUEwUyxJQUExUyxFQUFnVCxJQUFoVCxFQUFzVCxJQUF0VCxFQUE0VCxJQUE1VCxFQUFrVSxJQUFsVSxFQUF3VSxJQUF4VSxFQUE4VSxJQUE5VSxFQUFvVixJQUFwVixDQUFmLENBQVA7QUFDSCxpQkFITSxNQUdBLElBQUksaUJBQWlCLENBQXJCLEVBQXdCO0FBQzNCO0FBQ0EsMkJBQU8sSUFBSSxVQUFKLENBQWUsQ0FBQyxHQUFELEVBQU0sSUFBTixFQUFZLElBQVosRUFBa0IsSUFBbEIsRUFBd0IsSUFBeEIsRUFBOEIsSUFBOUIsRUFBb0MsSUFBcEMsRUFBMEMsSUFBMUMsRUFBZ0QsSUFBaEQsRUFBc0QsR0FBdEQsRUFBMkQsR0FBM0QsRUFBZ0UsR0FBaEUsRUFBcUUsR0FBckUsRUFBMEUsR0FBMUUsRUFBK0UsSUFBL0UsRUFBcUYsR0FBckYsRUFBMEYsR0FBMUYsRUFBK0YsSUFBL0YsRUFBcUcsSUFBckcsRUFBMkcsR0FBM0csRUFBZ0gsSUFBaEgsRUFBc0gsSUFBdEgsRUFBNEgsSUFBNUgsRUFBa0ksSUFBbEksRUFBd0ksSUFBeEksRUFBOEksSUFBOUksRUFBb0osSUFBcEosRUFBMEosSUFBMUosRUFBZ0ssSUFBaEssRUFBc0ssSUFBdEssRUFBNEssSUFBNUssRUFBa0wsSUFBbEwsRUFBd0wsSUFBeEwsRUFBOEwsSUFBOUwsRUFBb00sSUFBcE0sRUFBME0sSUFBMU0sRUFBZ04sSUFBaE4sRUFBc04sSUFBdE4sRUFBNE4sSUFBNU4sRUFBa08sSUFBbE8sRUFBd08sSUFBeE8sRUFBOE8sSUFBOU8sRUFBb1AsSUFBcFAsRUFBMFAsSUFBMVAsRUFBZ1EsSUFBaFEsRUFBc1EsSUFBdFEsRUFBNFEsSUFBNVEsRUFBa1IsSUFBbFIsRUFBd1IsSUFBeFIsRUFBOFIsSUFBOVIsRUFBb1MsSUFBcFMsRUFBMFMsSUFBMVMsRUFBZ1QsSUFBaFQsRUFBc1QsSUFBdFQsRUFBNFQsSUFBNVQsRUFBa1UsSUFBbFUsRUFBd1UsSUFBeFUsRUFBOFUsSUFBOVUsRUFBb1YsSUFBcFYsQ0FBZixDQUFQO0FBQ0g7QUFDSjtBQUNELG1CQUFPLElBQVA7QUFDSDs7Ozs7O2tCQUlVLEc7Ozs7Ozs7Ozs7Ozs7QUN2RGY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkE7SUFDTSxHOzs7Ozs7OytCQUVZO0FBQ1YsZ0JBQUksS0FBSixHQUFZO0FBQ1Isc0JBQU0sRUFERSxFQUNFLE1BQU0sRUFEUixFQUNZLE1BQU0sRUFEbEIsRUFDc0IsTUFBTSxFQUQ1QjtBQUVSLHNCQUFNLEVBRkUsRUFFRSxNQUFNLEVBRlIsRUFFWSxNQUFNLEVBRmxCLEVBRXNCLE1BQU0sRUFGNUI7QUFHUixzQkFBTSxFQUhFLEVBR0UsTUFBTSxFQUhSLEVBR1ksTUFBTSxFQUhsQixFQUdzQixNQUFNLEVBSDVCO0FBSVIsc0JBQU0sRUFKRSxFQUlFLE1BQU0sRUFKUixFQUlZLE1BQU0sRUFKbEIsRUFJc0IsTUFBTSxFQUo1QjtBQUtSLHNCQUFNLEVBTEUsRUFLRSxNQUFNLEVBTFIsRUFLWSxNQUFNLEVBTGxCLEVBS3NCLE1BQU0sRUFMNUI7QUFNUixzQkFBTSxFQU5FLEVBTUUsTUFBTSxFQU5SLEVBTVksTUFBTSxFQU5sQixFQU1zQixNQUFNLEVBTjVCO0FBT1Isc0JBQU0sRUFQRSxFQU9FLE1BQU0sRUFQUixFQU9ZLE1BQU0sRUFQbEIsRUFPc0IsTUFBTSxFQVA1QjtBQVFSLHNCQUFNLEVBUkUsRUFRRSxNQUFNLEVBUlIsRUFRWSxNQUFNLEVBUmxCLEVBUXNCLE1BQU0sRUFSNUI7QUFTUixzQkFBTSxFQVRFLEVBU0UsTUFBTSxFQVRSLEVBU1ksUUFBUTtBQVRwQixhQUFaOztBQVlBLGlCQUFLLElBQUksSUFBVCxJQUFpQixJQUFJLEtBQXJCLEVBQTRCO0FBQ3hCLG9CQUFJLElBQUksS0FBSixDQUFVLGNBQVYsQ0FBeUIsSUFBekIsQ0FBSixFQUFvQztBQUNoQyx3QkFBSSxLQUFKLENBQVUsSUFBVixJQUFrQixDQUNkLEtBQUssVUFBTCxDQUFnQixDQUFoQixDQURjLEVBRWQsS0FBSyxVQUFMLENBQWdCLENBQWhCLENBRmMsRUFHZCxLQUFLLFVBQUwsQ0FBZ0IsQ0FBaEIsQ0FIYyxFQUlkLEtBQUssVUFBTCxDQUFnQixDQUFoQixDQUpjLENBQWxCO0FBTUg7QUFDSjs7QUFFRCxnQkFBSSxZQUFZLElBQUksU0FBSixHQUFnQixFQUFoQzs7QUFFQSxzQkFBVSxJQUFWLEdBQWlCLElBQUksVUFBSixDQUFlLENBQzVCLElBRDRCLEVBQ3RCLElBRHNCLEVBQ2hCLElBRGdCLEVBQ1YsSUFEVSxFQUNIO0FBQ3pCLGVBRjRCLEVBRXRCLEdBRnNCLEVBRWhCLEdBRmdCLEVBRVYsR0FGVSxFQUVIO0FBQ3pCLGdCQUg0QixFQUd0QixJQUhzQixFQUdoQixJQUhnQixFQUdWLElBSFUsRUFHSDtBQUN6QixnQkFKNEIsRUFJdEIsSUFKc0IsRUFJaEIsSUFKZ0IsRUFJVixJQUpVLENBSUg7QUFKRyxhQUFmLENBQWpCOztBQU9BLHNCQUFVLFdBQVYsR0FBd0IsSUFBSSxVQUFKLENBQWUsQ0FDbkMsSUFEbUMsRUFDN0IsSUFENkIsRUFDdkIsSUFEdUIsRUFDakIsSUFEaUIsRUFDVjtBQUN6QixnQkFGbUMsRUFFN0IsSUFGNkIsRUFFdkIsSUFGdUIsRUFFakIsSUFGaUIsQ0FFVjtBQUZVLGFBQWYsQ0FBeEI7O0FBS0Esc0JBQVUsSUFBVixHQUFpQixJQUFJLFVBQUosQ0FBZSxDQUM1QixJQUQ0QixFQUN0QixJQURzQixFQUNoQixJQURnQixFQUNWLElBRFUsRUFDSDtBQUN6QixnQkFGNEIsRUFFdEIsSUFGc0IsRUFFaEIsSUFGZ0IsRUFFVixJQUZVLENBRUg7QUFGRyxhQUFmLENBQWpCOztBQUtBLHNCQUFVLElBQVYsR0FBaUIsVUFBVSxJQUFWLEdBQWlCLFVBQVUsSUFBNUM7O0FBRUEsc0JBQVUsSUFBVixHQUFpQixJQUFJLFVBQUosQ0FBZSxDQUM1QixJQUQ0QixFQUN0QixJQURzQixFQUNoQixJQURnQixFQUNWLElBRFUsRUFDSDtBQUN6QixnQkFGNEIsRUFFdEIsSUFGc0IsRUFFaEIsSUFGZ0IsRUFFVixJQUZVLEVBRUg7QUFDekIsZ0JBSDRCLEVBR3RCLElBSHNCLEVBR2hCLElBSGdCLEVBR1YsSUFIVSxDQUdIO0FBSEcsYUFBZixDQUFqQjs7QUFNQSxzQkFBVSxVQUFWLEdBQXVCLElBQUksVUFBSixDQUFlLENBQ2xDLElBRGtDLEVBQzVCLElBRDRCLEVBQ3RCLElBRHNCLEVBQ2hCLElBRGdCLEVBQ1Q7QUFDekIsZ0JBRmtDLEVBRTVCLElBRjRCLEVBRXRCLElBRnNCLEVBRWhCLElBRmdCLEVBRVQ7QUFDekIsZ0JBSGtDLEVBRzVCLElBSDRCLEVBR3RCLElBSHNCLEVBR2hCLElBSGdCLEVBR1Q7QUFDekIsZ0JBSmtDLEVBSTVCLElBSjRCLEVBSXRCLElBSnNCLEVBSWhCLElBSmdCLEVBSVQ7QUFDekIsZ0JBTGtDLEVBSzVCLElBTDRCLEVBS3RCLElBTHNCLEVBS2hCLElBTGdCLEVBTWxDLElBTmtDLEVBTTVCLElBTjRCLEVBTXRCLElBTnNCLEVBTWhCLElBTmdCLEVBT2xDLElBUGtDLEVBTzVCLElBUDRCLEVBT3RCLElBUHNCLEVBT2hCLElBUGdCLEVBUWxDLElBUmtDLEVBUTVCLElBUjRCLEVBUXRCLElBUnNCLEVBUWhCLElBUmdCLEVBU2xDLElBVGtDLEVBUzVCLElBVDRCLEVBU3RCLElBVHNCLEVBU2hCLElBVGdCLEVBU1YsSUFUVSxDQVNKO0FBVEksYUFBZixDQUF2Qjs7QUFZQSxzQkFBVSxVQUFWLEdBQXVCLElBQUksVUFBSixDQUFlLENBQ2xDLElBRGtDLEVBQzVCLElBRDRCLEVBQ3RCLElBRHNCLEVBQ2hCLElBRGdCLEVBQ1Q7QUFDekIsZ0JBRmtDLEVBRTVCLElBRjRCLEVBRXRCLElBRnNCLEVBRWhCLElBRmdCLEVBRVQ7QUFDekIsZ0JBSGtDLEVBRzVCLElBSDRCLEVBR3RCLElBSHNCLEVBR2hCLElBSGdCLEVBR1Q7QUFDekIsZ0JBSmtDLEVBSTVCLElBSjRCLEVBSXRCLElBSnNCLEVBSWhCLElBSmdCLEVBSVQ7QUFDekIsZ0JBTGtDLEVBSzVCLElBTDRCLEVBS3RCLElBTHNCLEVBS2hCLElBTGdCLEVBTWxDLElBTmtDLEVBTTVCLElBTjRCLEVBTXRCLElBTnNCLEVBTWhCLElBTmdCLEVBT2xDLElBUGtDLEVBTzVCLElBUDRCLEVBT3RCLElBUHNCLEVBT2hCLElBUGdCLEVBUWxDLElBUmtDLEVBUTVCLElBUjRCLEVBUXRCLElBUnNCLEVBUWhCLElBUmdCLEVBU2xDLElBVGtDLEVBUzVCLElBVDRCLEVBU3RCLElBVHNCLEVBU2hCLElBVGdCLEVBU1YsSUFUVSxDQVNKO0FBVEksYUFBZixDQUF2Qjs7QUFZQSxzQkFBVSxJQUFWLEdBQWlCLElBQUksVUFBSixDQUFlLENBQzVCLElBRDRCLEVBQ3RCLElBRHNCLEVBQ2hCLElBRGdCLEVBQ1YsSUFEVSxFQUNIO0FBQ3pCLGdCQUY0QixFQUV0QixJQUZzQixFQUVoQixJQUZnQixFQUVWLElBRlUsRUFFSDtBQUN6QixnQkFINEIsRUFHdEIsSUFIc0IsRUFHaEIsSUFIZ0IsRUFHVixJQUhVLEVBR0g7QUFDekIsZ0JBSjRCLEVBSXRCLElBSnNCLEVBSWhCLElBSmdCLEVBSVYsSUFKVSxFQUlIO0FBQ3pCLGdCQUw0QixFQUt0QixJQUxzQixFQUtoQixJQUxnQixFQUtWLElBTFUsQ0FLSDtBQUxHLGFBQWYsQ0FBakI7O0FBUUE7QUFDQSxzQkFBVSxJQUFWLEdBQWlCLElBQUksVUFBSixDQUFlLENBQzVCLElBRDRCLEVBQ3RCLElBRHNCLEVBQ2hCLElBRGdCLEVBQ1YsSUFEVSxFQUNIO0FBQ3pCLGdCQUY0QixFQUV0QixJQUZzQixFQUVoQixJQUZnQixFQUVWLElBRlUsQ0FFSDtBQUZHLGFBQWYsQ0FBakI7O0FBS0E7QUFDQSxzQkFBVSxJQUFWLEdBQWlCLElBQUksVUFBSixDQUFlLENBQzVCLElBRDRCLEVBQ3RCLElBRHNCLEVBQ2hCLElBRGdCLEVBQ1YsSUFEVSxFQUNIO0FBQ3pCLGdCQUY0QixFQUV0QixJQUZzQixFQUVIO0FBQ3pCLGdCQUg0QixFQUd0QixJQUhzQixFQUdoQixJQUhnQixFQUdWLElBSFUsRUFHSDtBQUN6QixnQkFKNEIsRUFJdEIsSUFKc0IsQ0FBZixDQUFqQjtBQU1IOztBQUVEOzs7OzRCQUNXLEksRUFBTTtBQUNiLGdCQUFJLE9BQU8sQ0FBWDtBQUNBLGdCQUFJLFNBQVMsSUFBYjtBQUNBLGdCQUFJLFFBQVEsTUFBTSxTQUFOLENBQWdCLEtBQWhCLENBQXNCLElBQXRCLENBQTJCLFNBQTNCLEVBQXNDLENBQXRDLENBQVo7QUFDQSxnQkFBSSxhQUFhLE1BQU0sTUFBdkI7O0FBRUEsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxVQUFwQixFQUFnQyxHQUFoQyxFQUFxQztBQUNqQyx3QkFBUSxNQUFNLENBQU4sRUFBUyxVQUFqQjtBQUNIOztBQUVELHFCQUFTLElBQUksVUFBSixDQUFlLElBQWYsQ0FBVDtBQUNBLG1CQUFPLENBQVAsSUFBYSxTQUFTLEVBQVYsR0FBZ0IsSUFBNUIsQ0FYYSxDQVdzQjtBQUNuQyxtQkFBTyxDQUFQLElBQWEsU0FBUyxFQUFWLEdBQWdCLElBQTVCO0FBQ0EsbUJBQU8sQ0FBUCxJQUFhLFNBQVUsQ0FBWCxHQUFnQixJQUE1QjtBQUNBLG1CQUFPLENBQVAsSUFBYSxJQUFELEdBQVMsSUFBckI7O0FBRUEsbUJBQU8sR0FBUCxDQUFXLElBQVgsRUFBaUIsQ0FBakIsRUFoQmEsQ0FnQlM7O0FBRXRCLGdCQUFJLFNBQVMsQ0FBYjtBQUNBLGlCQUFLLElBQUksS0FBSSxDQUFiLEVBQWdCLEtBQUksVUFBcEIsRUFBZ0MsSUFBaEMsRUFBcUM7QUFBRztBQUNwQyx1QkFBTyxHQUFQLENBQVcsTUFBTSxFQUFOLENBQVgsRUFBcUIsTUFBckI7QUFDQSwwQkFBVSxNQUFNLEVBQU4sRUFBUyxVQUFuQjtBQUNIOztBQUVELG1CQUFPLE1BQVA7QUFDSDs7QUFFRDs7Ozs0Q0FDMkIsSSxFQUFNO0FBQzdCLGdCQUFJLE9BQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBSSxTQUFKLENBQWMsSUFBdEMsQ0FBWDtBQUNBLGdCQUFJLE9BQU8sSUFBSSxJQUFKLENBQVMsSUFBVCxDQUFYOztBQUVBLGdCQUFJLFNBQVMsSUFBSSxVQUFKLENBQWUsS0FBSyxVQUFMLEdBQWtCLEtBQUssVUFBdEMsQ0FBYjtBQUNBLG1CQUFPLEdBQVAsQ0FBVyxJQUFYLEVBQWlCLENBQWpCO0FBQ0EsbUJBQU8sR0FBUCxDQUFXLElBQVgsRUFBaUIsS0FBSyxVQUF0QjtBQUNBLG1CQUFPLE1BQVA7QUFDSDs7QUFFRDs7Ozs2QkFDWSxJLEVBQU07QUFDZCxnQkFBSSxPQUFPLElBQUksSUFBSixDQUFTLEtBQUssU0FBZCxFQUF5QixLQUFLLFFBQTlCLENBQVg7QUFDQSxnQkFBSSxPQUFPLElBQUksSUFBSixDQUFTLElBQVQsQ0FBWDtBQUNBLGdCQUFJLE9BQU8sSUFBSSxJQUFKLENBQVMsSUFBVCxDQUFYO0FBQ0EsbUJBQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBeEIsRUFBOEIsSUFBOUIsRUFBb0MsSUFBcEMsQ0FBUDtBQUNIOztBQUVEOzs7OzZCQUNZLFMsRUFBVyxRLEVBQVU7QUFDN0IsbUJBQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBSSxVQUFKLENBQWUsQ0FDMUMsSUFEMEMsRUFDcEMsSUFEb0MsRUFDOUIsSUFEOEIsRUFDeEIsSUFEd0IsRUFDakI7QUFDekIsZ0JBRjBDLEVBRXBDLElBRm9DLEVBRTlCLElBRjhCLEVBRXhCLElBRndCLEVBRWpCO0FBQ3pCLGdCQUgwQyxFQUdwQyxJQUhvQyxFQUc5QixJQUg4QixFQUd4QixJQUh3QixFQUdqQjtBQUN4QiwwQkFBYyxFQUFmLEdBQXFCLElBSnFCLEVBSWQ7QUFDM0IsMEJBQWMsRUFBZixHQUFxQixJQUxxQixFQU16QyxjQUFlLENBQWhCLEdBQXFCLElBTnFCLEVBT3pDLFNBQUQsR0FBYyxJQVA0QixFQVF6QyxhQUFhLEVBQWQsR0FBb0IsSUFSc0IsRUFRZDtBQUMzQix5QkFBYSxFQUFkLEdBQW9CLElBVHNCLEVBVXpDLGFBQWMsQ0FBZixHQUFvQixJQVZzQixFQVd6QyxRQUFELEdBQWEsSUFYNkIsRUFZMUMsSUFaMEMsRUFZcEMsSUFab0MsRUFZOUIsSUFaOEIsRUFZeEIsSUFad0IsRUFZakI7QUFDekIsZ0JBYjBDLEVBYXBDLElBYm9DLEVBYTlCLElBYjhCLEVBYXhCLElBYndCLEVBYWpCO0FBQ3pCLGdCQWQwQyxFQWNwQyxJQWRvQyxFQWM5QixJQWQ4QixFQWN4QixJQWR3QixFQWNqQjtBQUN6QixnQkFmMEMsRUFlcEMsSUFmb0MsRUFlOUIsSUFmOEIsRUFleEIsSUFmd0IsRUFnQjFDLElBaEIwQyxFQWdCcEMsSUFoQm9DLEVBZ0I5QixJQWhCOEIsRUFnQnhCLElBaEJ3QixFQWdCakI7QUFDekIsZ0JBakIwQyxFQWlCcEMsSUFqQm9DLEVBaUI5QixJQWpCOEIsRUFpQnhCLElBakJ3QixFQWtCMUMsSUFsQjBDLEVBa0JwQyxJQWxCb0MsRUFrQjlCLElBbEI4QixFQWtCeEIsSUFsQndCLEVBbUIxQyxJQW5CMEMsRUFtQnBDLElBbkJvQyxFQW1COUIsSUFuQjhCLEVBbUJ4QixJQW5Cd0IsRUFvQjFDLElBcEIwQyxFQW9CcEMsSUFwQm9DLEVBb0I5QixJQXBCOEIsRUFvQnhCLElBcEJ3QixFQXFCMUMsSUFyQjBDLEVBcUJwQyxJQXJCb0MsRUFxQjlCLElBckI4QixFQXFCeEIsSUFyQndCLEVBc0IxQyxJQXRCMEMsRUFzQnBDLElBdEJvQyxFQXNCOUIsSUF0QjhCLEVBc0J4QixJQXRCd0IsRUF1QjFDLElBdkIwQyxFQXVCcEMsSUF2Qm9DLEVBdUI5QixJQXZCOEIsRUF1QnhCLElBdkJ3QixFQXdCMUMsSUF4QjBDLEVBd0JwQyxJQXhCb0MsRUF3QjlCLElBeEI4QixFQXdCeEIsSUF4QndCLEVBd0JqQjtBQUN6QixnQkF6QjBDLEVBeUJwQyxJQXpCb0MsRUF5QjlCLElBekI4QixFQXlCeEIsSUF6QndCLEVBeUJqQjtBQUN6QixnQkExQjBDLEVBMEJwQyxJQTFCb0MsRUEwQjlCLElBMUI4QixFQTBCeEIsSUExQndCLEVBMkIxQyxJQTNCMEMsRUEyQnBDLElBM0JvQyxFQTJCOUIsSUEzQjhCLEVBMkJ4QixJQTNCd0IsRUE0QjFDLElBNUIwQyxFQTRCcEMsSUE1Qm9DLEVBNEI5QixJQTVCOEIsRUE0QnhCLElBNUJ3QixFQTZCMUMsSUE3QjBDLEVBNkJwQyxJQTdCb0MsRUE2QjlCLElBN0I4QixFQTZCeEIsSUE3QndCLEVBOEIxQyxJQTlCMEMsRUE4QnBDLElBOUJvQyxFQThCOUIsSUE5QjhCLEVBOEJ4QixJQTlCd0IsRUE4QmpCO0FBQ3pCLGdCQS9CMEMsRUErQnBDLElBL0JvQyxFQStCOUIsSUEvQjhCLEVBK0J4QixJQS9Cd0IsQ0ErQmpCO0FBL0JpQixhQUFmLENBQXhCLENBQVA7QUFpQ0g7O0FBRUQ7Ozs7NkJBQ1ksSSxFQUFNO0FBQ2QsbUJBQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBSSxJQUFKLENBQVMsSUFBVCxDQUF4QixFQUF3QyxJQUFJLElBQUosQ0FBUyxJQUFULENBQXhDLENBQVA7QUFDSDs7QUFFRDs7Ozs2QkFDWSxJLEVBQU07QUFDZCxnQkFBSSxVQUFVLEtBQUssRUFBbkI7QUFBQSxnQkFBdUIsV0FBVyxLQUFLLFFBQXZDO0FBQ0EsZ0JBQUksUUFBUSxLQUFLLFlBQWpCO0FBQUEsZ0JBQStCLFNBQVMsS0FBSyxhQUE3Qzs7QUFFQSxtQkFBTyxJQUFJLEdBQUosQ0FBUSxJQUFJLEtBQUosQ0FBVSxJQUFsQixFQUF3QixJQUFJLFVBQUosQ0FBZSxDQUMxQyxJQUQwQyxFQUNwQyxJQURvQyxFQUM5QixJQUQ4QixFQUN4QixJQUR3QixFQUNqQjtBQUN6QixnQkFGMEMsRUFFcEMsSUFGb0MsRUFFOUIsSUFGOEIsRUFFeEIsSUFGd0IsRUFFakI7QUFDekIsZ0JBSDBDLEVBR3BDLElBSG9DLEVBRzlCLElBSDhCLEVBR3hCLElBSHdCLEVBR2pCO0FBQ3hCLHdCQUFZLEVBQWIsR0FBbUIsSUFKdUIsRUFJaEI7QUFDekIsd0JBQVksRUFBYixHQUFtQixJQUx1QixFQU16QyxZQUFhLENBQWQsR0FBbUIsSUFOdUIsRUFPekMsT0FBRCxHQUFZLElBUDhCLEVBUTFDLElBUjBDLEVBUXBDLElBUm9DLEVBUTlCLElBUjhCLEVBUXhCLElBUndCLEVBUWpCO0FBQ3hCLHlCQUFhLEVBQWQsR0FBb0IsSUFUc0IsRUFTaEI7QUFDekIseUJBQWEsRUFBZCxHQUFvQixJQVZzQixFQVd6QyxhQUFjLENBQWYsR0FBb0IsSUFYc0IsRUFZekMsUUFBRCxHQUFhLElBWjZCLEVBYTFDLElBYjBDLEVBYXBDLElBYm9DLEVBYTlCLElBYjhCLEVBYXhCLElBYndCLEVBYWpCO0FBQ3pCLGdCQWQwQyxFQWNwQyxJQWRvQyxFQWM5QixJQWQ4QixFQWN4QixJQWR3QixFQWUxQyxJQWYwQyxFQWVwQyxJQWZvQyxFQWU5QixJQWY4QixFQWV4QixJQWZ3QixFQWVqQjtBQUN6QixnQkFoQjBDLEVBZ0JwQyxJQWhCb0MsRUFnQjlCLElBaEI4QixFQWdCeEIsSUFoQndCLEVBZ0JqQjtBQUN6QixnQkFqQjBDLEVBaUJwQyxJQWpCb0MsRUFpQjlCLElBakI4QixFQWlCeEIsSUFqQndCLEVBaUJqQjtBQUN6QixnQkFsQjBDLEVBa0JwQyxJQWxCb0MsRUFrQjlCLElBbEI4QixFQWtCeEIsSUFsQndCLEVBbUIxQyxJQW5CMEMsRUFtQnBDLElBbkJvQyxFQW1COUIsSUFuQjhCLEVBbUJ4QixJQW5Cd0IsRUFvQjFDLElBcEIwQyxFQW9CcEMsSUFwQm9DLEVBb0I5QixJQXBCOEIsRUFvQnhCLElBcEJ3QixFQXFCMUMsSUFyQjBDLEVBcUJwQyxJQXJCb0MsRUFxQjlCLElBckI4QixFQXFCeEIsSUFyQndCLEVBc0IxQyxJQXRCMEMsRUFzQnBDLElBdEJvQyxFQXNCOUIsSUF0QjhCLEVBc0J4QixJQXRCd0IsRUF1QjFDLElBdkIwQyxFQXVCcEMsSUF2Qm9DLEVBdUI5QixJQXZCOEIsRUF1QnhCLElBdkJ3QixFQXdCMUMsSUF4QjBDLEVBd0JwQyxJQXhCb0MsRUF3QjlCLElBeEI4QixFQXdCeEIsSUF4QndCLEVBeUIxQyxJQXpCMEMsRUF5QnBDLElBekJvQyxFQXlCOUIsSUF6QjhCLEVBeUJ4QixJQXpCd0IsRUF5QmpCO0FBQ3hCLHNCQUFVLENBQVgsR0FBZ0IsSUExQjBCLEVBMEJqQjtBQUN4QixpQkFBRCxHQUFVLElBM0JnQyxFQTRCMUMsSUE1QjBDLEVBNEJwQyxJQTVCb0MsRUE2QnpDLFdBQVcsQ0FBWixHQUFpQixJQTdCeUIsRUE4QnpDLE1BQUQsR0FBVyxJQTlCK0IsRUErQjFDLElBL0IwQyxFQStCcEMsSUEvQm9DLENBQWYsQ0FBeEIsQ0FBUDtBQWlDSDs7QUFFRDs7Ozs2QkFDWSxJLEVBQU07QUFDZCxtQkFBTyxJQUFJLEdBQUosQ0FBUSxJQUFJLEtBQUosQ0FBVSxJQUFsQixFQUF3QixJQUFJLElBQUosQ0FBUyxJQUFULENBQXhCLEVBQXdDLElBQUksSUFBSixDQUFTLElBQVQsQ0FBeEMsRUFBd0QsSUFBSSxJQUFKLENBQVMsSUFBVCxDQUF4RCxDQUFQO0FBQ0g7O0FBRUQ7Ozs7NkJBQ1ksSSxFQUFNO0FBQ2QsZ0JBQUksWUFBWSxLQUFLLFNBQXJCO0FBQ0EsZ0JBQUksV0FBVyxLQUFLLFFBQXBCO0FBQ0EsbUJBQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBSSxVQUFKLENBQWUsQ0FDMUMsSUFEMEMsRUFDcEMsSUFEb0MsRUFDOUIsSUFEOEIsRUFDeEIsSUFEd0IsRUFDakI7QUFDekIsZ0JBRjBDLEVBRXBDLElBRm9DLEVBRTlCLElBRjhCLEVBRXhCLElBRndCLEVBRWpCO0FBQ3pCLGdCQUgwQyxFQUdwQyxJQUhvQyxFQUc5QixJQUg4QixFQUd4QixJQUh3QixFQUdqQjtBQUN4QiwwQkFBYyxFQUFmLEdBQXFCLElBSnFCLEVBSWQ7QUFDM0IsMEJBQWMsRUFBZixHQUFxQixJQUxxQixFQU16QyxjQUFlLENBQWhCLEdBQXFCLElBTnFCLEVBT3pDLFNBQUQsR0FBYyxJQVA0QixFQVF6QyxhQUFhLEVBQWQsR0FBb0IsSUFSc0IsRUFRZDtBQUMzQix5QkFBYSxFQUFkLEdBQW9CLElBVHNCLEVBVXpDLGFBQWMsQ0FBZixHQUFvQixJQVZzQixFQVd6QyxRQUFELEdBQWEsSUFYNkIsRUFZMUMsSUFaMEMsRUFZcEMsSUFab0MsRUFZbEI7QUFDeEIsZ0JBYjBDLEVBYXBDLElBYm9DLENBYWxCO0FBYmtCLGFBQWYsQ0FBeEIsQ0FBUDtBQWVIOztBQUVEOzs7OzZCQUNZLEksRUFBTTtBQUNkLGdCQUFJLE9BQU8sSUFBWDtBQUNBLGdCQUFJLEtBQUssSUFBTCxLQUFjLE9BQWxCLEVBQTJCO0FBQ3ZCLHVCQUFPLElBQUksU0FBSixDQUFjLFVBQXJCO0FBQ0gsYUFGRCxNQUVPO0FBQ0gsdUJBQU8sSUFBSSxTQUFKLENBQWMsVUFBckI7QUFDSDtBQUNELG1CQUFPLElBQUksR0FBSixDQUFRLElBQUksS0FBSixDQUFVLElBQWxCLEVBQXdCLElBQXhCLENBQVA7QUFDSDs7QUFFRDs7Ozs2QkFDWSxJLEVBQU07QUFDZCxnQkFBSSxPQUFPLElBQVg7QUFDQSxnQkFBSSxLQUFLLElBQUwsS0FBYyxPQUFsQixFQUEyQjtBQUN2Qix1QkFBTyxJQUFJLEdBQUosQ0FBUSxJQUFJLEtBQUosQ0FBVSxJQUFsQixFQUF3QixJQUFJLFNBQUosQ0FBYyxJQUF0QyxDQUFQO0FBQ0gsYUFGRCxNQUVPO0FBQ0gsdUJBQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBSSxTQUFKLENBQWMsSUFBdEMsQ0FBUDtBQUNIO0FBQ0QsbUJBQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBeEIsRUFBOEIsSUFBSSxJQUFKLEVBQTlCLEVBQTBDLElBQUksSUFBSixDQUFTLElBQVQsQ0FBMUMsQ0FBUDtBQUNIOztBQUVEOzs7OytCQUNjO0FBQ1YsZ0JBQUksU0FBUyxJQUFJLEdBQUosQ0FBUSxJQUFJLEtBQUosQ0FBVSxJQUFsQixFQUNULElBQUksR0FBSixDQUFRLElBQUksS0FBSixDQUFVLElBQWxCLEVBQXdCLElBQUksU0FBSixDQUFjLElBQXRDLENBRFMsQ0FBYjtBQUdBLG1CQUFPLE1BQVA7QUFDSDs7QUFFRDs7Ozs2QkFDWSxJLEVBQU07QUFDZCxnQkFBSSxTQUFTLElBQUksR0FBSixDQUFRLElBQUksS0FBSixDQUFVLElBQWxCLEVBQXlCO0FBQ2xDLGdCQUFJLElBQUosQ0FBUyxJQUFULENBRFMsRUFDUTtBQUNqQixnQkFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBSSxTQUFKLENBQWMsSUFBdEMsQ0FGUyxFQUVxQztBQUM5QyxnQkFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBSSxTQUFKLENBQWMsSUFBdEMsQ0FIUyxFQUdxQztBQUM5QyxnQkFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBSSxTQUFKLENBQWMsSUFBdEMsQ0FKUyxFQUlxQztBQUM5QyxnQkFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBSSxTQUFKLENBQWMsSUFBdEMsQ0FBOEM7QUFBOUMsYUFMUyxDQUFiO0FBT0EsbUJBQU8sTUFBUDtBQUNIOztBQUVEOzs7OzZCQUNZLEksRUFBTTtBQUNkLGdCQUFJLEtBQUssSUFBTCxLQUFjLE9BQWxCLEVBQTJCO0FBQ3ZCLG9CQUFJLEtBQUssS0FBTCxLQUFlLEtBQW5CLEVBQTBCO0FBQ3RCLDJCQUFPLElBQUksR0FBSixDQUFRLElBQUksS0FBSixDQUFVLElBQWxCLEVBQXdCLElBQUksU0FBSixDQUFjLFdBQXRDLEVBQW1ELElBQUksR0FBSixDQUFRLElBQVIsQ0FBbkQsQ0FBUDtBQUNIO0FBQ0Q7QUFDQSx1QkFBTyxJQUFJLEdBQUosQ0FBUSxJQUFJLEtBQUosQ0FBVSxJQUFsQixFQUF3QixJQUFJLFNBQUosQ0FBYyxXQUF0QyxFQUFtRCxJQUFJLElBQUosQ0FBUyxJQUFULENBQW5ELENBQVA7QUFDSCxhQU5ELE1BTU87QUFDSCx1QkFBTyxJQUFJLEdBQUosQ0FBUSxJQUFJLEtBQUosQ0FBVSxJQUFsQixFQUF3QixJQUFJLFNBQUosQ0FBYyxXQUF0QyxFQUFtRCxJQUFJLElBQUosQ0FBUyxJQUFULENBQW5ELENBQVA7QUFDSDtBQUNKOzs7NEJBRVUsSSxFQUFNO0FBQ2IsZ0JBQUksZUFBZSxLQUFLLFlBQXhCO0FBQ0EsZ0JBQUksYUFBYSxLQUFLLGVBQXRCOztBQUVBLGdCQUFJLE9BQU8sSUFBSSxVQUFKLENBQWUsQ0FDdEIsSUFEc0IsRUFDaEIsSUFEZ0IsRUFDVixJQURVLEVBQ0osSUFESSxFQUNHO0FBQ3pCLGdCQUZzQixFQUVoQixJQUZnQixFQUVWLElBRlUsRUFFSixJQUZJLEVBRUc7QUFDekIsZ0JBSHNCLEVBR2hCLElBSGdCLEVBR1YsSUFIVSxFQUdKLElBSEksRUFHRztBQUN6QixnQkFKc0IsRUFJaEIsSUFKZ0IsRUFJVixJQUpVLEVBSUosSUFKSSxFQUt0QixJQUxzQixFQUtoQixZQUxnQixFQUtHO0FBQ3pCLGdCQU5zQixFQU1oQixJQU5nQixFQU1HO0FBQ3pCLGdCQVBzQixFQU9oQixJQVBnQixFQU9WLElBUFUsRUFPSixJQVBJLEVBT0c7QUFDeEIsMkJBQWUsQ0FBaEIsR0FBcUIsSUFSQyxFQVFNO0FBQzNCLHNCQUFELEdBQWUsSUFUTyxFQVV0QixJQVZzQixFQVVoQixJQVZnQixDQUFmLENBQVg7O0FBYUEsbUJBQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsTUFBVixDQUFSLEVBQTJCLElBQTNCLENBQVA7QUFDSDs7OzZCQUVXLEksRUFBTTtBQUNkLGdCQUFJLGVBQWUsS0FBSyxZQUF4QjtBQUNBLGdCQUFJLGFBQWEsS0FBSyxlQUF0Qjs7QUFFQSxnQkFBSSxPQUFPLElBQUksVUFBSixDQUFlLENBQ3RCLElBRHNCLEVBQ2hCLElBRGdCLEVBQ1YsSUFEVSxFQUNKLElBREksRUFDRztBQUN6QixnQkFGc0IsRUFFaEIsSUFGZ0IsRUFFVixJQUZVLEVBRUosSUFGSSxFQUVHO0FBQ3pCLGdCQUhzQixFQUdoQixJQUhnQixFQUdWLElBSFUsRUFHSixJQUhJLEVBR0c7QUFDekIsZ0JBSnNCLEVBSWhCLElBSmdCLEVBSVYsSUFKVSxFQUlKLElBSkksRUFLdEIsSUFMc0IsRUFLaEIsWUFMZ0IsRUFLRztBQUN6QixnQkFOc0IsRUFNaEIsSUFOZ0IsRUFNRztBQUN6QixnQkFQc0IsRUFPaEIsSUFQZ0IsRUFPVixJQVBVLEVBT0osSUFQSSxFQU9HO0FBQ3hCLDJCQUFlLENBQWhCLEdBQXFCLElBUkMsRUFRTTtBQUMzQixzQkFBRCxHQUFlLElBVE8sRUFVdEIsSUFWc0IsRUFVaEIsSUFWZ0IsQ0FBZixDQUFYOztBQWFBLG1CQUFPLElBQUksR0FBSixDQUFRLElBQUksS0FBSixDQUFVLElBQWxCLEVBQXdCLElBQXhCLEVBQThCLElBQUksSUFBSixDQUFTLElBQVQsQ0FBOUIsQ0FBUDtBQUNIOzs7NkJBRVcsSSxFQUFNO0FBQ2QsZ0JBQUksU0FBUyxLQUFLLE1BQUwsSUFBZSxFQUE1QjtBQUNBLGdCQUFJLGFBQWEsT0FBTyxNQUF4QjtBQUNBLGdCQUFJLE9BQU8sSUFBSSxVQUFKLENBQWUsQ0FDdEIsSUFEc0IsRUFDaEIsSUFEZ0IsRUFDVixJQURVLEVBQ0osSUFESSxFQUNHOztBQUV6QixnQkFIc0IsRUFHRztBQUN6QixtQkFBTyxVQUplLEVBSUc7QUFDekIsZ0JBTHNCLEVBS2hCLElBTGdCLEVBS0c7QUFDekIsZ0JBTnNCLEVBTUc7O0FBRXpCLGdCQVJzQixFQVFHO0FBQ3pCLG1CQUFPLFVBVGUsRUFTRztBQUN6QixnQkFWc0IsRUFVRztBQUN6QixnQkFYc0IsRUFXRztBQUN6QixnQkFac0IsRUFZaEIsSUFaZ0IsRUFZVixJQVpVLEVBWUc7QUFDekIsZ0JBYnNCLEVBYWhCLElBYmdCLEVBYVYsSUFiVSxFQWFKLElBYkksRUFhRztBQUN6QixnQkFkc0IsRUFjaEIsSUFkZ0IsRUFjVixJQWRVLEVBY0osSUFkSSxFQWNHOztBQUV6QixnQkFoQnNCLENBZ0JHO0FBaEJILGNBaUJ4QixNQWpCd0IsQ0FpQmpCLENBQ0wsVUFESyxDQWpCaUIsRUFtQnZCLE1BbkJ1QixDQW9CdEIsTUFwQnNCLEVBcUJ4QixNQXJCd0IsQ0FxQmpCLENBQ0wsSUFESyxFQUNDLElBREQsRUFDTyxJQURQLENBQ29CO0FBRHBCLGFBckJpQixDQUFmLENBQVg7QUF3QkEsbUJBQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBeEIsQ0FBUDtBQUNIOzs7NkJBRVcsSSxFQUFNO0FBQ2QsZ0JBQUksT0FBTyxLQUFLLElBQWhCO0FBQ0EsZ0JBQUksUUFBUSxLQUFLLFVBQWpCO0FBQUEsZ0JBQTZCLFNBQVMsS0FBSyxXQUEzQzs7QUFFQSxnQkFBSSxPQUFPLElBQUksVUFBSixDQUFlLENBQ3RCLElBRHNCLEVBQ2hCLElBRGdCLEVBQ1YsSUFEVSxFQUNKLElBREksRUFDRztBQUN6QixnQkFGc0IsRUFFaEIsSUFGZ0IsRUFFVixJQUZVLEVBRUosSUFGSSxFQUVHO0FBQ3pCLGdCQUhzQixFQUdoQixJQUhnQixFQUdWLElBSFUsRUFHSixJQUhJLEVBR0c7QUFDekIsZ0JBSnNCLEVBSWhCLElBSmdCLEVBSVYsSUFKVSxFQUlKLElBSkksRUFJRztBQUN6QixnQkFMc0IsRUFLaEIsSUFMZ0IsRUFLVixJQUxVLEVBS0osSUFMSSxFQU10QixJQU5zQixFQU1oQixJQU5nQixFQU1WLElBTlUsRUFNSixJQU5JLEVBT3JCLFVBQVUsQ0FBWCxHQUFnQixJQVBNLEVBT0c7QUFDeEIsaUJBQUQsR0FBVSxJQVJZLEVBU3JCLFdBQVcsQ0FBWixHQUFpQixJQVRLLEVBU0c7QUFDeEIsa0JBQUQsR0FBVyxJQVZXLEVBV3RCLElBWHNCLEVBV2hCLElBWGdCLEVBV1YsSUFYVSxFQVdKLElBWEksRUFXRztBQUN6QixnQkFac0IsRUFZaEIsSUFaZ0IsRUFZVixJQVpVLEVBWUosSUFaSSxFQVlHO0FBQ3pCLGdCQWJzQixFQWFoQixJQWJnQixFQWFWLElBYlUsRUFhSixJQWJJLEVBYUc7QUFDekIsZ0JBZHNCLEVBY2hCLElBZGdCLEVBY0c7QUFDekIsZ0JBZnNCLEVBZUc7QUFDekIsZ0JBaEJzQixFQWdCaEIsSUFoQmdCLEVBZ0JWLElBaEJVLEVBZ0JKLElBaEJJLEVBZ0JHO0FBQ3pCLGdCQWpCc0IsRUFpQmhCLElBakJnQixFQWlCVixJQWpCVSxFQWlCSixJQWpCSSxFQWtCdEIsSUFsQnNCLEVBa0JoQixJQWxCZ0IsRUFrQlYsSUFsQlUsRUFrQkosSUFsQkksRUFtQnRCLElBbkJzQixFQW1CaEIsSUFuQmdCLEVBbUJWLElBbkJVLEVBbUJKLElBbkJJLEVBb0J0QixJQXBCc0IsRUFvQmhCLElBcEJnQixFQW9CVixJQXBCVSxFQW9CSixJQXBCSSxFQXFCdEIsSUFyQnNCLEVBcUJoQixJQXJCZ0IsRUFxQlYsSUFyQlUsRUFxQkosSUFyQkksRUFzQnRCLElBdEJzQixFQXNCaEIsSUF0QmdCLEVBc0JWLElBdEJVLEVBc0JKLElBdEJJLEVBdUJ0QixJQXZCc0IsRUF1QmhCLElBdkJnQixFQXVCVixJQXZCVSxFQXdCdEIsSUF4QnNCLEVBd0JoQixJQXhCZ0IsRUF3Qkc7QUFDekIsZ0JBekJzQixFQXlCaEIsSUF6QmdCLENBeUJHO0FBekJILGFBQWYsQ0FBWDtBQTJCQSxtQkFBTyxJQUFJLEdBQUosQ0FBUSxJQUFJLEtBQUosQ0FBVSxJQUFsQixFQUF3QixJQUF4QixFQUE4QixJQUFJLEdBQUosQ0FBUSxJQUFJLEtBQUosQ0FBVSxJQUFsQixFQUF3QixJQUF4QixDQUE5QixDQUFQO0FBQ0g7O0FBRUQ7Ozs7NkJBQ1ksSSxFQUFNO0FBQ2QsbUJBQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBSSxJQUFKLENBQVMsSUFBVCxDQUF4QixDQUFQO0FBQ0g7O0FBRUQ7Ozs7NkJBQ1ksSSxFQUFNO0FBQ2QsZ0JBQUksVUFBVSxLQUFLLEVBQW5CO0FBQ0EsZ0JBQUksT0FBTyxJQUFJLFVBQUosQ0FBZSxDQUN0QixJQURzQixFQUNoQixJQURnQixFQUNWLElBRFUsRUFDSixJQURJLEVBQ0c7QUFDeEIsd0JBQVksRUFBYixHQUFtQixJQUZHLEVBRUc7QUFDeEIsd0JBQVksRUFBYixHQUFtQixJQUhHLEVBSXJCLFlBQWEsQ0FBZCxHQUFtQixJQUpHLEVBS3JCLE9BQUQsR0FBWSxJQUxVLEVBTXRCLElBTnNCLEVBTWhCLElBTmdCLEVBTVYsSUFOVSxFQU1KLElBTkksRUFNRztBQUN6QixnQkFQc0IsRUFPaEIsSUFQZ0IsRUFPVixJQVBVLEVBT0osSUFQSSxFQU9HO0FBQ3pCLGdCQVJzQixFQVFoQixJQVJnQixFQVFWLElBUlUsRUFRSixJQVJJLEVBUUc7QUFDekIsZ0JBVHNCLEVBU2hCLElBVGdCLEVBU1YsSUFUVSxFQVNKLElBVEksQ0FTRztBQVRILGFBQWYsQ0FBWDtBQVdBLG1CQUFPLElBQUksR0FBSixDQUFRLElBQUksS0FBSixDQUFVLElBQWxCLEVBQXdCLElBQXhCLENBQVA7QUFDSDs7QUFFRDs7Ozs2QkFDWSxLLEVBQU8sbUIsRUFBcUI7QUFDcEMsbUJBQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBSSxJQUFKLENBQVMsTUFBTSxjQUFmLENBQXhCLEVBQXdELElBQUksSUFBSixDQUFTLEtBQVQsRUFBZ0IsbUJBQWhCLENBQXhELENBQVA7QUFDSDs7OzZCQUVXLGMsRUFBZ0I7QUFDeEIsZ0JBQUksT0FBTyxJQUFJLFVBQUosQ0FBZSxDQUN0QixJQURzQixFQUNoQixJQURnQixFQUNWLElBRFUsRUFDSixJQURJLEVBRXJCLG1CQUFtQixFQUFwQixHQUEwQixJQUZKLEVBRVc7QUFDaEMsK0JBQW1CLEVBQXBCLEdBQTBCLElBSEosRUFJckIsbUJBQW9CLENBQXJCLEdBQTBCLElBSkosRUFLckIsY0FBRCxHQUFtQixJQUxHLENBQWYsQ0FBWDtBQU9BLG1CQUFPLElBQUksR0FBSixDQUFRLElBQUksS0FBSixDQUFVLElBQWxCLEVBQXdCLElBQXhCLENBQVA7QUFDSDs7QUFFRDs7Ozs2QkFDWSxLLEVBQU8sbUIsRUFBcUI7QUFDcEMsZ0JBQUksVUFBVSxNQUFNLEVBQXBCOztBQUVBO0FBQ0EsZ0JBQUksT0FBTyxJQUFJLEdBQUosQ0FBUSxJQUFJLEtBQUosQ0FBVSxJQUFsQixFQUF3QixJQUFJLFVBQUosQ0FBZSxDQUM5QyxJQUQ4QyxFQUN4QyxJQUR3QyxFQUNsQyxJQURrQyxFQUM1QixJQUQ0QixFQUNyQjtBQUN4Qix3QkFBWSxFQUFiLEdBQW1CLElBRjJCLEVBRXJCO0FBQ3hCLHdCQUFZLEVBQWIsR0FBbUIsSUFIMkIsRUFJN0MsWUFBYSxDQUFkLEdBQW1CLElBSjJCLEVBSzdDLE9BQUQsR0FBWSxJQUxrQyxDQUFmLENBQXhCLENBQVg7QUFPQTtBQUNBLGdCQUFJLE9BQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBSSxVQUFKLENBQWUsQ0FDOUMsSUFEOEMsRUFDeEMsSUFEd0MsRUFDbEMsSUFEa0MsRUFDNUIsSUFENEIsRUFDckI7QUFDeEIsb0NBQXdCLEVBQXpCLEdBQStCLElBRmUsRUFFUjtBQUNyQyxvQ0FBd0IsRUFBekIsR0FBK0IsSUFIZSxFQUk3Qyx3QkFBeUIsQ0FBMUIsR0FBK0IsSUFKZSxFQUs3QyxtQkFBRCxHQUF3QixJQUxzQixDQUFmLENBQXhCLENBQVg7QUFPQSxnQkFBSSxPQUFPLElBQUksSUFBSixDQUFTLEtBQVQsQ0FBWDtBQUNBLGdCQUFJLE9BQU8sSUFBSSxJQUFKLENBQVMsS0FBVCxFQUFnQixLQUFLLFVBQUwsR0FBa0IsRUFBbEIsR0FBdUIsRUFBdkIsR0FBNEIsQ0FBNUIsR0FBZ0MsRUFBaEMsR0FBcUMsQ0FBckMsR0FBeUMsQ0FBekQsQ0FBWDs7QUFFQSxtQkFBTyxJQUFJLEdBQUosQ0FBUSxJQUFJLEtBQUosQ0FBVSxJQUFsQixFQUF3QixJQUF4QixFQUE4QixJQUE5QixFQUFvQyxJQUFwQyxFQUEwQyxJQUExQyxDQUFQO0FBQ0g7O0FBRUQ7Ozs7NkJBQ1ksSyxFQUFPO0FBQ2YsZ0JBQUksVUFBVSxNQUFNLE9BQU4sSUFBaUIsRUFBL0I7QUFDQSxnQkFBSSxjQUFjLFFBQVEsTUFBMUI7QUFDQSxnQkFBSSxPQUFPLElBQUksVUFBSixDQUFlLElBQUksV0FBbkIsQ0FBWDtBQUNBO0FBQ0EsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxXQUFwQixFQUFpQyxHQUFqQyxFQUFzQztBQUNsQyxvQkFBSSxRQUFRLFFBQVEsQ0FBUixFQUFXLEtBQXZCO0FBQ0EscUJBQUssSUFBSSxDQUFULElBQWUsTUFBTSxTQUFOLElBQW1CLENBQXBCLEdBQTBCO0FBQ3pCLHNCQUFNLFNBQU4sSUFBbUIsQ0FEcEIsQ0FDMEI7QUFEMUIsa0JBRUMsTUFBTSxZQUFOLElBQXNCLENBRnZCLENBRTBCO0FBRjFCLGtCQUdDLE1BQU0sYUFIckIsQ0FGa0MsQ0FLTTtBQUMzQztBQUNELG1CQUFPLElBQUksR0FBSixDQUFRLElBQUksS0FBSixDQUFVLElBQWxCLEVBQXdCLElBQXhCLENBQVA7QUFDSDs7QUFFRDs7Ozs2QkFDWSxLLEVBQU8sTSxFQUFRO0FBQ3ZCLGdCQUFJLFVBQVUsTUFBTSxPQUFOLElBQWlCLEVBQS9CO0FBQ0EsZ0JBQUksY0FBYyxRQUFRLE1BQTFCO0FBQ0EsZ0JBQUksV0FBVyxLQUFLLEtBQUssV0FBekI7QUFDQSxnQkFBSSxPQUFPLElBQUksVUFBSixDQUFlLFFBQWYsQ0FBWDtBQUNBLHNCQUFVLElBQUksUUFBZDs7QUFFQSxpQkFBSyxHQUFMLENBQVMsQ0FDTCxJQURLLEVBQ0MsSUFERCxFQUNPLElBRFAsRUFDYSxJQURiLEVBQ3dCO0FBQzVCLDRCQUFnQixFQUFqQixHQUF1QixJQUZsQixFQUV3QjtBQUM1Qiw0QkFBZ0IsRUFBakIsR0FBdUIsSUFIbEIsRUFJSixnQkFBaUIsQ0FBbEIsR0FBdUIsSUFKbEIsRUFLSixXQUFELEdBQWdCLElBTFgsRUFNSixXQUFXLEVBQVosR0FBa0IsSUFOYixFQU13QjtBQUM1Qix1QkFBVyxFQUFaLEdBQWtCLElBUGIsRUFRSixXQUFZLENBQWIsR0FBa0IsSUFSYixFQVNKLE1BQUQsR0FBVyxJQVROLENBQVQsRUFVRyxDQVZIOztBQVlBLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksV0FBcEIsRUFBaUMsR0FBakMsRUFBc0M7QUFDbEMsb0JBQUksV0FBVyxRQUFRLENBQVIsRUFBVyxRQUExQjtBQUNBLG9CQUFJLE9BQU8sUUFBUSxDQUFSLEVBQVcsSUFBdEI7QUFDQSxvQkFBSSxRQUFRLFFBQVEsQ0FBUixFQUFXLEtBQXZCO0FBQ0Esb0JBQUksTUFBTSxRQUFRLENBQVIsRUFBVyxHQUFyQjtBQUNBLHFCQUFLLEdBQUwsQ0FBUyxDQUNKLGFBQWEsRUFBZCxHQUFvQixJQURmLEVBQ3NCO0FBQzFCLDZCQUFhLEVBQWQsR0FBb0IsSUFGZixFQUdKLGFBQWMsQ0FBZixHQUFvQixJQUhmLEVBSUosUUFBRCxHQUFhLElBSlIsRUFLSixTQUFTLEVBQVYsR0FBZ0IsSUFMWCxFQUtzQjtBQUMxQix5QkFBUyxFQUFWLEdBQWdCLElBTlgsRUFPSixTQUFVLENBQVgsR0FBZ0IsSUFQWCxFQVFKLElBQUQsR0FBUyxJQVJKLEVBU0osTUFBTSxTQUFOLElBQW1CLENBQXBCLEdBQXlCLE1BQU0sU0FUMUIsRUFTc0M7QUFDMUMsc0JBQU0sWUFBTixJQUFzQixDQUF2QixHQUE2QixNQUFNLGFBQU4sSUFBdUIsQ0FBcEQsR0FBeUQsTUFBTSxTQVYxRCxFQVdMLElBWEssRUFXQyxJQVhELEVBV3NCO0FBQzFCLHdCQUFRLEVBQVQsR0FBZSxJQVpWLEVBWXNCO0FBQzFCLHdCQUFRLEVBQVQsR0FBZSxJQWJWLEVBY0osUUFBUyxDQUFWLEdBQWUsSUFkVixFQWVKLEdBQUQsR0FBUSxJQWZILENBQVQsRUFnQkcsS0FBSyxLQUFLLENBaEJiO0FBaUJIO0FBQ0QsbUJBQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBeEIsQ0FBUDtBQUNIOzs7NkJBRVcsSSxFQUFNO0FBQ2QsbUJBQU8sSUFBSSxHQUFKLENBQVEsSUFBSSxLQUFKLENBQVUsSUFBbEIsRUFBd0IsSUFBeEIsQ0FBUDtBQUNIOzs7Ozs7QUFJTCxJQUFJLElBQUo7O2tCQUVlLEc7Ozs7Ozs7OztxakJDeGpCZjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7OztBQUdBO0lBQ00sVTtBQUVGLHdCQUFZLE1BQVosRUFBb0I7QUFBQTs7QUFDaEIsYUFBSyxHQUFMLEdBQVcsWUFBWDs7QUFFQSxhQUFLLE9BQUwsR0FBZSxNQUFmO0FBQ0EsYUFBSyxPQUFMLEdBQWdCLE9BQU8sTUFBUCxLQUFrQixJQUFuQixHQUEyQixJQUEzQixHQUFrQyxLQUFqRDs7QUFFQSxhQUFLLFFBQUwsR0FBZ0IsQ0FBQyxDQUFqQjtBQUNBLGFBQUssY0FBTCxHQUFzQixLQUF0QjtBQUNBLGFBQUssYUFBTCxHQUFxQixRQUFyQjtBQUNBLGFBQUssYUFBTCxHQUFxQixRQUFyQjtBQUNBLGFBQUssYUFBTCxHQUFxQixTQUFyQjtBQUNBLGFBQUssYUFBTCxHQUFxQixTQUFyQjtBQUNBLGFBQUssdUJBQUwsR0FBK0IsSUFBL0I7QUFDQSxhQUFLLHVCQUFMLEdBQStCLElBQS9COztBQUVBLGFBQUssVUFBTCxHQUFrQixJQUFsQjtBQUNBLGFBQUssVUFBTCxHQUFrQixJQUFsQjs7QUFFQSxhQUFLLHFCQUFMLEdBQTZCLDJDQUF5QixPQUF6QixDQUE3QjtBQUNBLGFBQUsscUJBQUwsR0FBNkIsMkNBQXlCLE9BQXpCLENBQTdCOztBQUVBLGFBQUssY0FBTCxHQUFzQixJQUF0QjtBQUNBLGFBQUssZUFBTCxHQUF1QixJQUF2Qjs7QUFFQTtBQUNBO0FBQ0EsYUFBSyxjQUFMLEdBQXVCLGtCQUFRLE1BQVIsS0FDQSxrQkFBUSxPQUFSLENBQWdCLEtBQWhCLEdBQXdCLEVBQXhCLElBQ0Esa0JBQVEsT0FBUixDQUFnQixLQUFoQixLQUEwQixFQUExQixJQUFnQyxrQkFBUSxPQUFSLENBQWdCLEtBQWhCLEdBQXdCLElBRnhELENBQUQsR0FFbUUsSUFGbkUsR0FFMEUsS0FGaEc7O0FBSUE7QUFDQTtBQUNBLGFBQUssb0JBQUwsR0FBNkIsa0JBQVEsTUFBUixJQUFrQixrQkFBUSxJQUF2RDs7QUFFQTtBQUNBLGFBQUssZ0JBQUwsR0FBd0IsQ0FBQyxrQkFBUSxPQUFqQzs7QUFFQSxhQUFLLHNCQUFMLEdBQThCLEtBQUssT0FBTCxDQUFhLG9CQUEzQztBQUNIOzs7O2tDQUVTO0FBQ04saUJBQUssUUFBTCxHQUFnQixDQUFDLENBQWpCO0FBQ0EsaUJBQUssY0FBTCxHQUFzQixLQUF0QjtBQUNBLGlCQUFLLFVBQUwsR0FBa0IsSUFBbEI7QUFDQSxpQkFBSyxVQUFMLEdBQWtCLElBQWxCO0FBQ0EsaUJBQUsscUJBQUwsQ0FBMkIsS0FBM0I7QUFDQSxpQkFBSyxxQkFBTCxHQUE2QixJQUE3QjtBQUNBLGlCQUFLLHFCQUFMLENBQTJCLEtBQTNCO0FBQ0EsaUJBQUsscUJBQUwsR0FBNkIsSUFBN0I7QUFDQSxpQkFBSyxjQUFMLEdBQXNCLElBQXRCO0FBQ0EsaUJBQUssZUFBTCxHQUF1QixJQUF2QjtBQUNIOzs7dUNBRWMsUSxFQUFVO0FBQ3JCLHFCQUFTLGVBQVQsR0FBMkIsS0FBSyxLQUFMLENBQVcsSUFBWCxDQUFnQixJQUFoQixDQUEzQjtBQUNBLHFCQUFTLGVBQVQsR0FBMkIsS0FBSyx3QkFBTCxDQUE4QixJQUE5QixDQUFtQyxJQUFuQyxDQUEzQjtBQUNBLG1CQUFPLElBQVA7QUFDSDs7QUFFRDs7Ozs7Ozs7Ozs7OENBZ0NzQjtBQUNsQixpQkFBSyxhQUFMLEdBQXFCLEtBQUssYUFBTCxHQUFxQixTQUExQztBQUNIOzs7NkJBRUksVyxFQUFhO0FBQ2QsaUJBQUssdUJBQUwsR0FBK0IsSUFBL0I7QUFDQSxpQkFBSyx1QkFBTCxHQUErQixJQUEvQjtBQUNBLGlCQUFLLHFCQUFMLENBQTJCLEtBQTNCO0FBQ0EsaUJBQUsscUJBQUwsQ0FBMkIsS0FBM0I7QUFDSDs7OzhCQUVLLFUsRUFBWSxVLEVBQVk7QUFDMUIsZ0JBQUksQ0FBQyxLQUFLLGVBQVYsRUFBMkI7QUFDdkIsc0JBQU0scUNBQTBCLHlEQUExQixDQUFOO0FBQ0g7QUFDRCxnQkFBSSxDQUFDLEtBQUssY0FBVixFQUEwQjtBQUN0QixxQkFBSyxpQkFBTCxDQUF1QixVQUF2QixFQUFtQyxVQUFuQztBQUNIO0FBQ0QsaUJBQUssV0FBTCxDQUFpQixVQUFqQjtBQUNBLGlCQUFLLFdBQUwsQ0FBaUIsVUFBakI7QUFDSDs7O2lEQUV3QixJLEVBQU0sUSxFQUFVO0FBQ3JDLGdCQUFJLFVBQVUsSUFBZDs7QUFFQSxnQkFBSSxZQUFZLEtBQWhCO0FBQ0EsZ0JBQUksUUFBUSxTQUFTLEtBQXJCOztBQUVBLGdCQUFJLFNBQVMsT0FBYixFQUFzQjtBQUNsQixxQkFBSyxVQUFMLEdBQWtCLFFBQWxCO0FBQ0Esb0JBQUksU0FBUyxLQUFULEtBQW1CLEtBQW5CLElBQTRCLEtBQUssZ0JBQXJDLEVBQXVEO0FBQ25EO0FBQ0EsZ0NBQVksTUFBWjtBQUNBLDRCQUFRLEVBQVI7QUFDQSw4QkFBVSxJQUFJLFVBQUosRUFBVjtBQUNILGlCQUxELE1BS087QUFDSDtBQUNBLDhCQUFVLHVCQUFJLG1CQUFKLENBQXdCLFFBQXhCLENBQVY7QUFDSDtBQUNKLGFBWEQsTUFXTyxJQUFJLFNBQVMsT0FBYixFQUFzQjtBQUN6QixxQkFBSyxVQUFMLEdBQWtCLFFBQWxCO0FBQ0EsMEJBQVUsdUJBQUksbUJBQUosQ0FBd0IsUUFBeEIsQ0FBVjtBQUNILGFBSE0sTUFHQTtBQUNIO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBSSxDQUFDLEtBQUssY0FBVixFQUEwQjtBQUN0QixzQkFBTSxxQ0FBMEIsdURBQTFCLENBQU47QUFDSDtBQUNELGlCQUFLLGNBQUwsQ0FBb0IsSUFBcEIsRUFBMEI7QUFDdEIsc0JBQU0sSUFEZ0I7QUFFdEIsc0JBQU0sUUFBUSxNQUZRO0FBR3RCLHVCQUFPLEtBSGU7QUFJdEIsMkJBQWMsSUFBZCxTQUFzQixTQUpBO0FBS3RCLCtCQUFlLFNBQVMsUUFMRixDQUtZO0FBTFosYUFBMUI7QUFPSDs7OzBDQUVpQixVLEVBQVksVSxFQUFZO0FBQ3RDLGdCQUFJLEtBQUssY0FBVCxFQUF5QjtBQUNyQjtBQUNIOztBQUVELGdCQUFJLFdBQVcsT0FBWCxJQUFzQixXQUFXLE9BQVgsQ0FBbUIsTUFBN0MsRUFBcUQ7QUFDakQscUJBQUssYUFBTCxHQUFxQixXQUFXLE9BQVgsQ0FBbUIsQ0FBbkIsRUFBc0IsR0FBM0M7QUFDSDtBQUNELGdCQUFJLFdBQVcsT0FBWCxJQUFzQixXQUFXLE9BQVgsQ0FBbUIsTUFBN0MsRUFBcUQ7QUFDakQscUJBQUssYUFBTCxHQUFxQixXQUFXLE9BQVgsQ0FBbUIsQ0FBbkIsRUFBc0IsR0FBM0M7QUFDSDs7QUFFRCxpQkFBSyxRQUFMLEdBQWdCLEtBQUssR0FBTCxDQUFTLEtBQUssYUFBZCxFQUE2QixLQUFLLGFBQWxDLENBQWhCO0FBQ0EsaUJBQUssY0FBTCxHQUFzQixJQUF0QjtBQUNIOzs7OENBRXFCO0FBQ2xCLGdCQUFJLGNBQWMsS0FBSyx1QkFBdkI7QUFDQSxnQkFBSSxjQUFjLEtBQUssdUJBQXZCOztBQUVBLGdCQUFJLGFBQWE7QUFDYixzQkFBTSxPQURPO0FBRWIsb0JBQUksQ0FGUztBQUdiLGdDQUFnQixDQUhIO0FBSWIseUJBQVMsRUFKSTtBQUtiLHdCQUFRO0FBTEssYUFBakI7O0FBUUEsZ0JBQUksZUFBZSxJQUFuQixFQUF5QjtBQUNyQiwyQkFBVyxPQUFYLENBQW1CLElBQW5CLENBQXdCLFdBQXhCO0FBQ0EsMkJBQVcsTUFBWCxHQUFvQixZQUFZLE1BQWhDO0FBQ0g7O0FBRUQsZ0JBQUksYUFBYTtBQUNiLHNCQUFNLE9BRE87QUFFYixvQkFBSSxDQUZTO0FBR2IsZ0NBQWdCLENBSEg7QUFJYix5QkFBUyxFQUpJO0FBS2Isd0JBQVE7QUFMSyxhQUFqQjs7QUFRQSxnQkFBSSxlQUFlLElBQW5CLEVBQXlCO0FBQ3JCLDJCQUFXLE9BQVgsQ0FBbUIsSUFBbkIsQ0FBd0IsV0FBeEI7QUFDQSwyQkFBVyxNQUFYLEdBQW9CLFlBQVksTUFBaEM7QUFDSDs7QUFFRCxpQkFBSyx1QkFBTCxHQUErQixJQUEvQjtBQUNBLGlCQUFLLHVCQUFMLEdBQStCLElBQS9COztBQUVBLGlCQUFLLFdBQUwsQ0FBaUIsVUFBakIsRUFBNkIsSUFBN0I7QUFDQSxpQkFBSyxXQUFMLENBQWlCLFVBQWpCLEVBQTZCLElBQTdCO0FBQ0g7OztvQ0FFVyxVLEVBQVksSyxFQUFPO0FBQzNCLGdCQUFJLEtBQUssVUFBTCxJQUFtQixJQUF2QixFQUE2QjtBQUN6QjtBQUNIOztBQUVELGdCQUFJLFFBQVEsVUFBWjtBQUNBLGdCQUFJLFVBQVUsTUFBTSxPQUFwQjtBQUNBLGdCQUFJLGdCQUFnQixTQUFwQjtBQUNBLGdCQUFJLFdBQVcsQ0FBQyxDQUFoQjtBQUFBLGdCQUFtQixVQUFVLENBQUMsQ0FBOUI7QUFBQSxnQkFBaUMsVUFBVSxDQUFDLENBQTVDO0FBQ0EsZ0JBQUksb0JBQW9CLEtBQUssVUFBTCxDQUFnQixpQkFBeEM7O0FBRUEsZ0JBQUksZUFBZSxLQUFLLFVBQUwsQ0FBZ0IsS0FBaEIsS0FBMEIsS0FBMUIsSUFBbUMsS0FBSyxnQkFBM0Q7QUFDQSxnQkFBSSx3QkFBd0IsS0FBSyxjQUFMLElBQXVCLEtBQUssYUFBTCxLQUF1QixTQUExRTs7QUFFQSxnQkFBSSwwQkFBMEIsS0FBOUI7O0FBRUEsZ0JBQUksQ0FBQyxPQUFELElBQVksUUFBUSxNQUFSLEtBQW1CLENBQW5DLEVBQXNDO0FBQ2xDO0FBQ0g7QUFDRCxnQkFBSSxRQUFRLE1BQVIsS0FBbUIsQ0FBbkIsSUFBd0IsQ0FBQyxLQUE3QixFQUFvQztBQUNoQztBQUNBO0FBQ0E7QUFDSCxhQXZCMEIsQ0F1QnhCOztBQUVILGdCQUFJLFNBQVMsQ0FBYjtBQUNBLGdCQUFJLFVBQVUsSUFBZDtBQUNBLGdCQUFJLFlBQVksQ0FBaEI7O0FBRUE7QUFDQSxnQkFBSSxZQUFKLEVBQWtCO0FBQ2Q7QUFDQSx5QkFBUyxDQUFUO0FBQ0EsNEJBQVksTUFBTSxNQUFsQjtBQUNILGFBSkQsTUFJTztBQUNIO0FBQ0EseUJBQVMsQ0FBVCxDQUZHLENBRVU7QUFDYiw0QkFBWSxJQUFJLE1BQU0sTUFBdEI7QUFDSDs7QUFHRCxnQkFBSSxhQUFhLElBQWpCOztBQUVBO0FBQ0EsZ0JBQUksUUFBUSxNQUFSLEdBQWlCLENBQXJCLEVBQXdCO0FBQ3BCLDZCQUFhLFFBQVEsR0FBUixFQUFiO0FBQ0EsNkJBQWEsV0FBVyxNQUF4QjtBQUNIOztBQUVEO0FBQ0EsZ0JBQUksS0FBSyx1QkFBTCxJQUFnQyxJQUFwQyxFQUEwQztBQUN0QyxvQkFBSSxTQUFTLEtBQUssdUJBQWxCO0FBQ0EscUJBQUssdUJBQUwsR0FBK0IsSUFBL0I7QUFDQSx3QkFBUSxPQUFSLENBQWdCLE1BQWhCO0FBQ0EsNkJBQWEsT0FBTyxNQUFwQjtBQUNIOztBQUVEO0FBQ0EsZ0JBQUksY0FBYyxJQUFsQixFQUF3QjtBQUNwQixxQkFBSyx1QkFBTCxHQUErQixVQUEvQjtBQUNIOztBQUdELGdCQUFJLHlCQUF5QixRQUFRLENBQVIsRUFBVyxHQUFYLEdBQWlCLEtBQUssUUFBbkQ7O0FBRUE7QUFDQSxnQkFBSSxLQUFLLGFBQVQsRUFBd0I7QUFDcEIsZ0NBQWdCLHlCQUF5QixLQUFLLGFBQTlDO0FBQ0gsYUFGRCxNQUVPO0FBQUc7QUFDTixvQkFBSSxLQUFLLHFCQUFMLENBQTJCLE9BQTNCLEVBQUosRUFBMEM7QUFDdEMsb0NBQWdCLENBQWhCO0FBQ0Esd0JBQUksS0FBSyxvQkFBTCxJQUE2QixDQUFDLEtBQUsscUJBQUwsQ0FBMkIsT0FBM0IsRUFBbEMsRUFBd0U7QUFDcEUsNEJBQUksS0FBSyxVQUFMLENBQWdCLGFBQWhCLEtBQWtDLEtBQXRDLEVBQTZDO0FBQ3pDLHNEQUEwQixJQUExQjtBQUNIO0FBQ0o7QUFDSixpQkFQRCxNQU9PO0FBQ0gsd0JBQUksY0FBYSxLQUFLLHFCQUFMLENBQTJCLG1CQUEzQixDQUErQyxzQkFBL0MsQ0FBakI7QUFDQSx3QkFBSSxlQUFjLElBQWxCLEVBQXdCO0FBQ3BCLDRCQUFJLFdBQVksMEJBQTBCLFlBQVcsV0FBWCxHQUF5QixZQUFXLFFBQTlELENBQWhCO0FBQ0EsNEJBQUksWUFBWSxDQUFoQixFQUFtQjtBQUNmLHVDQUFXLENBQVg7QUFDSDtBQUNELDRCQUFJLGNBQWMsWUFBVyxHQUFYLEdBQWlCLFlBQVcsUUFBNUIsR0FBdUMsUUFBekQ7QUFDQSx3Q0FBZ0IseUJBQXlCLFdBQXpDO0FBQ0gscUJBUEQsTUFPTztBQUFFO0FBQ0wsd0NBQWdCLENBQWhCO0FBQ0g7QUFDSjtBQUNKOztBQUVELGdCQUFJLHVCQUFKLEVBQTZCO0FBQ3pCO0FBQ0Esb0JBQUksaUJBQWlCLHlCQUF5QixhQUE5QztBQUNBLG9CQUFJLGVBQWUsS0FBSyxxQkFBTCxDQUEyQixvQkFBM0IsQ0FBZ0Qsc0JBQWhELENBQW5CO0FBQ0Esb0JBQUksZ0JBQWdCLElBQWhCLElBQXdCLGFBQWEsUUFBYixHQUF3QixjQUFwRCxFQUFvRTtBQUNoRSx3QkFBSSxhQUFhLG9CQUFJLGNBQUosQ0FBbUIsS0FBSyxVQUFMLENBQWdCLGFBQW5DLEVBQWtELEtBQUssVUFBTCxDQUFnQixZQUFsRSxDQUFqQjtBQUNBLHdCQUFJLFVBQUosRUFBZ0I7QUFDWiw0QkFBSSxNQUFNLGFBQWEsUUFBdkI7QUFDQSw0QkFBSSxzQkFBc0IsaUJBQWlCLGFBQWEsUUFBeEQ7QUFDQSx5Q0FBSSxDQUFKLENBQU0sS0FBSyxHQUFYLHFDQUFpRCxHQUFqRCxvQkFBbUUsbUJBQW5FO0FBQ0EsZ0NBQVEsT0FBUixDQUFnQixFQUFDLE1BQU0sVUFBUCxFQUFtQixLQUFLLEdBQXhCLEVBQTZCLEtBQUssR0FBbEMsRUFBaEI7QUFDQSxxQ0FBYSxXQUFXLFVBQXhCO0FBQ0gscUJBUitELENBUTdEO0FBQ04saUJBVEQsTUFTTztBQUNILDhDQUEwQixLQUExQjtBQUNIO0FBQ0o7O0FBRUQsZ0JBQUksYUFBYSxFQUFqQjs7QUFFQTtBQUNBLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksUUFBUSxNQUE1QixFQUFvQyxHQUFwQyxFQUF5QztBQUNyQyxvQkFBSSxVQUFTLFFBQVEsQ0FBUixDQUFiO0FBQ0Esb0JBQUksT0FBTyxRQUFPLElBQWxCO0FBQ0Esb0JBQUksY0FBYyxRQUFPLEdBQVAsR0FBYSxLQUFLLFFBQXBDO0FBQ0Esb0JBQUksT0FBTSxjQUFjLGFBQXhCOztBQUVBLG9CQUFJLGFBQWEsQ0FBQyxDQUFsQixFQUFxQjtBQUNqQiwrQkFBVyxJQUFYO0FBQ0g7O0FBRUQsb0JBQUksaUJBQWlCLENBQXJCOztBQUVBLG9CQUFJLE1BQU0sUUFBUSxNQUFSLEdBQWlCLENBQTNCLEVBQThCO0FBQzFCLHdCQUFJLFVBQVUsUUFBUSxJQUFJLENBQVosRUFBZSxHQUFmLEdBQXFCLEtBQUssUUFBMUIsR0FBcUMsYUFBbkQ7QUFDQSxxQ0FBaUIsVUFBVSxJQUEzQjtBQUNILGlCQUhELE1BR087QUFBRztBQUNOLHdCQUFJLGNBQWMsSUFBbEIsRUFBd0I7QUFBRztBQUN2Qiw0QkFBSSxXQUFVLFdBQVcsR0FBWCxHQUFpQixLQUFLLFFBQXRCLEdBQWlDLGFBQS9DO0FBQ0EseUNBQWlCLFdBQVUsSUFBM0I7QUFDSCxxQkFIRCxNQUdPLElBQUksV0FBVyxNQUFYLElBQXFCLENBQXpCLEVBQTRCO0FBQUc7QUFDbEMseUNBQWlCLFdBQVcsV0FBVyxNQUFYLEdBQW9CLENBQS9CLEVBQWtDLFFBQW5EO0FBQ0gscUJBRk0sTUFFQTtBQUFHO0FBQ04seUNBQWlCLEtBQUssS0FBTCxDQUFXLGlCQUFYLENBQWpCO0FBQ0g7QUFDSjs7QUFFRCxvQkFBSSx1QkFBdUIsS0FBM0I7QUFDQSxvQkFBSSxlQUFlLElBQW5COztBQUVBO0FBQ0Esb0JBQUksaUJBQWlCLG9CQUFvQixHQUFyQyxJQUE0QyxLQUFLLFVBQUwsQ0FBZ0IsS0FBaEIsS0FBMEIsS0FBdEUsSUFBK0UsS0FBSyxzQkFBcEYsSUFBOEcsQ0FBQyxrQkFBUSxNQUEzSCxFQUFtSTtBQUMvSDtBQUNBLDJDQUF1QixJQUF2QjtBQUNBLHdCQUFJLFFBQVEsS0FBSyxHQUFMLENBQVMsaUJBQWlCLGlCQUExQixDQUFaO0FBQ0Esd0JBQUksYUFBYSxLQUFLLElBQUwsQ0FBVSxRQUFRLGlCQUFsQixDQUFqQjtBQUNBLHdCQUFJLGFBQWEsT0FBTSxpQkFBdkIsQ0FMK0gsQ0FLcEY7O0FBRTNDLHFDQUFJLENBQUosQ0FBTSxLQUFLLEdBQVgsRUFBZ0IscUVBQ0Esb0RBREEsZUFFUSxPQUFNLGNBRmQseUJBRThDLE9BQU0sS0FBSyxLQUFMLENBQVcsaUJBQVgsQ0FGcEQsNEJBR1UsS0FBSyxLQUFMLENBQVcsS0FBWCxDQUhWLHVCQUc2QyxVQUg3QyxhQUFoQjs7QUFLQSx3QkFBSSxjQUFhLG9CQUFJLGNBQUosQ0FBbUIsS0FBSyxVQUFMLENBQWdCLGFBQW5DLEVBQWtELEtBQUssVUFBTCxDQUFnQixZQUFsRSxDQUFqQjtBQUNBLHdCQUFJLGVBQWMsSUFBbEIsRUFBd0I7QUFDcEIseUNBQUksQ0FBSixDQUFNLEtBQUssR0FBWCxFQUFnQiwwQ0FDRyxLQUFLLFVBQUwsQ0FBZ0IsYUFEbkIsY0FDeUMsS0FBSyxVQUFMLENBQWdCLFlBRHpELGtDQUFoQjtBQUVBO0FBQ0Esc0NBQWEsSUFBYjtBQUNIO0FBQ0QsbUNBQWUsRUFBZjs7QUFFQSx5QkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFVBQXBCLEVBQWdDLEdBQWhDLEVBQXFDO0FBQ2pDLDRCQUFJLFNBQVMsS0FBSyxLQUFMLENBQVcsVUFBWCxDQUFiLENBRGlDLENBQ0s7QUFDdEMsNEJBQUksYUFBYSxNQUFiLEdBQXNCLENBQTFCLEVBQTZCO0FBQ3pCO0FBQ0EsZ0NBQUksZ0JBQWdCLGFBQWEsYUFBYSxNQUFiLEdBQXNCLENBQW5DLENBQXBCO0FBQ0EsMENBQWMsUUFBZCxHQUF5QixTQUFTLGNBQWMsR0FBaEQ7QUFDSDtBQUNELDRCQUFJLFFBQVE7QUFDUixpQ0FBSyxNQURHO0FBRVIsaUNBQUssTUFGRztBQUdSLGlDQUFLLENBSEc7QUFJUixrQ0FBTSxXQUpFO0FBS1Isa0NBQU0sWUFBVyxVQUxUO0FBTVIsc0NBQVUsQ0FORixFQU1NO0FBQ2QseUNBQWEsV0FQTDtBQVFSLG1DQUFPO0FBQ0gsMkNBQVcsQ0FEUjtBQUVILDJDQUFXLENBRlI7QUFHSCw4Q0FBYyxDQUhYO0FBSUgsK0NBQWU7QUFKWjtBQVJDLHlCQUFaO0FBZUEscUNBQWEsSUFBYixDQUFrQixLQUFsQjtBQUNBLHFDQUFhLE1BQU0sSUFBbkI7QUFDQSxzQ0FBYyxpQkFBZDtBQUNIOztBQUVEO0FBQ0Esd0JBQUksWUFBWSxhQUFhLGFBQWEsTUFBYixHQUFzQixDQUFuQyxDQUFoQjtBQUNBLDhCQUFVLFFBQVYsR0FBcUIsT0FBTSxjQUFOLEdBQXVCLFVBQVUsR0FBdEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUNBQWlCLEtBQUssS0FBTCxDQUFXLGlCQUFYLENBQWpCO0FBQ0g7O0FBRUQsMkJBQVcsSUFBWCxDQUFnQjtBQUNaLHlCQUFLLElBRE87QUFFWix5QkFBSyxJQUZPO0FBR1oseUJBQUssQ0FITztBQUlaLDBCQUFNLFFBQU8sSUFKRDtBQUtaLDBCQUFNLFFBQU8sSUFBUCxDQUFZLFVBTE47QUFNWiw4QkFBVSxjQU5FO0FBT1osaUNBQWEsV0FQRDtBQVFaLDJCQUFPO0FBQ0gsbUNBQVcsQ0FEUjtBQUVILG1DQUFXLENBRlI7QUFHSCxzQ0FBYyxDQUhYO0FBSUgsdUNBQWU7QUFKWjtBQVJLLGlCQUFoQjs7QUFnQkEsb0JBQUksb0JBQUosRUFBMEI7QUFDdEI7QUFDQSwrQkFBVyxJQUFYLENBQWdCLEtBQWhCLENBQXNCLFVBQXRCLEVBQWtDLFlBQWxDO0FBQ0g7QUFDSjs7QUFFRDtBQUNBLGdCQUFJLFlBQUosRUFBa0I7QUFDZDtBQUNBLDBCQUFVLElBQUksVUFBSixDQUFlLFNBQWYsQ0FBVjtBQUNILGFBSEQsTUFHTztBQUNIO0FBQ0EsMEJBQVUsSUFBSSxVQUFKLENBQWUsU0FBZixDQUFWO0FBQ0E7QUFDQSx3QkFBUSxDQUFSLElBQWMsY0FBYyxFQUFmLEdBQXFCLElBQWxDO0FBQ0Esd0JBQVEsQ0FBUixJQUFjLGNBQWMsRUFBZixHQUFxQixJQUFsQztBQUNBLHdCQUFRLENBQVIsSUFBYyxjQUFlLENBQWhCLEdBQXFCLElBQWxDO0FBQ0Esd0JBQVEsQ0FBUixJQUFjLFNBQUQsR0FBYyxJQUEzQjtBQUNBO0FBQ0Esd0JBQVEsR0FBUixDQUFZLHVCQUFJLEtBQUosQ0FBVSxJQUF0QixFQUE0QixDQUE1QjtBQUNIOztBQUVEO0FBQ0EsaUJBQUssSUFBSSxLQUFJLENBQWIsRUFBZ0IsS0FBSSxXQUFXLE1BQS9CLEVBQXVDLElBQXZDLEVBQTRDO0FBQ3hDLG9CQUFJLFFBQU8sV0FBVyxFQUFYLEVBQWMsSUFBekI7QUFDQSx3QkFBUSxHQUFSLENBQVksS0FBWixFQUFrQixNQUFsQjtBQUNBLDBCQUFVLE1BQUssVUFBZjtBQUNIOztBQUVELGdCQUFJLFNBQVMsV0FBVyxXQUFXLE1BQVgsR0FBb0IsQ0FBL0IsQ0FBYjtBQUNBLHNCQUFVLE9BQU8sR0FBUCxHQUFhLE9BQU8sUUFBOUI7QUFDQSxpQkFBSyxhQUFMLEdBQXFCLE9BQXJCOztBQUVBO0FBQ0EsZ0JBQUksT0FBTyx3Q0FBWDtBQUNBLGlCQUFLLFFBQUwsR0FBZ0IsUUFBaEI7QUFDQSxpQkFBSyxNQUFMLEdBQWMsT0FBZDtBQUNBLGlCQUFLLFFBQUwsR0FBZ0IsUUFBaEI7QUFDQSxpQkFBSyxNQUFMLEdBQWMsT0FBZDtBQUNBLGlCQUFLLGdCQUFMLEdBQXdCLFdBQVcsQ0FBWCxFQUFjLFdBQXRDO0FBQ0EsaUJBQUssY0FBTCxHQUFzQixPQUFPLFdBQVAsR0FBcUIsT0FBTyxRQUFsRDtBQUNBLGlCQUFLLFdBQUwsR0FBbUIsaUNBQWUsV0FBVyxDQUFYLEVBQWMsR0FBN0IsRUFDZSxXQUFXLENBQVgsRUFBYyxHQUQ3QixFQUVlLFdBQVcsQ0FBWCxFQUFjLFFBRjdCLEVBR2UsV0FBVyxDQUFYLEVBQWMsV0FIN0IsRUFJZSxLQUpmLENBQW5CO0FBS0EsaUJBQUssVUFBTCxHQUFrQixpQ0FBZSxPQUFPLEdBQXRCLEVBQ2UsT0FBTyxHQUR0QixFQUVlLE9BQU8sUUFGdEIsRUFHZSxPQUFPLFdBSHRCLEVBSWUsS0FKZixDQUFsQjtBQUtBLGdCQUFJLENBQUMsS0FBSyxPQUFWLEVBQW1CO0FBQ2YscUJBQUsscUJBQUwsQ0FBMkIsTUFBM0IsQ0FBa0MsSUFBbEM7QUFDSDs7QUFFRCxrQkFBTSxPQUFOLEdBQWdCLFVBQWhCO0FBQ0Esa0JBQU0sY0FBTjs7QUFFQSxnQkFBSSxVQUFVLElBQWQ7O0FBRUEsZ0JBQUksWUFBSixFQUFrQjtBQUNkO0FBQ0EsMEJBQVUsSUFBSSxVQUFKLEVBQVY7QUFDSCxhQUhELE1BR087QUFDSDtBQUNBLDBCQUFVLHVCQUFJLElBQUosQ0FBUyxLQUFULEVBQWdCLFFBQWhCLENBQVY7QUFDSDs7QUFFRCxrQkFBTSxPQUFOLEdBQWdCLEVBQWhCO0FBQ0Esa0JBQU0sTUFBTixHQUFlLENBQWY7O0FBRUEsZ0JBQUksVUFBVTtBQUNWLHNCQUFNLE9BREk7QUFFVixzQkFBTSxLQUFLLFdBQUwsQ0FBaUIsT0FBakIsRUFBMEIsT0FBMUIsRUFBbUMsTUFGL0I7QUFHViw2QkFBYSxXQUFXLE1BSGQ7QUFJVixzQkFBTTtBQUpJLGFBQWQ7O0FBT0EsZ0JBQUksZ0JBQWdCLHFCQUFwQixFQUEyQztBQUN2QztBQUNBO0FBQ0Esd0JBQVEsZUFBUixHQUEwQixRQUExQjtBQUNIOztBQUVELGlCQUFLLGVBQUwsQ0FBcUIsT0FBckIsRUFBOEIsT0FBOUI7QUFDSDs7O29DQUVXLFUsRUFBWSxLLEVBQU87QUFDM0IsZ0JBQUksS0FBSyxVQUFMLElBQW1CLElBQXZCLEVBQTZCO0FBQ3pCO0FBQ0g7O0FBRUQsZ0JBQUksUUFBUSxVQUFaO0FBQ0EsZ0JBQUksVUFBVSxNQUFNLE9BQXBCO0FBQ0EsZ0JBQUksZ0JBQWdCLFNBQXBCO0FBQ0EsZ0JBQUksV0FBVyxDQUFDLENBQWhCO0FBQUEsZ0JBQW1CLFVBQVUsQ0FBQyxDQUE5QjtBQUNBLGdCQUFJLFdBQVcsQ0FBQyxDQUFoQjtBQUFBLGdCQUFtQixVQUFVLENBQUMsQ0FBOUI7O0FBRUEsZ0JBQUksQ0FBQyxPQUFELElBQVksUUFBUSxNQUFSLEtBQW1CLENBQW5DLEVBQXNDO0FBQ2xDO0FBQ0g7QUFDRCxnQkFBSSxRQUFRLE1BQVIsS0FBbUIsQ0FBbkIsSUFBd0IsQ0FBQyxLQUE3QixFQUFvQztBQUNoQztBQUNBO0FBQ0E7QUFDSCxhQWxCMEIsQ0FrQnhCOztBQUVILGdCQUFJLFNBQVMsQ0FBYjtBQUNBLGdCQUFJLFVBQVUsSUFBZDtBQUNBLGdCQUFJLFlBQVksSUFBSSxXQUFXLE1BQS9COztBQUdBLGdCQUFJLGFBQWEsSUFBakI7O0FBRUE7QUFDQSxnQkFBSSxRQUFRLE1BQVIsR0FBaUIsQ0FBckIsRUFBd0I7QUFDcEIsNkJBQWEsUUFBUSxHQUFSLEVBQWI7QUFDQSw2QkFBYSxXQUFXLE1BQXhCO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBSSxLQUFLLHVCQUFMLElBQWdDLElBQXBDLEVBQTBDO0FBQ3RDLG9CQUFJLFNBQVMsS0FBSyx1QkFBbEI7QUFDQSxxQkFBSyx1QkFBTCxHQUErQixJQUEvQjtBQUNBLHdCQUFRLE9BQVIsQ0FBZ0IsTUFBaEI7QUFDQSw2QkFBYSxPQUFPLE1BQXBCO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBSSxjQUFjLElBQWxCLEVBQXdCO0FBQ3BCLHFCQUFLLHVCQUFMLEdBQStCLFVBQS9CO0FBQ0g7O0FBR0QsZ0JBQUkseUJBQXlCLFFBQVEsQ0FBUixFQUFXLEdBQVgsR0FBaUIsS0FBSyxRQUFuRDs7QUFFQTtBQUNBLGdCQUFJLEtBQUssYUFBVCxFQUF3QjtBQUNwQixnQ0FBZ0IseUJBQXlCLEtBQUssYUFBOUM7QUFDSCxhQUZELE1BRU87QUFBRztBQUNOLG9CQUFJLEtBQUsscUJBQUwsQ0FBMkIsT0FBM0IsRUFBSixFQUEwQztBQUN0QyxvQ0FBZ0IsQ0FBaEI7QUFDSCxpQkFGRCxNQUVPO0FBQ0gsd0JBQUksZUFBYSxLQUFLLHFCQUFMLENBQTJCLG1CQUEzQixDQUErQyxzQkFBL0MsQ0FBakI7QUFDQSx3QkFBSSxnQkFBYyxJQUFsQixFQUF3QjtBQUNwQiw0QkFBSSxXQUFZLDBCQUEwQixhQUFXLFdBQVgsR0FBeUIsYUFBVyxRQUE5RCxDQUFoQjtBQUNBLDRCQUFJLFlBQVksQ0FBaEIsRUFBbUI7QUFDZix1Q0FBVyxDQUFYO0FBQ0g7QUFDRCw0QkFBSSxjQUFjLGFBQVcsR0FBWCxHQUFpQixhQUFXLFFBQTVCLEdBQXVDLFFBQXpEO0FBQ0Esd0NBQWdCLHlCQUF5QixXQUF6QztBQUNILHFCQVBELE1BT087QUFBRTtBQUNMLHdDQUFnQixDQUFoQjtBQUNIO0FBQ0o7QUFDSjs7QUFFRCxnQkFBSSxPQUFPLHdDQUFYO0FBQ0EsZ0JBQUksYUFBYSxFQUFqQjs7QUFFQTtBQUNBLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksUUFBUSxNQUE1QixFQUFvQyxHQUFwQyxFQUF5QztBQUNyQyxvQkFBSSxXQUFTLFFBQVEsQ0FBUixDQUFiO0FBQ0Esb0JBQUksY0FBYyxTQUFPLEdBQVAsR0FBYSxLQUFLLFFBQXBDO0FBQ0Esb0JBQUksYUFBYSxTQUFPLFVBQXhCO0FBQ0Esb0JBQUksTUFBTSxjQUFjLGFBQXhCO0FBQ0Esb0JBQUksTUFBTSxTQUFPLEdBQWpCO0FBQ0Esb0JBQUksTUFBTSxNQUFNLEdBQWhCOztBQUVBLG9CQUFJLGFBQWEsQ0FBQyxDQUFsQixFQUFxQjtBQUNqQiwrQkFBVyxHQUFYO0FBQ0EsK0JBQVcsR0FBWDtBQUNIOztBQUVELG9CQUFJLGlCQUFpQixDQUFyQjs7QUFFQSxvQkFBSSxNQUFNLFFBQVEsTUFBUixHQUFpQixDQUEzQixFQUE4QjtBQUMxQix3QkFBSSxVQUFVLFFBQVEsSUFBSSxDQUFaLEVBQWUsR0FBZixHQUFxQixLQUFLLFFBQTFCLEdBQXFDLGFBQW5EO0FBQ0EscUNBQWlCLFVBQVUsR0FBM0I7QUFDSCxpQkFIRCxNQUdPO0FBQUc7QUFDTix3QkFBSSxjQUFjLElBQWxCLEVBQXdCO0FBQUc7QUFDdkIsNEJBQUksWUFBVSxXQUFXLEdBQVgsR0FBaUIsS0FBSyxRQUF0QixHQUFpQyxhQUEvQztBQUNBLHlDQUFpQixZQUFVLEdBQTNCO0FBQ0gscUJBSEQsTUFHTyxJQUFJLFdBQVcsTUFBWCxJQUFxQixDQUF6QixFQUE0QjtBQUFHO0FBQ2xDLHlDQUFpQixXQUFXLFdBQVcsTUFBWCxHQUFvQixDQUEvQixFQUFrQyxRQUFuRDtBQUNILHFCQUZNLE1BRUE7QUFBRztBQUNOLHlDQUFpQixLQUFLLEtBQUwsQ0FBVyxLQUFLLFVBQUwsQ0FBZ0IsaUJBQTNCLENBQWpCO0FBQ0g7QUFDSjs7QUFFRCxvQkFBSSxVQUFKLEVBQWdCO0FBQ1osd0JBQUksWUFBWSxpQ0FBZSxHQUFmLEVBQW9CLEdBQXBCLEVBQXlCLGNBQXpCLEVBQXlDLFNBQU8sR0FBaEQsRUFBcUQsSUFBckQsQ0FBaEI7QUFDQSw4QkFBVSxZQUFWLEdBQXlCLFNBQU8sWUFBaEM7QUFDQSx5QkFBSyxlQUFMLENBQXFCLFNBQXJCO0FBQ0g7O0FBRUQsMkJBQVcsSUFBWCxDQUFnQjtBQUNaLHlCQUFLLEdBRE87QUFFWix5QkFBSyxHQUZPO0FBR1oseUJBQUssR0FITztBQUlaLDJCQUFPLFNBQU8sS0FKRjtBQUtaLDBCQUFNLFNBQU8sTUFMRDtBQU1aLGdDQUFZLFVBTkE7QUFPWiw4QkFBVSxjQVBFO0FBUVosaUNBQWEsV0FSRDtBQVNaLDJCQUFPO0FBQ0gsbUNBQVcsQ0FEUjtBQUVILG1DQUFXLGFBQWEsQ0FBYixHQUFpQixDQUZ6QjtBQUdILHNDQUFjLGFBQWEsQ0FBYixHQUFpQixDQUg1QjtBQUlILHVDQUFlLENBSlo7QUFLSCxtQ0FBVyxhQUFhLENBQWIsR0FBaUI7QUFMekI7QUFUSyxpQkFBaEI7QUFpQkg7O0FBRUQ7QUFDQSxzQkFBVSxJQUFJLFVBQUosQ0FBZSxTQUFmLENBQVY7QUFDQSxvQkFBUSxDQUFSLElBQWMsY0FBYyxFQUFmLEdBQXFCLElBQWxDO0FBQ0Esb0JBQVEsQ0FBUixJQUFjLGNBQWMsRUFBZixHQUFxQixJQUFsQztBQUNBLG9CQUFRLENBQVIsSUFBYyxjQUFlLENBQWhCLEdBQXFCLElBQWxDO0FBQ0Esb0JBQVEsQ0FBUixJQUFjLFNBQUQsR0FBYyxJQUEzQjtBQUNBLG9CQUFRLEdBQVIsQ0FBWSx1QkFBSSxLQUFKLENBQVUsSUFBdEIsRUFBNEIsQ0FBNUI7O0FBRUE7QUFDQSxpQkFBSyxJQUFJLE1BQUksQ0FBYixFQUFnQixNQUFJLFdBQVcsTUFBL0IsRUFBdUMsS0FBdkMsRUFBNEM7QUFDeEMsb0JBQUksUUFBUSxXQUFXLEdBQVgsRUFBYyxLQUExQjtBQUNBLHVCQUFPLE1BQU0sTUFBYixFQUFxQjtBQUNqQix3QkFBSSxPQUFPLE1BQU0sS0FBTixFQUFYO0FBQ0Esd0JBQUksT0FBTyxLQUFLLElBQWhCO0FBQ0EsNEJBQVEsR0FBUixDQUFZLElBQVosRUFBa0IsTUFBbEI7QUFDQSw4QkFBVSxLQUFLLFVBQWY7QUFDSDtBQUNKOztBQUVELGdCQUFJLFNBQVMsV0FBVyxXQUFXLE1BQVgsR0FBb0IsQ0FBL0IsQ0FBYjtBQUNBLHNCQUFVLE9BQU8sR0FBUCxHQUFhLE9BQU8sUUFBOUI7QUFDQSxzQkFBVSxPQUFPLEdBQVAsR0FBYSxPQUFPLFFBQTlCO0FBQ0EsaUJBQUssYUFBTCxHQUFxQixPQUFyQjs7QUFFQTtBQUNBLGlCQUFLLFFBQUwsR0FBZ0IsUUFBaEI7QUFDQSxpQkFBSyxNQUFMLEdBQWMsT0FBZDtBQUNBLGlCQUFLLFFBQUwsR0FBZ0IsUUFBaEI7QUFDQSxpQkFBSyxNQUFMLEdBQWMsT0FBZDtBQUNBLGlCQUFLLGdCQUFMLEdBQXdCLFdBQVcsQ0FBWCxFQUFjLFdBQXRDO0FBQ0EsaUJBQUssY0FBTCxHQUFzQixPQUFPLFdBQVAsR0FBcUIsT0FBTyxRQUFsRDtBQUNBLGlCQUFLLFdBQUwsR0FBbUIsaUNBQWUsV0FBVyxDQUFYLEVBQWMsR0FBN0IsRUFDZSxXQUFXLENBQVgsRUFBYyxHQUQ3QixFQUVlLFdBQVcsQ0FBWCxFQUFjLFFBRjdCLEVBR2UsV0FBVyxDQUFYLEVBQWMsV0FIN0IsRUFJZSxXQUFXLENBQVgsRUFBYyxVQUo3QixDQUFuQjtBQUtBLGlCQUFLLFVBQUwsR0FBa0IsaUNBQWUsT0FBTyxHQUF0QixFQUNlLE9BQU8sR0FEdEIsRUFFZSxPQUFPLFFBRnRCLEVBR2UsT0FBTyxXQUh0QixFQUllLE9BQU8sVUFKdEIsQ0FBbEI7QUFLQSxnQkFBSSxDQUFDLEtBQUssT0FBVixFQUFtQjtBQUNmLHFCQUFLLHFCQUFMLENBQTJCLE1BQTNCLENBQWtDLElBQWxDO0FBQ0g7O0FBRUQsa0JBQU0sT0FBTixHQUFnQixVQUFoQjtBQUNBLGtCQUFNLGNBQU47O0FBRUE7QUFDQTtBQUNBLGdCQUFJLEtBQUssY0FBVCxFQUF5QjtBQUNyQixvQkFBSSxRQUFRLFdBQVcsQ0FBWCxFQUFjLEtBQTFCO0FBQ0Esc0JBQU0sU0FBTixHQUFrQixDQUFsQjtBQUNBLHNCQUFNLFNBQU4sR0FBa0IsQ0FBbEI7QUFDSDs7QUFFRCxnQkFBSSxVQUFVLHVCQUFJLElBQUosQ0FBUyxLQUFULEVBQWdCLFFBQWhCLENBQWQ7QUFDQSxrQkFBTSxPQUFOLEdBQWdCLEVBQWhCO0FBQ0Esa0JBQU0sTUFBTixHQUFlLENBQWY7O0FBRUEsaUJBQUssZUFBTCxDQUFxQixPQUFyQixFQUE4QjtBQUMxQixzQkFBTSxPQURvQjtBQUUxQixzQkFBTSxLQUFLLFdBQUwsQ0FBaUIsT0FBakIsRUFBMEIsT0FBMUIsRUFBbUMsTUFGZjtBQUcxQiw2QkFBYSxXQUFXLE1BSEU7QUFJMUIsc0JBQU07QUFKb0IsYUFBOUI7QUFNSDs7O29DQUVXLEksRUFBTSxJLEVBQU07QUFDcEIsZ0JBQUksU0FBUyxJQUFJLFVBQUosQ0FBZSxLQUFLLFVBQUwsR0FBa0IsS0FBSyxVQUF0QyxDQUFiO0FBQ0EsbUJBQU8sR0FBUCxDQUFXLElBQVgsRUFBaUIsQ0FBakI7QUFDQSxtQkFBTyxHQUFQLENBQVcsSUFBWCxFQUFpQixLQUFLLFVBQXRCO0FBQ0EsbUJBQU8sTUFBUDtBQUNIOzs7NEJBbG9CbUI7QUFDaEIsbUJBQU8sS0FBSyxjQUFaO0FBQ0gsUzswQkFFaUIsUSxFQUFVO0FBQ3hCLGlCQUFLLGNBQUwsR0FBc0IsUUFBdEI7QUFDSDs7QUFFRDs7Ozs7Ozs7Ozs7NEJBUXFCO0FBQ2pCLG1CQUFPLEtBQUssZUFBWjtBQUNILFM7MEJBRWtCLFEsRUFBVTtBQUN6QixpQkFBSyxlQUFMLEdBQXVCLFFBQXZCO0FBQ0g7Ozs7OztrQkFnbkJVLFU7Ozs7Ozs7O0FDdHVCZjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLElBQUksVUFBVSxFQUFkOztBQUVBLFNBQVMsTUFBVCxHQUFrQjtBQUNkOztBQUVBLFFBQUksS0FBSyxLQUFLLFNBQUwsQ0FBZSxTQUFmLENBQXlCLFdBQXpCLEVBQVQ7O0FBRUEsUUFBSSxRQUFRLG1CQUFtQixJQUFuQixDQUF3QixFQUF4QixLQUNSLG9CQUFvQixJQUFwQixDQUF5QixFQUF6QixDQURRLElBRVIsd0JBQXdCLElBQXhCLENBQTZCLEVBQTdCLENBRlEsSUFHUix5QkFBeUIsSUFBekIsQ0FBOEIsRUFBOUIsQ0FIUSxJQUlSLDZEQUE2RCxJQUE3RCxDQUFrRSxFQUFsRSxDQUpRLElBS1IsdUVBQXVFLElBQXZFLENBQTRFLEVBQTVFLENBTFEsSUFNUix3QkFBd0IsSUFBeEIsQ0FBNkIsRUFBN0IsQ0FOUSxJQU9SLHFDQUFxQyxJQUFyQyxDQUEwQyxFQUExQyxDQVBRLElBUVIsa0JBQWtCLElBQWxCLENBQXVCLEVBQXZCLENBUlEsSUFTUixHQUFHLE9BQUgsQ0FBVyxTQUFYLEtBQXlCLENBQXpCLElBQThCLHNCQUFzQixJQUF0QixDQUEyQixFQUEzQixDQVR0QixJQVVSLEdBQUcsT0FBSCxDQUFXLFlBQVgsSUFBMkIsQ0FBM0IsSUFBZ0MseUJBQXlCLElBQXpCLENBQThCLEVBQTlCLENBVnhCLElBV1IsRUFYSjs7QUFhQSxRQUFJLGlCQUFpQixTQUFTLElBQVQsQ0FBYyxFQUFkLEtBQ2pCLFNBQVMsSUFBVCxDQUFjLEVBQWQsQ0FEaUIsSUFFakIsa0JBQWtCLElBQWxCLENBQXVCLEVBQXZCLENBRmlCLElBR2pCLFdBQVcsSUFBWCxDQUFnQixFQUFoQixDQUhpQixJQUlqQixXQUFXLElBQVgsQ0FBZ0IsRUFBaEIsQ0FKaUIsSUFLakIsWUFBWSxJQUFaLENBQWlCLEVBQWpCLENBTGlCLElBTWpCLFlBQVksSUFBWixDQUFpQixFQUFqQixDQU5pQixJQU9qQixRQUFRLElBQVIsQ0FBYSxFQUFiLENBUGlCLElBUWpCLFVBQVUsSUFBVixDQUFlLEVBQWYsQ0FSaUIsSUFTakIsU0FBUyxJQUFULENBQWMsRUFBZCxDQVRpQixJQVVqQixFQVZKOztBQVlBLFFBQUksVUFBVTtBQUNWLGlCQUFTLE1BQU0sQ0FBTixLQUFZLE1BQU0sQ0FBTixDQUFaLElBQXdCLE1BQU0sQ0FBTixDQUF4QixJQUFvQyxFQURuQztBQUVWLGlCQUFTLE1BQU0sQ0FBTixLQUFZLE1BQU0sQ0FBTixDQUFaLElBQXdCLEdBRnZCO0FBR1Ysc0JBQWMsTUFBTSxDQUFOLEtBQVksTUFBTSxDQUFOLENBQVosSUFBd0IsR0FINUI7QUFJVixrQkFBVSxlQUFlLENBQWYsS0FBcUI7QUFKckIsS0FBZDs7QUFPQSxRQUFJLFVBQVUsRUFBZDtBQUNBLFFBQUksUUFBUSxPQUFaLEVBQXFCO0FBQ2pCLGdCQUFRLFFBQVEsT0FBaEIsSUFBMkIsSUFBM0I7O0FBRUEsWUFBSSxlQUFlLFFBQVEsWUFBUixDQUFxQixLQUFyQixDQUEyQixHQUEzQixDQUFuQjtBQUNBLGdCQUFRLE9BQVIsR0FBa0I7QUFDZCxtQkFBTyxTQUFTLFFBQVEsWUFBakIsRUFBK0IsRUFBL0IsQ0FETztBQUVkLG9CQUFRLFFBQVE7QUFGRixTQUFsQjtBQUlBLFlBQUksYUFBYSxNQUFiLEdBQXNCLENBQTFCLEVBQTZCO0FBQ3pCLG9CQUFRLE9BQVIsQ0FBZ0IsS0FBaEIsR0FBd0IsU0FBUyxhQUFhLENBQWIsQ0FBVCxFQUEwQixFQUExQixDQUF4QjtBQUNIO0FBQ0QsWUFBSSxhQUFhLE1BQWIsR0FBc0IsQ0FBMUIsRUFBNkI7QUFDekIsb0JBQVEsT0FBUixDQUFnQixLQUFoQixHQUF3QixTQUFTLGFBQWEsQ0FBYixDQUFULEVBQTBCLEVBQTFCLENBQXhCO0FBQ0g7QUFDSjs7QUFFRCxRQUFJLFFBQVEsUUFBWixFQUFzQjtBQUNsQixnQkFBUSxRQUFRLFFBQWhCLElBQTRCLElBQTVCO0FBQ0g7O0FBRUQsUUFBSSxRQUFRLE1BQVIsSUFBa0IsUUFBUSxHQUExQixJQUFpQyxRQUFRLE1BQTdDLEVBQXFEO0FBQ2pELGdCQUFRLE1BQVIsR0FBaUIsSUFBakI7QUFDSDs7QUFFRDtBQUNBLFFBQUksUUFBUSxFQUFSLElBQWMsUUFBUSxRQUExQixFQUFvQztBQUNoQyxZQUFJLFFBQVEsRUFBWixFQUFnQjtBQUNaLG1CQUFPLFFBQVEsRUFBZjtBQUNIO0FBQ0QsWUFBSSxPQUFPLE1BQVg7QUFDQSxnQkFBUSxPQUFSLEdBQWtCLElBQWxCO0FBQ0EsZ0JBQVEsSUFBUixJQUFnQixJQUFoQjtBQUNIOztBQUVEO0FBQ0EsUUFBSSxRQUFRLElBQVosRUFBa0I7QUFDZCxlQUFPLFFBQVEsSUFBZjtBQUNBLFlBQUksU0FBUyxRQUFiO0FBQ0EsZ0JBQVEsT0FBUixHQUFrQixNQUFsQjtBQUNBLGdCQUFRLE1BQVIsSUFBa0IsSUFBbEI7QUFDSDs7QUFFRDtBQUNBLFFBQUksUUFBUSxHQUFaLEVBQWlCO0FBQ2IsWUFBSSxRQUFRLE9BQVo7QUFDQSxnQkFBUSxPQUFSLEdBQWtCLEtBQWxCO0FBQ0EsZ0JBQVEsS0FBUixJQUFpQixJQUFqQjtBQUNIOztBQUVEO0FBQ0EsUUFBSSxRQUFRLE1BQVIsSUFBa0IsUUFBUSxPQUE5QixFQUF1QztBQUNuQyxZQUFJLFVBQVUsU0FBZDtBQUNBLGdCQUFRLE9BQVIsR0FBa0IsT0FBbEI7QUFDQSxnQkFBUSxPQUFSLElBQW1CLElBQW5CO0FBQ0g7O0FBRUQsWUFBUSxJQUFSLEdBQWUsUUFBUSxPQUF2QjtBQUNBLFlBQVEsUUFBUixHQUFtQixRQUFRLFFBQTNCOztBQUVBLFNBQUssSUFBSSxHQUFULElBQWdCLE9BQWhCLEVBQXlCO0FBQ3JCLFlBQUksUUFBUSxjQUFSLENBQXVCLEdBQXZCLENBQUosRUFBaUM7QUFDN0IsbUJBQU8sUUFBUSxHQUFSLENBQVA7QUFDSDtBQUNKO0FBQ0QsV0FBTyxNQUFQLENBQWMsT0FBZCxFQUF1QixPQUF2QjtBQUNIOztBQUVEOztrQkFFZSxPOzs7Ozs7Ozs7Ozs7Ozs7OztBQy9IZjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBa0JhLGdCLFdBQUEsZ0I7QUFFVCw4QkFBWSxPQUFaLEVBQXFCO0FBQUE7O0FBQ2pCLGFBQUssUUFBTCxHQUFnQixPQUFoQjtBQUNIOzs7O21DQVVVO0FBQ1AsbUJBQU8sS0FBSyxJQUFMLEdBQVksSUFBWixHQUFtQixLQUFLLE9BQS9CO0FBQ0g7Ozs0QkFWVTtBQUNQLG1CQUFPLGtCQUFQO0FBQ0g7Ozs0QkFFYTtBQUNWLG1CQUFPLEtBQUssUUFBWjtBQUNIOzs7Ozs7SUFRUSxxQixXQUFBLHFCOzs7QUFFVCxtQ0FBWSxPQUFaLEVBQXFCO0FBQUE7O0FBQUEsNklBQ1gsT0FEVztBQUVwQjs7Ozs0QkFFVTtBQUNQLG1CQUFPLHVCQUFQO0FBQ0g7Ozs7RUFSc0MsZ0I7O0lBWTlCLHdCLFdBQUEsd0I7OztBQUVULHNDQUFZLE9BQVosRUFBcUI7QUFBQTs7QUFBQSxtSkFDWCxPQURXO0FBRXBCOzs7OzRCQUVVO0FBQ1AsbUJBQU8sMEJBQVA7QUFDSDs7OztFQVJ5QyxnQjs7SUFZakMsdUIsV0FBQSx1Qjs7O0FBRVQscUNBQVksT0FBWixFQUFxQjtBQUFBOztBQUFBLGlKQUNYLE9BRFc7QUFFcEI7Ozs7NEJBRVU7QUFDUCxtQkFBTyx5QkFBUDtBQUNIOzs7O0VBUndDLGdCOzs7Ozs7Ozs7cWpCQzlEN0M7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTs7Ozs7Ozs7SUFFTSxHOzs7Ozs7OzBCQUVPLEcsRUFBSyxHLEVBQUs7QUFDZixnQkFBSSxDQUFDLEdBQUQsSUFBUSxJQUFJLGdCQUFoQixFQUNJLE1BQU0sSUFBSSxVQUFWOztBQUVKLGdCQUFJLFlBQVUsR0FBVixZQUFvQixHQUF4Qjs7QUFFQSxnQkFBSSxJQUFJLGVBQVIsRUFBeUI7QUFDckIsb0JBQUksT0FBSixDQUFZLElBQVosQ0FBaUIsS0FBakIsRUFBd0IsT0FBeEIsRUFBaUMsR0FBakM7QUFDSDs7QUFFRCxnQkFBSSxDQUFDLElBQUksWUFBVCxFQUF1QjtBQUNuQjtBQUNIOztBQUVELGdCQUFJLFFBQVEsS0FBWixFQUFtQjtBQUNmLHdCQUFRLEtBQVIsQ0FBYyxHQUFkO0FBQ0gsYUFGRCxNQUVPLElBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ3JCLHdCQUFRLElBQVIsQ0FBYSxHQUFiO0FBQ0gsYUFGTSxNQUVBO0FBQ0gsd0JBQVEsR0FBUixDQUFZLEdBQVo7QUFDSDtBQUNKOzs7MEJBRVEsRyxFQUFLLEcsRUFBSztBQUNmLGdCQUFJLENBQUMsR0FBRCxJQUFRLElBQUksZ0JBQWhCLEVBQ0ksTUFBTSxJQUFJLFVBQVY7O0FBRUosZ0JBQUksWUFBVSxHQUFWLFlBQW9CLEdBQXhCOztBQUVBLGdCQUFJLElBQUksZUFBUixFQUF5QjtBQUNyQixvQkFBSSxPQUFKLENBQVksSUFBWixDQUFpQixLQUFqQixFQUF3QixNQUF4QixFQUFnQyxHQUFoQztBQUNIOztBQUVELGdCQUFJLENBQUMsSUFBSSxXQUFULEVBQXNCO0FBQ2xCO0FBQ0g7O0FBRUQsZ0JBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2Qsd0JBQVEsSUFBUixDQUFhLEdBQWI7QUFDSCxhQUZELE1BRU87QUFDSCx3QkFBUSxHQUFSLENBQVksR0FBWjtBQUNIO0FBQ0o7OzswQkFFUSxHLEVBQUssRyxFQUFLO0FBQ2YsZ0JBQUksQ0FBQyxHQUFELElBQVEsSUFBSSxnQkFBaEIsRUFDSSxNQUFNLElBQUksVUFBVjs7QUFFSixnQkFBSSxZQUFVLEdBQVYsWUFBb0IsR0FBeEI7O0FBRUEsZ0JBQUksSUFBSSxlQUFSLEVBQXlCO0FBQ3JCLG9CQUFJLE9BQUosQ0FBWSxJQUFaLENBQWlCLEtBQWpCLEVBQXdCLE1BQXhCLEVBQWdDLEdBQWhDO0FBQ0g7O0FBRUQsZ0JBQUksQ0FBQyxJQUFJLFdBQVQsRUFBc0I7QUFDbEI7QUFDSDs7QUFFRCxnQkFBSSxRQUFRLElBQVosRUFBa0I7QUFDZCx3QkFBUSxJQUFSLENBQWEsR0FBYjtBQUNILGFBRkQsTUFFTztBQUNILHdCQUFRLEdBQVIsQ0FBWSxHQUFaO0FBQ0g7QUFDSjs7OzBCQUVRLEcsRUFBSyxHLEVBQUs7QUFDZixnQkFBSSxDQUFDLEdBQUQsSUFBUSxJQUFJLGdCQUFoQixFQUNJLE1BQU0sSUFBSSxVQUFWOztBQUVKLGdCQUFJLFlBQVUsR0FBVixZQUFvQixHQUF4Qjs7QUFFQSxnQkFBSSxJQUFJLGVBQVIsRUFBeUI7QUFDckIsb0JBQUksT0FBSixDQUFZLElBQVosQ0FBaUIsS0FBakIsRUFBd0IsT0FBeEIsRUFBaUMsR0FBakM7QUFDSDs7QUFFRCxnQkFBSSxDQUFDLElBQUksWUFBVCxFQUF1QjtBQUNuQjtBQUNIOztBQUVELGdCQUFJLFFBQVEsS0FBWixFQUFtQjtBQUNmLHdCQUFRLEtBQVIsQ0FBYyxHQUFkO0FBQ0gsYUFGRCxNQUVPO0FBQ0gsd0JBQVEsR0FBUixDQUFZLEdBQVo7QUFDSDtBQUNKOzs7MEJBRVEsRyxFQUFLLEcsRUFBSztBQUNmLGdCQUFJLENBQUMsR0FBRCxJQUFRLElBQUksZ0JBQWhCLEVBQ0ksTUFBTSxJQUFJLFVBQVY7O0FBRUosZ0JBQUksWUFBVSxHQUFWLFlBQW9CLEdBQXhCOztBQUVBLGdCQUFJLElBQUksZUFBUixFQUF5QjtBQUNyQixvQkFBSSxPQUFKLENBQVksSUFBWixDQUFpQixLQUFqQixFQUF3QixTQUF4QixFQUFtQyxHQUFuQztBQUNIOztBQUVELGdCQUFJLENBQUMsSUFBSSxjQUFULEVBQXlCO0FBQ3JCO0FBQ0g7O0FBRUQsb0JBQVEsR0FBUixDQUFZLEdBQVo7QUFDSDs7Ozs7O0FBSUwsSUFBSSxVQUFKLEdBQWlCLFFBQWpCO0FBQ0EsSUFBSSxnQkFBSixHQUF1QixLQUF2QjtBQUNBLElBQUksWUFBSixHQUFtQixJQUFuQjtBQUNBLElBQUksV0FBSixHQUFrQixJQUFsQjtBQUNBLElBQUksV0FBSixHQUFrQixJQUFsQjtBQUNBLElBQUksWUFBSixHQUFtQixJQUFuQjtBQUNBLElBQUksY0FBSixHQUFxQixJQUFyQjs7QUFFQSxJQUFJLGVBQUosR0FBc0IsS0FBdEI7O0FBRUEsSUFBSSxPQUFKLEdBQWMsc0JBQWQ7O2tCQUVlLEc7Ozs7Ozs7OztxakJDM0lmOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkE7Ozs7QUFDQTs7Ozs7Ozs7SUFFTSxjOzs7Ozs7O29DQWtGaUI7QUFDZixtQkFBTztBQUNILDJCQUFXLGlCQUFJLFVBRFo7QUFFSCxnQ0FBZ0IsaUJBQUksZ0JBRmpCO0FBR0gsK0JBQWUsaUJBQUksY0FIaEI7QUFJSCw2QkFBYSxpQkFBSSxZQUpkO0FBS0gsNEJBQVksaUJBQUksV0FMYjtBQU1ILDRCQUFZLGlCQUFJLFdBTmI7QUFPSCw2QkFBYSxpQkFBSSxZQVBkO0FBUUgsZ0NBQWdCLGlCQUFJO0FBUmpCLGFBQVA7QUFVSDs7O29DQUVrQixNLEVBQVE7QUFDdkIsNkJBQUksVUFBSixHQUFpQixPQUFPLFNBQXhCO0FBQ0EsNkJBQUksZ0JBQUosR0FBdUIsT0FBTyxjQUE5QjtBQUNBLDZCQUFJLGNBQUosR0FBcUIsT0FBTyxhQUE1QjtBQUNBLDZCQUFJLFlBQUosR0FBbUIsT0FBTyxXQUExQjtBQUNBLDZCQUFJLFdBQUosR0FBa0IsT0FBTyxVQUF6QjtBQUNBLDZCQUFJLFdBQUosR0FBa0IsT0FBTyxVQUF6QjtBQUNBLDZCQUFJLFlBQUosR0FBbUIsT0FBTyxXQUExQjtBQUNBLDZCQUFJLGVBQUosR0FBc0IsT0FBTyxjQUE3QjtBQUNIOzs7d0NBRXNCO0FBQ25CLGdCQUFJLFVBQVUsZUFBZSxPQUE3Qjs7QUFFQSxnQkFBSSxRQUFRLGFBQVIsQ0FBc0IsUUFBdEIsSUFBa0MsQ0FBdEMsRUFBeUM7QUFDckMsb0JBQUksU0FBUyxlQUFlLFNBQWYsRUFBYjtBQUNBLHdCQUFRLElBQVIsQ0FBYSxRQUFiLEVBQXVCLE1BQXZCO0FBQ0g7QUFDSjs7O3lDQUV1QixRLEVBQVU7QUFDOUIsMkJBQWUsT0FBZixDQUF1QixXQUF2QixDQUFtQyxRQUFuQyxFQUE2QyxRQUE3QztBQUNIOzs7dUNBRXFCLFEsRUFBVTtBQUM1QiwyQkFBZSxPQUFmLENBQXVCLGNBQXZCLENBQXNDLFFBQXRDLEVBQWdELFFBQWhEO0FBQ0g7Ozt1Q0FFcUIsUSxFQUFVO0FBQzVCLDZCQUFJLE9BQUosQ0FBWSxXQUFaLENBQXdCLEtBQXhCLEVBQStCLFFBQS9CO0FBQ0EsZ0JBQUksaUJBQUksT0FBSixDQUFZLGFBQVosQ0FBMEIsS0FBMUIsSUFBbUMsQ0FBdkMsRUFBMEM7QUFDdEMsaUNBQUksZUFBSixHQUFzQixJQUF0QjtBQUNBLCtCQUFlLGFBQWY7QUFDSDtBQUNKOzs7MENBRXdCLFEsRUFBVTtBQUMvQiw2QkFBSSxPQUFKLENBQVksY0FBWixDQUEyQixLQUEzQixFQUFrQyxRQUFsQztBQUNBLGdCQUFJLGlCQUFJLE9BQUosQ0FBWSxhQUFaLENBQTBCLEtBQTFCLE1BQXFDLENBQXpDLEVBQTRDO0FBQ3hDLGlDQUFJLGVBQUosR0FBc0IsS0FBdEI7QUFDQSwrQkFBZSxhQUFmO0FBQ0g7QUFDSjs7OzRCQXZJMkI7QUFDeEIsbUJBQU8saUJBQUksZ0JBQVg7QUFDSCxTOzBCQUV5QixNLEVBQVE7QUFDOUIsNkJBQUksZ0JBQUosR0FBdUIsTUFBdkI7QUFDQSwyQkFBZSxhQUFmO0FBQ0g7Ozs0QkFFc0I7QUFDbkIsbUJBQU8saUJBQUksVUFBWDtBQUNILFM7MEJBRW9CLEcsRUFBSztBQUN0Qiw2QkFBSSxVQUFKLEdBQWlCLEdBQWpCO0FBQ0EsMkJBQWUsYUFBZjtBQUNIOzs7NEJBRXNCO0FBQ25CLG1CQUFPLGlCQUFJLGNBQUosSUFDQSxpQkFBSSxZQURKLElBRUEsaUJBQUksV0FGSixJQUdBLGlCQUFJLFdBSEosSUFJQSxpQkFBSSxZQUpYO0FBS0gsUzswQkFFb0IsTSxFQUFRO0FBQ3pCLDZCQUFJLGNBQUosR0FBcUIsTUFBckI7QUFDQSw2QkFBSSxZQUFKLEdBQW1CLE1BQW5CO0FBQ0EsNkJBQUksV0FBSixHQUFrQixNQUFsQjtBQUNBLDZCQUFJLFdBQUosR0FBa0IsTUFBbEI7QUFDQSw2QkFBSSxZQUFKLEdBQW1CLE1BQW5CO0FBQ0EsMkJBQWUsYUFBZjtBQUNIOzs7NEJBRXdCO0FBQ3JCLG1CQUFPLGlCQUFJLFlBQVg7QUFDSCxTOzBCQUVzQixNLEVBQVE7QUFDM0IsNkJBQUksWUFBSixHQUFtQixNQUFuQjtBQUNBLDJCQUFlLGFBQWY7QUFDSDs7OzRCQUUwQjtBQUN2QixtQkFBTyxpQkFBSSxjQUFYO0FBQ0gsUzswQkFFd0IsTSxFQUFRO0FBQzdCLDZCQUFJLGNBQUosR0FBcUIsTUFBckI7QUFDQSwyQkFBZSxhQUFmO0FBQ0g7Ozs0QkFFdUI7QUFDcEIsbUJBQU8saUJBQUksV0FBWDtBQUNILFM7MEJBRXFCLE0sRUFBUTtBQUMxQiw2QkFBSSxXQUFKLEdBQWtCLE1BQWxCO0FBQ0EsMkJBQWUsYUFBZjtBQUNIOzs7NEJBRXVCO0FBQ3BCLG1CQUFPLGlCQUFJLFdBQVg7QUFDSCxTOzBCQUVxQixNLEVBQVE7QUFDMUIsNkJBQUksV0FBSixHQUFrQixNQUFsQjtBQUNBLDJCQUFlLGFBQWY7QUFDSDs7OzRCQUV3QjtBQUNyQixtQkFBTyxpQkFBSSxZQUFYO0FBQ0gsUzswQkFFc0IsTSxFQUFRO0FBQzNCLDZCQUFJLFlBQUosR0FBbUIsTUFBbkI7QUFDQSwyQkFBZSxhQUFmO0FBQ0g7Ozs7OztBQTZETCxlQUFlLE9BQWYsR0FBeUIsc0JBQXpCOztrQkFFZSxjOzs7Ozs7Ozs7Ozs7O0FDcEtmOzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFrQk0sUTs7Ozs7OztrQ0FFZTtBQUNiO0FBQ0EsbUJBQU8sY0FBUCxHQUF3QixPQUFPLGNBQVAsSUFBeUIsVUFBVSxHQUFWLEVBQWUsS0FBZixFQUFzQjtBQUNuRSxvQkFBSSxTQUFKLEdBQWdCLEtBQWhCO0FBQ0EsdUJBQU8sR0FBUDtBQUNILGFBSEQ7O0FBS0E7QUFDQSxtQkFBTyxNQUFQLEdBQWdCLE9BQU8sTUFBUCxJQUFpQixVQUFVLE1BQVYsRUFBa0I7QUFDL0Msb0JBQUksV0FBVyxTQUFYLElBQXdCLFdBQVcsSUFBdkMsRUFBNkM7QUFDekMsMEJBQU0sSUFBSSxTQUFKLENBQWMsNENBQWQsQ0FBTjtBQUNIOztBQUVELG9CQUFJLFNBQVMsT0FBTyxNQUFQLENBQWI7QUFDQSxxQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFVBQVUsTUFBOUIsRUFBc0MsR0FBdEMsRUFBMkM7QUFDdkMsd0JBQUksU0FBUyxVQUFVLENBQVYsQ0FBYjtBQUNBLHdCQUFJLFdBQVcsU0FBWCxJQUF3QixXQUFXLElBQXZDLEVBQTZDO0FBQ3pDLDZCQUFLLElBQUksR0FBVCxJQUFnQixNQUFoQixFQUF3QjtBQUNwQixnQ0FBSSxPQUFPLGNBQVAsQ0FBc0IsR0FBdEIsQ0FBSixFQUFnQztBQUM1Qix1Q0FBTyxHQUFQLElBQWMsT0FBTyxHQUFQLENBQWQ7QUFDSDtBQUNKO0FBQ0o7QUFDSjtBQUNELHVCQUFPLE1BQVA7QUFDSCxhQWpCRDs7QUFtQkE7QUFDQSxnQkFBSSxPQUFPLEtBQUssT0FBWixLQUF3QixVQUE1QixFQUF3QztBQUNwQyx3QkFBUSxhQUFSLEVBQXVCLFFBQXZCO0FBQ0g7QUFDSjs7Ozs7O0FBSUwsU0FBUyxPQUFUOztrQkFFZSxROzs7Ozs7OztBQ3pEZjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CQSxTQUFTLGlCQUFULENBQTJCLFVBQTNCLEVBQXVDLEtBQXZDLEVBQThDLFdBQTlDLEVBQTJEO0FBQ3ZELFFBQUksUUFBUSxVQUFaO0FBQ0EsUUFBSSxRQUFRLFdBQVIsR0FBc0IsTUFBTSxNQUFoQyxFQUF3QztBQUNwQyxlQUFPLGFBQVAsRUFBc0I7QUFDbEIsZ0JBQUksQ0FBQyxNQUFNLEVBQUUsS0FBUixJQUFpQixJQUFsQixNQUE0QixJQUFoQyxFQUNJLE9BQU8sS0FBUDtBQUNQO0FBQ0QsZUFBTyxJQUFQO0FBQ0gsS0FORCxNQU1PO0FBQ0gsZUFBTyxLQUFQO0FBQ0g7QUFDSjs7QUFFRCxTQUFTLFVBQVQsQ0FBb0IsVUFBcEIsRUFBZ0M7QUFDNUIsUUFBSSxNQUFNLEVBQVY7QUFDQSxRQUFJLFFBQVEsVUFBWjtBQUNBLFFBQUksSUFBSSxDQUFSO0FBQ0EsUUFBSSxTQUFTLFdBQVcsTUFBeEI7O0FBRUEsV0FBTyxJQUFJLE1BQVgsRUFBbUI7QUFDZixZQUFJLE1BQU0sQ0FBTixJQUFXLElBQWYsRUFBcUI7QUFDakIsZ0JBQUksSUFBSixDQUFTLE9BQU8sWUFBUCxDQUFvQixNQUFNLENBQU4sQ0FBcEIsQ0FBVDtBQUNBLGNBQUUsQ0FBRjtBQUNBO0FBQ0gsU0FKRCxNQUlPLElBQUksTUFBTSxDQUFOLElBQVcsSUFBZixFQUFxQjtBQUN4QjtBQUNILFNBRk0sTUFFQSxJQUFJLE1BQU0sQ0FBTixJQUFXLElBQWYsRUFBcUI7QUFDeEIsZ0JBQUksa0JBQWtCLEtBQWxCLEVBQXlCLENBQXpCLEVBQTRCLENBQTVCLENBQUosRUFBb0M7QUFDaEMsb0JBQUksT0FBTyxDQUFDLE1BQU0sQ0FBTixJQUFXLElBQVosS0FBcUIsQ0FBckIsR0FBMEIsTUFBTSxJQUFJLENBQVYsSUFBZSxJQUFwRDtBQUNBLG9CQUFJLFFBQVEsSUFBWixFQUFrQjtBQUNkLHdCQUFJLElBQUosQ0FBUyxPQUFPLFlBQVAsQ0FBb0IsT0FBTyxNQUEzQixDQUFUO0FBQ0EseUJBQUssQ0FBTDtBQUNBO0FBQ0g7QUFDSjtBQUNKLFNBVE0sTUFTQSxJQUFJLE1BQU0sQ0FBTixJQUFXLElBQWYsRUFBcUI7QUFDeEIsZ0JBQUksa0JBQWtCLEtBQWxCLEVBQXlCLENBQXpCLEVBQTRCLENBQTVCLENBQUosRUFBb0M7QUFDaEMsb0JBQUksT0FBTyxDQUFDLE1BQU0sQ0FBTixJQUFXLEdBQVosS0FBb0IsRUFBcEIsR0FBeUIsQ0FBQyxNQUFNLElBQUksQ0FBVixJQUFlLElBQWhCLEtBQXlCLENBQWxELEdBQXNELE1BQU0sSUFBSSxDQUFWLElBQWUsSUFBaEY7QUFDQSxvQkFBSSxRQUFRLEtBQVIsSUFBaUIsQ0FBQyxPQUFPLE1BQVIsTUFBb0IsTUFBekMsRUFBaUQ7QUFDN0Msd0JBQUksSUFBSixDQUFTLE9BQU8sWUFBUCxDQUFvQixPQUFPLE1BQTNCLENBQVQ7QUFDQSx5QkFBSyxDQUFMO0FBQ0E7QUFDSDtBQUNKO0FBQ0osU0FUTSxNQVNBLElBQUksTUFBTSxDQUFOLElBQVcsSUFBZixFQUFxQjtBQUN4QixnQkFBSSxrQkFBa0IsS0FBbEIsRUFBeUIsQ0FBekIsRUFBNEIsQ0FBNUIsQ0FBSixFQUFvQztBQUNoQyxvQkFBSSxRQUFPLENBQUMsTUFBTSxDQUFOLElBQVcsR0FBWixLQUFvQixFQUFwQixHQUF5QixDQUFDLE1BQU0sSUFBSSxDQUFWLElBQWUsSUFBaEIsS0FBeUIsRUFBbEQsR0FDQSxDQUFDLE1BQU0sSUFBSSxDQUFWLElBQWUsSUFBaEIsS0FBeUIsQ0FEekIsR0FDOEIsTUFBTSxJQUFJLENBQVYsSUFBZSxJQUR4RDtBQUVBLG9CQUFJLFFBQU8sT0FBUCxJQUFrQixRQUFPLFFBQTdCLEVBQXVDO0FBQ25DLDZCQUFRLE9BQVI7QUFDQSx3QkFBSSxJQUFKLENBQVMsT0FBTyxZQUFQLENBQXFCLFVBQVMsRUFBVixHQUFnQixNQUFwQyxDQUFUO0FBQ0Esd0JBQUksSUFBSixDQUFTLE9BQU8sWUFBUCxDQUFxQixRQUFPLEtBQVIsR0FBaUIsTUFBckMsQ0FBVDtBQUNBLHlCQUFLLENBQUw7QUFDQTtBQUNIO0FBQ0o7QUFDSjtBQUNELFlBQUksSUFBSixDQUFTLE9BQU8sWUFBUCxDQUFvQixNQUFwQixDQUFUO0FBQ0EsVUFBRSxDQUFGO0FBQ0g7O0FBRUQsV0FBTyxJQUFJLElBQUosQ0FBUyxFQUFULENBQVA7QUFDSDs7a0JBRWMsVSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvKiFcbiAqIEBvdmVydmlldyBlczYtcHJvbWlzZSAtIGEgdGlueSBpbXBsZW1lbnRhdGlvbiBvZiBQcm9taXNlcy9BKy5cbiAqIEBjb3B5cmlnaHQgQ29weXJpZ2h0IChjKSAyMDE0IFllaHVkYSBLYXR6LCBUb20gRGFsZSwgU3RlZmFuIFBlbm5lciBhbmQgY29udHJpYnV0b3JzIChDb252ZXJzaW9uIHRvIEVTNiBBUEkgYnkgSmFrZSBBcmNoaWJhbGQpXG4gKiBAbGljZW5zZSAgIExpY2Vuc2VkIHVuZGVyIE1JVCBsaWNlbnNlXG4gKiAgICAgICAgICAgIFNlZSBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vc3RlZmFucGVubmVyL2VzNi1wcm9taXNlL21hc3Rlci9MSUNFTlNFXG4gKiBAdmVyc2lvbiAgIHY0LjIuNSs3ZjJiNTI2ZFxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG5cdHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcblx0dHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcblx0KGdsb2JhbC5FUzZQcm9taXNlID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBvYmplY3RPckZ1bmN0aW9uKHgpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgeDtcbiAgcmV0dXJuIHggIT09IG51bGwgJiYgKHR5cGUgPT09ICdvYmplY3QnIHx8IHR5cGUgPT09ICdmdW5jdGlvbicpO1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xufVxuXG5cblxudmFyIF9pc0FycmF5ID0gdm9pZCAwO1xuaWYgKEFycmF5LmlzQXJyYXkpIHtcbiAgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xufSBlbHNlIHtcbiAgX2lzQXJyYXkgPSBmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gIH07XG59XG5cbnZhciBpc0FycmF5ID0gX2lzQXJyYXk7XG5cbnZhciBsZW4gPSAwO1xudmFyIHZlcnR4TmV4dCA9IHZvaWQgMDtcbnZhciBjdXN0b21TY2hlZHVsZXJGbiA9IHZvaWQgMDtcblxudmFyIGFzYXAgPSBmdW5jdGlvbiBhc2FwKGNhbGxiYWNrLCBhcmcpIHtcbiAgcXVldWVbbGVuXSA9IGNhbGxiYWNrO1xuICBxdWV1ZVtsZW4gKyAxXSA9IGFyZztcbiAgbGVuICs9IDI7XG4gIGlmIChsZW4gPT09IDIpIHtcbiAgICAvLyBJZiBsZW4gaXMgMiwgdGhhdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gc2NoZWR1bGUgYW4gYXN5bmMgZmx1c2guXG4gICAgLy8gSWYgYWRkaXRpb25hbCBjYWxsYmFja3MgYXJlIHF1ZXVlZCBiZWZvcmUgdGhlIHF1ZXVlIGlzIGZsdXNoZWQsIHRoZXlcbiAgICAvLyB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGlzIGZsdXNoIHRoYXQgd2UgYXJlIHNjaGVkdWxpbmcuXG4gICAgaWYgKGN1c3RvbVNjaGVkdWxlckZuKSB7XG4gICAgICBjdXN0b21TY2hlZHVsZXJGbihmbHVzaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjaGVkdWxlRmx1c2goKTtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNldFNjaGVkdWxlcihzY2hlZHVsZUZuKSB7XG4gIGN1c3RvbVNjaGVkdWxlckZuID0gc2NoZWR1bGVGbjtcbn1cblxuZnVuY3Rpb24gc2V0QXNhcChhc2FwRm4pIHtcbiAgYXNhcCA9IGFzYXBGbjtcbn1cblxudmFyIGJyb3dzZXJXaW5kb3cgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcbnZhciBicm93c2VyR2xvYmFsID0gYnJvd3NlcldpbmRvdyB8fCB7fTtcbnZhciBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IGJyb3dzZXJHbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBicm93c2VyR2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgaXNOb2RlID0gdHlwZW9mIHNlbGYgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB7fS50b1N0cmluZy5jYWxsKHByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXSc7XG5cbi8vIHRlc3QgZm9yIHdlYiB3b3JrZXIgYnV0IG5vdCBpbiBJRTEwXG52YXIgaXNXb3JrZXIgPSB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBpbXBvcnRTY3JpcHRzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnO1xuXG4vLyBub2RlXG5mdW5jdGlvbiB1c2VOZXh0VGljaygpIHtcbiAgLy8gbm9kZSB2ZXJzaW9uIDAuMTAueCBkaXNwbGF5cyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2hlbiBuZXh0VGljayBpcyB1c2VkIHJlY3Vyc2l2ZWx5XG4gIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vY3Vqb2pzL3doZW4vaXNzdWVzLzQxMCBmb3IgZGV0YWlsc1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgfTtcbn1cblxuLy8gdmVydHhcbmZ1bmN0aW9uIHVzZVZlcnR4VGltZXIoKSB7XG4gIGlmICh0eXBlb2YgdmVydHhOZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2ZXJ0eE5leHQoZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gdXNlU2V0VGltZW91dCgpO1xufVxuXG5mdW5jdGlvbiB1c2VNdXRhdGlvbk9ic2VydmVyKCkge1xuICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gIHZhciBvYnNlcnZlciA9IG5ldyBCcm93c2VyTXV0YXRpb25PYnNlcnZlcihmbHVzaCk7XG4gIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICBvYnNlcnZlci5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIG5vZGUuZGF0YSA9IGl0ZXJhdGlvbnMgPSArK2l0ZXJhdGlvbnMgJSAyO1xuICB9O1xufVxuXG4vLyB3ZWIgd29ya2VyXG5mdW5jdGlvbiB1c2VNZXNzYWdlQ2hhbm5lbCgpIHtcbiAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmbHVzaDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlU2V0VGltZW91dCgpIHtcbiAgLy8gU3RvcmUgc2V0VGltZW91dCByZWZlcmVuY2Ugc28gZXM2LXByb21pc2Ugd2lsbCBiZSB1bmFmZmVjdGVkIGJ5XG4gIC8vIG90aGVyIGNvZGUgbW9kaWZ5aW5nIHNldFRpbWVvdXQgKGxpa2Ugc2lub24udXNlRmFrZVRpbWVycygpKVxuICB2YXIgZ2xvYmFsU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdsb2JhbFNldFRpbWVvdXQoZmx1c2gsIDEpO1xuICB9O1xufVxuXG52YXIgcXVldWUgPSBuZXcgQXJyYXkoMTAwMCk7XG5mdW5jdGlvbiBmbHVzaCgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHZhciBjYWxsYmFjayA9IHF1ZXVlW2ldO1xuICAgIHZhciBhcmcgPSBxdWV1ZVtpICsgMV07XG5cbiAgICBjYWxsYmFjayhhcmcpO1xuXG4gICAgcXVldWVbaV0gPSB1bmRlZmluZWQ7XG4gICAgcXVldWVbaSArIDFdID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgbGVuID0gMDtcbn1cblxuZnVuY3Rpb24gYXR0ZW1wdFZlcnR4KCkge1xuICB0cnkge1xuICAgIHZhciB2ZXJ0eCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCkucmVxdWlyZSgndmVydHgnKTtcbiAgICB2ZXJ0eE5leHQgPSB2ZXJ0eC5ydW5Pbkxvb3AgfHwgdmVydHgucnVuT25Db250ZXh0O1xuICAgIHJldHVybiB1c2VWZXJ0eFRpbWVyKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdXNlU2V0VGltZW91dCgpO1xuICB9XG59XG5cbnZhciBzY2hlZHVsZUZsdXNoID0gdm9pZCAwO1xuLy8gRGVjaWRlIHdoYXQgYXN5bmMgbWV0aG9kIHRvIHVzZSB0byB0cmlnZ2VyaW5nIHByb2Nlc3Npbmcgb2YgcXVldWVkIGNhbGxiYWNrczpcbmlmIChpc05vZGUpIHtcbiAgc2NoZWR1bGVGbHVzaCA9IHVzZU5leHRUaWNrKCk7XG59IGVsc2UgaWYgKEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyKSB7XG4gIHNjaGVkdWxlRmx1c2ggPSB1c2VNdXRhdGlvbk9ic2VydmVyKCk7XG59IGVsc2UgaWYgKGlzV29ya2VyKSB7XG4gIHNjaGVkdWxlRmx1c2ggPSB1c2VNZXNzYWdlQ2hhbm5lbCgpO1xufSBlbHNlIGlmIChicm93c2VyV2luZG93ID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicpIHtcbiAgc2NoZWR1bGVGbHVzaCA9IGF0dGVtcHRWZXJ0eCgpO1xufSBlbHNlIHtcbiAgc2NoZWR1bGVGbHVzaCA9IHVzZVNldFRpbWVvdXQoKTtcbn1cblxuZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikge1xuICB2YXIgcGFyZW50ID0gdGhpcztcblxuICB2YXIgY2hpbGQgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcihub29wKTtcblxuICBpZiAoY2hpbGRbUFJPTUlTRV9JRF0gPT09IHVuZGVmaW5lZCkge1xuICAgIG1ha2VQcm9taXNlKGNoaWxkKTtcbiAgfVxuXG4gIHZhciBfc3RhdGUgPSBwYXJlbnQuX3N0YXRlO1xuXG5cbiAgaWYgKF9zdGF0ZSkge1xuICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1tfc3RhdGUgLSAxXTtcbiAgICBhc2FwKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBpbnZva2VDYWxsYmFjayhfc3RhdGUsIGNoaWxkLCBjYWxsYmFjaywgcGFyZW50Ll9yZXN1bHQpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbik7XG4gIH1cblxuICByZXR1cm4gY2hpbGQ7XG59XG5cbi8qKlxuICBgUHJvbWlzZS5yZXNvbHZlYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmVjb21lIHJlc29sdmVkIHdpdGggdGhlXG4gIHBhc3NlZCBgdmFsdWVgLiBJdCBpcyBzaG9ydGhhbmQgZm9yIHRoZSBmb2xsb3dpbmc6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgcmVzb2x2ZSgxKTtcbiAgfSk7XG5cbiAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAvLyB2YWx1ZSA9PT0gMVxuICB9KTtcbiAgYGBgXG5cbiAgSW5zdGVhZCBvZiB3cml0aW5nIHRoZSBhYm92ZSwgeW91ciBjb2RlIG5vdyBzaW1wbHkgYmVjb21lcyB0aGUgZm9sbG93aW5nOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoMSk7XG5cbiAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAvLyB2YWx1ZSA9PT0gMVxuICB9KTtcbiAgYGBgXG5cbiAgQG1ldGhvZCByZXNvbHZlXG4gIEBzdGF0aWNcbiAgQHBhcmFtIHtBbnl9IHZhbHVlIHZhbHVlIHRoYXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBiZSByZXNvbHZlZCB3aXRoXG4gIFVzZWZ1bCBmb3IgdG9vbGluZy5cbiAgQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZWNvbWUgZnVsZmlsbGVkIHdpdGggdGhlIGdpdmVuXG4gIGB2YWx1ZWBcbiovXG5mdW5jdGlvbiByZXNvbHZlJDEob2JqZWN0KSB7XG4gIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gIHZhciBDb25zdHJ1Y3RvciA9IHRoaXM7XG5cbiAgaWYgKG9iamVjdCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QuY29uc3RydWN0b3IgPT09IENvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIHZhciBwcm9taXNlID0gbmV3IENvbnN0cnVjdG9yKG5vb3ApO1xuICByZXNvbHZlKHByb21pc2UsIG9iamVjdCk7XG4gIHJldHVybiBwcm9taXNlO1xufVxuXG52YXIgUFJPTUlTRV9JRCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyKTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBQRU5ESU5HID0gdm9pZCAwO1xudmFyIEZVTEZJTExFRCA9IDE7XG52YXIgUkVKRUNURUQgPSAyO1xuXG52YXIgVFJZX0NBVENIX0VSUk9SID0geyBlcnJvcjogbnVsbCB9O1xuXG5mdW5jdGlvbiBzZWxmRnVsZmlsbG1lbnQoKSB7XG4gIHJldHVybiBuZXcgVHlwZUVycm9yKFwiWW91IGNhbm5vdCByZXNvbHZlIGEgcHJvbWlzZSB3aXRoIGl0c2VsZlwiKTtcbn1cblxuZnVuY3Rpb24gY2Fubm90UmV0dXJuT3duKCkge1xuICByZXR1cm4gbmV3IFR5cGVFcnJvcignQSBwcm9taXNlcyBjYWxsYmFjayBjYW5ub3QgcmV0dXJuIHRoYXQgc2FtZSBwcm9taXNlLicpO1xufVxuXG5mdW5jdGlvbiBnZXRUaGVuKHByb21pc2UpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcHJvbWlzZS50aGVuO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIFRSWV9DQVRDSF9FUlJPUi5lcnJvciA9IGVycm9yO1xuICAgIHJldHVybiBUUllfQ0FUQ0hfRVJST1I7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5VGhlbih0aGVuJCQxLCB2YWx1ZSwgZnVsZmlsbG1lbnRIYW5kbGVyLCByZWplY3Rpb25IYW5kbGVyKSB7XG4gIHRyeSB7XG4gICAgdGhlbiQkMS5jYWxsKHZhbHVlLCBmdWxmaWxsbWVudEhhbmRsZXIsIHJlamVjdGlvbkhhbmRsZXIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlLCB0aGVuJCQxKSB7XG4gIGFzYXAoZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICB2YXIgc2VhbGVkID0gZmFsc2U7XG4gICAgdmFyIGVycm9yID0gdHJ5VGhlbih0aGVuJCQxLCB0aGVuYWJsZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAoc2VhbGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICBpZiAodGhlbmFibGUgIT09IHZhbHVlKSB7XG4gICAgICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgaWYgKHNlYWxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZWFsZWQgPSB0cnVlO1xuXG4gICAgICByZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICB9LCAnU2V0dGxlOiAnICsgKHByb21pc2UuX2xhYmVsIHx8ICcgdW5rbm93biBwcm9taXNlJykpO1xuXG4gICAgaWYgKCFzZWFsZWQgJiYgZXJyb3IpIHtcbiAgICAgIHNlYWxlZCA9IHRydWU7XG4gICAgICByZWplY3QocHJvbWlzZSwgZXJyb3IpO1xuICAgIH1cbiAgfSwgcHJvbWlzZSk7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU93blRoZW5hYmxlKHByb21pc2UsIHRoZW5hYmxlKSB7XG4gIGlmICh0aGVuYWJsZS5fc3RhdGUgPT09IEZVTEZJTExFRCkge1xuICAgIGZ1bGZpbGwocHJvbWlzZSwgdGhlbmFibGUuX3Jlc3VsdCk7XG4gIH0gZWxzZSBpZiAodGhlbmFibGUuX3N0YXRlID09PSBSRUpFQ1RFRCkge1xuICAgIHJlamVjdChwcm9taXNlLCB0aGVuYWJsZS5fcmVzdWx0KTtcbiAgfSBlbHNlIHtcbiAgICBzdWJzY3JpYmUodGhlbmFibGUsIHVuZGVmaW5lZCwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShwcm9taXNlLCB2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgcmV0dXJuIHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSwgdGhlbiQkMSkge1xuICBpZiAobWF5YmVUaGVuYWJsZS5jb25zdHJ1Y3RvciA9PT0gcHJvbWlzZS5jb25zdHJ1Y3RvciAmJiB0aGVuJCQxID09PSB0aGVuICYmIG1heWJlVGhlbmFibGUuY29uc3RydWN0b3IucmVzb2x2ZSA9PT0gcmVzb2x2ZSQxKSB7XG4gICAgaGFuZGxlT3duVGhlbmFibGUocHJvbWlzZSwgbWF5YmVUaGVuYWJsZSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRoZW4kJDEgPT09IFRSWV9DQVRDSF9FUlJPUikge1xuICAgICAgcmVqZWN0KHByb21pc2UsIFRSWV9DQVRDSF9FUlJPUi5lcnJvcik7XG4gICAgICBUUllfQ0FUQ0hfRVJST1IuZXJyb3IgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAodGhlbiQkMSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmdWxmaWxsKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbih0aGVuJCQxKSkge1xuICAgICAgaGFuZGxlRm9yZWlnblRoZW5hYmxlKHByb21pc2UsIG1heWJlVGhlbmFibGUsIHRoZW4kJDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmdWxmaWxsKHByb21pc2UsIG1heWJlVGhlbmFibGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlKHByb21pc2UsIHZhbHVlKSB7XG4gIGlmIChwcm9taXNlID09PSB2YWx1ZSkge1xuICAgIHJlamVjdChwcm9taXNlLCBzZWxmRnVsZmlsbG1lbnQoKSk7XG4gIH0gZWxzZSBpZiAob2JqZWN0T3JGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICBoYW5kbGVNYXliZVRoZW5hYmxlKHByb21pc2UsIHZhbHVlLCBnZXRUaGVuKHZhbHVlKSk7XG4gIH0gZWxzZSB7XG4gICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVibGlzaFJlamVjdGlvbihwcm9taXNlKSB7XG4gIGlmIChwcm9taXNlLl9vbmVycm9yKSB7XG4gICAgcHJvbWlzZS5fb25lcnJvcihwcm9taXNlLl9yZXN1bHQpO1xuICB9XG5cbiAgcHVibGlzaChwcm9taXNlKTtcbn1cblxuZnVuY3Rpb24gZnVsZmlsbChwcm9taXNlLCB2YWx1ZSkge1xuICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IFBFTkRJTkcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwcm9taXNlLl9yZXN1bHQgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fc3RhdGUgPSBGVUxGSUxMRUQ7XG5cbiAgaWYgKHByb21pc2UuX3N1YnNjcmliZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgIGFzYXAocHVibGlzaCwgcHJvbWlzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVqZWN0KHByb21pc2UsIHJlYXNvbikge1xuICBpZiAocHJvbWlzZS5fc3RhdGUgIT09IFBFTkRJTkcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcHJvbWlzZS5fc3RhdGUgPSBSRUpFQ1RFRDtcbiAgcHJvbWlzZS5fcmVzdWx0ID0gcmVhc29uO1xuXG4gIGFzYXAocHVibGlzaFJlamVjdGlvbiwgcHJvbWlzZSk7XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZShwYXJlbnQsIGNoaWxkLCBvbkZ1bGZpbGxtZW50LCBvblJlamVjdGlvbikge1xuICB2YXIgX3N1YnNjcmliZXJzID0gcGFyZW50Ll9zdWJzY3JpYmVycztcbiAgdmFyIGxlbmd0aCA9IF9zdWJzY3JpYmVycy5sZW5ndGg7XG5cblxuICBwYXJlbnQuX29uZXJyb3IgPSBudWxsO1xuXG4gIF9zdWJzY3JpYmVyc1tsZW5ndGhdID0gY2hpbGQ7XG4gIF9zdWJzY3JpYmVyc1tsZW5ndGggKyBGVUxGSUxMRURdID0gb25GdWxmaWxsbWVudDtcbiAgX3N1YnNjcmliZXJzW2xlbmd0aCArIFJFSkVDVEVEXSA9IG9uUmVqZWN0aW9uO1xuXG4gIGlmIChsZW5ndGggPT09IDAgJiYgcGFyZW50Ll9zdGF0ZSkge1xuICAgIGFzYXAocHVibGlzaCwgcGFyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwdWJsaXNoKHByb21pc2UpIHtcbiAgdmFyIHN1YnNjcmliZXJzID0gcHJvbWlzZS5fc3Vic2NyaWJlcnM7XG4gIHZhciBzZXR0bGVkID0gcHJvbWlzZS5fc3RhdGU7XG5cbiAgaWYgKHN1YnNjcmliZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBjaGlsZCA9IHZvaWQgMCxcbiAgICAgIGNhbGxiYWNrID0gdm9pZCAwLFxuICAgICAgZGV0YWlsID0gcHJvbWlzZS5fcmVzdWx0O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic2NyaWJlcnMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICBjaGlsZCA9IHN1YnNjcmliZXJzW2ldO1xuICAgIGNhbGxiYWNrID0gc3Vic2NyaWJlcnNbaSArIHNldHRsZWRdO1xuXG4gICAgaWYgKGNoaWxkKSB7XG4gICAgICBpbnZva2VDYWxsYmFjayhzZXR0bGVkLCBjaGlsZCwgY2FsbGJhY2ssIGRldGFpbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKGRldGFpbCk7XG4gICAgfVxuICB9XG5cbiAgcHJvbWlzZS5fc3Vic2NyaWJlcnMubGVuZ3RoID0gMDtcbn1cblxuZnVuY3Rpb24gdHJ5Q2F0Y2goY2FsbGJhY2ssIGRldGFpbCkge1xuICB0cnkge1xuICAgIHJldHVybiBjYWxsYmFjayhkZXRhaWwpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgVFJZX0NBVENIX0VSUk9SLmVycm9yID0gZTtcbiAgICByZXR1cm4gVFJZX0NBVENIX0VSUk9SO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZUNhbGxiYWNrKHNldHRsZWQsIHByb21pc2UsIGNhbGxiYWNrLCBkZXRhaWwpIHtcbiAgdmFyIGhhc0NhbGxiYWNrID0gaXNGdW5jdGlvbihjYWxsYmFjayksXG4gICAgICB2YWx1ZSA9IHZvaWQgMCxcbiAgICAgIGVycm9yID0gdm9pZCAwLFxuICAgICAgc3VjY2VlZGVkID0gdm9pZCAwLFxuICAgICAgZmFpbGVkID0gdm9pZCAwO1xuXG4gIGlmIChoYXNDYWxsYmFjaykge1xuICAgIHZhbHVlID0gdHJ5Q2F0Y2goY2FsbGJhY2ssIGRldGFpbCk7XG5cbiAgICBpZiAodmFsdWUgPT09IFRSWV9DQVRDSF9FUlJPUikge1xuICAgICAgZmFpbGVkID0gdHJ1ZTtcbiAgICAgIGVycm9yID0gdmFsdWUuZXJyb3I7XG4gICAgICB2YWx1ZS5lcnJvciA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1Y2NlZWRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB7XG4gICAgICByZWplY3QocHJvbWlzZSwgY2Fubm90UmV0dXJuT3duKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGRldGFpbDtcbiAgICBzdWNjZWVkZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBQRU5ESU5HKSB7XG4gICAgLy8gbm9vcFxuICB9IGVsc2UgaWYgKGhhc0NhbGxiYWNrICYmIHN1Y2NlZWRlZCkge1xuICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICB9IGVsc2UgaWYgKGZhaWxlZCkge1xuICAgIHJlamVjdChwcm9taXNlLCBlcnJvcik7XG4gIH0gZWxzZSBpZiAoc2V0dGxlZCA9PT0gRlVMRklMTEVEKSB7XG4gICAgZnVsZmlsbChwcm9taXNlLCB2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoc2V0dGxlZCA9PT0gUkVKRUNURUQpIHtcbiAgICByZWplY3QocHJvbWlzZSwgdmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpemVQcm9taXNlKHByb21pc2UsIHJlc29sdmVyKSB7XG4gIHRyeSB7XG4gICAgcmVzb2x2ZXIoZnVuY3Rpb24gcmVzb2x2ZVByb21pc2UodmFsdWUpIHtcbiAgICAgIHJlc29sdmUocHJvbWlzZSwgdmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uIHJlamVjdFByb21pc2UocmVhc29uKSB7XG4gICAgICByZWplY3QocHJvbWlzZSwgcmVhc29uKTtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlamVjdChwcm9taXNlLCBlKTtcbiAgfVxufVxuXG52YXIgaWQgPSAwO1xuZnVuY3Rpb24gbmV4dElkKCkge1xuICByZXR1cm4gaWQrKztcbn1cblxuZnVuY3Rpb24gbWFrZVByb21pc2UocHJvbWlzZSkge1xuICBwcm9taXNlW1BST01JU0VfSURdID0gaWQrKztcbiAgcHJvbWlzZS5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gIHByb21pc2UuX3Jlc3VsdCA9IHVuZGVmaW5lZDtcbiAgcHJvbWlzZS5fc3Vic2NyaWJlcnMgPSBbXTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGlvbkVycm9yKCkge1xuICByZXR1cm4gbmV3IEVycm9yKCdBcnJheSBNZXRob2RzIG11c3QgYmUgcHJvdmlkZWQgYW4gQXJyYXknKTtcbn1cblxudmFyIEVudW1lcmF0b3IgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEVudW1lcmF0b3IoQ29uc3RydWN0b3IsIGlucHV0KSB7XG4gICAgdGhpcy5faW5zdGFuY2VDb25zdHJ1Y3RvciA9IENvbnN0cnVjdG9yO1xuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBDb25zdHJ1Y3Rvcihub29wKTtcblxuICAgIGlmICghdGhpcy5wcm9taXNlW1BST01JU0VfSURdKSB7XG4gICAgICBtYWtlUHJvbWlzZSh0aGlzLnByb21pc2UpO1xuICAgIH1cblxuICAgIGlmIChpc0FycmF5KGlucHV0KSkge1xuICAgICAgdGhpcy5sZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gICAgICB0aGlzLl9yZW1haW5pbmcgPSBpbnB1dC5sZW5ndGg7XG5cbiAgICAgIHRoaXMuX3Jlc3VsdCA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG5cbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBmdWxmaWxsKHRoaXMucHJvbWlzZSwgdGhpcy5fcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMDtcbiAgICAgICAgdGhpcy5fZW51bWVyYXRlKGlucHV0KTtcbiAgICAgICAgaWYgKHRoaXMuX3JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgIGZ1bGZpbGwodGhpcy5wcm9taXNlLCB0aGlzLl9yZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlamVjdCh0aGlzLnByb21pc2UsIHZhbGlkYXRpb25FcnJvcigpKTtcbiAgICB9XG4gIH1cblxuICBFbnVtZXJhdG9yLnByb3RvdHlwZS5fZW51bWVyYXRlID0gZnVuY3Rpb24gX2VudW1lcmF0ZShpbnB1dCkge1xuICAgIGZvciAodmFyIGkgPSAwOyB0aGlzLl9zdGF0ZSA9PT0gUEVORElORyAmJiBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX2VhY2hFbnRyeShpbnB1dFtpXSwgaSk7XG4gICAgfVxuICB9O1xuXG4gIEVudW1lcmF0b3IucHJvdG90eXBlLl9lYWNoRW50cnkgPSBmdW5jdGlvbiBfZWFjaEVudHJ5KGVudHJ5LCBpKSB7XG4gICAgdmFyIGMgPSB0aGlzLl9pbnN0YW5jZUNvbnN0cnVjdG9yO1xuICAgIHZhciByZXNvbHZlJCQxID0gYy5yZXNvbHZlO1xuXG5cbiAgICBpZiAocmVzb2x2ZSQkMSA9PT0gcmVzb2x2ZSQxKSB7XG4gICAgICB2YXIgX3RoZW4gPSBnZXRUaGVuKGVudHJ5KTtcblxuICAgICAgaWYgKF90aGVuID09PSB0aGVuICYmIGVudHJ5Ll9zdGF0ZSAhPT0gUEVORElORykge1xuICAgICAgICB0aGlzLl9zZXR0bGVkQXQoZW50cnkuX3N0YXRlLCBpLCBlbnRyeS5fcmVzdWx0KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIF90aGVuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMuX3JlbWFpbmluZy0tO1xuICAgICAgICB0aGlzLl9yZXN1bHRbaV0gPSBlbnRyeTtcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gUHJvbWlzZSQxKSB7XG4gICAgICAgIHZhciBwcm9taXNlID0gbmV3IGMobm9vcCk7XG4gICAgICAgIGhhbmRsZU1heWJlVGhlbmFibGUocHJvbWlzZSwgZW50cnksIF90aGVuKTtcbiAgICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KHByb21pc2UsIGkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KG5ldyBjKGZ1bmN0aW9uIChyZXNvbHZlJCQxKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUkJDEoZW50cnkpO1xuICAgICAgICB9KSwgaSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3dpbGxTZXR0bGVBdChyZXNvbHZlJCQxKGVudHJ5KSwgaSk7XG4gICAgfVxuICB9O1xuXG4gIEVudW1lcmF0b3IucHJvdG90eXBlLl9zZXR0bGVkQXQgPSBmdW5jdGlvbiBfc2V0dGxlZEF0KHN0YXRlLCBpLCB2YWx1ZSkge1xuICAgIHZhciBwcm9taXNlID0gdGhpcy5wcm9taXNlO1xuXG5cbiAgICBpZiAocHJvbWlzZS5fc3RhdGUgPT09IFBFTkRJTkcpIHtcbiAgICAgIHRoaXMuX3JlbWFpbmluZy0tO1xuXG4gICAgICBpZiAoc3RhdGUgPT09IFJFSkVDVEVEKSB7XG4gICAgICAgIHJlamVjdChwcm9taXNlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXN1bHRbaV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmVtYWluaW5nID09PSAwKSB7XG4gICAgICBmdWxmaWxsKHByb21pc2UsIHRoaXMuX3Jlc3VsdCk7XG4gICAgfVxuICB9O1xuXG4gIEVudW1lcmF0b3IucHJvdG90eXBlLl93aWxsU2V0dGxlQXQgPSBmdW5jdGlvbiBfd2lsbFNldHRsZUF0KHByb21pc2UsIGkpIHtcbiAgICB2YXIgZW51bWVyYXRvciA9IHRoaXM7XG5cbiAgICBzdWJzY3JpYmUocHJvbWlzZSwgdW5kZWZpbmVkLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBlbnVtZXJhdG9yLl9zZXR0bGVkQXQoRlVMRklMTEVELCBpLCB2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgcmV0dXJuIGVudW1lcmF0b3IuX3NldHRsZWRBdChSRUpFQ1RFRCwgaSwgcmVhc29uKTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gRW51bWVyYXRvcjtcbn0oKTtcblxuLyoqXG4gIGBQcm9taXNlLmFsbGAgYWNjZXB0cyBhbiBhcnJheSBvZiBwcm9taXNlcywgYW5kIHJldHVybnMgYSBuZXcgcHJvbWlzZSB3aGljaFxuICBpcyBmdWxmaWxsZWQgd2l0aCBhbiBhcnJheSBvZiBmdWxmaWxsbWVudCB2YWx1ZXMgZm9yIHRoZSBwYXNzZWQgcHJvbWlzZXMsIG9yXG4gIHJlamVjdGVkIHdpdGggdGhlIHJlYXNvbiBvZiB0aGUgZmlyc3QgcGFzc2VkIHByb21pc2UgdG8gYmUgcmVqZWN0ZWQuIEl0IGNhc3RzIGFsbFxuICBlbGVtZW50cyBvZiB0aGUgcGFzc2VkIGl0ZXJhYmxlIHRvIHByb21pc2VzIGFzIGl0IHJ1bnMgdGhpcyBhbGdvcml0aG0uXG5cbiAgRXhhbXBsZTpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlMSA9IHJlc29sdmUoMSk7XG4gIGxldCBwcm9taXNlMiA9IHJlc29sdmUoMik7XG4gIGxldCBwcm9taXNlMyA9IHJlc29sdmUoMyk7XG4gIGxldCBwcm9taXNlcyA9IFsgcHJvbWlzZTEsIHByb21pc2UyLCBwcm9taXNlMyBdO1xuXG4gIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uKGFycmF5KXtcbiAgICAvLyBUaGUgYXJyYXkgaGVyZSB3b3VsZCBiZSBbIDEsIDIsIDMgXTtcbiAgfSk7XG4gIGBgYFxuXG4gIElmIGFueSBvZiB0aGUgYHByb21pc2VzYCBnaXZlbiB0byBgYWxsYCBhcmUgcmVqZWN0ZWQsIHRoZSBmaXJzdCBwcm9taXNlXG4gIHRoYXQgaXMgcmVqZWN0ZWQgd2lsbCBiZSBnaXZlbiBhcyBhbiBhcmd1bWVudCB0byB0aGUgcmV0dXJuZWQgcHJvbWlzZXMnc1xuICByZWplY3Rpb24gaGFuZGxlci4gRm9yIGV4YW1wbGU6XG5cbiAgRXhhbXBsZTpcblxuICBgYGBqYXZhc2NyaXB0XG4gIGxldCBwcm9taXNlMSA9IHJlc29sdmUoMSk7XG4gIGxldCBwcm9taXNlMiA9IHJlamVjdChuZXcgRXJyb3IoXCIyXCIpKTtcbiAgbGV0IHByb21pc2UzID0gcmVqZWN0KG5ldyBFcnJvcihcIjNcIikpO1xuICBsZXQgcHJvbWlzZXMgPSBbIHByb21pc2UxLCBwcm9taXNlMiwgcHJvbWlzZTMgXTtcblxuICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihmdW5jdGlvbihhcnJheSl7XG4gICAgLy8gQ29kZSBoZXJlIG5ldmVyIHJ1bnMgYmVjYXVzZSB0aGVyZSBhcmUgcmVqZWN0ZWQgcHJvbWlzZXMhXG4gIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgLy8gZXJyb3IubWVzc2FnZSA9PT0gXCIyXCJcbiAgfSk7XG4gIGBgYFxuXG4gIEBtZXRob2QgYWxsXG4gIEBzdGF0aWNcbiAgQHBhcmFtIHtBcnJheX0gZW50cmllcyBhcnJheSBvZiBwcm9taXNlc1xuICBAcGFyYW0ge1N0cmluZ30gbGFiZWwgb3B0aW9uYWwgc3RyaW5nIGZvciBsYWJlbGluZyB0aGUgcHJvbWlzZS5cbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgaXMgZnVsZmlsbGVkIHdoZW4gYWxsIGBwcm9taXNlc2AgaGF2ZSBiZWVuXG4gIGZ1bGZpbGxlZCwgb3IgcmVqZWN0ZWQgaWYgYW55IG9mIHRoZW0gYmVjb21lIHJlamVjdGVkLlxuICBAc3RhdGljXG4qL1xuZnVuY3Rpb24gYWxsKGVudHJpZXMpIHtcbiAgcmV0dXJuIG5ldyBFbnVtZXJhdG9yKHRoaXMsIGVudHJpZXMpLnByb21pc2U7XG59XG5cbi8qKlxuICBgUHJvbWlzZS5yYWNlYCByZXR1cm5zIGEgbmV3IHByb21pc2Ugd2hpY2ggaXMgc2V0dGxlZCBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlXG4gIGZpcnN0IHBhc3NlZCBwcm9taXNlIHRvIHNldHRsZS5cblxuICBFeGFtcGxlOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UxID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KXtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICByZXNvbHZlKCdwcm9taXNlIDEnKTtcbiAgICB9LCAyMDApO1xuICB9KTtcblxuICBsZXQgcHJvbWlzZTIgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHJlc29sdmUoJ3Byb21pc2UgMicpO1xuICAgIH0sIDEwMCk7XG4gIH0pO1xuXG4gIFByb21pc2UucmFjZShbcHJvbWlzZTEsIHByb21pc2UyXSkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgIC8vIHJlc3VsdCA9PT0gJ3Byb21pc2UgMicgYmVjYXVzZSBpdCB3YXMgcmVzb2x2ZWQgYmVmb3JlIHByb21pc2UxXG4gICAgLy8gd2FzIHJlc29sdmVkLlxuICB9KTtcbiAgYGBgXG5cbiAgYFByb21pc2UucmFjZWAgaXMgZGV0ZXJtaW5pc3RpYyBpbiB0aGF0IG9ubHkgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdFxuICBzZXR0bGVkIHByb21pc2UgbWF0dGVycy4gRm9yIGV4YW1wbGUsIGV2ZW4gaWYgb3RoZXIgcHJvbWlzZXMgZ2l2ZW4gdG8gdGhlXG4gIGBwcm9taXNlc2AgYXJyYXkgYXJndW1lbnQgYXJlIHJlc29sdmVkLCBidXQgdGhlIGZpcnN0IHNldHRsZWQgcHJvbWlzZSBoYXNcbiAgYmVjb21lIHJlamVjdGVkIGJlZm9yZSB0aGUgb3RoZXIgcHJvbWlzZXMgYmVjYW1lIGZ1bGZpbGxlZCwgdGhlIHJldHVybmVkXG4gIHByb21pc2Ugd2lsbCBiZWNvbWUgcmVqZWN0ZWQ6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZTEgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3Qpe1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHJlc29sdmUoJ3Byb21pc2UgMScpO1xuICAgIH0sIDIwMCk7XG4gIH0pO1xuXG4gIGxldCBwcm9taXNlMiA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcigncHJvbWlzZSAyJykpO1xuICAgIH0sIDEwMCk7XG4gIH0pO1xuXG4gIFByb21pc2UucmFjZShbcHJvbWlzZTEsIHByb21pc2UyXSkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgIC8vIENvZGUgaGVyZSBuZXZlciBydW5zXG4gIH0sIGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgLy8gcmVhc29uLm1lc3NhZ2UgPT09ICdwcm9taXNlIDInIGJlY2F1c2UgcHJvbWlzZSAyIGJlY2FtZSByZWplY3RlZCBiZWZvcmVcbiAgICAvLyBwcm9taXNlIDEgYmVjYW1lIGZ1bGZpbGxlZFxuICB9KTtcbiAgYGBgXG5cbiAgQW4gZXhhbXBsZSByZWFsLXdvcmxkIHVzZSBjYXNlIGlzIGltcGxlbWVudGluZyB0aW1lb3V0czpcblxuICBgYGBqYXZhc2NyaXB0XG4gIFByb21pc2UucmFjZShbYWpheCgnZm9vLmpzb24nKSwgdGltZW91dCg1MDAwKV0pXG4gIGBgYFxuXG4gIEBtZXRob2QgcmFjZVxuICBAc3RhdGljXG4gIEBwYXJhbSB7QXJyYXl9IHByb21pc2VzIGFycmF5IG9mIHByb21pc2VzIHRvIG9ic2VydmVcbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAcmV0dXJuIHtQcm9taXNlfSBhIHByb21pc2Ugd2hpY2ggc2V0dGxlcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIGZpcnN0IHBhc3NlZFxuICBwcm9taXNlIHRvIHNldHRsZS5cbiovXG5mdW5jdGlvbiByYWNlKGVudHJpZXMpIHtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcblxuICBpZiAoIWlzQXJyYXkoZW50cmllcykpIHtcbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIChfLCByZWplY3QpIHtcbiAgICAgIHJldHVybiByZWplY3QobmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byByYWNlLicpKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBsZW5ndGggPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgQ29uc3RydWN0b3IucmVzb2x2ZShlbnRyaWVzW2ldKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gIGBQcm9taXNlLnJlamVjdGAgcmV0dXJucyBhIHByb21pc2UgcmVqZWN0ZWQgd2l0aCB0aGUgcGFzc2VkIGByZWFzb25gLlxuICBJdCBpcyBzaG9ydGhhbmQgZm9yIHRoZSBmb2xsb3dpbmc6XG5cbiAgYGBgamF2YXNjcmlwdFxuICBsZXQgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgcmVqZWN0KG5ldyBFcnJvcignV0hPT1BTJykpO1xuICB9KTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgIC8vIENvZGUgaGVyZSBkb2Vzbid0IHJ1biBiZWNhdXNlIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIVxuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAnV0hPT1BTJ1xuICB9KTtcbiAgYGBgXG5cbiAgSW5zdGVhZCBvZiB3cml0aW5nIHRoZSBhYm92ZSwgeW91ciBjb2RlIG5vdyBzaW1wbHkgYmVjb21lcyB0aGUgZm9sbG93aW5nOlxuXG4gIGBgYGphdmFzY3JpcHRcbiAgbGV0IHByb21pc2UgPSBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1dIT09QUycpKTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpe1xuICAgIC8vIENvZGUgaGVyZSBkb2Vzbid0IHJ1biBiZWNhdXNlIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIVxuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHJlYXNvbi5tZXNzYWdlID09PSAnV0hPT1BTJ1xuICB9KTtcbiAgYGBgXG5cbiAgQG1ldGhvZCByZWplY3RcbiAgQHN0YXRpY1xuICBAcGFyYW0ge0FueX0gcmVhc29uIHZhbHVlIHRoYXQgdGhlIHJldHVybmVkIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZCB3aXRoLlxuICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gIEByZXR1cm4ge1Byb21pc2V9IGEgcHJvbWlzZSByZWplY3RlZCB3aXRoIHRoZSBnaXZlbiBgcmVhc29uYC5cbiovXG5mdW5jdGlvbiByZWplY3QkMShyZWFzb24pIHtcbiAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgdmFyIENvbnN0cnVjdG9yID0gdGhpcztcbiAgdmFyIHByb21pc2UgPSBuZXcgQ29uc3RydWN0b3Iobm9vcCk7XG4gIHJlamVjdChwcm9taXNlLCByZWFzb24pO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gbmVlZHNSZXNvbHZlcigpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xufVxuXG5mdW5jdGlvbiBuZWVkc05ldygpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZhaWxlZCB0byBjb25zdHJ1Y3QgJ1Byb21pc2UnOiBQbGVhc2UgdXNlIHRoZSAnbmV3JyBvcGVyYXRvciwgdGhpcyBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTtcbn1cblxuLyoqXG4gIFByb21pc2Ugb2JqZWN0cyByZXByZXNlbnQgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBUaGVcbiAgcHJpbWFyeSB3YXkgb2YgaW50ZXJhY3Rpbmcgd2l0aCBhIHByb21pc2UgaXMgdGhyb3VnaCBpdHMgYHRoZW5gIG1ldGhvZCwgd2hpY2hcbiAgcmVnaXN0ZXJzIGNhbGxiYWNrcyB0byByZWNlaXZlIGVpdGhlciBhIHByb21pc2UncyBldmVudHVhbCB2YWx1ZSBvciB0aGUgcmVhc29uXG4gIHdoeSB0aGUgcHJvbWlzZSBjYW5ub3QgYmUgZnVsZmlsbGVkLlxuXG4gIFRlcm1pbm9sb2d5XG4gIC0tLS0tLS0tLS0tXG5cbiAgLSBgcHJvbWlzZWAgaXMgYW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHdpdGggYSBgdGhlbmAgbWV0aG9kIHdob3NlIGJlaGF2aW9yIGNvbmZvcm1zIHRvIHRoaXMgc3BlY2lmaWNhdGlvbi5cbiAgLSBgdGhlbmFibGVgIGlzIGFuIG9iamVjdCBvciBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBgdGhlbmAgbWV0aG9kLlxuICAtIGB2YWx1ZWAgaXMgYW55IGxlZ2FsIEphdmFTY3JpcHQgdmFsdWUgKGluY2x1ZGluZyB1bmRlZmluZWQsIGEgdGhlbmFibGUsIG9yIGEgcHJvbWlzZSkuXG4gIC0gYGV4Y2VwdGlvbmAgaXMgYSB2YWx1ZSB0aGF0IGlzIHRocm93biB1c2luZyB0aGUgdGhyb3cgc3RhdGVtZW50LlxuICAtIGByZWFzb25gIGlzIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2h5IGEgcHJvbWlzZSB3YXMgcmVqZWN0ZWQuXG4gIC0gYHNldHRsZWRgIHRoZSBmaW5hbCByZXN0aW5nIHN0YXRlIG9mIGEgcHJvbWlzZSwgZnVsZmlsbGVkIG9yIHJlamVjdGVkLlxuXG4gIEEgcHJvbWlzZSBjYW4gYmUgaW4gb25lIG9mIHRocmVlIHN0YXRlczogcGVuZGluZywgZnVsZmlsbGVkLCBvciByZWplY3RlZC5cblxuICBQcm9taXNlcyB0aGF0IGFyZSBmdWxmaWxsZWQgaGF2ZSBhIGZ1bGZpbGxtZW50IHZhbHVlIGFuZCBhcmUgaW4gdGhlIGZ1bGZpbGxlZFxuICBzdGF0ZS4gIFByb21pc2VzIHRoYXQgYXJlIHJlamVjdGVkIGhhdmUgYSByZWplY3Rpb24gcmVhc29uIGFuZCBhcmUgaW4gdGhlXG4gIHJlamVjdGVkIHN0YXRlLiAgQSBmdWxmaWxsbWVudCB2YWx1ZSBpcyBuZXZlciBhIHRoZW5hYmxlLlxuXG4gIFByb21pc2VzIGNhbiBhbHNvIGJlIHNhaWQgdG8gKnJlc29sdmUqIGEgdmFsdWUuICBJZiB0aGlzIHZhbHVlIGlzIGFsc28gYVxuICBwcm9taXNlLCB0aGVuIHRoZSBvcmlnaW5hbCBwcm9taXNlJ3Mgc2V0dGxlZCBzdGF0ZSB3aWxsIG1hdGNoIHRoZSB2YWx1ZSdzXG4gIHNldHRsZWQgc3RhdGUuICBTbyBhIHByb21pc2UgdGhhdCAqcmVzb2x2ZXMqIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2lsbFxuICBpdHNlbGYgcmVqZWN0LCBhbmQgYSBwcm9taXNlIHRoYXQgKnJlc29sdmVzKiBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aWxsXG4gIGl0c2VsZiBmdWxmaWxsLlxuXG5cbiAgQmFzaWMgVXNhZ2U6XG4gIC0tLS0tLS0tLS0tLVxuXG4gIGBgYGpzXG4gIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgLy8gb24gc3VjY2Vzc1xuICAgIHJlc29sdmUodmFsdWUpO1xuXG4gICAgLy8gb24gZmFpbHVyZVxuICAgIHJlamVjdChyZWFzb24pO1xuICB9KTtcblxuICBwcm9taXNlLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAvLyBvbiBmdWxmaWxsbWVudFxuICB9LCBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAvLyBvbiByZWplY3Rpb25cbiAgfSk7XG4gIGBgYFxuXG4gIEFkdmFuY2VkIFVzYWdlOlxuICAtLS0tLS0tLS0tLS0tLS1cblxuICBQcm9taXNlcyBzaGluZSB3aGVuIGFic3RyYWN0aW5nIGF3YXkgYXN5bmNocm9ub3VzIGludGVyYWN0aW9ucyBzdWNoIGFzXG4gIGBYTUxIdHRwUmVxdWVzdGBzLlxuXG4gIGBgYGpzXG4gIGZ1bmN0aW9uIGdldEpTT04odXJsKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICBsZXQgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwpO1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGhhbmRsZXI7XG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2pzb24nO1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICB4aHIuc2VuZCgpO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLkRPTkUpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignZ2V0SlNPTjogYCcgKyB1cmwgKyAnYCBmYWlsZWQgd2l0aCBzdGF0dXM6IFsnICsgdGhpcy5zdGF0dXMgKyAnXScpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRKU09OKCcvcG9zdHMuanNvbicpLnRoZW4oZnVuY3Rpb24oanNvbikge1xuICAgIC8vIG9uIGZ1bGZpbGxtZW50XG4gIH0sIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgIC8vIG9uIHJlamVjdGlvblxuICB9KTtcbiAgYGBgXG5cbiAgVW5saWtlIGNhbGxiYWNrcywgcHJvbWlzZXMgYXJlIGdyZWF0IGNvbXBvc2FibGUgcHJpbWl0aXZlcy5cblxuICBgYGBqc1xuICBQcm9taXNlLmFsbChbXG4gICAgZ2V0SlNPTignL3Bvc3RzJyksXG4gICAgZ2V0SlNPTignL2NvbW1lbnRzJylcbiAgXSkudGhlbihmdW5jdGlvbih2YWx1ZXMpe1xuICAgIHZhbHVlc1swXSAvLyA9PiBwb3N0c0pTT05cbiAgICB2YWx1ZXNbMV0gLy8gPT4gY29tbWVudHNKU09OXG5cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9KTtcbiAgYGBgXG5cbiAgQGNsYXNzIFByb21pc2VcbiAgQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZXJcbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAY29uc3RydWN0b3JcbiovXG5cbnZhciBQcm9taXNlJDEgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFByb21pc2UocmVzb2x2ZXIpIHtcbiAgICB0aGlzW1BST01JU0VfSURdID0gbmV4dElkKCk7XG4gICAgdGhpcy5fcmVzdWx0ID0gdGhpcy5fc3RhdGUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3Vic2NyaWJlcnMgPSBbXTtcblxuICAgIGlmIChub29wICE9PSByZXNvbHZlcikge1xuICAgICAgdHlwZW9mIHJlc29sdmVyICE9PSAnZnVuY3Rpb24nICYmIG5lZWRzUmVzb2x2ZXIoKTtcbiAgICAgIHRoaXMgaW5zdGFuY2VvZiBQcm9taXNlID8gaW5pdGlhbGl6ZVByb21pc2UodGhpcywgcmVzb2x2ZXIpIDogbmVlZHNOZXcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgVGhlIHByaW1hcnkgd2F5IG9mIGludGVyYWN0aW5nIHdpdGggYSBwcm9taXNlIGlzIHRocm91Z2ggaXRzIGB0aGVuYCBtZXRob2QsXG4gIHdoaWNoIHJlZ2lzdGVycyBjYWxsYmFja3MgdG8gcmVjZWl2ZSBlaXRoZXIgYSBwcm9taXNlJ3MgZXZlbnR1YWwgdmFsdWUgb3IgdGhlXG4gIHJlYXNvbiB3aHkgdGhlIHByb21pc2UgY2Fubm90IGJlIGZ1bGZpbGxlZC5cbiAgIGBgYGpzXG4gIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbih1c2VyKXtcbiAgICAvLyB1c2VyIGlzIGF2YWlsYWJsZVxuICB9LCBmdW5jdGlvbihyZWFzb24pe1xuICAgIC8vIHVzZXIgaXMgdW5hdmFpbGFibGUsIGFuZCB5b3UgYXJlIGdpdmVuIHRoZSByZWFzb24gd2h5XG4gIH0pO1xuICBgYGBcbiAgIENoYWluaW5nXG4gIC0tLS0tLS0tXG4gICBUaGUgcmV0dXJuIHZhbHVlIG9mIGB0aGVuYCBpcyBpdHNlbGYgYSBwcm9taXNlLiAgVGhpcyBzZWNvbmQsICdkb3duc3RyZWFtJ1xuICBwcm9taXNlIGlzIHJlc29sdmVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZmlyc3QgcHJvbWlzZSdzIGZ1bGZpbGxtZW50XG4gIG9yIHJlamVjdGlvbiBoYW5kbGVyLCBvciByZWplY3RlZCBpZiB0aGUgaGFuZGxlciB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgYGBganNcbiAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgcmV0dXJuIHVzZXIubmFtZTtcbiAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgIHJldHVybiAnZGVmYXVsdCBuYW1lJztcbiAgfSkudGhlbihmdW5jdGlvbiAodXNlck5hbWUpIHtcbiAgICAvLyBJZiBgZmluZFVzZXJgIGZ1bGZpbGxlZCwgYHVzZXJOYW1lYCB3aWxsIGJlIHRoZSB1c2VyJ3MgbmFtZSwgb3RoZXJ3aXNlIGl0XG4gICAgLy8gd2lsbCBiZSBgJ2RlZmF1bHQgbmFtZSdgXG4gIH0pO1xuICAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCB1c2VyLCBidXQgc3RpbGwgdW5oYXBweScpO1xuICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jyk7XG4gIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gbmV2ZXIgcmVhY2hlZFxuICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgLy8gaWYgYGZpbmRVc2VyYCBmdWxmaWxsZWQsIGByZWFzb25gIHdpbGwgYmUgJ0ZvdW5kIHVzZXIsIGJ1dCBzdGlsbCB1bmhhcHB5Jy5cbiAgICAvLyBJZiBgZmluZFVzZXJgIHJlamVjdGVkLCBgcmVhc29uYCB3aWxsIGJlICdgZmluZFVzZXJgIHJlamVjdGVkIGFuZCB3ZSdyZSB1bmhhcHB5Jy5cbiAgfSk7XG4gIGBgYFxuICBJZiB0aGUgZG93bnN0cmVhbSBwcm9taXNlIGRvZXMgbm90IHNwZWNpZnkgYSByZWplY3Rpb24gaGFuZGxlciwgcmVqZWN0aW9uIHJlYXNvbnMgd2lsbCBiZSBwcm9wYWdhdGVkIGZ1cnRoZXIgZG93bnN0cmVhbS5cbiAgIGBgYGpzXG4gIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgIHRocm93IG5ldyBQZWRhZ29naWNhbEV4Y2VwdGlvbignVXBzdHJlYW0gZXJyb3InKTtcbiAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAvLyBuZXZlciByZWFjaGVkXG4gIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgLy8gbmV2ZXIgcmVhY2hlZFxuICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgLy8gVGhlIGBQZWRnYWdvY2lhbEV4Y2VwdGlvbmAgaXMgcHJvcGFnYXRlZCBhbGwgdGhlIHdheSBkb3duIHRvIGhlcmVcbiAgfSk7XG4gIGBgYFxuICAgQXNzaW1pbGF0aW9uXG4gIC0tLS0tLS0tLS0tLVxuICAgU29tZXRpbWVzIHRoZSB2YWx1ZSB5b3Ugd2FudCB0byBwcm9wYWdhdGUgdG8gYSBkb3duc3RyZWFtIHByb21pc2UgY2FuIG9ubHkgYmVcbiAgcmV0cmlldmVkIGFzeW5jaHJvbm91c2x5LiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSByZXR1cm5pbmcgYSBwcm9taXNlIGluIHRoZVxuICBmdWxmaWxsbWVudCBvciByZWplY3Rpb24gaGFuZGxlci4gVGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIHRoZW4gYmUgcGVuZGluZ1xuICB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyBzZXR0bGVkLiBUaGlzIGlzIGNhbGxlZCAqYXNzaW1pbGF0aW9uKi5cbiAgIGBgYGpzXG4gIGZpbmRVc2VyKCkudGhlbihmdW5jdGlvbiAodXNlcikge1xuICAgIHJldHVybiBmaW5kQ29tbWVudHNCeUF1dGhvcih1c2VyKTtcbiAgfSkudGhlbihmdW5jdGlvbiAoY29tbWVudHMpIHtcbiAgICAvLyBUaGUgdXNlcidzIGNvbW1lbnRzIGFyZSBub3cgYXZhaWxhYmxlXG4gIH0pO1xuICBgYGBcbiAgIElmIHRoZSBhc3NpbWxpYXRlZCBwcm9taXNlIHJlamVjdHMsIHRoZW4gdGhlIGRvd25zdHJlYW0gcHJvbWlzZSB3aWxsIGFsc28gcmVqZWN0LlxuICAgYGBganNcbiAgZmluZFVzZXIoKS50aGVuKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgcmV0dXJuIGZpbmRDb21tZW50c0J5QXV0aG9yKHVzZXIpO1xuICB9KS50aGVuKGZ1bmN0aW9uIChjb21tZW50cykge1xuICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgZnVsZmlsbHMsIHdlJ2xsIGhhdmUgdGhlIHZhbHVlIGhlcmVcbiAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgIC8vIElmIGBmaW5kQ29tbWVudHNCeUF1dGhvcmAgcmVqZWN0cywgd2UnbGwgaGF2ZSB0aGUgcmVhc29uIGhlcmVcbiAgfSk7XG4gIGBgYFxuICAgU2ltcGxlIEV4YW1wbGVcbiAgLS0tLS0tLS0tLS0tLS1cbiAgIFN5bmNocm9ub3VzIEV4YW1wbGVcbiAgIGBgYGphdmFzY3JpcHRcbiAgbGV0IHJlc3VsdDtcbiAgIHRyeSB7XG4gICAgcmVzdWx0ID0gZmluZFJlc3VsdCgpO1xuICAgIC8vIHN1Y2Nlc3NcbiAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAvLyBmYWlsdXJlXG4gIH1cbiAgYGBgXG4gICBFcnJiYWNrIEV4YW1wbGVcbiAgIGBgYGpzXG4gIGZpbmRSZXN1bHQoZnVuY3Rpb24ocmVzdWx0LCBlcnIpe1xuICAgIGlmIChlcnIpIHtcbiAgICAgIC8vIGZhaWx1cmVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc3VjY2Vzc1xuICAgIH1cbiAgfSk7XG4gIGBgYFxuICAgUHJvbWlzZSBFeGFtcGxlO1xuICAgYGBgamF2YXNjcmlwdFxuICBmaW5kUmVzdWx0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpe1xuICAgIC8vIHN1Y2Nlc3NcbiAgfSwgZnVuY3Rpb24ocmVhc29uKXtcbiAgICAvLyBmYWlsdXJlXG4gIH0pO1xuICBgYGBcbiAgIEFkdmFuY2VkIEV4YW1wbGVcbiAgLS0tLS0tLS0tLS0tLS1cbiAgIFN5bmNocm9ub3VzIEV4YW1wbGVcbiAgIGBgYGphdmFzY3JpcHRcbiAgbGV0IGF1dGhvciwgYm9va3M7XG4gICB0cnkge1xuICAgIGF1dGhvciA9IGZpbmRBdXRob3IoKTtcbiAgICBib29rcyAgPSBmaW5kQm9va3NCeUF1dGhvcihhdXRob3IpO1xuICAgIC8vIHN1Y2Nlc3NcbiAgfSBjYXRjaChyZWFzb24pIHtcbiAgICAvLyBmYWlsdXJlXG4gIH1cbiAgYGBgXG4gICBFcnJiYWNrIEV4YW1wbGVcbiAgIGBgYGpzXG4gICBmdW5jdGlvbiBmb3VuZEJvb2tzKGJvb2tzKSB7XG4gICB9XG4gICBmdW5jdGlvbiBmYWlsdXJlKHJlYXNvbikge1xuICAgfVxuICAgZmluZEF1dGhvcihmdW5jdGlvbihhdXRob3IsIGVycil7XG4gICAgaWYgKGVycikge1xuICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgLy8gZmFpbHVyZVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBmaW5kQm9vb2tzQnlBdXRob3IoYXV0aG9yLCBmdW5jdGlvbihib29rcywgZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgZmFpbHVyZShlcnIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmb3VuZEJvb2tzKGJvb2tzKTtcbiAgICAgICAgICAgIH0gY2F0Y2gocmVhc29uKSB7XG4gICAgICAgICAgICAgIGZhaWx1cmUocmVhc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBmYWlsdXJlKGVycik7XG4gICAgICB9XG4gICAgICAvLyBzdWNjZXNzXG4gICAgfVxuICB9KTtcbiAgYGBgXG4gICBQcm9taXNlIEV4YW1wbGU7XG4gICBgYGBqYXZhc2NyaXB0XG4gIGZpbmRBdXRob3IoKS5cbiAgICB0aGVuKGZpbmRCb29rc0J5QXV0aG9yKS5cbiAgICB0aGVuKGZ1bmN0aW9uKGJvb2tzKXtcbiAgICAgIC8vIGZvdW5kIGJvb2tzXG4gIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmdcbiAgfSk7XG4gIGBgYFxuICAgQG1ldGhvZCB0aGVuXG4gIEBwYXJhbSB7RnVuY3Rpb259IG9uRnVsZmlsbGVkXG4gIEBwYXJhbSB7RnVuY3Rpb259IG9uUmVqZWN0ZWRcbiAgVXNlZnVsIGZvciB0b29saW5nLlxuICBAcmV0dXJuIHtQcm9taXNlfVxuICAqL1xuXG4gIC8qKlxuICBgY2F0Y2hgIGlzIHNpbXBseSBzdWdhciBmb3IgYHRoZW4odW5kZWZpbmVkLCBvblJlamVjdGlvbilgIHdoaWNoIG1ha2VzIGl0IHRoZSBzYW1lXG4gIGFzIHRoZSBjYXRjaCBibG9jayBvZiBhIHRyeS9jYXRjaCBzdGF0ZW1lbnQuXG4gIGBgYGpzXG4gIGZ1bmN0aW9uIGZpbmRBdXRob3IoKXtcbiAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZG4ndCBmaW5kIHRoYXQgYXV0aG9yJyk7XG4gIH1cbiAgLy8gc3luY2hyb25vdXNcbiAgdHJ5IHtcbiAgZmluZEF1dGhvcigpO1xuICB9IGNhdGNoKHJlYXNvbikge1xuICAvLyBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICB9XG4gIC8vIGFzeW5jIHdpdGggcHJvbWlzZXNcbiAgZmluZEF1dGhvcigpLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbil7XG4gIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gIH0pO1xuICBgYGBcbiAgQG1ldGhvZCBjYXRjaFxuICBAcGFyYW0ge0Z1bmN0aW9ufSBvblJlamVjdGlvblxuICBVc2VmdWwgZm9yIHRvb2xpbmcuXG4gIEByZXR1cm4ge1Byb21pc2V9XG4gICovXG5cblxuICBQcm9taXNlLnByb3RvdHlwZS5jYXRjaCA9IGZ1bmN0aW9uIF9jYXRjaChvblJlamVjdGlvbikge1xuICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3Rpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgIGBmaW5hbGx5YCB3aWxsIGJlIGludm9rZWQgcmVnYXJkbGVzcyBvZiB0aGUgcHJvbWlzZSdzIGZhdGUganVzdCBhcyBuYXRpdmVcbiAgICB0cnkvY2F0Y2gvZmluYWxseSBiZWhhdmVzXG4gIFxuICAgIFN5bmNocm9ub3VzIGV4YW1wbGU6XG4gIFxuICAgIGBgYGpzXG4gICAgZmluZEF1dGhvcigpIHtcbiAgICAgIGlmIChNYXRoLnJhbmRvbSgpID4gMC41KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBBdXRob3IoKTtcbiAgICB9XG4gIFxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZmluZEF1dGhvcigpOyAvLyBzdWNjZWVkIG9yIGZhaWxcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmluZE90aGVyQXV0aGVyKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIGFsd2F5cyBydW5zXG4gICAgICAvLyBkb2Vzbid0IGFmZmVjdCB0aGUgcmV0dXJuIHZhbHVlXG4gICAgfVxuICAgIGBgYFxuICBcbiAgICBBc3luY2hyb25vdXMgZXhhbXBsZTpcbiAgXG4gICAgYGBganNcbiAgICBmaW5kQXV0aG9yKCkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKXtcbiAgICAgIHJldHVybiBmaW5kT3RoZXJBdXRoZXIoKTtcbiAgICB9KS5maW5hbGx5KGZ1bmN0aW9uKCl7XG4gICAgICAvLyBhdXRob3Igd2FzIGVpdGhlciBmb3VuZCwgb3Igbm90XG4gICAgfSk7XG4gICAgYGBgXG4gIFxuICAgIEBtZXRob2QgZmluYWxseVxuICAgIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAgQHJldHVybiB7UHJvbWlzZX1cbiAgKi9cblxuXG4gIFByb21pc2UucHJvdG90eXBlLmZpbmFsbHkgPSBmdW5jdGlvbiBfZmluYWxseShjYWxsYmFjaykge1xuICAgIHZhciBwcm9taXNlID0gdGhpcztcbiAgICB2YXIgY29uc3RydWN0b3IgPSBwcm9taXNlLmNvbnN0cnVjdG9yO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2UudGhlbihjYWxsYmFjaywgY2FsbGJhY2spO1xuICB9O1xuXG4gIHJldHVybiBQcm9taXNlO1xufSgpO1xuXG5Qcm9taXNlJDEucHJvdG90eXBlLnRoZW4gPSB0aGVuO1xuUHJvbWlzZSQxLmFsbCA9IGFsbDtcblByb21pc2UkMS5yYWNlID0gcmFjZTtcblByb21pc2UkMS5yZXNvbHZlID0gcmVzb2x2ZSQxO1xuUHJvbWlzZSQxLnJlamVjdCA9IHJlamVjdCQxO1xuUHJvbWlzZSQxLl9zZXRTY2hlZHVsZXIgPSBzZXRTY2hlZHVsZXI7XG5Qcm9taXNlJDEuX3NldEFzYXAgPSBzZXRBc2FwO1xuUHJvbWlzZSQxLl9hc2FwID0gYXNhcDtcblxuLypnbG9iYWwgc2VsZiovXG5mdW5jdGlvbiBwb2x5ZmlsbCgpIHtcbiAgdmFyIGxvY2FsID0gdm9pZCAwO1xuXG4gIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIGxvY2FsID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICAgIGxvY2FsID0gc2VsZjtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgbG9jYWwgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncG9seWZpbGwgZmFpbGVkIGJlY2F1c2UgZ2xvYmFsIG9iamVjdCBpcyB1bmF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIFAgPSBsb2NhbC5Qcm9taXNlO1xuXG4gIGlmIChQKSB7XG4gICAgdmFyIHByb21pc2VUb1N0cmluZyA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHByb21pc2VUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQLnJlc29sdmUoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2lsZW50bHkgaWdub3JlZFxuICAgIH1cblxuICAgIGlmIChwcm9taXNlVG9TdHJpbmcgPT09ICdbb2JqZWN0IFByb21pc2VdJyAmJiAhUC5jYXN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbG9jYWwuUHJvbWlzZSA9IFByb21pc2UkMTtcbn1cblxuLy8gU3RyYW5nZSBjb21wYXQuLlxuUHJvbWlzZSQxLnBvbHlmaWxsID0gcG9seWZpbGw7XG5Qcm9taXNlJDEuUHJvbWlzZSA9IFByb21pc2UkMTtcblxucmV0dXJuIFByb21pc2UkMTtcblxufSkpKTtcblxuXG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVzNi1wcm9taXNlLm1hcFxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG5FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbihuKSB7XG4gIGlmICghaXNOdW1iZXIobikgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCduIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBlciwgaGFuZGxlciwgbGVuLCBhcmdzLCBpLCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAodHlwZSA9PT0gJ2Vycm9yJykge1xuICAgIGlmICghdGhpcy5fZXZlbnRzLmVycm9yIHx8XG4gICAgICAgIChpc09iamVjdCh0aGlzLl9ldmVudHMuZXJyb3IpICYmICF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSkge1xuICAgICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG4gICAgICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc1VuZGVmaW5lZChoYW5kbGVyKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIGZhc3QgY2FzZXNcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIHNsb3dlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGhhbmRsZXIpKSB7XG4gICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgbGlzdGVuZXJzID0gaGFuZGxlci5zbGljZSgpO1xuICAgIGxlbiA9IGxpc3RlbmVycy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG07XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgaWYgKHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lcilcbiAgICB0aGlzLmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbihsaXN0ZW5lci5saXN0ZW5lcikgP1xuICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgZWxzZSBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlXG4gICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gW3RoaXMuX2V2ZW50c1t0eXBlXSwgbGlzdGVuZXJdO1xuXG4gIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pICYmICF0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkKSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9tYXhMaXN0ZW5lcnMpKSB7XG4gICAgICBtID0gdGhpcy5fbWF4TGlzdGVuZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gICAgfVxuXG4gICAgaWYgKG0gJiYgbSA+IDAgJiYgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCA+IG0pIHtcbiAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgJyArXG4gICAgICAgICAgICAgICAgICAgICdsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUudHJhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBpbiBJRSAxMFxuICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIHZhciBmaXJlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGcoKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcblxuICAgIGlmICghZmlyZWQpIHtcbiAgICAgIGZpcmVkID0gdHJ1ZTtcbiAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgZy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB0aGlzLm9uKHR5cGUsIGcpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWRcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbGlzdCwgcG9zaXRpb24sIGxlbmd0aCwgaTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXR1cm4gdGhpcztcblxuICBsaXN0ID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuICBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgcG9zaXRpb24gPSAtMTtcblxuICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHxcbiAgICAgIChpc0Z1bmN0aW9uKGxpc3QubGlzdGVuZXIpICYmIGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgfSBlbHNlIGlmIChpc09iamVjdChsaXN0KSkge1xuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tID4gMDspIHtcbiAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fFxuICAgICAgICAgIChsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgbGlzdC5sZW5ndGggPSAwO1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdC5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGtleSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgaWYgKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIGVsc2UgaWYgKHRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGtleSBpbiB0aGlzLl9ldmVudHMpIHtcbiAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXJzKSkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAvLyBMSUZPIG9yZGVyXG4gICAgd2hpbGUgKGxpc3RlbmVycy5sZW5ndGgpXG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuICB9XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIHJldDtcbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXQgPSBbXTtcbiAgZWxzZSBpZiAoaXNGdW5jdGlvbih0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIHJldCA9IFt0aGlzLl9ldmVudHNbdHlwZV1dO1xuICBlbHNlXG4gICAgcmV0ID0gdGhpcy5fZXZlbnRzW3R5cGVdLnNsaWNlKCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIGlmICh0aGlzLl9ldmVudHMpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICAgIGlmIChpc0Z1bmN0aW9uKGV2bGlzdGVuZXIpKVxuICAgICAgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoZXZsaXN0ZW5lcilcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xufTtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsInZhciBidW5kbGVGbiA9IGFyZ3VtZW50c1szXTtcbnZhciBzb3VyY2VzID0gYXJndW1lbnRzWzRdO1xudmFyIGNhY2hlID0gYXJndW1lbnRzWzVdO1xuXG52YXIgc3RyaW5naWZ5ID0gSlNPTi5zdHJpbmdpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBvcHRpb25zKSB7XG4gICAgdmFyIHdrZXk7XG4gICAgdmFyIGNhY2hlS2V5cyA9IE9iamVjdC5rZXlzKGNhY2hlKTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2FjaGVLZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB2YXIga2V5ID0gY2FjaGVLZXlzW2ldO1xuICAgICAgICB2YXIgZXhwID0gY2FjaGVba2V5XS5leHBvcnRzO1xuICAgICAgICAvLyBVc2luZyBiYWJlbCBhcyBhIHRyYW5zcGlsZXIgdG8gdXNlIGVzbW9kdWxlLCB0aGUgZXhwb3J0IHdpbGwgYWx3YXlzXG4gICAgICAgIC8vIGJlIGFuIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0IGV4cG9ydCBhcyBhIHByb3BlcnR5IG9mIGl0LiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhlIGV4aXN0aW5nIGFwaSBhbmQgYmFiZWwgZXNtb2R1bGUgZXhwb3J0cyBhcmUgYm90aCBzdXBwb3J0ZWQgd2VcbiAgICAgICAgLy8gY2hlY2sgZm9yIGJvdGhcbiAgICAgICAgaWYgKGV4cCA9PT0gZm4gfHwgZXhwICYmIGV4cC5kZWZhdWx0ID09PSBmbikge1xuICAgICAgICAgICAgd2tleSA9IGtleTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF3a2V5KSB7XG4gICAgICAgIHdrZXkgPSBNYXRoLmZsb29yKE1hdGgucG93KDE2LCA4KSAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgdmFyIHdjYWNoZSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNhY2hlS2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBjYWNoZUtleXNbaV07XG4gICAgICAgICAgICB3Y2FjaGVba2V5XSA9IGtleTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzW3drZXldID0gW1xuICAgICAgICAgICAgJ2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeycgKyBmbiArICcoc2VsZik7IH0nLFxuICAgICAgICAgICAgd2NhY2hlXG4gICAgICAgIF07XG4gICAgfVxuICAgIHZhciBza2V5ID0gTWF0aC5mbG9vcihNYXRoLnBvdygxNiwgOCkgKiBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygxNik7XG5cbiAgICB2YXIgc2NhY2hlID0ge307IHNjYWNoZVt3a2V5XSA9IHdrZXk7XG4gICAgc291cmNlc1tza2V5XSA9IFtcbiAgICAgICAgJ2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpeycgK1xuICAgICAgICAgICAgLy8gdHJ5IHRvIGNhbGwgZGVmYXVsdCBpZiBkZWZpbmVkIHRvIGFsc28gc3VwcG9ydCBiYWJlbCBlc21vZHVsZSBleHBvcnRzXG4gICAgICAgICAgICAndmFyIGYgPSByZXF1aXJlKCcgKyBzdHJpbmdpZnkod2tleSkgKyAnKTsnICtcbiAgICAgICAgICAgICcoZi5kZWZhdWx0ID8gZi5kZWZhdWx0IDogZikoc2VsZik7JyArXG4gICAgICAgICd9JyxcbiAgICAgICAgc2NhY2hlXG4gICAgXTtcblxuICAgIHZhciB3b3JrZXJTb3VyY2VzID0ge307XG4gICAgcmVzb2x2ZVNvdXJjZXMoc2tleSk7XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlU291cmNlcyhrZXkpIHtcbiAgICAgICAgd29ya2VyU291cmNlc1trZXldID0gdHJ1ZTtcblxuICAgICAgICBmb3IgKHZhciBkZXBQYXRoIGluIHNvdXJjZXNba2V5XVsxXSkge1xuICAgICAgICAgICAgdmFyIGRlcEtleSA9IHNvdXJjZXNba2V5XVsxXVtkZXBQYXRoXTtcbiAgICAgICAgICAgIGlmICghd29ya2VyU291cmNlc1tkZXBLZXldKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZVNvdXJjZXMoZGVwS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzcmMgPSAnKCcgKyBidW5kbGVGbiArICcpKHsnXG4gICAgICAgICsgT2JqZWN0LmtleXMod29ya2VyU291cmNlcykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdpZnkoa2V5KSArICc6WydcbiAgICAgICAgICAgICAgICArIHNvdXJjZXNba2V5XVswXVxuICAgICAgICAgICAgICAgICsgJywnICsgc3RyaW5naWZ5KHNvdXJjZXNba2V5XVsxXSkgKyAnXSdcbiAgICAgICAgICAgIDtcbiAgICAgICAgfSkuam9pbignLCcpXG4gICAgICAgICsgJ30se30sWycgKyBzdHJpbmdpZnkoc2tleSkgKyAnXSknXG4gICAgO1xuXG4gICAgdmFyIFVSTCA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTCB8fCB3aW5kb3cubW96VVJMIHx8IHdpbmRvdy5tc1VSTDtcblxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoW3NyY10sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5iYXJlKSB7IHJldHVybiBibG9iOyB9XG4gICAgdmFyIHdvcmtlclVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVXJsKTtcbiAgICB3b3JrZXIub2JqZWN0VVJMID0gd29ya2VyVXJsO1xuICAgIHJldHVybiB3b3JrZXI7XG59O1xuIiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICAgIGVuYWJsZVdvcmtlcjogZmFsc2UsXG4gICAgZW5hYmxlU3Rhc2hCdWZmZXI6IHRydWUsXG4gICAgc3Rhc2hJbml0aWFsU2l6ZTogdW5kZWZpbmVkLFxuXG4gICAgaXNMaXZlOiBmYWxzZSxcblxuICAgIGxhenlMb2FkOiB0cnVlLFxuICAgIGxhenlMb2FkTWF4RHVyYXRpb246IDMgKiA2MCxcbiAgICBsYXp5TG9hZFJlY292ZXJEdXJhdGlvbjogMzAsXG4gICAgZGVmZXJMb2FkQWZ0ZXJTb3VyY2VPcGVuOiB0cnVlLFxuXG4gICAgLy8gYXV0b0NsZWFudXBTb3VyY2VCdWZmZXI6IGRlZmF1bHQgYXMgZmFsc2UsIGxlYXZlIHVuc3BlY2lmaWVkXG4gICAgYXV0b0NsZWFudXBNYXhCYWNrd2FyZER1cmF0aW9uOiAzICogNjAsXG4gICAgYXV0b0NsZWFudXBNaW5CYWNrd2FyZER1cmF0aW9uOiAyICogNjAsXG5cbiAgICBzdGF0aXN0aWNzSW5mb1JlcG9ydEludGVydmFsOiA2MDAsXG5cbiAgICBmaXhBdWRpb1RpbWVzdGFtcEdhcDogdHJ1ZSxcblxuICAgIGFjY3VyYXRlU2VlazogZmFsc2UsXG4gICAgc2Vla1R5cGU6ICdyYW5nZScsICAvLyBbcmFuZ2UsIHBhcmFtLCBjdXN0b21dXG4gICAgc2Vla1BhcmFtU3RhcnQ6ICdic3RhcnQnLFxuICAgIHNlZWtQYXJhbUVuZDogJ2JlbmQnLFxuICAgIHJhbmdlTG9hZFplcm9TdGFydDogZmFsc2UsXG4gICAgY3VzdG9tU2Vla0hhbmRsZXI6IHVuZGVmaW5lZCxcbiAgICByZXVzZVJlZGlyZWN0ZWRVUkw6IGZhbHNlLFxuICAgIC8vIHJlZmVycmVyUG9saWN5OiBsZWF2ZSBhcyB1bnNwZWNpZmllZFxuXG4gICAgaGVhZGVyczogdW5kZWZpbmVkLFxuICAgIGN1c3RvbUxvYWRlcjogdW5kZWZpbmVkXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdENvbmZpZygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdENvbmZpZyk7XG59IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBJT0NvbnRyb2xsZXIgZnJvbSAnLi4vaW8vaW8tY29udHJvbGxlci5qcyc7XG5pbXBvcnQge2NyZWF0ZURlZmF1bHRDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5cbmNsYXNzIEZlYXR1cmVzIHtcblxuICAgIHN0YXRpYyBzdXBwb3J0TVNFSDI2NFBsYXliYWNrKCkge1xuICAgICAgICByZXR1cm4gd2luZG93Lk1lZGlhU291cmNlICYmXG4gICAgICAgICAgICAgICB3aW5kb3cuTWVkaWFTb3VyY2UuaXNUeXBlU3VwcG9ydGVkKCd2aWRlby9tcDQ7IGNvZGVjcz1cImF2YzEuNDJFMDFFLG1wNGEuNDAuMlwiJyk7XG4gICAgfVxuXG4gICAgc3RhdGljIHN1cHBvcnROZXR3b3JrU3RyZWFtSU8oKSB7XG4gICAgICAgIGxldCBpb2N0bCA9IG5ldyBJT0NvbnRyb2xsZXIoe30sIGNyZWF0ZURlZmF1bHRDb25maWcoKSk7XG4gICAgICAgIGxldCBsb2FkZXJUeXBlID0gaW9jdGwubG9hZGVyVHlwZTtcbiAgICAgICAgaW9jdGwuZGVzdHJveSgpO1xuICAgICAgICByZXR1cm4gbG9hZGVyVHlwZSA9PSAnZmV0Y2gtc3RyZWFtLWxvYWRlcicgfHwgbG9hZGVyVHlwZSA9PSAneGhyLW1vei1jaHVua2VkLWxvYWRlcic7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldE5ldHdvcmtMb2FkZXJUeXBlTmFtZSgpIHtcbiAgICAgICAgbGV0IGlvY3RsID0gbmV3IElPQ29udHJvbGxlcih7fSwgY3JlYXRlRGVmYXVsdENvbmZpZygpKTtcbiAgICAgICAgbGV0IGxvYWRlclR5cGUgPSBpb2N0bC5sb2FkZXJUeXBlO1xuICAgICAgICBpb2N0bC5kZXN0cm95KCk7XG4gICAgICAgIHJldHVybiBsb2FkZXJUeXBlO1xuICAgIH1cblxuICAgIHN0YXRpYyBzdXBwb3J0TmF0aXZlTWVkaWFQbGF5YmFjayhtaW1lVHlwZSkge1xuICAgICAgICBpZiAoRmVhdHVyZXMudmlkZW9FbGVtZW50ID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgRmVhdHVyZXMudmlkZW9FbGVtZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNhblBsYXkgPSBGZWF0dXJlcy52aWRlb0VsZW1lbnQuY2FuUGxheVR5cGUobWltZVR5cGUpO1xuICAgICAgICByZXR1cm4gY2FuUGxheSA9PT0gJ3Byb2JhYmx5JyB8fCBjYW5QbGF5ID09ICdtYXliZSc7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEZlYXR1cmVMaXN0KCkge1xuICAgICAgICBsZXQgZmVhdHVyZXMgPSB7XG4gICAgICAgICAgICBtc2VGbHZQbGF5YmFjazogZmFsc2UsXG4gICAgICAgICAgICBtc2VMaXZlRmx2UGxheWJhY2s6IGZhbHNlLFxuICAgICAgICAgICAgbmV0d29ya1N0cmVhbUlPOiBmYWxzZSxcbiAgICAgICAgICAgIG5ldHdvcmtMb2FkZXJOYW1lOiAnJyxcbiAgICAgICAgICAgIG5hdGl2ZU1QNEgyNjRQbGF5YmFjazogZmFsc2UsXG4gICAgICAgICAgICBuYXRpdmVXZWJtVlA4UGxheWJhY2s6IGZhbHNlLFxuICAgICAgICAgICAgbmF0aXZlV2VibVZQOVBsYXliYWNrOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIGZlYXR1cmVzLm1zZUZsdlBsYXliYWNrID0gRmVhdHVyZXMuc3VwcG9ydE1TRUgyNjRQbGF5YmFjaygpO1xuICAgICAgICBmZWF0dXJlcy5uZXR3b3JrU3RyZWFtSU8gPSBGZWF0dXJlcy5zdXBwb3J0TmV0d29ya1N0cmVhbUlPKCk7XG4gICAgICAgIGZlYXR1cmVzLm5ldHdvcmtMb2FkZXJOYW1lID0gRmVhdHVyZXMuZ2V0TmV0d29ya0xvYWRlclR5cGVOYW1lKCk7XG4gICAgICAgIGZlYXR1cmVzLm1zZUxpdmVGbHZQbGF5YmFjayA9IGZlYXR1cmVzLm1zZUZsdlBsYXliYWNrICYmIGZlYXR1cmVzLm5ldHdvcmtTdHJlYW1JTztcbiAgICAgICAgZmVhdHVyZXMubmF0aXZlTVA0SDI2NFBsYXliYWNrID0gRmVhdHVyZXMuc3VwcG9ydE5hdGl2ZU1lZGlhUGxheWJhY2soJ3ZpZGVvL21wNDsgY29kZWNzPVwiYXZjMS40MjAwMUUsIG1wNGEuNDAuMlwiJyk7XG4gICAgICAgIGZlYXR1cmVzLm5hdGl2ZVdlYm1WUDhQbGF5YmFjayA9IEZlYXR1cmVzLnN1cHBvcnROYXRpdmVNZWRpYVBsYXliYWNrKCd2aWRlby93ZWJtOyBjb2RlY3M9XCJ2cDguMCwgdm9yYmlzXCInKTtcbiAgICAgICAgZmVhdHVyZXMubmF0aXZlV2VibVZQOVBsYXliYWNrID0gRmVhdHVyZXMuc3VwcG9ydE5hdGl2ZU1lZGlhUGxheWJhY2soJ3ZpZGVvL3dlYm07IGNvZGVjcz1cInZwOVwiJyk7XG5cbiAgICAgICAgcmV0dXJuIGZlYXR1cmVzO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBGZWF0dXJlczsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY2xhc3MgTWVkaWFJbmZvIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm1pbWVUeXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5kdXJhdGlvbiA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5oYXNBdWRpbyA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFzVmlkZW8gPSBudWxsO1xuICAgICAgICB0aGlzLmF1ZGlvQ29kZWMgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZGVvQ29kZWMgPSBudWxsO1xuICAgICAgICB0aGlzLmF1ZGlvRGF0YVJhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZGVvRGF0YVJhdGUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuYXVkaW9TYW1wbGVSYXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5hdWRpb0NoYW5uZWxDb3VudCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IG51bGw7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5mcHMgPSBudWxsO1xuICAgICAgICB0aGlzLnByb2ZpbGUgPSBudWxsO1xuICAgICAgICB0aGlzLmxldmVsID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWZGcmFtZXMgPSBudWxsO1xuICAgICAgICB0aGlzLmNocm9tYUZvcm1hdCA9IG51bGw7XG4gICAgICAgIHRoaXMuc2FyTnVtID0gbnVsbDtcbiAgICAgICAgdGhpcy5zYXJEZW4gPSBudWxsO1xuXG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLnNlZ21lbnRzID0gbnVsbDsgIC8vIE1lZGlhSW5mb1tdXG4gICAgICAgIHRoaXMuc2VnbWVudENvdW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5oYXNLZXlmcmFtZXNJbmRleCA9IG51bGw7XG4gICAgICAgIHRoaXMua2V5ZnJhbWVzSW5kZXggPSBudWxsO1xuICAgIH1cblxuICAgIGlzQ29tcGxldGUoKSB7XG4gICAgICAgIGxldCBhdWRpb0luZm9Db21wbGV0ZSA9ICh0aGlzLmhhc0F1ZGlvID09PSBmYWxzZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuaGFzQXVkaW8gPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9Db2RlYyAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvU2FtcGxlUmF0ZSAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvQ2hhbm5lbENvdW50ICE9IG51bGwpO1xuXG4gICAgICAgIGxldCB2aWRlb0luZm9Db21wbGV0ZSA9ICh0aGlzLmhhc1ZpZGVvID09PSBmYWxzZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuaGFzVmlkZW8gPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlkZW9Db2RlYyAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndpZHRoICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnBzICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZmlsZSAhPSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxldmVsICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmRnJhbWVzICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hyb21hRm9ybWF0ICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2FyTnVtICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2FyRGVuICE9IG51bGwpO1xuXG4gICAgICAgIC8vIGtleWZyYW1lc0luZGV4IG1heSBub3QgYmUgcHJlc2VudFxuICAgICAgICByZXR1cm4gdGhpcy5taW1lVHlwZSAhPSBudWxsICYmXG4gICAgICAgICAgICAgICB0aGlzLmR1cmF0aW9uICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgIHRoaXMubWV0YWRhdGEgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgdGhpcy5oYXNLZXlmcmFtZXNJbmRleCAhPSBudWxsICYmXG4gICAgICAgICAgICAgICBhdWRpb0luZm9Db21wbGV0ZSAmJlxuICAgICAgICAgICAgICAgdmlkZW9JbmZvQ29tcGxldGU7XG4gICAgfVxuXG4gICAgaXNTZWVrYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzS2V5ZnJhbWVzSW5kZXggPT09IHRydWU7XG4gICAgfVxuXG4gICAgZ2V0TmVhcmVzdEtleWZyYW1lKG1pbGxpc2Vjb25kcykge1xuICAgICAgICBpZiAodGhpcy5rZXlmcmFtZXNJbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0YWJsZSA9IHRoaXMua2V5ZnJhbWVzSW5kZXg7XG4gICAgICAgIGxldCBrZXlmcmFtZUlkeCA9IHRoaXMuX3NlYXJjaCh0YWJsZS50aW1lcywgbWlsbGlzZWNvbmRzKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5kZXg6IGtleWZyYW1lSWR4LFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzOiB0YWJsZS50aW1lc1trZXlmcmFtZUlkeF0sXG4gICAgICAgICAgICBmaWxlcG9zaXRpb246IHRhYmxlLmZpbGVwb3NpdGlvbnNba2V5ZnJhbWVJZHhdXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgX3NlYXJjaChsaXN0LCB2YWx1ZSkge1xuICAgICAgICBsZXQgaWR4ID0gMDtcblxuICAgICAgICBsZXQgbGFzdCA9IGxpc3QubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IG1pZCA9IDA7XG4gICAgICAgIGxldCBsYm91bmQgPSAwO1xuICAgICAgICBsZXQgdWJvdW5kID0gbGFzdDtcblxuICAgICAgICBpZiAodmFsdWUgPCBsaXN0WzBdKSB7XG4gICAgICAgICAgICBpZHggPSAwO1xuICAgICAgICAgICAgbGJvdW5kID0gdWJvdW5kICsgMTsgIC8vIHNraXAgc2VhcmNoXG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAobGJvdW5kIDw9IHVib3VuZCkge1xuICAgICAgICAgICAgbWlkID0gbGJvdW5kICsgTWF0aC5mbG9vcigodWJvdW5kIC0gbGJvdW5kKSAvIDIpO1xuICAgICAgICAgICAgaWYgKG1pZCA9PT0gbGFzdCB8fCAodmFsdWUgPj0gbGlzdFttaWRdICYmIHZhbHVlIDwgbGlzdFttaWQgKyAxXSkpIHtcbiAgICAgICAgICAgICAgICBpZHggPSBtaWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpc3RbbWlkXSA8IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbGJvdW5kID0gbWlkICsgMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdWJvdW5kID0gbWlkIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpZHg7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lZGlhSW5mbzsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gUmVwcmVzZW50cyBhbiBtZWRpYSBzYW1wbGUgKGF1ZGlvIC8gdmlkZW8pXG5leHBvcnQgY2xhc3MgU2FtcGxlSW5mbyB7XG5cbiAgICBjb25zdHJ1Y3RvcihkdHMsIHB0cywgZHVyYXRpb24sIG9yaWdpbmFsRHRzLCBpc1N5bmMpIHtcbiAgICAgICAgdGhpcy5kdHMgPSBkdHM7XG4gICAgICAgIHRoaXMucHRzID0gcHRzO1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICAgIHRoaXMub3JpZ2luYWxEdHMgPSBvcmlnaW5hbER0cztcbiAgICAgICAgdGhpcy5pc1N5bmNQb2ludCA9IGlzU3luYztcbiAgICAgICAgdGhpcy5maWxlcG9zaXRpb24gPSBudWxsO1xuICAgIH1cblxufVxuXG4vLyBNZWRpYSBTZWdtZW50IGNvbmNlcHQgaXMgZGVmaW5lZCBpbiBNZWRpYSBTb3VyY2UgRXh0ZW5zaW9ucyBzcGVjLlxuLy8gUGFydGljdWxhcmx5IGluIElTTyBCTUZGIGZvcm1hdCwgYW4gTWVkaWEgU2VnbWVudCBjb250YWlucyBhIG1vb2YgYm94IGZvbGxvd2VkIGJ5IGEgbWRhdCBib3guXG5leHBvcnQgY2xhc3MgTWVkaWFTZWdtZW50SW5mbyB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5iZWdpbkR0cyA9IDA7XG4gICAgICAgIHRoaXMuZW5kRHRzID0gMDtcbiAgICAgICAgdGhpcy5iZWdpblB0cyA9IDA7XG4gICAgICAgIHRoaXMuZW5kUHRzID0gMDtcbiAgICAgICAgdGhpcy5vcmlnaW5hbEJlZ2luRHRzID0gMDtcbiAgICAgICAgdGhpcy5vcmlnaW5hbEVuZER0cyA9IDA7XG4gICAgICAgIHRoaXMuc3luY1BvaW50cyA9IFtdOyAgICAgLy8gU2FtcGxlSW5mb1tuXSwgZm9yIHZpZGVvIElEUiBmcmFtZXMgb25seVxuICAgICAgICB0aGlzLmZpcnN0U2FtcGxlID0gbnVsbDsgIC8vIFNhbXBsZUluZm9cbiAgICAgICAgdGhpcy5sYXN0U2FtcGxlID0gbnVsbDsgICAvLyBTYW1wbGVJbmZvXG4gICAgfVxuXG4gICAgYXBwZW5kU3luY1BvaW50KHNhbXBsZUluZm8pIHsgIC8vIGFsc28gY2FsbGVkIFJhbmRvbSBBY2Nlc3MgUG9pbnRcbiAgICAgICAgc2FtcGxlSW5mby5pc1N5bmNQb2ludCA9IHRydWU7XG4gICAgICAgIHRoaXMuc3luY1BvaW50cy5wdXNoKHNhbXBsZUluZm8pO1xuICAgIH1cblxufVxuXG4vLyBPcmRlcmVkIGxpc3QgZm9yIHJlY29yZGluZyB2aWRlbyBJRFIgZnJhbWVzLCBzb3J0ZWQgYnkgb3JpZ2luYWxEdHNcbmV4cG9ydCBjbGFzcyBJRFJTYW1wbGVMaXN0IHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9saXN0ID0gW107XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX2xpc3QgPSBbXTtcbiAgICB9XG5cbiAgICBhcHBlbmRBcnJheShzeW5jUG9pbnRzKSB7XG4gICAgICAgIGxldCBsaXN0ID0gdGhpcy5fbGlzdDtcblxuICAgICAgICBpZiAoc3luY1BvaW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA+IDAgJiYgc3luY1BvaW50c1swXS5vcmlnaW5hbER0cyA8IGxpc3RbbGlzdC5sZW5ndGggLSAxXS5vcmlnaW5hbER0cykge1xuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkobGlzdCwgc3luY1BvaW50cyk7XG4gICAgfVxuXG4gICAgZ2V0TGFzdFN5bmNQb2ludEJlZm9yZUR0cyhkdHMpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xpc3QubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxpc3QgPSB0aGlzLl9saXN0O1xuICAgICAgICBsZXQgaWR4ID0gMDtcbiAgICAgICAgbGV0IGxhc3QgPSBsaXN0Lmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBtaWQgPSAwO1xuICAgICAgICBsZXQgbGJvdW5kID0gMDtcbiAgICAgICAgbGV0IHVib3VuZCA9IGxhc3Q7XG5cbiAgICAgICAgaWYgKGR0cyA8IGxpc3RbMF0uZHRzKSB7XG4gICAgICAgICAgICBpZHggPSAwO1xuICAgICAgICAgICAgbGJvdW5kID0gdWJvdW5kICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChsYm91bmQgPD0gdWJvdW5kKSB7XG4gICAgICAgICAgICBtaWQgPSBsYm91bmQgKyBNYXRoLmZsb29yKCh1Ym91bmQgLSBsYm91bmQpIC8gMik7XG4gICAgICAgICAgICBpZiAobWlkID09PSBsYXN0IHx8IChkdHMgPj0gbGlzdFttaWRdLmR0cyAmJiBkdHMgPCBsaXN0W21pZCArIDFdLmR0cykpIHtcbiAgICAgICAgICAgICAgICBpZHggPSBtaWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpc3RbbWlkXS5kdHMgPCBkdHMpIHtcbiAgICAgICAgICAgICAgICBsYm91bmQgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1Ym91bmQgPSBtaWQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9saXN0W2lkeF07XG4gICAgfVxuXG59XG5cbi8vIERhdGEgc3RydWN0dXJlIGZvciByZWNvcmRpbmcgaW5mb3JtYXRpb24gb2YgbWVkaWEgc2VnbWVudHMgaW4gc2luZ2xlIHRyYWNrLlxuZXhwb3J0IGNsYXNzIE1lZGlhU2VnbWVudEluZm9MaXN0IHtcblxuICAgIGNvbnN0cnVjdG9yKHR5cGUpIHtcbiAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuX2xpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5fbGFzdEFwcGVuZExvY2F0aW9uID0gLTE7ICAvLyBjYWNoZWQgbGFzdCBpbnNlcnQgbG9jYXRpb25cbiAgICB9XG5cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gICAgfVxuXG4gICAgZ2V0IGxlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpc3QubGVuZ3RoO1xuICAgIH1cblxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saXN0Lmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fbGlzdCA9IFtdO1xuICAgICAgICB0aGlzLl9sYXN0QXBwZW5kTG9jYXRpb24gPSAtMTtcbiAgICB9XG5cbiAgICBfc2VhcmNoTmVhcmVzdFNlZ21lbnRCZWZvcmUob3JpZ2luYWxCZWdpbkR0cykge1xuICAgICAgICBsZXQgbGlzdCA9IHRoaXMuX2xpc3Q7XG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIC0yO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsYXN0ID0gbGlzdC5sZW5ndGggLSAxO1xuICAgICAgICBsZXQgbWlkID0gMDtcbiAgICAgICAgbGV0IGxib3VuZCA9IDA7XG4gICAgICAgIGxldCB1Ym91bmQgPSBsYXN0O1xuXG4gICAgICAgIGxldCBpZHggPSAwO1xuXG4gICAgICAgIGlmIChvcmlnaW5hbEJlZ2luRHRzIDwgbGlzdFswXS5vcmlnaW5hbEJlZ2luRHRzKSB7XG4gICAgICAgICAgICBpZHggPSAtMTtcbiAgICAgICAgICAgIHJldHVybiBpZHg7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAobGJvdW5kIDw9IHVib3VuZCkge1xuICAgICAgICAgICAgbWlkID0gbGJvdW5kICsgTWF0aC5mbG9vcigodWJvdW5kIC0gbGJvdW5kKSAvIDIpO1xuICAgICAgICAgICAgaWYgKG1pZCA9PT0gbGFzdCB8fCAob3JpZ2luYWxCZWdpbkR0cyA+IGxpc3RbbWlkXS5sYXN0U2FtcGxlLm9yaWdpbmFsRHRzICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmlnaW5hbEJlZ2luRHRzIDwgbGlzdFttaWQgKyAxXS5vcmlnaW5hbEJlZ2luRHRzKSkpIHtcbiAgICAgICAgICAgICAgICBpZHggPSBtaWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpc3RbbWlkXS5vcmlnaW5hbEJlZ2luRHRzIDwgb3JpZ2luYWxCZWdpbkR0cykge1xuICAgICAgICAgICAgICAgIGxib3VuZCA9IG1pZCArIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVib3VuZCA9IG1pZCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkeDtcbiAgICB9XG5cbiAgICBfc2VhcmNoTmVhcmVzdFNlZ21lbnRBZnRlcihvcmlnaW5hbEJlZ2luRHRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hOZWFyZXN0U2VnbWVudEJlZm9yZShvcmlnaW5hbEJlZ2luRHRzKSArIDE7XG4gICAgfVxuXG4gICAgYXBwZW5kKG1lZGlhU2VnbWVudEluZm8pIHtcbiAgICAgICAgbGV0IGxpc3QgPSB0aGlzLl9saXN0O1xuICAgICAgICBsZXQgbXNpID0gbWVkaWFTZWdtZW50SW5mbztcbiAgICAgICAgbGV0IGxhc3RBcHBlbmRJZHggPSB0aGlzLl9sYXN0QXBwZW5kTG9jYXRpb247XG4gICAgICAgIGxldCBpbnNlcnRJZHggPSAwO1xuXG4gICAgICAgIGlmIChsYXN0QXBwZW5kSWR4ICE9PSAtMSAmJiBsYXN0QXBwZW5kSWR4IDwgbGlzdC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zaS5vcmlnaW5hbEJlZ2luRHRzID49IGxpc3RbbGFzdEFwcGVuZElkeF0ubGFzdFNhbXBsZS5vcmlnaW5hbER0cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsYXN0QXBwZW5kSWR4ID09PSBsaXN0Lmxlbmd0aCAtIDEpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFzdEFwcGVuZElkeCA8IGxpc3QubGVuZ3RoIC0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNpLm9yaWdpbmFsQmVnaW5EdHMgPCBsaXN0W2xhc3RBcHBlbmRJZHggKyAxXS5vcmlnaW5hbEJlZ2luRHRzKSkpIHtcbiAgICAgICAgICAgIGluc2VydElkeCA9IGxhc3RBcHBlbmRJZHggKyAxOyAgLy8gdXNlIGNhY2hlZCBsb2NhdGlvbiBpZHhcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpbnNlcnRJZHggPSB0aGlzLl9zZWFyY2hOZWFyZXN0U2VnbWVudEJlZm9yZShtc2kub3JpZ2luYWxCZWdpbkR0cykgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbGFzdEFwcGVuZExvY2F0aW9uID0gaW5zZXJ0SWR4O1xuICAgICAgICB0aGlzLl9saXN0LnNwbGljZShpbnNlcnRJZHgsIDAsIG1zaSk7XG4gICAgfVxuXG4gICAgZ2V0TGFzdFNlZ21lbnRCZWZvcmUob3JpZ2luYWxCZWdpbkR0cykge1xuICAgICAgICBsZXQgaWR4ID0gdGhpcy5fc2VhcmNoTmVhcmVzdFNlZ21lbnRCZWZvcmUob3JpZ2luYWxCZWdpbkR0cyk7XG4gICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpc3RbaWR4XTtcbiAgICAgICAgfSBlbHNlIHsgIC8vIC0xXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldExhc3RTYW1wbGVCZWZvcmUob3JpZ2luYWxCZWdpbkR0cykge1xuICAgICAgICBsZXQgc2VnbWVudCA9IHRoaXMuZ2V0TGFzdFNlZ21lbnRCZWZvcmUob3JpZ2luYWxCZWdpbkR0cyk7XG4gICAgICAgIGlmIChzZWdtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWdtZW50Lmxhc3RTYW1wbGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldExhc3RTeW5jUG9pbnRCZWZvcmUob3JpZ2luYWxCZWdpbkR0cykge1xuICAgICAgICBsZXQgc2VnbWVudElkeCA9IHRoaXMuX3NlYXJjaE5lYXJlc3RTZWdtZW50QmVmb3JlKG9yaWdpbmFsQmVnaW5EdHMpO1xuICAgICAgICBsZXQgc3luY1BvaW50cyA9IHRoaXMuX2xpc3Rbc2VnbWVudElkeF0uc3luY1BvaW50cztcbiAgICAgICAgd2hpbGUgKHN5bmNQb2ludHMubGVuZ3RoID09PSAwICYmIHNlZ21lbnRJZHggPiAwKSB7XG4gICAgICAgICAgICBzZWdtZW50SWR4LS07XG4gICAgICAgICAgICBzeW5jUG9pbnRzID0gdGhpcy5fbGlzdFtzZWdtZW50SWR4XS5zeW5jUG9pbnRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzeW5jUG9pbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzeW5jUG9pbnRzW3N5bmNQb2ludHMubGVuZ3RoIC0gMV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxufSIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgTG9nIGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgQnJvd3NlciBmcm9tICcuLi91dGlscy9icm93c2VyLmpzJztcbmltcG9ydCBNU0VFdmVudHMgZnJvbSAnLi9tc2UtZXZlbnRzLmpzJztcbmltcG9ydCB7U2FtcGxlSW5mbywgSURSU2FtcGxlTGlzdH0gZnJvbSAnLi9tZWRpYS1zZWdtZW50LWluZm8uanMnO1xuaW1wb3J0IHtJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2V4Y2VwdGlvbi5qcyc7XG5cbi8vIE1lZGlhIFNvdXJjZSBFeHRlbnNpb25zIGNvbnRyb2xsZXJcbmNsYXNzIE1TRUNvbnRyb2xsZXIge1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHRoaXMuVEFHID0gJ01TRUNvbnRyb2xsZXInO1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmlzTGl2ZSAmJiB0aGlzLl9jb25maWcuYXV0b0NsZWFudXBTb3VyY2VCdWZmZXIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBGb3IgbGl2ZSBzdHJlYW0sIGRvIGF1dG8gY2xlYW51cCBieSBkZWZhdWx0XG4gICAgICAgICAgICB0aGlzLl9jb25maWcuYXV0b0NsZWFudXBTb3VyY2VCdWZmZXIgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lID0ge1xuICAgICAgICAgICAgb25Tb3VyY2VPcGVuOiB0aGlzLl9vblNvdXJjZU9wZW4uYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9uU291cmNlRW5kZWQ6IHRoaXMuX29uU291cmNlRW5kZWQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9uU291cmNlQ2xvc2U6IHRoaXMuX29uU291cmNlQ2xvc2UuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9uU291cmNlQnVmZmVyRXJyb3I6IHRoaXMuX29uU291cmNlQnVmZmVyRXJyb3IuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9uU291cmNlQnVmZmVyVXBkYXRlRW5kOiB0aGlzLl9vblNvdXJjZUJ1ZmZlclVwZGF0ZUVuZC5iaW5kKHRoaXMpXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fbWVkaWFTb3VyY2UgPSBudWxsO1xuICAgICAgICB0aGlzLl9tZWRpYVNvdXJjZU9iamVjdFVSTCA9IG51bGw7XG4gICAgICAgIHRoaXMuX21lZGlhRWxlbWVudCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5faXNCdWZmZXJGdWxsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2hhc1BlbmRpbmdFb3MgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9yZXF1aXJlU2V0TWVkaWFEdXJhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wZW5kaW5nTWVkaWFEdXJhdGlvbiA9IDA7XG5cbiAgICAgICAgdGhpcy5fcGVuZGluZ1NvdXJjZUJ1ZmZlckluaXQgPSBbXTtcbiAgICAgICAgdGhpcy5fbWltZVR5cGVzID0ge1xuICAgICAgICAgICAgdmlkZW86IG51bGwsXG4gICAgICAgICAgICBhdWRpbzogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9zb3VyY2VCdWZmZXJzID0ge1xuICAgICAgICAgICAgdmlkZW86IG51bGwsXG4gICAgICAgICAgICBhdWRpbzogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9sYXN0SW5pdFNlZ21lbnRzID0ge1xuICAgICAgICAgICAgdmlkZW86IG51bGwsXG4gICAgICAgICAgICBhdWRpbzogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9wZW5kaW5nU2VnbWVudHMgPSB7XG4gICAgICAgICAgICB2aWRlbzogW10sXG4gICAgICAgICAgICBhdWRpbzogW11cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fcGVuZGluZ1JlbW92ZVJhbmdlcyA9IHtcbiAgICAgICAgICAgIHZpZGVvOiBbXSxcbiAgICAgICAgICAgIGF1ZGlvOiBbXVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9pZHJMaXN0ID0gbmV3IElEUlNhbXBsZUxpc3QoKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50IHx8IHRoaXMuX21lZGlhU291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLmRldGFjaE1lZGlhRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIG9uKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9lbWl0dGVyLmFkZExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgb2ZmKGV2ZW50LCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9lbWl0dGVyLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgYXR0YWNoTWVkaWFFbGVtZW50KG1lZGlhRWxlbWVudCkge1xuICAgICAgICBpZiAodGhpcy5fbWVkaWFTb3VyY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oJ01lZGlhU291cmNlIGhhcyBiZWVuIGF0dGFjaGVkIHRvIGFuIEhUTUxNZWRpYUVsZW1lbnQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1zID0gdGhpcy5fbWVkaWFTb3VyY2UgPSBuZXcgd2luZG93Lk1lZGlhU291cmNlKCk7XG4gICAgICAgIG1zLmFkZEV2ZW50TGlzdGVuZXIoJ3NvdXJjZW9wZW4nLCB0aGlzLmUub25Tb3VyY2VPcGVuKTtcbiAgICAgICAgbXMuYWRkRXZlbnRMaXN0ZW5lcignc291cmNlZW5kZWQnLCB0aGlzLmUub25Tb3VyY2VFbmRlZCk7XG4gICAgICAgIG1zLmFkZEV2ZW50TGlzdGVuZXIoJ3NvdXJjZWNsb3NlJywgdGhpcy5lLm9uU291cmNlQ2xvc2UpO1xuXG4gICAgICAgIHRoaXMuX21lZGlhRWxlbWVudCA9IG1lZGlhRWxlbWVudDtcbiAgICAgICAgdGhpcy5fbWVkaWFTb3VyY2VPYmplY3RVUkwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCh0aGlzLl9tZWRpYVNvdXJjZSk7XG4gICAgICAgIG1lZGlhRWxlbWVudC5zcmMgPSB0aGlzLl9tZWRpYVNvdXJjZU9iamVjdFVSTDtcbiAgICB9XG5cbiAgICBkZXRhY2hNZWRpYUVsZW1lbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tZWRpYVNvdXJjZSkge1xuICAgICAgICAgICAgbGV0IG1zID0gdGhpcy5fbWVkaWFTb3VyY2U7XG4gICAgICAgICAgICBmb3IgKGxldCB0eXBlIGluIHRoaXMuX3NvdXJjZUJ1ZmZlcnMpIHtcbiAgICAgICAgICAgICAgICAvLyBwZW5kaW5nIHNlZ21lbnRzIHNob3VsZCBiZSBkaXNjYXJkXG4gICAgICAgICAgICAgICAgbGV0IHBzID0gdGhpcy5fcGVuZGluZ1NlZ21lbnRzW3R5cGVdO1xuICAgICAgICAgICAgICAgIHBzLnNwbGljZSgwLCBwcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTZWdtZW50c1t0eXBlXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1JlbW92ZVJhbmdlc1t0eXBlXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdEluaXRTZWdtZW50c1t0eXBlXSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIHNvdXJjZWJ1ZmZlcnNcbiAgICAgICAgICAgICAgICBsZXQgc2IgPSB0aGlzLl9zb3VyY2VCdWZmZXJzW3R5cGVdO1xuICAgICAgICAgICAgICAgIGlmIChzYikge1xuICAgICAgICAgICAgICAgICAgICBpZiAobXMucmVhZHlTdGF0ZSAhPT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1zIGVkZ2UgY2FuIHRocm93IGFuIGVycm9yOiBVbmV4cGVjdGVkIGNhbGwgdG8gbWV0aG9kIG9yIHByb3BlcnR5IGFjY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcy5yZW1vdmVTb3VyY2VCdWZmZXIoc2IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZSh0aGlzLlRBRywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzYi5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMuZS5vblNvdXJjZUJ1ZmZlckVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNiLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3VwZGF0ZWVuZCcsIHRoaXMuZS5vblNvdXJjZUJ1ZmZlclVwZGF0ZUVuZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWltZVR5cGVzW3R5cGVdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc291cmNlQnVmZmVyc1t0eXBlXSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1zLnJlYWR5U3RhdGUgPT09ICdvcGVuJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG1zLmVuZE9mU3RyZWFtKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nLmUodGhpcy5UQUcsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1zLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NvdXJjZW9wZW4nLCB0aGlzLmUub25Tb3VyY2VPcGVuKTtcbiAgICAgICAgICAgIG1zLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NvdXJjZWVuZGVkJywgdGhpcy5lLm9uU291cmNlRW5kZWQpO1xuICAgICAgICAgICAgbXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignc291cmNlY2xvc2UnLCB0aGlzLmUub25Tb3VyY2VDbG9zZSk7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nU291cmNlQnVmZmVySW5pdCA9IFtdO1xuICAgICAgICAgICAgdGhpcy5faXNCdWZmZXJGdWxsID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9pZHJMaXN0LmNsZWFyKCk7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYVNvdXJjZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQuc3JjID0gJyc7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21lZGlhU291cmNlT2JqZWN0VVJMKSB7XG4gICAgICAgICAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLl9tZWRpYVNvdXJjZU9iamVjdFVSTCk7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYVNvdXJjZU9iamVjdFVSTCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBlbmRJbml0U2VnbWVudChpbml0U2VnbWVudCwgZGVmZXJyZWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tZWRpYVNvdXJjZSB8fCB0aGlzLl9tZWRpYVNvdXJjZS5yZWFkeVN0YXRlICE9PSAnb3BlbicpIHtcbiAgICAgICAgICAgIC8vIHNvdXJjZWJ1ZmZlciBjcmVhdGlvbiByZXF1aXJlcyBtZWRpYVNvdXJjZS5yZWFkeVN0YXRlID09PSAnb3BlbidcbiAgICAgICAgICAgIC8vIHNvIHdlIGRlZmVyIHRoZSBzb3VyY2VidWZmZXIgY3JlYXRpb24sIHVudGlsIHNvdXJjZW9wZW4gZXZlbnQgdHJpZ2dlcmVkXG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nU291cmNlQnVmZmVySW5pdC5wdXNoKGluaXRTZWdtZW50KTtcbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoaXMgSW5pdFNlZ21lbnQgaXMgaW4gdGhlIGZyb250IG9mIHBlbmRpbmcgc2VnbWVudHMgcXVldWVcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTZWdtZW50c1tpbml0U2VnbWVudC50eXBlXS5wdXNoKGluaXRTZWdtZW50KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpcyA9IGluaXRTZWdtZW50O1xuICAgICAgICBsZXQgbWltZVR5cGUgPSBgJHtpcy5jb250YWluZXJ9YDtcbiAgICAgICAgaWYgKGlzLmNvZGVjICYmIGlzLmNvZGVjLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1pbWVUeXBlICs9IGA7Y29kZWNzPSR7aXMuY29kZWN9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmaXJzdEluaXRTZWdtZW50ID0gZmFsc2U7XG5cbiAgICAgICAgTG9nLnYodGhpcy5UQUcsICdSZWNlaXZlZCBJbml0aWFsaXphdGlvbiBTZWdtZW50LCBtaW1lVHlwZTogJyArIG1pbWVUeXBlKTtcbiAgICAgICAgdGhpcy5fbGFzdEluaXRTZWdtZW50c1tpcy50eXBlXSA9IGlzO1xuXG4gICAgICAgIGlmIChtaW1lVHlwZSAhPT0gdGhpcy5fbWltZVR5cGVzW2lzLnR5cGVdKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX21pbWVUeXBlc1tpcy50eXBlXSkgeyAgLy8gZW1wdHksIGZpcnN0IGNoYW5jZSBjcmVhdGUgc291cmNlYnVmZmVyXG4gICAgICAgICAgICAgICAgZmlyc3RJbml0U2VnbWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNiID0gdGhpcy5fc291cmNlQnVmZmVyc1tpcy50eXBlXSA9IHRoaXMuX21lZGlhU291cmNlLmFkZFNvdXJjZUJ1ZmZlcihtaW1lVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIHNiLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5lLm9uU291cmNlQnVmZmVyRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICBzYi5hZGRFdmVudExpc3RlbmVyKCd1cGRhdGVlbmQnLCB0aGlzLmUub25Tb3VyY2VCdWZmZXJVcGRhdGVFbmQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5lKHRoaXMuVEFHLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KE1TRUV2ZW50cy5FUlJPUiwge2NvZGU6IGVycm9yLmNvZGUsIG1zZzogZXJyb3IubWVzc2FnZX0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBMb2cudih0aGlzLlRBRywgYE5vdGljZTogJHtpcy50eXBlfSBtaW1lVHlwZSBjaGFuZ2VkLCBvcmlnaW46ICR7dGhpcy5fbWltZVR5cGVzW2lzLnR5cGVdfSwgdGFyZ2V0OiAke21pbWVUeXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbWltZVR5cGVzW2lzLnR5cGVdID0gbWltZVR5cGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRlZmVycmVkKSB7XG4gICAgICAgICAgICAvLyBkZWZlcnJlZCBtZWFucyB0aGlzIEluaXRTZWdtZW50IGhhcyBiZWVuIHB1c2hlZCB0byBwZW5kaW5nU2VnbWVudHMgcXVldWVcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTZWdtZW50c1tpcy50eXBlXS5wdXNoKGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZpcnN0SW5pdFNlZ21lbnQpIHsgIC8vIGFwcGVuZCBpbW1lZGlhdGVseSBvbmx5IGlmIGluaXQgc2VnbWVudCBpbiBzdWJzZXF1ZW5jZVxuICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZUJ1ZmZlcnNbaXMudHlwZV0gJiYgIXRoaXMuX3NvdXJjZUJ1ZmZlcnNbaXMudHlwZV0udXBkYXRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kb0FwcGVuZFNlZ21lbnRzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEJyb3dzZXIuc2FmYXJpICYmIGlzLmNvbnRhaW5lciA9PT0gJ2F1ZGlvL21wZWcnICYmIGlzLm1lZGlhRHVyYXRpb24gPiAwKSB7XG4gICAgICAgICAgICAvLyAnYXVkaW8vbXBlZycgdHJhY2sgdW5kZXIgU2FmYXJpIG1heSBjYXVzZSBNZWRpYUVsZW1lbnQncyBkdXJhdGlvbiB0byBiZSBOYU5cbiAgICAgICAgICAgIC8vIE1hbnVhbGx5IGNvcnJlY3QgTWVkaWFTb3VyY2UuZHVyYXRpb24gdG8gbWFrZSBwcm9ncmVzcyBiYXIgc2Vla2FibGUsIGFuZCByZXBvcnQgcmlnaHQgZHVyYXRpb25cbiAgICAgICAgICAgIHRoaXMuX3JlcXVpcmVTZXRNZWRpYUR1cmF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdNZWRpYUR1cmF0aW9uID0gaXMubWVkaWFEdXJhdGlvbiAvIDEwMDA7ICAvLyBpbiBzZWNvbmRzXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVNZWRpYVNvdXJjZUR1cmF0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhcHBlbmRNZWRpYVNlZ21lbnQobWVkaWFTZWdtZW50KSB7XG4gICAgICAgIGxldCBtcyA9IG1lZGlhU2VnbWVudDtcbiAgICAgICAgdGhpcy5fcGVuZGluZ1NlZ21lbnRzW21zLnR5cGVdLnB1c2gobXMpO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuYXV0b0NsZWFudXBTb3VyY2VCdWZmZXIgJiYgdGhpcy5fbmVlZENsZWFudXBTb3VyY2VCdWZmZXIoKSkge1xuICAgICAgICAgICAgdGhpcy5fZG9DbGVhbnVwU291cmNlQnVmZmVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2IgPSB0aGlzLl9zb3VyY2VCdWZmZXJzW21zLnR5cGVdO1xuICAgICAgICBpZiAoc2IgJiYgIXNiLnVwZGF0aW5nICYmICF0aGlzLl9oYXNQZW5kaW5nUmVtb3ZlUmFuZ2VzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2RvQXBwZW5kU2VnbWVudHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlZWsoc2Vjb25kcykge1xuICAgICAgICAvLyByZW1vdmUgYWxsIGFwcGVuZGVkIGJ1ZmZlcnNcbiAgICAgICAgZm9yIChsZXQgdHlwZSBpbiB0aGlzLl9zb3VyY2VCdWZmZXJzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3NvdXJjZUJ1ZmZlcnNbdHlwZV0pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWJvcnQgY3VycmVudCBidWZmZXIgYXBwZW5kIGFsZ29yaXRobVxuICAgICAgICAgICAgbGV0IHNiID0gdGhpcy5fc291cmNlQnVmZmVyc1t0eXBlXTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tZWRpYVNvdXJjZS5yZWFkeVN0YXRlID09PSAnb3BlbicpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiByYW5nZSByZW1vdmFsIGFsZ29yaXRobSBpcyBydW5uaW5nLCBJbnZhbGlkU3RhdGVFcnJvciB3aWxsIGJlIHRocm93ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGl0LlxuICAgICAgICAgICAgICAgICAgICBzYi5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy5lKHRoaXMuVEFHLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElEUkxpc3Qgc2hvdWxkIGJlIGNsZWFyXG4gICAgICAgICAgICB0aGlzLl9pZHJMaXN0LmNsZWFyKCk7XG5cbiAgICAgICAgICAgIC8vIHBlbmRpbmcgc2VnbWVudHMgc2hvdWxkIGJlIGRpc2NhcmRcbiAgICAgICAgICAgIGxldCBwcyA9IHRoaXMuX3BlbmRpbmdTZWdtZW50c1t0eXBlXTtcbiAgICAgICAgICAgIHBzLnNwbGljZSgwLCBwcy5sZW5ndGgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fbWVkaWFTb3VyY2UucmVhZHlTdGF0ZSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBQYXJlbnQgTWVkaWFTb3VyY2Ugb2JqZWN0IGhhcyBiZWVuIGRldGFjaGVkIGZyb20gSFRNTE1lZGlhRWxlbWVudFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyByZWNvcmQgcmFuZ2VzIHRvIGJlIHJlbW92ZSBmcm9tIFNvdXJjZUJ1ZmZlclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYi5idWZmZXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IHNiLmJ1ZmZlcmVkLnN0YXJ0KGkpO1xuICAgICAgICAgICAgICAgIGxldCBlbmQgPSBzYi5idWZmZXJlZC5lbmQoaSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1JlbW92ZVJhbmdlc1t0eXBlXS5wdXNoKHtzdGFydCwgZW5kfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIHNiIGlzIG5vdCB1cGRhdGluZywgbGV0J3MgcmVtb3ZlIHJhbmdlcyBub3chXG4gICAgICAgICAgICBpZiAoIXNiLnVwZGF0aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZG9SZW1vdmVSYW5nZXMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2FmYXJpIDEwIG1heSBnZXQgSW52YWxpZFN0YXRlRXJyb3IgaW4gdGhlIGxhdGVyIGFwcGVuZEJ1ZmZlcigpIGFmdGVyIFNvdXJjZUJ1ZmZlci5yZW1vdmUoKSBjYWxsXG4gICAgICAgICAgICAvLyBJbnRlcm5hbCBwYXJzZXIncyBzdGF0ZSBtYXkgYmUgaW52YWxpZCBhdCB0aGlzIHRpbWUuIFJlLWFwcGVuZCBsYXN0IEluaXRTZWdtZW50IHRvIHdvcmthcm91bmQuXG4gICAgICAgICAgICAvLyBSZWxhdGVkIGlzc3VlOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU5MjMwXG4gICAgICAgICAgICBpZiAoQnJvd3Nlci5zYWZhcmkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdEluaXRTZWdtZW50ID0gdGhpcy5fbGFzdEluaXRTZWdtZW50c1t0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAobGFzdEluaXRTZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTZWdtZW50c1t0eXBlXS5wdXNoKGxhc3RJbml0U2VnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc2IudXBkYXRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RvQXBwZW5kU2VnbWVudHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVuZE9mU3RyZWFtKCkge1xuICAgICAgICBsZXQgbXMgPSB0aGlzLl9tZWRpYVNvdXJjZTtcbiAgICAgICAgbGV0IHNiID0gdGhpcy5fc291cmNlQnVmZmVycztcbiAgICAgICAgaWYgKCFtcyB8fCBtcy5yZWFkeVN0YXRlICE9PSAnb3BlbicpIHtcbiAgICAgICAgICAgIGlmIChtcyAmJiBtcy5yZWFkeVN0YXRlID09PSAnY2xvc2VkJyAmJiB0aGlzLl9oYXNQZW5kaW5nU2VnbWVudHMoKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIE1lZGlhU291cmNlIGhhc24ndCB0dXJuZWQgaW50byBvcGVuIHN0YXRlLCBhbmQgdGhlcmUncmUgcGVuZGluZyBzZWdtZW50c1xuICAgICAgICAgICAgICAgIC8vIE1hcmsgcGVuZGluZyBlbmRPZlN0cmVhbSwgZGVmZXIgY2FsbCB1bnRpbCBhbGwgcGVuZGluZyBzZWdtZW50cyBhcHBlbmRlZCBjb21wbGV0ZVxuICAgICAgICAgICAgICAgIHRoaXMuX2hhc1BlbmRpbmdFb3MgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYi52aWRlbyAmJiBzYi52aWRlby51cGRhdGluZyB8fCBzYi5hdWRpbyAmJiBzYi5hdWRpby51cGRhdGluZykge1xuICAgICAgICAgICAgLy8gSWYgYW55IHNvdXJjZWJ1ZmZlciBpcyB1cGRhdGluZywgZGVmZXIgZW5kT2ZTdHJlYW0gb3BlcmF0aW9uXG4gICAgICAgICAgICAvLyBTZWUgX29uU291cmNlQnVmZmVyVXBkYXRlRW5kKClcbiAgICAgICAgICAgIHRoaXMuX2hhc1BlbmRpbmdFb3MgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faGFzUGVuZGluZ0VvcyA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gTm90aWZ5IG1lZGlhIGRhdGEgbG9hZGluZyBjb21wbGV0ZVxuICAgICAgICAgICAgLy8gVGhpcyBpcyBoZWxwZnVsIGZvciBjb3JyZWN0aW5nIHRvdGFsIGR1cmF0aW9uIHRvIG1hdGNoIGxhc3QgbWVkaWEgc2VnbWVudFxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIE1lZGlhRWxlbWVudCdzIGVuZGVkIGV2ZW50IG1heSBub3QgYmUgdHJpZ2dlcmVkXG4gICAgICAgICAgICBtcy5lbmRPZlN0cmVhbSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TmVhcmVzdEtleWZyYW1lKGR0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5faWRyTGlzdC5nZXRMYXN0U3luY1BvaW50QmVmb3JlRHRzKGR0cyk7XG4gICAgfVxuXG4gICAgX25lZWRDbGVhbnVwU291cmNlQnVmZmVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2NvbmZpZy5hdXRvQ2xlYW51cFNvdXJjZUJ1ZmZlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1cnJlbnRUaW1lID0gdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lO1xuXG4gICAgICAgIGZvciAobGV0IHR5cGUgaW4gdGhpcy5fc291cmNlQnVmZmVycykge1xuICAgICAgICAgICAgbGV0IHNiID0gdGhpcy5fc291cmNlQnVmZmVyc1t0eXBlXTtcbiAgICAgICAgICAgIGlmIChzYikge1xuICAgICAgICAgICAgICAgIGxldCBidWZmZXJlZCA9IHNiLmJ1ZmZlcmVkO1xuICAgICAgICAgICAgICAgIGlmIChidWZmZXJlZC5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWUgLSBidWZmZXJlZC5zdGFydCgwKSA+PSB0aGlzLl9jb25maWcuYXV0b0NsZWFudXBNYXhCYWNrd2FyZER1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBfZG9DbGVhbnVwU291cmNlQnVmZmVyKCkge1xuICAgICAgICBsZXQgY3VycmVudFRpbWUgPSB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWU7XG5cbiAgICAgICAgZm9yIChsZXQgdHlwZSBpbiB0aGlzLl9zb3VyY2VCdWZmZXJzKSB7XG4gICAgICAgICAgICBsZXQgc2IgPSB0aGlzLl9zb3VyY2VCdWZmZXJzW3R5cGVdO1xuICAgICAgICAgICAgaWYgKHNiKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZlcmVkID0gc2IuYnVmZmVyZWQ7XG4gICAgICAgICAgICAgICAgbGV0IGRvUmVtb3ZlID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9IGJ1ZmZlcmVkLnN0YXJ0KGkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gYnVmZmVyZWQuZW5kKGkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA8PSBjdXJyZW50VGltZSAmJiBjdXJyZW50VGltZSA8IGVuZCArIDMpIHsgIC8vIHBhZGRpbmcgMyBzZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWUgLSBzdGFydCA+PSB0aGlzLl9jb25maWcuYXV0b0NsZWFudXBNYXhCYWNrd2FyZER1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9SZW1vdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZW1vdmVFbmQgPSBjdXJyZW50VGltZSAtIHRoaXMuX2NvbmZpZy5hdXRvQ2xlYW51cE1pbkJhY2t3YXJkRHVyYXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1JlbW92ZVJhbmdlc1t0eXBlXS5wdXNoKHtzdGFydDogc3RhcnQsIGVuZDogcmVtb3ZlRW5kfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kIDwgY3VycmVudFRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvUmVtb3ZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdSZW1vdmVSYW5nZXNbdHlwZV0ucHVzaCh7c3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRvUmVtb3ZlICYmICFzYi51cGRhdGluZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb1JlbW92ZVJhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF91cGRhdGVNZWRpYVNvdXJjZUR1cmF0aW9uKCkge1xuICAgICAgICBsZXQgc2IgPSB0aGlzLl9zb3VyY2VCdWZmZXJzO1xuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50LnJlYWR5U3RhdGUgPT09IDAgfHwgdGhpcy5fbWVkaWFTb3VyY2UucmVhZHlTdGF0ZSAhPT0gJ29wZW4nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChzYi52aWRlbyAmJiBzYi52aWRlby51cGRhdGluZykgfHwgKHNiLmF1ZGlvICYmIHNiLmF1ZGlvLnVwZGF0aW5nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9tZWRpYVNvdXJjZS5kdXJhdGlvbjtcbiAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuX3BlbmRpbmdNZWRpYUR1cmF0aW9uO1xuXG4gICAgICAgIGlmICh0YXJnZXQgPiAwICYmIChpc05hTihjdXJyZW50KSB8fCB0YXJnZXQgPiBjdXJyZW50KSkge1xuICAgICAgICAgICAgTG9nLnYodGhpcy5UQUcsIGBVcGRhdGUgTWVkaWFTb3VyY2UgZHVyYXRpb24gZnJvbSAke2N1cnJlbnR9IHRvICR7dGFyZ2V0fWApO1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFTb3VyY2UuZHVyYXRpb24gPSB0YXJnZXQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZXF1aXJlU2V0TWVkaWFEdXJhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9wZW5kaW5nTWVkaWFEdXJhdGlvbiA9IDA7XG4gICAgfVxuXG4gICAgX2RvUmVtb3ZlUmFuZ2VzKCkge1xuICAgICAgICBmb3IgKGxldCB0eXBlIGluIHRoaXMuX3BlbmRpbmdSZW1vdmVSYW5nZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fc291cmNlQnVmZmVyc1t0eXBlXSB8fCB0aGlzLl9zb3VyY2VCdWZmZXJzW3R5cGVdLnVwZGF0aW5nKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc2IgPSB0aGlzLl9zb3VyY2VCdWZmZXJzW3R5cGVdO1xuICAgICAgICAgICAgbGV0IHJhbmdlcyA9IHRoaXMuX3BlbmRpbmdSZW1vdmVSYW5nZXNbdHlwZV07XG4gICAgICAgICAgICB3aGlsZSAocmFuZ2VzLmxlbmd0aCAmJiAhc2IudXBkYXRpbmcpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmFuZ2UgPSByYW5nZXMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBzYi5yZW1vdmUocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZG9BcHBlbmRTZWdtZW50cygpIHtcbiAgICAgICAgbGV0IHBlbmRpbmdTZWdtZW50cyA9IHRoaXMuX3BlbmRpbmdTZWdtZW50cztcblxuICAgICAgICBmb3IgKGxldCB0eXBlIGluIHBlbmRpbmdTZWdtZW50cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9zb3VyY2VCdWZmZXJzW3R5cGVdIHx8IHRoaXMuX3NvdXJjZUJ1ZmZlcnNbdHlwZV0udXBkYXRpbmcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBlbmRpbmdTZWdtZW50c1t0eXBlXS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlZ21lbnQgPSBwZW5kaW5nU2VnbWVudHNbdHlwZV0uc2hpZnQoKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LnRpbWVzdGFtcE9mZnNldCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgTVBFRyBhdWRpbyBzdHJlYW0gaW4gTVNFLCBpZiB1bmJ1ZmZlcmVkLXNlZWtpbmcgb2NjdXJyZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCBleHBsaWNpdGx5IHNldCB0aW1lc3RhbXBPZmZzZXQgdG8gdGhlIGRlc2lyZWQgcG9pbnQgaW4gdGltZWxpbmUgZm9yIG1wZWcgU291cmNlQnVmZmVyLlxuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudE9mZnNldCA9IHRoaXMuX3NvdXJjZUJ1ZmZlcnNbdHlwZV0udGltZXN0YW1wT2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0T2Zmc2V0ID0gc2VnbWVudC50aW1lc3RhbXBPZmZzZXQgLyAxMDAwOyAgLy8gaW4gc2Vjb25kc1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBkZWx0YSA9IE1hdGguYWJzKGN1cnJlbnRPZmZzZXQgLSB0YXJnZXRPZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPiAwLjEpIHsgIC8vIElmIHRpbWUgZGVsdGEgPiAxMDBtc1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYodGhpcy5UQUcsIGBVcGRhdGUgTVBFRyBhdWRpbyB0aW1lc3RhbXBPZmZzZXQgZnJvbSAke2N1cnJlbnRPZmZzZXR9IHRvICR7dGFyZ2V0T2Zmc2V0fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc291cmNlQnVmZmVyc1t0eXBlXS50aW1lc3RhbXBPZmZzZXQgPSB0YXJnZXRPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNlZ21lbnQudGltZXN0YW1wT2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghc2VnbWVudC5kYXRhIHx8IHNlZ21lbnQuZGF0YS5ieXRlTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBlbXB0eSBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc291cmNlQnVmZmVyc1t0eXBlXS5hcHBlbmRCdWZmZXIoc2VnbWVudC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNCdWZmZXJGdWxsID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAndmlkZW8nICYmIHNlZ21lbnQuaGFzT3duUHJvcGVydHkoJ2luZm8nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faWRyTGlzdC5hcHBlbmRBcnJheShzZWdtZW50LmluZm8uc3luY1BvaW50cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nU2VnbWVudHNbdHlwZV0udW5zaGlmdChzZWdtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IDIyKSB7ICAvLyBRdW90YUV4Y2VlZGVkRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdGljZSB0aGF0IEZpcmVGb3ggbWF5IG5vdCB0aHJvdyBRdW90YUV4Y2VlZGVkRXJyb3IgaWYgU291cmNlQnVmZmVyIGlzIGZ1bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEN1cnJlbnRseSB3ZSBjYW4gb25seSBkbyBsYXp5LWxvYWQgdG8gYXZvaWQgU291cmNlQnVmZmVyIGJlY29tZSBzY2F0dGVyZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBTb3VyY2VCdWZmZXIgZXZpY3Rpb24gcG9saWN5IG1heSBiZSBjaGFuZ2VkIGluIGZ1dHVyZSB2ZXJzaW9uIG9mIEZpcmVGb3guXG4gICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogUmVsYXRlZCBpc3N1ZXM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjc5ODg1XG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjgwMDIzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0IGJ1ZmZlciBmdWxsLCBhYm9ydCBuZXR3b3JrIElPXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lzQnVmZmVyRnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChNU0VFdmVudHMuQlVGRkVSX0ZVTEwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNCdWZmZXJGdWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKHRoaXMuVEFHLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChNU0VFdmVudHMuRVJST1IsIHtjb2RlOiBlcnJvci5jb2RlLCBtc2c6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vblNvdXJjZU9wZW4oKSB7XG4gICAgICAgIExvZy52KHRoaXMuVEFHLCAnTWVkaWFTb3VyY2Ugb25Tb3VyY2VPcGVuJyk7XG4gICAgICAgIHRoaXMuX21lZGlhU291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NvdXJjZW9wZW4nLCB0aGlzLmUub25Tb3VyY2VPcGVuKTtcbiAgICAgICAgLy8gZGVmZXJyZWQgc291cmNlYnVmZmVyIGNyZWF0aW9uIC8gaW5pdGlhbGl6YXRpb25cbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdTb3VyY2VCdWZmZXJJbml0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBwZW5kaW5ncyA9IHRoaXMuX3BlbmRpbmdTb3VyY2VCdWZmZXJJbml0O1xuICAgICAgICAgICAgd2hpbGUgKHBlbmRpbmdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGxldCBzZWdtZW50ID0gcGVuZGluZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZEluaXRTZWdtZW50KHNlZ21lbnQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRoZXJlIG1heSBiZSBzb21lIHBlbmRpbmcgbWVkaWEgc2VnbWVudHMsIGFwcGVuZCB0aGVtXG4gICAgICAgIGlmICh0aGlzLl9oYXNQZW5kaW5nU2VnbWVudHMoKSkge1xuICAgICAgICAgICAgdGhpcy5fZG9BcHBlbmRTZWdtZW50cygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChNU0VFdmVudHMuU09VUkNFX09QRU4pO1xuICAgIH1cblxuICAgIF9vblNvdXJjZUVuZGVkKCkge1xuICAgICAgICAvLyBmaXJlZCBvbiBlbmRPZlN0cmVhbVxuICAgICAgICBMb2cudih0aGlzLlRBRywgJ01lZGlhU291cmNlIG9uU291cmNlRW5kZWQnKTtcbiAgICB9XG5cbiAgICBfb25Tb3VyY2VDbG9zZSgpIHtcbiAgICAgICAgLy8gZmlyZWQgb24gZGV0YWNoaW5nIGZyb20gbWVkaWEgZWxlbWVudFxuICAgICAgICBMb2cudih0aGlzLlRBRywgJ01lZGlhU291cmNlIG9uU291cmNlQ2xvc2UnKTtcbiAgICAgICAgaWYgKHRoaXMuX21lZGlhU291cmNlICYmIHRoaXMuZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYVNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyKCdzb3VyY2VvcGVuJywgdGhpcy5lLm9uU291cmNlT3Blbik7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYVNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyKCdzb3VyY2VlbmRlZCcsIHRoaXMuZS5vblNvdXJjZUVuZGVkKTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhU291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NvdXJjZWNsb3NlJywgdGhpcy5lLm9uU291cmNlQ2xvc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2hhc1BlbmRpbmdTZWdtZW50cygpIHtcbiAgICAgICAgbGV0IHBzID0gdGhpcy5fcGVuZGluZ1NlZ21lbnRzO1xuICAgICAgICByZXR1cm4gcHMudmlkZW8ubGVuZ3RoID4gMCB8fCBwcy5hdWRpby5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIF9oYXNQZW5kaW5nUmVtb3ZlUmFuZ2VzKCkge1xuICAgICAgICBsZXQgcHJyID0gdGhpcy5fcGVuZGluZ1JlbW92ZVJhbmdlcztcbiAgICAgICAgcmV0dXJuIHByci52aWRlby5sZW5ndGggPiAwIHx8IHByci5hdWRpby5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIF9vblNvdXJjZUJ1ZmZlclVwZGF0ZUVuZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlcXVpcmVTZXRNZWRpYUR1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVNZWRpYVNvdXJjZUR1cmF0aW9uKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5faGFzUGVuZGluZ1JlbW92ZVJhbmdlcygpKSB7XG4gICAgICAgICAgICB0aGlzLl9kb1JlbW92ZVJhbmdlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2hhc1BlbmRpbmdTZWdtZW50cygpKSB7XG4gICAgICAgICAgICB0aGlzLl9kb0FwcGVuZFNlZ21lbnRzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5faGFzUGVuZGluZ0Vvcykge1xuICAgICAgICAgICAgdGhpcy5lbmRPZlN0cmVhbSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChNU0VFdmVudHMuVVBEQVRFX0VORCk7XG4gICAgfVxuXG4gICAgX29uU291cmNlQnVmZmVyRXJyb3IoZSkge1xuICAgICAgICBMb2cuZSh0aGlzLlRBRywgYFNvdXJjZUJ1ZmZlciBFcnJvcjogJHtlfWApO1xuICAgICAgICAvLyB0aGlzIGVycm9yIG1pZ2h0IG5vdCBhbHdheXMgYmUgZmF0YWwsIGp1c3QgaWdub3JlIGl0XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1TRUNvbnRyb2xsZXI7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IE1TRUV2ZW50cyA9IHtcbiAgICBFUlJPUjogJ2Vycm9yJyxcbiAgICBTT1VSQ0VfT1BFTjogJ3NvdXJjZV9vcGVuJyxcbiAgICBVUERBVEVfRU5EOiAndXBkYXRlX2VuZCcsXG4gICAgQlVGRkVSX0ZVTEw6ICdidWZmZXJfZnVsbCdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1TRUV2ZW50czsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnO1xuaW1wb3J0IExvZyBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IExvZ2dpbmdDb250cm9sIGZyb20gJy4uL3V0aWxzL2xvZ2dpbmctY29udHJvbC5qcyc7XG5pbXBvcnQgVHJhbnNtdXhpbmdDb250cm9sbGVyIGZyb20gJy4vdHJhbnNtdXhpbmctY29udHJvbGxlci5qcyc7XG5pbXBvcnQgVHJhbnNtdXhpbmdFdmVudHMgZnJvbSAnLi90cmFuc211eGluZy1ldmVudHMuanMnO1xuaW1wb3J0IFRyYW5zbXV4aW5nV29ya2VyIGZyb20gJy4vdHJhbnNtdXhpbmctd29ya2VyLmpzJztcbmltcG9ydCBNZWRpYUluZm8gZnJvbSAnLi9tZWRpYS1pbmZvLmpzJztcblxuY2xhc3MgVHJhbnNtdXhlciB7XG5cbiAgICBjb25zdHJ1Y3RvcihtZWRpYURhdGFTb3VyY2UsIGNvbmZpZykge1xuICAgICAgICB0aGlzLlRBRyA9ICdUcmFuc211eGVyJztcbiAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgICAgICBpZiAoY29uZmlnLmVuYWJsZVdvcmtlciAmJiB0eXBlb2YgKFdvcmtlcikgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCB3b3JrID0gcmVxdWlyZSgnd2Vid29ya2lmeScpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtlciA9IHdvcmsoVHJhbnNtdXhpbmdXb3JrZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtlckRlc3Ryb3lpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX29uV29ya2VyTWVzc2FnZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3JrZXIucG9zdE1lc3NhZ2Uoe2NtZDogJ2luaXQnLCBwYXJhbTogW21lZGlhRGF0YVNvdXJjZSwgY29uZmlnXX0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgb25Mb2dnaW5nQ29uZmlnQ2hhbmdlZDogdGhpcy5fb25Mb2dnaW5nQ29uZmlnQ2hhbmdlZC5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBMb2dnaW5nQ29udHJvbC5yZWdpc3Rlckxpc3RlbmVyKHRoaXMuZS5vbkxvZ2dpbmdDb25maWdDaGFuZ2VkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3JrZXIucG9zdE1lc3NhZ2Uoe2NtZDogJ2xvZ2dpbmdfY29uZmlnJywgcGFyYW06IExvZ2dpbmdDb250cm9sLmdldENvbmZpZygpfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIExvZy5lKHRoaXMuVEFHLCAnRXJyb3Igd2hpbGUgaW5pdGlhbGl6ZSB0cmFuc211eGluZyB3b3JrZXIsIGZhbGxiYWNrIHRvIGlubGluZSB0cmFuc211eGluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29udHJvbGxlciA9IG5ldyBUcmFuc211eGluZ0NvbnRyb2xsZXIobWVkaWFEYXRhU291cmNlLCBjb25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udHJvbGxlciA9IG5ldyBUcmFuc211eGluZ0NvbnRyb2xsZXIobWVkaWFEYXRhU291cmNlLCBjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIGxldCBjdGwgPSB0aGlzLl9jb250cm9sbGVyO1xuICAgICAgICAgICAgY3RsLm9uKFRyYW5zbXV4aW5nRXZlbnRzLklPX0VSUk9SLCB0aGlzLl9vbklPRXJyb3IuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICBjdGwub24oVHJhbnNtdXhpbmdFdmVudHMuREVNVVhfRVJST1IsIHRoaXMuX29uRGVtdXhFcnJvci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIGN0bC5vbihUcmFuc211eGluZ0V2ZW50cy5JTklUX1NFR01FTlQsIHRoaXMuX29uSW5pdFNlZ21lbnQuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICBjdGwub24oVHJhbnNtdXhpbmdFdmVudHMuTUVESUFfU0VHTUVOVCwgdGhpcy5fb25NZWRpYVNlZ21lbnQuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICBjdGwub24oVHJhbnNtdXhpbmdFdmVudHMuTE9BRElOR19DT01QTEVURSwgdGhpcy5fb25Mb2FkaW5nQ29tcGxldGUuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICBjdGwub24oVHJhbnNtdXhpbmdFdmVudHMuUkVDT1ZFUkVEX0VBUkxZX0VPRiwgdGhpcy5fb25SZWNvdmVyZWRFYXJseUVvZi5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIGN0bC5vbihUcmFuc211eGluZ0V2ZW50cy5NRURJQV9JTkZPLCB0aGlzLl9vbk1lZGlhSW5mby5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIGN0bC5vbihUcmFuc211eGluZ0V2ZW50cy5NRVRBREFUQV9BUlJJVkVELCB0aGlzLl9vbk1ldGFEYXRhQXJyaXZlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIGN0bC5vbihUcmFuc211eGluZ0V2ZW50cy5TQ1JJUFREQVRBX0FSUklWRUQsIHRoaXMuX29uU2NyaXB0RGF0YUFycml2ZWQuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICBjdGwub24oVHJhbnNtdXhpbmdFdmVudHMuU1RBVElTVElDU19JTkZPLCB0aGlzLl9vblN0YXRpc3RpY3NJbmZvLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgY3RsLm9uKFRyYW5zbXV4aW5nRXZlbnRzLlJFQ09NTUVORF9TRUVLUE9JTlQsIHRoaXMuX29uUmVjb21tZW5kU2Vla3BvaW50LmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlcikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl93b3JrZXJEZXN0cm95aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya2VyRGVzdHJveWluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya2VyLnBvc3RNZXNzYWdlKHtjbWQ6ICdkZXN0cm95J30pO1xuICAgICAgICAgICAgICAgIExvZ2dpbmdDb250cm9sLnJlbW92ZUxpc3RlbmVyKHRoaXMuZS5vbkxvZ2dpbmdDb25maWdDaGFuZ2VkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udHJvbGxlci5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl9jb250cm9sbGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9lbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLl9lbWl0dGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5hZGRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIG9mZihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIGhhc1dvcmtlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtlciAhPSBudWxsO1xuICAgIH1cblxuICAgIG9wZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5wb3N0TWVzc2FnZSh7Y21kOiAnc3RhcnQnfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jb250cm9sbGVyLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyLnBvc3RNZXNzYWdlKHtjbWQ6ICdzdG9wJ30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udHJvbGxlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWVrKG1pbGxpc2Vjb25kcykge1xuICAgICAgICBpZiAodGhpcy5fd29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIucG9zdE1lc3NhZ2Uoe2NtZDogJ3NlZWsnLCBwYXJhbTogbWlsbGlzZWNvbmRzfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9jb250cm9sbGVyLnNlZWsobWlsbGlzZWNvbmRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhdXNlKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIucG9zdE1lc3NhZ2Uoe2NtZDogJ3BhdXNlJ30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29udHJvbGxlci5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzdW1lKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya2VyKSB7XG4gICAgICAgICAgICB0aGlzLl93b3JrZXIucG9zdE1lc3NhZ2Uoe2NtZDogJ3Jlc3VtZSd9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xsZXIucmVzdW1lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25Jbml0U2VnbWVudCh0eXBlLCBpbml0U2VnbWVudCkge1xuICAgICAgICAvLyBkbyBhc3luYyBpbnZva2VcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuSU5JVF9TRUdNRU5ULCB0eXBlLCBpbml0U2VnbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vbk1lZGlhU2VnbWVudCh0eXBlLCBtZWRpYVNlZ21lbnQpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuTUVESUFfU0VHTUVOVCwgdHlwZSwgbWVkaWFTZWdtZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29uTG9hZGluZ0NvbXBsZXRlKCkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5MT0FESU5HX0NPTVBMRVRFKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29uUmVjb3ZlcmVkRWFybHlFb2YoKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFRyYW5zbXV4aW5nRXZlbnRzLlJFQ09WRVJFRF9FQVJMWV9FT0YpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfb25NZWRpYUluZm8obWVkaWFJbmZvKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFRyYW5zbXV4aW5nRXZlbnRzLk1FRElBX0lORk8sIG1lZGlhSW5mbyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vbk1ldGFEYXRhQXJyaXZlZChtZXRhZGF0YSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5NRVRBREFUQV9BUlJJVkVELCBtZXRhZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vblNjcmlwdERhdGFBcnJpdmVkKGRhdGEpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuU0NSSVBUREFUQV9BUlJJVkVELCBkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29uU3RhdGlzdGljc0luZm8oc3RhdGlzdGljc0luZm8pIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuU1RBVElTVElDU19JTkZPLCBzdGF0aXN0aWNzSW5mbyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vbklPRXJyb3IodHlwZSwgaW5mbykge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5JT19FUlJPUiwgdHlwZSwgaW5mbyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vbkRlbXV4RXJyb3IodHlwZSwgaW5mbykge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5ERU1VWF9FUlJPUiwgdHlwZSwgaW5mbyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9vblJlY29tbWVuZFNlZWtwb2ludChtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuUkVDT01NRU5EX1NFRUtQT0lOVCwgbWlsbGlzZWNvbmRzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29uTG9nZ2luZ0NvbmZpZ0NoYW5nZWQoY29uZmlnKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5wb3N0TWVzc2FnZSh7Y21kOiAnbG9nZ2luZ19jb25maWcnLCBwYXJhbTogY29uZmlnfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25Xb3JrZXJNZXNzYWdlKGUpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBlLmRhdGE7XG4gICAgICAgIGxldCBkYXRhID0gbWVzc2FnZS5kYXRhO1xuXG4gICAgICAgIGlmIChtZXNzYWdlLm1zZyA9PT0gJ2Rlc3Ryb3llZCcgfHwgdGhpcy5fd29ya2VyRGVzdHJveWluZykge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyRGVzdHJveWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAobWVzc2FnZS5tc2cpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhbnNtdXhpbmdFdmVudHMuSU5JVF9TRUdNRU5UOlxuICAgICAgICAgICAgY2FzZSBUcmFuc211eGluZ0V2ZW50cy5NRURJQV9TRUdNRU5UOlxuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChtZXNzYWdlLm1zZywgZGF0YS50eXBlLCBkYXRhLmRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBUcmFuc211eGluZ0V2ZW50cy5MT0FESU5HX0NPTVBMRVRFOlxuICAgICAgICAgICAgY2FzZSBUcmFuc211eGluZ0V2ZW50cy5SRUNPVkVSRURfRUFSTFlfRU9GOlxuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChtZXNzYWdlLm1zZyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRyYW5zbXV4aW5nRXZlbnRzLk1FRElBX0lORk86XG4gICAgICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGRhdGEsIE1lZGlhSW5mby5wcm90b3R5cGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChtZXNzYWdlLm1zZywgZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRyYW5zbXV4aW5nRXZlbnRzLk1FVEFEQVRBX0FSUklWRUQ6XG4gICAgICAgICAgICBjYXNlIFRyYW5zbXV4aW5nRXZlbnRzLlNDUklQVERBVEFfQVJSSVZFRDpcbiAgICAgICAgICAgIGNhc2UgVHJhbnNtdXhpbmdFdmVudHMuU1RBVElTVElDU19JTkZPOlxuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChtZXNzYWdlLm1zZywgZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFRyYW5zbXV4aW5nRXZlbnRzLklPX0VSUk9SOlxuICAgICAgICAgICAgY2FzZSBUcmFuc211eGluZ0V2ZW50cy5ERU1VWF9FUlJPUjpcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQobWVzc2FnZS5tc2csIGRhdGEudHlwZSwgZGF0YS5pbmZvKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVHJhbnNtdXhpbmdFdmVudHMuUkVDT01NRU5EX1NFRUtQT0lOVDpcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQobWVzc2FnZS5tc2csIGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbG9nY2F0X2NhbGxiYWNrJzpcbiAgICAgICAgICAgICAgICBMb2cuZW1pdHRlci5lbWl0KCdsb2cnLCBkYXRhLnR5cGUsIGRhdGEubG9nY2F0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNtdXhlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnO1xuaW1wb3J0IExvZyBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IEJyb3dzZXIgZnJvbSAnLi4vdXRpbHMvYnJvd3Nlci5qcyc7XG5pbXBvcnQgTWVkaWFJbmZvIGZyb20gJy4vbWVkaWEtaW5mby5qcyc7XG5pbXBvcnQgRkxWRGVtdXhlciBmcm9tICcuLi9kZW11eC9mbHYtZGVtdXhlci5qcyc7XG5pbXBvcnQgTVA0UmVtdXhlciBmcm9tICcuLi9yZW11eC9tcDQtcmVtdXhlci5qcyc7XG5pbXBvcnQgRGVtdXhFcnJvcnMgZnJvbSAnLi4vZGVtdXgvZGVtdXgtZXJyb3JzLmpzJztcbmltcG9ydCBJT0NvbnRyb2xsZXIgZnJvbSAnLi4vaW8vaW8tY29udHJvbGxlci5qcyc7XG5pbXBvcnQgVHJhbnNtdXhpbmdFdmVudHMgZnJvbSAnLi90cmFuc211eGluZy1ldmVudHMuanMnO1xuaW1wb3J0IHtMb2FkZXJTdGF0dXMsIExvYWRlckVycm9yc30gZnJvbSAnLi4vaW8vbG9hZGVyLmpzJztcblxuLy8gVHJhbnNtdXhpbmcgKElPLCBEZW11eGluZywgUmVtdXhpbmcpIGNvbnRyb2xsZXIsIHdpdGggbXVsdGlwYXJ0IHN1cHBvcnRcbmNsYXNzIFRyYW5zbXV4aW5nQ29udHJvbGxlciB7XG5cbiAgICBjb25zdHJ1Y3RvcihtZWRpYURhdGFTb3VyY2UsIGNvbmZpZykge1xuICAgICAgICB0aGlzLlRBRyA9ICdUcmFuc211eGluZ0NvbnRyb2xsZXInO1xuICAgICAgICB0aGlzLl9lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcblxuICAgICAgICAvLyB0cmVhdCBzaW5nbGUgcGFydCBtZWRpYSBhcyBtdWx0aXBhcnQgbWVkaWEsIHdoaWNoIGhhcyBvbmx5IG9uZSBzZWdtZW50XG4gICAgICAgIGlmICghbWVkaWFEYXRhU291cmNlLnNlZ21lbnRzKSB7XG4gICAgICAgICAgICBtZWRpYURhdGFTb3VyY2Uuc2VnbWVudHMgPSBbe1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBtZWRpYURhdGFTb3VyY2UuZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgZmlsZXNpemU6IG1lZGlhRGF0YVNvdXJjZS5maWxlc2l6ZSxcbiAgICAgICAgICAgICAgICB1cmw6IG1lZGlhRGF0YVNvdXJjZS51cmxcbiAgICAgICAgICAgIH1dO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlsbCBpbiBkZWZhdWx0IElPIHBhcmFtcyBpZiBub3QgZXhpc3RzXG4gICAgICAgIGlmICh0eXBlb2YgbWVkaWFEYXRhU291cmNlLmNvcnMgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgbWVkaWFEYXRhU291cmNlLmNvcnMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWVkaWFEYXRhU291cmNlLndpdGhDcmVkZW50aWFscyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBtZWRpYURhdGFTb3VyY2Uud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tZWRpYURhdGFTb3VyY2UgPSBtZWRpYURhdGFTb3VyY2U7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTZWdtZW50SW5kZXggPSAwO1xuICAgICAgICBsZXQgdG90YWxEdXJhdGlvbiA9IDA7XG5cbiAgICAgICAgdGhpcy5fbWVkaWFEYXRhU291cmNlLnNlZ21lbnRzLmZvckVhY2goKHNlZ21lbnQpID0+IHtcbiAgICAgICAgICAgIC8vIHRpbWVzdGFtcEJhc2UgZm9yIGVhY2ggc2VnbWVudCwgYW5kIGNhbGN1bGF0ZSB0b3RhbCBkdXJhdGlvblxuICAgICAgICAgICAgc2VnbWVudC50aW1lc3RhbXBCYXNlID0gdG90YWxEdXJhdGlvbjtcbiAgICAgICAgICAgIHRvdGFsRHVyYXRpb24gKz0gc2VnbWVudC5kdXJhdGlvbjtcbiAgICAgICAgICAgIC8vIHBhcmFtcyBuZWVkZWQgYnkgSU9Db250cm9sbGVyXG4gICAgICAgICAgICBzZWdtZW50LmNvcnMgPSBtZWRpYURhdGFTb3VyY2UuY29ycztcbiAgICAgICAgICAgIHNlZ21lbnQud2l0aENyZWRlbnRpYWxzID0gbWVkaWFEYXRhU291cmNlLndpdGhDcmVkZW50aWFscztcbiAgICAgICAgICAgIC8vIHJlZmVycmVyIHBvbGljeSBjb250cm9sLCBpZiBleGlzdFxuICAgICAgICAgICAgaWYgKGNvbmZpZy5yZWZlcnJlclBvbGljeSkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQucmVmZXJyZXJQb2xpY3kgPSBjb25maWcucmVmZXJyZXJQb2xpY3k7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghaXNOYU4odG90YWxEdXJhdGlvbikgJiYgdGhpcy5fbWVkaWFEYXRhU291cmNlLmR1cmF0aW9uICE9PSB0b3RhbER1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYURhdGFTb3VyY2UuZHVyYXRpb24gPSB0b3RhbER1cmF0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbWVkaWFJbmZvID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZGVtdXhlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlbXV4ZXIgPSBudWxsO1xuICAgICAgICB0aGlzLl9pb2N0bCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fcGVuZGluZ1NlZWtUaW1lID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcGVuZGluZ1Jlc29sdmVTZWVrUG9pbnQgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlciA9IG51bGw7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fbWVkaWFJbmZvID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWVkaWFEYXRhU291cmNlID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5fc3RhdGlzdGljc1JlcG9ydGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlU3RhdGlzdGljc1JlcG9ydGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2lvY3RsKSB7XG4gICAgICAgICAgICB0aGlzLl9pb2N0bC5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLl9pb2N0bCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RlbXV4ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlbXV4ZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fZGVtdXhlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlbXV4ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbXV4ZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fcmVtdXhlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLl9lbWl0dGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5hZGRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIG9mZihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHN0YXJ0KCkge1xuICAgICAgICB0aGlzLl9sb2FkU2VnbWVudCgwKTtcbiAgICAgICAgdGhpcy5fZW5hYmxlU3RhdGlzdGljc1JlcG9ydGVyKCk7XG4gICAgfVxuXG4gICAgX2xvYWRTZWdtZW50KHNlZ21lbnRJbmRleCwgb3B0aW9uYWxGcm9tKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRTZWdtZW50SW5kZXggPSBzZWdtZW50SW5kZXg7XG4gICAgICAgIGxldCBkYXRhU291cmNlID0gdGhpcy5fbWVkaWFEYXRhU291cmNlLnNlZ21lbnRzW3NlZ21lbnRJbmRleF07XG5cbiAgICAgICAgbGV0IGlvY3RsID0gdGhpcy5faW9jdGwgPSBuZXcgSU9Db250cm9sbGVyKGRhdGFTb3VyY2UsIHRoaXMuX2NvbmZpZywgc2VnbWVudEluZGV4KTtcbiAgICAgICAgaW9jdGwub25FcnJvciA9IHRoaXMuX29uSU9FeGNlcHRpb24uYmluZCh0aGlzKTtcbiAgICAgICAgaW9jdGwub25TZWVrZWQgPSB0aGlzLl9vbklPU2Vla2VkLmJpbmQodGhpcyk7XG4gICAgICAgIGlvY3RsLm9uQ29tcGxldGUgPSB0aGlzLl9vbklPQ29tcGxldGUuYmluZCh0aGlzKTtcbiAgICAgICAgaW9jdGwub25SZWRpcmVjdCA9IHRoaXMuX29uSU9SZWRpcmVjdC5iaW5kKHRoaXMpO1xuICAgICAgICBpb2N0bC5vblJlY292ZXJlZEVhcmx5RW9mID0gdGhpcy5fb25JT1JlY292ZXJlZEVhcmx5RW9mLmJpbmQodGhpcyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbmFsRnJvbSkge1xuICAgICAgICAgICAgdGhpcy5fZGVtdXhlci5iaW5kRGF0YVNvdXJjZSh0aGlzLl9pb2N0bCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpb2N0bC5vbkRhdGFBcnJpdmFsID0gdGhpcy5fb25Jbml0Q2h1bmtBcnJpdmFsLmJpbmQodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpb2N0bC5vcGVuKG9wdGlvbmFsRnJvbSk7XG4gICAgfVxuXG4gICAgc3RvcCgpIHtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxBYm9ydCgpO1xuICAgICAgICB0aGlzLl9kaXNhYmxlU3RhdGlzdGljc1JlcG9ydGVyKCk7XG4gICAgfVxuXG4gICAgX2ludGVybmFsQWJvcnQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pb2N0bCkge1xuICAgICAgICAgICAgdGhpcy5faW9jdGwuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5faW9jdGwgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGF1c2UoKSB7ICAvLyB0YWtlIGEgcmVzdFxuICAgICAgICBpZiAodGhpcy5faW9jdGwgJiYgdGhpcy5faW9jdGwuaXNXb3JraW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2lvY3RsLnBhdXNlKCk7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlU3RhdGlzdGljc1JlcG9ydGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXN1bWUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pb2N0bCAmJiB0aGlzLl9pb2N0bC5pc1BhdXNlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9pb2N0bC5yZXN1bWUoKTtcbiAgICAgICAgICAgIHRoaXMuX2VuYWJsZVN0YXRpc3RpY3NSZXBvcnRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VlayhtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgaWYgKHRoaXMuX21lZGlhSW5mbyA9PSBudWxsIHx8ICF0aGlzLl9tZWRpYUluZm8uaXNTZWVrYWJsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGFyZ2V0U2VnbWVudEluZGV4ID0gdGhpcy5fc2VhcmNoU2VnbWVudEluZGV4Q29udGFpbnMobWlsbGlzZWNvbmRzKTtcblxuICAgICAgICBpZiAodGFyZ2V0U2VnbWVudEluZGV4ID09PSB0aGlzLl9jdXJyZW50U2VnbWVudEluZGV4KSB7XG4gICAgICAgICAgICAvLyBpbnRyYS1zZWdtZW50IHNlZWtpbmdcbiAgICAgICAgICAgIGxldCBzZWdtZW50SW5mbyA9IHRoaXMuX21lZGlhSW5mby5zZWdtZW50c1t0YXJnZXRTZWdtZW50SW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAoc2VnbWVudEluZm8gPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gY3VycmVudCBzZWdtZW50IGxvYWRpbmcgc3RhcnRlZCwgYnV0IG1lZGlhaW5mbyBoYXNuJ3QgcmVjZWl2ZWQgeWV0XG4gICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIG1ldGFkYXRhIGxvYWRlZCwgdGhlbiBzZWVrIHRvIGV4cGVjdGVkIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1NlZWtUaW1lID0gbWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5ZnJhbWUgPSBzZWdtZW50SW5mby5nZXROZWFyZXN0S2V5ZnJhbWUobWlsbGlzZWNvbmRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW11eGVyLnNlZWsoa2V5ZnJhbWUubWlsbGlzZWNvbmRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9pb2N0bC5zZWVrKGtleWZyYW1lLmZpbGVwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgLy8gV2lsbCBiZSByZXNvbHZlZCBpbiBfb25SZW11eGVyTWVkaWFTZWdtZW50QXJyaXZhbCgpXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1Jlc29sdmVTZWVrUG9pbnQgPSBrZXlmcmFtZS5taWxsaXNlY29uZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjcm9zcy1zZWdtZW50IHNlZWtpbmdcbiAgICAgICAgICAgIGxldCB0YXJnZXRTZWdtZW50SW5mbyA9IHRoaXMuX21lZGlhSW5mby5zZWdtZW50c1t0YXJnZXRTZWdtZW50SW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAodGFyZ2V0U2VnbWVudEluZm8gPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gdGFyZ2V0IHNlZ21lbnQgaGFzbid0IGJlZW4gbG9hZGVkLiBXZSBuZWVkIG1ldGFkYXRhIHRoZW4gc2VlayB0byBleHBlY3RlZCB0aW1lXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1NlZWtUaW1lID0gbWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVybmFsQWJvcnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW11eGVyLnNlZWsoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW11eGVyLmluc2VydERpc2NvbnRpbnVpdHkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkU2VnbWVudCh0YXJnZXRTZWdtZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIC8vIEhlcmUgd2Ugd2FpdCBmb3IgdGhlIG1ldGFkYXRhIGxvYWRlZCwgdGhlbiBzZWVrIHRvIGV4cGVjdGVkIHBvc2l0aW9uXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdGFyZ2V0IHNlZ21lbnQncyBtZXRhZGF0YSwgZGlyZWN0IHNlZWsgdG8gdGFyZ2V0IHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgbGV0IGtleWZyYW1lID0gdGFyZ2V0U2VnbWVudEluZm8uZ2V0TmVhcmVzdEtleWZyYW1lKG1pbGxpc2Vjb25kcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxBYm9ydCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbXV4ZXIuc2VlayhtaWxsaXNlY29uZHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbXV4ZXIuaW5zZXJ0RGlzY29udGludWl0eSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlbXV4ZXIucmVzZXRNZWRpYUluZm8oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZW11eGVyLnRpbWVzdGFtcEJhc2UgPSB0aGlzLl9tZWRpYURhdGFTb3VyY2Uuc2VnbWVudHNbdGFyZ2V0U2VnbWVudEluZGV4XS50aW1lc3RhbXBCYXNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRTZWdtZW50KHRhcmdldFNlZ21lbnRJbmRleCwga2V5ZnJhbWUuZmlsZXBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVzb2x2ZVNlZWtQb2ludCA9IGtleWZyYW1lLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRTZWdtZW50TWVkaWFJbmZvKHRhcmdldFNlZ21lbnRJbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lbmFibGVTdGF0aXN0aWNzUmVwb3J0ZXIoKTtcbiAgICB9XG5cbiAgICBfc2VhcmNoU2VnbWVudEluZGV4Q29udGFpbnMobWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGxldCBzZWdtZW50cyA9IHRoaXMuX21lZGlhRGF0YVNvdXJjZS5zZWdtZW50cztcbiAgICAgICAgbGV0IGlkeCA9IHNlZ21lbnRzLmxlbmd0aCAtIDE7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG1pbGxpc2Vjb25kcyA8IHNlZ21lbnRzW2ldLnRpbWVzdGFtcEJhc2UpIHtcbiAgICAgICAgICAgICAgICBpZHggPSBpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWR4O1xuICAgIH1cblxuICAgIF9vbkluaXRDaHVua0Fycml2YWwoZGF0YSwgYnl0ZVN0YXJ0KSB7XG4gICAgICAgIGxldCBwcm9iZURhdGEgPSBudWxsO1xuICAgICAgICBsZXQgY29uc3VtZWQgPSAwO1xuXG4gICAgICAgIGlmIChieXRlU3RhcnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBJT0NvbnRyb2xsZXIgc2Vla2VkIGltbWVkaWF0ZWx5IGFmdGVyIG9wZW5lZCwgYnl0ZVN0YXJ0ID4gMCBjYWxsYmFjayBtYXkgcmVjZWl2ZWRcbiAgICAgICAgICAgIHRoaXMuX2RlbXV4ZXIuYmluZERhdGFTb3VyY2UodGhpcy5faW9jdGwpO1xuICAgICAgICAgICAgdGhpcy5fZGVtdXhlci50aW1lc3RhbXBCYXNlID0gdGhpcy5fbWVkaWFEYXRhU291cmNlLnNlZ21lbnRzW3RoaXMuX2N1cnJlbnRTZWdtZW50SW5kZXhdLnRpbWVzdGFtcEJhc2U7XG5cbiAgICAgICAgICAgIGNvbnN1bWVkID0gdGhpcy5fZGVtdXhlci5wYXJzZUNodW5rcyhkYXRhLCBieXRlU3RhcnQpO1xuICAgICAgICB9IGVsc2UgaWYgKChwcm9iZURhdGEgPSBGTFZEZW11eGVyLnByb2JlKGRhdGEpKS5tYXRjaCkge1xuICAgICAgICAgICAgLy8gQWx3YXlzIGNyZWF0ZSBuZXcgRkxWRGVtdXhlclxuICAgICAgICAgICAgdGhpcy5fZGVtdXhlciA9IG5ldyBGTFZEZW11eGVyKHByb2JlRGF0YSwgdGhpcy5fY29uZmlnKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9yZW11eGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtdXhlciA9IG5ldyBNUDRSZW11eGVyKHRoaXMuX2NvbmZpZyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBtZHMgPSB0aGlzLl9tZWRpYURhdGFTb3VyY2U7XG4gICAgICAgICAgICBpZiAobWRzLmR1cmF0aW9uICE9IHVuZGVmaW5lZCAmJiAhaXNOYU4obWRzLmR1cmF0aW9uKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlbXV4ZXIub3ZlcnJpZGVkRHVyYXRpb24gPSBtZHMuZHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1kcy5oYXNBdWRpbyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVtdXhlci5vdmVycmlkZWRIYXNBdWRpbyA9IG1kcy5oYXNBdWRpbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWRzLmhhc1ZpZGVvID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZW11eGVyLm92ZXJyaWRlZEhhc1ZpZGVvID0gbWRzLmhhc1ZpZGVvO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9kZW11eGVyLnRpbWVzdGFtcEJhc2UgPSBtZHMuc2VnbWVudHNbdGhpcy5fY3VycmVudFNlZ21lbnRJbmRleF0udGltZXN0YW1wQmFzZTtcblxuICAgICAgICAgICAgdGhpcy5fZGVtdXhlci5vbkVycm9yID0gdGhpcy5fb25EZW11eEV4Y2VwdGlvbi5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fZGVtdXhlci5vbk1lZGlhSW5mbyA9IHRoaXMuX29uTWVkaWFJbmZvLmJpbmQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9kZW11eGVyLm9uTWV0YURhdGFBcnJpdmVkID0gdGhpcy5fb25NZXRhRGF0YUFycml2ZWQuYmluZCh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX2RlbXV4ZXIub25TY3JpcHREYXRhQXJyaXZlZCA9IHRoaXMuX29uU2NyaXB0RGF0YUFycml2ZWQuYmluZCh0aGlzKTtcblxuICAgICAgICAgICAgdGhpcy5fcmVtdXhlci5iaW5kRGF0YVNvdXJjZSh0aGlzLl9kZW11eGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgLmJpbmREYXRhU291cmNlKHRoaXMuX2lvY3RsXG4gICAgICAgICAgICApKTtcblxuICAgICAgICAgICAgdGhpcy5fcmVtdXhlci5vbkluaXRTZWdtZW50ID0gdGhpcy5fb25SZW11eGVySW5pdFNlZ21lbnRBcnJpdmFsLmJpbmQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9yZW11eGVyLm9uTWVkaWFTZWdtZW50ID0gdGhpcy5fb25SZW11eGVyTWVkaWFTZWdtZW50QXJyaXZhbC5iaW5kKHRoaXMpO1xuXG4gICAgICAgICAgICBjb25zdW1lZCA9IHRoaXMuX2RlbXV4ZXIucGFyc2VDaHVua3MoZGF0YSwgYnl0ZVN0YXJ0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByb2JlRGF0YSA9IG51bGw7XG4gICAgICAgICAgICBMb2cuZSh0aGlzLlRBRywgJ05vbi1GTFYsIFVuc3VwcG9ydGVkIG1lZGlhIHR5cGUhJyk7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcm5hbEFib3J0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5ERU1VWF9FUlJPUiwgRGVtdXhFcnJvcnMuRk9STUFUX1VOU1VQUE9SVEVELCAnTm9uLUZMViwgVW5zdXBwb3J0ZWQgbWVkaWEgdHlwZScpO1xuXG4gICAgICAgICAgICBjb25zdW1lZCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uc3VtZWQ7XG4gICAgfVxuXG4gICAgX29uTWVkaWFJbmZvKG1lZGlhSW5mbykge1xuICAgICAgICBpZiAodGhpcy5fbWVkaWFJbmZvID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFN0b3JlIGZpcnN0IHNlZ21lbnQncyBtZWRpYWluZm8gYXMgZ2xvYmFsIG1lZGlhSW5mb1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFJbmZvID0gT2JqZWN0LmFzc2lnbih7fSwgbWVkaWFJbmZvKTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhSW5mby5rZXlmcmFtZXNJbmRleCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8uc2VnbWVudHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhSW5mby5zZWdtZW50Q291bnQgPSB0aGlzLl9tZWRpYURhdGFTb3VyY2Uuc2VnbWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMuX21lZGlhSW5mbywgTWVkaWFJbmZvLnByb3RvdHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2VnbWVudEluZm8gPSBPYmplY3QuYXNzaWduKHt9LCBtZWRpYUluZm8pO1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc2VnbWVudEluZm8sIE1lZGlhSW5mby5wcm90b3R5cGUpO1xuICAgICAgICB0aGlzLl9tZWRpYUluZm8uc2VnbWVudHNbdGhpcy5fY3VycmVudFNlZ21lbnRJbmRleF0gPSBzZWdtZW50SW5mbztcblxuICAgICAgICAvLyBub3RpZnkgbWVkaWFJbmZvIHVwZGF0ZVxuICAgICAgICB0aGlzLl9yZXBvcnRTZWdtZW50TWVkaWFJbmZvKHRoaXMuX2N1cnJlbnRTZWdtZW50SW5kZXgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nU2Vla1RpbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IHRoaXMuX3BlbmRpbmdTZWVrVGltZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nU2Vla1RpbWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuc2Vlayh0YXJnZXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25NZXRhRGF0YUFycml2ZWQobWV0YWRhdGEpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFRyYW5zbXV4aW5nRXZlbnRzLk1FVEFEQVRBX0FSUklWRUQsIG1ldGFkYXRhKTtcbiAgICB9XG5cbiAgICBfb25TY3JpcHREYXRhQXJyaXZlZChkYXRhKSB7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5TQ1JJUFREQVRBX0FSUklWRUQsIGRhdGEpO1xuICAgIH1cblxuICAgIF9vbklPU2Vla2VkKCkge1xuICAgICAgICB0aGlzLl9yZW11eGVyLmluc2VydERpc2NvbnRpbnVpdHkoKTtcbiAgICB9XG5cbiAgICBfb25JT0NvbXBsZXRlKGV4dHJhRGF0YSkge1xuICAgICAgICBsZXQgc2VnbWVudEluZGV4ID0gZXh0cmFEYXRhO1xuICAgICAgICBsZXQgbmV4dFNlZ21lbnRJbmRleCA9IHNlZ21lbnRJbmRleCArIDE7XG5cbiAgICAgICAgaWYgKG5leHRTZWdtZW50SW5kZXggPCB0aGlzLl9tZWRpYURhdGFTb3VyY2Uuc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbEFib3J0KCk7XG4gICAgICAgICAgICB0aGlzLl9yZW11eGVyLmZsdXNoU3Rhc2hlZFNhbXBsZXMoKTtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRTZWdtZW50KG5leHRTZWdtZW50SW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcmVtdXhlci5mbHVzaFN0YXNoZWRTYW1wbGVzKCk7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuTE9BRElOR19DT01QTEVURSk7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlU3RhdGlzdGljc1JlcG9ydGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25JT1JlZGlyZWN0KHJlZGlyZWN0ZWRVUkwpIHtcbiAgICAgICAgbGV0IHNlZ21lbnRJbmRleCA9IHRoaXMuX2lvY3RsLmV4dHJhRGF0YTtcbiAgICAgICAgdGhpcy5fbWVkaWFEYXRhU291cmNlLnNlZ21lbnRzW3NlZ21lbnRJbmRleF0ucmVkaXJlY3RlZFVSTCA9IHJlZGlyZWN0ZWRVUkw7XG4gICAgfVxuXG4gICAgX29uSU9SZWNvdmVyZWRFYXJseUVvZigpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFRyYW5zbXV4aW5nRXZlbnRzLlJFQ09WRVJFRF9FQVJMWV9FT0YpO1xuICAgIH1cblxuICAgIF9vbklPRXhjZXB0aW9uKHR5cGUsIGluZm8pIHtcbiAgICAgICAgTG9nLmUodGhpcy5UQUcsIGBJT0V4Y2VwdGlvbjogdHlwZSA9ICR7dHlwZX0sIGNvZGUgPSAke2luZm8uY29kZX0sIG1zZyA9ICR7aW5mby5tc2d9YCk7XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5JT19FUlJPUiwgdHlwZSwgaW5mbyk7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVTdGF0aXN0aWNzUmVwb3J0ZXIoKTtcbiAgICB9XG5cbiAgICBfb25EZW11eEV4Y2VwdGlvbih0eXBlLCBpbmZvKSB7XG4gICAgICAgIExvZy5lKHRoaXMuVEFHLCBgRGVtdXhFeGNlcHRpb246IHR5cGUgPSAke3R5cGV9LCBpbmZvID0gJHtpbmZvfWApO1xuICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuREVNVVhfRVJST1IsIHR5cGUsIGluZm8pO1xuICAgIH1cblxuICAgIF9vblJlbXV4ZXJJbml0U2VnbWVudEFycml2YWwodHlwZSwgaW5pdFNlZ21lbnQpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFRyYW5zbXV4aW5nRXZlbnRzLklOSVRfU0VHTUVOVCwgdHlwZSwgaW5pdFNlZ21lbnQpO1xuICAgIH1cblxuICAgIF9vblJlbXV4ZXJNZWRpYVNlZ21lbnRBcnJpdmFsKHR5cGUsIG1lZGlhU2VnbWVudCkge1xuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1NlZWtUaW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIE1lZGlhIHNlZ21lbnRzIGFmdGVyIG5ldy1zZWdtZW50IGNyb3NzLXNlZWtpbmcgc2hvdWxkIGJlIGRyb3BwZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFRyYW5zbXV4aW5nRXZlbnRzLk1FRElBX1NFR01FTlQsIHR5cGUsIG1lZGlhU2VnbWVudCk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBwZW5kaW5nIHNlZWtQb2ludFxuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1Jlc29sdmVTZWVrUG9pbnQgIT0gbnVsbCAmJiB0eXBlID09PSAndmlkZW8nKSB7XG4gICAgICAgICAgICBsZXQgc3luY1BvaW50cyA9IG1lZGlhU2VnbWVudC5pbmZvLnN5bmNQb2ludHM7XG4gICAgICAgICAgICBsZXQgc2Vla3BvaW50ID0gdGhpcy5fcGVuZGluZ1Jlc29sdmVTZWVrUG9pbnQ7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVzb2x2ZVNlZWtQb2ludCA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIFNhZmFyaTogUGFzcyBQVFMgZm9yIHJlY29tbWVuZF9zZWVrcG9pbnRcbiAgICAgICAgICAgIGlmIChCcm93c2VyLnNhZmFyaSAmJiBzeW5jUG9pbnRzLmxlbmd0aCA+IDAgJiYgc3luY1BvaW50c1swXS5vcmlnaW5hbER0cyA9PT0gc2Vla3BvaW50KSB7XG4gICAgICAgICAgICAgICAgc2Vla3BvaW50ID0gc3luY1BvaW50c1swXS5wdHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlbHNlOiB1c2Ugb3JpZ2luYWwgRFRTIChrZXlmcmFtZS5taWxsaXNlY29uZHMpXG5cbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChUcmFuc211eGluZ0V2ZW50cy5SRUNPTU1FTkRfU0VFS1BPSU5ULCBzZWVrcG9pbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2VuYWJsZVN0YXRpc3RpY3NSZXBvcnRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlciA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0aXN0aWNzUmVwb3J0ZXIgPSBzZWxmLnNldEludGVydmFsKFxuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydFN0YXRpc3RpY3NJbmZvLmJpbmQodGhpcyksXG4gICAgICAgICAgICB0aGlzLl9jb25maWcuc3RhdGlzdGljc0luZm9SZXBvcnRJbnRlcnZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZGlzYWJsZVN0YXRpc3RpY3NSZXBvcnRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlcikge1xuICAgICAgICAgICAgc2VsZi5jbGVhckludGVydmFsKHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlcik7XG4gICAgICAgICAgICB0aGlzLl9zdGF0aXN0aWNzUmVwb3J0ZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3JlcG9ydFNlZ21lbnRNZWRpYUluZm8oc2VnbWVudEluZGV4KSB7XG4gICAgICAgIGxldCBzZWdtZW50SW5mbyA9IHRoaXMuX21lZGlhSW5mby5zZWdtZW50c1tzZWdtZW50SW5kZXhdO1xuICAgICAgICBsZXQgZXhwb3J0SW5mbyA9IE9iamVjdC5hc3NpZ24oe30sIHNlZ21lbnRJbmZvKTtcblxuICAgICAgICBleHBvcnRJbmZvLmR1cmF0aW9uID0gdGhpcy5fbWVkaWFJbmZvLmR1cmF0aW9uO1xuICAgICAgICBleHBvcnRJbmZvLnNlZ21lbnRDb3VudCA9IHRoaXMuX21lZGlhSW5mby5zZWdtZW50Q291bnQ7XG4gICAgICAgIGRlbGV0ZSBleHBvcnRJbmZvLnNlZ21lbnRzO1xuICAgICAgICBkZWxldGUgZXhwb3J0SW5mby5rZXlmcmFtZXNJbmRleDtcblxuICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuTUVESUFfSU5GTywgZXhwb3J0SW5mbyk7XG4gICAgfVxuXG4gICAgX3JlcG9ydFN0YXRpc3RpY3NJbmZvKCkge1xuICAgICAgICBsZXQgaW5mbyA9IHt9O1xuXG4gICAgICAgIGluZm8udXJsID0gdGhpcy5faW9jdGwuY3VycmVudFVSTDtcbiAgICAgICAgaW5mby5oYXNSZWRpcmVjdCA9IHRoaXMuX2lvY3RsLmhhc1JlZGlyZWN0O1xuICAgICAgICBpZiAoaW5mby5oYXNSZWRpcmVjdCkge1xuICAgICAgICAgICAgaW5mby5yZWRpcmVjdGVkVVJMID0gdGhpcy5faW9jdGwuY3VycmVudFJlZGlyZWN0ZWRVUkw7XG4gICAgICAgIH1cblxuICAgICAgICBpbmZvLnNwZWVkID0gdGhpcy5faW9jdGwuY3VycmVudFNwZWVkO1xuICAgICAgICBpbmZvLmxvYWRlclR5cGUgPSB0aGlzLl9pb2N0bC5sb2FkZXJUeXBlO1xuICAgICAgICBpbmZvLmN1cnJlbnRTZWdtZW50SW5kZXggPSB0aGlzLl9jdXJyZW50U2VnbWVudEluZGV4O1xuICAgICAgICBpbmZvLnRvdGFsU2VnbWVudENvdW50ID0gdGhpcy5fbWVkaWFEYXRhU291cmNlLnNlZ21lbnRzLmxlbmd0aDtcblxuICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoVHJhbnNtdXhpbmdFdmVudHMuU1RBVElTVElDU19JTkZPLCBpbmZvKTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNtdXhpbmdDb250cm9sbGVyOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jb25zdCBUcmFuc211eGluZ0V2ZW50cyA9IHtcbiAgICBJT19FUlJPUjogJ2lvX2Vycm9yJyxcbiAgICBERU1VWF9FUlJPUjogJ2RlbXV4X2Vycm9yJyxcbiAgICBJTklUX1NFR01FTlQ6ICdpbml0X3NlZ21lbnQnLFxuICAgIE1FRElBX1NFR01FTlQ6ICdtZWRpYV9zZWdtZW50JyxcbiAgICBMT0FESU5HX0NPTVBMRVRFOiAnbG9hZGluZ19jb21wbGV0ZScsXG4gICAgUkVDT1ZFUkVEX0VBUkxZX0VPRjogJ3JlY292ZXJlZF9lYXJseV9lb2YnLFxuICAgIE1FRElBX0lORk86ICdtZWRpYV9pbmZvJyxcbiAgICBNRVRBREFUQV9BUlJJVkVEOiAnbWV0YWRhdGFfYXJyaXZlZCcsXG4gICAgU0NSSVBUREFUQV9BUlJJVkVEOiAnc2NyaXB0ZGF0YV9hcnJpdmVkJyxcbiAgICBTVEFUSVNUSUNTX0lORk86ICdzdGF0aXN0aWNzX2luZm8nLFxuICAgIFJFQ09NTUVORF9TRUVLUE9JTlQ6ICdyZWNvbW1lbmRfc2Vla3BvaW50J1xufTtcblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNtdXhpbmdFdmVudHM7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBMb2cgZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCBMb2dnaW5nQ29udHJvbCBmcm9tICcuLi91dGlscy9sb2dnaW5nLWNvbnRyb2wuanMnO1xuaW1wb3J0IFBvbHlmaWxsIGZyb20gJy4uL3V0aWxzL3BvbHlmaWxsLmpzJztcbmltcG9ydCBUcmFuc211eGluZ0NvbnRyb2xsZXIgZnJvbSAnLi90cmFuc211eGluZy1jb250cm9sbGVyLmpzJztcbmltcG9ydCBUcmFuc211eGluZ0V2ZW50cyBmcm9tICcuL3RyYW5zbXV4aW5nLWV2ZW50cy5qcyc7XG5cbi8qIHBvc3QgbWVzc2FnZSB0byB3b3JrZXI6XG4gICBkYXRhOiB7XG4gICAgICAgY21kOiBzdHJpbmdcbiAgICAgICBwYXJhbTogYW55XG4gICB9XG5cbiAgIHJlY2VpdmUgbWVzc2FnZSBmcm9tIHdvcmtlcjpcbiAgIGRhdGE6IHtcbiAgICAgICBtc2c6IHN0cmluZyxcbiAgICAgICBkYXRhOiBhbnlcbiAgIH1cbiAqL1xuXG5sZXQgVHJhbnNtdXhpbmdXb3JrZXIgPSBmdW5jdGlvbiAoc2VsZikge1xuXG4gICAgbGV0IFRBRyA9ICdUcmFuc211eGluZ1dvcmtlcic7XG4gICAgbGV0IGNvbnRyb2xsZXIgPSBudWxsO1xuICAgIGxldCBsb2djYXRMaXN0ZW5lciA9IG9uTG9nY2F0Q2FsbGJhY2suYmluZCh0aGlzKTtcblxuICAgIFBvbHlmaWxsLmluc3RhbGwoKTtcblxuICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHN3aXRjaCAoZS5kYXRhLmNtZCkge1xuICAgICAgICAgICAgY2FzZSAnaW5pdCc6XG4gICAgICAgICAgICAgICAgY29udHJvbGxlciA9IG5ldyBUcmFuc211eGluZ0NvbnRyb2xsZXIoZS5kYXRhLnBhcmFtWzBdLCBlLmRhdGEucGFyYW1bMV0pO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub24oVHJhbnNtdXhpbmdFdmVudHMuSU9fRVJST1IsIG9uSU9FcnJvci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLkRFTVVYX0VSUk9SLCBvbkRlbXV4RXJyb3IuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5vbihUcmFuc211eGluZ0V2ZW50cy5JTklUX1NFR01FTlQsIG9uSW5pdFNlZ21lbnQuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5vbihUcmFuc211eGluZ0V2ZW50cy5NRURJQV9TRUdNRU5ULCBvbk1lZGlhU2VnbWVudC5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLkxPQURJTkdfQ09NUExFVEUsIG9uTG9hZGluZ0NvbXBsZXRlLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub24oVHJhbnNtdXhpbmdFdmVudHMuUkVDT1ZFUkVEX0VBUkxZX0VPRiwgb25SZWNvdmVyZWRFYXJseUVvZi5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLk1FRElBX0lORk8sIG9uTWVkaWFJbmZvLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub24oVHJhbnNtdXhpbmdFdmVudHMuTUVUQURBVEFfQVJSSVZFRCwgb25NZXRhRGF0YUFycml2ZWQuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5vbihUcmFuc211eGluZ0V2ZW50cy5TQ1JJUFREQVRBX0FSUklWRUQsIG9uU2NyaXB0RGF0YUFycml2ZWQuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5vbihUcmFuc211eGluZ0V2ZW50cy5TVEFUSVNUSUNTX0lORk8sIG9uU3RhdGlzdGljc0luZm8uYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5vbihUcmFuc211eGluZ0V2ZW50cy5SRUNPTU1FTkRfU0VFS1BPSU5ULCBvblJlY29tbWVuZFNlZWtwb2ludC5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Rlc3Ryb3knOlxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7bXNnOiAnZGVzdHJveWVkJ30pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuc3RhcnQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3N0b3AnOlxuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuc3RvcCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2Vlayc6XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5zZWVrKGUuZGF0YS5wYXJhbSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdwYXVzZSc6XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncmVzdW1lJzpcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnJlc3VtZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbG9nZ2luZ19jb25maWcnOiB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZyA9IGUuZGF0YS5wYXJhbTtcbiAgICAgICAgICAgICAgICBMb2dnaW5nQ29udHJvbC5hcHBseUNvbmZpZyhjb25maWcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5lbmFibGVDYWxsYmFjayA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBMb2dnaW5nQ29udHJvbC5hZGRMb2dMaXN0ZW5lcihsb2djYXRMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2luZ0NvbnRyb2wucmVtb3ZlTG9nTGlzdGVuZXIobG9nY2F0TGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gb25Jbml0U2VnbWVudCh0eXBlLCBpbml0U2VnbWVudCkge1xuICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgbXNnOiBUcmFuc211eGluZ0V2ZW50cy5JTklUX1NFR01FTlQsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICBkYXRhOiBpbml0U2VnbWVudFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKG9iaiwgW2luaXRTZWdtZW50LmRhdGFdKTsgIC8vIGRhdGE6IEFycmF5QnVmZmVyXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25NZWRpYVNlZ21lbnQodHlwZSwgbWVkaWFTZWdtZW50KSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBtc2c6IFRyYW5zbXV4aW5nRXZlbnRzLk1FRElBX1NFR01FTlQsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICBkYXRhOiBtZWRpYVNlZ21lbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShvYmosIFttZWRpYVNlZ21lbnQuZGF0YV0pOyAgLy8gZGF0YTogQXJyYXlCdWZmZXJcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkxvYWRpbmdDb21wbGV0ZSgpIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgIG1zZzogVHJhbnNtdXhpbmdFdmVudHMuTE9BRElOR19DT01QTEVURVxuICAgICAgICB9O1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKG9iaik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25SZWNvdmVyZWRFYXJseUVvZigpIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgIG1zZzogVHJhbnNtdXhpbmdFdmVudHMuUkVDT1ZFUkVEX0VBUkxZX0VPRlxuICAgICAgICB9O1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKG9iaik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25NZWRpYUluZm8obWVkaWFJbmZvKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBtc2c6IFRyYW5zbXV4aW5nRXZlbnRzLk1FRElBX0lORk8sXG4gICAgICAgICAgICBkYXRhOiBtZWRpYUluZm9cbiAgICAgICAgfTtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShvYmopO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTWV0YURhdGFBcnJpdmVkKG1ldGFkYXRhKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBtc2c6IFRyYW5zbXV4aW5nRXZlbnRzLk1FVEFEQVRBX0FSUklWRUQsXG4gICAgICAgICAgICBkYXRhOiBtZXRhZGF0YVxuICAgICAgICB9O1xuICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKG9iaik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25TY3JpcHREYXRhQXJyaXZlZChkYXRhKSB7XG4gICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBtc2c6IFRyYW5zbXV4aW5nRXZlbnRzLlNDUklQVERBVEFfQVJSSVZFRCxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgfTtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShvYmopO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uU3RhdGlzdGljc0luZm8oc3RhdEluZm8pIHtcbiAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgIG1zZzogVHJhbnNtdXhpbmdFdmVudHMuU1RBVElTVElDU19JTkZPLFxuICAgICAgICAgICAgZGF0YTogc3RhdEluZm9cbiAgICAgICAgfTtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShvYmopO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uSU9FcnJvcih0eXBlLCBpbmZvKSB7XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgbXNnOiBUcmFuc211eGluZ0V2ZW50cy5JT19FUlJPUixcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIGluZm86IGluZm9cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25EZW11eEVycm9yKHR5cGUsIGluZm8pIHtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBtc2c6IFRyYW5zbXV4aW5nRXZlbnRzLkRFTVVYX0VSUk9SLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgaW5mbzogaW5mb1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblJlY29tbWVuZFNlZWtwb2ludChtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBtc2c6IFRyYW5zbXV4aW5nRXZlbnRzLlJFQ09NTUVORF9TRUVLUE9JTlQsXG4gICAgICAgICAgICBkYXRhOiBtaWxsaXNlY29uZHNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Mb2djYXRDYWxsYmFjayh0eXBlLCBzdHIpIHtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBtc2c6ICdsb2djYXRfY2FsbGJhY2snLFxuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgbG9nY2F0OiBzdHJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG59O1xuXG5leHBvcnQgZGVmYXVsdCBUcmFuc211eGluZ1dvcmtlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IExvZyBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IGRlY29kZVVURjggZnJvbSAnLi4vdXRpbHMvdXRmOC1jb252LmpzJztcbmltcG9ydCB7SWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9leGNlcHRpb24uanMnO1xuXG5sZXQgbGUgPSAoZnVuY3Rpb24gKCkge1xuICAgIGxldCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoMik7XG4gICAgKG5ldyBEYXRhVmlldyhidWYpKS5zZXRJbnQxNigwLCAyNTYsIHRydWUpOyAgLy8gbGl0dGxlLWVuZGlhbiB3cml0ZVxuICAgIHJldHVybiAobmV3IEludDE2QXJyYXkoYnVmKSlbMF0gPT09IDI1NjsgIC8vIHBsYXRmb3JtLXNwZWMgcmVhZCwgaWYgZXF1YWwgdGhlbiBMRVxufSkoKTtcblxuY2xhc3MgQU1GIHtcblxuICAgIHN0YXRpYyBwYXJzZVNjcmlwdERhdGEoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKSB7XG4gICAgICAgIGxldCBkYXRhID0ge307XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBuYW1lID0gQU1GLnBhcnNlVmFsdWUoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKTtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IEFNRi5wYXJzZVZhbHVlKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0ICsgbmFtZS5zaXplLCBkYXRhU2l6ZSAtIG5hbWUuc2l6ZSk7XG5cbiAgICAgICAgICAgIGRhdGFbbmFtZS5kYXRhXSA9IHZhbHVlLmRhdGE7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy5lKCdBTUYnLCBlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlT2JqZWN0KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSkge1xuICAgICAgICBpZiAoZGF0YVNpemUgPCAzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCdEYXRhIG5vdCBlbm91Z2ggd2hlbiBwYXJzZSBTY3JpcHREYXRhT2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5hbWUgPSBBTUYucGFyc2VTdHJpbmcoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKTtcbiAgICAgICAgbGV0IHZhbHVlID0gQU1GLnBhcnNlVmFsdWUoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQgKyBuYW1lLnNpemUsIGRhdGFTaXplIC0gbmFtZS5zaXplKTtcbiAgICAgICAgbGV0IGlzT2JqZWN0RW5kID0gdmFsdWUub2JqZWN0RW5kO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogbmFtZS5kYXRhLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5kYXRhXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2l6ZTogbmFtZS5zaXplICsgdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgIG9iamVjdEVuZDogaXNPYmplY3RFbmRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2VWYXJpYWJsZShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpIHtcbiAgICAgICAgcmV0dXJuIEFNRi5wYXJzZU9iamVjdChhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZVN0cmluZyhhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpIHtcbiAgICAgICAgaWYgKGRhdGFTaXplIDwgMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbignRGF0YSBub3QgZW5vdWdoIHdoZW4gcGFyc2UgU3RyaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHYgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKTtcbiAgICAgICAgbGV0IGxlbmd0aCA9IHYuZ2V0VWludDE2KDAsICFsZSk7XG5cbiAgICAgICAgbGV0IHN0cjtcbiAgICAgICAgaWYgKGxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN0ciA9IGRlY29kZVVURjgobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQgKyAyLCBsZW5ndGgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHN0cixcbiAgICAgICAgICAgIHNpemU6IDIgKyBsZW5ndGhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2VMb25nU3RyaW5nKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSkge1xuICAgICAgICBpZiAoZGF0YVNpemUgPCA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCdEYXRhIG5vdCBlbm91Z2ggd2hlbiBwYXJzZSBMb25nU3RyaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHYgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKTtcbiAgICAgICAgbGV0IGxlbmd0aCA9IHYuZ2V0VWludDMyKDAsICFsZSk7XG5cbiAgICAgICAgbGV0IHN0cjtcbiAgICAgICAgaWYgKGxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN0ciA9IGRlY29kZVVURjgobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQgKyA0LCBsZW5ndGgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ciA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHN0cixcbiAgICAgICAgICAgIHNpemU6IDQgKyBsZW5ndGhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2VEYXRlKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSkge1xuICAgICAgICBpZiAoZGF0YVNpemUgPCAxMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbignRGF0YSBzaXplIGludmFsaWQgd2hlbiBwYXJzZSBEYXRlJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHYgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKTtcbiAgICAgICAgbGV0IHRpbWVzdGFtcCA9IHYuZ2V0RmxvYXQ2NCgwLCAhbGUpO1xuICAgICAgICBsZXQgbG9jYWxUaW1lT2Zmc2V0ID0gdi5nZXRJbnQxNig4LCAhbGUpO1xuICAgICAgICB0aW1lc3RhbXAgKz0gbG9jYWxUaW1lT2Zmc2V0ICogNjAgKiAxMDAwOyAgLy8gZ2V0IFVUQyB0aW1lXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IG5ldyBEYXRlKHRpbWVzdGFtcCksXG4gICAgICAgICAgICBzaXplOiA4ICsgMlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZVZhbHVlKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSkge1xuICAgICAgICBpZiAoZGF0YVNpemUgPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCdEYXRhIG5vdCBlbm91Z2ggd2hlbiBwYXJzZSBWYWx1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHYgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKTtcblxuICAgICAgICBsZXQgb2Zmc2V0ID0gMTtcbiAgICAgICAgbGV0IHR5cGUgPSB2LmdldFVpbnQ4KDApO1xuICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgIGxldCBvYmplY3RFbmQgPSBmYWxzZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiAgLy8gTnVtYmVyKERvdWJsZSkgdHlwZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHYuZ2V0RmxvYXQ2NCgxLCAhbGUpO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gODtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOiB7ICAvLyBCb29sZWFuIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IGIgPSB2LmdldFVpbnQ4KDEpO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGIgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAyOiB7ICAvLyBTdHJpbmcgdHlwZVxuICAgICAgICAgICAgICAgICAgICBsZXQgYW1mc3RyID0gQU1GLnBhcnNlU3RyaW5nKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0ICsgMSwgZGF0YVNpemUgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhbWZzdHIuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGFtZnN0ci5zaXplO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAzOiB7IC8vIE9iamVjdChzKSB0eXBlXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge307XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXJtaW5hbCA9IDA7ICAvLyB3b3JrYXJvdW5kIGZvciBtYWxmb3JtZWQgT2JqZWN0cyB3aGljaCBoYXMgbWlzc2luZyBTY3JpcHREYXRhT2JqZWN0RW5kXG4gICAgICAgICAgICAgICAgICAgIGlmICgodi5nZXRVaW50MzIoZGF0YVNpemUgLSA0LCAhbGUpICYgMHgwMEZGRkZGRikgPT09IDkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsID0gMztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0IDwgZGF0YVNpemUgLSA0KSB7ICAvLyA0ID09PSB0eXBlKFVJOCkgKyBTY3JpcHREYXRhT2JqZWN0RW5kKFVJMjQpXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYW1mb2JqID0gQU1GLnBhcnNlT2JqZWN0KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0ICsgb2Zmc2V0LCBkYXRhU2l6ZSAtIG9mZnNldCAtIHRlcm1pbmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbWZvYmoub2JqZWN0RW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVbYW1mb2JqLmRhdGEubmFtZV0gPSBhbWZvYmouZGF0YS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBhbWZvYmouc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDw9IGRhdGFTaXplIC0gMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtlciA9IHYuZ2V0VWludDMyKG9mZnNldCAtIDEsICFsZSkgJiAweDAwRkZGRkZGO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmtlciA9PT0gOSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIDg6IHsgLy8gRUNNQSBhcnJheSB0eXBlIChNaXhlZCBhcnJheSlcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7ICAvLyBFQ01BQXJyYXlMZW5ndGgoVUkzMilcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRlcm1pbmFsID0gMDsgIC8vIHdvcmthcm91bmQgZm9yIG1hbGZvcm1lZCBNaXhlZEFycmF5cyB3aGljaCBoYXMgbWlzc2luZyBTY3JpcHREYXRhT2JqZWN0RW5kXG4gICAgICAgICAgICAgICAgICAgIGlmICgodi5nZXRVaW50MzIoZGF0YVNpemUgLSA0LCAhbGUpICYgMHgwMEZGRkZGRikgPT09IDkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsID0gMztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0IDwgZGF0YVNpemUgLSA4KSB7ICAvLyA4ID09PSB0eXBlKFVJOCkgKyBFQ01BQXJyYXlMZW5ndGgoVUkzMikgKyBTY3JpcHREYXRhVmFyaWFibGVFbmQoVUkyNClcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbWZ2YXIgPSBBTUYucGFyc2VWYXJpYWJsZShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIG9mZnNldCwgZGF0YVNpemUgLSBvZmZzZXQgLSB0ZXJtaW5hbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW1mdmFyLm9iamVjdEVuZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW2FtZnZhci5kYXRhLm5hbWVdID0gYW1mdmFyLmRhdGEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYW1mdmFyLnNpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA8PSBkYXRhU2l6ZSAtIDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXJrZXIgPSB2LmdldFVpbnQzMihvZmZzZXQgLSAxLCAhbGUpICYgMHgwMEZGRkZGRjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJrZXIgPT09IDkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSA5OiAgLy8gU2NyaXB0RGF0YU9iamVjdEVuZFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0RW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDogeyAgLy8gU3RyaWN0IGFycmF5IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgLy8gU2NyaXB0RGF0YVZhbHVlW25dLiBOT1RFOiBhY2NvcmRpbmcgdG8gdmlkZW9fZmlsZV9mb3JtYXRfc3BlY192MTBfMS5wZGZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0cmljdEFycmF5TGVuZ3RoID0gdi5nZXRVaW50MzIoMSwgIWxlKTtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyaWN0QXJyYXlMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbCA9IEFNRi5wYXJzZVZhbHVlKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0ICsgb2Zmc2V0LCBkYXRhU2l6ZSAtIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5wdXNoKHZhbC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSB2YWwuc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAxMTogeyAgLy8gRGF0ZSB0eXBlXG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRlID0gQU1GLnBhcnNlRGF0ZShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIDEsIGRhdGFTaXplIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZGF0ZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gZGF0ZS5zaXplO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAxMjogeyAgLy8gTG9uZyBzdHJpbmcgdHlwZVxuICAgICAgICAgICAgICAgICAgICBsZXQgYW1mTG9uZ1N0ciA9IEFNRi5wYXJzZVN0cmluZyhhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIDEsIGRhdGFTaXplIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYW1mTG9uZ1N0ci5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYW1mTG9uZ1N0ci5zaXplO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGFuZCBza2lwXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGRhdGFTaXplO1xuICAgICAgICAgICAgICAgICAgICBMb2cudygnQU1GJywgJ1Vuc3VwcG9ydGVkIEFNRiB2YWx1ZSB0eXBlICcgKyB0eXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgTG9nLmUoJ0FNRicsIGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogdmFsdWUsXG4gICAgICAgICAgICBzaXplOiBvZmZzZXQsXG4gICAgICAgICAgICBvYmplY3RFbmQ6IG9iamVjdEVuZFxuICAgICAgICB9O1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBBTUY7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IERlbXV4RXJyb3JzID0ge1xuICAgIE9LOiAnT0snLFxuICAgIEZPUk1BVF9FUlJPUjogJ0Zvcm1hdEVycm9yJyxcbiAgICBGT1JNQVRfVU5TVVBQT1JURUQ6ICdGb3JtYXRVbnN1cHBvcnRlZCcsXG4gICAgQ09ERUNfVU5TVVBQT1JURUQ6ICdDb2RlY1Vuc3VwcG9ydGVkJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRGVtdXhFcnJvcnM7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7SWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2V4Y2VwdGlvbi5qcyc7XG5cbi8vIEV4cG9uZW50aWFsLUdvbG9tYiBidWZmZXIgZGVjb2RlclxuY2xhc3MgRXhwR29sb21iIHtcblxuICAgIGNvbnN0cnVjdG9yKHVpbnQ4YXJyYXkpIHtcbiAgICAgICAgdGhpcy5UQUcgPSAnRXhwR29sb21iJztcblxuICAgICAgICB0aGlzLl9idWZmZXIgPSB1aW50OGFycmF5O1xuICAgICAgICB0aGlzLl9idWZmZXJfaW5kZXggPSAwO1xuICAgICAgICB0aGlzLl90b3RhbF9ieXRlcyA9IHVpbnQ4YXJyYXkuYnl0ZUxlbmd0aDtcbiAgICAgICAgdGhpcy5fdG90YWxfYml0cyA9IHVpbnQ4YXJyYXkuYnl0ZUxlbmd0aCAqIDg7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRfd29yZCA9IDA7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRfd29yZF9iaXRzX2xlZnQgPSAwO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX2J1ZmZlciA9IG51bGw7XG4gICAgfVxuXG4gICAgX2ZpbGxDdXJyZW50V29yZCgpIHtcbiAgICAgICAgbGV0IGJ1ZmZlcl9ieXRlc19sZWZ0ID0gdGhpcy5fdG90YWxfYnl0ZXMgLSB0aGlzLl9idWZmZXJfaW5kZXg7XG4gICAgICAgIGlmIChidWZmZXJfYnl0ZXNfbGVmdCA8PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbignRXhwR29sb21iOiBfZmlsbEN1cnJlbnRXb3JkKCkgYnV0IG5vIGJ5dGVzIGF2YWlsYWJsZScpO1xuXG4gICAgICAgIGxldCBieXRlc19yZWFkID0gTWF0aC5taW4oNCwgYnVmZmVyX2J5dGVzX2xlZnQpO1xuICAgICAgICBsZXQgd29yZCA9IG5ldyBVaW50OEFycmF5KDQpO1xuICAgICAgICB3b3JkLnNldCh0aGlzLl9idWZmZXIuc3ViYXJyYXkodGhpcy5fYnVmZmVyX2luZGV4LCB0aGlzLl9idWZmZXJfaW5kZXggKyBieXRlc19yZWFkKSk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRfd29yZCA9IG5ldyBEYXRhVmlldyh3b3JkLmJ1ZmZlcikuZ2V0VWludDMyKDAsIGZhbHNlKTtcblxuICAgICAgICB0aGlzLl9idWZmZXJfaW5kZXggKz0gYnl0ZXNfcmVhZDtcbiAgICAgICAgdGhpcy5fY3VycmVudF93b3JkX2JpdHNfbGVmdCA9IGJ5dGVzX3JlYWQgKiA4O1xuICAgIH1cblxuICAgIHJlYWRCaXRzKGJpdHMpIHtcbiAgICAgICAgaWYgKGJpdHMgPiAzMilcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0V4cEdvbG9tYjogcmVhZEJpdHMoKSBiaXRzIGV4Y2VlZGVkIG1heCAzMmJpdHMhJyk7XG5cbiAgICAgICAgaWYgKGJpdHMgPD0gdGhpcy5fY3VycmVudF93b3JkX2JpdHNfbGVmdCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2N1cnJlbnRfd29yZCA+Pj4gKDMyIC0gYml0cyk7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50X3dvcmQgPDw9IGJpdHM7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50X3dvcmRfYml0c19sZWZ0IC09IGJpdHM7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX2N1cnJlbnRfd29yZF9iaXRzX2xlZnQgPyB0aGlzLl9jdXJyZW50X3dvcmQgOiAwO1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgPj4+ICgzMiAtIHRoaXMuX2N1cnJlbnRfd29yZF9iaXRzX2xlZnQpO1xuICAgICAgICBsZXQgYml0c19uZWVkX2xlZnQgPSBiaXRzIC0gdGhpcy5fY3VycmVudF93b3JkX2JpdHNfbGVmdDtcblxuICAgICAgICB0aGlzLl9maWxsQ3VycmVudFdvcmQoKTtcbiAgICAgICAgbGV0IGJpdHNfcmVhZF9uZXh0ID0gTWF0aC5taW4oYml0c19uZWVkX2xlZnQsIHRoaXMuX2N1cnJlbnRfd29yZF9iaXRzX2xlZnQpO1xuXG4gICAgICAgIGxldCByZXN1bHQyID0gdGhpcy5fY3VycmVudF93b3JkID4+PiAoMzIgLSBiaXRzX3JlYWRfbmV4dCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRfd29yZCA8PD0gYml0c19yZWFkX25leHQ7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRfd29yZF9iaXRzX2xlZnQgLT0gYml0c19yZWFkX25leHQ7XG5cbiAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCBiaXRzX3JlYWRfbmV4dCkgfCByZXN1bHQyO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJlYWRCb29sKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkQml0cygxKSA9PT0gMTtcbiAgICB9XG5cbiAgICByZWFkQnl0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEJpdHMoOCk7XG4gICAgfVxuXG4gICAgX3NraXBMZWFkaW5nWmVybygpIHtcbiAgICAgICAgbGV0IHplcm9fY291bnQ7XG4gICAgICAgIGZvciAoemVyb19jb3VudCA9IDA7IHplcm9fY291bnQgPCB0aGlzLl9jdXJyZW50X3dvcmRfYml0c19sZWZ0OyB6ZXJvX2NvdW50KyspIHtcbiAgICAgICAgICAgIGlmICgwICE9PSAodGhpcy5fY3VycmVudF93b3JkICYgKDB4ODAwMDAwMDAgPj4+IHplcm9fY291bnQpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRfd29yZCA8PD0gemVyb19jb3VudDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50X3dvcmRfYml0c19sZWZ0IC09IHplcm9fY291bnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHplcm9fY291bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZmlsbEN1cnJlbnRXb3JkKCk7XG4gICAgICAgIHJldHVybiB6ZXJvX2NvdW50ICsgdGhpcy5fc2tpcExlYWRpbmdaZXJvKCk7XG4gICAgfVxuXG4gICAgcmVhZFVFRygpIHsgIC8vIHVuc2lnbmVkIGV4cG9uZW50aWFsIGdvbG9tYlxuICAgICAgICBsZXQgbGVhZGluZ196ZXJvcyA9IHRoaXMuX3NraXBMZWFkaW5nWmVybygpO1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkQml0cyhsZWFkaW5nX3plcm9zICsgMSkgLSAxO1xuICAgIH1cblxuICAgIHJlYWRTRUcoKSB7ICAvLyBzaWduZWQgZXhwb25lbnRpYWwgZ29sb21iXG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucmVhZFVFRygpO1xuICAgICAgICBpZiAodmFsdWUgJiAweDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gKHZhbHVlICsgMSkgPj4+IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gLTEgKiAodmFsdWUgPj4+IDEpO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEV4cEdvbG9tYjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IExvZyBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IEFNRiBmcm9tICcuL2FtZi1wYXJzZXIuanMnO1xuaW1wb3J0IFNQU1BhcnNlciBmcm9tICcuL3Nwcy1wYXJzZXIuanMnO1xuaW1wb3J0IERlbXV4RXJyb3JzIGZyb20gJy4vZGVtdXgtZXJyb3JzLmpzJztcbmltcG9ydCBNZWRpYUluZm8gZnJvbSAnLi4vY29yZS9tZWRpYS1pbmZvLmpzJztcbmltcG9ydCB7SWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9leGNlcHRpb24uanMnO1xuXG5mdW5jdGlvbiBTd2FwMTYoc3JjKSB7XG4gICAgcmV0dXJuICgoKHNyYyA+Pj4gOCkgJiAweEZGKSB8XG4gICAgICAgICAgICAoKHNyYyAmIDB4RkYpIDw8IDgpKTtcbn1cblxuZnVuY3Rpb24gU3dhcDMyKHNyYykge1xuICAgIHJldHVybiAoKChzcmMgJiAweEZGMDAwMDAwKSA+Pj4gMjQpIHxcbiAgICAgICAgICAgICgoc3JjICYgMHgwMEZGMDAwMCkgPj4+IDgpICB8XG4gICAgICAgICAgICAoKHNyYyAmIDB4MDAwMEZGMDApIDw8IDgpICAgfFxuICAgICAgICAgICAgKChzcmMgJiAweDAwMDAwMEZGKSA8PCAyNCkpO1xufVxuXG5mdW5jdGlvbiBSZWFkQmlnMzIoYXJyYXksIGluZGV4KSB7XG4gICAgcmV0dXJuICgoYXJyYXlbaW5kZXhdIDw8IDI0KSAgICAgfFxuICAgICAgICAgICAgKGFycmF5W2luZGV4ICsgMV0gPDwgMTYpIHxcbiAgICAgICAgICAgIChhcnJheVtpbmRleCArIDJdIDw8IDgpICB8XG4gICAgICAgICAgICAoYXJyYXlbaW5kZXggKyAzXSkpO1xufVxuXG5cbmNsYXNzIEZMVkRlbXV4ZXIge1xuXG4gICAgY29uc3RydWN0b3IocHJvYmVEYXRhLCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5UQUcgPSAnRkxWRGVtdXhlcic7XG5cbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuXG4gICAgICAgIHRoaXMuX29uRXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbk1lZGlhSW5mbyA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uTWV0YURhdGFBcnJpdmVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25TY3JpcHREYXRhQXJyaXZlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uVHJhY2tNZXRhZGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uRGF0YUF2YWlsYWJsZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fZGF0YU9mZnNldCA9IHByb2JlRGF0YS5kYXRhT2Zmc2V0O1xuICAgICAgICB0aGlzLl9maXJzdFBhcnNlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2ggPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9oYXNBdWRpbyA9IHByb2JlRGF0YS5oYXNBdWRpb1RyYWNrO1xuICAgICAgICB0aGlzLl9oYXNWaWRlbyA9IHByb2JlRGF0YS5oYXNWaWRlb1RyYWNrO1xuXG4gICAgICAgIHRoaXMuX2hhc0F1ZGlvRmxhZ092ZXJyaWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9oYXNWaWRlb0ZsYWdPdmVycmlkZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9hdWRpb0luaXRpYWxNZXRhZGF0YURpc3BhdGNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdmlkZW9Jbml0aWFsTWV0YWRhdGFEaXNwYXRjaGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fbWVkaWFJbmZvID0gbmV3IE1lZGlhSW5mbygpO1xuICAgICAgICB0aGlzLl9tZWRpYUluZm8uaGFzQXVkaW8gPSB0aGlzLl9oYXNBdWRpbztcbiAgICAgICAgdGhpcy5fbWVkaWFJbmZvLmhhc1ZpZGVvID0gdGhpcy5faGFzVmlkZW87XG4gICAgICAgIHRoaXMuX21ldGFkYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYXVkaW9NZXRhZGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ZpZGVvTWV0YWRhdGEgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX25hbHVMZW5ndGhTaXplID0gNDtcbiAgICAgICAgdGhpcy5fdGltZXN0YW1wQmFzZSA9IDA7ICAvLyBpbnQzMiwgaW4gbWlsbGlzZWNvbmRzXG4gICAgICAgIHRoaXMuX3RpbWVzY2FsZSA9IDEwMDA7XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uID0gMDsgIC8vIGludDMyLCBpbiBtaWxsaXNlY29uZHNcbiAgICAgICAgdGhpcy5fZHVyYXRpb25PdmVycmlkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcmVmZXJlbmNlRnJhbWVSYXRlID0ge1xuICAgICAgICAgICAgZml4ZWQ6IHRydWUsXG4gICAgICAgICAgICBmcHM6IDIzLjk3NixcbiAgICAgICAgICAgIGZwc19udW06IDIzOTc2LFxuICAgICAgICAgICAgZnBzX2RlbjogMTAwMFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX2ZsdlNvdW5kUmF0ZVRhYmxlID0gWzU1MDAsIDExMDI1LCAyMjA1MCwgNDQxMDAsIDQ4MDAwXTtcblxuICAgICAgICB0aGlzLl9tcGVnU2FtcGxpbmdSYXRlcyA9IFtcbiAgICAgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsXG4gICAgICAgICAgICAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAsIDczNTBcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLl9tcGVnQXVkaW9WMTBTYW1wbGVSYXRlVGFibGUgPSBbNDQxMDAsIDQ4MDAwLCAzMjAwMCwgMF07XG4gICAgICAgIHRoaXMuX21wZWdBdWRpb1YyMFNhbXBsZVJhdGVUYWJsZSA9IFsyMjA1MCwgMjQwMDAsIDE2MDAwLCAwXTtcbiAgICAgICAgdGhpcy5fbXBlZ0F1ZGlvVjI1U2FtcGxlUmF0ZVRhYmxlID0gWzExMDI1LCAxMjAwMCwgODAwMCwgIDBdO1xuXG4gICAgICAgIHRoaXMuX21wZWdBdWRpb0wxQml0UmF0ZVRhYmxlID0gWzAsIDMyLCA2NCwgOTYsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAyODgsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4LCAtMV07XG4gICAgICAgIHRoaXMuX21wZWdBdWRpb0wyQml0UmF0ZVRhYmxlID0gWzAsIDMyLCA0OCwgNTYsICA2NCwgIDgwLCAgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0LCAtMV07XG4gICAgICAgIHRoaXMuX21wZWdBdWRpb0wzQml0UmF0ZVRhYmxlID0gWzAsIDMyLCA0MCwgNDgsICA1NiwgIDY0LCAgODAsICA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAtMV07XG5cbiAgICAgICAgdGhpcy5fdmlkZW9UcmFjayA9IHt0eXBlOiAndmlkZW8nLCBpZDogMSwgc2VxdWVuY2VOdW1iZXI6IDAsIHNhbXBsZXM6IFtdLCBsZW5ndGg6IDB9O1xuICAgICAgICB0aGlzLl9hdWRpb1RyYWNrID0ge3R5cGU6ICdhdWRpbycsIGlkOiAyLCBzZXF1ZW5jZU51bWJlcjogMCwgc2FtcGxlczogW10sIGxlbmd0aDogMH07XG5cbiAgICAgICAgdGhpcy5fbGl0dGxlRW5kaWFuID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBidWYgPSBuZXcgQXJyYXlCdWZmZXIoMik7XG4gICAgICAgICAgICAobmV3IERhdGFWaWV3KGJ1ZikpLnNldEludDE2KDAsIDI1NiwgdHJ1ZSk7ICAvLyBsaXR0bGUtZW5kaWFuIHdyaXRlXG4gICAgICAgICAgICByZXR1cm4gKG5ldyBJbnQxNkFycmF5KGJ1ZikpWzBdID09PSAyNTY7ICAvLyBwbGF0Zm9ybS1zcGVjIHJlYWQsIGlmIGVxdWFsIHRoZW4gTEVcbiAgICAgICAgfSkoKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9tZWRpYUluZm8gPSBudWxsO1xuICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2F1ZGlvTWV0YWRhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLl92aWRlb01ldGFkYXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdmlkZW9UcmFjayA9IG51bGw7XG4gICAgICAgIHRoaXMuX2F1ZGlvVHJhY2sgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX29uRXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbk1lZGlhSW5mbyA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uTWV0YURhdGFBcnJpdmVkID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25TY3JpcHREYXRhQXJyaXZlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uVHJhY2tNZXRhZGF0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uRGF0YUF2YWlsYWJsZSA9IG51bGw7XG4gICAgfVxuXG4gICAgc3RhdGljIHByb2JlKGJ1ZmZlcikge1xuICAgICAgICBsZXQgZGF0YSA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgIGxldCBtaXNtYXRjaCA9IHttYXRjaDogZmFsc2V9O1xuXG4gICAgICAgIGlmIChkYXRhWzBdICE9PSAweDQ2IHx8IGRhdGFbMV0gIT09IDB4NEMgfHwgZGF0YVsyXSAhPT0gMHg1NiB8fCBkYXRhWzNdICE9PSAweDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2g7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGFzQXVkaW8gPSAoKGRhdGFbNF0gJiA0KSA+Pj4gMikgIT09IDA7XG4gICAgICAgIGxldCBoYXNWaWRlbyA9IChkYXRhWzRdICYgMSkgIT09IDA7XG5cbiAgICAgICAgbGV0IG9mZnNldCA9IFJlYWRCaWczMihkYXRhLCA1KTtcblxuICAgICAgICBpZiAob2Zmc2V0IDwgOSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1hdGNoOiB0cnVlLFxuICAgICAgICAgICAgY29uc3VtZWQ6IG9mZnNldCxcbiAgICAgICAgICAgIGRhdGFPZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgICAgIGhhc0F1ZGlvVHJhY2s6IGhhc0F1ZGlvLFxuICAgICAgICAgICAgaGFzVmlkZW9UcmFjazogaGFzVmlkZW9cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBiaW5kRGF0YVNvdXJjZShsb2FkZXIpIHtcbiAgICAgICAgbG9hZGVyLm9uRGF0YUFycml2YWwgPSB0aGlzLnBhcnNlQ2h1bmtzLmJpbmQodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIHByb3RvdHlwZTogZnVuY3Rpb24odHlwZTogc3RyaW5nLCBtZXRhZGF0YTogYW55KTogdm9pZFxuICAgIGdldCBvblRyYWNrTWV0YWRhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vblRyYWNrTWV0YWRhdGE7XG4gICAgfVxuXG4gICAgc2V0IG9uVHJhY2tNZXRhZGF0YShjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vblRyYWNrTWV0YWRhdGEgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICAvLyBwcm90b3R5cGU6IGZ1bmN0aW9uKG1lZGlhSW5mbzogTWVkaWFJbmZvKTogdm9pZFxuICAgIGdldCBvbk1lZGlhSW5mbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uTWVkaWFJbmZvO1xuICAgIH1cblxuICAgIHNldCBvbk1lZGlhSW5mbyhjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vbk1lZGlhSW5mbyA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGdldCBvbk1ldGFEYXRhQXJyaXZlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uTWV0YURhdGFBcnJpdmVkO1xuICAgIH1cblxuICAgIHNldCBvbk1ldGFEYXRhQXJyaXZlZChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vbk1ldGFEYXRhQXJyaXZlZCA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGdldCBvblNjcmlwdERhdGFBcnJpdmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25TY3JpcHREYXRhQXJyaXZlZDtcbiAgICB9XG5cbiAgICBzZXQgb25TY3JpcHREYXRhQXJyaXZlZChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vblNjcmlwdERhdGFBcnJpdmVkID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgLy8gcHJvdG90eXBlOiBmdW5jdGlvbih0eXBlOiBudW1iZXIsIGluZm86IHN0cmluZyk6IHZvaWRcbiAgICBnZXQgb25FcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRXJyb3I7XG4gICAgfVxuXG4gICAgc2V0IG9uRXJyb3IoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25FcnJvciA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIC8vIHByb3RvdHlwZTogZnVuY3Rpb24odmlkZW9UcmFjazogYW55LCBhdWRpb1RyYWNrOiBhbnkpOiB2b2lkXG4gICAgZ2V0IG9uRGF0YUF2YWlsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YUF2YWlsYWJsZTtcbiAgICB9XG5cbiAgICBzZXQgb25EYXRhQXZhaWxhYmxlKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uRGF0YUF2YWlsYWJsZSA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIC8vIHRpbWVzdGFtcCBiYXNlIGZvciBvdXRwdXQgc2FtcGxlcywgbXVzdCBiZSBpbiBtaWxsaXNlY29uZHNcbiAgICBnZXQgdGltZXN0YW1wQmFzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVzdGFtcEJhc2U7XG4gICAgfVxuXG4gICAgc2V0IHRpbWVzdGFtcEJhc2UoYmFzZSkge1xuICAgICAgICB0aGlzLl90aW1lc3RhbXBCYXNlID0gYmFzZTtcbiAgICB9XG5cbiAgICBnZXQgb3ZlcnJpZGVkRHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kdXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBGb3JjZS1vdmVycmlkZSBtZWRpYSBkdXJhdGlvbi4gTXVzdCBiZSBpbiBtaWxsaXNlY29uZHMsIGludDMyXG4gICAgc2V0IG92ZXJyaWRlZER1cmF0aW9uKGR1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX2R1cmF0aW9uT3ZlcnJpZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICAgICAgdGhpcy5fbWVkaWFJbmZvLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgfVxuXG4gICAgLy8gRm9yY2Utb3ZlcnJpZGUgYXVkaW8gdHJhY2sgcHJlc2VudCBmbGFnLCBib29sZWFuXG4gICAgc2V0IG92ZXJyaWRlZEhhc0F1ZGlvKGhhc0F1ZGlvKSB7XG4gICAgICAgIHRoaXMuX2hhc0F1ZGlvRmxhZ092ZXJyaWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2hhc0F1ZGlvID0gaGFzQXVkaW87XG4gICAgICAgIHRoaXMuX21lZGlhSW5mby5oYXNBdWRpbyA9IGhhc0F1ZGlvO1xuICAgIH1cblxuICAgIC8vIEZvcmNlLW92ZXJyaWRlIHZpZGVvIHRyYWNrIHByZXNlbnQgZmxhZywgYm9vbGVhblxuICAgIHNldCBvdmVycmlkZWRIYXNWaWRlbyhoYXNWaWRlbykge1xuICAgICAgICB0aGlzLl9oYXNWaWRlb0ZsYWdPdmVycmlkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9oYXNWaWRlbyA9IGhhc1ZpZGVvO1xuICAgICAgICB0aGlzLl9tZWRpYUluZm8uaGFzVmlkZW8gPSBoYXNWaWRlbztcbiAgICB9XG5cbiAgICByZXNldE1lZGlhSW5mbygpIHtcbiAgICAgICAgdGhpcy5fbWVkaWFJbmZvID0gbmV3IE1lZGlhSW5mbygpO1xuICAgIH1cblxuICAgIF9pc0luaXRpYWxNZXRhZGF0YURpc3BhdGNoZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9oYXNBdWRpbyAmJiB0aGlzLl9oYXNWaWRlbykgeyAgLy8gYm90aCBhdWRpbyAmIHZpZGVvXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXVkaW9Jbml0aWFsTWV0YWRhdGFEaXNwYXRjaGVkICYmIHRoaXMuX3ZpZGVvSW5pdGlhbE1ldGFkYXRhRGlzcGF0Y2hlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faGFzQXVkaW8gJiYgIXRoaXMuX2hhc1ZpZGVvKSB7ICAvLyBhdWRpbyBvbmx5XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXVkaW9Jbml0aWFsTWV0YWRhdGFEaXNwYXRjaGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5faGFzQXVkaW8gJiYgdGhpcy5faGFzVmlkZW8pIHsgIC8vIHZpZGVvIG9ubHlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92aWRlb0luaXRpYWxNZXRhZGF0YURpc3BhdGNoZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGZ1bmN0aW9uIHBhcnNlQ2h1bmtzKGNodW5rOiBBcnJheUJ1ZmZlciwgYnl0ZVN0YXJ0OiBudW1iZXIpOiBudW1iZXI7XG4gICAgcGFyc2VDaHVua3MoY2h1bmssIGJ5dGVTdGFydCkge1xuICAgICAgICBpZiAoIXRoaXMuX29uRXJyb3IgfHwgIXRoaXMuX29uTWVkaWFJbmZvIHx8ICF0aGlzLl9vblRyYWNrTWV0YWRhdGEgfHwgIXRoaXMuX29uRGF0YUF2YWlsYWJsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbignRmx2OiBvbkVycm9yICYgb25NZWRpYUluZm8gJiBvblRyYWNrTWV0YWRhdGEgJiBvbkRhdGFBdmFpbGFibGUgY2FsbGJhY2sgbXVzdCBiZSBzcGVjaWZpZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgbGUgPSB0aGlzLl9saXR0bGVFbmRpYW47XG5cbiAgICAgICAgaWYgKGJ5dGVTdGFydCA9PT0gMCkgeyAgLy8gYnVmZmVyIHdpdGggRkxWIGhlYWRlclxuICAgICAgICAgICAgaWYgKGNodW5rLmJ5dGVMZW5ndGggPiAxMykge1xuICAgICAgICAgICAgICAgIGxldCBwcm9iZURhdGEgPSBGTFZEZW11eGVyLnByb2JlKGNodW5rKTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBwcm9iZURhdGEuZGF0YU9mZnNldDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fZmlyc3RQYXJzZSkgeyAgLy8gaGFuZGxlIFByZXZpb3VzVGFnU2l6ZTAgYmVmb3JlIFRhZzFcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0UGFyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChieXRlU3RhcnQgKyBvZmZzZXQgIT09IHRoaXMuX2RhdGFPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgJ0ZpcnN0IHRpbWUgcGFyc2luZyBidXQgY2h1bmsgYnl0ZVN0YXJ0IGludmFsaWQhJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB2ID0gbmV3IERhdGFWaWV3KGNodW5rLCBvZmZzZXQpO1xuICAgICAgICAgICAgbGV0IHByZXZUYWdTaXplMCA9IHYuZ2V0VWludDMyKDAsICFsZSk7XG4gICAgICAgICAgICBpZiAocHJldlRhZ1NpemUwICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsICdQcmV2VGFnU2l6ZTAgIT09IDAgISEhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gNDtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChvZmZzZXQgPCBjaHVuay5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNwYXRjaCA9IHRydWU7XG5cbiAgICAgICAgICAgIGxldCB2ID0gbmV3IERhdGFWaWV3KGNodW5rLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICBpZiAob2Zmc2V0ICsgMTEgKyA0ID4gY2h1bmsuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIGRhdGEgbm90IGVub3VnaCBmb3IgcGFyc2luZyBhbiBmbHYgdGFnXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0YWdUeXBlID0gdi5nZXRVaW50OCgwKTtcbiAgICAgICAgICAgIGxldCBkYXRhU2l6ZSA9IHYuZ2V0VWludDMyKDAsICFsZSkgJiAweDAwRkZGRkZGO1xuXG4gICAgICAgICAgICBpZiAob2Zmc2V0ICsgMTEgKyBkYXRhU2l6ZSArIDQgPiBjaHVuay5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gZGF0YSBub3QgZW5vdWdoIGZvciBwYXJzaW5nIGFjdHVhbCBkYXRhIGJvZHlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhZ1R5cGUgIT09IDggJiYgdGFnVHlwZSAhPT0gOSAmJiB0YWdUeXBlICE9PSAxOCkge1xuICAgICAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCBgVW5zdXBwb3J0ZWQgdGFnIHR5cGUgJHt0YWdUeXBlfSwgc2tpcHBlZGApO1xuICAgICAgICAgICAgICAgIC8vIGNvbnN1bWUgdGhlIHdob2xlIHRhZyAoc2tpcCBpdClcbiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTEgKyBkYXRhU2l6ZSArIDQ7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0czIgPSB2LmdldFVpbnQ4KDQpO1xuICAgICAgICAgICAgbGV0IHRzMSA9IHYuZ2V0VWludDgoNSk7XG4gICAgICAgICAgICBsZXQgdHMwID0gdi5nZXRVaW50OCg2KTtcbiAgICAgICAgICAgIGxldCB0czMgPSB2LmdldFVpbnQ4KDcpO1xuXG4gICAgICAgICAgICBsZXQgdGltZXN0YW1wID0gdHMwIHwgKHRzMSA8PCA4KSB8ICh0czIgPDwgMTYpIHwgKHRzMyA8PCAyNCk7XG5cbiAgICAgICAgICAgIGxldCBzdHJlYW1JZCA9IHYuZ2V0VWludDMyKDcsICFsZSkgJiAweDAwRkZGRkZGO1xuICAgICAgICAgICAgaWYgKHN0cmVhbUlkICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsICdNZWV0IHRhZyB3aGljaCBoYXMgU3RyZWFtSUQgIT0gMCEnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGRhdGFPZmZzZXQgPSBvZmZzZXQgKyAxMTtcblxuICAgICAgICAgICAgc3dpdGNoICh0YWdUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSA4OiAgLy8gQXVkaW9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VBdWRpb0RhdGEoY2h1bmssIGRhdGFPZmZzZXQsIGRhdGFTaXplLCB0aW1lc3RhbXApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6ICAvLyBWaWRlb1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZVZpZGVvRGF0YShjaHVuaywgZGF0YU9mZnNldCwgZGF0YVNpemUsIHRpbWVzdGFtcCwgYnl0ZVN0YXJ0ICsgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxODogIC8vIFNjcmlwdERhdGFPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VTY3JpcHREYXRhKGNodW5rLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcHJldlRhZ1NpemUgPSB2LmdldFVpbnQzMigxMSArIGRhdGFTaXplLCAhbGUpO1xuICAgICAgICAgICAgaWYgKHByZXZUYWdTaXplICE9PSAxMSArIGRhdGFTaXplKSB7XG4gICAgICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsIGBJbnZhbGlkIFByZXZUYWdTaXplICR7cHJldlRhZ1NpemV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9mZnNldCArPSAxMSArIGRhdGFTaXplICsgNDsgIC8vIHRhZ0JvZHkgKyBkYXRhU2l6ZSArIHByZXZUYWdTaXplXG4gICAgICAgIH1cblxuICAgICAgICAvLyBkaXNwYXRjaCBwYXJzZWQgZnJhbWVzIHRvIGNvbnN1bWVyICh0eXBpY2FsbHksIHRoZSByZW11eGVyKVxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsTWV0YWRhdGFEaXNwYXRjaGVkKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9kaXNwYXRjaCAmJiAodGhpcy5fYXVkaW9UcmFjay5sZW5ndGggfHwgdGhpcy5fdmlkZW9UcmFjay5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25EYXRhQXZhaWxhYmxlKHRoaXMuX2F1ZGlvVHJhY2ssIHRoaXMuX3ZpZGVvVHJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9mZnNldDsgIC8vIGNvbnN1bWVkIGJ5dGVzLCBqdXN0IGVxdWFscyBsYXRlc3Qgb2Zmc2V0IGluZGV4XG4gICAgfVxuXG4gICAgX3BhcnNlU2NyaXB0RGF0YShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpIHtcbiAgICAgICAgbGV0IHNjcmlwdERhdGEgPSBBTUYucGFyc2VTY3JpcHREYXRhKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG5cbiAgICAgICAgaWYgKHNjcmlwdERhdGEuaGFzT3duUHJvcGVydHkoJ29uTWV0YURhdGEnKSkge1xuICAgICAgICAgICAgaWYgKHNjcmlwdERhdGEub25NZXRhRGF0YSA9PSBudWxsIHx8IHR5cGVvZiBzY3JpcHREYXRhLm9uTWV0YURhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsICdJbnZhbGlkIG9uTWV0YURhdGEgc3RydWN0dXJlIScpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9tZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCAnRm91bmQgYW5vdGhlciBvbk1ldGFEYXRhIHRhZyEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhID0gc2NyaXB0RGF0YTtcbiAgICAgICAgICAgIGxldCBvbk1ldGFEYXRhID0gdGhpcy5fbWV0YWRhdGEub25NZXRhRGF0YTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX29uTWV0YURhdGFBcnJpdmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25NZXRhRGF0YUFycml2ZWQoT2JqZWN0LmFzc2lnbih7fSwgb25NZXRhRGF0YSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uTWV0YURhdGEuaGFzQXVkaW8gPT09ICdib29sZWFuJykgeyAgLy8gaGFzQXVkaW9cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faGFzQXVkaW9GbGFnT3ZlcnJpZGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNBdWRpbyA9IG9uTWV0YURhdGEuaGFzQXVkaW87XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhSW5mby5oYXNBdWRpbyA9IHRoaXMuX2hhc0F1ZGlvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25NZXRhRGF0YS5oYXNWaWRlbyA9PT0gJ2Jvb2xlYW4nKSB7ICAvLyBoYXNWaWRlb1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oYXNWaWRlb0ZsYWdPdmVycmlkZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1ZpZGVvID0gb25NZXRhRGF0YS5oYXNWaWRlbztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFJbmZvLmhhc1ZpZGVvID0gdGhpcy5faGFzVmlkZW87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvbk1ldGFEYXRhLmF1ZGlvZGF0YXJhdGUgPT09ICdudW1iZXInKSB7ICAvLyBhdWRpb2RhdGFyYXRlXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFJbmZvLmF1ZGlvRGF0YVJhdGUgPSBvbk1ldGFEYXRhLmF1ZGlvZGF0YXJhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uTWV0YURhdGEudmlkZW9kYXRhcmF0ZSA9PT0gJ251bWJlcicpIHsgIC8vIHZpZGVvZGF0YXJhdGVcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8udmlkZW9EYXRhUmF0ZSA9IG9uTWV0YURhdGEudmlkZW9kYXRhcmF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25NZXRhRGF0YS53aWR0aCA9PT0gJ251bWJlcicpIHsgIC8vIHdpZHRoXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFJbmZvLndpZHRoID0gb25NZXRhRGF0YS53aWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25NZXRhRGF0YS5oZWlnaHQgPT09ICdudW1iZXInKSB7ICAvLyBoZWlnaHRcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8uaGVpZ2h0ID0gb25NZXRhRGF0YS5oZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uTWV0YURhdGEuZHVyYXRpb24gPT09ICdudW1iZXInKSB7ICAvLyBkdXJhdGlvblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZHVyYXRpb25PdmVycmlkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGR1cmF0aW9uID0gTWF0aC5mbG9vcihvbk1ldGFEYXRhLmR1cmF0aW9uICogdGhpcy5fdGltZXNjYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFJbmZvLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8uZHVyYXRpb24gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvbk1ldGFEYXRhLmZyYW1lcmF0ZSA9PT0gJ251bWJlcicpIHsgIC8vIGZyYW1lcmF0ZVxuICAgICAgICAgICAgICAgIGxldCBmcHNfbnVtID0gTWF0aC5mbG9vcihvbk1ldGFEYXRhLmZyYW1lcmF0ZSAqIDEwMDApO1xuICAgICAgICAgICAgICAgIGlmIChmcHNfbnVtID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZnBzID0gZnBzX251bSAvIDEwMDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZmVyZW5jZUZyYW1lUmF0ZS5maXhlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZmVyZW5jZUZyYW1lUmF0ZS5mcHMgPSBmcHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZmVyZW5jZUZyYW1lUmF0ZS5mcHNfbnVtID0gZnBzX251bTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVmZXJlbmNlRnJhbWVSYXRlLmZwc19kZW4gPSAxMDAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8uZnBzID0gZnBzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25NZXRhRGF0YS5rZXlmcmFtZXMgPT09ICdvYmplY3QnKSB7ICAvLyBrZXlmcmFtZXNcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8uaGFzS2V5ZnJhbWVzSW5kZXggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBrZXlmcmFtZXMgPSBvbk1ldGFEYXRhLmtleWZyYW1lcztcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8ua2V5ZnJhbWVzSW5kZXggPSB0aGlzLl9wYXJzZUtleWZyYW1lc0luZGV4KGtleWZyYW1lcyk7XG4gICAgICAgICAgICAgICAgb25NZXRhRGF0YS5rZXlmcmFtZXMgPSBudWxsOyAgLy8ga2V5ZnJhbWVzIGhhcyBiZWVuIGV4dHJhY3RlZCwgcmVtb3ZlIGl0XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhSW5mby5oYXNLZXlmcmFtZXNJbmRleCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhSW5mby5tZXRhZGF0YSA9IG9uTWV0YURhdGE7XG4gICAgICAgICAgICBMb2cudih0aGlzLlRBRywgJ1BhcnNlZCBvbk1ldGFEYXRhJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWVkaWFJbmZvLmlzQ29tcGxldGUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uTWVkaWFJbmZvKHRoaXMuX21lZGlhSW5mbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2NyaXB0RGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX29uU2NyaXB0RGF0YUFycml2ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vblNjcmlwdERhdGFBcnJpdmVkKE9iamVjdC5hc3NpZ24oe30sIHNjcmlwdERhdGEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9wYXJzZUtleWZyYW1lc0luZGV4KGtleWZyYW1lcykge1xuICAgICAgICBsZXQgdGltZXMgPSBbXTtcbiAgICAgICAgbGV0IGZpbGVwb3NpdGlvbnMgPSBbXTtcblxuICAgICAgICAvLyBpZ25vcmUgZmlyc3Qga2V5ZnJhbWUgd2hpY2ggaXMgYWN0dWFsbHkgQVZDIFNlcXVlbmNlIEhlYWRlciAoQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQpXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwga2V5ZnJhbWVzLnRpbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdGltZSA9IHRoaXMuX3RpbWVzdGFtcEJhc2UgKyBNYXRoLmZsb29yKGtleWZyYW1lcy50aW1lc1tpXSAqIDEwMDApO1xuICAgICAgICAgICAgdGltZXMucHVzaCh0aW1lKTtcbiAgICAgICAgICAgIGZpbGVwb3NpdGlvbnMucHVzaChrZXlmcmFtZXMuZmlsZXBvc2l0aW9uc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGltZXM6IHRpbWVzLFxuICAgICAgICAgICAgZmlsZXBvc2l0aW9uczogZmlsZXBvc2l0aW9uc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIF9wYXJzZUF1ZGlvRGF0YShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUsIHRhZ1RpbWVzdGFtcCkge1xuICAgICAgICBpZiAoZGF0YVNpemUgPD0gMSkge1xuICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsICdGbHY6IEludmFsaWQgYXVkaW8gcGFja2V0LCBtaXNzaW5nIFNvdW5kRGF0YSBwYXlsb2FkIScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2hhc0F1ZGlvRmxhZ092ZXJyaWRlZCA9PT0gdHJ1ZSAmJiB0aGlzLl9oYXNBdWRpbyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIElmIGhhc0F1ZGlvOiBmYWxzZSBpbmRpY2F0ZWQgZXhwbGljaXRseSBpbiBNZWRpYURhdGFTb3VyY2UsXG4gICAgICAgICAgICAvLyBJZ25vcmUgYWxsIHRoZSBhdWRpbyBwYWNrZXRzXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGUgPSB0aGlzLl9saXR0bGVFbmRpYW47XG4gICAgICAgIGxldCB2ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG5cbiAgICAgICAgbGV0IHNvdW5kU3BlYyA9IHYuZ2V0VWludDgoMCk7XG5cbiAgICAgICAgbGV0IHNvdW5kRm9ybWF0ID0gc291bmRTcGVjID4+PiA0O1xuICAgICAgICBpZiAoc291bmRGb3JtYXQgIT09IDIgJiYgc291bmRGb3JtYXQgIT09IDEwKSB7ICAvLyBNUDMgb3IgQUFDXG4gICAgICAgICAgICB0aGlzLl9vbkVycm9yKERlbXV4RXJyb3JzLkNPREVDX1VOU1VQUE9SVEVELCAnRmx2OiBVbnN1cHBvcnRlZCBhdWRpbyBjb2RlYyBpZHg6ICcgKyBzb3VuZEZvcm1hdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc291bmRSYXRlID0gMDtcbiAgICAgICAgbGV0IHNvdW5kUmF0ZUluZGV4ID0gKHNvdW5kU3BlYyAmIDEyKSA+Pj4gMjtcbiAgICAgICAgaWYgKHNvdW5kUmF0ZUluZGV4ID49IDAgJiYgc291bmRSYXRlSW5kZXggPD0gNCkge1xuICAgICAgICAgICAgc291bmRSYXRlID0gdGhpcy5fZmx2U291bmRSYXRlVGFibGVbc291bmRSYXRlSW5kZXhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcihEZW11eEVycm9ycy5GT1JNQVRfRVJST1IsICdGbHY6IEludmFsaWQgYXVkaW8gc2FtcGxlIHJhdGUgaWR4OiAnICsgc291bmRSYXRlSW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNvdW5kU2l6ZSA9IChzb3VuZFNwZWMgJiAyKSA+Pj4gMTsgIC8vIHVudXNlZFxuICAgICAgICBsZXQgc291bmRUeXBlID0gKHNvdW5kU3BlYyAmIDEpO1xuXG5cbiAgICAgICAgbGV0IG1ldGEgPSB0aGlzLl9hdWRpb01ldGFkYXRhO1xuICAgICAgICBsZXQgdHJhY2sgPSB0aGlzLl9hdWRpb1RyYWNrO1xuXG4gICAgICAgIGlmICghbWV0YSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2hhc0F1ZGlvID09PSBmYWxzZSAmJiB0aGlzLl9oYXNBdWRpb0ZsYWdPdmVycmlkZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFzQXVkaW8gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhSW5mby5oYXNBdWRpbyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluaXRpYWwgbWV0YWRhdGFcbiAgICAgICAgICAgIG1ldGEgPSB0aGlzLl9hdWRpb01ldGFkYXRhID0ge307XG4gICAgICAgICAgICBtZXRhLnR5cGUgPSAnYXVkaW8nO1xuICAgICAgICAgICAgbWV0YS5pZCA9IHRyYWNrLmlkO1xuICAgICAgICAgICAgbWV0YS50aW1lc2NhbGUgPSB0aGlzLl90aW1lc2NhbGU7XG4gICAgICAgICAgICBtZXRhLmR1cmF0aW9uID0gdGhpcy5fZHVyYXRpb247XG4gICAgICAgICAgICBtZXRhLmF1ZGlvU2FtcGxlUmF0ZSA9IHNvdW5kUmF0ZTtcbiAgICAgICAgICAgIG1ldGEuY2hhbm5lbENvdW50ID0gKHNvdW5kVHlwZSA9PT0gMCA/IDEgOiAyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzb3VuZEZvcm1hdCA9PT0gMTApIHsgIC8vIEFBQ1xuICAgICAgICAgICAgbGV0IGFhY0RhdGEgPSB0aGlzLl9wYXJzZUFBQ0F1ZGlvRGF0YShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIDEsIGRhdGFTaXplIC0gMSk7XG4gICAgICAgICAgICBpZiAoYWFjRGF0YSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhYWNEYXRhLnBhY2tldFR5cGUgPT09IDApIHsgIC8vIEFBQyBzZXF1ZW5jZSBoZWFkZXIgKEF1ZGlvU3BlY2lmaWNDb25maWcpXG4gICAgICAgICAgICAgICAgaWYgKG1ldGEuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCAnRm91bmQgYW5vdGhlciBBdWRpb1NwZWNpZmljQ29uZmlnIScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbWlzYyA9IGFhY0RhdGEuZGF0YTtcbiAgICAgICAgICAgICAgICBtZXRhLmF1ZGlvU2FtcGxlUmF0ZSA9IG1pc2Muc2FtcGxpbmdSYXRlO1xuICAgICAgICAgICAgICAgIG1ldGEuY2hhbm5lbENvdW50ID0gbWlzYy5jaGFubmVsQ291bnQ7XG4gICAgICAgICAgICAgICAgbWV0YS5jb2RlYyA9IG1pc2MuY29kZWM7XG4gICAgICAgICAgICAgICAgbWV0YS5vcmlnaW5hbENvZGVjID0gbWlzYy5vcmlnaW5hbENvZGVjO1xuICAgICAgICAgICAgICAgIG1ldGEuY29uZmlnID0gbWlzYy5jb25maWc7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGRlY29kZSByZXN1bHQgb2YgYW4gYWFjIHNhbXBsZSBpcyAxMDI0IFBDTSBzYW1wbGVzXG4gICAgICAgICAgICAgICAgbWV0YS5yZWZTYW1wbGVEdXJhdGlvbiA9IDEwMjQgLyBtZXRhLmF1ZGlvU2FtcGxlUmF0ZSAqIG1ldGEudGltZXNjYWxlO1xuICAgICAgICAgICAgICAgIExvZy52KHRoaXMuVEFHLCAnUGFyc2VkIEF1ZGlvU3BlY2lmaWNDb25maWcnKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxNZXRhZGF0YURpc3BhdGNoZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb24taW5pdGlhbCBtZXRhZGF0YSwgZm9yY2UgZGlzcGF0Y2ggKG9yIGZsdXNoKSBwYXJzZWQgZnJhbWVzIHRvIHJlbXV4ZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Rpc3BhdGNoICYmICh0aGlzLl9hdWRpb1RyYWNrLmxlbmd0aCB8fCB0aGlzLl92aWRlb1RyYWNrLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRGF0YUF2YWlsYWJsZSh0aGlzLl9hdWRpb1RyYWNrLCB0aGlzLl92aWRlb1RyYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2F1ZGlvSW5pdGlhbE1ldGFkYXRhRGlzcGF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHRoZW4gbm90aWZ5IG5ldyBtZXRhZGF0YVxuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25UcmFja01ldGFkYXRhKCdhdWRpbycsIG1ldGEpO1xuXG4gICAgICAgICAgICAgICAgbGV0IG1pID0gdGhpcy5fbWVkaWFJbmZvO1xuICAgICAgICAgICAgICAgIG1pLmF1ZGlvQ29kZWMgPSBtZXRhLm9yaWdpbmFsQ29kZWM7XG4gICAgICAgICAgICAgICAgbWkuYXVkaW9TYW1wbGVSYXRlID0gbWV0YS5hdWRpb1NhbXBsZVJhdGU7XG4gICAgICAgICAgICAgICAgbWkuYXVkaW9DaGFubmVsQ291bnQgPSBtZXRhLmNoYW5uZWxDb3VudDtcbiAgICAgICAgICAgICAgICBpZiAobWkuaGFzVmlkZW8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pLnZpZGVvQ29kZWMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWkubWltZVR5cGUgPSAndmlkZW8veC1mbHY7IGNvZGVjcz1cIicgKyBtaS52aWRlb0NvZGVjICsgJywnICsgbWkuYXVkaW9Db2RlYyArICdcIic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtaS5taW1lVHlwZSA9ICd2aWRlby94LWZsdjsgY29kZWNzPVwiJyArIG1pLmF1ZGlvQ29kZWMgKyAnXCInO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWkuaXNDb21wbGV0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uTWVkaWFJbmZvKG1pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFhY0RhdGEucGFja2V0VHlwZSA9PT0gMSkgeyAgLy8gQUFDIHJhdyBmcmFtZSBkYXRhXG4gICAgICAgICAgICAgICAgbGV0IGR0cyA9IHRoaXMuX3RpbWVzdGFtcEJhc2UgKyB0YWdUaW1lc3RhbXA7XG4gICAgICAgICAgICAgICAgbGV0IGFhY1NhbXBsZSA9IHt1bml0OiBhYWNEYXRhLmRhdGEsIGxlbmd0aDogYWFjRGF0YS5kYXRhLmJ5dGVMZW5ndGgsIGR0czogZHRzLCBwdHM6IGR0c307XG4gICAgICAgICAgICAgICAgdHJhY2suc2FtcGxlcy5wdXNoKGFhY1NhbXBsZSk7XG4gICAgICAgICAgICAgICAgdHJhY2subGVuZ3RoICs9IGFhY0RhdGEuZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIExvZy5lKHRoaXMuVEFHLCBgRmx2OiBVbnN1cHBvcnRlZCBBQUMgZGF0YSB0eXBlICR7YWFjRGF0YS5wYWNrZXRUeXBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNvdW5kRm9ybWF0ID09PSAyKSB7ICAvLyBNUDNcbiAgICAgICAgICAgIGlmICghbWV0YS5jb2RlYykge1xuICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgbWV0YWRhdGEgZm9yIG1wMyBhdWRpbyB0cmFjaywgZXh0cmFjdCBpbmZvIGZyb20gZnJhbWUgaGVhZGVyXG4gICAgICAgICAgICAgICAgbGV0IG1pc2MgPSB0aGlzLl9wYXJzZU1QM0F1ZGlvRGF0YShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIDEsIGRhdGFTaXplIC0gMSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKG1pc2MgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWV0YS5hdWRpb1NhbXBsZVJhdGUgPSBtaXNjLnNhbXBsaW5nUmF0ZTtcbiAgICAgICAgICAgICAgICBtZXRhLmNoYW5uZWxDb3VudCA9IG1pc2MuY2hhbm5lbENvdW50O1xuICAgICAgICAgICAgICAgIG1ldGEuY29kZWMgPSBtaXNjLmNvZGVjO1xuICAgICAgICAgICAgICAgIG1ldGEub3JpZ2luYWxDb2RlYyA9IG1pc2Mub3JpZ2luYWxDb2RlYztcbiAgICAgICAgICAgICAgICAvLyBUaGUgZGVjb2RlIHJlc3VsdCBvZiBhbiBtcDMgc2FtcGxlIGlzIDExNTIgUENNIHNhbXBsZXNcbiAgICAgICAgICAgICAgICBtZXRhLnJlZlNhbXBsZUR1cmF0aW9uID0gMTE1MiAvIG1ldGEuYXVkaW9TYW1wbGVSYXRlICogbWV0YS50aW1lc2NhbGU7XG4gICAgICAgICAgICAgICAgTG9nLnYodGhpcy5UQUcsICdQYXJzZWQgTVBFRyBBdWRpbyBGcmFtZSBIZWFkZXInKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuX2F1ZGlvSW5pdGlhbE1ldGFkYXRhRGlzcGF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25UcmFja01ldGFkYXRhKCdhdWRpbycsIG1ldGEpO1xuXG4gICAgICAgICAgICAgICAgbGV0IG1pID0gdGhpcy5fbWVkaWFJbmZvO1xuICAgICAgICAgICAgICAgIG1pLmF1ZGlvQ29kZWMgPSBtZXRhLmNvZGVjO1xuICAgICAgICAgICAgICAgIG1pLmF1ZGlvU2FtcGxlUmF0ZSA9IG1ldGEuYXVkaW9TYW1wbGVSYXRlO1xuICAgICAgICAgICAgICAgIG1pLmF1ZGlvQ2hhbm5lbENvdW50ID0gbWV0YS5jaGFubmVsQ291bnQ7XG4gICAgICAgICAgICAgICAgbWkuYXVkaW9EYXRhUmF0ZSA9IG1pc2MuYml0UmF0ZTtcbiAgICAgICAgICAgICAgICBpZiAobWkuaGFzVmlkZW8pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pLnZpZGVvQ29kZWMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWkubWltZVR5cGUgPSAndmlkZW8veC1mbHY7IGNvZGVjcz1cIicgKyBtaS52aWRlb0NvZGVjICsgJywnICsgbWkuYXVkaW9Db2RlYyArICdcIic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtaS5taW1lVHlwZSA9ICd2aWRlby94LWZsdjsgY29kZWNzPVwiJyArIG1pLmF1ZGlvQ29kZWMgKyAnXCInO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWkuaXNDb21wbGV0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uTWVkaWFJbmZvKG1pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRoaXMgcGFja2V0IGlzIGFsd2F5cyBhIHZhbGlkIGF1ZGlvIHBhY2tldCwgZXh0cmFjdCBpdFxuICAgICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLl9wYXJzZU1QM0F1ZGlvRGF0YShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIDEsIGRhdGFTaXplIC0gMSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGRhdGEgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGR0cyA9IHRoaXMuX3RpbWVzdGFtcEJhc2UgKyB0YWdUaW1lc3RhbXA7XG4gICAgICAgICAgICBsZXQgbXAzU2FtcGxlID0ge3VuaXQ6IGRhdGEsIGxlbmd0aDogZGF0YS5ieXRlTGVuZ3RoLCBkdHM6IGR0cywgcHRzOiBkdHN9O1xuICAgICAgICAgICAgdHJhY2suc2FtcGxlcy5wdXNoKG1wM1NhbXBsZSk7XG4gICAgICAgICAgICB0cmFjay5sZW5ndGggKz0gZGF0YS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcGFyc2VBQUNBdWRpb0RhdGEoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKSB7XG4gICAgICAgIGlmIChkYXRhU2l6ZSA8PSAxKSB7XG4gICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgJ0ZsdjogSW52YWxpZCBBQUMgcGFja2V0LCBtaXNzaW5nIEFBQ1BhY2tldFR5cGUgb3IvYW5kIERhdGEhJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0ID0ge307XG4gICAgICAgIGxldCBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG5cbiAgICAgICAgcmVzdWx0LnBhY2tldFR5cGUgPSBhcnJheVswXTtcblxuICAgICAgICBpZiAoYXJyYXlbMF0gPT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gdGhpcy5fcGFyc2VBQUNBdWRpb1NwZWNpZmljQ29uZmlnKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0ICsgMSwgZGF0YVNpemUgLSAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gYXJyYXkuc3ViYXJyYXkoMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIF9wYXJzZUFBQ0F1ZGlvU3BlY2lmaWNDb25maWcoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKSB7XG4gICAgICAgIGxldCBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG4gICAgICAgIGxldCBjb25maWcgPSBudWxsO1xuXG4gICAgICAgIC8qIEF1ZGlvIE9iamVjdCBUeXBlOlxuICAgICAgICAgICAwOiBOdWxsXG4gICAgICAgICAgIDE6IEFBQyBNYWluXG4gICAgICAgICAgIDI6IEFBQyBMQ1xuICAgICAgICAgICAzOiBBQUMgU1NSIChTY2FsYWJsZSBTYW1wbGUgUmF0ZSlcbiAgICAgICAgICAgNDogQUFDIExUUCAoTG9uZyBUZXJtIFByZWRpY3Rpb24pXG4gICAgICAgICAgIDU6IEhFLUFBQyAvIFNCUiAoU3BlY3RyYWwgQmFuZCBSZXBsaWNhdGlvbilcbiAgICAgICAgICAgNjogQUFDIFNjYWxhYmxlXG4gICAgICAgICovXG5cbiAgICAgICAgbGV0IGF1ZGlvT2JqZWN0VHlwZSA9IDA7XG4gICAgICAgIGxldCBvcmlnaW5hbEF1ZGlvT2JqZWN0VHlwZSA9IDA7XG4gICAgICAgIGxldCBhdWRpb0V4dGVuc2lvbk9iamVjdFR5cGUgPSBudWxsO1xuICAgICAgICBsZXQgc2FtcGxpbmdJbmRleCA9IDA7XG4gICAgICAgIGxldCBleHRlbnNpb25TYW1wbGluZ0luZGV4ID0gbnVsbDtcblxuICAgICAgICAvLyA1IGJpdHNcbiAgICAgICAgYXVkaW9PYmplY3RUeXBlID0gb3JpZ2luYWxBdWRpb09iamVjdFR5cGUgPSBhcnJheVswXSA+Pj4gMztcbiAgICAgICAgLy8gNCBiaXRzXG4gICAgICAgIHNhbXBsaW5nSW5kZXggPSAoKGFycmF5WzBdICYgMHgwNykgPDwgMSkgfCAoYXJyYXlbMV0gPj4+IDcpO1xuICAgICAgICBpZiAoc2FtcGxpbmdJbmRleCA8IDAgfHwgc2FtcGxpbmdJbmRleCA+PSB0aGlzLl9tcGVnU2FtcGxpbmdSYXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoRGVtdXhFcnJvcnMuRk9STUFUX0VSUk9SLCAnRmx2OiBBQUMgaW52YWxpZCBzYW1wbGluZyBmcmVxdWVuY3kgaW5kZXghJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2FtcGxpbmdGcmVxdWVuY2UgPSB0aGlzLl9tcGVnU2FtcGxpbmdSYXRlc1tzYW1wbGluZ0luZGV4XTtcblxuICAgICAgICAvLyA0IGJpdHNcbiAgICAgICAgbGV0IGNoYW5uZWxDb25maWcgPSAoYXJyYXlbMV0gJiAweDc4KSA+Pj4gMztcbiAgICAgICAgaWYgKGNoYW5uZWxDb25maWcgPCAwIHx8IGNoYW5uZWxDb25maWcgPj0gOCkge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcihEZW11eEVycm9ycy5GT1JNQVRfRVJST1IsICdGbHY6IEFBQyBpbnZhbGlkIGNoYW5uZWwgY29uZmlndXJhdGlvbicpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF1ZGlvT2JqZWN0VHlwZSA9PT0gNSkgeyAgLy8gSEUtQUFDP1xuICAgICAgICAgICAgLy8gNCBiaXRzXG4gICAgICAgICAgICBleHRlbnNpb25TYW1wbGluZ0luZGV4ID0gKChhcnJheVsxXSAmIDB4MDcpIDw8IDEpIHwgKGFycmF5WzJdID4+PiA3KTtcbiAgICAgICAgICAgIC8vIDUgYml0c1xuICAgICAgICAgICAgYXVkaW9FeHRlbnNpb25PYmplY3RUeXBlID0gKGFycmF5WzJdICYgMHg3QykgPj4+IDI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3b3JrYXJvdW5kcyBmb3IgdmFyaW91cyBicm93c2Vyc1xuICAgICAgICBsZXQgdXNlckFnZW50ID0gc2VsZi5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKHVzZXJBZ2VudC5pbmRleE9mKCdmaXJlZm94JykgIT09IC0xKSB7XG4gICAgICAgICAgICAvLyBmaXJlZm94OiB1c2UgU0JSIChIRS1BQUMpIGlmIGZyZXEgbGVzcyB0aGFuIDI0a0h6XG4gICAgICAgICAgICBpZiAoc2FtcGxpbmdJbmRleCA+PSA2KSB7XG4gICAgICAgICAgICAgICAgYXVkaW9PYmplY3RUeXBlID0gNTtcbiAgICAgICAgICAgICAgICBjb25maWcgPSBuZXcgQXJyYXkoNCk7XG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uU2FtcGxpbmdJbmRleCA9IHNhbXBsaW5nSW5kZXggLSAzO1xuICAgICAgICAgICAgfSBlbHNlIHsgIC8vIHVzZSBMQy1BQUNcbiAgICAgICAgICAgICAgICBhdWRpb09iamVjdFR5cGUgPSAyO1xuICAgICAgICAgICAgICAgIGNvbmZpZyA9IG5ldyBBcnJheSgyKTtcbiAgICAgICAgICAgICAgICBleHRlbnNpb25TYW1wbGluZ0luZGV4ID0gc2FtcGxpbmdJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh1c2VyQWdlbnQuaW5kZXhPZignYW5kcm9pZCcpICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gYW5kcm9pZDogYWx3YXlzIHVzZSBMQy1BQUNcbiAgICAgICAgICAgIGF1ZGlvT2JqZWN0VHlwZSA9IDI7XG4gICAgICAgICAgICBjb25maWcgPSBuZXcgQXJyYXkoMik7XG4gICAgICAgICAgICBleHRlbnNpb25TYW1wbGluZ0luZGV4ID0gc2FtcGxpbmdJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGZvciBvdGhlciBicm93c2VycywgZS5nLiBjaHJvbWUuLi5cbiAgICAgICAgICAgIC8vIEFsd2F5cyB1c2UgSEUtQUFDIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHN3aXRjaCBhYWMgY29kZWMgcHJvZmlsZVxuICAgICAgICAgICAgYXVkaW9PYmplY3RUeXBlID0gNTtcbiAgICAgICAgICAgIGV4dGVuc2lvblNhbXBsaW5nSW5kZXggPSBzYW1wbGluZ0luZGV4O1xuICAgICAgICAgICAgY29uZmlnID0gbmV3IEFycmF5KDQpO1xuXG4gICAgICAgICAgICBpZiAoc2FtcGxpbmdJbmRleCA+PSA2KSB7XG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uU2FtcGxpbmdJbmRleCA9IHNhbXBsaW5nSW5kZXggLSAzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsQ29uZmlnID09PSAxKSB7ICAvLyBNb25vIGNoYW5uZWxcbiAgICAgICAgICAgICAgICBhdWRpb09iamVjdFR5cGUgPSAyO1xuICAgICAgICAgICAgICAgIGNvbmZpZyA9IG5ldyBBcnJheSgyKTtcbiAgICAgICAgICAgICAgICBleHRlbnNpb25TYW1wbGluZ0luZGV4ID0gc2FtcGxpbmdJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ1swXSAgPSBhdWRpb09iamVjdFR5cGUgPDwgMztcbiAgICAgICAgY29uZmlnWzBdIHw9IChzYW1wbGluZ0luZGV4ICYgMHgwRikgPj4+IDE7XG4gICAgICAgIGNvbmZpZ1sxXSAgPSAoc2FtcGxpbmdJbmRleCAmIDB4MEYpIDw8IDc7XG4gICAgICAgIGNvbmZpZ1sxXSB8PSAoY2hhbm5lbENvbmZpZyAmIDB4MEYpIDw8IDM7XG4gICAgICAgIGlmIChhdWRpb09iamVjdFR5cGUgPT09IDUpIHtcbiAgICAgICAgICAgIGNvbmZpZ1sxXSB8PSAoKGV4dGVuc2lvblNhbXBsaW5nSW5kZXggJiAweDBGKSA+Pj4gMSk7XG4gICAgICAgICAgICBjb25maWdbMl0gID0gKGV4dGVuc2lvblNhbXBsaW5nSW5kZXggJiAweDAxKSA8PCA3O1xuICAgICAgICAgICAgLy8gZXh0ZW5kZWQgYXVkaW8gb2JqZWN0IHR5cGU6IGZvcmNlIHRvIDIgKExDLUFBQylcbiAgICAgICAgICAgIGNvbmZpZ1syXSB8PSAoMiA8PCAyKTtcbiAgICAgICAgICAgIGNvbmZpZ1szXSAgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmZpZzogY29uZmlnLFxuICAgICAgICAgICAgc2FtcGxpbmdSYXRlOiBzYW1wbGluZ0ZyZXF1ZW5jZSxcbiAgICAgICAgICAgIGNoYW5uZWxDb3VudDogY2hhbm5lbENvbmZpZyxcbiAgICAgICAgICAgIGNvZGVjOiAnbXA0YS40MC4nICsgYXVkaW9PYmplY3RUeXBlLFxuICAgICAgICAgICAgb3JpZ2luYWxDb2RlYzogJ21wNGEuNDAuJyArIG9yaWdpbmFsQXVkaW9PYmplY3RUeXBlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgX3BhcnNlTVAzQXVkaW9EYXRhKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSwgcmVxdWVzdEhlYWRlcikge1xuICAgICAgICBpZiAoZGF0YVNpemUgPCA0KSB7XG4gICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgJ0ZsdjogSW52YWxpZCBNUDMgcGFja2V0LCBoZWFkZXIgbWlzc2luZyEnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZSA9IHRoaXMuX2xpdHRsZUVuZGlhbjtcbiAgICAgICAgbGV0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHJlcXVlc3RIZWFkZXIpIHtcbiAgICAgICAgICAgIGlmIChhcnJheVswXSAhPT0gMHhGRikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB2ZXIgPSAoYXJyYXlbMV0gPj4+IDMpICYgMHgwMztcbiAgICAgICAgICAgIGxldCBsYXllciA9IChhcnJheVsxXSAmIDB4MDYpID4+IDE7XG5cbiAgICAgICAgICAgIGxldCBiaXRyYXRlX2luZGV4ID0gKGFycmF5WzJdICYgMHhGMCkgPj4+IDQ7XG4gICAgICAgICAgICBsZXQgc2FtcGxpbmdfZnJlcV9pbmRleCA9IChhcnJheVsyXSAmIDB4MEMpID4+PiAyO1xuXG4gICAgICAgICAgICBsZXQgY2hhbm5lbF9tb2RlID0gKGFycmF5WzNdID4+PiA2KSAmIDB4MDM7XG4gICAgICAgICAgICBsZXQgY2hhbm5lbF9jb3VudCA9IGNoYW5uZWxfbW9kZSAhPT0gMyA/IDIgOiAxO1xuXG4gICAgICAgICAgICBsZXQgc2FtcGxlX3JhdGUgPSAwO1xuICAgICAgICAgICAgbGV0IGJpdF9yYXRlID0gMDtcbiAgICAgICAgICAgIGxldCBvYmplY3RfdHlwZSA9IDM0OyAgLy8gTGF5ZXItMywgbGlzdGVkIGluIE1QRUctNCBBdWRpbyBPYmplY3QgVHlwZXNcblxuICAgICAgICAgICAgbGV0IGNvZGVjID0gJ21wMyc7XG5cbiAgICAgICAgICAgIHN3aXRjaCAodmVyKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiAgLy8gTVBFRyAyLjVcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3JhdGUgPSB0aGlzLl9tcGVnQXVkaW9WMjVTYW1wbGVSYXRlVGFibGVbc2FtcGxpbmdfZnJlcV9pbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjogIC8vIE1QRUcgMlxuICAgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZSA9IHRoaXMuX21wZWdBdWRpb1YyMFNhbXBsZVJhdGVUYWJsZVtzYW1wbGluZ19mcmVxX2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOiAgLy8gTVBFRyAxXG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlID0gdGhpcy5fbXBlZ0F1ZGlvVjEwU2FtcGxlUmF0ZVRhYmxlW3NhbXBsaW5nX2ZyZXFfaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoIChsYXllcikge1xuICAgICAgICAgICAgICAgIGNhc2UgMTogIC8vIExheWVyIDNcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUgPSAzNDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHJhdGVfaW5kZXggPCB0aGlzLl9tcGVnQXVkaW9MM0JpdFJhdGVUYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpdF9yYXRlID0gdGhpcy5fbXBlZ0F1ZGlvTDNCaXRSYXRlVGFibGVbYml0cmF0ZV9pbmRleF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOiAgLy8gTGF5ZXIgMlxuICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSA9IDMzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYml0cmF0ZV9pbmRleCA8IHRoaXMuX21wZWdBdWRpb0wyQml0UmF0ZVRhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYml0X3JhdGUgPSB0aGlzLl9tcGVnQXVkaW9MMkJpdFJhdGVUYWJsZVtiaXRyYXRlX2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6ICAvLyBMYXllciAxXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlID0gMzI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiaXRyYXRlX2luZGV4IDwgdGhpcy5fbXBlZ0F1ZGlvTDFCaXRSYXRlVGFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaXRfcmF0ZSA9IHRoaXMuX21wZWdBdWRpb0wxQml0UmF0ZVRhYmxlW2JpdHJhdGVfaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgYml0UmF0ZTogYml0X3JhdGUsXG4gICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlOiBzYW1wbGVfcmF0ZSxcbiAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxfY291bnQsXG4gICAgICAgICAgICAgICAgY29kZWM6IGNvZGVjLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsQ29kZWM6IGNvZGVjXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXJyYXk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIF9wYXJzZVZpZGVvRGF0YShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUsIHRhZ1RpbWVzdGFtcCwgdGFnUG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGRhdGFTaXplIDw9IDEpIHtcbiAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCAnRmx2OiBJbnZhbGlkIHZpZGVvIHBhY2tldCwgbWlzc2luZyBWaWRlb0RhdGEgcGF5bG9hZCEnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9oYXNWaWRlb0ZsYWdPdmVycmlkZWQgPT09IHRydWUgJiYgdGhpcy5faGFzVmlkZW8gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBJZiBoYXNWaWRlbzogZmFsc2UgaW5kaWNhdGVkIGV4cGxpY2l0bHkgaW4gTWVkaWFEYXRhU291cmNlLFxuICAgICAgICAgICAgLy8gSWdub3JlIGFsbCB0aGUgdmlkZW8gcGFja2V0c1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNwZWMgPSAobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKSlbMF07XG5cbiAgICAgICAgbGV0IGZyYW1lVHlwZSA9IChzcGVjICYgMjQwKSA+Pj4gNDtcbiAgICAgICAgbGV0IGNvZGVjSWQgPSBzcGVjICYgMTU7XG5cbiAgICAgICAgaWYgKGNvZGVjSWQgIT09IDcpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoRGVtdXhFcnJvcnMuQ09ERUNfVU5TVVBQT1JURUQsIGBGbHY6IFVuc3VwcG9ydGVkIGNvZGVjIGluIHZpZGVvIGZyYW1lOiAke2NvZGVjSWR9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wYXJzZUFWQ1ZpZGVvUGFja2V0KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0ICsgMSwgZGF0YVNpemUgLSAxLCB0YWdUaW1lc3RhbXAsIHRhZ1Bvc2l0aW9uLCBmcmFtZVR5cGUpO1xuICAgIH1cblxuICAgIF9wYXJzZUFWQ1ZpZGVvUGFja2V0KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSwgdGFnVGltZXN0YW1wLCB0YWdQb3NpdGlvbiwgZnJhbWVUeXBlKSB7XG4gICAgICAgIGlmIChkYXRhU2l6ZSA8IDQpIHtcbiAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCAnRmx2OiBJbnZhbGlkIEFWQyBwYWNrZXQsIG1pc3NpbmcgQVZDUGFja2V0VHlwZSBvci9hbmQgQ29tcG9zaXRpb25UaW1lJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGUgPSB0aGlzLl9saXR0bGVFbmRpYW47XG4gICAgICAgIGxldCB2ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG5cbiAgICAgICAgbGV0IHBhY2tldFR5cGUgPSB2LmdldFVpbnQ4KDApO1xuICAgICAgICBsZXQgY3RzX3Vuc2lnbmVkID0gdi5nZXRVaW50MzIoMCwgIWxlKSAmIDB4MDBGRkZGRkY7XG4gICAgICAgIGxldCBjdHMgPSAoY3RzX3Vuc2lnbmVkIDw8IDgpID4+IDg7ICAvLyBjb252ZXJ0IHRvIDI0LWJpdCBzaWduZWQgaW50XG5cbiAgICAgICAgaWYgKHBhY2tldFR5cGUgPT09IDApIHsgIC8vIEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkXG4gICAgICAgICAgICB0aGlzLl9wYXJzZUFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkKGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0ICsgNCwgZGF0YVNpemUgLSA0KTtcbiAgICAgICAgfSBlbHNlIGlmIChwYWNrZXRUeXBlID09PSAxKSB7ICAvLyBPbmUgb3IgbW9yZSBOYWx1c1xuICAgICAgICAgICAgdGhpcy5fcGFyc2VBVkNWaWRlb0RhdGEoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQgKyA0LCBkYXRhU2l6ZSAtIDQsIHRhZ1RpbWVzdGFtcCwgdGFnUG9zaXRpb24sIGZyYW1lVHlwZSwgY3RzKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYWNrZXRUeXBlID09PSAyKSB7XG4gICAgICAgICAgICAvLyBlbXB0eSwgQVZDIGVuZCBvZiBzZXF1ZW5jZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcihEZW11eEVycm9ycy5GT1JNQVRfRVJST1IsIGBGbHY6IEludmFsaWQgdmlkZW8gcGFja2V0IHR5cGUgJHtwYWNrZXRUeXBlfWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3BhcnNlQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKSB7XG4gICAgICAgIGlmIChkYXRhU2l6ZSA8IDcpIHtcbiAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCAnRmx2OiBJbnZhbGlkIEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkLCBsYWNrIG9mIGRhdGEhJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWV0YSA9IHRoaXMuX3ZpZGVvTWV0YWRhdGE7XG4gICAgICAgIGxldCB0cmFjayA9IHRoaXMuX3ZpZGVvVHJhY2s7XG4gICAgICAgIGxldCBsZSA9IHRoaXMuX2xpdHRsZUVuZGlhbjtcbiAgICAgICAgbGV0IHYgPSBuZXcgRGF0YVZpZXcoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplKTtcblxuICAgICAgICBpZiAoIW1ldGEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9oYXNWaWRlbyA9PT0gZmFsc2UgJiYgdGhpcy5faGFzVmlkZW9GbGFnT3ZlcnJpZGVkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhc1ZpZGVvID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUluZm8uaGFzVmlkZW8gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtZXRhID0gdGhpcy5fdmlkZW9NZXRhZGF0YSA9IHt9O1xuICAgICAgICAgICAgbWV0YS50eXBlID0gJ3ZpZGVvJztcbiAgICAgICAgICAgIG1ldGEuaWQgPSB0cmFjay5pZDtcbiAgICAgICAgICAgIG1ldGEudGltZXNjYWxlID0gdGhpcy5fdGltZXNjYWxlO1xuICAgICAgICAgICAgbWV0YS5kdXJhdGlvbiA9IHRoaXMuX2R1cmF0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRhLmF2Y2MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsICdGb3VuZCBhbm90aGVyIEFWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkIScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZlcnNpb24gPSB2LmdldFVpbnQ4KDApOyAgLy8gY29uZmlndXJhdGlvblZlcnNpb25cbiAgICAgICAgbGV0IGF2Y1Byb2ZpbGUgPSB2LmdldFVpbnQ4KDEpOyAgLy8gYXZjUHJvZmlsZUluZGljYXRpb25cbiAgICAgICAgbGV0IHByb2ZpbGVDb21wYXRpYmlsaXR5ID0gdi5nZXRVaW50OCgyKTsgIC8vIHByb2ZpbGVfY29tcGF0aWJpbGl0eVxuICAgICAgICBsZXQgYXZjTGV2ZWwgPSB2LmdldFVpbnQ4KDMpOyAgLy8gQVZDTGV2ZWxJbmRpY2F0aW9uXG5cbiAgICAgICAgaWYgKHZlcnNpb24gIT09IDEgfHwgYXZjUHJvZmlsZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcihEZW11eEVycm9ycy5GT1JNQVRfRVJST1IsICdGbHY6IEludmFsaWQgQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX25hbHVMZW5ndGhTaXplID0gKHYuZ2V0VWludDgoNCkgJiAzKSArIDE7ICAvLyBsZW5ndGhTaXplTWludXNPbmVcbiAgICAgICAgaWYgKHRoaXMuX25hbHVMZW5ndGhTaXplICE9PSAzICYmIHRoaXMuX25hbHVMZW5ndGhTaXplICE9PSA0KSB7ICAvLyBob2x5IHNoaXQhISFcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoRGVtdXhFcnJvcnMuRk9STUFUX0VSUk9SLCBgRmx2OiBTdHJhbmdlIE5hbHVMZW5ndGhTaXplTWludXNPbmU6ICR7dGhpcy5fbmFsdUxlbmd0aFNpemUgLSAxfWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNwc0NvdW50ID0gdi5nZXRVaW50OCg1KSAmIDMxOyAgLy8gbnVtT2ZTZXF1ZW5jZVBhcmFtZXRlclNldHNcbiAgICAgICAgaWYgKHNwc0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkVycm9yKERlbXV4RXJyb3JzLkZPUk1BVF9FUlJPUiwgJ0ZsdjogSW52YWxpZCBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZDogTm8gU1BTJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoc3BzQ291bnQgPiAxKSB7XG4gICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgYEZsdjogU3RyYW5nZSBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZDogU1BTIENvdW50ID0gJHtzcHNDb3VudH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvZmZzZXQgPSA2O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BzQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHYuZ2V0VWludDE2KG9mZnNldCwgIWxlKTsgIC8vIHNlcXVlbmNlUGFyYW1ldGVyU2V0TGVuZ3RoXG4gICAgICAgICAgICBvZmZzZXQgKz0gMjtcblxuICAgICAgICAgICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBOb3RpY2U6IE5hbHUgd2l0aG91dCBzdGFydGNvZGUgaGVhZGVyICgwMCAwMCAwMCAwMSlcbiAgICAgICAgICAgIGxldCBzcHMgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIG9mZnNldCwgbGVuKTtcbiAgICAgICAgICAgIG9mZnNldCArPSBsZW47XG5cbiAgICAgICAgICAgIGxldCBjb25maWcgPSBTUFNQYXJzZXIucGFyc2VTUFMoc3BzKTtcbiAgICAgICAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIG90aGVyIHNwcydzIGNvbmZpZ1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtZXRhLmNvZGVjV2lkdGggPSBjb25maWcuY29kZWNfc2l6ZS53aWR0aDtcbiAgICAgICAgICAgIG1ldGEuY29kZWNIZWlnaHQgPSBjb25maWcuY29kZWNfc2l6ZS5oZWlnaHQ7XG4gICAgICAgICAgICBtZXRhLnByZXNlbnRXaWR0aCA9IGNvbmZpZy5wcmVzZW50X3NpemUud2lkdGg7XG4gICAgICAgICAgICBtZXRhLnByZXNlbnRIZWlnaHQgPSBjb25maWcucHJlc2VudF9zaXplLmhlaWdodDtcblxuICAgICAgICAgICAgbWV0YS5wcm9maWxlID0gY29uZmlnLnByb2ZpbGVfc3RyaW5nO1xuICAgICAgICAgICAgbWV0YS5sZXZlbCA9IGNvbmZpZy5sZXZlbF9zdHJpbmc7XG4gICAgICAgICAgICBtZXRhLmJpdERlcHRoID0gY29uZmlnLmJpdF9kZXB0aDtcbiAgICAgICAgICAgIG1ldGEuY2hyb21hRm9ybWF0ID0gY29uZmlnLmNocm9tYV9mb3JtYXQ7XG4gICAgICAgICAgICBtZXRhLnNhclJhdGlvID0gY29uZmlnLnNhcl9yYXRpbztcbiAgICAgICAgICAgIG1ldGEuZnJhbWVSYXRlID0gY29uZmlnLmZyYW1lX3JhdGU7XG5cbiAgICAgICAgICAgIGlmIChjb25maWcuZnJhbWVfcmF0ZS5maXhlZCA9PT0gZmFsc2UgfHxcbiAgICAgICAgICAgICAgICBjb25maWcuZnJhbWVfcmF0ZS5mcHNfbnVtID09PSAwIHx8XG4gICAgICAgICAgICAgICAgY29uZmlnLmZyYW1lX3JhdGUuZnBzX2RlbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG1ldGEuZnJhbWVSYXRlID0gdGhpcy5fcmVmZXJlbmNlRnJhbWVSYXRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZnBzX2RlbiA9IG1ldGEuZnJhbWVSYXRlLmZwc19kZW47XG4gICAgICAgICAgICBsZXQgZnBzX251bSA9IG1ldGEuZnJhbWVSYXRlLmZwc19udW07XG4gICAgICAgICAgICBtZXRhLnJlZlNhbXBsZUR1cmF0aW9uID0gbWV0YS50aW1lc2NhbGUgKiAoZnBzX2RlbiAvIGZwc19udW0pO1xuXG4gICAgICAgICAgICBsZXQgY29kZWNBcnJheSA9IHNwcy5zdWJhcnJheSgxLCA0KTtcbiAgICAgICAgICAgIGxldCBjb2RlY1N0cmluZyA9ICdhdmMxLic7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIGxldCBoID0gY29kZWNBcnJheVtqXS50b1N0cmluZygxNik7XG4gICAgICAgICAgICAgICAgaWYgKGgubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgICAgICBoID0gJzAnICsgaDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29kZWNTdHJpbmcgKz0gaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1ldGEuY29kZWMgPSBjb2RlY1N0cmluZztcblxuICAgICAgICAgICAgbGV0IG1pID0gdGhpcy5fbWVkaWFJbmZvO1xuICAgICAgICAgICAgbWkud2lkdGggPSBtZXRhLmNvZGVjV2lkdGg7XG4gICAgICAgICAgICBtaS5oZWlnaHQgPSBtZXRhLmNvZGVjSGVpZ2h0O1xuICAgICAgICAgICAgbWkuZnBzID0gbWV0YS5mcmFtZVJhdGUuZnBzO1xuICAgICAgICAgICAgbWkucHJvZmlsZSA9IG1ldGEucHJvZmlsZTtcbiAgICAgICAgICAgIG1pLmxldmVsID0gbWV0YS5sZXZlbDtcbiAgICAgICAgICAgIG1pLnJlZkZyYW1lcyA9IGNvbmZpZy5yZWZfZnJhbWVzO1xuICAgICAgICAgICAgbWkuY2hyb21hRm9ybWF0ID0gY29uZmlnLmNocm9tYV9mb3JtYXRfc3RyaW5nO1xuICAgICAgICAgICAgbWkuc2FyTnVtID0gbWV0YS5zYXJSYXRpby53aWR0aDtcbiAgICAgICAgICAgIG1pLnNhckRlbiA9IG1ldGEuc2FyUmF0aW8uaGVpZ2h0O1xuICAgICAgICAgICAgbWkudmlkZW9Db2RlYyA9IGNvZGVjU3RyaW5nO1xuXG4gICAgICAgICAgICBpZiAobWkuaGFzQXVkaW8pIHtcbiAgICAgICAgICAgICAgICBpZiAobWkuYXVkaW9Db2RlYyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pLm1pbWVUeXBlID0gJ3ZpZGVvL3gtZmx2OyBjb2RlY3M9XCInICsgbWkudmlkZW9Db2RlYyArICcsJyArIG1pLmF1ZGlvQ29kZWMgKyAnXCInO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWkubWltZVR5cGUgPSAndmlkZW8veC1mbHY7IGNvZGVjcz1cIicgKyBtaS52aWRlb0NvZGVjICsgJ1wiJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtaS5pc0NvbXBsZXRlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbk1lZGlhSW5mbyhtaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcHBzQ291bnQgPSB2LmdldFVpbnQ4KG9mZnNldCk7ICAvLyBudW1PZlBpY3R1cmVQYXJhbWV0ZXJTZXRzXG4gICAgICAgIGlmIChwcHNDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcihEZW11eEVycm9ycy5GT1JNQVRfRVJST1IsICdGbHY6IEludmFsaWQgQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQ6IE5vIFBQUycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKHBwc0NvdW50ID4gMSkge1xuICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsIGBGbHY6IFN0cmFuZ2UgQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQ6IFBQUyBDb3VudCA9ICR7cHBzQ291bnR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBvZmZzZXQrKztcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBwc0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsZW4gPSB2LmdldFVpbnQxNihvZmZzZXQsICFsZSk7ICAvLyBwaWN0dXJlUGFyYW1ldGVyU2V0TGVuZ3RoXG4gICAgICAgICAgICBvZmZzZXQgKz0gMjtcblxuICAgICAgICAgICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBwcHMgaXMgdXNlbGVzcyBmb3IgZXh0cmFjdGluZyB2aWRlbyBpbmZvcm1hdGlvblxuICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1ldGEuYXZjYyA9IG5ldyBVaW50OEFycmF5KGRhdGFTaXplKTtcbiAgICAgICAgbWV0YS5hdmNjLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCwgZGF0YVNpemUpLCAwKTtcbiAgICAgICAgTG9nLnYodGhpcy5UQUcsICdQYXJzZWQgQVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQnKTtcblxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsTWV0YWRhdGFEaXNwYXRjaGVkKCkpIHtcbiAgICAgICAgICAgIC8vIGZsdXNoIHBhcnNlZCBmcmFtZXNcbiAgICAgICAgICAgIGlmICh0aGlzLl9kaXNwYXRjaCAmJiAodGhpcy5fYXVkaW9UcmFjay5sZW5ndGggfHwgdGhpcy5fdmlkZW9UcmFjay5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25EYXRhQXZhaWxhYmxlKHRoaXMuX2F1ZGlvVHJhY2ssIHRoaXMuX3ZpZGVvVHJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdmlkZW9Jbml0aWFsTWV0YWRhdGFEaXNwYXRjaGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBub3RpZnkgbmV3IG1ldGFkYXRhXG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX29uVHJhY2tNZXRhZGF0YSgndmlkZW8nLCBtZXRhKTtcbiAgICB9XG5cbiAgICBfcGFyc2VBVkNWaWRlb0RhdGEoYXJyYXlCdWZmZXIsIGRhdGFPZmZzZXQsIGRhdGFTaXplLCB0YWdUaW1lc3RhbXAsIHRhZ1Bvc2l0aW9uLCBmcmFtZVR5cGUsIGN0cykge1xuICAgICAgICBsZXQgbGUgPSB0aGlzLl9saXR0bGVFbmRpYW47XG4gICAgICAgIGxldCB2ID0gbmV3IERhdGFWaWV3KGFycmF5QnVmZmVyLCBkYXRhT2Zmc2V0LCBkYXRhU2l6ZSk7XG5cbiAgICAgICAgbGV0IHVuaXRzID0gW10sIGxlbmd0aCA9IDA7XG5cbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGNvbnN0IGxlbmd0aFNpemUgPSB0aGlzLl9uYWx1TGVuZ3RoU2l6ZTtcbiAgICAgICAgbGV0IGR0cyA9IHRoaXMuX3RpbWVzdGFtcEJhc2UgKyB0YWdUaW1lc3RhbXA7XG4gICAgICAgIGxldCBrZXlmcmFtZSA9IChmcmFtZVR5cGUgPT09IDEpOyAgLy8gZnJvbSBGTFYgRnJhbWUgVHlwZSBjb25zdGFudHNcblxuICAgICAgICB3aGlsZSAob2Zmc2V0IDwgZGF0YVNpemUpIHtcbiAgICAgICAgICAgIGlmIChvZmZzZXQgKyA0ID49IGRhdGFTaXplKSB7XG4gICAgICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsIGBNYWxmb3JtZWQgTmFsdSBuZWFyIHRpbWVzdGFtcCAke2R0c30sIG9mZnNldCA9ICR7b2Zmc2V0fSwgZGF0YVNpemUgPSAke2RhdGFTaXplfWApO1xuICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gZGF0YSBub3QgZW5vdWdoIGZvciBuZXh0IE5hbHVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5hbHUgd2l0aCBsZW5ndGgtaGVhZGVyIChBVkMxKVxuICAgICAgICAgICAgbGV0IG5hbHVTaXplID0gdi5nZXRVaW50MzIob2Zmc2V0LCAhbGUpOyAgLy8gQmlnLUVuZGlhbiByZWFkXG4gICAgICAgICAgICBpZiAobGVuZ3RoU2l6ZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIG5hbHVTaXplID4+Pj0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuYWx1U2l6ZSA+IGRhdGFTaXplIC0gbGVuZ3RoU2l6ZSkge1xuICAgICAgICAgICAgICAgIExvZy53KHRoaXMuVEFHLCBgTWFsZm9ybWVkIE5hbHVzIG5lYXIgdGltZXN0YW1wICR7ZHRzfSwgTmFsdVNpemUgPiBEYXRhU2l6ZSFgKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB1bml0VHlwZSA9IHYuZ2V0VWludDgob2Zmc2V0ICsgbGVuZ3RoU2l6ZSkgJiAweDFGO1xuXG4gICAgICAgICAgICBpZiAodW5pdFR5cGUgPT09IDUpIHsgIC8vIElEUlxuICAgICAgICAgICAgICAgIGtleWZyYW1lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGRhdGEgPSBuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlciwgZGF0YU9mZnNldCArIG9mZnNldCwgbGVuZ3RoU2l6ZSArIG5hbHVTaXplKTtcbiAgICAgICAgICAgIGxldCB1bml0ID0ge3R5cGU6IHVuaXRUeXBlLCBkYXRhOiBkYXRhfTtcbiAgICAgICAgICAgIHVuaXRzLnB1c2godW5pdCk7XG4gICAgICAgICAgICBsZW5ndGggKz0gZGF0YS5ieXRlTGVuZ3RoO1xuXG4gICAgICAgICAgICBvZmZzZXQgKz0gbGVuZ3RoU2l6ZSArIG5hbHVTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVuaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHRyYWNrID0gdGhpcy5fdmlkZW9UcmFjaztcbiAgICAgICAgICAgIGxldCBhdmNTYW1wbGUgPSB7XG4gICAgICAgICAgICAgICAgdW5pdHM6IHVuaXRzLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogbGVuZ3RoLFxuICAgICAgICAgICAgICAgIGlzS2V5ZnJhbWU6IGtleWZyYW1lLFxuICAgICAgICAgICAgICAgIGR0czogZHRzLFxuICAgICAgICAgICAgICAgIGN0czogY3RzLFxuICAgICAgICAgICAgICAgIHB0czogKGR0cyArIGN0cylcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoa2V5ZnJhbWUpIHtcbiAgICAgICAgICAgICAgICBhdmNTYW1wbGUuZmlsZXBvc2l0aW9uID0gdGFnUG9zaXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjay5zYW1wbGVzLnB1c2goYXZjU2FtcGxlKTtcbiAgICAgICAgICAgIHRyYWNrLmxlbmd0aCArPSBsZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgRkxWRGVtdXhlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IEV4cEdvbG9tYiBmcm9tICcuL2V4cC1nb2xvbWIuanMnO1xuXG5jbGFzcyBTUFNQYXJzZXIge1xuXG4gICAgc3RhdGljIF9lYnNwMnJic3AodWludDhhcnJheSkge1xuICAgICAgICBsZXQgc3JjID0gdWludDhhcnJheTtcbiAgICAgICAgbGV0IHNyY19sZW5ndGggPSBzcmMuYnl0ZUxlbmd0aDtcbiAgICAgICAgbGV0IGRzdCA9IG5ldyBVaW50OEFycmF5KHNyY19sZW5ndGgpO1xuICAgICAgICBsZXQgZHN0X2lkeCA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcmNfbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID49IDIpIHtcbiAgICAgICAgICAgICAgICAvLyBVbmVzY2FwZTogU2tpcCAweDAzIGFmdGVyIDAwIDAwXG4gICAgICAgICAgICAgICAgaWYgKHNyY1tpXSA9PT0gMHgwMyAmJiBzcmNbaSAtIDFdID09PSAweDAwICYmIHNyY1tpIC0gMl0gPT09IDB4MDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHN0W2RzdF9pZHhdID0gc3JjW2ldO1xuICAgICAgICAgICAgZHN0X2lkeCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRzdC5idWZmZXIsIDAsIGRzdF9pZHgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwYXJzZVNQUyh1aW50OGFycmF5KSB7XG4gICAgICAgIGxldCByYnNwID0gU1BTUGFyc2VyLl9lYnNwMnJic3AodWludDhhcnJheSk7XG4gICAgICAgIGxldCBnYiA9IG5ldyBFeHBHb2xvbWIocmJzcCk7XG5cbiAgICAgICAgZ2IucmVhZEJ5dGUoKTtcbiAgICAgICAgbGV0IHByb2ZpbGVfaWRjID0gZ2IucmVhZEJ5dGUoKTsgIC8vIHByb2ZpbGVfaWRjXG4gICAgICAgIGdiLnJlYWRCeXRlKCk7ICAvLyBjb25zdHJhaW50X3NldF9mbGFnc1s1XSArIHJlc2VydmVkX3plcm9bM11cbiAgICAgICAgbGV0IGxldmVsX2lkYyA9IGdiLnJlYWRCeXRlKCk7ICAvLyBsZXZlbF9pZGNcbiAgICAgICAgZ2IucmVhZFVFRygpOyAgLy8gc2VxX3BhcmFtZXRlcl9zZXRfaWRcblxuICAgICAgICBsZXQgcHJvZmlsZV9zdHJpbmcgPSBTUFNQYXJzZXIuZ2V0UHJvZmlsZVN0cmluZyhwcm9maWxlX2lkYyk7XG4gICAgICAgIGxldCBsZXZlbF9zdHJpbmcgPSBTUFNQYXJzZXIuZ2V0TGV2ZWxTdHJpbmcobGV2ZWxfaWRjKTtcbiAgICAgICAgbGV0IGNocm9tYV9mb3JtYXRfaWRjID0gMTtcbiAgICAgICAgbGV0IGNocm9tYV9mb3JtYXQgPSA0MjA7XG4gICAgICAgIGxldCBjaHJvbWFfZm9ybWF0X3RhYmxlID0gWzAsIDQyMCwgNDIyLCA0NDRdO1xuICAgICAgICBsZXQgYml0X2RlcHRoID0gODtcblxuICAgICAgICBpZiAocHJvZmlsZV9pZGMgPT09IDEwMCB8fCBwcm9maWxlX2lkYyA9PT0gMTEwIHx8IHByb2ZpbGVfaWRjID09PSAxMjIgfHxcbiAgICAgICAgICAgIHByb2ZpbGVfaWRjID09PSAyNDQgfHwgcHJvZmlsZV9pZGMgPT09IDQ0IHx8IHByb2ZpbGVfaWRjID09PSA4MyB8fFxuICAgICAgICAgICAgcHJvZmlsZV9pZGMgPT09IDg2IHx8IHByb2ZpbGVfaWRjID09PSAxMTggfHwgcHJvZmlsZV9pZGMgPT09IDEyOCB8fFxuICAgICAgICAgICAgcHJvZmlsZV9pZGMgPT09IDEzOCB8fCBwcm9maWxlX2lkYyA9PT0gMTQ0KSB7XG5cbiAgICAgICAgICAgIGNocm9tYV9mb3JtYXRfaWRjID0gZ2IucmVhZFVFRygpO1xuICAgICAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjID09PSAzKSB7XG4gICAgICAgICAgICAgICAgZ2IucmVhZEJpdHMoMSk7ICAvLyBzZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjIDw9IDMpIHtcbiAgICAgICAgICAgICAgICBjaHJvbWFfZm9ybWF0ID0gY2hyb21hX2Zvcm1hdF90YWJsZVtjaHJvbWFfZm9ybWF0X2lkY107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJpdF9kZXB0aCA9IGdiLnJlYWRVRUcoKSArIDg7ICAvLyBiaXRfZGVwdGhfbHVtYV9taW51czhcbiAgICAgICAgICAgIGdiLnJlYWRVRUcoKTsgIC8vIGJpdF9kZXB0aF9jaHJvbWFfbWludXM4XG4gICAgICAgICAgICBnYi5yZWFkQml0cygxKTsgIC8vIHFwcHJpbWVfeV96ZXJvX3RyYW5zZm9ybV9ieXBhc3NfZmxhZ1xuICAgICAgICAgICAgaWYgKGdiLnJlYWRCb29sKCkpIHsgIC8vIHNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWdcbiAgICAgICAgICAgICAgICBsZXQgc2NhbGluZ19saXN0X2NvdW50ID0gKGNocm9tYV9mb3JtYXRfaWRjICE9PSAzKSA/IDggOiAxMjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjYWxpbmdfbGlzdF9jb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnYi5yZWFkQm9vbCgpKSB7ICAvLyBzZXFfc2NhbGluZ19saXN0X3ByZXNlbnRfZmxhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCA2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BTUGFyc2VyLl9za2lwU2NhbGluZ0xpc3QoZ2IsIDE2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BTUGFyc2VyLl9za2lwU2NhbGluZ0xpc3QoZ2IsIDY0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBnYi5yZWFkVUVHKCk7ICAvLyBsb2cyX21heF9mcmFtZV9udW1fbWludXM0XG4gICAgICAgIGxldCBwaWNfb3JkZXJfY250X3R5cGUgPSBnYi5yZWFkVUVHKCk7XG4gICAgICAgIGlmIChwaWNfb3JkZXJfY250X3R5cGUgPT09IDApIHtcbiAgICAgICAgICAgIGdiLnJlYWRVRUcoKTsgIC8vIGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzXzRcbiAgICAgICAgfSBlbHNlIGlmIChwaWNfb3JkZXJfY250X3R5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGdiLnJlYWRCaXRzKDEpOyAgLy8gZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWdcbiAgICAgICAgICAgIGdiLnJlYWRTRUcoKTsgIC8vIG9mZnNldF9mb3Jfbm9uX3JlZl9waWNcbiAgICAgICAgICAgIGdiLnJlYWRTRUcoKTsgIC8vIG9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZFxuICAgICAgICAgICAgbGV0IG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPSBnYi5yZWFkVUVHKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7IGkrKykge1xuICAgICAgICAgICAgICAgIGdiLnJlYWRTRUcoKTsgIC8vIG9mZnNldF9mb3JfcmVmX2ZyYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlZl9mcmFtZXMgPSBnYi5yZWFkVUVHKCk7ICAvLyBtYXhfbnVtX3JlZl9mcmFtZXNcbiAgICAgICAgZ2IucmVhZEJpdHMoMSk7ICAvLyBnYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWdcblxuICAgICAgICBsZXQgcGljX3dpZHRoX2luX21ic19taW51czEgPSBnYi5yZWFkVUVHKCk7XG4gICAgICAgIGxldCBwaWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgPSBnYi5yZWFkVUVHKCk7XG5cbiAgICAgICAgbGV0IGZyYW1lX21ic19vbmx5X2ZsYWcgPSBnYi5yZWFkQml0cygxKTtcbiAgICAgICAgaWYgKGZyYW1lX21ic19vbmx5X2ZsYWcgPT09IDApIHtcbiAgICAgICAgICAgIGdiLnJlYWRCaXRzKDEpOyAgLy8gbWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZ1xuICAgICAgICB9XG4gICAgICAgIGdiLnJlYWRCaXRzKDEpOyAgLy8gZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZ1xuXG4gICAgICAgIGxldCBmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ID0gMDtcbiAgICAgICAgbGV0IGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gMDtcbiAgICAgICAgbGV0IGZyYW1lX2Nyb3BfdG9wX29mZnNldCA9IDA7XG4gICAgICAgIGxldCBmcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgPSAwO1xuXG4gICAgICAgIGxldCBmcmFtZV9jcm9wcGluZ19mbGFnID0gZ2IucmVhZEJvb2woKTtcbiAgICAgICAgaWYgKGZyYW1lX2Nyb3BwaW5nX2ZsYWcpIHtcbiAgICAgICAgICAgIGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgPSBnYi5yZWFkVUVHKCk7XG4gICAgICAgICAgICBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldCA9IGdiLnJlYWRVRUcoKTtcbiAgICAgICAgICAgIGZyYW1lX2Nyb3BfdG9wX29mZnNldCA9IGdiLnJlYWRVRUcoKTtcbiAgICAgICAgICAgIGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IGdiLnJlYWRVRUcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzYXJfd2lkdGggPSAxLCBzYXJfaGVpZ2h0ID0gMTtcbiAgICAgICAgbGV0IGZwcyA9IDAsIGZwc19maXhlZCA9IHRydWUsIGZwc19udW0gPSAwLCBmcHNfZGVuID0gMDtcblxuICAgICAgICBsZXQgdnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnID0gZ2IucmVhZEJvb2woKTtcbiAgICAgICAgaWYgKHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykge1xuICAgICAgICAgICAgaWYgKGdiLnJlYWRCb29sKCkpIHsgIC8vIGFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZ1xuICAgICAgICAgICAgICAgIGxldCBhc3BlY3RfcmF0aW9faWRjID0gZ2IucmVhZEJ5dGUoKTtcbiAgICAgICAgICAgICAgICBsZXQgc2FyX3dfdGFibGUgPSBbMSwgMTIsIDEwLCAxNiwgNDAsIDI0LCAyMCwgMzIsIDgwLCAxOCwgMTUsIDY0LCAxNjAsIDQsIDMsIDJdO1xuICAgICAgICAgICAgICAgIGxldCBzYXJfaF90YWJsZSA9IFsxLCAxMSwgMTEsIDExLCAzMywgMTEsIDExLCAxMSwgMzMsIDExLCAxMSwgMzMsICA5OSwgMywgMiwgMV07XG5cbiAgICAgICAgICAgICAgICBpZiAoYXNwZWN0X3JhdGlvX2lkYyA+IDAgJiYgYXNwZWN0X3JhdGlvX2lkYyA8IDE2KSB7XG4gICAgICAgICAgICAgICAgICAgIHNhcl93aWR0aCA9IHNhcl93X3RhYmxlW2FzcGVjdF9yYXRpb19pZGMgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgc2FyX2hlaWdodCA9IHNhcl9oX3RhYmxlW2FzcGVjdF9yYXRpb19pZGMgLSAxXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFzcGVjdF9yYXRpb19pZGMgPT09IDI1NSkge1xuICAgICAgICAgICAgICAgICAgICBzYXJfd2lkdGggPSBnYi5yZWFkQnl0ZSgpIDw8IDggfCBnYi5yZWFkQnl0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBzYXJfaGVpZ2h0ID0gZ2IucmVhZEJ5dGUoKSA8PCA4IHwgZ2IucmVhZEJ5dGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChnYi5yZWFkQm9vbCgpKSB7ICAvLyBvdmVyc2Nhbl9pbmZvX3ByZXNlbnRfZmxhZ1xuICAgICAgICAgICAgICAgIGdiLnJlYWRCb29sKCk7ICAvLyBvdmVyc2Nhbl9hcHByb3ByaWF0ZV9mbGFnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2IucmVhZEJvb2woKSkgeyAgLy8gdmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnXG4gICAgICAgICAgICAgICAgZ2IucmVhZEJpdHMoNCk7ICAvLyB2aWRlb19mb3JtYXQgJiB2aWRlb19mdWxsX3JhbmdlX2ZsYWdcbiAgICAgICAgICAgICAgICBpZiAoZ2IucmVhZEJvb2woKSkgeyAgLy8gY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZ1xuICAgICAgICAgICAgICAgICAgICBnYi5yZWFkQml0cygyNCk7ICAvLyBjb2xvdXJfcHJpbWFyaWVzICYgdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzICYgbWF0cml4X2NvZWZmaWNpZW50c1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnYi5yZWFkQm9vbCgpKSB7ICAvLyBjaHJvbWFfbG9jX2luZm9fcHJlc2VudF9mbGFnXG4gICAgICAgICAgICAgICAgZ2IucmVhZFVFRygpOyAgLy8gY2hyb21hX3NhbXBsZV9sb2NfdHlwZV90b3BfZmllbGRcbiAgICAgICAgICAgICAgICBnYi5yZWFkVUVHKCk7ICAvLyBjaHJvbWFfc2FtcGxlX2xvY190eXBlX2JvdHRvbV9maWVsZFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdiLnJlYWRCb29sKCkpIHsgIC8vIHRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZ1xuICAgICAgICAgICAgICAgIGxldCBudW1fdW5pdHNfaW5fdGljayA9IGdiLnJlYWRCaXRzKDMyKTtcbiAgICAgICAgICAgICAgICBsZXQgdGltZV9zY2FsZSA9IGdiLnJlYWRCaXRzKDMyKTtcbiAgICAgICAgICAgICAgICBmcHNfZml4ZWQgPSBnYi5yZWFkQm9vbCgpOyAgLy8gZml4ZWRfZnJhbWVfcmF0ZV9mbGFnXG5cbiAgICAgICAgICAgICAgICBmcHNfbnVtID0gdGltZV9zY2FsZTtcbiAgICAgICAgICAgICAgICBmcHNfZGVuID0gbnVtX3VuaXRzX2luX3RpY2sgKiAyO1xuICAgICAgICAgICAgICAgIGZwcyA9IGZwc19udW0gLyBmcHNfZGVuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNhclNjYWxlID0gMTtcbiAgICAgICAgaWYgKHNhcl93aWR0aCAhPT0gMSB8fCBzYXJfaGVpZ2h0ICE9PSAxKSB7XG4gICAgICAgICAgICBzYXJTY2FsZSA9IHNhcl93aWR0aCAvIHNhcl9oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3JvcF91bml0X3ggPSAwLCBjcm9wX3VuaXRfeSA9IDA7XG4gICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA9PT0gMCkge1xuICAgICAgICAgICAgY3JvcF91bml0X3ggPSAxO1xuICAgICAgICAgICAgY3JvcF91bml0X3kgPSAyIC0gZnJhbWVfbWJzX29ubHlfZmxhZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBzdWJfd2MgPSAoY2hyb21hX2Zvcm1hdF9pZGMgPT09IDMpID8gMSA6IDI7XG4gICAgICAgICAgICBsZXQgc3ViX2hjID0gKGNocm9tYV9mb3JtYXRfaWRjID09PSAxKSA/IDIgOiAxO1xuICAgICAgICAgICAgY3JvcF91bml0X3ggPSBzdWJfd2M7XG4gICAgICAgICAgICBjcm9wX3VuaXRfeSA9IHN1Yl9oYyAqICgyIC0gZnJhbWVfbWJzX29ubHlfZmxhZyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29kZWNfd2lkdGggPSAocGljX3dpZHRoX2luX21ic19taW51czEgKyAxKSAqIDE2O1xuICAgICAgICBsZXQgY29kZWNfaGVpZ2h0ID0gKDIgLSBmcmFtZV9tYnNfb25seV9mbGFnKSAqICgocGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSkgKiAxNik7XG5cbiAgICAgICAgY29kZWNfd2lkdGggLT0gKGZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQgKyBmcmFtZV9jcm9wX3JpZ2h0X29mZnNldCkgKiBjcm9wX3VuaXRfeDtcbiAgICAgICAgY29kZWNfaGVpZ2h0IC09IChmcmFtZV9jcm9wX3RvcF9vZmZzZXQgKyBmcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQpICogY3JvcF91bml0X3k7XG5cbiAgICAgICAgbGV0IHByZXNlbnRfd2lkdGggPSBNYXRoLmNlaWwoY29kZWNfd2lkdGggKiBzYXJTY2FsZSk7XG5cbiAgICAgICAgZ2IuZGVzdHJveSgpO1xuICAgICAgICBnYiA9IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByb2ZpbGVfc3RyaW5nOiBwcm9maWxlX3N0cmluZywgIC8vIGJhc2VsaW5lLCBoaWdoLCBoaWdoMTAsIC4uLlxuICAgICAgICAgICAgbGV2ZWxfc3RyaW5nOiBsZXZlbF9zdHJpbmcsICAvLyAzLCAzLjEsIDQsIDQuMSwgNSwgNS4xLCAuLi5cbiAgICAgICAgICAgIGJpdF9kZXB0aDogYml0X2RlcHRoLCAgLy8gOGJpdCwgMTBiaXQsIC4uLlxuICAgICAgICAgICAgcmVmX2ZyYW1lczogcmVmX2ZyYW1lcyxcbiAgICAgICAgICAgIGNocm9tYV9mb3JtYXQ6IGNocm9tYV9mb3JtYXQsICAvLyA0OjI6MCwgNDoyOjIsIC4uLlxuICAgICAgICAgICAgY2hyb21hX2Zvcm1hdF9zdHJpbmc6IFNQU1BhcnNlci5nZXRDaHJvbWFGb3JtYXRTdHJpbmcoY2hyb21hX2Zvcm1hdCksXG5cbiAgICAgICAgICAgIGZyYW1lX3JhdGU6IHtcbiAgICAgICAgICAgICAgICBmaXhlZDogZnBzX2ZpeGVkLFxuICAgICAgICAgICAgICAgIGZwczogZnBzLFxuICAgICAgICAgICAgICAgIGZwc19kZW46IGZwc19kZW4sXG4gICAgICAgICAgICAgICAgZnBzX251bTogZnBzX251bVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgc2FyX3JhdGlvOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHNhcl93aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHNhcl9oZWlnaHRcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNvZGVjX3NpemU6IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogY29kZWNfd2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBjb2RlY19oZWlnaHRcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHByZXNlbnRfc2l6ZToge1xuICAgICAgICAgICAgICAgIHdpZHRoOiBwcmVzZW50X3dpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogY29kZWNfaGVpZ2h0XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgc3RhdGljIF9za2lwU2NhbGluZ0xpc3QoZ2IsIGNvdW50KSB7XG4gICAgICAgIGxldCBsYXN0X3NjYWxlID0gOCwgbmV4dF9zY2FsZSA9IDg7XG4gICAgICAgIGxldCBkZWx0YV9zY2FsZSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5leHRfc2NhbGUgIT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWx0YV9zY2FsZSA9IGdiLnJlYWRTRUcoKTtcbiAgICAgICAgICAgICAgICBuZXh0X3NjYWxlID0gKGxhc3Rfc2NhbGUgKyBkZWx0YV9zY2FsZSArIDI1NikgJSAyNTY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0X3NjYWxlID0gKG5leHRfc2NhbGUgPT09IDApID8gbGFzdF9zY2FsZSA6IG5leHRfc2NhbGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0UHJvZmlsZVN0cmluZyhwcm9maWxlX2lkYykge1xuICAgICAgICBzd2l0Y2ggKHByb2ZpbGVfaWRjKSB7XG4gICAgICAgICAgICBjYXNlIDY2OlxuICAgICAgICAgICAgICAgIHJldHVybiAnQmFzZWxpbmUnO1xuICAgICAgICAgICAgY2FzZSA3NzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ01haW4nO1xuICAgICAgICAgICAgY2FzZSA4ODpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0V4dGVuZGVkJztcbiAgICAgICAgICAgIGNhc2UgMTAwOlxuICAgICAgICAgICAgICAgIHJldHVybiAnSGlnaCc7XG4gICAgICAgICAgICBjYXNlIDExMDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0hpZ2gxMCc7XG4gICAgICAgICAgICBjYXNlIDEyMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ0hpZ2g0MjInO1xuICAgICAgICAgICAgY2FzZSAyNDQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdIaWdoNDQ0JztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdVbmtub3duJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXRMZXZlbFN0cmluZyhsZXZlbF9pZGMpIHtcbiAgICAgICAgcmV0dXJuIChsZXZlbF9pZGMgLyAxMCkudG9GaXhlZCgxKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0Q2hyb21hRm9ybWF0U3RyaW5nKGNocm9tYSkge1xuICAgICAgICBzd2l0Y2ggKGNocm9tYSkge1xuICAgICAgICAgICAgY2FzZSA0MjA6XG4gICAgICAgICAgICAgICAgcmV0dXJuICc0OjI6MCc7XG4gICAgICAgICAgICBjYXNlIDQyMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gJzQ6MjoyJztcbiAgICAgICAgICAgIGNhc2UgNDQ0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnNDo0OjQnO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1Vua25vd24nO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFNQU1BhcnNlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IFBvbHlmaWxsIGZyb20gJy4vdXRpbHMvcG9seWZpbGwuanMnO1xuaW1wb3J0IEZlYXR1cmVzIGZyb20gJy4vY29yZS9mZWF0dXJlcy5qcyc7XG5pbXBvcnQge0Jhc2VMb2FkZXIsIExvYWRlclN0YXR1cywgTG9hZGVyRXJyb3JzfSBmcm9tICcuL2lvL2xvYWRlci5qcyc7XG5pbXBvcnQgRmx2UGxheWVyIGZyb20gJy4vcGxheWVyL2Zsdi1wbGF5ZXIuanMnO1xuaW1wb3J0IE5hdGl2ZVBsYXllciBmcm9tICcuL3BsYXllci9uYXRpdmUtcGxheWVyLmpzJztcbmltcG9ydCBQbGF5ZXJFdmVudHMgZnJvbSAnLi9wbGF5ZXIvcGxheWVyLWV2ZW50cy5qcyc7XG5pbXBvcnQge0Vycm9yVHlwZXMsIEVycm9yRGV0YWlsc30gZnJvbSAnLi9wbGF5ZXIvcGxheWVyLWVycm9ycy5qcyc7XG5pbXBvcnQgTG9nZ2luZ0NvbnRyb2wgZnJvbSAnLi91dGlscy9sb2dnaW5nLWNvbnRyb2wuanMnO1xuaW1wb3J0IHtJbnZhbGlkQXJndW1lbnRFeGNlcHRpb259IGZyb20gJy4vdXRpbHMvZXhjZXB0aW9uLmpzJztcblxuLy8gaGVyZSBhcmUgYWxsIHRoZSBpbnRlcmZhY2VzXG5cbi8vIGluc3RhbGwgcG9seWZpbGxzXG5Qb2x5ZmlsbC5pbnN0YWxsKCk7XG5cblxuLy8gZmFjdG9yeSBtZXRob2RcbmZ1bmN0aW9uIGNyZWF0ZVBsYXllcihtZWRpYURhdGFTb3VyY2UsIG9wdGlvbmFsQ29uZmlnKSB7XG4gICAgbGV0IG1kcyA9IG1lZGlhRGF0YVNvdXJjZTtcbiAgICBpZiAobWRzID09IG51bGwgfHwgdHlwZW9mIG1kcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignTWVkaWFEYXRhU291cmNlIG11c3QgYmUgYW4gamF2YXNjcmlwdCBvYmplY3QhJyk7XG4gICAgfVxuXG4gICAgaWYgKCFtZHMuaGFzT3duUHJvcGVydHkoJ3R5cGUnKSkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdNZWRpYURhdGFTb3VyY2UgbXVzdCBoYXMgdHlwZSBmaWVsZCB0byBpbmRpY2F0ZSB2aWRlbyBmaWxlIHR5cGUhJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZHMudHlwZSkge1xuICAgICAgICBjYXNlICdmbHYnOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGbHZQbGF5ZXIobWRzLCBvcHRpb25hbENvbmZpZyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVBsYXllcihtZHMsIG9wdGlvbmFsQ29uZmlnKTtcbiAgICB9XG59XG5cblxuLy8gZmVhdHVyZSBkZXRlY3Rpb25cbmZ1bmN0aW9uIGlzU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBGZWF0dXJlcy5zdXBwb3J0TVNFSDI2NFBsYXliYWNrKCk7XG59XG5cbmZ1bmN0aW9uIGdldEZlYXR1cmVMaXN0KCkge1xuICAgIHJldHVybiBGZWF0dXJlcy5nZXRGZWF0dXJlTGlzdCgpO1xufVxuXG5cbi8vIGludGVyZmFjZXNcbmxldCBmbHZqcyA9IHt9O1xuXG5mbHZqcy5jcmVhdGVQbGF5ZXIgPSBjcmVhdGVQbGF5ZXI7XG5mbHZqcy5pc1N1cHBvcnRlZCA9IGlzU3VwcG9ydGVkO1xuZmx2anMuZ2V0RmVhdHVyZUxpc3QgPSBnZXRGZWF0dXJlTGlzdDtcblxuZmx2anMuQmFzZUxvYWRlciA9IEJhc2VMb2FkZXI7XG5mbHZqcy5Mb2FkZXJTdGF0dXMgPSBMb2FkZXJTdGF0dXM7XG5mbHZqcy5Mb2FkZXJFcnJvcnMgPSBMb2FkZXJFcnJvcnM7XG5cbmZsdmpzLkV2ZW50cyA9IFBsYXllckV2ZW50cztcbmZsdmpzLkVycm9yVHlwZXMgPSBFcnJvclR5cGVzO1xuZmx2anMuRXJyb3JEZXRhaWxzID0gRXJyb3JEZXRhaWxzO1xuXG5mbHZqcy5GbHZQbGF5ZXIgPSBGbHZQbGF5ZXI7XG5mbHZqcy5OYXRpdmVQbGF5ZXIgPSBOYXRpdmVQbGF5ZXI7XG5mbHZqcy5Mb2dnaW5nQ29udHJvbCA9IExvZ2dpbmdDb250cm9sO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZmx2anMsICd2ZXJzaW9uJywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHJlcGxhY2VkIGJ5IGJyb3dzZXJpZnktdmVyc2lvbmlmeSB0cmFuc2Zvcm1cbiAgICAgICAgcmV0dXJuICdfX1ZFUlNJT05fXyc7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGZsdmpzOyIsIi8vIGVudHJ5L2luZGV4IGZpbGVcblxuLy8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggYnJvd3NlcmlmeSdzIHVtZCB3cmFwcGVyXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmx2LmpzJykuZGVmYXVsdDtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgTG9nIGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgQnJvd3NlciBmcm9tICcuLi91dGlscy9icm93c2VyLmpzJztcbmltcG9ydCB7QmFzZUxvYWRlciwgTG9hZGVyU3RhdHVzLCBMb2FkZXJFcnJvcnN9IGZyb20gJy4vbG9hZGVyLmpzJztcbmltcG9ydCB7UnVudGltZUV4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvZXhjZXB0aW9uLmpzJztcblxuLyogZmV0Y2ggKyBzdHJlYW0gSU8gbG9hZGVyLiBDdXJyZW50bHkgd29ya2luZyBvbiBjaHJvbWUgNDMrLlxuICogZmV0Y2ggcHJvdmlkZXMgYSBiZXR0ZXIgYWx0ZXJuYXRpdmUgaHR0cCBBUEkgdG8gWE1MSHR0cFJlcXVlc3RcbiAqXG4gKiBmZXRjaCBzcGVjICAgaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvXG4gKiBzdHJlYW0gc3BlYyAgaHR0cHM6Ly9zdHJlYW1zLnNwZWMud2hhdHdnLm9yZy9cbiAqL1xuY2xhc3MgRmV0Y2hTdHJlYW1Mb2FkZXIgZXh0ZW5kcyBCYXNlTG9hZGVyIHtcblxuICAgIHN0YXRpYyBpc1N1cHBvcnRlZCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGZldGNoICsgc3RyZWFtIGlzIGJyb2tlbiBvbiBNaWNyb3NvZnQgRWRnZS4gRGlzYWJsZSBiZWZvcmUgYnVpbGQgMTUwNDguXG4gICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvODE5NjkwNy9cbiAgICAgICAgICAgIC8vIEZpeGVkIGluIEphbiAxMCwgMjAxNy4gQnVpbGQgMTUwNDgrIHJlbW92ZWQgZnJvbSBibGFja2xpc3QuXG4gICAgICAgICAgICBsZXQgaXNXb3JrV2VsbEVkZ2UgPSBCcm93c2VyLm1zZWRnZSAmJiBCcm93c2VyLnZlcnNpb24ubWlub3IgPj0gMTUwNDg7XG4gICAgICAgICAgICBsZXQgYnJvd3Nlck5vdEJsYWNrbGlzdGVkID0gQnJvd3Nlci5tc2VkZ2UgPyBpc1dvcmtXZWxsRWRnZSA6IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gKHNlbGYuZmV0Y2ggJiYgc2VsZi5SZWFkYWJsZVN0cmVhbSAmJiBicm93c2VyTm90QmxhY2tsaXN0ZWQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihzZWVrSGFuZGxlciwgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKCdmZXRjaC1zdHJlYW0tbG9hZGVyJyk7XG4gICAgICAgIHRoaXMuVEFHID0gJ0ZldGNoU3RyZWFtTG9hZGVyJztcblxuICAgICAgICB0aGlzLl9zZWVrSGFuZGxlciA9IHNlZWtIYW5kbGVyO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX25lZWRTdGFzaCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fcmVxdWVzdEFib3J0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsO1xuICAgICAgICB0aGlzLl9yZWNlaXZlZExlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNXb3JraW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgb3BlbihkYXRhU291cmNlLCByYW5nZSkge1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcbiAgICAgICAgdGhpcy5fcmFuZ2UgPSByYW5nZTtcblxuICAgICAgICBsZXQgc291cmNlVVJMID0gZGF0YVNvdXJjZS51cmw7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcucmV1c2VSZWRpcmVjdGVkVVJMICYmIGRhdGFTb3VyY2UucmVkaXJlY3RlZFVSTCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNvdXJjZVVSTCA9IGRhdGFTb3VyY2UucmVkaXJlY3RlZFVSTDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWVrQ29uZmlnID0gdGhpcy5fc2Vla0hhbmRsZXIuZ2V0Q29uZmlnKHNvdXJjZVVSTCwgcmFuZ2UpO1xuXG4gICAgICAgIGxldCBoZWFkZXJzID0gbmV3IHNlbGYuSGVhZGVycygpO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygc2Vla0NvbmZpZy5oZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgbGV0IGNvbmZpZ0hlYWRlcnMgPSBzZWVrQ29uZmlnLmhlYWRlcnM7XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gY29uZmlnSGVhZGVycykge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWdIZWFkZXJzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCBjb25maWdIZWFkZXJzW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXJhbXMgPSB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIG1vZGU6ICdjb3JzJyxcbiAgICAgICAgICAgIGNhY2hlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCBwb2xpY3kgb2YgRmV0Y2ggQVBJIGluIHRoZSB3aGF0d2cgc3RhbmRhcmRcbiAgICAgICAgICAgIC8vIFNhZmFyaSBpbmNvcnJlY3RseSBpbmRpY2F0ZXMgJ25vLXJlZmVycmVyJyBhcyBkZWZhdWx0IHBvbGljeSwgZnVjayBpdFxuICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlci13aGVuLWRvd25ncmFkZSdcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBhZGQgYWRkaXRpb25hbCBoZWFkZXJzXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLmhlYWRlcnMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5fY29uZmlnLmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzLmFwcGVuZChrZXksIHRoaXMuX2NvbmZpZy5oZWFkZXJzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29ycyBpcyBlbmFibGVkIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKGRhdGFTb3VyY2UuY29ycyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIG5vLWNvcnMgbWVhbnMgJ2Rpc3JlZ2FyZCBjb3JzIHBvbGljeScsIHdoaWNoIGNhbiBvbmx5IGJlIHVzZWQgaW4gU2VydmljZVdvcmtlclxuICAgICAgICAgICAgcGFyYW1zLm1vZGUgPSAnc2FtZS1vcmlnaW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2l0aENyZWRlbnRpYWxzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKGRhdGFTb3VyY2Uud2l0aENyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICBwYXJhbXMuY3JlZGVudGlhbHMgPSAnaW5jbHVkZSc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZWZlcnJlclBvbGljeSBmcm9tIGNvbmZpZ1xuICAgICAgICBpZiAoZGF0YVNvdXJjZS5yZWZlcnJlclBvbGljeSkge1xuICAgICAgICAgICAgcGFyYW1zLnJlZmVycmVyUG9saWN5ID0gZGF0YVNvdXJjZS5yZWZlcnJlclBvbGljeTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rQ29ubmVjdGluZztcbiAgICAgICAgc2VsZi5mZXRjaChzZWVrQ29uZmlnLnVybCwgcGFyYW1zKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0QWJvcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0QWJvcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0lkbGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlcy5vayAmJiAocmVzLnN0YXR1cyA+PSAyMDAgJiYgcmVzLnN0YXR1cyA8PSAyOTkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcy51cmwgIT09IHNlZWtDb25maWcudXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vblVSTFJlZGlyZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVkaXJlY3RlZFVSTCA9IHRoaXMuX3NlZWtIYW5kbGVyLnJlbW92ZVVSTFBhcmFtZXRlcnMocmVzLnVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblVSTFJlZGlyZWN0KHJlZGlyZWN0ZWRVUkwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGxlbmd0aEhlYWRlciA9IHJlcy5oZWFkZXJzLmdldCgnQ29udGVudC1MZW5ndGgnKTtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoSGVhZGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IHBhcnNlSW50KGxlbmd0aEhlYWRlcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb250ZW50TGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fb25Db250ZW50TGVuZ3RoS25vd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNvbnRlbnRMZW5ndGhLbm93bih0aGlzLl9jb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wdW1wLmNhbGwodGhpcywgcmVzLmJvZHkuZ2V0UmVhZGVyKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0Vycm9yO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoTG9hZGVyRXJyb3JzLkhUVFBfU1RBVFVTX0NPREVfSU5WQUxJRCwge2NvZGU6IHJlcy5zdGF0dXMsIG1zZzogcmVzLnN0YXR1c1RleHR9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignRmV0Y2hTdHJlYW1Mb2FkZXI6IEh0dHAgY29kZSBpbnZhbGlkLCAnICsgcmVzLnN0YXR1cyArICcgJyArIHJlcy5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0Vycm9yO1xuICAgICAgICAgICAgaWYgKHRoaXMuX29uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkVycm9yKExvYWRlckVycm9ycy5FWENFUFRJT04sIHtjb2RlOiAtMSwgbXNnOiBlLm1lc3NhZ2V9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWJvcnQoKSB7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RBYm9ydCA9IHRydWU7XG4gICAgfVxuXG4gICAgX3B1bXAocmVhZGVyKSB7ICAvLyBSZWFkYWJsZVN0cmVhbVJlYWRlclxuICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQoKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIHJlY2VpdmVkIGxlbmd0aFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb250ZW50TGVuZ3RoICE9PSBudWxsICYmIHRoaXMuX3JlY2VpdmVkTGVuZ3RoIDwgdGhpcy5fY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXBvcnQgRWFybHktRU9GXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rRXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gTG9hZGVyRXJyb3JzLkVBUkxZX0VPRjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZm8gPSB7Y29kZTogLTEsIG1zZzogJ0ZldGNoIHN0cmVhbSBtZWV0IEVhcmx5LUVPRid9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25FcnJvcih0eXBlLCBpbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGluZm8ubXNnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9LLiBEb3dubG9hZCBjb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0NvbXBsZXRlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fb25Db21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25Db21wbGV0ZSh0aGlzLl9yYW5nZS5mcm9tLCB0aGlzLl9yYW5nZS5mcm9tICsgdGhpcy5fcmVjZWl2ZWRMZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3RBYm9ydCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0QWJvcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtDb21wbGV0ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5jYW5jZWwoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0J1ZmZlcmluZztcblxuICAgICAgICAgICAgICAgIGxldCBjaHVuayA9IHJlc3VsdC52YWx1ZS5idWZmZXI7XG4gICAgICAgICAgICAgICAgbGV0IGJ5dGVTdGFydCA9IHRoaXMuX3JhbmdlLmZyb20gKyB0aGlzLl9yZWNlaXZlZExlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWNlaXZlZExlbmd0aCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX29uRGF0YUFycml2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25EYXRhQXJyaXZhbChjaHVuaywgYnl0ZVN0YXJ0LCB0aGlzLl9yZWNlaXZlZExlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fcHVtcChyZWFkZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuY29kZSA9PT0gMTEgJiYgQnJvd3Nlci5tc2VkZ2UpIHsgIC8vIEludmFsaWRTdGF0ZUVycm9yIG9uIE1pY3Jvc29mdCBFZGdlXG4gICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZDogRWRnZSBtYXkgdGhyb3cgSW52YWxpZFN0YXRlRXJyb3IgYWZ0ZXIgUmVhZGFibGVTdHJlYW1SZWFkZXIuY2FuY2VsKCkgY2FsbFxuICAgICAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgdW5rbm93biBleGNlcHRpb24uXG4gICAgICAgICAgICAgICAgLy8gUmVsYXRlZCBpc3N1ZTogaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTEyNjUyMDIvXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0Vycm9yO1xuICAgICAgICAgICAgbGV0IHR5cGUgPSAwO1xuICAgICAgICAgICAgbGV0IGluZm8gPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoKGUuY29kZSA9PT0gMTkgfHwgZS5tZXNzYWdlID09PSAnbmV0d29yayBlcnJvcicpICYmIC8vIE5FVFdPUktfRVJSXG4gICAgICAgICAgICAgICAgKHRoaXMuX2NvbnRlbnRMZW5ndGggPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAodGhpcy5fY29udGVudExlbmd0aCAhPT0gbnVsbCAmJiB0aGlzLl9yZWNlaXZlZExlbmd0aCA8IHRoaXMuX2NvbnRlbnRMZW5ndGgpKSkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSBMb2FkZXJFcnJvcnMuRUFSTFlfRU9GO1xuICAgICAgICAgICAgICAgIGluZm8gPSB7Y29kZTogZS5jb2RlLCBtc2c6ICdGZXRjaCBzdHJlYW0gbWVldCBFYXJseS1FT0YnfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHlwZSA9IExvYWRlckVycm9ycy5FWENFUFRJT047XG4gICAgICAgICAgICAgICAgaW5mbyA9IHtjb2RlOiBlLmNvZGUsIG1zZzogZS5tZXNzYWdlfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX29uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkVycm9yKHR5cGUsIGluZm8pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpbmZvLm1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBGZXRjaFN0cmVhbUxvYWRlcjtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgTG9nIGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgU3BlZWRTYW1wbGVyIGZyb20gJy4vc3BlZWQtc2FtcGxlci5qcyc7XG5pbXBvcnQge0xvYWRlclN0YXR1cywgTG9hZGVyRXJyb3JzfSBmcm9tICcuL2xvYWRlci5qcyc7XG5pbXBvcnQgRmV0Y2hTdHJlYW1Mb2FkZXIgZnJvbSAnLi9mZXRjaC1zdHJlYW0tbG9hZGVyLmpzJztcbmltcG9ydCBNb3pDaHVua2VkTG9hZGVyIGZyb20gJy4veGhyLW1vei1jaHVua2VkLWxvYWRlci5qcyc7XG5pbXBvcnQgTVNTdHJlYW1Mb2FkZXIgZnJvbSAnLi94aHItbXNzdHJlYW0tbG9hZGVyLmpzJztcbmltcG9ydCBSYW5nZUxvYWRlciBmcm9tICcuL3hoci1yYW5nZS1sb2FkZXIuanMnO1xuaW1wb3J0IFdlYlNvY2tldExvYWRlciBmcm9tICcuL3dlYnNvY2tldC1sb2FkZXIuanMnO1xuaW1wb3J0IFJhbmdlU2Vla0hhbmRsZXIgZnJvbSAnLi9yYW5nZS1zZWVrLWhhbmRsZXIuanMnO1xuaW1wb3J0IFBhcmFtU2Vla0hhbmRsZXIgZnJvbSAnLi9wYXJhbS1zZWVrLWhhbmRsZXIuanMnO1xuaW1wb3J0IHtSdW50aW1lRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvZXhjZXB0aW9uLmpzJztcblxuLyoqXG4gKiBEYXRhU291cmNlOiB7XG4gKiAgICAgdXJsOiBzdHJpbmcsXG4gKiAgICAgZmlsZXNpemU6IG51bWJlcixcbiAqICAgICBjb3JzOiBib29sZWFuLFxuICogICAgIHdpdGhDcmVkZW50aWFsczogYm9vbGVhblxuICogfVxuICogXG4gKi9cblxuLy8gTWFuYWdlIElPIExvYWRlcnNcbmNsYXNzIElPQ29udHJvbGxlciB7XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhU291cmNlLCBjb25maWcsIGV4dHJhRGF0YSkge1xuICAgICAgICB0aGlzLlRBRyA9ICdJT0NvbnRyb2xsZXInO1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5fZXh0cmFEYXRhID0gZXh0cmFEYXRhO1xuXG4gICAgICAgIHRoaXMuX3N0YXNoSW5pdGlhbFNpemUgPSAxMDI0ICogMzg0OyAgLy8gZGVmYXVsdCBpbml0aWFsIHNpemU6IDM4NEtCXG4gICAgICAgIGlmIChjb25maWcuc3Rhc2hJbml0aWFsU2l6ZSAhPSB1bmRlZmluZWQgJiYgY29uZmlnLnN0YXNoSW5pdGlhbFNpemUgPiAwKSB7XG4gICAgICAgICAgICAvLyBhcHBseSBmcm9tIGNvbmZpZ1xuICAgICAgICAgICAgdGhpcy5fc3Rhc2hJbml0aWFsU2l6ZSA9IGNvbmZpZy5zdGFzaEluaXRpYWxTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3Rhc2hVc2VkID0gMDtcbiAgICAgICAgdGhpcy5fc3Rhc2hTaXplID0gdGhpcy5fc3Rhc2hJbml0aWFsU2l6ZTtcbiAgICAgICAgdGhpcy5fYnVmZmVyU2l6ZSA9IDEwMjQgKiAxMDI0ICogMzsgIC8vIGluaXRpYWwgc2l6ZTogM01CXG4gICAgICAgIHRoaXMuX3N0YXNoQnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuX2J1ZmZlclNpemUpO1xuICAgICAgICB0aGlzLl9zdGFzaEJ5dGVTdGFydCA9IDA7XG4gICAgICAgIHRoaXMuX2VuYWJsZVN0YXNoID0gdHJ1ZTtcbiAgICAgICAgaWYgKGNvbmZpZy5lbmFibGVTdGFzaEJ1ZmZlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2VuYWJsZVN0YXNoID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2FkZXIgPSBudWxsO1xuICAgICAgICB0aGlzLl9sb2FkZXJDbGFzcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NlZWtIYW5kbGVyID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcbiAgICAgICAgdGhpcy5faXNXZWJTb2NrZXRVUkwgPSAvd3NzPzpcXC9cXC8oLis/KS8udGVzdChkYXRhU291cmNlLnVybCk7XG4gICAgICAgIHRoaXMuX3JlZlRvdGFsTGVuZ3RoID0gZGF0YVNvdXJjZS5maWxlc2l6ZSA/IGRhdGFTb3VyY2UuZmlsZXNpemUgOiBudWxsO1xuICAgICAgICB0aGlzLl90b3RhbExlbmd0aCA9IHRoaXMuX3JlZlRvdGFsTGVuZ3RoO1xuICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdEZsYWcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY3VycmVudFJhbmdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmVkaXJlY3RlZFVSTCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fc3BlZWROb3JtYWxpemVkID0gMDtcbiAgICAgICAgdGhpcy5fc3BlZWRTYW1wbGVyID0gbmV3IFNwZWVkU2FtcGxlcigpO1xuICAgICAgICB0aGlzLl9zcGVlZE5vcm1hbGl6ZUxpc3QgPSBbNjQsIDEyOCwgMjU2LCAzODQsIDUxMiwgNzY4LCAxMDI0LCAxNTM2LCAyMDQ4LCAzMDcyLCA0MDk2XTtcblxuICAgICAgICB0aGlzLl9pc0Vhcmx5RW9mUmVjb25uZWN0aW5nID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3Jlc3VtZUZyb20gPSAwO1xuXG4gICAgICAgIHRoaXMuX29uRGF0YUFycml2YWwgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblNlZWtlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uRXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbkNvbXBsZXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25SZWRpcmVjdCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uUmVjb3ZlcmVkRWFybHlFb2YgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3NlbGVjdFNlZWtIYW5kbGVyKCk7XG4gICAgICAgIHRoaXMuX3NlbGVjdExvYWRlcigpO1xuICAgICAgICB0aGlzLl9jcmVhdGVMb2FkZXIoKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5fbG9hZGVyLmlzV29ya2luZygpKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZXIuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9sb2FkZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLl9sb2FkZXIgPSBudWxsO1xuICAgICAgICB0aGlzLl9sb2FkZXJDbGFzcyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBudWxsO1xuICAgICAgICB0aGlzLl9zdGFzaEJ1ZmZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX3N0YXNoVXNlZCA9IHRoaXMuX3N0YXNoU2l6ZSA9IHRoaXMuX2J1ZmZlclNpemUgPSB0aGlzLl9zdGFzaEJ5dGVTdGFydCA9IDA7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRSYW5nZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NwZWVkU2FtcGxlciA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5faXNFYXJseUVvZlJlY29ubmVjdGluZyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX29uRGF0YUFycml2YWwgPSBudWxsO1xuICAgICAgICB0aGlzLl9vblNlZWtlZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uRXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbkNvbXBsZXRlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25SZWRpcmVjdCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uUmVjb3ZlcmVkRWFybHlFb2YgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX2V4dHJhRGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgaXNXb3JraW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZGVyICYmIHRoaXMuX2xvYWRlci5pc1dvcmtpbmcoKSAmJiAhdGhpcy5fcGF1c2VkO1xuICAgIH1cblxuICAgIGlzUGF1c2VkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGF1c2VkO1xuICAgIH1cblxuICAgIGdldCBzdGF0dXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZXIuc3RhdHVzO1xuICAgIH1cblxuICAgIGdldCBleHRyYURhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9leHRyYURhdGE7XG4gICAgfVxuXG4gICAgc2V0IGV4dHJhRGF0YShkYXRhKSB7XG4gICAgICAgIHRoaXMuX2V4dHJhRGF0YSA9IGRhdGE7XG4gICAgfVxuXG4gICAgLy8gcHJvdG90eXBlOiBmdW5jdGlvbiBvbkRhdGFBcnJpdmFsKGNodW5rczogQXJyYXlCdWZmZXIsIGJ5dGVTdGFydDogbnVtYmVyKTogbnVtYmVyXG4gICAgZ2V0IG9uRGF0YUFycml2YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbkRhdGFBcnJpdmFsO1xuICAgIH1cblxuICAgIHNldCBvbkRhdGFBcnJpdmFsKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uRGF0YUFycml2YWwgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBnZXQgb25TZWVrZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vblNlZWtlZDtcbiAgICB9XG5cbiAgICBzZXQgb25TZWVrZWQoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25TZWVrZWQgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICAvLyBwcm90b3R5cGU6IGZ1bmN0aW9uIG9uRXJyb3IodHlwZTogbnVtYmVyLCBpbmZvOiB7Y29kZTogbnVtYmVyLCBtc2c6IHN0cmluZ30pOiB2b2lkXG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbkVycm9yO1xuICAgIH1cblxuICAgIHNldCBvbkVycm9yKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uRXJyb3IgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBnZXQgb25Db21wbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uQ29tcGxldGU7XG4gICAgfVxuXG4gICAgc2V0IG9uQ29tcGxldGUoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25Db21wbGV0ZSA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGdldCBvblJlZGlyZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25SZWRpcmVjdDtcbiAgICB9XG5cbiAgICBzZXQgb25SZWRpcmVjdChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vblJlZGlyZWN0ID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZ2V0IG9uUmVjb3ZlcmVkRWFybHlFb2YoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vblJlY292ZXJlZEVhcmx5RW9mO1xuICAgIH1cblxuICAgIHNldCBvblJlY292ZXJlZEVhcmx5RW9mKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uUmVjb3ZlcmVkRWFybHlFb2YgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBnZXQgY3VycmVudFVSTCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2UudXJsO1xuICAgIH1cblxuICAgIGdldCBoYXNSZWRpcmVjdCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9yZWRpcmVjdGVkVVJMICE9IG51bGwgfHwgdGhpcy5fZGF0YVNvdXJjZS5yZWRpcmVjdGVkVVJMICE9IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgZ2V0IGN1cnJlbnRSZWRpcmVjdGVkVVJMKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVkaXJlY3RlZFVSTCB8fCB0aGlzLl9kYXRhU291cmNlLnJlZGlyZWN0ZWRVUkw7XG4gICAgfVxuXG4gICAgLy8gaW4gS0Ivc1xuICAgIGdldCBjdXJyZW50U3BlZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9sb2FkZXJDbGFzcyA9PT0gUmFuZ2VMb2FkZXIpIHtcbiAgICAgICAgICAgIC8vIFNwZWVkU2FtcGxlciBpcyBpbmFjY3VyYWN5IGlmIGxvYWRlciBpcyBSYW5nZUxvYWRlclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlci5jdXJyZW50U3BlZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NwZWVkU2FtcGxlci5sYXN0U2Vjb25kS0JwcztcbiAgICB9XG5cbiAgICBnZXQgbG9hZGVyVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRlci50eXBlO1xuICAgIH1cblxuICAgIF9zZWxlY3RTZWVrSGFuZGxlcigpIHtcbiAgICAgICAgbGV0IGNvbmZpZyA9IHRoaXMuX2NvbmZpZztcblxuICAgICAgICBpZiAoY29uZmlnLnNlZWtUeXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWVrSGFuZGxlciA9IG5ldyBSYW5nZVNlZWtIYW5kbGVyKHRoaXMuX2NvbmZpZy5yYW5nZUxvYWRaZXJvU3RhcnQpO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy5zZWVrVHlwZSA9PT0gJ3BhcmFtJykge1xuICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSBjb25maWcuc2Vla1BhcmFtU3RhcnQgfHwgJ2JzdGFydCc7XG4gICAgICAgICAgICBsZXQgcGFyYW1FbmQgPSBjb25maWcuc2Vla1BhcmFtRW5kIHx8ICdiZW5kJztcblxuICAgICAgICAgICAgdGhpcy5fc2Vla0hhbmRsZXIgPSBuZXcgUGFyYW1TZWVrSGFuZGxlcihwYXJhbVN0YXJ0LCBwYXJhbUVuZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnNlZWtUeXBlID09PSAnY3VzdG9tJykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcuY3VzdG9tU2Vla0hhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdDdXN0b20gc2Vla1R5cGUgc3BlY2lmaWVkIGluIGNvbmZpZyBidXQgaW52YWxpZCBjdXN0b21TZWVrSGFuZGxlciEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NlZWtIYW5kbGVyID0gbmV3IGNvbmZpZy5jdXN0b21TZWVrSGFuZGxlcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihgSW52YWxpZCBzZWVrVHlwZSBpbiBjb25maWc6ICR7Y29uZmlnLnNlZWtUeXBlfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3NlbGVjdExvYWRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5jdXN0b21Mb2FkZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVyQ2xhc3MgPSB0aGlzLl9jb25maWcuY3VzdG9tTG9hZGVyO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2lzV2ViU29ja2V0VVJMKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZXJDbGFzcyA9IFdlYlNvY2tldExvYWRlcjtcbiAgICAgICAgfSBlbHNlIGlmIChGZXRjaFN0cmVhbUxvYWRlci5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2FkZXJDbGFzcyA9IEZldGNoU3RyZWFtTG9hZGVyO1xuICAgICAgICB9IGVsc2UgaWYgKE1vekNodW5rZWRMb2FkZXIuaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVyQ2xhc3MgPSBNb3pDaHVua2VkTG9hZGVyO1xuICAgICAgICB9IGVsc2UgaWYgKFJhbmdlTG9hZGVyLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRlckNsYXNzID0gUmFuZ2VMb2FkZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignWW91ciBicm93c2VyIGRvZXNuXFwndCBzdXBwb3J0IHhociB3aXRoIGFycmF5YnVmZmVyIHJlc3BvbnNlVHlwZSEnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jcmVhdGVMb2FkZXIoKSB7XG4gICAgICAgIHRoaXMuX2xvYWRlciA9IG5ldyB0aGlzLl9sb2FkZXJDbGFzcyh0aGlzLl9zZWVrSGFuZGxlciwgdGhpcy5fY29uZmlnKTtcbiAgICAgICAgaWYgKHRoaXMuX2xvYWRlci5uZWVkU3Rhc2hCdWZmZXIgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLl9lbmFibGVTdGFzaCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xvYWRlci5vbkNvbnRlbnRMZW5ndGhLbm93biA9IHRoaXMuX29uQ29udGVudExlbmd0aEtub3duLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuX2xvYWRlci5vblVSTFJlZGlyZWN0ID0gdGhpcy5fb25VUkxSZWRpcmVjdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9sb2FkZXIub25EYXRhQXJyaXZhbCA9IHRoaXMuX29uTG9hZGVyQ2h1bmtBcnJpdmFsLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuX2xvYWRlci5vbkNvbXBsZXRlID0gdGhpcy5fb25Mb2FkZXJDb21wbGV0ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl9sb2FkZXIub25FcnJvciA9IHRoaXMuX29uTG9hZGVyRXJyb3IuYmluZCh0aGlzKTtcbiAgICB9XG5cbiAgICBvcGVuKG9wdGlvbmFsRnJvbSkge1xuICAgICAgICB0aGlzLl9jdXJyZW50UmFuZ2UgPSB7ZnJvbTogMCwgdG86IC0xfTtcbiAgICAgICAgaWYgKG9wdGlvbmFsRnJvbSkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFJhbmdlLmZyb20gPSBvcHRpb25hbEZyb207XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zcGVlZFNhbXBsZXIucmVzZXQoKTtcbiAgICAgICAgaWYgKCFvcHRpb25hbEZyb20pIHtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxSZXF1ZXN0RmxhZyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb2FkZXIub3Blbih0aGlzLl9kYXRhU291cmNlLCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jdXJyZW50UmFuZ2UpKTtcbiAgICB9XG5cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5fbG9hZGVyLmFib3J0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BhdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5fcGF1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9yZXN1bWVGcm9tID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhdXNlKCkge1xuICAgICAgICBpZiAodGhpcy5pc1dvcmtpbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVyLmFib3J0KCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGFzaFVzZWQgIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXN1bWVGcm9tID0gdGhpcy5fc3Rhc2hCeXRlU3RhcnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFJhbmdlLnRvID0gdGhpcy5fc3Rhc2hCeXRlU3RhcnQgLSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXN1bWVGcm9tID0gdGhpcy5fY3VycmVudFJhbmdlLnRvICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3N0YXNoVXNlZCA9IDA7XG4gICAgICAgICAgICB0aGlzLl9zdGFzaEJ5dGVTdGFydCA9IDA7XG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzdW1lKCkge1xuICAgICAgICBpZiAodGhpcy5fcGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9wYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBieXRlcyA9IHRoaXMuX3Jlc3VtZUZyb207XG4gICAgICAgICAgICB0aGlzLl9yZXN1bWVGcm9tID0gMDtcbiAgICAgICAgICAgIHRoaXMuX2ludGVybmFsU2VlayhieXRlcywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWVrKGJ5dGVzKSB7XG4gICAgICAgIHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9zdGFzaFVzZWQgPSAwO1xuICAgICAgICB0aGlzLl9zdGFzaEJ5dGVTdGFydCA9IDA7XG4gICAgICAgIHRoaXMuX2ludGVybmFsU2VlayhieXRlcywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiBzZWVraW5nIHJlcXVlc3QgaXMgZnJvbSBtZWRpYSBzZWVraW5nLCB1bmNvbnN1bWVkIHN0YXNoIGRhdGEgc2hvdWxkIGJlIGRyb3BwZWRcbiAgICAgKiBIb3dldmVyLCBzdGFzaCBkYXRhIHNob3VsZG4ndCBiZSBkcm9wcGVkIGlmIHNlZWtpbmcgcmVxdWVzdGVkIGZyb20gaHR0cCByZWNvbm5lY3Rpb25cbiAgICAgKlxuICAgICAqIEBkcm9wVW5jb25zdW1lZDogSWdub3JlIGFuZCBkaXNjYXJkIGFsbCB1bmNvbnN1bWVkIGRhdGEgaW4gc3Rhc2ggYnVmZmVyXG4gICAgICovXG4gICAgX2ludGVybmFsU2VlayhieXRlcywgZHJvcFVuY29uc3VtZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xvYWRlci5pc1dvcmtpbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGVyLmFib3J0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkaXNwYXRjaCAmIGZsdXNoIHN0YXNoIGJ1ZmZlciBiZWZvcmUgc2Vla1xuICAgICAgICB0aGlzLl9mbHVzaFN0YXNoQnVmZmVyKGRyb3BVbmNvbnN1bWVkKTtcblxuICAgICAgICB0aGlzLl9sb2FkZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLl9sb2FkZXIgPSBudWxsO1xuXG4gICAgICAgIGxldCByZXF1ZXN0UmFuZ2UgPSB7ZnJvbTogYnl0ZXMsIHRvOiAtMX07XG4gICAgICAgIHRoaXMuX2N1cnJlbnRSYW5nZSA9IHtmcm9tOiByZXF1ZXN0UmFuZ2UuZnJvbSwgdG86IC0xfTtcblxuICAgICAgICB0aGlzLl9zcGVlZFNhbXBsZXIucmVzZXQoKTtcbiAgICAgICAgdGhpcy5fc3Rhc2hTaXplID0gdGhpcy5fc3Rhc2hJbml0aWFsU2l6ZTtcbiAgICAgICAgdGhpcy5fY3JlYXRlTG9hZGVyKCk7XG4gICAgICAgIHRoaXMuX2xvYWRlci5vcGVuKHRoaXMuX2RhdGFTb3VyY2UsIHJlcXVlc3RSYW5nZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX29uU2Vla2VkKSB7XG4gICAgICAgICAgICB0aGlzLl9vblNlZWtlZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlVXJsKHVybCkge1xuICAgICAgICBpZiAoIXVybCB8fCB0eXBlb2YgdXJsICE9PSAnc3RyaW5nJyB8fCB1cmwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdVcmwgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmchJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kYXRhU291cmNlLnVybCA9IHVybDtcblxuICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHdpdGggbmV3IHVybFxuICAgIH1cblxuICAgIF9leHBhbmRCdWZmZXIoZXhwZWN0ZWRCeXRlcykge1xuICAgICAgICBsZXQgYnVmZmVyTmV3U2l6ZSA9IHRoaXMuX3N0YXNoU2l6ZTtcbiAgICAgICAgd2hpbGUgKGJ1ZmZlck5ld1NpemUgKyAxMDI0ICogMTAyNCAqIDEgPCBleHBlY3RlZEJ5dGVzKSB7XG4gICAgICAgICAgICBidWZmZXJOZXdTaXplICo9IDI7XG4gICAgICAgIH1cblxuICAgICAgICBidWZmZXJOZXdTaXplICs9IDEwMjQgKiAxMDI0ICogMTsgIC8vIGJ1ZmZlclNpemUgPSBzdGFzaFNpemUgKyAxTUJcbiAgICAgICAgaWYgKGJ1ZmZlck5ld1NpemUgPT09IHRoaXMuX2J1ZmZlclNpemUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuZXdCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnVmZmVyTmV3U2l6ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3N0YXNoVXNlZCA+IDApIHsgIC8vIGNvcHkgZXhpc3RpbmcgZGF0YSBpbnRvIG5ldyBidWZmZXJcbiAgICAgICAgICAgIGxldCBzdGFzaE9sZEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fc3Rhc2hCdWZmZXIsIDAsIHRoaXMuX3N0YXNoVXNlZCk7XG4gICAgICAgICAgICBsZXQgc3Rhc2hOZXdBcnJheSA9IG5ldyBVaW50OEFycmF5KG5ld0J1ZmZlciwgMCwgYnVmZmVyTmV3U2l6ZSk7XG4gICAgICAgICAgICBzdGFzaE5ld0FycmF5LnNldChzdGFzaE9sZEFycmF5LCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3N0YXNoQnVmZmVyID0gbmV3QnVmZmVyO1xuICAgICAgICB0aGlzLl9idWZmZXJTaXplID0gYnVmZmVyTmV3U2l6ZTtcbiAgICB9XG5cbiAgICBfbm9ybWFsaXplU3BlZWQoaW5wdXQpIHtcbiAgICAgICAgbGV0IGxpc3QgPSB0aGlzLl9zcGVlZE5vcm1hbGl6ZUxpc3Q7XG4gICAgICAgIGxldCBsYXN0ID0gbGlzdC5sZW5ndGggLSAxO1xuICAgICAgICBsZXQgbWlkID0gMDtcbiAgICAgICAgbGV0IGxib3VuZCA9IDA7XG4gICAgICAgIGxldCB1Ym91bmQgPSBsYXN0O1xuXG4gICAgICAgIGlmIChpbnB1dCA8IGxpc3RbMF0pIHtcbiAgICAgICAgICAgIHJldHVybiBsaXN0WzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYmluYXJ5IHNlYXJjaFxuICAgICAgICB3aGlsZSAobGJvdW5kIDw9IHVib3VuZCkge1xuICAgICAgICAgICAgbWlkID0gbGJvdW5kICsgTWF0aC5mbG9vcigodWJvdW5kIC0gbGJvdW5kKSAvIDIpO1xuICAgICAgICAgICAgaWYgKG1pZCA9PT0gbGFzdCB8fCAoaW5wdXQgPj0gbGlzdFttaWRdICYmIGlucHV0IDwgbGlzdFttaWQgKyAxXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGlzdFttaWRdO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsaXN0W21pZF0gPCBpbnB1dCkge1xuICAgICAgICAgICAgICAgIGxib3VuZCA9IG1pZCArIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVib3VuZCA9IG1pZCAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYWRqdXN0U3Rhc2hTaXplKG5vcm1hbGl6ZWQpIHtcbiAgICAgICAgbGV0IHN0YXNoU2l6ZUtCID0gMDtcblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmlzTGl2ZSkge1xuICAgICAgICAgICAgLy8gbGl2ZSBzdHJlYW06IGFsd2F5cyB1c2Ugc2luZ2xlIG5vcm1hbGl6ZWQgc3BlZWQgZm9yIHNpemUgb2Ygc3Rhc2hTaXplS0JcbiAgICAgICAgICAgIHN0YXNoU2l6ZUtCID0gbm9ybWFsaXplZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkIDwgNTEyKSB7XG4gICAgICAgICAgICAgICAgc3Rhc2hTaXplS0IgPSBub3JtYWxpemVkO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkID49IDUxMiAmJiBub3JtYWxpemVkIDw9IDEwMjQpIHtcbiAgICAgICAgICAgICAgICBzdGFzaFNpemVLQiA9IE1hdGguZmxvb3Iobm9ybWFsaXplZCAqIDEuNSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXNoU2l6ZUtCID0gbm9ybWFsaXplZCAqIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3Rhc2hTaXplS0IgPiA4MTkyKSB7XG4gICAgICAgICAgICBzdGFzaFNpemVLQiA9IDgxOTI7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnVmZmVyU2l6ZSA9IHN0YXNoU2l6ZUtCICogMTAyNCArIDEwMjQgKiAxMDI0ICogMTsgIC8vIHN0YXNoU2l6ZSArIDFNQlxuICAgICAgICBpZiAodGhpcy5fYnVmZmVyU2l6ZSA8IGJ1ZmZlclNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuX2V4cGFuZEJ1ZmZlcihidWZmZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGFzaFNpemUgPSBzdGFzaFNpemVLQiAqIDEwMjQ7XG4gICAgfVxuXG4gICAgX2Rpc3BhdGNoQ2h1bmtzKGNodW5rcywgYnl0ZVN0YXJ0KSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRSYW5nZS50byA9IGJ5dGVTdGFydCArIGNodW5rcy5ieXRlTGVuZ3RoIC0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YUFycml2YWwoY2h1bmtzLCBieXRlU3RhcnQpO1xuICAgIH1cblxuICAgIF9vblVSTFJlZGlyZWN0KHJlZGlyZWN0ZWRVUkwpIHtcbiAgICAgICAgdGhpcy5fcmVkaXJlY3RlZFVSTCA9IHJlZGlyZWN0ZWRVUkw7XG4gICAgICAgIGlmICh0aGlzLl9vblJlZGlyZWN0KSB7XG4gICAgICAgICAgICB0aGlzLl9vblJlZGlyZWN0KHJlZGlyZWN0ZWRVUkwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uQ29udGVudExlbmd0aEtub3duKGNvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggJiYgdGhpcy5fZnVsbFJlcXVlc3RGbGFnKSB7XG4gICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCA9IGNvbnRlbnRMZW5ndGg7XG4gICAgICAgICAgICB0aGlzLl9mdWxsUmVxdWVzdEZsYWcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbkxvYWRlckNodW5rQXJyaXZhbChjaHVuaywgYnl0ZVN0YXJ0LCByZWNlaXZlZExlbmd0aCkge1xuICAgICAgICBpZiAoIXRoaXMuX29uRGF0YUFycml2YWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oJ0lPQ29udHJvbGxlcjogTm8gZXhpc3RpbmcgY29uc3VtZXIgKG9uRGF0YUFycml2YWwpIGNhbGxiYWNrIScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9wYXVzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faXNFYXJseUVvZlJlY29ubmVjdGluZykge1xuICAgICAgICAgICAgLy8gQXV0by1yZWNvbm5lY3QgZm9yIEVhcmx5RW9mIHN1Y2NlZWQsIG5vdGlmeSB0byB1cHBlci1sYXllciBieSBjYWxsYmFja1xuICAgICAgICAgICAgdGhpcy5faXNFYXJseUVvZlJlY29ubmVjdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX29uUmVjb3ZlcmVkRWFybHlFb2YpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vblJlY292ZXJlZEVhcmx5RW9mKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zcGVlZFNhbXBsZXIuYWRkQnl0ZXMoY2h1bmsuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgLy8gYWRqdXN0IHN0YXNoIGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBuZXR3b3JrIHNwZWVkIGR5bmFtaWNhbGx5XG4gICAgICAgIGxldCBLQnBzID0gdGhpcy5fc3BlZWRTYW1wbGVyLmxhc3RTZWNvbmRLQnBzO1xuICAgICAgICBpZiAoS0JwcyAhPT0gMCkge1xuICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWQgPSB0aGlzLl9ub3JtYWxpemVTcGVlZChLQnBzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zcGVlZE5vcm1hbGl6ZWQgIT09IG5vcm1hbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zcGVlZE5vcm1hbGl6ZWQgPSBub3JtYWxpemVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2FkanVzdFN0YXNoU2l6ZShub3JtYWxpemVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fZW5hYmxlU3Rhc2gpIHsgIC8vIGRpc2FibGUgc3Rhc2hcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGFzaFVzZWQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBkaXNwYXRjaCBjaHVuayBkaXJlY3RseSB0byBjb25zdW1lcjtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayByZXQgdmFsdWUgKGNvbnN1bWVkIGJ5dGVzKSBhbmQgc3Rhc2ggdW5jb25zdW1lZCB0byBzdGFzaEJ1ZmZlclxuICAgICAgICAgICAgICAgIGxldCBjb25zdW1lZCA9IHRoaXMuX2Rpc3BhdGNoQ2h1bmtzKGNodW5rLCBieXRlU3RhcnQpO1xuICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCA8IGNodW5rLmJ5dGVMZW5ndGgpIHsgIC8vIHVuY29uc3VtZWQgZGF0YSByZW1haW4uXG4gICAgICAgICAgICAgICAgICAgIGxldCByZW1haW4gPSBjaHVuay5ieXRlTGVuZ3RoIC0gY29uc3VtZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW4gPiB0aGlzLl9idWZmZXJTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9leHBhbmRCdWZmZXIocmVtYWluKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgc3Rhc2hBcnJheSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3N0YXNoQnVmZmVyLCAwLCB0aGlzLl9idWZmZXJTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgc3Rhc2hBcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkoY2h1bmssIGNvbnN1bWVkKSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXNoVXNlZCArPSByZW1haW47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXNoQnl0ZVN0YXJ0ID0gYnl0ZVN0YXJ0ICsgY29uc3VtZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBlbHNlOiBNZXJnZSBjaHVuayBpbnRvIHN0YXNoQnVmZmVyLCBhbmQgZGlzcGF0Y2ggc3Rhc2hCdWZmZXIgdG8gY29uc3VtZXIuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXNoVXNlZCArIGNodW5rLmJ5dGVMZW5ndGggPiB0aGlzLl9idWZmZXJTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V4cGFuZEJ1ZmZlcih0aGlzLl9zdGFzaFVzZWQgKyBjaHVuay5ieXRlTGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHN0YXNoQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLl9zdGFzaEJ1ZmZlciwgMCwgdGhpcy5fYnVmZmVyU2l6ZSk7XG4gICAgICAgICAgICAgICAgc3Rhc2hBcnJheS5zZXQobmV3IFVpbnQ4QXJyYXkoY2h1bmspLCB0aGlzLl9zdGFzaFVzZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXNoVXNlZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxldCBjb25zdW1lZCA9IHRoaXMuX2Rpc3BhdGNoQ2h1bmtzKHRoaXMuX3N0YXNoQnVmZmVyLnNsaWNlKDAsIHRoaXMuX3N0YXNoVXNlZCksIHRoaXMuX3N0YXNoQnl0ZVN0YXJ0KTtcbiAgICAgICAgICAgICAgICBpZiAoY29uc3VtZWQgPCB0aGlzLl9zdGFzaFVzZWQgJiYgY29uc3VtZWQgPiAwKSB7ICAvLyB1bmNvbnN1bWVkIGRhdGEgcmVtYWluXG4gICAgICAgICAgICAgICAgICAgIGxldCByZW1haW5BcnJheSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3N0YXNoQnVmZmVyLCBjb25zdW1lZCk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXNoQXJyYXkuc2V0KHJlbWFpbkFycmF5LCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fc3Rhc2hVc2VkIC09IGNvbnN1bWVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXNoQnl0ZVN0YXJ0ICs9IGNvbnN1bWVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgeyAgLy8gZW5hYmxlIHN0YXNoXG4gICAgICAgICAgICBpZiAodGhpcy5fc3Rhc2hVc2VkID09PSAwICYmIHRoaXMuX3N0YXNoQnl0ZVN0YXJ0ID09PSAwKSB7ICAvLyBzZWVrZWQ/IG9yIGluaXQgY2h1bms/XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgY2h1bmsgYWZ0ZXIgc2VlayBhY3Rpb25cbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFzaEJ5dGVTdGFydCA9IGJ5dGVTdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGFzaFVzZWQgKyBjaHVuay5ieXRlTGVuZ3RoIDw9IHRoaXMuX3N0YXNoU2l6ZSkge1xuICAgICAgICAgICAgICAgIC8vIGp1c3Qgc3Rhc2hcbiAgICAgICAgICAgICAgICBsZXQgc3Rhc2hBcnJheSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3N0YXNoQnVmZmVyLCAwLCB0aGlzLl9zdGFzaFNpemUpO1xuICAgICAgICAgICAgICAgIHN0YXNoQXJyYXkuc2V0KG5ldyBVaW50OEFycmF5KGNodW5rKSwgdGhpcy5fc3Rhc2hVc2VkKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFzaFVzZWQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBzdGFzaFVzZWQgKyBjaHVua1NpemUgPiBzdGFzaFNpemUsIHNpemUgbGltaXQgZXhjZWVkZWRcbiAgICAgICAgICAgICAgICBsZXQgc3Rhc2hBcnJheSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3N0YXNoQnVmZmVyLCAwLCB0aGlzLl9idWZmZXJTaXplKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3Rhc2hVc2VkID4gMCkgeyAgLy8gVGhlcmUncmUgc3Rhc2ggZGF0YXMgaW4gYnVmZmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIHRoZSB3aG9sZSBzdGFzaEJ1ZmZlciwgYW5kIHN0YXNoIHJlbWFpbiBkYXRhXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gYXBwZW5kIGNodW5rIHRvIHN0YXNoQnVmZmVyIChzdGFzaClcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IHRoaXMuX3N0YXNoQnVmZmVyLnNsaWNlKDAsIHRoaXMuX3N0YXNoVXNlZCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25zdW1lZCA9IHRoaXMuX2Rpc3BhdGNoQ2h1bmtzKGJ1ZmZlciwgdGhpcy5fc3Rhc2hCeXRlU3RhcnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uc3VtZWQgPCBidWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZW1haW5BcnJheSA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlciwgY29uc3VtZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXNoQXJyYXkuc2V0KHJlbWFpbkFycmF5LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFzaFVzZWQgPSByZW1haW5BcnJheS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXNoQnl0ZVN0YXJ0ICs9IGNvbnN1bWVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3Rhc2hVc2VkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXNoQnl0ZVN0YXJ0ICs9IGNvbnN1bWVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGFzaFVzZWQgKyBjaHVuay5ieXRlTGVuZ3RoID4gdGhpcy5fYnVmZmVyU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXhwYW5kQnVmZmVyKHRoaXMuX3N0YXNoVXNlZCArIGNodW5rLmJ5dGVMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhc2hBcnJheSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3N0YXNoQnVmZmVyLCAwLCB0aGlzLl9idWZmZXJTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGFzaEFycmF5LnNldChuZXcgVWludDhBcnJheShjaHVuayksIHRoaXMuX3N0YXNoVXNlZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXNoVXNlZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBzdGFzaCBidWZmZXIgZW1wdHksIGJ1dCBjaHVua1NpemUgPiBzdGFzaFNpemUgKG9oLCBob2x5IHNoaXQpXG4gICAgICAgICAgICAgICAgICAgIC8vIGRpc3BhdGNoIGNodW5rIGRpcmVjdGx5IGFuZCBzdGFzaCByZW1haW4gZGF0YVxuICAgICAgICAgICAgICAgICAgICBsZXQgY29uc3VtZWQgPSB0aGlzLl9kaXNwYXRjaENodW5rcyhjaHVuaywgYnl0ZVN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkIDwgY2h1bmsuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlbWFpbiA9IGNodW5rLmJ5dGVMZW5ndGggLSBjb25zdW1lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW4gPiB0aGlzLl9idWZmZXJTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXhwYW5kQnVmZmVyKHJlbWFpbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rhc2hBcnJheSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3N0YXNoQnVmZmVyLCAwLCB0aGlzLl9idWZmZXJTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXNoQXJyYXkuc2V0KG5ldyBVaW50OEFycmF5KGNodW5rLCBjb25zdW1lZCksIDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3Rhc2hVc2VkICs9IHJlbWFpbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXNoQnl0ZVN0YXJ0ID0gYnl0ZVN0YXJ0ICsgY29uc3VtZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZmx1c2hTdGFzaEJ1ZmZlcihkcm9wVW5jb25zdW1lZCkge1xuICAgICAgICBpZiAodGhpcy5fc3Rhc2hVc2VkID4gMCkge1xuICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IHRoaXMuX3N0YXNoQnVmZmVyLnNsaWNlKDAsIHRoaXMuX3N0YXNoVXNlZCk7XG4gICAgICAgICAgICBsZXQgY29uc3VtZWQgPSB0aGlzLl9kaXNwYXRjaENodW5rcyhidWZmZXIsIHRoaXMuX3N0YXNoQnl0ZVN0YXJ0KTtcbiAgICAgICAgICAgIGxldCByZW1haW4gPSBidWZmZXIuYnl0ZUxlbmd0aCAtIGNvbnN1bWVkO1xuXG4gICAgICAgICAgICBpZiAoY29uc3VtZWQgPCBidWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChkcm9wVW5jb25zdW1lZCkge1xuICAgICAgICAgICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgYCR7cmVtYWlufSBieXRlcyB1bmNvbnN1bWVkIGRhdGEgcmVtYWluIHdoZW4gZmx1c2ggYnVmZmVyLCBkcm9wcGVkYCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnN1bWVkID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXNoQXJyYXkgPSBuZXcgVWludDhBcnJheSh0aGlzLl9zdGFzaEJ1ZmZlciwgMCwgdGhpcy5fYnVmZmVyU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVtYWluQXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmZXIsIGNvbnN1bWVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXNoQXJyYXkuc2V0KHJlbWFpbkFycmF5LCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXNoVXNlZCA9IHJlbWFpbkFycmF5LmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFzaEJ5dGVTdGFydCArPSBjb25zdW1lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zdGFzaFVzZWQgPSAwO1xuICAgICAgICAgICAgdGhpcy5fc3Rhc2hCeXRlU3RhcnQgPSAwO1xuICAgICAgICAgICAgcmV0dXJuIHJlbWFpbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBfb25Mb2FkZXJDb21wbGV0ZShmcm9tLCB0bykge1xuICAgICAgICAvLyBGb3JjZS1mbHVzaCBzdGFzaCBidWZmZXIsIGFuZCBkcm9wIHVuY29uc3VtZWQgZGF0YVxuICAgICAgICB0aGlzLl9mbHVzaFN0YXNoQnVmZmVyKHRydWUpO1xuXG4gICAgICAgIGlmICh0aGlzLl9vbkNvbXBsZXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNvbXBsZXRlKHRoaXMuX2V4dHJhRGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25Mb2FkZXJFcnJvcih0eXBlLCBkYXRhKSB7XG4gICAgICAgIExvZy5lKHRoaXMuVEFHLCBgTG9hZGVyIGVycm9yLCBjb2RlID0gJHtkYXRhLmNvZGV9LCBtc2cgPSAke2RhdGEubXNnfWApO1xuXG4gICAgICAgIHRoaXMuX2ZsdXNoU3Rhc2hCdWZmZXIoZmFsc2UpO1xuXG4gICAgICAgIGlmICh0aGlzLl9pc0Vhcmx5RW9mUmVjb25uZWN0aW5nKSB7XG4gICAgICAgICAgICAvLyBBdXRvLXJlY29ubmVjdCBmb3IgRWFybHlFb2YgZmFpbGVkLCB0aHJvdyBVbnJlY292ZXJhYmxlRWFybHlFb2YgZXJyb3IgdG8gdXBwZXItbGF5ZXJcbiAgICAgICAgICAgIHRoaXMuX2lzRWFybHlFb2ZSZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHR5cGUgPSBMb2FkZXJFcnJvcnMuVU5SRUNPVkVSQUJMRV9FQVJMWV9FT0Y7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgTG9hZGVyRXJyb3JzLkVBUkxZX0VPRjoge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY29uZmlnLmlzTGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEbyBpbnRlcm5hbCBodHRwIHJlY29ubmVjdCBpZiBub3QgbGl2ZSBzdHJlYW1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dEZyb20gPSB0aGlzLl9jdXJyZW50UmFuZ2UudG8gKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRGcm9tIDwgdGhpcy5fdG90YWxMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgJ0Nvbm5lY3Rpb24gbG9zdCwgdHJ5aW5nIHJlY29ubmVjdC4uLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzRWFybHlFb2ZSZWNvbm5lY3RpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludGVybmFsU2VlayhuZXh0RnJvbSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGVsc2U6IFdlIGRvbid0IGtub3cgdG90YWxMZW5ndGgsIHRocm93IFVucmVjb3ZlcmFibGVFYXJseUVvZlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBsaXZlIHN0cmVhbTogdGhyb3cgVW5yZWNvdmVyYWJsZUVhcmx5RW9mIGVycm9yIHRvIHVwcGVyLWxheWVyXG4gICAgICAgICAgICAgICAgdHlwZSA9IExvYWRlckVycm9ycy5VTlJFQ09WRVJBQkxFX0VBUkxZX0VPRjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgTG9hZGVyRXJyb3JzLlVOUkVDT1ZFUkFCTEVfRUFSTFlfRU9GOlxuICAgICAgICAgICAgY2FzZSBMb2FkZXJFcnJvcnMuQ09OTkVDVElOR19USU1FT1VUOlxuICAgICAgICAgICAgY2FzZSBMb2FkZXJFcnJvcnMuSFRUUF9TVEFUVVNfQ09ERV9JTlZBTElEOlxuICAgICAgICAgICAgY2FzZSBMb2FkZXJFcnJvcnMuRVhDRVBUSU9OOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX29uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IodHlwZSwgZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignSU9FeGNlcHRpb246ICcgKyBkYXRhLm1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgSU9Db250cm9sbGVyOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge05vdEltcGxlbWVudGVkRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9leGNlcHRpb24uanMnO1xuXG5leHBvcnQgY29uc3QgTG9hZGVyU3RhdHVzID0ge1xuICAgIGtJZGxlOiAwLFxuICAgIGtDb25uZWN0aW5nOiAxLFxuICAgIGtCdWZmZXJpbmc6IDIsXG4gICAga0Vycm9yOiAzLFxuICAgIGtDb21wbGV0ZTogNFxufTtcblxuZXhwb3J0IGNvbnN0IExvYWRlckVycm9ycyA9IHtcbiAgICBPSzogJ09LJyxcbiAgICBFWENFUFRJT046ICdFeGNlcHRpb24nLFxuICAgIEhUVFBfU1RBVFVTX0NPREVfSU5WQUxJRDogJ0h0dHBTdGF0dXNDb2RlSW52YWxpZCcsXG4gICAgQ09OTkVDVElOR19USU1FT1VUOiAnQ29ubmVjdGluZ1RpbWVvdXQnLFxuICAgIEVBUkxZX0VPRjogJ0Vhcmx5RW9mJyxcbiAgICBVTlJFQ09WRVJBQkxFX0VBUkxZX0VPRjogJ1VucmVjb3ZlcmFibGVFYXJseUVvZidcbn07XG5cbi8qIExvYWRlciBoYXMgY2FsbGJhY2tzIHdoaWNoIGhhdmUgZm9sbG93aW5nIHByb3RvdHlwZXM6XG4gKiAgICAgZnVuY3Rpb24gb25Db250ZW50TGVuZ3RoS25vd24oY29udGVudExlbmd0aDogbnVtYmVyKTogdm9pZFxuICogICAgIGZ1bmN0aW9uIG9uVVJMUmVkaXJlY3QodXJsOiBzdHJpbmcpOiB2b2lkXG4gKiAgICAgZnVuY3Rpb24gb25EYXRhQXJyaXZhbChjaHVuazogQXJyYXlCdWZmZXIsIGJ5dGVTdGFydDogbnVtYmVyLCByZWNlaXZlZExlbmd0aDogbnVtYmVyKTogdm9pZFxuICogICAgIGZ1bmN0aW9uIG9uRXJyb3IoZXJyb3JUeXBlOiBudW1iZXIsIGVycm9ySW5mbzoge2NvZGU6IG51bWJlciwgbXNnOiBzdHJpbmd9KTogdm9pZFxuICogICAgIGZ1bmN0aW9uIG9uQ29tcGxldGUocmFuZ2VGcm9tOiBudW1iZXIsIHJhbmdlVG86IG51bWJlcik6IHZvaWRcbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VMb2FkZXIge1xuXG4gICAgY29uc3RydWN0b3IodHlwZU5hbWUpIHtcbiAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGVOYW1lIHx8ICd1bmRlZmluZWQnO1xuICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0lkbGU7XG4gICAgICAgIHRoaXMuX25lZWRTdGFzaCA9IGZhbHNlO1xuICAgICAgICAvLyBjYWxsYmFja3NcbiAgICAgICAgdGhpcy5fb25Db250ZW50TGVuZ3RoS25vd24gPSBudWxsO1xuICAgICAgICB0aGlzLl9vblVSTFJlZGlyZWN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25EYXRhQXJyaXZhbCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uRXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbkNvbXBsZXRlID0gbnVsbDtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0lkbGU7XG4gICAgICAgIHRoaXMuX29uQ29udGVudExlbmd0aEtub3duID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25VUkxSZWRpcmVjdCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29uRGF0YUFycml2YWwgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbkVycm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25Db21wbGV0ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgaXNXb3JraW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzID09PSBMb2FkZXJTdGF0dXMua0Nvbm5lY3RpbmcgfHwgdGhpcy5fc3RhdHVzID09PSBMb2FkZXJTdGF0dXMua0J1ZmZlcmluZztcbiAgICB9XG5cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gICAgfVxuXG4gICAgZ2V0IHN0YXR1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcbiAgICB9XG5cbiAgICBnZXQgbmVlZFN0YXNoQnVmZmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbmVlZFN0YXNoO1xuICAgIH1cblxuICAgIGdldCBvbkNvbnRlbnRMZW5ndGhLbm93bigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uQ29udGVudExlbmd0aEtub3duO1xuICAgIH1cblxuICAgIHNldCBvbkNvbnRlbnRMZW5ndGhLbm93bihjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vbkNvbnRlbnRMZW5ndGhLbm93biA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGdldCBvblVSTFJlZGlyZWN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25VUkxSZWRpcmVjdDtcbiAgICB9XG5cbiAgICBzZXQgb25VUkxSZWRpcmVjdChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vblVSTFJlZGlyZWN0ID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZ2V0IG9uRGF0YUFycml2YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbkRhdGFBcnJpdmFsO1xuICAgIH1cblxuICAgIHNldCBvbkRhdGFBcnJpdmFsKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uRGF0YUFycml2YWwgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBnZXQgb25FcnJvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRXJyb3I7XG4gICAgfVxuXG4gICAgc2V0IG9uRXJyb3IoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fb25FcnJvciA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGdldCBvbkNvbXBsZXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25Db21wbGV0ZTtcbiAgICB9XG5cbiAgICBzZXQgb25Db21wbGV0ZShjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9vbkNvbXBsZXRlID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgLy8gcHVyZSB2aXJ0dWFsXG4gICAgb3BlbihkYXRhU291cmNlLCByYW5nZSkge1xuICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oJ1VuaW1wbGVtZW50ZWQgYWJzdHJhY3QgZnVuY3Rpb24hJyk7XG4gICAgfVxuXG4gICAgYWJvcnQoKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbignVW5pbXBsZW1lbnRlZCBhYnN0cmFjdCBmdW5jdGlvbiEnKTtcbiAgICB9XG5cblxufSIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jbGFzcyBQYXJhbVNlZWtIYW5kbGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKHBhcmFtU3RhcnQsIHBhcmFtRW5kKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0TmFtZSA9IHBhcmFtU3RhcnQ7XG4gICAgICAgIHRoaXMuX2VuZE5hbWUgPSBwYXJhbUVuZDtcbiAgICB9XG5cbiAgICBnZXRDb25maWcoYmFzZVVybCwgcmFuZ2UpIHtcbiAgICAgICAgbGV0IHVybCA9IGJhc2VVcmw7XG5cbiAgICAgICAgaWYgKHJhbmdlLmZyb20gIT09IDAgfHwgcmFuZ2UudG8gIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgbmVlZEFuZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB1cmwgKz0gJz8nO1xuICAgICAgICAgICAgICAgIG5lZWRBbmQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5lZWRBbmQpIHtcbiAgICAgICAgICAgICAgICB1cmwgKz0gJyYnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1cmwgKz0gYCR7dGhpcy5fc3RhcnROYW1lfT0ke3JhbmdlLmZyb20udG9TdHJpbmcoKX1gO1xuXG4gICAgICAgICAgICBpZiAocmFuZ2UudG8gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGAmJHt0aGlzLl9lbmROYW1lfT0ke3JhbmdlLnRvLnRvU3RyaW5nKCl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHt9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVtb3ZlVVJMUGFyYW1ldGVycyhzZWVrZWRVUkwpIHtcbiAgICAgICAgbGV0IGJhc2VVUkwgPSBzZWVrZWRVUkwuc3BsaXQoJz8nKVswXTtcbiAgICAgICAgbGV0IHBhcmFtcyA9IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgcXVlcnlJbmRleCA9IHNlZWtlZFVSTC5pbmRleE9mKCc/Jyk7XG4gICAgICAgIGlmIChxdWVyeUluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgcGFyYW1zID0gc2Vla2VkVVJMLnN1YnN0cmluZyhxdWVyeUluZGV4ICsgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0UGFyYW1zID0gJyc7XG5cbiAgICAgICAgaWYgKHBhcmFtcyAhPSB1bmRlZmluZWQgJiYgcGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBwYWlycyA9IHBhcmFtcy5zcGxpdCgnJicpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBwYWlyc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICAgICAgICAgIGxldCByZXF1aXJlQW5kID0gKGkgPiAwKTtcblxuICAgICAgICAgICAgICAgIGlmIChwYWlyWzBdICE9PSB0aGlzLl9zdGFydE5hbWUgJiYgcGFpclswXSAhPT0gdGhpcy5fZW5kTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZUFuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0UGFyYW1zICs9ICcmJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHRQYXJhbXMgKz0gcGFpcnNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChyZXN1bHRQYXJhbXMubGVuZ3RoID09PSAwKSA/IGJhc2VVUkwgOiBiYXNlVVJMICsgJz8nICsgcmVzdWx0UGFyYW1zO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBQYXJhbVNlZWtIYW5kbGVyOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jbGFzcyBSYW5nZVNlZWtIYW5kbGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKHplcm9TdGFydCkge1xuICAgICAgICB0aGlzLl96ZXJvU3RhcnQgPSB6ZXJvU3RhcnQgfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0Q29uZmlnKHVybCwgcmFuZ2UpIHtcbiAgICAgICAgbGV0IGhlYWRlcnMgPSB7fTtcblxuICAgICAgICBpZiAocmFuZ2UuZnJvbSAhPT0gMCB8fCByYW5nZS50byAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBwYXJhbTtcbiAgICAgICAgICAgIGlmIChyYW5nZS50byAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwYXJhbSA9IGBieXRlcz0ke3JhbmdlLmZyb20udG9TdHJpbmcoKX0tJHtyYW5nZS50by50b1N0cmluZygpfWA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcmFtID0gYGJ5dGVzPSR7cmFuZ2UuZnJvbS50b1N0cmluZygpfS1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGVhZGVyc1snUmFuZ2UnXSA9IHBhcmFtO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3plcm9TdGFydCkge1xuICAgICAgICAgICAgaGVhZGVyc1snUmFuZ2UnXSA9ICdieXRlcz0wLSc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmVtb3ZlVVJMUGFyYW1ldGVycyhzZWVrZWRVUkwpIHtcbiAgICAgICAgcmV0dXJuIHNlZWtlZFVSTDtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmFuZ2VTZWVrSGFuZGxlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gVXRpbGl0eSBjbGFzcyB0byBjYWxjdWxhdGUgcmVhbHRpbWUgbmV0d29yayBJL08gc3BlZWRcbmNsYXNzIFNwZWVkU2FtcGxlciB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gbWlsbGlzZWNvbmRzXG4gICAgICAgIHRoaXMuX2ZpcnN0Q2hlY2twb2ludCA9IDA7XG4gICAgICAgIHRoaXMuX2xhc3RDaGVja3BvaW50ID0gMDtcbiAgICAgICAgdGhpcy5faW50ZXJ2YWxCeXRlcyA9IDA7XG4gICAgICAgIHRoaXMuX3RvdGFsQnl0ZXMgPSAwO1xuICAgICAgICB0aGlzLl9sYXN0U2Vjb25kQnl0ZXMgPSAwO1xuXG4gICAgICAgIC8vIGNvbXBhdGliaWxpdHkgZGV0ZWN0aW9uXG4gICAgICAgIGlmIChzZWxmLnBlcmZvcm1hbmNlICYmIHNlbGYucGVyZm9ybWFuY2Uubm93KSB7XG4gICAgICAgICAgICB0aGlzLl9ub3cgPSBzZWxmLnBlcmZvcm1hbmNlLm5vdy5iaW5kKHNlbGYucGVyZm9ybWFuY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbm93ID0gRGF0ZS5ub3c7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5fZmlyc3RDaGVja3BvaW50ID0gdGhpcy5fbGFzdENoZWNrcG9pbnQgPSAwO1xuICAgICAgICB0aGlzLl90b3RhbEJ5dGVzID0gdGhpcy5faW50ZXJ2YWxCeXRlcyA9IDA7XG4gICAgICAgIHRoaXMuX2xhc3RTZWNvbmRCeXRlcyA9IDA7XG4gICAgfVxuXG4gICAgYWRkQnl0ZXMoYnl0ZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpcnN0Q2hlY2twb2ludCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fZmlyc3RDaGVja3BvaW50ID0gdGhpcy5fbm93KCk7XG4gICAgICAgICAgICB0aGlzLl9sYXN0Q2hlY2twb2ludCA9IHRoaXMuX2ZpcnN0Q2hlY2twb2ludDtcbiAgICAgICAgICAgIHRoaXMuX2ludGVydmFsQnl0ZXMgKz0gYnl0ZXM7XG4gICAgICAgICAgICB0aGlzLl90b3RhbEJ5dGVzICs9IGJ5dGVzO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX25vdygpIC0gdGhpcy5fbGFzdENoZWNrcG9pbnQgPCAxMDAwKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcnZhbEJ5dGVzICs9IGJ5dGVzO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxCeXRlcyArPSBieXRlcztcbiAgICAgICAgfSBlbHNlIHsgIC8vIGR1cmF0aW9uID49IDEwMDBcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZWNvbmRCeXRlcyA9IHRoaXMuX2ludGVydmFsQnl0ZXM7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcnZhbEJ5dGVzID0gYnl0ZXM7XG4gICAgICAgICAgICB0aGlzLl90b3RhbEJ5dGVzICs9IGJ5dGVzO1xuICAgICAgICAgICAgdGhpcy5fbGFzdENoZWNrcG9pbnQgPSB0aGlzLl9ub3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBjdXJyZW50S0JwcygpIHtcbiAgICAgICAgdGhpcy5hZGRCeXRlcygwKTtcblxuICAgICAgICBsZXQgZHVyYXRpb25TZWNvbmRzID0gKHRoaXMuX25vdygpIC0gdGhpcy5fbGFzdENoZWNrcG9pbnQpIC8gMTAwMDtcbiAgICAgICAgaWYgKGR1cmF0aW9uU2Vjb25kcyA9PSAwKSBkdXJhdGlvblNlY29uZHMgPSAxO1xuICAgICAgICByZXR1cm4gKHRoaXMuX2ludGVydmFsQnl0ZXMgLyBkdXJhdGlvblNlY29uZHMpIC8gMTAyNDtcbiAgICB9XG5cbiAgICBnZXQgbGFzdFNlY29uZEtCcHMoKSB7XG4gICAgICAgIHRoaXMuYWRkQnl0ZXMoMCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2xhc3RTZWNvbmRCeXRlcyAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RTZWNvbmRCeXRlcyAvIDEwMjQ7XG4gICAgICAgIH0gZWxzZSB7ICAvLyBsYXN0U2Vjb25kQnl0ZXMgPT09IDBcbiAgICAgICAgICAgIGlmICh0aGlzLl9ub3coKSAtIHRoaXMuX2xhc3RDaGVja3BvaW50ID49IDUwMCkge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRpbWUgaW50ZXJ2YWwgc2luY2UgbGFzdCBjaGVja3BvaW50IGhhcyBleGNlZWRlZCA1MDBtc1xuICAgICAgICAgICAgICAgIC8vIHRoZSBzcGVlZCBpcyBuZWFybHkgYWNjdXJhdGVcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50S0JwcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vd1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGF2ZXJhZ2VLQnBzKCkge1xuICAgICAgICBsZXQgZHVyYXRpb25TZWNvbmRzID0gKHRoaXMuX25vdygpIC0gdGhpcy5fZmlyc3RDaGVja3BvaW50KSAvIDEwMDA7XG4gICAgICAgIHJldHVybiAodGhpcy5fdG90YWxCeXRlcyAvIGR1cmF0aW9uU2Vjb25kcykgLyAxMDI0O1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTcGVlZFNhbXBsZXI7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBMb2cgZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7QmFzZUxvYWRlciwgTG9hZGVyU3RhdHVzLCBMb2FkZXJFcnJvcnN9IGZyb20gJy4vbG9hZGVyLmpzJztcbmltcG9ydCB7UnVudGltZUV4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvZXhjZXB0aW9uLmpzJztcblxuLy8gRm9yIEZMViBvdmVyIFdlYlNvY2tldCBsaXZlIHN0cmVhbVxuY2xhc3MgV2ViU29ja2V0TG9hZGVyIGV4dGVuZHMgQmFzZUxvYWRlciB7XG5cbiAgICBzdGF0aWMgaXNTdXBwb3J0ZWQoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gKHR5cGVvZiBzZWxmLldlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ3dlYnNvY2tldC1sb2FkZXInKTtcbiAgICAgICAgdGhpcy5UQUcgPSAnV2ViU29ja2V0TG9hZGVyJztcblxuICAgICAgICB0aGlzLl9uZWVkU3Rhc2ggPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX3dzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmVxdWVzdEFib3J0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3JlY2VpdmVkTGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5fd3MpIHtcbiAgICAgICAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgb3BlbihkYXRhU291cmNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgd3MgPSB0aGlzLl93cyA9IG5ldyBzZWxmLldlYlNvY2tldChkYXRhU291cmNlLnVybCk7XG4gICAgICAgICAgICB3cy5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgICAgICAgIHdzLm9ub3BlbiA9IHRoaXMuX29uV2ViU29ja2V0T3Blbi5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgd3Mub25jbG9zZSA9IHRoaXMuX29uV2ViU29ja2V0Q2xvc2UuYmluZCh0aGlzKTtcbiAgICAgICAgICAgIHdzLm9ubWVzc2FnZSA9IHRoaXMuX29uV2ViU29ja2V0TWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgd3Mub25lcnJvciA9IHRoaXMuX29uV2ViU29ja2V0RXJyb3IuYmluZCh0aGlzKTtcblxuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtDb25uZWN0aW5nO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0Vycm9yO1xuXG4gICAgICAgICAgICBsZXQgaW5mbyA9IHtjb2RlOiBlLmNvZGUsIG1zZzogZS5tZXNzYWdlfTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX29uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkVycm9yKExvYWRlckVycm9ycy5FWENFUFRJT04sIGluZm8pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpbmZvLm1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgbGV0IHdzID0gdGhpcy5fd3M7XG4gICAgICAgIGlmICh3cyAmJiAod3MucmVhZHlTdGF0ZSA9PT0gMCB8fCB3cy5yZWFkeVN0YXRlID09PSAxKSkgeyAgLy8gQ09OTkVDVElORyB8fCBPUEVOXG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0QWJvcnQgPSB0cnVlO1xuICAgICAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3dzID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtDb21wbGV0ZTtcbiAgICB9XG5cbiAgICBfb25XZWJTb2NrZXRPcGVuKGUpIHtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtCdWZmZXJpbmc7XG4gICAgfVxuXG4gICAgX29uV2ViU29ja2V0Q2xvc2UoZSkge1xuICAgICAgICBpZiAodGhpcy5fcmVxdWVzdEFib3J0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0QWJvcnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rQ29tcGxldGU7XG5cbiAgICAgICAgaWYgKHRoaXMuX29uQ29tcGxldGUpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ29tcGxldGUoMCwgdGhpcy5fcmVjZWl2ZWRMZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbldlYlNvY2tldE1lc3NhZ2UoZSkge1xuICAgICAgICBpZiAoZS5kYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoQXJyYXlCdWZmZXIoZS5kYXRhKTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hBcnJheUJ1ZmZlcihyZWFkZXIucmVzdWx0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZS5kYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rRXJyb3I7XG4gICAgICAgICAgICBsZXQgaW5mbyA9IHtjb2RlOiAtMSwgbXNnOiAnVW5zdXBwb3J0ZWQgV2ViU29ja2V0IG1lc3NhZ2UgdHlwZTogJyArIGUuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX29uRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkVycm9yKExvYWRlckVycm9ycy5FWENFUFRJT04sIGluZm8pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpbmZvLm1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZGlzcGF0Y2hBcnJheUJ1ZmZlcihhcnJheWJ1ZmZlcikge1xuICAgICAgICBsZXQgY2h1bmsgPSBhcnJheWJ1ZmZlcjtcbiAgICAgICAgbGV0IGJ5dGVTdGFydCA9IHRoaXMuX3JlY2VpdmVkTGVuZ3RoO1xuICAgICAgICB0aGlzLl9yZWNlaXZlZExlbmd0aCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gICAgICAgIGlmICh0aGlzLl9vbkRhdGFBcnJpdmFsKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkRhdGFBcnJpdmFsKGNodW5rLCBieXRlU3RhcnQsIHRoaXMuX3JlY2VpdmVkTGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vbldlYlNvY2tldEVycm9yKGUpIHtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtFcnJvcjtcblxuICAgICAgICBsZXQgaW5mbyA9IHtcbiAgICAgICAgICAgIGNvZGU6IGUuY29kZSxcbiAgICAgICAgICAgIG1zZzogZS5tZXNzYWdlXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuX29uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoTG9hZGVyRXJyb3JzLkVYQ0VQVElPTiwgaW5mbyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpbmZvLm1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgV2ViU29ja2V0TG9hZGVyOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgTG9nIGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQge0Jhc2VMb2FkZXIsIExvYWRlclN0YXR1cywgTG9hZGVyRXJyb3JzfSBmcm9tICcuL2xvYWRlci5qcyc7XG5pbXBvcnQge1J1bnRpbWVFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2V4Y2VwdGlvbi5qcyc7XG5cbi8vIEZvciBGaXJlRm94IGJyb3dzZXIgd2hpY2ggc3VwcG9ydHMgYHhoci5yZXNwb25zZVR5cGUgPSAnbW96LWNodW5rZWQtYXJyYXlidWZmZXInYFxuY2xhc3MgTW96Q2h1bmtlZExvYWRlciBleHRlbmRzIEJhc2VMb2FkZXIge1xuXG4gICAgc3RhdGljIGlzU3VwcG9ydGVkKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgLy8gRmlyZWZveCAzNy0gcmVxdWlyZXMgLm9wZW4oKSB0byBiZSBjYWxsZWQgYmVmb3JlIHNldHRpbmcgcmVzcG9uc2VUeXBlXG4gICAgICAgICAgICB4aHIub3BlbignR0VUJywgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLCB0cnVlKTtcbiAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnbW96LWNodW5rZWQtYXJyYXlidWZmZXInO1xuICAgICAgICAgICAgcmV0dXJuICh4aHIucmVzcG9uc2VUeXBlID09PSAnbW96LWNodW5rZWQtYXJyYXlidWZmZXInKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgTG9nLncoJ01vekNodW5rZWRMb2FkZXInLCBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioc2Vla0hhbmRsZXIsIGNvbmZpZykge1xuICAgICAgICBzdXBlcigneGhyLW1vei1jaHVua2VkLWxvYWRlcicpO1xuICAgICAgICB0aGlzLlRBRyA9ICdNb3pDaHVua2VkTG9hZGVyJztcblxuICAgICAgICB0aGlzLl9zZWVrSGFuZGxlciA9IHNlZWtIYW5kbGVyO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX25lZWRTdGFzaCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5feGhyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmVxdWVzdEFib3J0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsO1xuICAgICAgICB0aGlzLl9yZWNlaXZlZExlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNXb3JraW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5feGhyKSB7XG4gICAgICAgICAgICB0aGlzLl94aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3hoci5vbnByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3hoci5vbmxvYWRlbmQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5feGhyLm9uZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5feGhyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgb3BlbihkYXRhU291cmNlLCByYW5nZSkge1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcbiAgICAgICAgdGhpcy5fcmFuZ2UgPSByYW5nZTtcblxuICAgICAgICBsZXQgc291cmNlVVJMID0gZGF0YVNvdXJjZS51cmw7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcucmV1c2VSZWRpcmVjdGVkVVJMICYmIGRhdGFTb3VyY2UucmVkaXJlY3RlZFVSTCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNvdXJjZVVSTCA9IGRhdGFTb3VyY2UucmVkaXJlY3RlZFVSTDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWVrQ29uZmlnID0gdGhpcy5fc2Vla0hhbmRsZXIuZ2V0Q29uZmlnKHNvdXJjZVVSTCwgcmFuZ2UpO1xuICAgICAgICB0aGlzLl9yZXF1ZXN0VVJMID0gc2Vla0NvbmZpZy51cmw7XG5cbiAgICAgICAgbGV0IHhociA9IHRoaXMuX3hociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbignR0VUJywgc2Vla0NvbmZpZy51cmwsIHRydWUpO1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ21vei1jaHVua2VkLWFycmF5YnVmZmVyJztcbiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHRoaXMuX29uUmVhZHlTdGF0ZUNoYW5nZS5iaW5kKHRoaXMpO1xuICAgICAgICB4aHIub25wcm9ncmVzcyA9IHRoaXMuX29uUHJvZ3Jlc3MuYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLm9ubG9hZGVuZCA9IHRoaXMuX29uTG9hZEVuZC5iaW5kKHRoaXMpO1xuICAgICAgICB4aHIub25lcnJvciA9IHRoaXMuX29uWGhyRXJyb3IuYmluZCh0aGlzKTtcblxuICAgICAgICAvLyBjb3JzIGlzIGF1dG8gZGV0ZWN0ZWQgYW5kIGVuYWJsZWQgYnkgeGhyXG5cbiAgICAgICAgLy8gd2l0aENyZWRlbnRpYWxzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKGRhdGFTb3VyY2Uud2l0aENyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygc2Vla0NvbmZpZy5oZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSBzZWVrQ29uZmlnLmhlYWRlcnM7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBoZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGFkZGl0aW9uYWwgaGVhZGVyc1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2NvbmZpZy5oZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLl9jb25maWcuaGVhZGVycztcblxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0Nvbm5lY3Rpbmc7XG4gICAgICAgIHhoci5zZW5kKCk7XG4gICAgfVxuXG4gICAgYWJvcnQoKSB7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RBYm9ydCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLl94aHIpIHtcbiAgICAgICAgICAgIHRoaXMuX3hoci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rQ29tcGxldGU7XG4gICAgfVxuXG4gICAgX29uUmVhZHlTdGF0ZUNoYW5nZShlKSB7XG4gICAgICAgIGxldCB4aHIgPSBlLnRhcmdldDtcblxuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDIpIHsgIC8vIEhFQURFUlNfUkVDRUlWRURcbiAgICAgICAgICAgIGlmICh4aHIucmVzcG9uc2VVUkwgIT0gdW5kZWZpbmVkICYmIHhoci5yZXNwb25zZVVSTCAhPT0gdGhpcy5fcmVxdWVzdFVSTCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vblVSTFJlZGlyZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWRpcmVjdGVkVVJMID0gdGhpcy5fc2Vla0hhbmRsZXIucmVtb3ZlVVJMUGFyYW1ldGVycyh4aHIucmVzcG9uc2VVUkwpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblVSTFJlZGlyZWN0KHJlZGlyZWN0ZWRVUkwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgIT09IDAgJiYgKHhoci5zdGF0dXMgPCAyMDAgfHwgeGhyLnN0YXR1cyA+IDI5OSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0Vycm9yO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoTG9hZGVyRXJyb3JzLkhUVFBfU1RBVFVTX0NPREVfSU5WQUxJRCwge2NvZGU6IHhoci5zdGF0dXMsIG1zZzogeGhyLnN0YXR1c1RleHR9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTW96Q2h1bmtlZExvYWRlcjogSHR0cCBjb2RlIGludmFsaWQsICcgKyB4aHIuc3RhdHVzICsgJyAnICsgeGhyLnN0YXR1c1RleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtCdWZmZXJpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25Qcm9ncmVzcyhlKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdGF0dXMgPT09IExvYWRlclN0YXR1cy5rRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvciByZXNwb25zZVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRMZW5ndGggPT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChlLnRvdGFsICE9PSBudWxsICYmIGUudG90YWwgIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gZS50b3RhbDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb25Db250ZW50TGVuZ3RoS25vd24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25Db250ZW50TGVuZ3RoS25vd24odGhpcy5fY29udGVudExlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNodW5rID0gZS50YXJnZXQucmVzcG9uc2U7XG4gICAgICAgIGxldCBieXRlU3RhcnQgPSB0aGlzLl9yYW5nZS5mcm9tICsgdGhpcy5fcmVjZWl2ZWRMZW5ndGg7XG4gICAgICAgIHRoaXMuX3JlY2VpdmVkTGVuZ3RoICs9IGNodW5rLmJ5dGVMZW5ndGg7XG5cbiAgICAgICAgaWYgKHRoaXMuX29uRGF0YUFycml2YWwpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRGF0YUFycml2YWwoY2h1bmssIGJ5dGVTdGFydCwgdGhpcy5fcmVjZWl2ZWRMZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uTG9hZEVuZChlKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0QWJvcnQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RBYm9ydCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3N0YXR1cyA9PT0gTG9hZGVyU3RhdHVzLmtFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtDb21wbGV0ZTtcbiAgICAgICAgaWYgKHRoaXMuX29uQ29tcGxldGUpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ29tcGxldGUodGhpcy5fcmFuZ2UuZnJvbSwgdGhpcy5fcmFuZ2UuZnJvbSArIHRoaXMuX3JlY2VpdmVkTGVuZ3RoIC0gMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb25YaHJFcnJvcihlKSB7XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rRXJyb3I7XG4gICAgICAgIGxldCB0eXBlID0gMDtcbiAgICAgICAgbGV0IGluZm8gPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50TGVuZ3RoICYmIGUubG9hZGVkIDwgdGhpcy5fY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgdHlwZSA9IExvYWRlckVycm9ycy5FQVJMWV9FT0Y7XG4gICAgICAgICAgICBpbmZvID0ge2NvZGU6IC0xLCBtc2c6ICdNb3otQ2h1bmtlZCBzdHJlYW0gbWVldCBFYXJseS1Fb2YnfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGUgPSBMb2FkZXJFcnJvcnMuRVhDRVBUSU9OO1xuICAgICAgICAgICAgaW5mbyA9IHtjb2RlOiAtMSwgbXNnOiBlLmNvbnN0cnVjdG9yLm5hbWUgKyAnICcgKyBlLnR5cGV9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX29uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX29uRXJyb3IodHlwZSwgaW5mbyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpbmZvLm1zZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgTW96Q2h1bmtlZExvYWRlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IExvZyBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHtCYXNlTG9hZGVyLCBMb2FkZXJTdGF0dXMsIExvYWRlckVycm9yc30gZnJvbSAnLi9sb2FkZXIuanMnO1xuaW1wb3J0IHtSdW50aW1lRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9leGNlcHRpb24uanMnO1xuXG4vKiBOb3RpY2U6IG1zLXN0cmVhbSBtYXkgY2F1c2UgSUUvRWRnZSBicm93c2VyIGNyYXNoIGlmIHNlZWsgdG9vIGZyZXF1ZW50bHkhISFcbiAqIFRoZSBicm93c2VyIG1heSBjcmFzaCBpbiB3aW5pbmV0LmRsbC4gRGlzYWJsZSBmb3Igbm93LlxuICpcbiAqIEZvciBJRTExL0VkZ2UgYnJvd3NlciBieSBtaWNyb3NvZnQgd2hpY2ggc3VwcG9ydHMgYHhoci5yZXNwb25zZVR5cGUgPSAnbXMtc3RyZWFtJ2BcbiAqIE5vdGljZSB0aGF0IG1zLXN0cmVhbSBBUEkgc3Vja3MuIFRoZSBidWZmZXIgaXMgYWx3YXlzIGV4cGFuZGluZyBhbG9uZyB3aXRoIGRvd25sb2FkaW5nLlxuICpcbiAqIFdlIG5lZWQgdG8gYWJvcnQgdGhlIHhociBpZiBidWZmZXIgc2l6ZSBleGNlZWRlZCBsaW1pdCBzaXplIChlLmcuIDE2IE1pQiksIHRoZW4gZG8gcmVjb25uZWN0LlxuICogaW4gb3JkZXIgdG8gcmVsZWFzZSBwcmV2aW91cyBBcnJheUJ1ZmZlciB0byBhdm9pZCBtZW1vcnkgbGVha1xuICpcbiAqIE90aGVyd2lzZSwgdGhlIEFycmF5QnVmZmVyIHdpbGwgaW5jcmVhc2UgdG8gYSB0ZXJyaWJsZSBzaXplIHRoYXQgZXF1YWxzIGZpbmFsIGZpbGUgc2l6ZS5cbiAqL1xuY2xhc3MgTVNTdHJlYW1Mb2FkZXIgZXh0ZW5kcyBCYXNlTG9hZGVyIHtcblxuICAgIHN0YXRpYyBpc1N1cHBvcnRlZCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsZi5NU1N0cmVhbSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHNlbGYuTVNTdHJlYW1SZWFkZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICB4aHIub3BlbignR0VUJywgJ2h0dHBzOi8vZXhhbXBsZS5jb20nLCB0cnVlKTtcbiAgICAgICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnbXMtc3RyZWFtJztcbiAgICAgICAgICAgIHJldHVybiAoeGhyLnJlc3BvbnNlVHlwZSA9PT0gJ21zLXN0cmVhbScpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBMb2cudygnTVNTdHJlYW1Mb2FkZXInLCBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioc2Vla0hhbmRsZXIsIGNvbmZpZykge1xuICAgICAgICBzdXBlcigneGhyLW1zc3RyZWFtLWxvYWRlcicpO1xuICAgICAgICB0aGlzLlRBRyA9ICdNU1N0cmVhbUxvYWRlcic7XG5cbiAgICAgICAgdGhpcy5fc2Vla0hhbmRsZXIgPSBzZWVrSGFuZGxlcjtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLl9uZWVkU3Rhc2ggPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuX3hociA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlYWRlciA9IG51bGw7ICAvLyBNU1N0cmVhbVJlYWRlclxuXG4gICAgICAgIHRoaXMuX3RvdGFsUmFuZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLl9jdXJyZW50UmFuZ2UgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX2N1cnJlbnRSZXF1ZXN0VVJMID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY3VycmVudFJlZGlyZWN0ZWRVUkwgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsO1xuICAgICAgICB0aGlzLl9yZWNlaXZlZExlbmd0aCA9IDA7XG5cbiAgICAgICAgdGhpcy5fYnVmZmVyTGltaXQgPSAxNiAqIDEwMjQgKiAxMDI0OyAgLy8gMTZNQlxuICAgICAgICB0aGlzLl9sYXN0VGltZUJ1ZmZlclNpemUgPSAwO1xuICAgICAgICB0aGlzLl9pc1JlY29ubmVjdGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmlzV29ya2luZygpKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3JlYWRlcikge1xuICAgICAgICAgICAgdGhpcy5fcmVhZGVyLm9ucHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fcmVhZGVyLm9ubG9hZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9yZWFkZXIub25lcnJvciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9yZWFkZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl94aHIpIHtcbiAgICAgICAgICAgIHRoaXMuX3hoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5feGhyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgb3BlbihkYXRhU291cmNlLCByYW5nZSkge1xuICAgICAgICB0aGlzLl9pbnRlcm5hbE9wZW4oZGF0YVNvdXJjZSwgcmFuZ2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBfaW50ZXJuYWxPcGVuKGRhdGFTb3VyY2UsIHJhbmdlLCBpc1N1YnJhbmdlKSB7XG4gICAgICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xuXG4gICAgICAgIGlmICghaXNTdWJyYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fdG90YWxSYW5nZSA9IHJhbmdlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFJhbmdlID0gcmFuZ2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc291cmNlVVJMID0gZGF0YVNvdXJjZS51cmw7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcucmV1c2VSZWRpcmVjdGVkVVJMKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFJlZGlyZWN0ZWRVUkwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc291cmNlVVJMID0gdGhpcy5fY3VycmVudFJlZGlyZWN0ZWRVUkw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFTb3VyY2UucmVkaXJlY3RlZFVSTCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VVUkwgPSBkYXRhU291cmNlLnJlZGlyZWN0ZWRVUkw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2Vla0NvbmZpZyA9IHRoaXMuX3NlZWtIYW5kbGVyLmdldENvbmZpZyhzb3VyY2VVUkwsIHJhbmdlKTtcbiAgICAgICAgdGhpcy5fY3VycmVudFJlcXVlc3RVUkwgPSBzZWVrQ29uZmlnLnVybDtcblxuICAgICAgICBsZXQgcmVhZGVyID0gdGhpcy5fcmVhZGVyID0gbmV3IHNlbGYuTVNTdHJlYW1SZWFkZXIoKTtcbiAgICAgICAgcmVhZGVyLm9ucHJvZ3Jlc3MgPSB0aGlzLl9tc3JPblByb2dyZXNzLmJpbmQodGhpcyk7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSB0aGlzLl9tc3JPbkxvYWQuYmluZCh0aGlzKTtcbiAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSB0aGlzLl9tc3JPbkVycm9yLmJpbmQodGhpcyk7XG5cbiAgICAgICAgbGV0IHhociA9IHRoaXMuX3hociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB4aHIub3BlbignR0VUJywgc2Vla0NvbmZpZy51cmwsIHRydWUpO1xuICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ21zLXN0cmVhbSc7XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB0aGlzLl94aHJPblJlYWR5U3RhdGVDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgeGhyLm9uZXJyb3IgPSB0aGlzLl94aHJPbkVycm9yLmJpbmQodGhpcyk7XG5cbiAgICAgICAgaWYgKGRhdGFTb3VyY2Uud2l0aENyZWRlbnRpYWxzKSB7XG4gICAgICAgICAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygc2Vla0NvbmZpZy5oZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSBzZWVrQ29uZmlnLmhlYWRlcnM7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBoZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkIGFkZGl0aW9uYWwgaGVhZGVyc1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2NvbmZpZy5oZWFkZXJzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLl9jb25maWcuaGVhZGVycztcblxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgaGVhZGVyc1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faXNSZWNvbm5lY3RpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzUmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0Nvbm5lY3Rpbmc7XG4gICAgICAgIH1cbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9XG5cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxBYm9ydCgpO1xuICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0NvbXBsZXRlO1xuICAgIH1cblxuICAgIF9pbnRlcm5hbEFib3J0KCkge1xuICAgICAgICBpZiAodGhpcy5fcmVhZGVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVhZGVyLnJlYWR5U3RhdGUgPT09IDEpIHsgIC8vIExPQURJTkdcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFkZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JlYWRlci5vbnByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRlci5vbmxvYWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fcmVhZGVyLm9uZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fcmVhZGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5feGhyKSB7XG4gICAgICAgICAgICB0aGlzLl94aHIuYWJvcnQoKTtcbiAgICAgICAgICAgIHRoaXMuX3hoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5feGhyID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF94aHJPblJlYWR5U3RhdGVDaGFuZ2UoZSkge1xuICAgICAgICBsZXQgeGhyID0gZS50YXJnZXQ7XG5cbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSAyKSB7ICAvLyBIRUFERVJTX1JFQ0VJVkVEXG4gICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8PSAyOTkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0J1ZmZlcmluZztcblxuICAgICAgICAgICAgICAgIGlmICh4aHIucmVzcG9uc2VVUkwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWRpcmVjdGVkVVJMID0gdGhpcy5fc2Vla0hhbmRsZXIucmVtb3ZlVVJMUGFyYW1ldGVycyh4aHIucmVzcG9uc2VVUkwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICE9PSB0aGlzLl9jdXJyZW50UmVxdWVzdFVSTCAmJiByZWRpcmVjdGVkVVJMICE9PSB0aGlzLl9jdXJyZW50UmVkaXJlY3RlZFVSTCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFJlZGlyZWN0ZWRVUkwgPSByZWRpcmVjdGVkVVJMO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX29uVVJMUmVkaXJlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblVSTFJlZGlyZWN0KHJlZGlyZWN0ZWRVUkwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGxlbmd0aEhlYWRlciA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignQ29udGVudC1MZW5ndGgnKTtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoSGVhZGVyICE9IG51bGwgJiYgdGhpcy5fY29udGVudExlbmd0aCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsZW5ndGggPSBwYXJzZUludChsZW5ndGhIZWFkZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGVudExlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vbkNvbnRlbnRMZW5ndGhLbm93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ29udGVudExlbmd0aEtub3duKHRoaXMuX2NvbnRlbnRMZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0Vycm9yO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vbkVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRXJyb3IoTG9hZGVyRXJyb3JzLkhUVFBfU1RBVFVTX0NPREVfSU5WQUxJRCwge2NvZGU6IHhoci5zdGF0dXMsIG1zZzogeGhyLnN0YXR1c1RleHR9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTVNTdHJlYW1Mb2FkZXI6IEh0dHAgY29kZSBpbnZhbGlkLCAnICsgeGhyLnN0YXR1cyArICcgJyArIHhoci5zdGF0dXNUZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDMpIHsgIC8vIExPQURJTkdcbiAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDw9IDI5OSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rQnVmZmVyaW5nO1xuXG4gICAgICAgICAgICAgICAgbGV0IG1zc3RyZWFtID0geGhyLnJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihtc3N0cmVhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfeGhyT25FcnJvcihlKSB7XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rRXJyb3I7XG4gICAgICAgIGxldCB0eXBlID0gTG9hZGVyRXJyb3JzLkVYQ0VQVElPTjtcbiAgICAgICAgbGV0IGluZm8gPSB7Y29kZTogLTEsIG1zZzogZS5jb25zdHJ1Y3Rvci5uYW1lICsgJyAnICsgZS50eXBlfTtcblxuICAgICAgICBpZiAodGhpcy5fb25FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcih0eXBlLCBpbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGluZm8ubXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9tc3JPblByb2dyZXNzKGUpIHtcbiAgICAgICAgbGV0IHJlYWRlciA9IGUudGFyZ2V0O1xuICAgICAgICBsZXQgYmlnYnVmZmVyID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgaWYgKGJpZ2J1ZmZlciA9PSBudWxsKSB7ICAvLyByZXN1bHQgbWF5IGJlIG51bGwsIHdvcmthcm91bmQgZm9yIGJ1Z2d5IE0kXG4gICAgICAgICAgICB0aGlzLl9kb1JlY29ubmVjdElmTmVlZGVkKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2xpY2UgPSBiaWdidWZmZXIuc2xpY2UodGhpcy5fbGFzdFRpbWVCdWZmZXJTaXplKTtcbiAgICAgICAgdGhpcy5fbGFzdFRpbWVCdWZmZXJTaXplID0gYmlnYnVmZmVyLmJ5dGVMZW5ndGg7XG4gICAgICAgIGxldCBieXRlU3RhcnQgPSB0aGlzLl90b3RhbFJhbmdlLmZyb20gKyB0aGlzLl9yZWNlaXZlZExlbmd0aDtcbiAgICAgICAgdGhpcy5fcmVjZWl2ZWRMZW5ndGggKz0gc2xpY2UuYnl0ZUxlbmd0aDtcblxuICAgICAgICBpZiAodGhpcy5fb25EYXRhQXJyaXZhbCkge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhQXJyaXZhbChzbGljZSwgYnl0ZVN0YXJ0LCB0aGlzLl9yZWNlaXZlZExlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmlnYnVmZmVyLmJ5dGVMZW5ndGggPj0gdGhpcy5fYnVmZmVyTGltaXQpIHtcbiAgICAgICAgICAgIExvZy52KHRoaXMuVEFHLCBgTVNTdHJlYW0gYnVmZmVyIGV4Y2VlZGVkIG1heCBzaXplIG5lYXIgJHtieXRlU3RhcnQgKyBzbGljZS5ieXRlTGVuZ3RofSwgcmVjb25uZWN0aW5nLi4uYCk7XG4gICAgICAgICAgICB0aGlzLl9kb1JlY29ubmVjdElmTmVlZGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZG9SZWNvbm5lY3RJZk5lZWRlZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRMZW5ndGggPT0gbnVsbCB8fCB0aGlzLl9yZWNlaXZlZExlbmd0aCA8IHRoaXMuX2NvbnRlbnRMZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzUmVjb25uZWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RUaW1lQnVmZmVyU2l6ZSA9IDA7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbEFib3J0KCk7XG5cbiAgICAgICAgICAgIGxldCByYW5nZSA9IHtcbiAgICAgICAgICAgICAgICBmcm9tOiB0aGlzLl90b3RhbFJhbmdlLmZyb20gKyB0aGlzLl9yZWNlaXZlZExlbmd0aCxcbiAgICAgICAgICAgICAgICB0bzogLTFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbE9wZW4odGhpcy5fZGF0YVNvdXJjZSwgcmFuZ2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX21zck9uTG9hZChlKSB7ICAvLyBhY3R1YWxseSBpdCBpcyBvbkNvbXBsZXRlIGV2ZW50XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IExvYWRlclN0YXR1cy5rQ29tcGxldGU7XG4gICAgICAgIGlmICh0aGlzLl9vbkNvbXBsZXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNvbXBsZXRlKHRoaXMuX3RvdGFsUmFuZ2UuZnJvbSwgdGhpcy5fdG90YWxSYW5nZS5mcm9tICsgdGhpcy5fcmVjZWl2ZWRMZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9tc3JPbkVycm9yKGUpIHtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtFcnJvcjtcbiAgICAgICAgbGV0IHR5cGUgPSAwO1xuICAgICAgICBsZXQgaW5mbyA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRMZW5ndGggJiYgdGhpcy5fcmVjZWl2ZWRMZW5ndGggPCB0aGlzLl9jb250ZW50TGVuZ3RoKSB7XG4gICAgICAgICAgICB0eXBlID0gTG9hZGVyRXJyb3JzLkVBUkxZX0VPRjtcbiAgICAgICAgICAgIGluZm8gPSB7Y29kZTogLTEsIG1zZzogJ01TU3RyZWFtIG1lZXQgRWFybHktRW9mJ307XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0eXBlID0gTG9hZGVyRXJyb3JzLkVBUkxZX0VPRjtcbiAgICAgICAgICAgIGluZm8gPSB7Y29kZTogLTEsIG1zZzogZS5jb25zdHJ1Y3Rvci5uYW1lICsgJyAnICsgZS50eXBlfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9vbkVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkVycm9yKHR5cGUsIGluZm8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaW5mby5tc2cpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNU1N0cmVhbUxvYWRlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IExvZyBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IFNwZWVkU2FtcGxlciBmcm9tICcuL3NwZWVkLXNhbXBsZXIuanMnO1xuaW1wb3J0IHtCYXNlTG9hZGVyLCBMb2FkZXJTdGF0dXMsIExvYWRlckVycm9yc30gZnJvbSAnLi9sb2FkZXIuanMnO1xuaW1wb3J0IHtSdW50aW1lRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9leGNlcHRpb24uanMnO1xuXG4vLyBVbml2ZXJzYWwgSU8gTG9hZGVyLCBpbXBsZW1lbnRlZCBieSBhZGRpbmcgUmFuZ2UgaGVhZGVyIGluIHhocidzIHJlcXVlc3QgaGVhZGVyXG5jbGFzcyBSYW5nZUxvYWRlciBleHRlbmRzIEJhc2VMb2FkZXIge1xuXG4gICAgc3RhdGljIGlzU3VwcG9ydGVkKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgeGhyLm9wZW4oJ0dFVCcsICdodHRwczovL2V4YW1wbGUuY29tJywgdHJ1ZSk7XG4gICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgICAgICAgIHJldHVybiAoeGhyLnJlc3BvbnNlVHlwZSA9PT0gJ2FycmF5YnVmZmVyJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIExvZy53KCdSYW5nZUxvYWRlcicsIGUubWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihzZWVrSGFuZGxlciwgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKCd4aHItcmFuZ2UtbG9hZGVyJyk7XG4gICAgICAgIHRoaXMuVEFHID0gJ1JhbmdlTG9hZGVyJztcblxuICAgICAgICB0aGlzLl9zZWVrSGFuZGxlciA9IHNlZWtIYW5kbGVyO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX25lZWRTdGFzaCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuX2NodW5rU2l6ZUtCTGlzdCA9IFtcbiAgICAgICAgICAgIDEyOCwgMjU2LCAzODQsIDUxMiwgNzY4LCAxMDI0LCAxNTM2LCAyMDQ4LCAzMDcyLCA0MDk2LCA1MTIwLCA2MTQ0LCA3MTY4LCA4MTkyXG4gICAgICAgIF07XG4gICAgICAgIHRoaXMuX2N1cnJlbnRDaHVua1NpemVLQiA9IDM4NDtcbiAgICAgICAgdGhpcy5fY3VycmVudFNwZWVkTm9ybWFsaXplZCA9IDA7XG4gICAgICAgIHRoaXMuX3plcm9TcGVlZENodW5rQ291bnQgPSAwO1xuXG4gICAgICAgIHRoaXMuX3hociA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NwZWVkU2FtcGxlciA9IG5ldyBTcGVlZFNhbXBsZXIoKTtcblxuICAgICAgICB0aGlzLl9yZXF1ZXN0QWJvcnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fd2FpdEZvclRvdGFsTGVuZ3RoID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoUmVjZWl2ZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLl9jdXJyZW50UmVxdWVzdFVSTCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRSZWRpcmVjdGVkVVJMID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY3VycmVudFJlcXVlc3RSYW5nZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gbnVsbDsgIC8vIHNpemUgb2YgdGhlIGVudGlyZSBmaWxlXG4gICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSBudWxsOyAgLy8gQ29udGVudC1MZW5ndGggb2YgZW50aXJlIHJlcXVlc3QgcmFuZ2VcbiAgICAgICAgdGhpcy5fcmVjZWl2ZWRMZW5ndGggPSAwOyAgLy8gdG90YWwgcmVjZWl2ZWQgYnl0ZXNcbiAgICAgICAgdGhpcy5fbGFzdFRpbWVMb2FkZWQgPSAwOyAgLy8gcmVjZWl2ZWQgYnl0ZXMgb2YgY3VycmVudCByZXF1ZXN0IHN1Yi1yYW5nZVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmlzV29ya2luZygpKSB7XG4gICAgICAgICAgICB0aGlzLmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3hocikge1xuICAgICAgICAgICAgdGhpcy5feGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl94aHIub25wcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl94aHIub25sb2FkID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3hoci5vbmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3hociA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIGdldCBjdXJyZW50U3BlZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zcGVlZFNhbXBsZXIubGFzdFNlY29uZEtCcHM7XG4gICAgfVxuXG4gICAgb3BlbihkYXRhU291cmNlLCByYW5nZSkge1xuICAgICAgICB0aGlzLl9kYXRhU291cmNlID0gZGF0YVNvdXJjZTtcbiAgICAgICAgdGhpcy5fcmFuZ2UgPSByYW5nZTtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtDb25uZWN0aW5nO1xuXG4gICAgICAgIGxldCB1c2VSZWZUb3RhbExlbmd0aCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fZGF0YVNvdXJjZS5maWxlc2l6ZSAhPSB1bmRlZmluZWQgJiYgdGhpcy5fZGF0YVNvdXJjZS5maWxlc2l6ZSAhPT0gMCkge1xuICAgICAgICAgICAgdXNlUmVmVG90YWxMZW5ndGggPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggPSB0aGlzLl9kYXRhU291cmNlLmZpbGVzaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl90b3RhbExlbmd0aFJlY2VpdmVkICYmICF1c2VSZWZUb3RhbExlbmd0aCkge1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0b3RhbCBmaWxlc2l6ZVxuICAgICAgICAgICAgdGhpcy5fd2FpdEZvclRvdGFsTGVuZ3RoID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2ludGVybmFsT3Blbih0aGlzLl9kYXRhU291cmNlLCB7ZnJvbTogMCwgdG86IC0xfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBXZSBoYXZlIGZpbGVzaXplLCBzdGFydCBsb2FkaW5nXG4gICAgICAgICAgICB0aGlzLl9vcGVuU3ViUmFuZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vcGVuU3ViUmFuZ2UoKSB7XG4gICAgICAgIGxldCBjaHVua1NpemUgPSB0aGlzLl9jdXJyZW50Q2h1bmtTaXplS0IgKiAxMDI0O1xuXG4gICAgICAgIGxldCBmcm9tID0gdGhpcy5fcmFuZ2UuZnJvbSArIHRoaXMuX3JlY2VpdmVkTGVuZ3RoO1xuICAgICAgICBsZXQgdG8gPSBmcm9tICsgY2h1bmtTaXplO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50TGVuZ3RoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0byAtIHRoaXMuX3JhbmdlLmZyb20gPj0gdGhpcy5fY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRvID0gdGhpcy5fcmFuZ2UuZnJvbSArIHRoaXMuX2NvbnRlbnRMZW5ndGggLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3VycmVudFJlcXVlc3RSYW5nZSA9IHtmcm9tLCB0b307XG4gICAgICAgIHRoaXMuX2ludGVybmFsT3Blbih0aGlzLl9kYXRhU291cmNlLCB0aGlzLl9jdXJyZW50UmVxdWVzdFJhbmdlKTtcbiAgICB9XG5cbiAgICBfaW50ZXJuYWxPcGVuKGRhdGFTb3VyY2UsIHJhbmdlKSB7XG4gICAgICAgIHRoaXMuX2xhc3RUaW1lTG9hZGVkID0gMDtcblxuICAgICAgICBsZXQgc291cmNlVVJMID0gZGF0YVNvdXJjZS51cmw7XG4gICAgICAgIGlmICh0aGlzLl9jb25maWcucmV1c2VSZWRpcmVjdGVkVVJMKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFJlZGlyZWN0ZWRVUkwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc291cmNlVVJMID0gdGhpcy5fY3VycmVudFJlZGlyZWN0ZWRVUkw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFTb3VyY2UucmVkaXJlY3RlZFVSTCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VVUkwgPSBkYXRhU291cmNlLnJlZGlyZWN0ZWRVUkw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2Vla0NvbmZpZyA9IHRoaXMuX3NlZWtIYW5kbGVyLmdldENvbmZpZyhzb3VyY2VVUkwsIHJhbmdlKTtcbiAgICAgICAgdGhpcy5fY3VycmVudFJlcXVlc3RVUkwgPSBzZWVrQ29uZmlnLnVybDtcblxuICAgICAgICBsZXQgeGhyID0gdGhpcy5feGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHhoci5vcGVuKCdHRVQnLCBzZWVrQ29uZmlnLnVybCwgdHJ1ZSk7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gdGhpcy5fb25SZWFkeVN0YXRlQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIHhoci5vbnByb2dyZXNzID0gdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpO1xuICAgICAgICB4aHIub25sb2FkID0gdGhpcy5fb25Mb2FkLmJpbmQodGhpcyk7XG4gICAgICAgIHhoci5vbmVycm9yID0gdGhpcy5fb25YaHJFcnJvci5iaW5kKHRoaXMpO1xuXG4gICAgICAgIGlmIChkYXRhU291cmNlLndpdGhDcmVkZW50aWFscykge1xuICAgICAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHNlZWtDb25maWcuaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzID0gc2Vla0NvbmZpZy5oZWFkZXJzO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gaGVhZGVycykge1xuICAgICAgICAgICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoa2V5LCBoZWFkZXJzW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCBhZGRpdGlvbmFsIGhlYWRlcnNcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9jb25maWcuaGVhZGVycyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5fY29uZmlnLmhlYWRlcnM7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBoZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgeGhyLnNlbmQoKTtcbiAgICB9XG5cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdEFib3J0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5faW50ZXJuYWxBYm9ydCgpO1xuICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0NvbXBsZXRlO1xuICAgIH1cblxuICAgIF9pbnRlcm5hbEFib3J0KCkge1xuICAgICAgICBpZiAodGhpcy5feGhyKSB7XG4gICAgICAgICAgICB0aGlzLl94aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3hoci5vbnByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3hoci5vbmxvYWQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5feGhyLm9uZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5feGhyLmFib3J0KCk7XG4gICAgICAgICAgICB0aGlzLl94aHIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uUmVhZHlTdGF0ZUNoYW5nZShlKSB7XG4gICAgICAgIGxldCB4aHIgPSBlLnRhcmdldDtcblxuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDIpIHsgIC8vIEhFQURFUlNfUkVDRUlWRURcbiAgICAgICAgICAgIGlmICh4aHIucmVzcG9uc2VVUkwgIT0gdW5kZWZpbmVkKSB7ICAvLyBpZiB0aGUgYnJvd3NlciBzdXBwb3J0IHRoaXMgcHJvcGVydHlcbiAgICAgICAgICAgICAgICBsZXQgcmVkaXJlY3RlZFVSTCA9IHRoaXMuX3NlZWtIYW5kbGVyLnJlbW92ZVVSTFBhcmFtZXRlcnMoeGhyLnJlc3BvbnNlVVJMKTtcbiAgICAgICAgICAgICAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICE9PSB0aGlzLl9jdXJyZW50UmVxdWVzdFVSTCAmJiByZWRpcmVjdGVkVVJMICE9PSB0aGlzLl9jdXJyZW50UmVkaXJlY3RlZFVSTCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50UmVkaXJlY3RlZFVSTCA9IHJlZGlyZWN0ZWRVUkw7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vblVSTFJlZGlyZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblVSTFJlZGlyZWN0KHJlZGlyZWN0ZWRVUkwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoKHhoci5zdGF0dXMgPj0gMjAwICYmIHhoci5zdGF0dXMgPD0gMjk5KSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl93YWl0Rm9yVG90YWxMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBMb2FkZXJTdGF0dXMua0J1ZmZlcmluZztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtFcnJvcjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb25FcnJvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkVycm9yKExvYWRlckVycm9ycy5IVFRQX1NUQVRVU19DT0RFX0lOVkFMSUQsIHtjb2RlOiB4aHIuc3RhdHVzLCBtc2c6IHhoci5zdGF0dXNUZXh0fSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1JhbmdlTG9hZGVyOiBIdHRwIGNvZGUgaW52YWxpZCwgJyArIHhoci5zdGF0dXMgKyAnICcgKyB4aHIuc3RhdHVzVGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uUHJvZ3Jlc3MoZSkge1xuICAgICAgICBpZiAodGhpcy5fc3RhdHVzID09PSBMb2FkZXJTdGF0dXMua0Vycm9yKSB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3IgcmVzcG9uc2VcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50TGVuZ3RoID09PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgb3Blbk5leHRSYW5nZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fd2FpdEZvclRvdGFsTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2FpdEZvclRvdGFsTGVuZ3RoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGhSZWNlaXZlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgb3Blbk5leHRSYW5nZSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICBsZXQgdG90YWwgPSBlLnRvdGFsO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVybmFsQWJvcnQoKTtcbiAgICAgICAgICAgICAgICBpZiAodG90YWwgIT0gbnVsbCAmIHRvdGFsICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gdG90YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgY3VycnJlbnQgcmVxdWVzdCByYW5nZSdzIGNvbnRlbnRMZW5ndGhcbiAgICAgICAgICAgIGlmICh0aGlzLl9yYW5nZS50byA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZW50TGVuZ3RoID0gdGhpcy5fdG90YWxMZW5ndGggLSB0aGlzLl9yYW5nZS5mcm9tO1xuICAgICAgICAgICAgfSBlbHNlIHsgIC8vIHRvICE9PSAtMVxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRMZW5ndGggPSB0aGlzLl9yYW5nZS50byAtIHRoaXMuX3JhbmdlLmZyb20gKyAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3Blbk5leHRSYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29wZW5TdWJSYW5nZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9vbkNvbnRlbnRMZW5ndGhLbm93bikge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uQ29udGVudExlbmd0aEtub3duKHRoaXMuX2NvbnRlbnRMZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRlbHRhID0gZS5sb2FkZWQgLSB0aGlzLl9sYXN0VGltZUxvYWRlZDtcbiAgICAgICAgdGhpcy5fbGFzdFRpbWVMb2FkZWQgPSBlLmxvYWRlZDtcbiAgICAgICAgdGhpcy5fc3BlZWRTYW1wbGVyLmFkZEJ5dGVzKGRlbHRhKTtcbiAgICB9XG5cbiAgICBfbm9ybWFsaXplU3BlZWQoaW5wdXQpIHtcbiAgICAgICAgbGV0IGxpc3QgPSB0aGlzLl9jaHVua1NpemVLQkxpc3Q7XG4gICAgICAgIGxldCBsYXN0ID0gbGlzdC5sZW5ndGggLSAxO1xuICAgICAgICBsZXQgbWlkID0gMDtcbiAgICAgICAgbGV0IGxib3VuZCA9IDA7XG4gICAgICAgIGxldCB1Ym91bmQgPSBsYXN0O1xuXG4gICAgICAgIGlmIChpbnB1dCA8IGxpc3RbMF0pIHtcbiAgICAgICAgICAgIHJldHVybiBsaXN0WzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGxib3VuZCA8PSB1Ym91bmQpIHtcbiAgICAgICAgICAgIG1pZCA9IGxib3VuZCArIE1hdGguZmxvb3IoKHVib3VuZCAtIGxib3VuZCkgLyAyKTtcbiAgICAgICAgICAgIGlmIChtaWQgPT09IGxhc3QgfHwgKGlucHV0ID49IGxpc3RbbWlkXSAmJiBpbnB1dCA8IGxpc3RbbWlkICsgMV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RbbWlkXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGlzdFttaWRdIDwgaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBsYm91bmQgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1Ym91bmQgPSBtaWQgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29uTG9hZChlKSB7XG4gICAgICAgIGlmICh0aGlzLl9zdGF0dXMgPT09IExvYWRlclN0YXR1cy5rRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvciByZXNwb25zZVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3dhaXRGb3JUb3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fd2FpdEZvclRvdGFsTGVuZ3RoID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sYXN0VGltZUxvYWRlZCA9IDA7XG4gICAgICAgIGxldCBLQnBzID0gdGhpcy5fc3BlZWRTYW1wbGVyLmxhc3RTZWNvbmRLQnBzO1xuICAgICAgICBpZiAoS0JwcyA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5femVyb1NwZWVkQ2h1bmtDb3VudCsrO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3plcm9TcGVlZENodW5rQ291bnQgPj0gMykge1xuICAgICAgICAgICAgICAgIC8vIFRyeSBnZXQgY3VycmVudEtCcHMgYWZ0ZXIgMyBjaHVua3NcbiAgICAgICAgICAgICAgICBLQnBzID0gdGhpcy5fc3BlZWRTYW1wbGVyLmN1cnJlbnRLQnBzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEtCcHMgIT09IDApIHtcbiAgICAgICAgICAgIGxldCBub3JtYWxpemVkID0gdGhpcy5fbm9ybWFsaXplU3BlZWQoS0Jwcyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFNwZWVkTm9ybWFsaXplZCAhPT0gbm9ybWFsaXplZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRTcGVlZE5vcm1hbGl6ZWQgPSBub3JtYWxpemVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRDaHVua1NpemVLQiA9IG5vcm1hbGl6ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2h1bmsgPSBlLnRhcmdldC5yZXNwb25zZTtcbiAgICAgICAgbGV0IGJ5dGVTdGFydCA9IHRoaXMuX3JhbmdlLmZyb20gKyB0aGlzLl9yZWNlaXZlZExlbmd0aDtcbiAgICAgICAgdGhpcy5fcmVjZWl2ZWRMZW5ndGggKz0gY2h1bmsuYnl0ZUxlbmd0aDtcblxuICAgICAgICBsZXQgcmVwb3J0Q29tcGxldGUgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5fY29udGVudExlbmd0aCAhPSBudWxsICYmIHRoaXMuX3JlY2VpdmVkTGVuZ3RoIDwgdGhpcy5fY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgLy8gY29udGludWUgbG9hZCBuZXh0IGNodW5rXG4gICAgICAgICAgICB0aGlzLl9vcGVuU3ViUmFuZ2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcG9ydENvbXBsZXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRpc3BhdGNoIHJlY2VpdmVkIGNodW5rXG4gICAgICAgIGlmICh0aGlzLl9vbkRhdGFBcnJpdmFsKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkRhdGFBcnJpdmFsKGNodW5rLCBieXRlU3RhcnQsIHRoaXMuX3JlY2VpdmVkTGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXBvcnRDb21wbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtDb21wbGV0ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vbkNvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Db21wbGV0ZSh0aGlzLl9yYW5nZS5mcm9tLCB0aGlzLl9yYW5nZS5mcm9tICsgdGhpcy5fcmVjZWl2ZWRMZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vblhockVycm9yKGUpIHtcbiAgICAgICAgdGhpcy5fc3RhdHVzID0gTG9hZGVyU3RhdHVzLmtFcnJvcjtcbiAgICAgICAgbGV0IHR5cGUgPSAwO1xuICAgICAgICBsZXQgaW5mbyA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRlbnRMZW5ndGggJiYgdGhpcy5fcmVjZWl2ZWRMZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX3JlY2VpdmVkTGVuZ3RoIDwgdGhpcy5fY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgdHlwZSA9IExvYWRlckVycm9ycy5FQVJMWV9FT0Y7XG4gICAgICAgICAgICBpbmZvID0ge2NvZGU6IC0xLCBtc2c6ICdSYW5nZUxvYWRlciBtZWV0IEVhcmx5LUVvZid9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHlwZSA9IExvYWRlckVycm9ycy5FWENFUFRJT047XG4gICAgICAgICAgICBpbmZvID0ge2NvZGU6IC0xLCBtc2c6IGUuY29uc3RydWN0b3IubmFtZSArICcgJyArIGUudHlwZX07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fb25FcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fb25FcnJvcih0eXBlLCBpbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGluZm8ubXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBSYW5nZUxvYWRlcjsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnO1xuaW1wb3J0IExvZyBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IEJyb3dzZXIgZnJvbSAnLi4vdXRpbHMvYnJvd3Nlci5qcyc7XG5pbXBvcnQgUGxheWVyRXZlbnRzIGZyb20gJy4vcGxheWVyLWV2ZW50cy5qcyc7XG5pbXBvcnQgVHJhbnNtdXhlciBmcm9tICcuLi9jb3JlL3RyYW5zbXV4ZXIuanMnO1xuaW1wb3J0IFRyYW5zbXV4aW5nRXZlbnRzIGZyb20gJy4uL2NvcmUvdHJhbnNtdXhpbmctZXZlbnRzLmpzJztcbmltcG9ydCBNU0VDb250cm9sbGVyIGZyb20gJy4uL2NvcmUvbXNlLWNvbnRyb2xsZXIuanMnO1xuaW1wb3J0IE1TRUV2ZW50cyBmcm9tICcuLi9jb3JlL21zZS1ldmVudHMuanMnO1xuaW1wb3J0IHtFcnJvclR5cGVzLCBFcnJvckRldGFpbHN9IGZyb20gJy4vcGxheWVyLWVycm9ycy5qcyc7XG5pbXBvcnQge2NyZWF0ZURlZmF1bHRDb25maWd9IGZyb20gJy4uL2NvbmZpZy5qcyc7XG5pbXBvcnQge0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9leGNlcHRpb24uanMnO1xuXG5jbGFzcyBGbHZQbGF5ZXIge1xuXG4gICAgY29uc3RydWN0b3IobWVkaWFEYXRhU291cmNlLCBjb25maWcpIHtcbiAgICAgICAgdGhpcy5UQUcgPSAnRmx2UGxheWVyJztcbiAgICAgICAgdGhpcy5fdHlwZSA9ICdGbHZQbGF5ZXInO1xuICAgICAgICB0aGlzLl9lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNyZWF0ZURlZmF1bHRDb25maWcoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX2NvbmZpZywgY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZWRpYURhdGFTb3VyY2UudHlwZS50b0xvd2VyQ2FzZSgpICE9PSAnZmx2Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignRmx2UGxheWVyIHJlcXVpcmVzIGFuIGZsdiBNZWRpYURhdGFTb3VyY2UgaW5wdXQhJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVkaWFEYXRhU291cmNlLmlzTGl2ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5fY29uZmlnLmlzTGl2ZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmUgPSB7XG4gICAgICAgICAgICBvbnZMb2FkZWRNZXRhZGF0YTogdGhpcy5fb252TG9hZGVkTWV0YWRhdGEuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9udlNlZWtpbmc6IHRoaXMuX29udlNlZWtpbmcuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9udkNhblBsYXk6IHRoaXMuX29udkNhblBsYXkuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9udlN0YWxsZWQ6IHRoaXMuX29udlN0YWxsZWQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9udlByb2dyZXNzOiB0aGlzLl9vbnZQcm9ncmVzcy5iaW5kKHRoaXMpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHNlbGYucGVyZm9ybWFuY2UgJiYgc2VsZi5wZXJmb3JtYW5jZS5ub3cpIHtcbiAgICAgICAgICAgIHRoaXMuX25vdyA9IHNlbGYucGVyZm9ybWFuY2Uubm93LmJpbmQoc2VsZi5wZXJmb3JtYW5jZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9ub3cgPSBEYXRlLm5vdztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3BlbmRpbmdTZWVrVGltZSA9IG51bGw7ICAvLyBpbiBzZWNvbmRzXG4gICAgICAgIHRoaXMuX3JlcXVlc3RTZXRUaW1lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3NlZWtwb2ludFJlY29yZCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3Byb2dyZXNzQ2hlY2tlciA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fbWVkaWFEYXRhU291cmNlID0gbWVkaWFEYXRhU291cmNlO1xuICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9tc2VjdGwgPSBudWxsO1xuICAgICAgICB0aGlzLl90cmFuc211eGVyID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9tc2VTb3VyY2VPcGVuZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faGFzUGVuZGluZ0xvYWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcmVjZWl2ZWRDYW5QbGF5ID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fbWVkaWFJbmZvID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc3RhdGlzdGljc0luZm8gPSBudWxsO1xuXG4gICAgICAgIGxldCBjaHJvbWVOZWVkSURSRml4ID0gKEJyb3dzZXIuY2hyb21lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJyb3dzZXIudmVyc2lvbi5tYWpvciA8IDUwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJyb3dzZXIudmVyc2lvbi5tYWpvciA9PT0gNTAgJiYgQnJvd3Nlci52ZXJzaW9uLmJ1aWxkIDwgMjY2MSkpKTtcbiAgICAgICAgdGhpcy5fYWx3YXlzU2Vla0tleWZyYW1lID0gKGNocm9tZU5lZWRJRFJGaXggfHwgQnJvd3Nlci5tc2VkZ2UgfHwgQnJvd3Nlci5tc2llKSA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5fYWx3YXlzU2Vla0tleWZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9jb25maWcuYWNjdXJhdGVTZWVrID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5fcHJvZ3Jlc3NDaGVja2VyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX3Byb2dyZXNzQ2hlY2tlcik7XG4gICAgICAgICAgICB0aGlzLl9wcm9ncmVzc0NoZWNrZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90cmFuc211eGVyKSB7XG4gICAgICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZGV0YWNoTWVkaWFFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWVkaWFEYXRhU291cmNlID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9lbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLl9lbWl0dGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKGV2ZW50ID09PSBQbGF5ZXJFdmVudHMuTUVESUFfSU5GTykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX21lZGlhSW5mbyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChQbGF5ZXJFdmVudHMuTUVESUFfSU5GTywgdGhpcy5tZWRpYUluZm8pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSBQbGF5ZXJFdmVudHMuU1RBVElTVElDU19JTkZPKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc3RhdGlzdGljc0luZm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoUGxheWVyRXZlbnRzLlNUQVRJU1RJQ1NfSU5GTywgdGhpcy5zdGF0aXN0aWNzSW5mbyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZW1pdHRlci5hZGRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIG9mZihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIGF0dGFjaE1lZGlhRWxlbWVudChtZWRpYUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50ID0gbWVkaWFFbGVtZW50O1xuICAgICAgICBtZWRpYUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCB0aGlzLmUub252TG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICBtZWRpYUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Vla2luZycsIHRoaXMuZS5vbnZTZWVraW5nKTtcbiAgICAgICAgbWVkaWFFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NhbnBsYXknLCB0aGlzLmUub252Q2FuUGxheSk7XG4gICAgICAgIG1lZGlhRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzdGFsbGVkJywgdGhpcy5lLm9udlN0YWxsZWQpO1xuICAgICAgICBtZWRpYUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCB0aGlzLmUub252UHJvZ3Jlc3MpO1xuXG4gICAgICAgIHRoaXMuX21zZWN0bCA9IG5ldyBNU0VDb250cm9sbGVyKHRoaXMuX2NvbmZpZyk7XG5cbiAgICAgICAgdGhpcy5fbXNlY3RsLm9uKE1TRUV2ZW50cy5VUERBVEVfRU5ELCB0aGlzLl9vbm1zZVVwZGF0ZUVuZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5fbXNlY3RsLm9uKE1TRUV2ZW50cy5CVUZGRVJfRlVMTCwgdGhpcy5fb25tc2VCdWZmZXJGdWxsLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLl9tc2VjdGwub24oTVNFRXZlbnRzLlNPVVJDRV9PUEVOLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9tc2VTb3VyY2VPcGVuZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2hhc1BlbmRpbmdMb2FkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFzUGVuZGluZ0xvYWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX21zZWN0bC5vbihNU0VFdmVudHMuRVJST1IsIChpbmZvKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoUGxheWVyRXZlbnRzLkVSUk9SLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yVHlwZXMuTUVESUFfRVJST1IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JEZXRhaWxzLk1FRElBX01TRV9FUlJPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9tc2VjdGwuYXR0YWNoTWVkaWFFbGVtZW50KG1lZGlhRWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdTZWVrVGltZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG1lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IHRoaXMuX3BlbmRpbmdTZWVrVGltZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nU2Vla1RpbWUgPSBudWxsO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIElFMTEgbWF5IHRocm93IEludmFsaWRTdGF0ZUVycm9yIGlmIHJlYWR5U3RhdGUgPT09IDBcbiAgICAgICAgICAgICAgICAvLyBXZSBjYW4gZGVmZXIgc2V0IGN1cnJlbnRUaW1lIG9wZXJhdGlvbiBhZnRlciBsb2FkZWRtZXRhZGF0YVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGV0YWNoTWVkaWFFbGVtZW50KCkge1xuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9tc2VjdGwuZGV0YWNoTWVkaWFFbGVtZW50KCk7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCB0aGlzLmUub252TG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NlZWtpbmcnLCB0aGlzLmUub252U2Vla2luZyk7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2FucGxheScsIHRoaXMuZS5vbnZDYW5QbGF5KTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzdGFsbGVkJywgdGhpcy5lLm9udlN0YWxsZWQpO1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgdGhpcy5lLm9udlByb2dyZXNzKTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21zZWN0bCkge1xuICAgICAgICAgICAgdGhpcy5fbXNlY3RsLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuX21zZWN0bCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX21lZGlhRWxlbWVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbignSFRNTE1lZGlhRWxlbWVudCBtdXN0IGJlIGF0dGFjaGVkIGJlZm9yZSBsb2FkKCkhJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3RyYW5zbXV4ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oJ0ZsdlBsYXllci5sb2FkKCkgaGFzIGJlZW4gY2FsbGVkLCBwbGVhc2UgY2FsbCB1bmxvYWQoKSBmaXJzdCEnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faGFzUGVuZGluZ0xvYWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuZGVmZXJMb2FkQWZ0ZXJTb3VyY2VPcGVuICYmIHRoaXMuX21zZVNvdXJjZU9wZW5lZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhc1BlbmRpbmdMb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQucmVhZHlTdGF0ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RTZXRUaW1lID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIElFMTEgbWF5IHRocm93IEludmFsaWRTdGF0ZUVycm9yIGlmIHJlYWR5U3RhdGUgPT09IDBcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90cmFuc211eGVyID0gbmV3IFRyYW5zbXV4ZXIodGhpcy5fbWVkaWFEYXRhU291cmNlLCB0aGlzLl9jb25maWcpO1xuXG4gICAgICAgIHRoaXMuX3RyYW5zbXV4ZXIub24oVHJhbnNtdXhpbmdFdmVudHMuSU5JVF9TRUdNRU5ULCAodHlwZSwgaXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX21zZWN0bC5hcHBlbmRJbml0U2VnbWVudChpcyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc211eGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLk1FRElBX1NFR01FTlQsICh0eXBlLCBtcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbXNlY3RsLmFwcGVuZE1lZGlhU2VnbWVudChtcyk7XG5cbiAgICAgICAgICAgIC8vIGxhenlMb2FkIGNoZWNrXG4gICAgICAgICAgICBpZiAodGhpcy5fY29uZmlnLmxhenlMb2FkICYmICF0aGlzLl9jb25maWcuaXNMaXZlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRUaW1lID0gdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lO1xuICAgICAgICAgICAgICAgIGlmIChtcy5pbmZvLmVuZER0cyA+PSAoY3VycmVudFRpbWUgKyB0aGlzLl9jb25maWcubGF6eUxvYWRNYXhEdXJhdGlvbikgKiAxMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9ncmVzc0NoZWNrZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYodGhpcy5UQUcsICdNYXhpbXVtIGJ1ZmZlcmluZyBkdXJhdGlvbiBleGNlZWRlZCwgc3VzcGVuZCB0cmFuc211eGluZyB0YXNrJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdXNwZW5kVHJhbnNtdXhlcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdHJhbnNtdXhlci5vbihUcmFuc211eGluZ0V2ZW50cy5MT0FESU5HX0NPTVBMRVRFLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9tc2VjdGwuZW5kT2ZTdHJlYW0oKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChQbGF5ZXJFdmVudHMuTE9BRElOR19DT01QTEVURSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc211eGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLlJFQ09WRVJFRF9FQVJMWV9FT0YsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChQbGF5ZXJFdmVudHMuUkVDT1ZFUkVEX0VBUkxZX0VPRik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc211eGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLklPX0VSUk9SLCAoZGV0YWlsLCBpbmZvKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoUGxheWVyRXZlbnRzLkVSUk9SLCBFcnJvclR5cGVzLk5FVFdPUktfRVJST1IsIGRldGFpbCwgaW5mbyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc211eGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLkRFTVVYX0VSUk9SLCAoZGV0YWlsLCBpbmZvKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoUGxheWVyRXZlbnRzLkVSUk9SLCBFcnJvclR5cGVzLk1FRElBX0VSUk9SLCBkZXRhaWwsIHtjb2RlOiAtMSwgbXNnOiBpbmZvfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc211eGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLk1FRElBX0lORk8sIChtZWRpYUluZm8pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhSW5mbyA9IG1lZGlhSW5mbztcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChQbGF5ZXJFdmVudHMuTUVESUFfSU5GTywgT2JqZWN0LmFzc2lnbih7fSwgbWVkaWFJbmZvKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc211eGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLk1FVEFEQVRBX0FSUklWRUQsIChtZXRhZGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFBsYXllckV2ZW50cy5NRVRBREFUQV9BUlJJVkVELCBtZXRhZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90cmFuc211eGVyLm9uKFRyYW5zbXV4aW5nRXZlbnRzLlNDUklQVERBVEFfQVJSSVZFRCwgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChQbGF5ZXJFdmVudHMuU0NSSVBUREFUQV9BUlJJVkVELCBkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3RyYW5zbXV4ZXIub24oVHJhbnNtdXhpbmdFdmVudHMuU1RBVElTVElDU19JTkZPLCAoc3RhdEluZm8pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRpc3RpY3NJbmZvID0gdGhpcy5fZmlsbFN0YXRpc3RpY3NJbmZvKHN0YXRJbmZvKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChQbGF5ZXJFdmVudHMuU1RBVElTVElDU19JTkZPLCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9zdGF0aXN0aWNzSW5mbykpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fdHJhbnNtdXhlci5vbihUcmFuc211eGluZ0V2ZW50cy5SRUNPTU1FTkRfU0VFS1BPSU5ULCAobWlsbGlzZWNvbmRzKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50ICYmICF0aGlzLl9jb25maWcuYWNjdXJhdGVTZWVrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdFNldFRpbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IG1pbGxpc2Vjb25kcyAvIDEwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3RyYW5zbXV4ZXIub3BlbigpO1xuICAgIH1cblxuICAgIHVubG9hZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21lZGlhRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21zZWN0bCkge1xuICAgICAgICAgICAgdGhpcy5fbXNlY3RsLnNlZWsoMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3RyYW5zbXV4ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zbXV4ZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zbXV4ZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNtdXhlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwbGF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVkaWFFbGVtZW50LnBsYXkoKTtcbiAgICB9XG5cbiAgICBwYXVzZSgpIHtcbiAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LnBhdXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xuICAgIH1cblxuICAgIGdldCBidWZmZXJlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhRWxlbWVudC5idWZmZXJlZDtcbiAgICB9XG5cbiAgICBnZXQgZHVyYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZWRpYUVsZW1lbnQuZHVyYXRpb247XG4gICAgfVxuXG4gICAgZ2V0IHZvbHVtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhRWxlbWVudC52b2x1bWU7XG4gICAgfVxuXG4gICAgc2V0IHZvbHVtZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQudm9sdW1lID0gdmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IG11dGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVkaWFFbGVtZW50Lm11dGVkO1xuICAgIH1cblxuICAgIHNldCBtdXRlZChtdXRlZCkge1xuICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQubXV0ZWQgPSBtdXRlZDtcbiAgICB9XG5cbiAgICBnZXQgY3VycmVudFRpbWUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgc2V0IGN1cnJlbnRUaW1lKHNlY29uZHMpIHtcbiAgICAgICAgaWYgKHRoaXMuX21lZGlhRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxTZWVrKHNlY29uZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1NlZWtUaW1lID0gc2Vjb25kcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBtZWRpYUluZm8oKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9tZWRpYUluZm8pO1xuICAgIH1cblxuICAgIGdldCBzdGF0aXN0aWNzSW5mbygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3N0YXRpc3RpY3NJbmZvID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRpc3RpY3NJbmZvID0ge307XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RhdGlzdGljc0luZm8gPSB0aGlzLl9maWxsU3RhdGlzdGljc0luZm8odGhpcy5fc3RhdGlzdGljc0luZm8pO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fc3RhdGlzdGljc0luZm8pO1xuICAgIH1cblxuICAgIF9maWxsU3RhdGlzdGljc0luZm8oc3RhdEluZm8pIHtcbiAgICAgICAgc3RhdEluZm8ucGxheWVyVHlwZSA9IHRoaXMuX3R5cGU7XG5cbiAgICAgICAgaWYgKCEodGhpcy5fbWVkaWFFbGVtZW50IGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0SW5mbztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYXNRdWFsaXR5SW5mbyA9IHRydWU7XG4gICAgICAgIGxldCBkZWNvZGVkID0gMDtcbiAgICAgICAgbGV0IGRyb3BwZWQgPSAwO1xuXG4gICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkpIHtcbiAgICAgICAgICAgIGxldCBxdWFsaXR5ID0gdGhpcy5fbWVkaWFFbGVtZW50LmdldFZpZGVvUGxheWJhY2tRdWFsaXR5KCk7XG4gICAgICAgICAgICBkZWNvZGVkID0gcXVhbGl0eS50b3RhbFZpZGVvRnJhbWVzO1xuICAgICAgICAgICAgZHJvcHBlZCA9IHF1YWxpdHkuZHJvcHBlZFZpZGVvRnJhbWVzO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX21lZGlhRWxlbWVudC53ZWJraXREZWNvZGVkRnJhbWVDb3VudCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRlY29kZWQgPSB0aGlzLl9tZWRpYUVsZW1lbnQud2Via2l0RGVjb2RlZEZyYW1lQ291bnQ7XG4gICAgICAgICAgICBkcm9wcGVkID0gdGhpcy5fbWVkaWFFbGVtZW50LndlYmtpdERyb3BwZWRGcmFtZUNvdW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGFzUXVhbGl0eUluZm8gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNRdWFsaXR5SW5mbykge1xuICAgICAgICAgICAgc3RhdEluZm8uZGVjb2RlZEZyYW1lcyA9IGRlY29kZWQ7XG4gICAgICAgICAgICBzdGF0SW5mby5kcm9wcGVkRnJhbWVzID0gZHJvcHBlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdGF0SW5mbztcbiAgICB9XG5cbiAgICBfb25tc2VVcGRhdGVFbmQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY29uZmlnLmxhenlMb2FkIHx8IHRoaXMuX2NvbmZpZy5pc0xpdmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBidWZmZXJlZCA9IHRoaXMuX21lZGlhRWxlbWVudC5idWZmZXJlZDtcbiAgICAgICAgbGV0IGN1cnJlbnRUaW1lID0gdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lO1xuICAgICAgICBsZXQgY3VycmVudFJhbmdlU3RhcnQgPSAwO1xuICAgICAgICBsZXQgY3VycmVudFJhbmdlRW5kID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBidWZmZXJlZC5zdGFydChpKTtcbiAgICAgICAgICAgIGxldCBlbmQgPSBidWZmZXJlZC5lbmQoaSk7XG4gICAgICAgICAgICBpZiAoc3RhcnQgPD0gY3VycmVudFRpbWUgJiYgY3VycmVudFRpbWUgPCBlbmQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UmFuZ2VTdGFydCA9IHN0YXJ0O1xuICAgICAgICAgICAgICAgIGN1cnJlbnRSYW5nZUVuZCA9IGVuZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50UmFuZ2VFbmQgPj0gY3VycmVudFRpbWUgKyB0aGlzLl9jb25maWcubGF6eUxvYWRNYXhEdXJhdGlvbiAmJiB0aGlzLl9wcm9ncmVzc0NoZWNrZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgTG9nLnYodGhpcy5UQUcsICdNYXhpbXVtIGJ1ZmZlcmluZyBkdXJhdGlvbiBleGNlZWRlZCwgc3VzcGVuZCB0cmFuc211eGluZyB0YXNrJyk7XG4gICAgICAgICAgICB0aGlzLl9zdXNwZW5kVHJhbnNtdXhlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX29ubXNlQnVmZmVyRnVsbCgpIHtcbiAgICAgICAgTG9nLnYodGhpcy5UQUcsICdNU0UgU291cmNlQnVmZmVyIGlzIGZ1bGwsIHN1c3BlbmQgdHJhbnNtdXhpbmcgdGFzaycpO1xuICAgICAgICBpZiAodGhpcy5fcHJvZ3Jlc3NDaGVja2VyID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1c3BlbmRUcmFuc211eGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfc3VzcGVuZFRyYW5zbXV4ZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLl90cmFuc211eGVyKSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc211eGVyLnBhdXNlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9wcm9ncmVzc0NoZWNrZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzQ2hlY2tlciA9IHdpbmRvdy5zZXRJbnRlcnZhbCh0aGlzLl9jaGVja1Byb2dyZXNzQW5kUmVzdW1lLmJpbmQodGhpcyksIDEwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2NoZWNrUHJvZ3Jlc3NBbmRSZXN1bWUoKSB7XG4gICAgICAgIGxldCBjdXJyZW50VGltZSA9IHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZTtcbiAgICAgICAgbGV0IGJ1ZmZlcmVkID0gdGhpcy5fbWVkaWFFbGVtZW50LmJ1ZmZlcmVkO1xuXG4gICAgICAgIGxldCBuZWVkUmVzdW1lID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBidWZmZXJlZC5zdGFydChpKTtcbiAgICAgICAgICAgIGxldCB0byA9IGJ1ZmZlcmVkLmVuZChpKTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSA+PSBmcm9tICYmIGN1cnJlbnRUaW1lIDwgdG8pIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFRpbWUgPj0gdG8gLSB0aGlzLl9jb25maWcubGF6eUxvYWRSZWNvdmVyRHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbmVlZFJlc3VtZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5lZWRSZXN1bWUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX3Byb2dyZXNzQ2hlY2tlcik7XG4gICAgICAgICAgICB0aGlzLl9wcm9ncmVzc0NoZWNrZXIgPSBudWxsO1xuICAgICAgICAgICAgaWYgKG5lZWRSZXN1bWUpIHtcbiAgICAgICAgICAgICAgICBMb2cudih0aGlzLlRBRywgJ0NvbnRpbnVlIGxvYWRpbmcgZnJvbSBwYXVzZWQgcG9zaXRpb24nKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc211eGVyLnJlc3VtZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2lzVGltZXBvaW50QnVmZmVyZWQoc2Vjb25kcykge1xuICAgICAgICBsZXQgYnVmZmVyZWQgPSB0aGlzLl9tZWRpYUVsZW1lbnQuYnVmZmVyZWQ7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGZyb20gPSBidWZmZXJlZC5zdGFydChpKTtcbiAgICAgICAgICAgIGxldCB0byA9IGJ1ZmZlcmVkLmVuZChpKTtcbiAgICAgICAgICAgIGlmIChzZWNvbmRzID49IGZyb20gJiYgc2Vjb25kcyA8IHRvKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIF9pbnRlcm5hbFNlZWsoc2Vjb25kcykge1xuICAgICAgICBsZXQgZGlyZWN0U2VlayA9IHRoaXMuX2lzVGltZXBvaW50QnVmZmVyZWQoc2Vjb25kcyk7XG5cbiAgICAgICAgbGV0IGRpcmVjdFNlZWtCZWdpbiA9IGZhbHNlO1xuICAgICAgICBsZXQgZGlyZWN0U2Vla0JlZ2luVGltZSA9IDA7XG5cbiAgICAgICAgaWYgKHNlY29uZHMgPCAxLjAgJiYgdGhpcy5fbWVkaWFFbGVtZW50LmJ1ZmZlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCB2aWRlb0JlZ2luVGltZSA9IHRoaXMuX21lZGlhRWxlbWVudC5idWZmZXJlZC5zdGFydCgwKTtcbiAgICAgICAgICAgIGlmICgodmlkZW9CZWdpblRpbWUgPCAxLjAgJiYgc2Vjb25kcyA8IHZpZGVvQmVnaW5UaW1lKSB8fCBCcm93c2VyLnNhZmFyaSkge1xuICAgICAgICAgICAgICAgIGRpcmVjdFNlZWtCZWdpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gYWxzbyB3b3JrYXJvdW5kIGZvciBTYWZhcmk6IFNlZWsgdG8gMCBtYXkgY2F1c2UgdmlkZW8gc3R1Y2ssIHVzZSAwLjEgdG8gYXZvaWRcbiAgICAgICAgICAgICAgICBkaXJlY3RTZWVrQmVnaW5UaW1lID0gQnJvd3Nlci5zYWZhcmkgPyAwLjEgOiB2aWRlb0JlZ2luVGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaXJlY3RTZWVrQmVnaW4pIHsgIC8vIHNlZWsgdG8gdmlkZW8gYmVnaW4sIHNldCBjdXJyZW50VGltZSBkaXJlY3RseSBpZiBiZWdpblBUUyBidWZmZXJlZFxuICAgICAgICAgICAgdGhpcy5fcmVxdWVzdFNldFRpbWUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lID0gZGlyZWN0U2Vla0JlZ2luVGltZTtcbiAgICAgICAgfSAgZWxzZSBpZiAoZGlyZWN0U2VlaykgeyAgLy8gYnVmZmVyZWQgcG9zaXRpb25cbiAgICAgICAgICAgIGlmICghdGhpcy5fYWx3YXlzU2Vla0tleWZyYW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdFNldFRpbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBpZHIgPSB0aGlzLl9tc2VjdGwuZ2V0TmVhcmVzdEtleWZyYW1lKE1hdGguZmxvb3Ioc2Vjb25kcyAqIDEwMDApKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0U2V0VGltZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGlkciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IGlkci5kdHMgLyAxMDAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2dyZXNzQ2hlY2tlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tQcm9ncmVzc0FuZFJlc3VtZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2dyZXNzQ2hlY2tlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fcHJvZ3Jlc3NDaGVja2VyKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9ncmVzc0NoZWNrZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbXNlY3RsLnNlZWsoc2Vjb25kcyk7XG4gICAgICAgICAgICB0aGlzLl90cmFuc211eGVyLnNlZWsoTWF0aC5mbG9vcihzZWNvbmRzICogMTAwMCkpOyAgLy8gaW4gbWlsbGlzZWNvbmRzXG4gICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNldCBtZWRpYUVsZW1lbnQuY3VycmVudFRpbWUgaWYgbm9uLWFjY3VyYXRlU2VlayxcbiAgICAgICAgICAgIC8vIGp1c3Qgd2FpdCBmb3IgdGhlIHJlY29tbWVuZF9zZWVrcG9pbnQgY2FsbGJhY2tcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb25maWcuYWNjdXJhdGVTZWVrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdFNldFRpbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY2hlY2tBbmRBcHBseVVuYnVmZmVyZWRTZWVrcG9pbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zZWVrcG9pbnRSZWNvcmQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zZWVrcG9pbnRSZWNvcmQucmVjb3JkVGltZSA8PSB0aGlzLl9ub3coKSAtIDEwMCkge1xuICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2Vla3BvaW50UmVjb3JkID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lzVGltZXBvaW50QnVmZmVyZWQodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJvZ3Jlc3NDaGVja2VyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fcHJvZ3Jlc3NDaGVja2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzQ2hlY2tlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gLmN1cnJlbnRUaW1lIGlzIGNvbnNpc3RzIHdpdGggLmJ1ZmZlcmVkIHRpbWVzdGFtcFxuICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUvRWRnZSB1c2UgRFRTLCB3aGlsZSBGaXJlRm94L1NhZmFyaSB1c2UgUFRTXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21zZWN0bC5zZWVrKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zbXV4ZXIuc2VlayhNYXRoLmZsb29yKHRhcmdldCAqIDEwMDApKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGN1cnJlbnRUaW1lIGlmIGFjY3VyYXRlU2Vlaywgb3Igd2FpdCBmb3IgcmVjb21tZW5kX3NlZWtwb2ludCBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29uZmlnLmFjY3VyYXRlU2Vlaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdFNldFRpbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lID0gdGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLl9jaGVja0FuZEFwcGx5VW5idWZmZXJlZFNlZWtwb2ludC5iaW5kKHRoaXMpLCA1MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfY2hlY2tBbmRSZXN1bWVTdHVja1BsYXliYWNrKHN0YWxsZWQpIHtcbiAgICAgICAgbGV0IG1lZGlhID0gdGhpcy5fbWVkaWFFbGVtZW50O1xuICAgICAgICBpZiAoc3RhbGxlZCB8fCAhdGhpcy5fcmVjZWl2ZWRDYW5QbGF5IHx8IG1lZGlhLnJlYWR5U3RhdGUgPCAyKSB7ICAvLyBIQVZFX0NVUlJFTlRfREFUQVxuICAgICAgICAgICAgbGV0IGJ1ZmZlcmVkID0gbWVkaWEuYnVmZmVyZWQ7XG4gICAgICAgICAgICBpZiAoYnVmZmVyZWQubGVuZ3RoID4gMCAmJiBtZWRpYS5jdXJyZW50VGltZSA8IGJ1ZmZlcmVkLnN0YXJ0KDApKSB7XG4gICAgICAgICAgICAgICAgTG9nLncodGhpcy5UQUcsIGBQbGF5YmFjayBzZWVtcyBzdHVjayBhdCAke21lZGlhLmN1cnJlbnRUaW1lfSwgc2VlayB0byAke2J1ZmZlcmVkLnN0YXJ0KDApfWApO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RTZXRUaW1lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWUgPSBidWZmZXJlZC5zdGFydCgwKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCB0aGlzLmUub252UHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUGxheWJhY2sgZGlkbid0IHN0dWNrLCByZW1vdmUgcHJvZ3Jlc3MgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHRoaXMuZS5vbnZQcm9ncmVzcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb252TG9hZGVkTWV0YWRhdGEoZSkge1xuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1NlZWtUaW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IHRoaXMuX3BlbmRpbmdTZWVrVGltZTtcbiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTZWVrVGltZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfb252U2Vla2luZyhlKSB7ICAvLyBoYW5kbGUgc2Vla2luZyByZXF1ZXN0IGZyb20gYnJvd3NlcidzIHByb2dyZXNzIGJhclxuICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lO1xuICAgICAgICBsZXQgYnVmZmVyZWQgPSB0aGlzLl9tZWRpYUVsZW1lbnQuYnVmZmVyZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX3JlcXVlc3RTZXRUaW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXF1ZXN0U2V0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldCA8IDEuMCAmJiBidWZmZXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBzZWVrIHRvIHZpZGVvIGJlZ2luLCBzZXQgY3VycmVudFRpbWUgZGlyZWN0bHkgaWYgYmVnaW5QVFMgYnVmZmVyZWRcbiAgICAgICAgICAgIGxldCB2aWRlb0JlZ2luVGltZSA9IGJ1ZmZlcmVkLnN0YXJ0KDApO1xuICAgICAgICAgICAgaWYgKCh2aWRlb0JlZ2luVGltZSA8IDEuMCAmJiB0YXJnZXQgPCB2aWRlb0JlZ2luVGltZSkgfHwgQnJvd3Nlci5zYWZhcmkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0U2V0VGltZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gYWxzbyB3b3JrYXJvdW5kIGZvciBTYWZhcmk6IFNlZWsgdG8gMCBtYXkgY2F1c2UgdmlkZW8gc3R1Y2ssIHVzZSAwLjEgdG8gYXZvaWRcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWUgPSBCcm93c2VyLnNhZmFyaSA/IDAuMSA6IHZpZGVvQmVnaW5UaW1lO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9pc1RpbWVwb2ludEJ1ZmZlcmVkKHRhcmdldCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hbHdheXNTZWVrS2V5ZnJhbWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWRyID0gdGhpcy5fbXNlY3RsLmdldE5lYXJlc3RLZXlmcmFtZShNYXRoLmZsb29yKHRhcmdldCAqIDEwMDApKTtcbiAgICAgICAgICAgICAgICBpZiAoaWRyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdFNldFRpbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWUgPSBpZHIuZHRzIC8gMTAwMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fcHJvZ3Jlc3NDaGVja2VyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1Byb2dyZXNzQW5kUmVzdW1lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZWVrcG9pbnRSZWNvcmQgPSB7XG4gICAgICAgICAgICBzZWVrUG9pbnQ6IHRhcmdldCxcbiAgICAgICAgICAgIHJlY29yZFRpbWU6IHRoaXMuX25vdygpXG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX2NoZWNrQW5kQXBwbHlVbmJ1ZmZlcmVkU2Vla3BvaW50LmJpbmQodGhpcyksIDUwKTtcbiAgICB9XG5cbiAgICBfb252Q2FuUGxheShlKSB7XG4gICAgICAgIHRoaXMuX3JlY2VpdmVkQ2FuUGxheSA9IHRydWU7XG4gICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjYW5wbGF5JywgdGhpcy5lLm9udkNhblBsYXkpO1xuICAgIH1cblxuICAgIF9vbnZTdGFsbGVkKGUpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tBbmRSZXN1bWVTdHVja1BsYXliYWNrKHRydWUpO1xuICAgIH1cblxuICAgIF9vbnZQcm9ncmVzcyhlKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrQW5kUmVzdW1lU3R1Y2tQbGF5YmFjaygpO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBGbHZQbGF5ZXI7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJztcbmltcG9ydCBQbGF5ZXJFdmVudHMgZnJvbSAnLi9wbGF5ZXItZXZlbnRzLmpzJztcbmltcG9ydCB7Y3JlYXRlRGVmYXVsdENvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7SW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2V4Y2VwdGlvbi5qcyc7XG5cbi8vIFBsYXllciB3cmFwcGVyIGZvciBicm93c2VyJ3MgbmF0aXZlIHBsYXllciAoSFRNTFZpZGVvRWxlbWVudCkgd2l0aG91dCBNZWRpYVNvdXJjZSBzcmMuIFxuY2xhc3MgTmF0aXZlUGxheWVyIHtcblxuICAgIGNvbnN0cnVjdG9yKG1lZGlhRGF0YVNvdXJjZSwgY29uZmlnKSB7XG4gICAgICAgIHRoaXMuVEFHID0gJ05hdGl2ZVBsYXllcic7XG4gICAgICAgIHRoaXMuX3R5cGUgPSAnTmF0aXZlUGxheWVyJztcbiAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgICAgICB0aGlzLl9jb25maWcgPSBjcmVhdGVEZWZhdWx0Q29uZmlnKCk7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jb25maWcsIGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVkaWFEYXRhU291cmNlLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZsdicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ05hdGl2ZVBsYXllciBkb2VzXFwndCBzdXBwb3J0IGZsdiBNZWRpYURhdGFTb3VyY2UgaW5wdXQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lZGlhRGF0YVNvdXJjZS5oYXNPd25Qcm9wZXJ0eSgnc2VnbWVudHMnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihgTmF0aXZlUGxheWVyKCR7bWVkaWFEYXRhU291cmNlLnR5cGV9KSBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwYXJ0IHBsYXliYWNrIWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lID0ge1xuICAgICAgICAgICAgb252TG9hZGVkTWV0YWRhdGE6IHRoaXMuX29udkxvYWRlZE1ldGFkYXRhLmJpbmQodGhpcylcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9wZW5kaW5nU2Vla1RpbWUgPSBudWxsO1xuICAgICAgICB0aGlzLl9zdGF0aXN0aWNzUmVwb3J0ZXIgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX21lZGlhRGF0YVNvdXJjZSA9IG1lZGlhRGF0YVNvdXJjZTtcbiAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50ID0gbnVsbDtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgICAgICAgdGhpcy5kZXRhY2hNZWRpYUVsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmUgPSBudWxsO1xuICAgICAgICB0aGlzLl9tZWRpYURhdGFTb3VyY2UgPSBudWxsO1xuICAgICAgICB0aGlzLl9lbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLl9lbWl0dGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBvbihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKGV2ZW50ID09PSBQbGF5ZXJFdmVudHMuTUVESUFfSU5GTykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX21lZGlhRWxlbWVudCAhPSBudWxsICYmIHRoaXMuX21lZGlhRWxlbWVudC5yZWFkeVN0YXRlICE9PSAwKSB7ICAvLyBIQVZFX05PVEhJTkdcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFBsYXllckV2ZW50cy5NRURJQV9JTkZPLCB0aGlzLm1lZGlhSW5mbyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09IFBsYXllckV2ZW50cy5TVEFUSVNUSUNTX0lORk8pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLl9tZWRpYUVsZW1lbnQucmVhZHlTdGF0ZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmVtaXQoUGxheWVyRXZlbnRzLlNUQVRJU1RJQ1NfSU5GTywgdGhpcy5zdGF0aXN0aWNzSW5mbyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZW1pdHRlci5hZGRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIG9mZihldmVudCwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIGF0dGFjaE1lZGlhRWxlbWVudChtZWRpYUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50ID0gbWVkaWFFbGVtZW50O1xuICAgICAgICBtZWRpYUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCB0aGlzLmUub252TG9hZGVkTWV0YWRhdGEpO1xuXG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nU2Vla1RpbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBtZWRpYUVsZW1lbnQuY3VycmVudFRpbWUgPSB0aGlzLl9wZW5kaW5nU2Vla1RpbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1NlZWtUaW1lID0gbnVsbDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBJRTExIG1heSB0aHJvdyBJbnZhbGlkU3RhdGVFcnJvciBpZiByZWFkeVN0YXRlID09PSAwXG4gICAgICAgICAgICAgICAgLy8gRGVmZXIgc2V0IGN1cnJlbnRUaW1lIG9wZXJhdGlvbiBhZnRlciBsb2FkZWRtZXRhZGF0YVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGV0YWNoTWVkaWFFbGVtZW50KCkge1xuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQuc3JjID0gJyc7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIHRoaXMuZS5vbnZMb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9zdGF0aXN0aWNzUmVwb3J0ZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5fc3RhdGlzdGljc1JlcG9ydGVyKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICBpZiAoIXRoaXMuX21lZGlhRWxlbWVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbignSFRNTE1lZGlhRWxlbWVudCBtdXN0IGJlIGF0dGFjaGVkIGJlZm9yZSBsb2FkKCkhJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LnNyYyA9IHRoaXMuX21lZGlhRGF0YVNvdXJjZS51cmw7XG5cbiAgICAgICAgaWYgKHRoaXMuX21lZGlhRWxlbWVudC5yZWFkeVN0YXRlID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5wcmVsb2FkID0gJ2F1dG8nO1xuICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQubG9hZCgpO1xuICAgICAgICB0aGlzLl9zdGF0aXN0aWNzUmVwb3J0ZXIgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRTdGF0aXN0aWNzSW5mby5iaW5kKHRoaXMpLFxuICAgICAgICB0aGlzLl9jb25maWcuc3RhdGlzdGljc0luZm9SZXBvcnRJbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgdW5sb2FkKCkge1xuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQuc3JjID0gJyc7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc3RhdGlzdGljc1JlcG9ydGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX3N0YXRpc3RpY3NSZXBvcnRlcik7XG4gICAgICAgICAgICB0aGlzLl9zdGF0aXN0aWNzUmVwb3J0ZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGxheSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhRWxlbWVudC5wbGF5KCk7XG4gICAgfVxuXG4gICAgcGF1c2UoKSB7XG4gICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5wYXVzZSgpO1xuICAgIH1cblxuICAgIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgICB9XG5cbiAgICBnZXQgYnVmZmVyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZWRpYUVsZW1lbnQuYnVmZmVyZWQ7XG4gICAgfVxuXG4gICAgZ2V0IGR1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWVkaWFFbGVtZW50LmR1cmF0aW9uO1xuICAgIH1cblxuICAgIGdldCB2b2x1bWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZWRpYUVsZW1lbnQudm9sdW1lO1xuICAgIH1cblxuICAgIHNldCB2b2x1bWUodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50LnZvbHVtZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCBtdXRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhRWxlbWVudC5tdXRlZDtcbiAgICB9XG5cbiAgICBzZXQgbXV0ZWQobXV0ZWQpIHtcbiAgICAgICAgdGhpcy5fbWVkaWFFbGVtZW50Lm11dGVkID0gbXV0ZWQ7XG4gICAgfVxuXG4gICAgZ2V0IGN1cnJlbnRUaW1lKCkge1xuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWVkaWFFbGVtZW50LmN1cnJlbnRUaW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHNldCBjdXJyZW50VGltZShzZWNvbmRzKSB7XG4gICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhRWxlbWVudC5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nU2Vla1RpbWUgPSBzZWNvbmRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IG1lZGlhSW5mbygpIHtcbiAgICAgICAgbGV0IG1lZGlhUHJlZml4ID0gKHRoaXMuX21lZGlhRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxBdWRpb0VsZW1lbnQpID8gJ2F1ZGlvLycgOiAndmlkZW8vJztcbiAgICAgICAgbGV0IGluZm8gPSB7XG4gICAgICAgICAgICBtaW1lVHlwZTogbWVkaWFQcmVmaXggKyB0aGlzLl9tZWRpYURhdGFTb3VyY2UudHlwZVxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5fbWVkaWFFbGVtZW50KSB7XG4gICAgICAgICAgICBpbmZvLmR1cmF0aW9uID0gTWF0aC5mbG9vcih0aGlzLl9tZWRpYUVsZW1lbnQuZHVyYXRpb24gKiAxMDAwKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tZWRpYUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaW5mby53aWR0aCA9IHRoaXMuX21lZGlhRWxlbWVudC52aWRlb1dpZHRoO1xuICAgICAgICAgICAgICAgIGluZm8uaGVpZ2h0ID0gdGhpcy5fbWVkaWFFbGVtZW50LnZpZGVvSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIGdldCBzdGF0aXN0aWNzSW5mbygpIHtcbiAgICAgICAgbGV0IGluZm8gPSB7XG4gICAgICAgICAgICBwbGF5ZXJUeXBlOiB0aGlzLl90eXBlLFxuICAgICAgICAgICAgdXJsOiB0aGlzLl9tZWRpYURhdGFTb3VyY2UudXJsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCEodGhpcy5fbWVkaWFFbGVtZW50IGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbmZvO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhhc1F1YWxpdHlJbmZvID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRlY29kZWQgPSAwO1xuICAgICAgICBsZXQgZHJvcHBlZCA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuX21lZGlhRWxlbWVudC5nZXRWaWRlb1BsYXliYWNrUXVhbGl0eSkge1xuICAgICAgICAgICAgbGV0IHF1YWxpdHkgPSB0aGlzLl9tZWRpYUVsZW1lbnQuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkoKTtcbiAgICAgICAgICAgIGRlY29kZWQgPSBxdWFsaXR5LnRvdGFsVmlkZW9GcmFtZXM7XG4gICAgICAgICAgICBkcm9wcGVkID0gcXVhbGl0eS5kcm9wcGVkVmlkZW9GcmFtZXM7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbWVkaWFFbGVtZW50LndlYmtpdERlY29kZWRGcmFtZUNvdW50ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGVjb2RlZCA9IHRoaXMuX21lZGlhRWxlbWVudC53ZWJraXREZWNvZGVkRnJhbWVDb3VudDtcbiAgICAgICAgICAgIGRyb3BwZWQgPSB0aGlzLl9tZWRpYUVsZW1lbnQud2Via2l0RHJvcHBlZEZyYW1lQ291bnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYXNRdWFsaXR5SW5mbyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc1F1YWxpdHlJbmZvKSB7XG4gICAgICAgICAgICBpbmZvLmRlY29kZWRGcmFtZXMgPSBkZWNvZGVkO1xuICAgICAgICAgICAgaW5mby5kcm9wcGVkRnJhbWVzID0gZHJvcHBlZDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgX29udkxvYWRlZE1ldGFkYXRhKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdTZWVrVGltZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9tZWRpYUVsZW1lbnQuY3VycmVudFRpbWUgPSB0aGlzLl9wZW5kaW5nU2Vla1RpbWU7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nU2Vla1RpbWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2VtaXR0ZXIuZW1pdChQbGF5ZXJFdmVudHMuTUVESUFfSU5GTywgdGhpcy5tZWRpYUluZm8pO1xuICAgIH1cblxuICAgIF9yZXBvcnRTdGF0aXN0aWNzSW5mbygpIHtcbiAgICAgICAgdGhpcy5fZW1pdHRlci5lbWl0KFBsYXllckV2ZW50cy5TVEFUSVNUSUNTX0lORk8sIHRoaXMuc3RhdGlzdGljc0luZm8pO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBOYXRpdmVQbGF5ZXI7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7TG9hZGVyRXJyb3JzfSBmcm9tICcuLi9pby9sb2FkZXIuanMnO1xuaW1wb3J0IERlbXV4RXJyb3JzIGZyb20gJy4uL2RlbXV4L2RlbXV4LWVycm9ycy5qcyc7XG5cbmV4cG9ydCBjb25zdCBFcnJvclR5cGVzID0ge1xuICAgIE5FVFdPUktfRVJST1I6ICdOZXR3b3JrRXJyb3InLFxuICAgIE1FRElBX0VSUk9SOiAnTWVkaWFFcnJvcicsXG4gICAgT1RIRVJfRVJST1I6ICdPdGhlckVycm9yJ1xufTtcblxuZXhwb3J0IGNvbnN0IEVycm9yRGV0YWlscyA9IHtcbiAgICBORVRXT1JLX0VYQ0VQVElPTjogTG9hZGVyRXJyb3JzLkVYQ0VQVElPTixcbiAgICBORVRXT1JLX1NUQVRVU19DT0RFX0lOVkFMSUQ6IExvYWRlckVycm9ycy5IVFRQX1NUQVRVU19DT0RFX0lOVkFMSUQsXG4gICAgTkVUV09SS19USU1FT1VUOiBMb2FkZXJFcnJvcnMuQ09OTkVDVElOR19USU1FT1VULFxuICAgIE5FVFdPUktfVU5SRUNPVkVSQUJMRV9FQVJMWV9FT0Y6IExvYWRlckVycm9ycy5VTlJFQ09WRVJBQkxFX0VBUkxZX0VPRixcblxuICAgIE1FRElBX01TRV9FUlJPUjogJ01lZGlhTVNFRXJyb3InLFxuXG4gICAgTUVESUFfRk9STUFUX0VSUk9SOiBEZW11eEVycm9ycy5GT1JNQVRfRVJST1IsXG4gICAgTUVESUFfRk9STUFUX1VOU1VQUE9SVEVEOiBEZW11eEVycm9ycy5GT1JNQVRfVU5TVVBQT1JURUQsXG4gICAgTUVESUFfQ09ERUNfVU5TVVBQT1JURUQ6IERlbXV4RXJyb3JzLkNPREVDX1VOU1VQUE9SVEVEXG59OyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jb25zdCBQbGF5ZXJFdmVudHMgPSB7XG4gICAgRVJST1I6ICdlcnJvcicsXG4gICAgTE9BRElOR19DT01QTEVURTogJ2xvYWRpbmdfY29tcGxldGUnLFxuICAgIFJFQ09WRVJFRF9FQVJMWV9FT0Y6ICdyZWNvdmVyZWRfZWFybHlfZW9mJyxcbiAgICBNRURJQV9JTkZPOiAnbWVkaWFfaW5mbycsXG4gICAgTUVUQURBVEFfQVJSSVZFRDogJ21ldGFkYXRhX2Fycml2ZWQnLFxuICAgIFNDUklQVERBVEFfQVJSSVZFRDogJ3NjcmlwdGRhdGFfYXJyaXZlZCcsXG4gICAgU1RBVElTVElDU19JTkZPOiAnc3RhdGlzdGljc19pbmZvJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUGxheWVyRXZlbnRzOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBmaWxlIGlzIG1vZGlmaWVkIGZyb20gZGFpbHltb3Rpb24ncyBobHMuanMgbGlicmFyeSAoaGxzLmpzL3NyYy9oZWxwZXIvYWFjLmpzKVxuICogQGF1dGhvciB6aGVuZyBxaWFuIDx4cXFAeHFxLmltPlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jbGFzcyBBQUMge1xuXG4gICAgc3RhdGljIGdldFNpbGVudEZyYW1lKGNvZGVjLCBjaGFubmVsQ291bnQpIHtcbiAgICAgICAgaWYgKGNvZGVjID09PSAnbXA0YS40MC4yJykge1xuICAgICAgICAgICAgLy8gaGFuZGxlIExDLUFBQ1xuICAgICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbMHgwMCwgMHhjOCwgMHgwMCwgMHg4MCwgMHgyMywgMHg4MF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzB4MjEsIDB4MDAsIDB4NDksIDB4OTAsIDB4MDIsIDB4MTksIDB4MDAsIDB4MjMsIDB4ODBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbENvdW50ID09PSAzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsweDAwLCAweGM4LCAweDAwLCAweDgwLCAweDIwLCAweDg0LCAweDAxLCAweDI2LCAweDQwLCAweDA4LCAweDY0LCAweDAwLCAweDhlXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbMHgwMCwgMHhjOCwgMHgwMCwgMHg4MCwgMHgyMCwgMHg4NCwgMHgwMSwgMHgyNiwgMHg0MCwgMHgwOCwgMHg2NCwgMHgwMCwgMHg4MCwgMHgyYywgMHg4MCwgMHgwOCwgMHgwMiwgMHgzOF0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzB4MDAsIDB4YzgsIDB4MDAsIDB4ODAsIDB4MjAsIDB4ODQsIDB4MDEsIDB4MjYsIDB4NDAsIDB4MDgsIDB4NjQsIDB4MDAsIDB4ODIsIDB4MzAsIDB4MDQsIDB4OTksIDB4MDAsIDB4MjEsIDB4OTAsIDB4MDIsIDB4MzhdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbENvdW50ID09PSA2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsweDAwLCAweGM4LCAweDAwLCAweDgwLCAweDIwLCAweDg0LCAweDAxLCAweDI2LCAweDQwLCAweDA4LCAweDY0LCAweDAwLCAweDgyLCAweDMwLCAweDA0LCAweDk5LCAweDAwLCAweDIxLCAweDkwLCAweDAyLCAweDAwLCAweGIyLCAweDAwLCAweDIwLCAweDA4LCAweGUwXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgSEUtQUFDIChtcDRhLjQwLjUgLyBtcDRhLjQwLjI5KVxuICAgICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGZmbXBlZyAteSAtZiBsYXZmaSAtaSBcImFldmFsc3JjPTA6ZD0wLjA1XCIgLWM6YSBsaWJmZGtfYWFjIC1wcm9maWxlOmEgYWFjX2hlIC1iOmEgNGsgb3V0cHV0LmFhYyAmJiBoZXhkdW1wIC12IC1lICcxNi8xIFwiMHgleCxcIiBcIlxcblwiJyAtdiBvdXRwdXQuYWFjXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsweDEsIDB4NDAsIDB4MjIsIDB4ODAsIDB4YTMsIDB4NGUsIDB4ZTYsIDB4ODAsIDB4YmEsIDB4OCwgMHgwLCAweDAsIDB4MCwgMHgxYywgMHg2LCAweGYxLCAweGMxLCAweGEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWVdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbENvdW50ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgLy8gZmZtcGVnIC15IC1mIGxhdmZpIC1pIFwiYWV2YWxzcmM9MHwwOmQ9MC4wNVwiIC1jOmEgbGliZmRrX2FhYyAtcHJvZmlsZTphIGFhY19oZV92MiAtYjphIDRrIG91dHB1dC5hYWMgJiYgaGV4ZHVtcCAtdiAtZSAnMTYvMSBcIjB4JXgsXCIgXCJcXG5cIicgLXYgb3V0cHV0LmFhY1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbMHgxLCAweDQwLCAweDIyLCAweDgwLCAweGEzLCAweDVlLCAweGU2LCAweDgwLCAweGJhLCAweDgsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHg5NSwgMHgwLCAweDYsIDB4ZjEsIDB4YTEsIDB4YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1YSwgMHg1ZV0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT09IDMpIHtcbiAgICAgICAgICAgICAgICAvLyBmZm1wZWcgLXkgLWYgbGF2ZmkgLWkgXCJhZXZhbHNyYz0wfDB8MDpkPTAuMDVcIiAtYzphIGxpYmZka19hYWMgLXByb2ZpbGU6YSBhYWNfaGVfdjIgLWI6YSA0ayBvdXRwdXQuYWFjICYmIGhleGR1bXAgLXYgLWUgJzE2LzEgXCIweCV4LFwiIFwiXFxuXCInIC12IG91dHB1dC5hYWNcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzB4MSwgMHg0MCwgMHgyMiwgMHg4MCwgMHhhMywgMHg1ZSwgMHhlNiwgMHg4MCwgMHhiYSwgMHg4LCAweDAsIDB4MCwgMHgwLCAweDAsIDB4OTUsIDB4MCwgMHg2LCAweGYxLCAweGExLCAweGEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWEsIDB4NWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgQUFDOyIsIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgQmlsaWJpbGkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBkYWlseW1vdGlvbidzIGhscy5qcyBsaWJyYXJ5IChobHMuanMvc3JjL3JlbXV4L21wNC1nZW5lcmF0b3IuanMpXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vICBNUDQgYm94ZXMgZ2VuZXJhdG9yIGZvciBJU08gQk1GRiAoSVNPIEJhc2UgTWVkaWEgRmlsZSBGb3JtYXQsIGRlZmluZWQgaW4gSVNPL0lFQyAxNDQ5Ni0xMilcbmNsYXNzIE1QNCB7XG5cbiAgICBzdGF0aWMgaW5pdCgpIHtcbiAgICAgICAgTVA0LnR5cGVzID0ge1xuICAgICAgICAgICAgYXZjMTogW10sIGF2Y0M6IFtdLCBidHJ0OiBbXSwgZGluZjogW10sXG4gICAgICAgICAgICBkcmVmOiBbXSwgZXNkczogW10sIGZ0eXA6IFtdLCBoZGxyOiBbXSxcbiAgICAgICAgICAgIG1kYXQ6IFtdLCBtZGhkOiBbXSwgbWRpYTogW10sIG1maGQ6IFtdLFxuICAgICAgICAgICAgbWluZjogW10sIG1vb2Y6IFtdLCBtb292OiBbXSwgbXA0YTogW10sXG4gICAgICAgICAgICBtdmV4OiBbXSwgbXZoZDogW10sIHNkdHA6IFtdLCBzdGJsOiBbXSxcbiAgICAgICAgICAgIHN0Y286IFtdLCBzdHNjOiBbXSwgc3RzZDogW10sIHN0c3o6IFtdLFxuICAgICAgICAgICAgc3R0czogW10sIHRmZHQ6IFtdLCB0ZmhkOiBbXSwgdHJhZjogW10sXG4gICAgICAgICAgICB0cmFrOiBbXSwgdHJ1bjogW10sIHRyZXg6IFtdLCB0a2hkOiBbXSxcbiAgICAgICAgICAgIHZtaGQ6IFtdLCBzbWhkOiBbXSwgJy5tcDMnOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gTVA0LnR5cGVzKSB7XG4gICAgICAgICAgICBpZiAoTVA0LnR5cGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgTVA0LnR5cGVzW25hbWVdID0gW1xuICAgICAgICAgICAgICAgICAgICBuYW1lLmNoYXJDb2RlQXQoMCksXG4gICAgICAgICAgICAgICAgICAgIG5hbWUuY2hhckNvZGVBdCgxKSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZS5jaGFyQ29kZUF0KDIpLFxuICAgICAgICAgICAgICAgICAgICBuYW1lLmNoYXJDb2RlQXQoMylcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbnN0YW50cyA9IE1QNC5jb25zdGFudHMgPSB7fTtcblxuICAgICAgICBjb25zdGFudHMuRlRZUCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDB4NjksIDB4NzMsIDB4NkYsIDB4NkQsICAvLyBtYWpvcl9icmFuZDogaXNvbVxuICAgICAgICAgICAgMHgwLCAgMHgwLCAgMHgwLCAgMHgxLCAgIC8vIG1pbm9yX3ZlcnNpb246IDB4MDFcbiAgICAgICAgICAgIDB4NjksIDB4NzMsIDB4NkYsIDB4NkQsICAvLyBpc29tXG4gICAgICAgICAgICAweDYxLCAweDc2LCAweDYzLCAweDMxICAgLy8gYXZjMVxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdGFudHMuU1RTRF9QUkVGSVggPSBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gdmVyc2lvbigwKSArIGZsYWdzXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxICAgLy8gZW50cnlfY291bnRcbiAgICAgICAgXSk7XG5cbiAgICAgICAgY29uc3RhbnRzLlNUVFMgPSBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gdmVyc2lvbigwKSArIGZsYWdzXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwICAgLy8gZW50cnlfY291bnRcbiAgICAgICAgXSk7XG5cbiAgICAgICAgY29uc3RhbnRzLlNUU0MgPSBjb25zdGFudHMuU1RDTyA9IGNvbnN0YW50cy5TVFRTO1xuXG4gICAgICAgIGNvbnN0YW50cy5TVFNaID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHZlcnNpb24oMCkgKyBmbGFnc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHNhbXBsZV9zaXplXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwICAgLy8gc2FtcGxlX2NvdW50XG4gICAgICAgIF0pO1xuXG4gICAgICAgIGNvbnN0YW50cy5IRExSX1ZJREVPID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHZlcnNpb24oMCkgKyBmbGFnc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHByZV9kZWZpbmVkXG4gICAgICAgICAgICAweDc2LCAweDY5LCAweDY0LCAweDY1LCAgLy8gaGFuZGxlcl90eXBlOiAndmlkZSdcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyByZXNlcnZlZDogMyAqIDQgYnl0ZXNcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHg1NiwgMHg2OSwgMHg2NCwgMHg2NSxcbiAgICAgICAgICAgIDB4NkYsIDB4NDgsIDB4NjEsIDB4NkUsXG4gICAgICAgICAgICAweDY0LCAweDZDLCAweDY1LCAweDcyLCAweDAwICAvLyBuYW1lOiBWaWRlb0hhbmRsZXJcbiAgICAgICAgXSk7XG5cbiAgICAgICAgY29uc3RhbnRzLkhETFJfQVVESU8gPSBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gdmVyc2lvbigwKSArIGZsYWdzXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gcHJlX2RlZmluZWRcbiAgICAgICAgICAgIDB4NzMsIDB4NkYsIDB4NzUsIDB4NkUsICAvLyBoYW5kbGVyX3R5cGU6ICdzb3VuJ1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHJlc2VydmVkOiAzICogNCBieXRlc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDUzLCAweDZGLCAweDc1LCAweDZFLFxuICAgICAgICAgICAgMHg2NCwgMHg0OCwgMHg2MSwgMHg2RSxcbiAgICAgICAgICAgIDB4NjQsIDB4NkMsIDB4NjUsIDB4NzIsIDB4MDAgIC8vIG5hbWU6IFNvdW5kSGFuZGxlclxuICAgICAgICBdKTtcblxuICAgICAgICBjb25zdGFudHMuRFJFRiA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyB2ZXJzaW9uKDApICsgZmxhZ3NcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsICAvLyBlbnRyeV9jb3VudFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgIC8vIGVudHJ5X3NpemVcbiAgICAgICAgICAgIDB4NzUsIDB4NzIsIDB4NkMsIDB4MjAsICAvLyB0eXBlICd1cmwgJ1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSAgIC8vIHZlcnNpb24oMCkgKyBmbGFnc1xuICAgICAgICBdKTtcblxuICAgICAgICAvLyBTb3VuZCBtZWRpYSBoZWFkZXJcbiAgICAgICAgY29uc3RhbnRzLlNNSEQgPSBuZXcgVWludDhBcnJheShbXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gdmVyc2lvbigwKSArIGZsYWdzXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwICAgLy8gYmFsYW5jZSgyKSArIHJlc2VydmVkKDIpXG4gICAgICAgIF0pO1xuXG4gICAgICAgIC8vIHZpZGVvIG1lZGlhIGhlYWRlclxuICAgICAgICBjb25zdGFudHMuVk1IRCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsICAvLyB2ZXJzaW9uKDApICsgZmxhZ3NcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvLyBncmFwaGljc21vZGU6IDIgYnl0ZXNcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBvcGNvbG9yOiAzICogMiBieXRlc1xuICAgICAgICAgICAgMHgwMCwgMHgwMFxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBhIGJveFxuICAgIHN0YXRpYyBib3godHlwZSkge1xuICAgICAgICBsZXQgc2l6ZSA9IDg7XG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICBsZXQgZGF0YXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICBsZXQgYXJyYXlDb3VudCA9IGRhdGFzLmxlbmd0aDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Q291bnQ7IGkrKykge1xuICAgICAgICAgICAgc2l6ZSArPSBkYXRhc1tpXS5ieXRlTGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgICAgIHJlc3VsdFswXSA9IChzaXplID4+PiAyNCkgJiAweEZGOyAgLy8gc2l6ZVxuICAgICAgICByZXN1bHRbMV0gPSAoc2l6ZSA+Pj4gMTYpICYgMHhGRjtcbiAgICAgICAgcmVzdWx0WzJdID0gKHNpemUgPj4+ICA4KSAmIDB4RkY7XG4gICAgICAgIHJlc3VsdFszXSA9IChzaXplKSAmIDB4RkY7XG5cbiAgICAgICAgcmVzdWx0LnNldCh0eXBlLCA0KTsgIC8vIHR5cGVcblxuICAgICAgICBsZXQgb2Zmc2V0ID0gODtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheUNvdW50OyBpKyspIHsgIC8vIGRhdGEgYm9keVxuICAgICAgICAgICAgcmVzdWx0LnNldChkYXRhc1tpXSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCArPSBkYXRhc1tpXS5ieXRlTGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBlbWl0IGZ0eXAgJiBtb292XG4gICAgc3RhdGljIGdlbmVyYXRlSW5pdFNlZ21lbnQobWV0YSkge1xuICAgICAgICBsZXQgZnR5cCA9IE1QNC5ib3goTVA0LnR5cGVzLmZ0eXAsIE1QNC5jb25zdGFudHMuRlRZUCk7XG4gICAgICAgIGxldCBtb292ID0gTVA0Lm1vb3YobWV0YSk7XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGZ0eXAuYnl0ZUxlbmd0aCArIG1vb3YuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHJlc3VsdC5zZXQoZnR5cCwgMCk7XG4gICAgICAgIHJlc3VsdC5zZXQobW9vdiwgZnR5cC5ieXRlTGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBNb3ZpZSBtZXRhZGF0YSBib3hcbiAgICBzdGF0aWMgbW9vdihtZXRhKSB7XG4gICAgICAgIGxldCBtdmhkID0gTVA0Lm12aGQobWV0YS50aW1lc2NhbGUsIG1ldGEuZHVyYXRpb24pO1xuICAgICAgICBsZXQgdHJhayA9IE1QNC50cmFrKG1ldGEpO1xuICAgICAgICBsZXQgbXZleCA9IE1QNC5tdmV4KG1ldGEpO1xuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMubW9vdiwgbXZoZCwgdHJhaywgbXZleCk7XG4gICAgfVxuXG4gICAgLy8gTW92aWUgaGVhZGVyIGJveFxuICAgIHN0YXRpYyBtdmhkKHRpbWVzY2FsZSwgZHVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIE1QNC5ib3goTVA0LnR5cGVzLm12aGQsIG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyB2ZXJzaW9uKDApICsgZmxhZ3NcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBjcmVhdGlvbl90aW1lXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gbW9kaWZpY2F0aW9uX3RpbWVcbiAgICAgICAgICAgICh0aW1lc2NhbGUgPj4+IDI0KSAmIDB4RkYsICAvLyB0aW1lc2NhbGU6IDQgYnl0ZXNcbiAgICAgICAgICAgICh0aW1lc2NhbGUgPj4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAodGltZXNjYWxlID4+PiAgOCkgJiAweEZGLFxuICAgICAgICAgICAgKHRpbWVzY2FsZSkgJiAweEZGLFxuICAgICAgICAgICAgKGR1cmF0aW9uID4+PiAyNCkgJiAweEZGLCAgIC8vIGR1cmF0aW9uOiA0IGJ5dGVzXG4gICAgICAgICAgICAoZHVyYXRpb24gPj4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAoZHVyYXRpb24gPj4+ICA4KSAmIDB4RkYsXG4gICAgICAgICAgICAoZHVyYXRpb24pICYgMHhGRixcbiAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsICAvLyBQcmVmZXJyZWQgcmF0ZTogMS4wXG4gICAgICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAgLy8gUHJlZmVycmVkVm9sdW1lKDEuMCwgMmJ5dGVzKSArIHJlc2VydmVkKDJieXRlcylcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyByZXNlcnZlZDogNCArIDQgYnl0ZXNcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAgLy8gLS0tLWJlZ2luIGNvbXBvc2l0aW9uIG1hdHJpeC0tLS1cbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDQwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gLS0tLWVuZCBjb21wb3NpdGlvbiBtYXRyaXgtLS0tXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gLS0tLWJlZ2luIHByZV9kZWZpbmVkIDYgKiA0IGJ5dGVzLS0tLVxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyAtLS0tZW5kIHByZV9kZWZpbmVkIDYgKiA0IGJ5dGVzLS0tLVxuICAgICAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiAgIC8vIG5leHRfdHJhY2tfSURcbiAgICAgICAgXSkpO1xuICAgIH1cblxuICAgIC8vIFRyYWNrIGJveFxuICAgIHN0YXRpYyB0cmFrKG1ldGEpIHtcbiAgICAgICAgcmV0dXJuIE1QNC5ib3goTVA0LnR5cGVzLnRyYWssIE1QNC50a2hkKG1ldGEpLCBNUDQubWRpYShtZXRhKSk7XG4gICAgfVxuXG4gICAgLy8gVHJhY2sgaGVhZGVyIGJveFxuICAgIHN0YXRpYyB0a2hkKG1ldGEpIHtcbiAgICAgICAgbGV0IHRyYWNrSWQgPSBtZXRhLmlkLCBkdXJhdGlvbiA9IG1ldGEuZHVyYXRpb247XG4gICAgICAgIGxldCB3aWR0aCA9IG1ldGEucHJlc2VudFdpZHRoLCBoZWlnaHQgPSBtZXRhLnByZXNlbnRIZWlnaHQ7XG5cbiAgICAgICAgcmV0dXJuIE1QNC5ib3goTVA0LnR5cGVzLnRraGQsIG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsICAvLyB2ZXJzaW9uKDApICsgZmxhZ3NcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBjcmVhdGlvbl90aW1lXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gbW9kaWZpY2F0aW9uX3RpbWVcbiAgICAgICAgICAgICh0cmFja0lkID4+PiAyNCkgJiAweEZGLCAgLy8gdHJhY2tfSUQ6IDQgYnl0ZXNcbiAgICAgICAgICAgICh0cmFja0lkID4+PiAxNikgJiAweEZGLFxuICAgICAgICAgICAgKHRyYWNrSWQgPj4+ICA4KSAmIDB4RkYsXG4gICAgICAgICAgICAodHJhY2tJZCkgJiAweEZGLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHJlc2VydmVkOiA0IGJ5dGVzXG4gICAgICAgICAgICAoZHVyYXRpb24gPj4+IDI0KSAmIDB4RkYsIC8vIGR1cmF0aW9uOiA0IGJ5dGVzXG4gICAgICAgICAgICAoZHVyYXRpb24gPj4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAoZHVyYXRpb24gPj4+ICA4KSAmIDB4RkYsXG4gICAgICAgICAgICAoZHVyYXRpb24pICYgMHhGRixcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyByZXNlcnZlZDogMiAqIDQgYnl0ZXNcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gbGF5ZXIoMmJ5dGVzKSArIGFsdGVybmF0ZV9ncm91cCgyYnl0ZXMpXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gdm9sdW1lKDJieXRlcykgKyByZXNlcnZlZCgyYnl0ZXMpXG4gICAgICAgICAgICAweDAwLCAweDAxLCAweDAwLCAweDAwLCAgLy8gLS0tLWJlZ2luIGNvbXBvc2l0aW9uIG1hdHJpeC0tLS1cbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDQwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gLS0tLWVuZCBjb21wb3NpdGlvbiBtYXRyaXgtLS0tXG4gICAgICAgICAgICAod2lkdGggPj4+IDgpICYgMHhGRiwgICAgLy8gd2lkdGggYW5kIGhlaWdodFxuICAgICAgICAgICAgKHdpZHRoKSAmIDB4RkYsXG4gICAgICAgICAgICAweDAwLCAweDAwLFxuICAgICAgICAgICAgKGhlaWdodCA+Pj4gOCkgJiAweEZGLFxuICAgICAgICAgICAgKGhlaWdodCkgJiAweEZGLFxuICAgICAgICAgICAgMHgwMCwgMHgwMFxuICAgICAgICBdKSk7XG4gICAgfVxuXG4gICAgLy8gTWVkaWEgQm94XG4gICAgc3RhdGljIG1kaWEobWV0YSkge1xuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMubWRpYSwgTVA0Lm1kaGQobWV0YSksIE1QNC5oZGxyKG1ldGEpLCBNUDQubWluZihtZXRhKSk7XG4gICAgfVxuXG4gICAgLy8gTWVkaWEgaGVhZGVyIGJveFxuICAgIHN0YXRpYyBtZGhkKG1ldGEpIHtcbiAgICAgICAgbGV0IHRpbWVzY2FsZSA9IG1ldGEudGltZXNjYWxlO1xuICAgICAgICBsZXQgZHVyYXRpb24gPSBtZXRhLmR1cmF0aW9uO1xuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMubWRoZCwgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHZlcnNpb24oMCkgKyBmbGFnc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIGNyZWF0aW9uX3RpbWVcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBtb2RpZmljYXRpb25fdGltZVxuICAgICAgICAgICAgKHRpbWVzY2FsZSA+Pj4gMjQpICYgMHhGRiwgIC8vIHRpbWVzY2FsZTogNCBieXRlc1xuICAgICAgICAgICAgKHRpbWVzY2FsZSA+Pj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgICh0aW1lc2NhbGUgPj4+ICA4KSAmIDB4RkYsXG4gICAgICAgICAgICAodGltZXNjYWxlKSAmIDB4RkYsXG4gICAgICAgICAgICAoZHVyYXRpb24gPj4+IDI0KSAmIDB4RkYsICAgLy8gZHVyYXRpb246IDQgYnl0ZXNcbiAgICAgICAgICAgIChkdXJhdGlvbiA+Pj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgIChkdXJhdGlvbiA+Pj4gIDgpICYgMHhGRixcbiAgICAgICAgICAgIChkdXJhdGlvbikgJiAweEZGLFxuICAgICAgICAgICAgMHg1NSwgMHhDNCwgICAgICAgICAgICAgLy8gbGFuZ3VhZ2U6IHVuZCAodW5kZXRlcm1pbmVkKVxuICAgICAgICAgICAgMHgwMCwgMHgwMCAgICAgICAgICAgICAgLy8gcHJlX2RlZmluZWQgPSAwXG4gICAgICAgIF0pKTtcbiAgICB9XG5cbiAgICAvLyBNZWRpYSBoYW5kbGVyIHJlZmVyZW5jZSBib3hcbiAgICBzdGF0aWMgaGRscihtZXRhKSB7XG4gICAgICAgIGxldCBkYXRhID0gbnVsbDtcbiAgICAgICAgaWYgKG1ldGEudHlwZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgICAgZGF0YSA9IE1QNC5jb25zdGFudHMuSERMUl9BVURJTztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSBNUDQuY29uc3RhbnRzLkhETFJfVklERU87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1QNC5ib3goTVA0LnR5cGVzLmhkbHIsIGRhdGEpO1xuICAgIH1cblxuICAgIC8vIE1lZGlhIGluZm9tYXRpb24gYm94XG4gICAgc3RhdGljIG1pbmYobWV0YSkge1xuICAgICAgICBsZXQgeG1oZCA9IG51bGw7XG4gICAgICAgIGlmIChtZXRhLnR5cGUgPT09ICdhdWRpbycpIHtcbiAgICAgICAgICAgIHhtaGQgPSBNUDQuYm94KE1QNC50eXBlcy5zbWhkLCBNUDQuY29uc3RhbnRzLlNNSEQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeG1oZCA9IE1QNC5ib3goTVA0LnR5cGVzLnZtaGQsIE1QNC5jb25zdGFudHMuVk1IRCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1QNC5ib3goTVA0LnR5cGVzLm1pbmYsIHhtaGQsIE1QNC5kaW5mKCksIE1QNC5zdGJsKG1ldGEpKTtcbiAgICB9XG5cbiAgICAvLyBEYXRhIGluZm9tYXRpb24gYm94XG4gICAgc3RhdGljIGRpbmYoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBNUDQuYm94KE1QNC50eXBlcy5kaW5mLFxuICAgICAgICAgICAgTVA0LmJveChNUDQudHlwZXMuZHJlZiwgTVA0LmNvbnN0YW50cy5EUkVGKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIFNhbXBsZSB0YWJsZSBib3hcbiAgICBzdGF0aWMgc3RibChtZXRhKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBNUDQuYm94KE1QNC50eXBlcy5zdGJsLCAgLy8gdHlwZTogc3RibFxuICAgICAgICAgICAgTVA0LnN0c2QobWV0YSksICAvLyBTYW1wbGUgRGVzY3JpcHRpb24gVGFibGVcbiAgICAgICAgICAgIE1QNC5ib3goTVA0LnR5cGVzLnN0dHMsIE1QNC5jb25zdGFudHMuU1RUUyksICAvLyBUaW1lLVRvLVNhbXBsZVxuICAgICAgICAgICAgTVA0LmJveChNUDQudHlwZXMuc3RzYywgTVA0LmNvbnN0YW50cy5TVFNDKSwgIC8vIFNhbXBsZS1Uby1DaHVua1xuICAgICAgICAgICAgTVA0LmJveChNUDQudHlwZXMuc3RzeiwgTVA0LmNvbnN0YW50cy5TVFNaKSwgIC8vIFNhbXBsZSBzaXplXG4gICAgICAgICAgICBNUDQuYm94KE1QNC50eXBlcy5zdGNvLCBNUDQuY29uc3RhbnRzLlNUQ08pICAgLy8gQ2h1bmsgb2Zmc2V0XG4gICAgICAgICk7IFxuICAgICAgICByZXR1cm4gcmVzdWx0OyBcbiAgICB9XG5cbiAgICAvLyBTYW1wbGUgZGVzY3JpcHRpb24gYm94XG4gICAgc3RhdGljIHN0c2QobWV0YSkge1xuICAgICAgICBpZiAobWV0YS50eXBlID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgICBpZiAobWV0YS5jb2RlYyA9PT0gJ21wMycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMuc3RzZCwgTVA0LmNvbnN0YW50cy5TVFNEX1BSRUZJWCwgTVA0Lm1wMyhtZXRhKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlbHNlOiBhYWMgLT4gbXA0YVxuICAgICAgICAgICAgcmV0dXJuIE1QNC5ib3goTVA0LnR5cGVzLnN0c2QsIE1QNC5jb25zdGFudHMuU1RTRF9QUkVGSVgsIE1QNC5tcDRhKG1ldGEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNUDQuYm94KE1QNC50eXBlcy5zdHNkLCBNUDQuY29uc3RhbnRzLlNUU0RfUFJFRklYLCBNUDQuYXZjMShtZXRhKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgbXAzKG1ldGEpIHtcbiAgICAgICAgbGV0IGNoYW5uZWxDb3VudCA9IG1ldGEuY2hhbm5lbENvdW50O1xuICAgICAgICBsZXQgc2FtcGxlUmF0ZSA9IG1ldGEuYXVkaW9TYW1wbGVSYXRlO1xuXG4gICAgICAgIGxldCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHJlc2VydmVkKDQpXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAgLy8gcmVzZXJ2ZWQoMikgKyBkYXRhX3JlZmVyZW5jZV9pbmRleCgyKVxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHJlc2VydmVkOiAyICogNCBieXRlc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIGNoYW5uZWxDb3VudCwgICAgICAvLyBjaGFubmVsQ291bnQoMilcbiAgICAgICAgICAgIDB4MDAsIDB4MTAsICAgICAgICAgICAgICAvLyBzYW1wbGVTaXplKDIpXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gcmVzZXJ2ZWQoNClcbiAgICAgICAgICAgIChzYW1wbGVSYXRlID4+PiA4KSAmIDB4RkYsICAvLyBBdWRpbyBzYW1wbGUgcmF0ZVxuICAgICAgICAgICAgKHNhbXBsZVJhdGUpICYgMHhGRixcbiAgICAgICAgICAgIDB4MDAsIDB4MDBcbiAgICAgICAgXSk7XG5cbiAgICAgICAgcmV0dXJuIE1QNC5ib3goTVA0LnR5cGVzWycubXAzJ10sIGRhdGEpO1xuICAgIH1cblxuICAgIHN0YXRpYyBtcDRhKG1ldGEpIHtcbiAgICAgICAgbGV0IGNoYW5uZWxDb3VudCA9IG1ldGEuY2hhbm5lbENvdW50O1xuICAgICAgICBsZXQgc2FtcGxlUmF0ZSA9IG1ldGEuYXVkaW9TYW1wbGVSYXRlO1xuXG4gICAgICAgIGxldCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHJlc2VydmVkKDQpXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAgLy8gcmVzZXJ2ZWQoMikgKyBkYXRhX3JlZmVyZW5jZV9pbmRleCgyKVxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHJlc2VydmVkOiAyICogNCBieXRlc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIGNoYW5uZWxDb3VudCwgICAgICAvLyBjaGFubmVsQ291bnQoMilcbiAgICAgICAgICAgIDB4MDAsIDB4MTAsICAgICAgICAgICAgICAvLyBzYW1wbGVTaXplKDIpXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gcmVzZXJ2ZWQoNClcbiAgICAgICAgICAgIChzYW1wbGVSYXRlID4+PiA4KSAmIDB4RkYsICAvLyBBdWRpbyBzYW1wbGUgcmF0ZVxuICAgICAgICAgICAgKHNhbXBsZVJhdGUpICYgMHhGRixcbiAgICAgICAgICAgIDB4MDAsIDB4MDBcbiAgICAgICAgXSk7XG5cbiAgICAgICAgcmV0dXJuIE1QNC5ib3goTVA0LnR5cGVzLm1wNGEsIGRhdGEsIE1QNC5lc2RzKG1ldGEpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZXNkcyhtZXRhKSB7XG4gICAgICAgIGxldCBjb25maWcgPSBtZXRhLmNvbmZpZyB8fCBbXTtcbiAgICAgICAgbGV0IGNvbmZpZ1NpemUgPSBjb25maWcubGVuZ3RoO1xuICAgICAgICBsZXQgZGF0YSA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyB2ZXJzaW9uIDAgKyBmbGFnc1xuXG4gICAgICAgICAgICAweDAzLCAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRvcl90eXBlXG4gICAgICAgICAgICAweDE3ICsgY29uZmlnU2l6ZSwgICAgICAgLy8gbGVuZ3RoM1xuICAgICAgICAgICAgMHgwMCwgMHgwMSwgICAgICAgICAgICAgIC8vIGVzX2lkXG4gICAgICAgICAgICAweDAwLCAgICAgICAgICAgICAgICAgICAgLy8gc3RyZWFtX3ByaW9yaXR5XG5cbiAgICAgICAgICAgIDB4MDQsICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yX3R5cGVcbiAgICAgICAgICAgIDB4MEYgKyBjb25maWdTaXplLCAgICAgICAvLyBsZW5ndGhcbiAgICAgICAgICAgIDB4NDAsICAgICAgICAgICAgICAgICAgICAvLyBjb2RlYzogbXBlZzRfYXVkaW9cbiAgICAgICAgICAgIDB4MTUsICAgICAgICAgICAgICAgICAgICAvLyBzdHJlYW1fdHlwZTogQXVkaW9cbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAvLyBidWZmZXJfc2l6ZVxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIG1heEJpdHJhdGVcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBhdmdCaXRyYXRlXG5cbiAgICAgICAgICAgIDB4MDUgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yX3R5cGVcbiAgICAgICAgXS5jb25jYXQoW1xuICAgICAgICAgICAgY29uZmlnU2l6ZVxuICAgICAgICBdKS5jb25jYXQoXG4gICAgICAgICAgICBjb25maWdcbiAgICAgICAgKS5jb25jYXQoW1xuICAgICAgICAgICAgMHgwNiwgMHgwMSwgMHgwMiAgICAgICAgIC8vIEdBU3BlY2lmaWNDb25maWdcbiAgICAgICAgXSkpO1xuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMuZXNkcywgZGF0YSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGF2YzEobWV0YSkge1xuICAgICAgICBsZXQgYXZjYyA9IG1ldGEuYXZjYztcbiAgICAgICAgbGV0IHdpZHRoID0gbWV0YS5jb2RlY1dpZHRoLCBoZWlnaHQgPSBtZXRhLmNvZGVjSGVpZ2h0O1xuXG4gICAgICAgIGxldCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHJlc2VydmVkKDQpXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAgLy8gcmVzZXJ2ZWQoMikgKyBkYXRhX3JlZmVyZW5jZV9pbmRleCgyKVxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHByZV9kZWZpbmVkKDIpICsgcmVzZXJ2ZWQoMilcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyBwcmVfZGVmaW5lZDogMyAqIDQgYnl0ZXNcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgKHdpZHRoID4+PiA4KSAmIDB4RkYsICAgIC8vIHdpZHRoOiAyIGJ5dGVzXG4gICAgICAgICAgICAod2lkdGgpICYgMHhGRixcbiAgICAgICAgICAgIChoZWlnaHQgPj4+IDgpICYgMHhGRiwgICAvLyBoZWlnaHQ6IDIgYnl0ZXNcbiAgICAgICAgICAgIChoZWlnaHQpICYgMHhGRixcbiAgICAgICAgICAgIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsICAvLyBob3JpenJlc29sdXRpb246IDQgYnl0ZXNcbiAgICAgICAgICAgIDB4MDAsIDB4NDgsIDB4MDAsIDB4MDAsICAvLyB2ZXJ0cmVzb2x1dGlvbjogNCBieXRlc1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHJlc2VydmVkOiA0IGJ5dGVzXG4gICAgICAgICAgICAweDAwLCAweDAxLCAgICAgICAgICAgICAgLy8gZnJhbWVfY291bnRcbiAgICAgICAgICAgIDB4MEEsICAgICAgICAgICAgICAgICAgICAvLyBzdHJsZW5cbiAgICAgICAgICAgIDB4NzgsIDB4NzEsIDB4NzEsIDB4MkYsICAvLyBjb21wcmVzc29ybmFtZTogMzIgYnl0ZXNcbiAgICAgICAgICAgIDB4NjYsIDB4NkMsIDB4NzYsIDB4MkUsXG4gICAgICAgICAgICAweDZBLCAweDczLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCxcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAweDAwLCAweDE4LCAgICAgICAgICAgICAgLy8gZGVwdGhcbiAgICAgICAgICAgIDB4RkYsIDB4RkYgICAgICAgICAgICAgICAvLyBwcmVfZGVmaW5lZCA9IC0xXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMuYXZjMSwgZGF0YSwgTVA0LmJveChNUDQudHlwZXMuYXZjQywgYXZjYykpO1xuICAgIH1cblxuICAgIC8vIE1vdmllIEV4dGVuZHMgYm94XG4gICAgc3RhdGljIG12ZXgobWV0YSkge1xuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMubXZleCwgTVA0LnRyZXgobWV0YSkpO1xuICAgIH1cblxuICAgIC8vIFRyYWNrIEV4dGVuZHMgYm94XG4gICAgc3RhdGljIHRyZXgobWV0YSkge1xuICAgICAgICBsZXQgdHJhY2tJZCA9IG1ldGEuaWQ7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIHZlcnNpb24oMCkgKyBmbGFnc1xuICAgICAgICAgICAgKHRyYWNrSWQgPj4+IDI0KSAmIDB4RkYsIC8vIHRyYWNrX0lEXG4gICAgICAgICAgICAodHJhY2tJZCA+Pj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgICh0cmFja0lkID4+PiAgOCkgJiAweEZGLFxuICAgICAgICAgICAgKHRyYWNrSWQpICYgMHhGRixcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsICAvLyBkZWZhdWx0X3NhbXBsZV9kZXNjcmlwdGlvbl9pbmRleFxuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgIC8vIGRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uXG4gICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgLy8gZGVmYXVsdF9zYW1wbGVfc2l6ZVxuICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMSAgIC8vIGRlZmF1bHRfc2FtcGxlX2ZsYWdzXG4gICAgICAgIF0pO1xuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMudHJleCwgZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gTW92aWUgZnJhZ21lbnQgYm94XG4gICAgc3RhdGljIG1vb2YodHJhY2ssIGJhc2VNZWRpYURlY29kZVRpbWUpIHtcbiAgICAgICAgcmV0dXJuIE1QNC5ib3goTVA0LnR5cGVzLm1vb2YsIE1QNC5tZmhkKHRyYWNrLnNlcXVlbmNlTnVtYmVyKSwgTVA0LnRyYWYodHJhY2ssIGJhc2VNZWRpYURlY29kZVRpbWUpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbWZoZChzZXF1ZW5jZU51bWJlcikge1xuICAgICAgICBsZXQgZGF0YSA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsXG4gICAgICAgICAgICAoc2VxdWVuY2VOdW1iZXIgPj4+IDI0KSAmIDB4RkYsICAvLyBzZXF1ZW5jZV9udW1iZXI6IGludDMyXG4gICAgICAgICAgICAoc2VxdWVuY2VOdW1iZXIgPj4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAoc2VxdWVuY2VOdW1iZXIgPj4+ICA4KSAmIDB4RkYsXG4gICAgICAgICAgICAoc2VxdWVuY2VOdW1iZXIpICYgMHhGRlxuICAgICAgICBdKTtcbiAgICAgICAgcmV0dXJuIE1QNC5ib3goTVA0LnR5cGVzLm1maGQsIGRhdGEpO1xuICAgIH1cblxuICAgIC8vIFRyYWNrIGZyYWdtZW50IGJveFxuICAgIHN0YXRpYyB0cmFmKHRyYWNrLCBiYXNlTWVkaWFEZWNvZGVUaW1lKSB7XG4gICAgICAgIGxldCB0cmFja0lkID0gdHJhY2suaWQ7XG5cbiAgICAgICAgLy8gVHJhY2sgZnJhZ21lbnQgaGVhZGVyIGJveFxuICAgICAgICBsZXQgdGZoZCA9IE1QNC5ib3goTVA0LnR5cGVzLnRmaGQsIG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyB2ZXJzaW9uKDApICYgZmxhZ3NcbiAgICAgICAgICAgICh0cmFja0lkID4+PiAyNCkgJiAweEZGLCAvLyB0cmFja19JRFxuICAgICAgICAgICAgKHRyYWNrSWQgPj4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAodHJhY2tJZCA+Pj4gIDgpICYgMHhGRixcbiAgICAgICAgICAgICh0cmFja0lkKSAmIDB4RkZcbiAgICAgICAgXSkpO1xuICAgICAgICAvLyBUcmFjayBGcmFnbWVudCBEZWNvZGUgVGltZVxuICAgICAgICBsZXQgdGZkdCA9IE1QNC5ib3goTVA0LnR5cGVzLnRmZHQsIG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAvLyB2ZXJzaW9uKDApICYgZmxhZ3NcbiAgICAgICAgICAgIChiYXNlTWVkaWFEZWNvZGVUaW1lID4+PiAyNCkgJiAweEZGLCAgLy8gYmFzZU1lZGlhRGVjb2RlVGltZTogaW50MzJcbiAgICAgICAgICAgIChiYXNlTWVkaWFEZWNvZGVUaW1lID4+PiAxNikgJiAweEZGLFxuICAgICAgICAgICAgKGJhc2VNZWRpYURlY29kZVRpbWUgPj4+ICA4KSAmIDB4RkYsXG4gICAgICAgICAgICAoYmFzZU1lZGlhRGVjb2RlVGltZSkgJiAweEZGXG4gICAgICAgIF0pKTtcbiAgICAgICAgbGV0IHNkdHAgPSBNUDQuc2R0cCh0cmFjayk7XG4gICAgICAgIGxldCB0cnVuID0gTVA0LnRydW4odHJhY2ssIHNkdHAuYnl0ZUxlbmd0aCArIDE2ICsgMTYgKyA4ICsgMTYgKyA4ICsgOCk7XG5cbiAgICAgICAgcmV0dXJuIE1QNC5ib3goTVA0LnR5cGVzLnRyYWYsIHRmaGQsIHRmZHQsIHRydW4sIHNkdHApO1xuICAgIH1cblxuICAgIC8vIFNhbXBsZSBEZXBlbmRlbmN5IFR5cGUgYm94XG4gICAgc3RhdGljIHNkdHAodHJhY2spIHtcbiAgICAgICAgbGV0IHNhbXBsZXMgPSB0cmFjay5zYW1wbGVzIHx8IFtdO1xuICAgICAgICBsZXQgc2FtcGxlQ291bnQgPSBzYW1wbGVzLmxlbmd0aDtcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgVWludDhBcnJheSg0ICsgc2FtcGxlQ291bnQpO1xuICAgICAgICAvLyAwfjQgYnl0ZXM6IHZlcnNpb24oMCkgJiBmbGFnc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNhbXBsZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGxldCBmbGFncyA9IHNhbXBsZXNbaV0uZmxhZ3M7XG4gICAgICAgICAgICBkYXRhW2kgKyA0XSA9IChmbGFncy5pc0xlYWRpbmcgPDwgNikgICAgLy8gaXNfbGVhZGluZzogMiAoYml0KVxuICAgICAgICAgICAgICAgICAgICAgICAgfCAoZmxhZ3MuZGVwZW5kc09uIDw8IDQpICAgIC8vIHNhbXBsZV9kZXBlbmRzX29uXG4gICAgICAgICAgICAgICAgICAgICAgICB8IChmbGFncy5pc0RlcGVuZGVkT24gPDwgMikgLy8gc2FtcGxlX2lzX2RlcGVuZGVkX29uXG4gICAgICAgICAgICAgICAgICAgICAgICB8IChmbGFncy5oYXNSZWR1bmRhbmN5KTsgICAgLy8gc2FtcGxlX2hhc19yZWR1bmRhbmN5XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1QNC5ib3goTVA0LnR5cGVzLnNkdHAsIGRhdGEpO1xuICAgIH1cblxuICAgIC8vIFRyYWNrIGZyYWdtZW50IHJ1biBib3hcbiAgICBzdGF0aWMgdHJ1bih0cmFjaywgb2Zmc2V0KSB7XG4gICAgICAgIGxldCBzYW1wbGVzID0gdHJhY2suc2FtcGxlcyB8fCBbXTtcbiAgICAgICAgbGV0IHNhbXBsZUNvdW50ID0gc2FtcGxlcy5sZW5ndGg7XG4gICAgICAgIGxldCBkYXRhU2l6ZSA9IDEyICsgMTYgKiBzYW1wbGVDb3VudDtcbiAgICAgICAgbGV0IGRhdGEgPSBuZXcgVWludDhBcnJheShkYXRhU2l6ZSk7XG4gICAgICAgIG9mZnNldCArPSA4ICsgZGF0YVNpemU7XG5cbiAgICAgICAgZGF0YS5zZXQoW1xuICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMSwgICAgICAvLyB2ZXJzaW9uKDApICYgZmxhZ3NcbiAgICAgICAgICAgIChzYW1wbGVDb3VudCA+Pj4gMjQpICYgMHhGRiwgLy8gc2FtcGxlX2NvdW50XG4gICAgICAgICAgICAoc2FtcGxlQ291bnQgPj4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAoc2FtcGxlQ291bnQgPj4+ICA4KSAmIDB4RkYsXG4gICAgICAgICAgICAoc2FtcGxlQ291bnQpICYgMHhGRixcbiAgICAgICAgICAgIChvZmZzZXQgPj4+IDI0KSAmIDB4RkYsICAgICAgLy8gZGF0YV9vZmZzZXRcbiAgICAgICAgICAgIChvZmZzZXQgPj4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAob2Zmc2V0ID4+PiAgOCkgJiAweEZGLFxuICAgICAgICAgICAgKG9mZnNldCkgJiAweEZGXG4gICAgICAgIF0sIDApO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgbGV0IGR1cmF0aW9uID0gc2FtcGxlc1tpXS5kdXJhdGlvbjtcbiAgICAgICAgICAgIGxldCBzaXplID0gc2FtcGxlc1tpXS5zaXplO1xuICAgICAgICAgICAgbGV0IGZsYWdzID0gc2FtcGxlc1tpXS5mbGFncztcbiAgICAgICAgICAgIGxldCBjdHMgPSBzYW1wbGVzW2ldLmN0cztcbiAgICAgICAgICAgIGRhdGEuc2V0KFtcbiAgICAgICAgICAgICAgICAoZHVyYXRpb24gPj4+IDI0KSAmIDB4RkYsICAvLyBzYW1wbGVfZHVyYXRpb25cbiAgICAgICAgICAgICAgICAoZHVyYXRpb24gPj4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAgICAgKGR1cmF0aW9uID4+PiAgOCkgJiAweEZGLFxuICAgICAgICAgICAgICAgIChkdXJhdGlvbikgJiAweEZGLFxuICAgICAgICAgICAgICAgIChzaXplID4+PiAyNCkgJiAweEZGLCAgICAgIC8vIHNhbXBsZV9zaXplXG4gICAgICAgICAgICAgICAgKHNpemUgPj4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAgICAgKHNpemUgPj4+ICA4KSAmIDB4RkYsXG4gICAgICAgICAgICAgICAgKHNpemUpICYgMHhGRixcbiAgICAgICAgICAgICAgICAoZmxhZ3MuaXNMZWFkaW5nIDw8IDIpIHwgZmxhZ3MuZGVwZW5kc09uLCAgLy8gc2FtcGxlX2ZsYWdzXG4gICAgICAgICAgICAgICAgKGZsYWdzLmlzRGVwZW5kZWRPbiA8PCA2KSB8IChmbGFncy5oYXNSZWR1bmRhbmN5IDw8IDQpIHwgZmxhZ3MuaXNOb25TeW5jLFxuICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgIC8vIHNhbXBsZV9kZWdyYWRhdGlvbl9wcmlvcml0eVxuICAgICAgICAgICAgICAgIChjdHMgPj4+IDI0KSAmIDB4RkYsICAgICAgIC8vIHNhbXBsZV9jb21wb3NpdGlvbl90aW1lX29mZnNldFxuICAgICAgICAgICAgICAgIChjdHMgPj4+IDE2KSAmIDB4RkYsXG4gICAgICAgICAgICAgICAgKGN0cyA+Pj4gIDgpICYgMHhGRixcbiAgICAgICAgICAgICAgICAoY3RzKSAmIDB4RkZcbiAgICAgICAgICAgIF0sIDEyICsgMTYgKiBpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMudHJ1biwgZGF0YSk7XG4gICAgfVxuXG4gICAgc3RhdGljIG1kYXQoZGF0YSkge1xuICAgICAgICByZXR1cm4gTVA0LmJveChNUDQudHlwZXMubWRhdCwgZGF0YSk7XG4gICAgfVxuXG59XG5cbk1QNC5pbml0KCk7XG5cbmV4cG9ydCBkZWZhdWx0IE1QNDsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IExvZyBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IE1QNCBmcm9tICcuL21wNC1nZW5lcmF0b3IuanMnO1xuaW1wb3J0IEFBQyBmcm9tICcuL2FhYy1zaWxlbnQuanMnO1xuaW1wb3J0IEJyb3dzZXIgZnJvbSAnLi4vdXRpbHMvYnJvd3Nlci5qcyc7XG5pbXBvcnQge1NhbXBsZUluZm8sIE1lZGlhU2VnbWVudEluZm8sIE1lZGlhU2VnbWVudEluZm9MaXN0fSBmcm9tICcuLi9jb3JlL21lZGlhLXNlZ21lbnQtaW5mby5qcyc7XG5pbXBvcnQge0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvZXhjZXB0aW9uLmpzJztcblxuXG4vLyBGcmFnbWVudGVkIG1wNCByZW11eGVyXG5jbGFzcyBNUDRSZW11eGVyIHtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICB0aGlzLlRBRyA9ICdNUDRSZW11eGVyJztcblxuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuX2lzTGl2ZSA9IChjb25maWcuaXNMaXZlID09PSB0cnVlKSA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICB0aGlzLl9kdHNCYXNlID0gLTE7XG4gICAgICAgIHRoaXMuX2R0c0Jhc2VJbml0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYXVkaW9EdHNCYXNlID0gSW5maW5pdHk7XG4gICAgICAgIHRoaXMuX3ZpZGVvRHRzQmFzZSA9IEluZmluaXR5O1xuICAgICAgICB0aGlzLl9hdWRpb05leHREdHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3ZpZGVvTmV4dER0cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fYXVkaW9TdGFzaGVkTGFzdFNhbXBsZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ZpZGVvU3Rhc2hlZExhc3RTYW1wbGUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX2F1ZGlvTWV0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ZpZGVvTWV0YSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fYXVkaW9TZWdtZW50SW5mb0xpc3QgPSBuZXcgTWVkaWFTZWdtZW50SW5mb0xpc3QoJ2F1ZGlvJyk7XG4gICAgICAgIHRoaXMuX3ZpZGVvU2VnbWVudEluZm9MaXN0ID0gbmV3IE1lZGlhU2VnbWVudEluZm9MaXN0KCd2aWRlbycpO1xuXG4gICAgICAgIHRoaXMuX29uSW5pdFNlZ21lbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbk1lZGlhU2VnbWVudCA9IG51bGw7XG5cbiAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgY2hyb21lIDwgNTA6IEFsd2F5cyBmb3JjZSBmaXJzdCBzYW1wbGUgYXMgYSBSYW5kb20gQWNjZXNzIFBvaW50IGluIG1lZGlhIHNlZ21lbnRcbiAgICAgICAgLy8gc2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTIyOTQxMlxuICAgICAgICB0aGlzLl9mb3JjZUZpcnN0SURSID0gKEJyb3dzZXIuY2hyb21lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQnJvd3Nlci52ZXJzaW9uLm1ham9yIDwgNTAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCcm93c2VyLnZlcnNpb24ubWFqb3IgPT09IDUwICYmIEJyb3dzZXIudmVyc2lvbi5idWlsZCA8IDI2NjEpKSkgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgSUUxMS9FZGdlOiBGaWxsIHNpbGVudCBhYWMgZnJhbWUgYWZ0ZXIga2V5ZnJhbWUtc2Vla2luZ1xuICAgICAgICAvLyBNYWtlIGF1ZGlvIGJlZ2luRHRzIGVxdWFscyB3aXRoIHZpZGVvIGJlZ2luRHRzLCBpbiBvcmRlciB0byBmaXggc2VlayBmcmVlemVcbiAgICAgICAgdGhpcy5fZmlsbFNpbGVudEFmdGVyU2VlayA9IChCcm93c2VyLm1zZWRnZSB8fCBCcm93c2VyLm1zaWUpO1xuXG4gICAgICAgIC8vIFdoaWxlIG9ubHkgRmlyZUZveCBzdXBwb3J0cyAnYXVkaW8vbXA0LCBjb2RlY3M9XCJtcDNcIicsIHVzZSAnYXVkaW8vbXBlZycgZm9yIGNocm9tZSwgc2FmYXJpLCAuLi5cbiAgICAgICAgdGhpcy5fbXAzVXNlTXBlZ0F1ZGlvID0gIUJyb3dzZXIuZmlyZWZveDtcblxuICAgICAgICB0aGlzLl9maWxsQXVkaW9UaW1lc3RhbXBHYXAgPSB0aGlzLl9jb25maWcuZml4QXVkaW9UaW1lc3RhbXBHYXA7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fZHRzQmFzZSA9IC0xO1xuICAgICAgICB0aGlzLl9kdHNCYXNlSW5pdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2F1ZGlvTWV0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ZpZGVvTWV0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2F1ZGlvU2VnbWVudEluZm9MaXN0LmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX2F1ZGlvU2VnbWVudEluZm9MaXN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdmlkZW9TZWdtZW50SW5mb0xpc3QuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fdmlkZW9TZWdtZW50SW5mb0xpc3QgPSBudWxsO1xuICAgICAgICB0aGlzLl9vbkluaXRTZWdtZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb25NZWRpYVNlZ21lbnQgPSBudWxsO1xuICAgIH1cblxuICAgIGJpbmREYXRhU291cmNlKHByb2R1Y2VyKSB7XG4gICAgICAgIHByb2R1Y2VyLm9uRGF0YUF2YWlsYWJsZSA9IHRoaXMucmVtdXguYmluZCh0aGlzKTtcbiAgICAgICAgcHJvZHVjZXIub25UcmFja01ldGFkYXRhID0gdGhpcy5fb25UcmFja01ldGFkYXRhUmVjZWl2ZWQuYmluZCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyogcHJvdG90eXBlOiBmdW5jdGlvbiBvbkluaXRTZWdtZW50KHR5cGU6IHN0cmluZywgaW5pdFNlZ21lbnQ6IEFycmF5QnVmZmVyKTogdm9pZFxuICAgICAgIEluaXRTZWdtZW50OiB7XG4gICAgICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgICAgZGF0YTogQXJyYXlCdWZmZXIsXG4gICAgICAgICAgIGNvZGVjOiBzdHJpbmcsXG4gICAgICAgICAgIGNvbnRhaW5lcjogc3RyaW5nXG4gICAgICAgfVxuICAgICovXG4gICAgZ2V0IG9uSW5pdFNlZ21lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vbkluaXRTZWdtZW50O1xuICAgIH1cblxuICAgIHNldCBvbkluaXRTZWdtZW50KGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uSW5pdFNlZ21lbnQgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICAvKiBwcm90b3R5cGU6IGZ1bmN0aW9uIG9uTWVkaWFTZWdtZW50KHR5cGU6IHN0cmluZywgbWVkaWFTZWdtZW50OiBNZWRpYVNlZ21lbnQpOiB2b2lkXG4gICAgICAgTWVkaWFTZWdtZW50OiB7XG4gICAgICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgICAgZGF0YTogQXJyYXlCdWZmZXIsXG4gICAgICAgICAgIHNhbXBsZUNvdW50OiBpbnQzMlxuICAgICAgICAgICBpbmZvOiBNZWRpYVNlZ21lbnRJbmZvXG4gICAgICAgfVxuICAgICovXG4gICAgZ2V0IG9uTWVkaWFTZWdtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25NZWRpYVNlZ21lbnQ7XG4gICAgfVxuXG4gICAgc2V0IG9uTWVkaWFTZWdtZW50KGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuX29uTWVkaWFTZWdtZW50ID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgaW5zZXJ0RGlzY29udGludWl0eSgpIHtcbiAgICAgICAgdGhpcy5fYXVkaW9OZXh0RHRzID0gdGhpcy5fdmlkZW9OZXh0RHRzID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHNlZWsob3JpZ2luYWxEdHMpIHtcbiAgICAgICAgdGhpcy5fYXVkaW9TdGFzaGVkTGFzdFNhbXBsZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3ZpZGVvU3Rhc2hlZExhc3RTYW1wbGUgPSBudWxsO1xuICAgICAgICB0aGlzLl92aWRlb1NlZ21lbnRJbmZvTGlzdC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9hdWRpb1NlZ21lbnRJbmZvTGlzdC5jbGVhcigpO1xuICAgIH1cblxuICAgIHJlbXV4KGF1ZGlvVHJhY2ssIHZpZGVvVHJhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLl9vbk1lZGlhU2VnbWVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbignTVA0UmVtdXhlcjogb25NZWRpYVNlZ21lbnQgY2FsbGJhY2sgbXVzdCBiZSBzcGVjaWZpY2VkIScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZHRzQmFzZUluaXRlZCkge1xuICAgICAgICAgICAgdGhpcy5fY2FsY3VsYXRlRHRzQmFzZShhdWRpb1RyYWNrLCB2aWRlb1RyYWNrKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZW11eFZpZGVvKHZpZGVvVHJhY2spO1xuICAgICAgICB0aGlzLl9yZW11eEF1ZGlvKGF1ZGlvVHJhY2spO1xuICAgIH1cblxuICAgIF9vblRyYWNrTWV0YWRhdGFSZWNlaXZlZCh0eXBlLCBtZXRhZGF0YSkge1xuICAgICAgICBsZXQgbWV0YWJveCA9IG51bGw7XG5cbiAgICAgICAgbGV0IGNvbnRhaW5lciA9ICdtcDQnO1xuICAgICAgICBsZXQgY29kZWMgPSBtZXRhZGF0YS5jb2RlYztcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgICAgdGhpcy5fYXVkaW9NZXRhID0gbWV0YWRhdGE7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGEuY29kZWMgPT09ICdtcDMnICYmIHRoaXMuX21wM1VzZU1wZWdBdWRpbykge1xuICAgICAgICAgICAgICAgIC8vICdhdWRpby9tcGVnJyBmb3IgTVAzIGF1ZGlvIHRyYWNrXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gJ21wZWcnO1xuICAgICAgICAgICAgICAgIGNvZGVjID0gJyc7XG4gICAgICAgICAgICAgICAgbWV0YWJveCA9IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICdhdWRpby9tcDQsIGNvZGVjcz1cImNvZGVjXCInXG4gICAgICAgICAgICAgICAgbWV0YWJveCA9IE1QNC5nZW5lcmF0ZUluaXRTZWdtZW50KG1ldGFkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAndmlkZW8nKSB7XG4gICAgICAgICAgICB0aGlzLl92aWRlb01ldGEgPSBtZXRhZGF0YTtcbiAgICAgICAgICAgIG1ldGFib3ggPSBNUDQuZ2VuZXJhdGVJbml0U2VnbWVudChtZXRhZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkaXNwYXRjaCBtZXRhYm94IChJbml0aWFsaXphdGlvbiBTZWdtZW50KVxuICAgICAgICBpZiAoIXRoaXMuX29uSW5pdFNlZ21lbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oJ01QNFJlbXV4ZXI6IG9uSW5pdFNlZ21lbnQgY2FsbGJhY2sgbXVzdCBiZSBzcGVjaWZpZWQhJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb25Jbml0U2VnbWVudCh0eXBlLCB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgZGF0YTogbWV0YWJveC5idWZmZXIsXG4gICAgICAgICAgICBjb2RlYzogY29kZWMsXG4gICAgICAgICAgICBjb250YWluZXI6IGAke3R5cGV9LyR7Y29udGFpbmVyfWAsXG4gICAgICAgICAgICBtZWRpYUR1cmF0aW9uOiBtZXRhZGF0YS5kdXJhdGlvbiAgLy8gaW4gdGltZXNjYWxlIDEwMDAgKG1pbGxpc2Vjb25kcylcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2NhbGN1bGF0ZUR0c0Jhc2UoYXVkaW9UcmFjaywgdmlkZW9UcmFjaykge1xuICAgICAgICBpZiAodGhpcy5fZHRzQmFzZUluaXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF1ZGlvVHJhY2suc2FtcGxlcyAmJiBhdWRpb1RyYWNrLnNhbXBsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9hdWRpb0R0c0Jhc2UgPSBhdWRpb1RyYWNrLnNhbXBsZXNbMF0uZHRzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2aWRlb1RyYWNrLnNhbXBsZXMgJiYgdmlkZW9UcmFjay5zYW1wbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fdmlkZW9EdHNCYXNlID0gdmlkZW9UcmFjay5zYW1wbGVzWzBdLmR0cztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2R0c0Jhc2UgPSBNYXRoLm1pbih0aGlzLl9hdWRpb0R0c0Jhc2UsIHRoaXMuX3ZpZGVvRHRzQmFzZSk7XG4gICAgICAgIHRoaXMuX2R0c0Jhc2VJbml0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGZsdXNoU3Rhc2hlZFNhbXBsZXMoKSB7XG4gICAgICAgIGxldCB2aWRlb1NhbXBsZSA9IHRoaXMuX3ZpZGVvU3Rhc2hlZExhc3RTYW1wbGU7XG4gICAgICAgIGxldCBhdWRpb1NhbXBsZSA9IHRoaXMuX2F1ZGlvU3Rhc2hlZExhc3RTYW1wbGU7XG5cbiAgICAgICAgbGV0IHZpZGVvVHJhY2sgPSB7XG4gICAgICAgICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgICBzZXF1ZW5jZU51bWJlcjogMCxcbiAgICAgICAgICAgIHNhbXBsZXM6IFtdLFxuICAgICAgICAgICAgbGVuZ3RoOiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHZpZGVvU2FtcGxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZpZGVvVHJhY2suc2FtcGxlcy5wdXNoKHZpZGVvU2FtcGxlKTtcbiAgICAgICAgICAgIHZpZGVvVHJhY2subGVuZ3RoID0gdmlkZW9TYW1wbGUubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGF1ZGlvVHJhY2sgPSB7XG4gICAgICAgICAgICB0eXBlOiAnYXVkaW8nLFxuICAgICAgICAgICAgaWQ6IDIsXG4gICAgICAgICAgICBzZXF1ZW5jZU51bWJlcjogMCxcbiAgICAgICAgICAgIHNhbXBsZXM6IFtdLFxuICAgICAgICAgICAgbGVuZ3RoOiAwXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGF1ZGlvU2FtcGxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGF1ZGlvVHJhY2suc2FtcGxlcy5wdXNoKGF1ZGlvU2FtcGxlKTtcbiAgICAgICAgICAgIGF1ZGlvVHJhY2subGVuZ3RoID0gYXVkaW9TYW1wbGUubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdmlkZW9TdGFzaGVkTGFzdFNhbXBsZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2F1ZGlvU3Rhc2hlZExhc3RTYW1wbGUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuX3JlbXV4VmlkZW8odmlkZW9UcmFjaywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuX3JlbXV4QXVkaW8oYXVkaW9UcmFjaywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgX3JlbXV4QXVkaW8oYXVkaW9UcmFjaywgZm9yY2UpIHtcbiAgICAgICAgaWYgKHRoaXMuX2F1ZGlvTWV0YSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJhY2sgPSBhdWRpb1RyYWNrO1xuICAgICAgICBsZXQgc2FtcGxlcyA9IHRyYWNrLnNhbXBsZXM7XG4gICAgICAgIGxldCBkdHNDb3JyZWN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgZmlyc3REdHMgPSAtMSwgbGFzdER0cyA9IC0xLCBsYXN0UHRzID0gLTE7XG4gICAgICAgIGxldCByZWZTYW1wbGVEdXJhdGlvbiA9IHRoaXMuX2F1ZGlvTWV0YS5yZWZTYW1wbGVEdXJhdGlvbjtcblxuICAgICAgICBsZXQgbXBlZ1Jhd1RyYWNrID0gdGhpcy5fYXVkaW9NZXRhLmNvZGVjID09PSAnbXAzJyAmJiB0aGlzLl9tcDNVc2VNcGVnQXVkaW87XG4gICAgICAgIGxldCBmaXJzdFNlZ21lbnRBZnRlclNlZWsgPSB0aGlzLl9kdHNCYXNlSW5pdGVkICYmIHRoaXMuX2F1ZGlvTmV4dER0cyA9PT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBpbnNlcnRQcmVmaXhTaWxlbnRGcmFtZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghc2FtcGxlcyB8fCBzYW1wbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYW1wbGVzLmxlbmd0aCA9PT0gMSAmJiAhZm9yY2UpIHtcbiAgICAgICAgICAgIC8vIElmIFtzYW1wbGUgY291bnQgaW4gY3VycmVudCBiYXRjaF0gPT09IDEgJiYgKGZvcmNlICE9IHRydWUpXG4gICAgICAgICAgICAvLyBJZ25vcmUgYW5kIGtlZXAgaW4gZGVtdXhlcidzIHF1ZXVlXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gIC8vIGVsc2UgaWYgKGZvcmNlID09PSB0cnVlKSBkbyByZW11eFxuXG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgbWRhdGJveCA9IG51bGw7XG4gICAgICAgIGxldCBtZGF0Qnl0ZXMgPSAwO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBpbml0aWFsIG1kYXQgc2l6ZVxuICAgICAgICBpZiAobXBlZ1Jhd1RyYWNrKSB7XG4gICAgICAgICAgICAvLyBmb3IgcmF3IG1wZWcgYnVmZmVyXG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgbWRhdEJ5dGVzID0gdHJhY2subGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZm9yIGZtcDQgbWRhdCBib3hcbiAgICAgICAgICAgIG9mZnNldCA9IDg7ICAvLyBzaXplICsgdHlwZVxuICAgICAgICAgICAgbWRhdEJ5dGVzID0gOCArIHRyYWNrLmxlbmd0aDtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IGxhc3RTYW1wbGUgPSBudWxsO1xuXG4gICAgICAgIC8vIFBvcCB0aGUgbGFzdFNhbXBsZSBhbmQgd2FpdGluZyBmb3Igc3Rhc2hcbiAgICAgICAgaWYgKHNhbXBsZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGFzdFNhbXBsZSA9IHNhbXBsZXMucG9wKCk7XG4gICAgICAgICAgICBtZGF0Qnl0ZXMgLT0gbGFzdFNhbXBsZS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbnNlcnQgW3N0YXNoZWQgbGFzdFNhbXBsZSBpbiB0aGUgcHJldmlvdXMgYmF0Y2hdIHRvIHRoZSBmcm9udFxuICAgICAgICBpZiAodGhpcy5fYXVkaW9TdGFzaGVkTGFzdFNhbXBsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgc2FtcGxlID0gdGhpcy5fYXVkaW9TdGFzaGVkTGFzdFNhbXBsZTtcbiAgICAgICAgICAgIHRoaXMuX2F1ZGlvU3Rhc2hlZExhc3RTYW1wbGUgPSBudWxsO1xuICAgICAgICAgICAgc2FtcGxlcy51bnNoaWZ0KHNhbXBsZSk7XG4gICAgICAgICAgICBtZGF0Qnl0ZXMgKz0gc2FtcGxlLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YXNoIHRoZSBsYXN0U2FtcGxlIG9mIGN1cnJlbnQgYmF0Y2gsIHdhaXRpbmcgZm9yIG5leHQgYmF0Y2hcbiAgICAgICAgaWYgKGxhc3RTYW1wbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fYXVkaW9TdGFzaGVkTGFzdFNhbXBsZSA9IGxhc3RTYW1wbGU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBmaXJzdFNhbXBsZU9yaWdpbmFsRHRzID0gc2FtcGxlc1swXS5kdHMgLSB0aGlzLl9kdHNCYXNlO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBkdHNDb3JyZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLl9hdWRpb05leHREdHMpIHtcbiAgICAgICAgICAgIGR0c0NvcnJlY3Rpb24gPSBmaXJzdFNhbXBsZU9yaWdpbmFsRHRzIC0gdGhpcy5fYXVkaW9OZXh0RHRzO1xuICAgICAgICB9IGVsc2UgeyAgLy8gdGhpcy5fYXVkaW9OZXh0RHRzID09IHVuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKHRoaXMuX2F1ZGlvU2VnbWVudEluZm9MaXN0LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgIGR0c0NvcnJlY3Rpb24gPSAwO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9maWxsU2lsZW50QWZ0ZXJTZWVrICYmICF0aGlzLl92aWRlb1NlZ21lbnRJbmZvTGlzdC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2F1ZGlvTWV0YS5vcmlnaW5hbENvZGVjICE9PSAnbXAzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0UHJlZml4U2lsZW50RnJhbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdFNhbXBsZSA9IHRoaXMuX2F1ZGlvU2VnbWVudEluZm9MaXN0LmdldExhc3RTYW1wbGVCZWZvcmUoZmlyc3RTYW1wbGVPcmlnaW5hbER0cyk7XG4gICAgICAgICAgICAgICAgaWYgKGxhc3RTYW1wbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlzdGFuY2UgPSAoZmlyc3RTYW1wbGVPcmlnaW5hbER0cyAtIChsYXN0U2FtcGxlLm9yaWdpbmFsRHRzICsgbGFzdFNhbXBsZS5kdXJhdGlvbikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPD0gMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBleHBlY3RlZER0cyA9IGxhc3RTYW1wbGUuZHRzICsgbGFzdFNhbXBsZS5kdXJhdGlvbiArIGRpc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICBkdHNDb3JyZWN0aW9uID0gZmlyc3RTYW1wbGVPcmlnaW5hbER0cyAtIGV4cGVjdGVkRHRzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGxhc3RTYW1wbGUgPT0gbnVsbCwgY2Fubm90IGZvdW5kXG4gICAgICAgICAgICAgICAgICAgIGR0c0NvcnJlY3Rpb24gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnNlcnRQcmVmaXhTaWxlbnRGcmFtZSkge1xuICAgICAgICAgICAgLy8gYWxpZ24gYXVkaW8gc2VnbWVudCBiZWdpbkR0cyB0byBtYXRjaCB3aXRoIGN1cnJlbnQgdmlkZW8gc2VnbWVudCdzIGJlZ2luRHRzXG4gICAgICAgICAgICBsZXQgZmlyc3RTYW1wbGVEdHMgPSBmaXJzdFNhbXBsZU9yaWdpbmFsRHRzIC0gZHRzQ29ycmVjdGlvbjtcbiAgICAgICAgICAgIGxldCB2aWRlb1NlZ21lbnQgPSB0aGlzLl92aWRlb1NlZ21lbnRJbmZvTGlzdC5nZXRMYXN0U2VnbWVudEJlZm9yZShmaXJzdFNhbXBsZU9yaWdpbmFsRHRzKTtcbiAgICAgICAgICAgIGlmICh2aWRlb1NlZ21lbnQgIT0gbnVsbCAmJiB2aWRlb1NlZ21lbnQuYmVnaW5EdHMgPCBmaXJzdFNhbXBsZUR0cykge1xuICAgICAgICAgICAgICAgIGxldCBzaWxlbnRVbml0ID0gQUFDLmdldFNpbGVudEZyYW1lKHRoaXMuX2F1ZGlvTWV0YS5vcmlnaW5hbENvZGVjLCB0aGlzLl9hdWRpb01ldGEuY2hhbm5lbENvdW50KTtcbiAgICAgICAgICAgICAgICBpZiAoc2lsZW50VW5pdCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZHRzID0gdmlkZW9TZWdtZW50LmJlZ2luRHRzO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2lsZW50RnJhbWVEdXJhdGlvbiA9IGZpcnN0U2FtcGxlRHRzIC0gdmlkZW9TZWdtZW50LmJlZ2luRHRzO1xuICAgICAgICAgICAgICAgICAgICBMb2cudih0aGlzLlRBRywgYEluc2VydFByZWZpeFNpbGVudEF1ZGlvOiBkdHM6ICR7ZHRzfSwgZHVyYXRpb246ICR7c2lsZW50RnJhbWVEdXJhdGlvbn1gKTtcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlcy51bnNoaWZ0KHt1bml0OiBzaWxlbnRVbml0LCBkdHM6IGR0cywgcHRzOiBkdHN9KTtcbiAgICAgICAgICAgICAgICAgICAgbWRhdEJ5dGVzICs9IHNpbGVudFVuaXQuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB9ICAvLyBzaWxlbnRVbml0ID09IG51bGw6IENhbm5vdCBnZW5lcmF0ZSwgc2tpcFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnNlcnRQcmVmaXhTaWxlbnRGcmFtZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1wNFNhbXBsZXMgPSBbXTtcblxuICAgICAgICAvLyBDb3JyZWN0IGR0cyBmb3IgZWFjaCBzYW1wbGUsIGFuZCBjYWxjdWxhdGUgc2FtcGxlIGR1cmF0aW9uLiBUaGVuIG91dHB1dCB0byBtcDRTYW1wbGVzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHNhbXBsZSA9IHNhbXBsZXNbaV07XG4gICAgICAgICAgICBsZXQgdW5pdCA9IHNhbXBsZS51bml0O1xuICAgICAgICAgICAgbGV0IG9yaWdpbmFsRHRzID0gc2FtcGxlLmR0cyAtIHRoaXMuX2R0c0Jhc2U7XG4gICAgICAgICAgICBsZXQgZHRzID0gb3JpZ2luYWxEdHMgLSBkdHNDb3JyZWN0aW9uO1xuXG4gICAgICAgICAgICBpZiAoZmlyc3REdHMgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgZmlyc3REdHMgPSBkdHM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBzYW1wbGVEdXJhdGlvbiA9IDA7XG5cbiAgICAgICAgICAgIGlmIChpICE9PSBzYW1wbGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dER0cyA9IHNhbXBsZXNbaSArIDFdLmR0cyAtIHRoaXMuX2R0c0Jhc2UgLSBkdHNDb3JyZWN0aW9uO1xuICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbmV4dER0cyAtIGR0cztcbiAgICAgICAgICAgIH0gZWxzZSB7ICAvLyB0aGUgbGFzdCBzYW1wbGVcbiAgICAgICAgICAgICAgICBpZiAobGFzdFNhbXBsZSAhPSBudWxsKSB7ICAvLyB1c2Ugc3Rhc2hlZCBzYW1wbGUncyBkdHMgdG8gY2FsY3VsYXRlIHNhbXBsZSBkdXJhdGlvblxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dER0cyA9IGxhc3RTYW1wbGUuZHRzIC0gdGhpcy5fZHRzQmFzZSAtIGR0c0NvcnJlY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbmV4dER0cyAtIGR0cztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1wNFNhbXBsZXMubGVuZ3RoID49IDEpIHsgIC8vIHVzZSBzZWNvbmQgbGFzdCBzYW1wbGUgZHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBtcDRTYW1wbGVzW21wNFNhbXBsZXMubGVuZ3RoIC0gMV0uZHVyYXRpb247XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8vIHRoZSBvbmx5IG9uZSBzYW1wbGUsIHVzZSByZWZlcmVuY2Ugc2FtcGxlIGR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uID0gTWF0aC5mbG9vcihyZWZTYW1wbGVEdXJhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbmVlZEZpbGxTaWxlbnRGcmFtZXMgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBzaWxlbnRGcmFtZXMgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBTaWxlbnQgZnJhbWUgZ2VuZXJhdGlvbiwgaWYgbGFyZ2UgdGltZXN0YW1wIGdhcCBkZXRlY3RlZCAmJiBjb25maWcuZml4QXVkaW9UaW1lc3RhbXBHYXBcbiAgICAgICAgICAgIGlmIChzYW1wbGVEdXJhdGlvbiA+IHJlZlNhbXBsZUR1cmF0aW9uICogMS41ICYmIHRoaXMuX2F1ZGlvTWV0YS5jb2RlYyAhPT0gJ21wMycgJiYgdGhpcy5fZmlsbEF1ZGlvVGltZXN0YW1wR2FwICYmICFCcm93c2VyLnNhZmFyaSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gaW5zZXJ0IHNpbGVudCBmcmFtZXMgdG8gZmlsbCB0aW1lc3RhbXAgZ2FwXG4gICAgICAgICAgICAgICAgbmVlZEZpbGxTaWxlbnRGcmFtZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBkZWx0YSA9IE1hdGguYWJzKHNhbXBsZUR1cmF0aW9uIC0gcmVmU2FtcGxlRHVyYXRpb24pO1xuICAgICAgICAgICAgICAgIGxldCBmcmFtZUNvdW50ID0gTWF0aC5jZWlsKGRlbHRhIC8gcmVmU2FtcGxlRHVyYXRpb24pO1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50RHRzID0gZHRzICsgcmVmU2FtcGxlRHVyYXRpb247ICAvLyBOb3RpY2U6IGluIGZsb2F0XG5cbiAgICAgICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgJ0xhcmdlIGF1ZGlvIHRpbWVzdGFtcCBnYXAgZGV0ZWN0ZWQsIG1heSBjYXVzZSBBViBzeW5jIHRvIGRyaWZ0LiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NpbGVudCBmcmFtZXMgd2lsbCBiZSBnZW5lcmF0ZWQgdG8gYXZvaWQgdW5zeW5jLlxcbicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZHRzOiAke2R0cyArIHNhbXBsZUR1cmF0aW9ufSBtcywgZXhwZWN0ZWQ6ICR7ZHRzICsgTWF0aC5yb3VuZChyZWZTYW1wbGVEdXJhdGlvbil9IG1zLCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGRlbHRhOiAke01hdGgucm91bmQoZGVsdGEpfSBtcywgZ2VuZXJhdGU6ICR7ZnJhbWVDb3VudH0gZnJhbWVzYCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgc2lsZW50VW5pdCA9IEFBQy5nZXRTaWxlbnRGcmFtZSh0aGlzLl9hdWRpb01ldGEub3JpZ2luYWxDb2RlYywgdGhpcy5fYXVkaW9NZXRhLmNoYW5uZWxDb3VudCk7XG4gICAgICAgICAgICAgICAgaWYgKHNpbGVudFVuaXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBMb2cudyh0aGlzLlRBRywgJ1VuYWJsZSB0byBnZW5lcmF0ZSBzaWxlbnQgZnJhbWUgZm9yICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYXVkaW9NZXRhLm9yaWdpbmFsQ29kZWN9IHdpdGggJHt0aGlzLl9hdWRpb01ldGEuY2hhbm5lbENvdW50fSBjaGFubmVscywgcmVwZWF0IGxhc3QgZnJhbWVgKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwZWF0IGxhc3QgZnJhbWVcbiAgICAgICAgICAgICAgICAgICAgc2lsZW50VW5pdCA9IHVuaXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNpbGVudEZyYW1lcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBmcmFtZUNvdW50OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGludER0cyA9IE1hdGgucm91bmQoY3VycmVudER0cyk7ICAvLyByb3VuZCB0byBpbnRlZ2VyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWxlbnRGcmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHByZXZpb3VzIGZyYW1lIHNhbXBsZSBkdXJhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZpb3VzRnJhbWUgPSBzaWxlbnRGcmFtZXNbc2lsZW50RnJhbWVzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNGcmFtZS5kdXJhdGlvbiA9IGludER0cyAtIHByZXZpb3VzRnJhbWUuZHRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBmcmFtZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR0czogaW50RHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHRzOiBpbnREdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdHM6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0OiBzaWxlbnRVbml0LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogc2lsZW50VW5pdC5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDAsICAvLyB3YWl0IGZvciBuZXh0IHNhbXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxEdHM6IG9yaWdpbmFsRHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xlYWRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kc09uOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVwZW5kZWRPbjogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNSZWR1bmRhbmN5OiAwXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHNpbGVudEZyYW1lcy5wdXNoKGZyYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbWRhdEJ5dGVzICs9IGZyYW1lLnNpemU7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnREdHMgKz0gcmVmU2FtcGxlRHVyYXRpb247XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gbGFzdCBmcmFtZTogYWxpZ24gZW5kIHRpbWUgdG8gbmV4dCBmcmFtZSBkdHNcbiAgICAgICAgICAgICAgICBsZXQgbGFzdEZyYW1lID0gc2lsZW50RnJhbWVzW3NpbGVudEZyYW1lcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBsYXN0RnJhbWUuZHVyYXRpb24gPSBkdHMgKyBzYW1wbGVEdXJhdGlvbiAtIGxhc3RGcmFtZS5kdHM7XG5cbiAgICAgICAgICAgICAgICAvLyBzaWxlbnRGcmFtZXMuZm9yRWFjaCgoZnJhbWUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgTG9nLncodGhpcy5UQUcsIGBTaWxlbnRBdWRpbzogZHRzOiAke2ZyYW1lLmR0c30sIGR1cmF0aW9uOiAke2ZyYW1lLmR1cmF0aW9ufWApO1xuICAgICAgICAgICAgICAgIC8vIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2V0IGNvcnJlY3Qgc2FtcGxlIGR1cmF0aW9uIGZvciBjdXJyZW50IGZyYW1lXG4gICAgICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24gPSBNYXRoLnJvdW5kKHJlZlNhbXBsZUR1cmF0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbXA0U2FtcGxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkdHM6IGR0cyxcbiAgICAgICAgICAgICAgICBwdHM6IGR0cyxcbiAgICAgICAgICAgICAgICBjdHM6IDAsXG4gICAgICAgICAgICAgICAgdW5pdDogc2FtcGxlLnVuaXQsXG4gICAgICAgICAgICAgICAgc2l6ZTogc2FtcGxlLnVuaXQuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogc2FtcGxlRHVyYXRpb24sXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxEdHM6IG9yaWdpbmFsRHRzLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB7XG4gICAgICAgICAgICAgICAgICAgIGlzTGVhZGluZzogMCxcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kc09uOiAxLFxuICAgICAgICAgICAgICAgICAgICBpc0RlcGVuZGVkT246IDAsXG4gICAgICAgICAgICAgICAgICAgIGhhc1JlZHVuZGFuY3k6IDBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG5lZWRGaWxsU2lsZW50RnJhbWVzKSB7XG4gICAgICAgICAgICAgICAgLy8gU2lsZW50IGZyYW1lcyBzaG91bGQgYmUgaW5zZXJ0ZWQgYWZ0ZXIgd3JvbmctZHVyYXRpb24gZnJhbWVcbiAgICAgICAgICAgICAgICBtcDRTYW1wbGVzLnB1c2guYXBwbHkobXA0U2FtcGxlcywgc2lsZW50RnJhbWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFsbG9jYXRlIG1kYXRib3hcbiAgICAgICAgaWYgKG1wZWdSYXdUcmFjaykge1xuICAgICAgICAgICAgLy8gYWxsb2NhdGUgZm9yIHJhdyBtcGVnIGJ1ZmZlclxuICAgICAgICAgICAgbWRhdGJveCA9IG5ldyBVaW50OEFycmF5KG1kYXRCeXRlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBhbGxvY2F0ZSBmb3IgZm1wNCBtZGF0IGJveFxuICAgICAgICAgICAgbWRhdGJveCA9IG5ldyBVaW50OEFycmF5KG1kYXRCeXRlcyk7XG4gICAgICAgICAgICAvLyBzaXplIGZpZWxkXG4gICAgICAgICAgICBtZGF0Ym94WzBdID0gKG1kYXRCeXRlcyA+Pj4gMjQpICYgMHhGRjtcbiAgICAgICAgICAgIG1kYXRib3hbMV0gPSAobWRhdEJ5dGVzID4+PiAxNikgJiAweEZGO1xuICAgICAgICAgICAgbWRhdGJveFsyXSA9IChtZGF0Qnl0ZXMgPj4+ICA4KSAmIDB4RkY7XG4gICAgICAgICAgICBtZGF0Ym94WzNdID0gKG1kYXRCeXRlcykgJiAweEZGO1xuICAgICAgICAgICAgLy8gdHlwZSBmaWVsZCAoZm91ckNDKVxuICAgICAgICAgICAgbWRhdGJveC5zZXQoTVA0LnR5cGVzLm1kYXQsIDQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgc2FtcGxlcyBpbnRvIG1kYXRib3hcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtcDRTYW1wbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdW5pdCA9IG1wNFNhbXBsZXNbaV0udW5pdDtcbiAgICAgICAgICAgIG1kYXRib3guc2V0KHVuaXQsIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gdW5pdC5ieXRlTGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxhdGVzdCA9IG1wNFNhbXBsZXNbbXA0U2FtcGxlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgbGFzdER0cyA9IGxhdGVzdC5kdHMgKyBsYXRlc3QuZHVyYXRpb247XG4gICAgICAgIHRoaXMuX2F1ZGlvTmV4dER0cyA9IGxhc3REdHM7XG5cbiAgICAgICAgLy8gZmlsbCBtZWRpYSBzZWdtZW50IGluZm8gJiBhZGQgdG8gaW5mbyBsaXN0XG4gICAgICAgIGxldCBpbmZvID0gbmV3IE1lZGlhU2VnbWVudEluZm8oKTtcbiAgICAgICAgaW5mby5iZWdpbkR0cyA9IGZpcnN0RHRzO1xuICAgICAgICBpbmZvLmVuZER0cyA9IGxhc3REdHM7XG4gICAgICAgIGluZm8uYmVnaW5QdHMgPSBmaXJzdER0cztcbiAgICAgICAgaW5mby5lbmRQdHMgPSBsYXN0RHRzO1xuICAgICAgICBpbmZvLm9yaWdpbmFsQmVnaW5EdHMgPSBtcDRTYW1wbGVzWzBdLm9yaWdpbmFsRHRzO1xuICAgICAgICBpbmZvLm9yaWdpbmFsRW5kRHRzID0gbGF0ZXN0Lm9yaWdpbmFsRHRzICsgbGF0ZXN0LmR1cmF0aW9uO1xuICAgICAgICBpbmZvLmZpcnN0U2FtcGxlID0gbmV3IFNhbXBsZUluZm8obXA0U2FtcGxlc1swXS5kdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDRTYW1wbGVzWzBdLnB0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wNFNhbXBsZXNbMF0uZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDRTYW1wbGVzWzBdLm9yaWdpbmFsRHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpO1xuICAgICAgICBpbmZvLmxhc3RTYW1wbGUgPSBuZXcgU2FtcGxlSW5mbyhsYXRlc3QuZHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3QucHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3QuZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdC5vcmlnaW5hbER0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpO1xuICAgICAgICBpZiAoIXRoaXMuX2lzTGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5fYXVkaW9TZWdtZW50SW5mb0xpc3QuYXBwZW5kKGluZm8pO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhY2suc2FtcGxlcyA9IG1wNFNhbXBsZXM7XG4gICAgICAgIHRyYWNrLnNlcXVlbmNlTnVtYmVyKys7XG5cbiAgICAgICAgbGV0IG1vb2Zib3ggPSBudWxsO1xuXG4gICAgICAgIGlmIChtcGVnUmF3VHJhY2spIHtcbiAgICAgICAgICAgIC8vIEdlbmVyYXRlIGVtcHR5IGJ1ZmZlciwgYmVjYXVzZSB1c2VsZXNzIGZvciByYXcgbXBlZ1xuICAgICAgICAgICAgbW9vZmJveCA9IG5ldyBVaW50OEFycmF5KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBHZW5lcmF0ZSBtb29mIGZvciBmbXA0IHNlZ21lbnRcbiAgICAgICAgICAgIG1vb2Zib3ggPSBNUDQubW9vZih0cmFjaywgZmlyc3REdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhY2suc2FtcGxlcyA9IFtdO1xuICAgICAgICB0cmFjay5sZW5ndGggPSAwO1xuXG4gICAgICAgIGxldCBzZWdtZW50ID0ge1xuICAgICAgICAgICAgdHlwZTogJ2F1ZGlvJyxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuX21lcmdlQm94ZXMobW9vZmJveCwgbWRhdGJveCkuYnVmZmVyLFxuICAgICAgICAgICAgc2FtcGxlQ291bnQ6IG1wNFNhbXBsZXMubGVuZ3RoLFxuICAgICAgICAgICAgaW5mbzogaW5mb1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChtcGVnUmF3VHJhY2sgJiYgZmlyc3RTZWdtZW50QWZ0ZXJTZWVrKSB7XG4gICAgICAgICAgICAvLyBGb3IgTVBFRyBhdWRpbyBzdHJlYW0gaW4gTVNFLCBpZiBzZWVraW5nIG9jY3VycmVkLCBiZWZvcmUgYXBwZW5kaW5nIG5ldyBidWZmZXJcbiAgICAgICAgICAgIC8vIFdlIG5lZWQgZXhwbGljaXRseSBzZXQgdGltZXN0YW1wT2Zmc2V0IHRvIHRoZSBkZXNpcmVkIHBvaW50IGluIHRpbWVsaW5lIGZvciBtcGVnIFNvdXJjZUJ1ZmZlci5cbiAgICAgICAgICAgIHNlZ21lbnQudGltZXN0YW1wT2Zmc2V0ID0gZmlyc3REdHM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vbk1lZGlhU2VnbWVudCgnYXVkaW8nLCBzZWdtZW50KTtcbiAgICB9XG5cbiAgICBfcmVtdXhWaWRlbyh2aWRlb1RyYWNrLCBmb3JjZSkge1xuICAgICAgICBpZiAodGhpcy5fdmlkZW9NZXRhID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0cmFjayA9IHZpZGVvVHJhY2s7XG4gICAgICAgIGxldCBzYW1wbGVzID0gdHJhY2suc2FtcGxlcztcbiAgICAgICAgbGV0IGR0c0NvcnJlY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBmaXJzdER0cyA9IC0xLCBsYXN0RHRzID0gLTE7XG4gICAgICAgIGxldCBmaXJzdFB0cyA9IC0xLCBsYXN0UHRzID0gLTE7XG5cbiAgICAgICAgaWYgKCFzYW1wbGVzIHx8IHNhbXBsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNhbXBsZXMubGVuZ3RoID09PSAxICYmICFmb3JjZSkge1xuICAgICAgICAgICAgLy8gSWYgW3NhbXBsZSBjb3VudCBpbiBjdXJyZW50IGJhdGNoXSA9PT0gMSAmJiAoZm9yY2UgIT0gdHJ1ZSlcbiAgICAgICAgICAgIC8vIElnbm9yZSBhbmQga2VlcCBpbiBkZW11eGVyJ3MgcXVldWVcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAgLy8gZWxzZSBpZiAoZm9yY2UgPT09IHRydWUpIGRvIHJlbXV4XG5cbiAgICAgICAgbGV0IG9mZnNldCA9IDg7XG4gICAgICAgIGxldCBtZGF0Ym94ID0gbnVsbDtcbiAgICAgICAgbGV0IG1kYXRCeXRlcyA9IDggKyB2aWRlb1RyYWNrLmxlbmd0aDtcblxuXG4gICAgICAgIGxldCBsYXN0U2FtcGxlID0gbnVsbDtcblxuICAgICAgICAvLyBQb3AgdGhlIGxhc3RTYW1wbGUgYW5kIHdhaXRpbmcgZm9yIHN0YXNoXG4gICAgICAgIGlmIChzYW1wbGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGxhc3RTYW1wbGUgPSBzYW1wbGVzLnBvcCgpO1xuICAgICAgICAgICAgbWRhdEJ5dGVzIC09IGxhc3RTYW1wbGUubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5zZXJ0IFtzdGFzaGVkIGxhc3RTYW1wbGUgaW4gdGhlIHByZXZpb3VzIGJhdGNoXSB0byB0aGUgZnJvbnRcbiAgICAgICAgaWYgKHRoaXMuX3ZpZGVvU3Rhc2hlZExhc3RTYW1wbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHNhbXBsZSA9IHRoaXMuX3ZpZGVvU3Rhc2hlZExhc3RTYW1wbGU7XG4gICAgICAgICAgICB0aGlzLl92aWRlb1N0YXNoZWRMYXN0U2FtcGxlID0gbnVsbDtcbiAgICAgICAgICAgIHNhbXBsZXMudW5zaGlmdChzYW1wbGUpO1xuICAgICAgICAgICAgbWRhdEJ5dGVzICs9IHNhbXBsZS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFzaCB0aGUgbGFzdFNhbXBsZSBvZiBjdXJyZW50IGJhdGNoLCB3YWl0aW5nIGZvciBuZXh0IGJhdGNoXG4gICAgICAgIGlmIChsYXN0U2FtcGxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZGVvU3Rhc2hlZExhc3RTYW1wbGUgPSBsYXN0U2FtcGxlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgZmlyc3RTYW1wbGVPcmlnaW5hbER0cyA9IHNhbXBsZXNbMF0uZHRzIC0gdGhpcy5fZHRzQmFzZTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgZHRzQ29ycmVjdGlvblxuICAgICAgICBpZiAodGhpcy5fdmlkZW9OZXh0RHRzKSB7XG4gICAgICAgICAgICBkdHNDb3JyZWN0aW9uID0gZmlyc3RTYW1wbGVPcmlnaW5hbER0cyAtIHRoaXMuX3ZpZGVvTmV4dER0cztcbiAgICAgICAgfSBlbHNlIHsgIC8vIHRoaXMuX3ZpZGVvTmV4dER0cyA9PSB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICh0aGlzLl92aWRlb1NlZ21lbnRJbmZvTGlzdC5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICBkdHNDb3JyZWN0aW9uID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3RTYW1wbGUgPSB0aGlzLl92aWRlb1NlZ21lbnRJbmZvTGlzdC5nZXRMYXN0U2FtcGxlQmVmb3JlKGZpcnN0U2FtcGxlT3JpZ2luYWxEdHMpO1xuICAgICAgICAgICAgICAgIGlmIChsYXN0U2FtcGxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpc3RhbmNlID0gKGZpcnN0U2FtcGxlT3JpZ2luYWxEdHMgLSAobGFzdFNhbXBsZS5vcmlnaW5hbER0cyArIGxhc3RTYW1wbGUuZHVyYXRpb24pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDw9IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgZXhwZWN0ZWREdHMgPSBsYXN0U2FtcGxlLmR0cyArIGxhc3RTYW1wbGUuZHVyYXRpb24gKyBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgZHRzQ29ycmVjdGlvbiA9IGZpcnN0U2FtcGxlT3JpZ2luYWxEdHMgLSBleHBlY3RlZER0cztcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBsYXN0U2FtcGxlID09IG51bGwsIGNhbm5vdCBmb3VuZFxuICAgICAgICAgICAgICAgICAgICBkdHNDb3JyZWN0aW9uID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW5mbyA9IG5ldyBNZWRpYVNlZ21lbnRJbmZvKCk7XG4gICAgICAgIGxldCBtcDRTYW1wbGVzID0gW107XG5cbiAgICAgICAgLy8gQ29ycmVjdCBkdHMgZm9yIGVhY2ggc2FtcGxlLCBhbmQgY2FsY3VsYXRlIHNhbXBsZSBkdXJhdGlvbi4gVGhlbiBvdXRwdXQgdG8gbXA0U2FtcGxlc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNhbXBsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzYW1wbGUgPSBzYW1wbGVzW2ldO1xuICAgICAgICAgICAgbGV0IG9yaWdpbmFsRHRzID0gc2FtcGxlLmR0cyAtIHRoaXMuX2R0c0Jhc2U7XG4gICAgICAgICAgICBsZXQgaXNLZXlmcmFtZSA9IHNhbXBsZS5pc0tleWZyYW1lO1xuICAgICAgICAgICAgbGV0IGR0cyA9IG9yaWdpbmFsRHRzIC0gZHRzQ29ycmVjdGlvbjtcbiAgICAgICAgICAgIGxldCBjdHMgPSBzYW1wbGUuY3RzO1xuICAgICAgICAgICAgbGV0IHB0cyA9IGR0cyArIGN0cztcblxuICAgICAgICAgICAgaWYgKGZpcnN0RHRzID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGZpcnN0RHRzID0gZHRzO1xuICAgICAgICAgICAgICAgIGZpcnN0UHRzID0gcHRzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgc2FtcGxlRHVyYXRpb24gPSAwO1xuXG4gICAgICAgICAgICBpZiAoaSAhPT0gc2FtcGxlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5leHREdHMgPSBzYW1wbGVzW2kgKyAxXS5kdHMgLSB0aGlzLl9kdHNCYXNlIC0gZHRzQ29ycmVjdGlvbjtcbiAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG5leHREdHMgLSBkdHM7XG4gICAgICAgICAgICB9IGVsc2UgeyAgLy8gdGhlIGxhc3Qgc2FtcGxlXG4gICAgICAgICAgICAgICAgaWYgKGxhc3RTYW1wbGUgIT0gbnVsbCkgeyAgLy8gdXNlIHN0YXNoZWQgc2FtcGxlJ3MgZHRzIHRvIGNhbGN1bGF0ZSBzYW1wbGUgZHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHREdHMgPSBsYXN0U2FtcGxlLmR0cyAtIHRoaXMuX2R0c0Jhc2UgLSBkdHNDb3JyZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IG5leHREdHMgLSBkdHM7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtcDRTYW1wbGVzLmxlbmd0aCA+PSAxKSB7ICAvLyB1c2Ugc2Vjb25kIGxhc3Qgc2FtcGxlIGR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uID0gbXA0U2FtcGxlc1ttcDRTYW1wbGVzLmxlbmd0aCAtIDFdLmR1cmF0aW9uO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyB0aGUgb25seSBvbmUgc2FtcGxlLCB1c2UgcmVmZXJlbmNlIHNhbXBsZSBkdXJhdGlvblxuICAgICAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbiA9IE1hdGguZmxvb3IodGhpcy5fdmlkZW9NZXRhLnJlZlNhbXBsZUR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc0tleWZyYW1lKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN5bmNQb2ludCA9IG5ldyBTYW1wbGVJbmZvKGR0cywgcHRzLCBzYW1wbGVEdXJhdGlvbiwgc2FtcGxlLmR0cywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgc3luY1BvaW50LmZpbGVwb3NpdGlvbiA9IHNhbXBsZS5maWxlcG9zaXRpb247XG4gICAgICAgICAgICAgICAgaW5mby5hcHBlbmRTeW5jUG9pbnQoc3luY1BvaW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbXA0U2FtcGxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkdHM6IGR0cyxcbiAgICAgICAgICAgICAgICBwdHM6IHB0cyxcbiAgICAgICAgICAgICAgICBjdHM6IGN0cyxcbiAgICAgICAgICAgICAgICB1bml0czogc2FtcGxlLnVuaXRzLFxuICAgICAgICAgICAgICAgIHNpemU6IHNhbXBsZS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgaXNLZXlmcmFtZTogaXNLZXlmcmFtZSxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogc2FtcGxlRHVyYXRpb24sXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxEdHM6IG9yaWdpbmFsRHRzLFxuICAgICAgICAgICAgICAgIGZsYWdzOiB7XG4gICAgICAgICAgICAgICAgICAgIGlzTGVhZGluZzogMCxcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kc09uOiBpc0tleWZyYW1lID8gMiA6IDEsXG4gICAgICAgICAgICAgICAgICAgIGlzRGVwZW5kZWRPbjogaXNLZXlmcmFtZSA/IDEgOiAwLFxuICAgICAgICAgICAgICAgICAgICBoYXNSZWR1bmRhbmN5OiAwLFxuICAgICAgICAgICAgICAgICAgICBpc05vblN5bmM6IGlzS2V5ZnJhbWUgPyAwIDogMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWxsb2NhdGUgbWRhdGJveFxuICAgICAgICBtZGF0Ym94ID0gbmV3IFVpbnQ4QXJyYXkobWRhdEJ5dGVzKTtcbiAgICAgICAgbWRhdGJveFswXSA9IChtZGF0Qnl0ZXMgPj4+IDI0KSAmIDB4RkY7XG4gICAgICAgIG1kYXRib3hbMV0gPSAobWRhdEJ5dGVzID4+PiAxNikgJiAweEZGO1xuICAgICAgICBtZGF0Ym94WzJdID0gKG1kYXRCeXRlcyA+Pj4gIDgpICYgMHhGRjtcbiAgICAgICAgbWRhdGJveFszXSA9IChtZGF0Qnl0ZXMpICYgMHhGRjtcbiAgICAgICAgbWRhdGJveC5zZXQoTVA0LnR5cGVzLm1kYXQsIDQpO1xuXG4gICAgICAgIC8vIFdyaXRlIHNhbXBsZXMgaW50byBtZGF0Ym94XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXA0U2FtcGxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHVuaXRzID0gbXA0U2FtcGxlc1tpXS51bml0cztcbiAgICAgICAgICAgIHdoaWxlICh1bml0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgdW5pdCA9IHVuaXRzLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB1bml0LmRhdGE7XG4gICAgICAgICAgICAgICAgbWRhdGJveC5zZXQoZGF0YSwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBvZmZzZXQgKz0gZGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxhdGVzdCA9IG1wNFNhbXBsZXNbbXA0U2FtcGxlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgbGFzdER0cyA9IGxhdGVzdC5kdHMgKyBsYXRlc3QuZHVyYXRpb247XG4gICAgICAgIGxhc3RQdHMgPSBsYXRlc3QucHRzICsgbGF0ZXN0LmR1cmF0aW9uO1xuICAgICAgICB0aGlzLl92aWRlb05leHREdHMgPSBsYXN0RHRzO1xuXG4gICAgICAgIC8vIGZpbGwgbWVkaWEgc2VnbWVudCBpbmZvICYgYWRkIHRvIGluZm8gbGlzdFxuICAgICAgICBpbmZvLmJlZ2luRHRzID0gZmlyc3REdHM7XG4gICAgICAgIGluZm8uZW5kRHRzID0gbGFzdER0cztcbiAgICAgICAgaW5mby5iZWdpblB0cyA9IGZpcnN0UHRzO1xuICAgICAgICBpbmZvLmVuZFB0cyA9IGxhc3RQdHM7XG4gICAgICAgIGluZm8ub3JpZ2luYWxCZWdpbkR0cyA9IG1wNFNhbXBsZXNbMF0ub3JpZ2luYWxEdHM7XG4gICAgICAgIGluZm8ub3JpZ2luYWxFbmREdHMgPSBsYXRlc3Qub3JpZ2luYWxEdHMgKyBsYXRlc3QuZHVyYXRpb247XG4gICAgICAgIGluZm8uZmlyc3RTYW1wbGUgPSBuZXcgU2FtcGxlSW5mbyhtcDRTYW1wbGVzWzBdLmR0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wNFNhbXBsZXNbMF0ucHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXA0U2FtcGxlc1swXS5kdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wNFNhbXBsZXNbMF0ub3JpZ2luYWxEdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDRTYW1wbGVzWzBdLmlzS2V5ZnJhbWUpO1xuICAgICAgICBpbmZvLmxhc3RTYW1wbGUgPSBuZXcgU2FtcGxlSW5mbyhsYXRlc3QuZHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3QucHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3QuZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdC5vcmlnaW5hbER0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0LmlzS2V5ZnJhbWUpO1xuICAgICAgICBpZiAoIXRoaXMuX2lzTGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5fdmlkZW9TZWdtZW50SW5mb0xpc3QuYXBwZW5kKGluZm8pO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhY2suc2FtcGxlcyA9IG1wNFNhbXBsZXM7XG4gICAgICAgIHRyYWNrLnNlcXVlbmNlTnVtYmVyKys7XG5cbiAgICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgY2hyb21lIDwgNTA6IGZvcmNlIGZpcnN0IHNhbXBsZSBhcyBhIHJhbmRvbSBhY2Nlc3MgcG9pbnRcbiAgICAgICAgLy8gc2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTIyOTQxMlxuICAgICAgICBpZiAodGhpcy5fZm9yY2VGaXJzdElEUikge1xuICAgICAgICAgICAgbGV0IGZsYWdzID0gbXA0U2FtcGxlc1swXS5mbGFncztcbiAgICAgICAgICAgIGZsYWdzLmRlcGVuZHNPbiA9IDI7XG4gICAgICAgICAgICBmbGFncy5pc05vblN5bmMgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1vb2Zib3ggPSBNUDQubW9vZih0cmFjaywgZmlyc3REdHMpO1xuICAgICAgICB0cmFjay5zYW1wbGVzID0gW107XG4gICAgICAgIHRyYWNrLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgdGhpcy5fb25NZWRpYVNlZ21lbnQoJ3ZpZGVvJywge1xuICAgICAgICAgICAgdHlwZTogJ3ZpZGVvJyxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuX21lcmdlQm94ZXMobW9vZmJveCwgbWRhdGJveCkuYnVmZmVyLFxuICAgICAgICAgICAgc2FtcGxlQ291bnQ6IG1wNFNhbXBsZXMubGVuZ3RoLFxuICAgICAgICAgICAgaW5mbzogaW5mb1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfbWVyZ2VCb3hlcyhtb29mLCBtZGF0KSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVWludDhBcnJheShtb29mLmJ5dGVMZW5ndGggKyBtZGF0LmJ5dGVMZW5ndGgpO1xuICAgICAgICByZXN1bHQuc2V0KG1vb2YsIDApO1xuICAgICAgICByZXN1bHQuc2V0KG1kYXQsIG1vb2YuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1QNFJlbXV4ZXI7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmxldCBCcm93c2VyID0ge307XG5cbmZ1bmN0aW9uIGRldGVjdCgpIHtcbiAgICAvLyBtb2RpZmllZCBmcm9tIGpxdWVyeS1icm93c2VyLXBsdWdpblxuXG4gICAgbGV0IHVhID0gc2VsZi5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG5cbiAgICBsZXQgbWF0Y2ggPSAvKGVkZ2UpXFwvKFtcXHcuXSspLy5leGVjKHVhKSB8fFxuICAgICAgICAvKG9wcilbXFwvXShbXFx3Ll0rKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgLyhjaHJvbWUpWyBcXC9dKFtcXHcuXSspLy5leGVjKHVhKSB8fFxuICAgICAgICAvKGllbW9iaWxlKVtcXC9dKFtcXHcuXSspLy5leGVjKHVhKSB8fFxuICAgICAgICAvKHZlcnNpb24pKGFwcGxld2Via2l0KVsgXFwvXShbXFx3Ll0rKS4qKHNhZmFyaSlbIFxcL10oW1xcdy5dKykvLmV4ZWModWEpIHx8XG4gICAgICAgIC8od2Via2l0KVsgXFwvXShbXFx3Ll0rKS4qKHZlcnNpb24pWyBcXC9dKFtcXHcuXSspLiooc2FmYXJpKVsgXFwvXShbXFx3Ll0rKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgLyh3ZWJraXQpWyBcXC9dKFtcXHcuXSspLy5leGVjKHVhKSB8fFxuICAgICAgICAvKG9wZXJhKSg/Oi4qdmVyc2lvbnwpWyBcXC9dKFtcXHcuXSspLy5leGVjKHVhKSB8fFxuICAgICAgICAvKG1zaWUpIChbXFx3Ll0rKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgdWEuaW5kZXhPZigndHJpZGVudCcpID49IDAgJiYgLyhydikoPzo6fCApKFtcXHcuXSspLy5leGVjKHVhKSB8fFxuICAgICAgICB1YS5pbmRleE9mKCdjb21wYXRpYmxlJykgPCAwICYmIC8oZmlyZWZveClbIFxcL10oW1xcdy5dKykvLmV4ZWModWEpIHx8XG4gICAgICAgIFtdO1xuXG4gICAgbGV0IHBsYXRmb3JtX21hdGNoID0gLyhpcGFkKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgLyhpcG9kKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgLyh3aW5kb3dzIHBob25lKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgLyhpcGhvbmUpLy5leGVjKHVhKSB8fFxuICAgICAgICAvKGtpbmRsZSkvLmV4ZWModWEpIHx8XG4gICAgICAgIC8oYW5kcm9pZCkvLmV4ZWModWEpIHx8XG4gICAgICAgIC8od2luZG93cykvLmV4ZWModWEpIHx8XG4gICAgICAgIC8obWFjKS8uZXhlYyh1YSkgfHxcbiAgICAgICAgLyhsaW51eCkvLmV4ZWModWEpIHx8XG4gICAgICAgIC8oY3JvcykvLmV4ZWModWEpIHx8XG4gICAgICAgIFtdO1xuXG4gICAgbGV0IG1hdGNoZWQgPSB7XG4gICAgICAgIGJyb3dzZXI6IG1hdGNoWzVdIHx8IG1hdGNoWzNdIHx8IG1hdGNoWzFdIHx8ICcnLFxuICAgICAgICB2ZXJzaW9uOiBtYXRjaFsyXSB8fCBtYXRjaFs0XSB8fCAnMCcsXG4gICAgICAgIG1ham9yVmVyc2lvbjogbWF0Y2hbNF0gfHwgbWF0Y2hbMl0gfHwgJzAnLFxuICAgICAgICBwbGF0Zm9ybTogcGxhdGZvcm1fbWF0Y2hbMF0gfHwgJydcbiAgICB9O1xuXG4gICAgbGV0IGJyb3dzZXIgPSB7fTtcbiAgICBpZiAobWF0Y2hlZC5icm93c2VyKSB7XG4gICAgICAgIGJyb3dzZXJbbWF0Y2hlZC5icm93c2VyXSA9IHRydWU7XG5cbiAgICAgICAgbGV0IHZlcnNpb25BcnJheSA9IG1hdGNoZWQubWFqb3JWZXJzaW9uLnNwbGl0KCcuJyk7XG4gICAgICAgIGJyb3dzZXIudmVyc2lvbiA9IHtcbiAgICAgICAgICAgIG1ham9yOiBwYXJzZUludChtYXRjaGVkLm1ham9yVmVyc2lvbiwgMTApLFxuICAgICAgICAgICAgc3RyaW5nOiBtYXRjaGVkLnZlcnNpb25cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHZlcnNpb25BcnJheS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBicm93c2VyLnZlcnNpb24ubWlub3IgPSBwYXJzZUludCh2ZXJzaW9uQXJyYXlbMV0sIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmVyc2lvbkFycmF5Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIGJyb3dzZXIudmVyc2lvbi5idWlsZCA9IHBhcnNlSW50KHZlcnNpb25BcnJheVsyXSwgMTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoZWQucGxhdGZvcm0pIHtcbiAgICAgICAgYnJvd3NlclttYXRjaGVkLnBsYXRmb3JtXSA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGJyb3dzZXIuY2hyb21lIHx8IGJyb3dzZXIub3ByIHx8IGJyb3dzZXIuc2FmYXJpKSB7XG4gICAgICAgIGJyb3dzZXIud2Via2l0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBNU0lFLiBJRTExIGhhcyAncnYnIGlkZW50aWZlclxuICAgIGlmIChicm93c2VyLnJ2IHx8IGJyb3dzZXIuaWVtb2JpbGUpIHtcbiAgICAgICAgaWYgKGJyb3dzZXIucnYpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBicm93c2VyLnJ2O1xuICAgICAgICB9XG4gICAgICAgIGxldCBtc2llID0gJ21zaWUnO1xuICAgICAgICBtYXRjaGVkLmJyb3dzZXIgPSBtc2llO1xuICAgICAgICBicm93c2VyW21zaWVdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBNaWNyb3NvZnQgRWRnZVxuICAgIGlmIChicm93c2VyLmVkZ2UpIHtcbiAgICAgICAgZGVsZXRlIGJyb3dzZXIuZWRnZTtcbiAgICAgICAgbGV0IG1zZWRnZSA9ICdtc2VkZ2UnO1xuICAgICAgICBtYXRjaGVkLmJyb3dzZXIgPSBtc2VkZ2U7XG4gICAgICAgIGJyb3dzZXJbbXNlZGdlXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gT3BlcmEgMTUrXG4gICAgaWYgKGJyb3dzZXIub3ByKSB7XG4gICAgICAgIGxldCBvcGVyYSA9ICdvcGVyYSc7XG4gICAgICAgIG1hdGNoZWQuYnJvd3NlciA9IG9wZXJhO1xuICAgICAgICBicm93c2VyW29wZXJhXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gU3RvY2sgYW5kcm9pZCBicm93c2VycyBhcmUgbWFya2VkIGFzIFNhZmFyaVxuICAgIGlmIChicm93c2VyLnNhZmFyaSAmJiBicm93c2VyLmFuZHJvaWQpIHtcbiAgICAgICAgbGV0IGFuZHJvaWQgPSAnYW5kcm9pZCc7XG4gICAgICAgIG1hdGNoZWQuYnJvd3NlciA9IGFuZHJvaWQ7XG4gICAgICAgIGJyb3dzZXJbYW5kcm9pZF0gPSB0cnVlO1xuICAgIH1cblxuICAgIGJyb3dzZXIubmFtZSA9IG1hdGNoZWQuYnJvd3NlcjtcbiAgICBicm93c2VyLnBsYXRmb3JtID0gbWF0Y2hlZC5wbGF0Zm9ybTtcblxuICAgIGZvciAobGV0IGtleSBpbiBCcm93c2VyKSB7XG4gICAgICAgIGlmIChCcm93c2VyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBCcm93c2VyW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbihCcm93c2VyLCBicm93c2VyKTtcbn1cblxuZGV0ZWN0KCk7XG5cbmV4cG9ydCBkZWZhdWx0IEJyb3dzZXI7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmV4cG9ydCBjbGFzcyBSdW50aW1lRXhjZXB0aW9uIHtcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiAnUnVudGltZUV4Y2VwdGlvbic7XG4gICAgfVxuXG4gICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlO1xuICAgIH1cblxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgJzogJyArIHRoaXMubWVzc2FnZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24ge1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBnZXQgbmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICdJbGxlZ2FsU3RhdGVFeGNlcHRpb24nO1xuICAgIH1cblxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7XG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGdldCBuYW1lKCkge1xuICAgICAgICByZXR1cm4gJ0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbic7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24ge1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBnZXQgbmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICdOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbic7XG4gICAgfVxuXG59XG4iLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnO1xuXG5jbGFzcyBMb2cge1xuXG4gICAgc3RhdGljIGUodGFnLCBtc2cpIHtcbiAgICAgICAgaWYgKCF0YWcgfHwgTG9nLkZPUkNFX0dMT0JBTF9UQUcpXG4gICAgICAgICAgICB0YWcgPSBMb2cuR0xPQkFMX1RBRztcblxuICAgICAgICBsZXQgc3RyID0gYFske3RhZ31dID4gJHttc2d9YDtcblxuICAgICAgICBpZiAoTG9nLkVOQUJMRV9DQUxMQkFDSykge1xuICAgICAgICAgICAgTG9nLmVtaXR0ZXIuZW1pdCgnbG9nJywgJ2Vycm9yJywgc3RyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghTG9nLkVOQUJMRV9FUlJPUikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Ioc3RyKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zb2xlLndhcm4pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihzdHIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coc3RyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBpKHRhZywgbXNnKSB7XG4gICAgICAgIGlmICghdGFnIHx8IExvZy5GT1JDRV9HTE9CQUxfVEFHKVxuICAgICAgICAgICAgdGFnID0gTG9nLkdMT0JBTF9UQUc7XG5cbiAgICAgICAgbGV0IHN0ciA9IGBbJHt0YWd9XSA+ICR7bXNnfWA7XG5cbiAgICAgICAgaWYgKExvZy5FTkFCTEVfQ0FMTEJBQ0spIHtcbiAgICAgICAgICAgIExvZy5lbWl0dGVyLmVtaXQoJ2xvZycsICdpbmZvJywgc3RyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghTG9nLkVOQUJMRV9JTkZPKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uc29sZS5pbmZvKSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oc3RyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHN0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgdyh0YWcsIG1zZykge1xuICAgICAgICBpZiAoIXRhZyB8fCBMb2cuRk9SQ0VfR0xPQkFMX1RBRylcbiAgICAgICAgICAgIHRhZyA9IExvZy5HTE9CQUxfVEFHO1xuXG4gICAgICAgIGxldCBzdHIgPSBgWyR7dGFnfV0gPiAke21zZ31gO1xuXG4gICAgICAgIGlmIChMb2cuRU5BQkxFX0NBTExCQUNLKSB7XG4gICAgICAgICAgICBMb2cuZW1pdHRlci5lbWl0KCdsb2cnLCAnd2FybicsIHN0cik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUxvZy5FTkFCTEVfV0FSTikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKHN0cik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhzdHIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGQodGFnLCBtc2cpIHtcbiAgICAgICAgaWYgKCF0YWcgfHwgTG9nLkZPUkNFX0dMT0JBTF9UQUcpXG4gICAgICAgICAgICB0YWcgPSBMb2cuR0xPQkFMX1RBRztcblxuICAgICAgICBsZXQgc3RyID0gYFske3RhZ31dID4gJHttc2d9YDtcblxuICAgICAgICBpZiAoTG9nLkVOQUJMRV9DQUxMQkFDSykge1xuICAgICAgICAgICAgTG9nLmVtaXR0ZXIuZW1pdCgnbG9nJywgJ2RlYnVnJywgc3RyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghTG9nLkVOQUJMRV9ERUJVRykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoc3RyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHN0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgdih0YWcsIG1zZykge1xuICAgICAgICBpZiAoIXRhZyB8fCBMb2cuRk9SQ0VfR0xPQkFMX1RBRylcbiAgICAgICAgICAgIHRhZyA9IExvZy5HTE9CQUxfVEFHO1xuXG4gICAgICAgIGxldCBzdHIgPSBgWyR7dGFnfV0gPiAke21zZ31gO1xuXG4gICAgICAgIGlmIChMb2cuRU5BQkxFX0NBTExCQUNLKSB7XG4gICAgICAgICAgICBMb2cuZW1pdHRlci5lbWl0KCdsb2cnLCAndmVyYm9zZScsIHN0cik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUxvZy5FTkFCTEVfVkVSQk9TRSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coc3RyKTtcbiAgICB9XG5cbn1cblxuTG9nLkdMT0JBTF9UQUcgPSAnZmx2LmpzJztcbkxvZy5GT1JDRV9HTE9CQUxfVEFHID0gZmFsc2U7XG5Mb2cuRU5BQkxFX0VSUk9SID0gdHJ1ZTtcbkxvZy5FTkFCTEVfSU5GTyA9IHRydWU7XG5Mb2cuRU5BQkxFX1dBUk4gPSB0cnVlO1xuTG9nLkVOQUJMRV9ERUJVRyA9IHRydWU7XG5Mb2cuRU5BQkxFX1ZFUkJPU0UgPSB0cnVlO1xuXG5Mb2cuRU5BQkxFX0NBTExCQUNLID0gZmFsc2U7XG5cbkxvZy5lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5leHBvcnQgZGVmYXVsdCBMb2c7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJztcbmltcG9ydCBMb2cgZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5jbGFzcyBMb2dnaW5nQ29udHJvbCB7XG5cbiAgICBzdGF0aWMgZ2V0IGZvcmNlR2xvYmFsVGFnKCkge1xuICAgICAgICByZXR1cm4gTG9nLkZPUkNFX0dMT0JBTF9UQUc7XG4gICAgfVxuXG4gICAgc3RhdGljIHNldCBmb3JjZUdsb2JhbFRhZyhlbmFibGUpIHtcbiAgICAgICAgTG9nLkZPUkNFX0dMT0JBTF9UQUcgPSBlbmFibGU7XG4gICAgICAgIExvZ2dpbmdDb250cm9sLl9ub3RpZnlDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IGdsb2JhbFRhZygpIHtcbiAgICAgICAgcmV0dXJuIExvZy5HTE9CQUxfVEFHO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXQgZ2xvYmFsVGFnKHRhZykge1xuICAgICAgICBMb2cuR0xPQkFMX1RBRyA9IHRhZztcbiAgICAgICAgTG9nZ2luZ0NvbnRyb2wuX25vdGlmeUNoYW5nZSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgZW5hYmxlQWxsKCkge1xuICAgICAgICByZXR1cm4gTG9nLkVOQUJMRV9WRVJCT1NFXG4gICAgICAgICAgICAmJiBMb2cuRU5BQkxFX0RFQlVHXG4gICAgICAgICAgICAmJiBMb2cuRU5BQkxFX0lORk9cbiAgICAgICAgICAgICYmIExvZy5FTkFCTEVfV0FSTlxuICAgICAgICAgICAgJiYgTG9nLkVOQUJMRV9FUlJPUjtcbiAgICB9XG5cbiAgICBzdGF0aWMgc2V0IGVuYWJsZUFsbChlbmFibGUpIHtcbiAgICAgICAgTG9nLkVOQUJMRV9WRVJCT1NFID0gZW5hYmxlO1xuICAgICAgICBMb2cuRU5BQkxFX0RFQlVHID0gZW5hYmxlO1xuICAgICAgICBMb2cuRU5BQkxFX0lORk8gPSBlbmFibGU7XG4gICAgICAgIExvZy5FTkFCTEVfV0FSTiA9IGVuYWJsZTtcbiAgICAgICAgTG9nLkVOQUJMRV9FUlJPUiA9IGVuYWJsZTtcbiAgICAgICAgTG9nZ2luZ0NvbnRyb2wuX25vdGlmeUNoYW5nZSgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgZW5hYmxlRGVidWcoKSB7XG4gICAgICAgIHJldHVybiBMb2cuRU5BQkxFX0RFQlVHO1xuICAgIH1cblxuICAgIHN0YXRpYyBzZXQgZW5hYmxlRGVidWcoZW5hYmxlKSB7XG4gICAgICAgIExvZy5FTkFCTEVfREVCVUcgPSBlbmFibGU7XG4gICAgICAgIExvZ2dpbmdDb250cm9sLl9ub3RpZnlDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IGVuYWJsZVZlcmJvc2UoKSB7XG4gICAgICAgIHJldHVybiBMb2cuRU5BQkxFX1ZFUkJPU0U7XG4gICAgfVxuXG4gICAgc3RhdGljIHNldCBlbmFibGVWZXJib3NlKGVuYWJsZSkge1xuICAgICAgICBMb2cuRU5BQkxFX1ZFUkJPU0UgPSBlbmFibGU7XG4gICAgICAgIExvZ2dpbmdDb250cm9sLl9ub3RpZnlDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IGVuYWJsZUluZm8oKSB7XG4gICAgICAgIHJldHVybiBMb2cuRU5BQkxFX0lORk87XG4gICAgfVxuXG4gICAgc3RhdGljIHNldCBlbmFibGVJbmZvKGVuYWJsZSkge1xuICAgICAgICBMb2cuRU5BQkxFX0lORk8gPSBlbmFibGU7XG4gICAgICAgIExvZ2dpbmdDb250cm9sLl9ub3RpZnlDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IGVuYWJsZVdhcm4oKSB7XG4gICAgICAgIHJldHVybiBMb2cuRU5BQkxFX1dBUk47XG4gICAgfVxuXG4gICAgc3RhdGljIHNldCBlbmFibGVXYXJuKGVuYWJsZSkge1xuICAgICAgICBMb2cuRU5BQkxFX1dBUk4gPSBlbmFibGU7XG4gICAgICAgIExvZ2dpbmdDb250cm9sLl9ub3RpZnlDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IGVuYWJsZUVycm9yKCkge1xuICAgICAgICByZXR1cm4gTG9nLkVOQUJMRV9FUlJPUjtcbiAgICB9XG5cbiAgICBzdGF0aWMgc2V0IGVuYWJsZUVycm9yKGVuYWJsZSkge1xuICAgICAgICBMb2cuRU5BQkxFX0VSUk9SID0gZW5hYmxlO1xuICAgICAgICBMb2dnaW5nQ29udHJvbC5fbm90aWZ5Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldENvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGdsb2JhbFRhZzogTG9nLkdMT0JBTF9UQUcsXG4gICAgICAgICAgICBmb3JjZUdsb2JhbFRhZzogTG9nLkZPUkNFX0dMT0JBTF9UQUcsXG4gICAgICAgICAgICBlbmFibGVWZXJib3NlOiBMb2cuRU5BQkxFX1ZFUkJPU0UsXG4gICAgICAgICAgICBlbmFibGVEZWJ1ZzogTG9nLkVOQUJMRV9ERUJVRyxcbiAgICAgICAgICAgIGVuYWJsZUluZm86IExvZy5FTkFCTEVfSU5GTyxcbiAgICAgICAgICAgIGVuYWJsZVdhcm46IExvZy5FTkFCTEVfV0FSTixcbiAgICAgICAgICAgIGVuYWJsZUVycm9yOiBMb2cuRU5BQkxFX0VSUk9SLFxuICAgICAgICAgICAgZW5hYmxlQ2FsbGJhY2s6IExvZy5FTkFCTEVfQ0FMTEJBQ0tcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXBwbHlDb25maWcoY29uZmlnKSB7XG4gICAgICAgIExvZy5HTE9CQUxfVEFHID0gY29uZmlnLmdsb2JhbFRhZztcbiAgICAgICAgTG9nLkZPUkNFX0dMT0JBTF9UQUcgPSBjb25maWcuZm9yY2VHbG9iYWxUYWc7XG4gICAgICAgIExvZy5FTkFCTEVfVkVSQk9TRSA9IGNvbmZpZy5lbmFibGVWZXJib3NlO1xuICAgICAgICBMb2cuRU5BQkxFX0RFQlVHID0gY29uZmlnLmVuYWJsZURlYnVnO1xuICAgICAgICBMb2cuRU5BQkxFX0lORk8gPSBjb25maWcuZW5hYmxlSW5mbztcbiAgICAgICAgTG9nLkVOQUJMRV9XQVJOID0gY29uZmlnLmVuYWJsZVdhcm47XG4gICAgICAgIExvZy5FTkFCTEVfRVJST1IgPSBjb25maWcuZW5hYmxlRXJyb3I7XG4gICAgICAgIExvZy5FTkFCTEVfQ0FMTEJBQ0sgPSBjb25maWcuZW5hYmxlQ2FsbGJhY2s7XG4gICAgfVxuXG4gICAgc3RhdGljIF9ub3RpZnlDaGFuZ2UoKSB7XG4gICAgICAgIGxldCBlbWl0dGVyID0gTG9nZ2luZ0NvbnRyb2wuZW1pdHRlcjtcblxuICAgICAgICBpZiAoZW1pdHRlci5saXN0ZW5lckNvdW50KCdjaGFuZ2UnKSA+IDApIHtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSBMb2dnaW5nQ29udHJvbC5nZXRDb25maWcoKTtcbiAgICAgICAgICAgIGVtaXR0ZXIuZW1pdCgnY2hhbmdlJywgY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyByZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgICAgIExvZ2dpbmdDb250cm9sLmVtaXR0ZXIuYWRkTGlzdGVuZXIoJ2NoYW5nZScsIGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgICAgICAgTG9nZ2luZ0NvbnRyb2wuZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignY2hhbmdlJywgbGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBhZGRMb2dMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgICAgICBMb2cuZW1pdHRlci5hZGRMaXN0ZW5lcignbG9nJywgbGlzdGVuZXIpO1xuICAgICAgICBpZiAoTG9nLmVtaXR0ZXIubGlzdGVuZXJDb3VudCgnbG9nJykgPiAwKSB7XG4gICAgICAgICAgICBMb2cuRU5BQkxFX0NBTExCQUNLID0gdHJ1ZTtcbiAgICAgICAgICAgIExvZ2dpbmdDb250cm9sLl9ub3RpZnlDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyByZW1vdmVMb2dMaXN0ZW5lcihsaXN0ZW5lcikge1xuICAgICAgICBMb2cuZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignbG9nJywgbGlzdGVuZXIpO1xuICAgICAgICBpZiAoTG9nLmVtaXR0ZXIubGlzdGVuZXJDb3VudCgnbG9nJykgPT09IDApIHtcbiAgICAgICAgICAgIExvZy5FTkFCTEVfQ0FMTEJBQ0sgPSBmYWxzZTtcbiAgICAgICAgICAgIExvZ2dpbmdDb250cm9sLl9ub3RpZnlDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5Mb2dnaW5nQ29udHJvbC5lbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5leHBvcnQgZGVmYXVsdCBMb2dnaW5nQ29udHJvbDsiLCIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE2IEJpbGliaWxpLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBhdXRob3IgemhlbmcgcWlhbiA8eHFxQHhxcS5pbT5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY2xhc3MgUG9seWZpbGwge1xuXG4gICAgc3RhdGljIGluc3RhbGwoKSB7XG4gICAgICAgIC8vIEVTNiBPYmplY3Quc2V0UHJvdG90eXBlT2ZcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChvYmosIHByb3RvKSB7XG4gICAgICAgICAgICBvYmouX19wcm90b19fID0gcHJvdG87XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEVTNiBPYmplY3QuYXNzaWduXG4gICAgICAgIE9iamVjdC5hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IG91dHB1dCA9IE9iamVjdCh0YXJnZXQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRVM2IFByb21pc2UgKG1pc3Npbmcgc3VwcG9ydCBpbiBJRTExKVxuICAgICAgICBpZiAodHlwZW9mIHNlbGYuUHJvbWlzZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmVxdWlyZSgnZXM2LXByb21pc2UnKS5wb2x5ZmlsbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cblBvbHlmaWxsLmluc3RhbGwoKTtcblxuZXhwb3J0IGRlZmF1bHQgUG9seWZpbGw7IiwiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNiBCaWxpYmlsaS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIEMrKyBwcm9qZWN0IGxpYldpblRGOCAoaHR0cHM6Ly9naXRodWIuY29tL20xMzI1My9saWJXaW5URjgpXG4gKiBAYXV0aG9yIHpoZW5nIHFpYW4gPHhxcUB4cXEuaW0+XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmZ1bmN0aW9uIGNoZWNrQ29udGludWF0aW9uKHVpbnQ4YXJyYXksIHN0YXJ0LCBjaGVja0xlbmd0aCkge1xuICAgIGxldCBhcnJheSA9IHVpbnQ4YXJyYXk7XG4gICAgaWYgKHN0YXJ0ICsgY2hlY2tMZW5ndGggPCBhcnJheS5sZW5ndGgpIHtcbiAgICAgICAgd2hpbGUgKGNoZWNrTGVuZ3RoLS0pIHtcbiAgICAgICAgICAgIGlmICgoYXJyYXlbKytzdGFydF0gJiAweEMwKSAhPT0gMHg4MClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZGVjb2RlVVRGOCh1aW50OGFycmF5KSB7XG4gICAgbGV0IG91dCA9IFtdO1xuICAgIGxldCBpbnB1dCA9IHVpbnQ4YXJyYXk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBsZW5ndGggPSB1aW50OGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgIGlmIChpbnB1dFtpXSA8IDB4ODApIHtcbiAgICAgICAgICAgIG91dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoaW5wdXRbaV0pKTtcbiAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGlucHV0W2ldIDwgMHhDMCkge1xuICAgICAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dFtpXSA8IDB4RTApIHtcbiAgICAgICAgICAgIGlmIChjaGVja0NvbnRpbnVhdGlvbihpbnB1dCwgaSwgMSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdWNzNCA9IChpbnB1dFtpXSAmIDB4MUYpIDw8IDYgfCAoaW5wdXRbaSArIDFdICYgMHgzRik7XG4gICAgICAgICAgICAgICAgaWYgKHVjczQgPj0gMHg4MCkge1xuICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKHVjczQgJiAweEZGRkYpKTtcbiAgICAgICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaW5wdXRbaV0gPCAweEYwKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2tDb250aW51YXRpb24oaW5wdXQsIGksIDIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHVjczQgPSAoaW5wdXRbaV0gJiAweEYpIDw8IDEyIHwgKGlucHV0W2kgKyAxXSAmIDB4M0YpIDw8IDYgfCBpbnB1dFtpICsgMl0gJiAweDNGO1xuICAgICAgICAgICAgICAgIGlmICh1Y3M0ID49IDB4ODAwICYmICh1Y3M0ICYgMHhGODAwKSAhPT0gMHhEODAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUodWNzNCAmIDB4RkZGRikpO1xuICAgICAgICAgICAgICAgICAgICBpICs9IDM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpbnB1dFtpXSA8IDB4RjgpIHtcbiAgICAgICAgICAgIGlmIChjaGVja0NvbnRpbnVhdGlvbihpbnB1dCwgaSwgMykpIHtcbiAgICAgICAgICAgICAgICBsZXQgdWNzNCA9IChpbnB1dFtpXSAmIDB4NykgPDwgMTggfCAoaW5wdXRbaSArIDFdICYgMHgzRikgPDwgMTJcbiAgICAgICAgICAgICAgICAgICAgICAgICB8IChpbnB1dFtpICsgMl0gJiAweDNGKSA8PCA2IHwgKGlucHV0W2kgKyAzXSAmIDB4M0YpO1xuICAgICAgICAgICAgICAgIGlmICh1Y3M0ID4gMHgxMDAwMCAmJiB1Y3M0IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgdWNzNCAtPSAweDEwMDAwO1xuICAgICAgICAgICAgICAgICAgICBvdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKCh1Y3M0ID4+PiAxMCkgfCAweEQ4MDApKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZSgodWNzNCAmIDB4M0ZGKSB8IDB4REMwMCkpO1xuICAgICAgICAgICAgICAgICAgICBpICs9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvdXQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkZGRCkpO1xuICAgICAgICArK2k7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dC5qb2luKCcnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGVjb2RlVVRGODsiXX0="}