2 <header><title>BioJS viewer</title></header>
6 <!-- include MSA js + css -->
7 <!-- <script src="https://s3-eu-west-1.amazonaws.com/biojs/msa/latest/msa.js"></script> -->
8 <!-- <link type=text/css rel=stylesheet href=https://s3-eu-west-1.amazonaws.com/biojs/msa/latest/msa.css /> -->
10 <img src="http://www.jalview.org/help/html/Jalview_Logo.png" alt="Jalview Logo" title="This html page was generated from Jalview, to import the data back to Jalview, please drag the generated html file and drop it unto the Jalview workbench.
12 Alternatively, you could copy the url from the address bar and use Jalview's url importer (main menu-> File-> Input Alignment-> from URL) to import back the alignment jalview." >
17 <input type="button" name="divToggleButton" id="divToggleButton" onclick="javascipt:toggleMenuVisibility();" value="Show Menu"></input>
18 <button onclick="javascipt:openJalviewUsingCurrentUrl();">Launch in Jalview</button>
23 <div id="yourDiv">press "Run with JS"</div>
24 <input type='hidden' id='seqData' name='seqData' value='{"globalColorScheme":"zappo","seqs":[{"id":"1","start":1,"name":"FER_CAPAA/1-97","seq":"----------------------------------------------------------ASYKVKLITPDGPIEFDCPDDVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDDDQLEEGWVLTCVAYPQSDVTIETHKEAELVG-","features":[],"end":97},{"id":"2","start":1,"name":"FER_CAPAN/1-144","seq":"------MASVSATMISTSFMPRKPAVTSLKPIP-NVG-EALFGLKS---ANGGKVTCMASYKVKLITPDGPIEFDCPDNVYILDQAEEAGHDLPYSCRAGSCSSCAGKIAGGAVDQTDGNFLDDDQLEEGWVLTCVAYPQSDVTIETHKEAELVG-","features":[{"text":"feature_1","xEnd":46,"fillColor":"#8c25cd","xStart":16}],"end":144},{"id":"3","start":1,"name":"FER1_SOLLC/1-144","seq":"------MASISGTMISTSFLPRKPAVTSLKAIS-NVG-EALFGLKS---GRNGRITCMASYKVKLITPEGPIEFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGSVDQSDGNFLDEDQEAAGFVLTCVAYPKGDVTIETHKEEELTA-","features":[],"end":144},{"id":"4","start":1,"name":"Q93XJ9_SOLTU/1-144","seq":"------MASISGTMISTSFLPRKPVVTSLKAIS-NVG-EALFGLKS---GRNGRITCMASYKVKLITPDGPIEFECPDDVYILDQAEEEGHDLPYSCRAGSCSSCAGKVTAGTVDQSDGKFLDDDQEAAGFVLTCVAYPKCDVTIETHKEEELTA-","features":[],"end":144},{"id":"5","start":1,"name":"FER1_PEA/1-149","seq":"---MATTPALYGTAVSTSFLRTQPMPMSVTTTKAFSN--GFLGLKT-SLKRGDLAVAMASYKVKLVTPDGTQEFECPSDVYILDHAEEVGIDLPYSCRAGSCSSCAGKVVGGEVDQSDGSFLDDEQIEAGFVLTCVAYPTSDVVIETHKEEDLTA-","features":[],"end":149},{"id":"6","start":1,"name":"Q7XA98_TRIPR/1-152","seq":"---MATTPALYGTAVSTSFMRRQPVPMSVATTTTTKAFPSGFGLKSVSTKRGDLAVAMATYKVKLITPEGPQEFDCPDDVYILDHAEEVGIELPYSCRAGSCSSCAGKVVNGNVNQEDGSFLDDEQIEGGWVLTCVAFPTSDVTIETHKEEELTA-","features":[{"text":"feature_2","xEnd":24,"fillColor":"#0000cc","xStart":8}],"end":152},{"id":"7","start":1,"name":"FER1_MESCR/1-148","seq":"--MAATTAALSGATMSTAFAPKT--PPMTAALPTNVG-RALFGLKS--SASRGRVTAMAAYKVTLVTPEGKQELECPDDVYILDAAEEAGIDLPYSCRAGSCSSCAGKVTSGSVNQDDGSFLDDDQIKEGWVLTCVAYPTGDVTIETHKEEELTA-","features":[],"end":148},{"id":"8","start":1,"name":"FER1_SPIOL/1-147","seq":"----MAATTTTMMGMATTFVPKPQAPPMMAALPSNTG-RSLFGLKT--GSRGGRMT-MAAYKVTLVTPTGNVEFQCPDDVYILDAAEEEGIDLPYSCRAGSCSSCAGKLKTGSLNQDDQSFLDDDQIDEGWVLTCAAYPVSDVTIETHKEEELTA-","features":[],"end":147},{"id":"9","start":1,"name":"FER3_RAPSA/1-96","seq":"----------------------------------------------------------ATYKVKFITPEGEQEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDDDQIAEGFVLTCAAYPTSDVTIETHREEDMV--","features":[],"end":96},{"id":"10","start":1,"name":"FER1_ARATH/1-148","seq":"----MASTALSSAIVGTSFIRRSPAPISLRSLPSANT-QSLFGLKS-GTARGGRVTAMATYKVKFITPEGELEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSFLDDEQIGEGFVLTCAAYPTSDVTIETHKEEDIV--","features":[],"end":148},{"id":"11","start":1,"name":"FER_BRANA/1-96","seq":"----------------------------------------------------------ATYKVKFITPEGEQEVECDDDVYVLDAAEEAGIDLPYSCRAGSCSSCAGKVVSGFVDQSDESFLDDDQIAEGFVLTCAAYPTSDVTIETHKEEELV--","features":[],"end":96},{"id":"12","start":1,"name":"FER2_ARATH/1-148","seq":"----MASTALSSAIVSTSFLRRQQTPISLRSLPFANT-QSLFGLKS-STARGGRVTAMATYKVKFITPEGEQEVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDDEQMSEGYVLTCVAYPTSDVVIETHKEEAIM--","features":[{"text":"feature_3","xEnd":32,"fillColor":"#ffff00","xStart":4}],"end":148},{"id":"13","start":1,"name":"Q93Z60_ARATH/1-118","seq":"----MASTALSSAIVSTSFLRRQQTPISLRSLPFANT-QSLFGLKS-STARGGRVTAMATYKVKFITPEGEQEVECEEDVYVLDAAEEAGLDLPYSCRAGSCSSCAGKVVSGSIDQSDQSFLDD--------------------------------","features":[],"end":118},{"id":"14","start":1,"name":"FER1_MAIZE/1-150","seq":"MATVLGSPRAPAFFFSSSSLRAAPAPTAVALPAAKVG---IMGRSA---SSRRRLRAQATYNVKLITPEGEVELQVPDDVYILDQAEEDGIDLPYSCRAGSCSSCAGKVVSGSVDQSDQSYLDDGQIADGWVLTCHAYPTSDVVIETHKEEELTGA","features":[],"end":150},{"id":"15","start":1,"name":"O80429_MAIZE/1-140","seq":"---------MAATALSMSILRAPP-PCFSSPLRLRVAVAKPLAAPM----RRQLLRAQATYNVKLITPEGEVELQVPDDVYILDFAEEEGIDLPFSCRAGSCSSCAGKVVSGSVDQSDQSFLNDNQVADGWVLTCAAYPTSDVVIETHKEDDLL--","features":[],"end":140}],"webStartUrl":"http://www.jalview.org/services/launchApp","jalviewVersion":"Test"}'/>
33 function toggleMenuVisibility(){
34 var menu = document.getElementsByClassName("biojs_msa_menubar");
35 var divToggleButton = document.getElementById("divToggleButton");
36 if(menu[0].style.display == 'block'){
37 menu[0].style.display = 'none';
38 divToggleButton.value="Show Menu";
40 menu[0].style.display = 'block';
41 divToggleButton.value="Hide Menu";
46 function openJalviewUsingCurrentUrl(){
47 var jalviewData = JSON.parse(document.getElementById("seqData").value)
48 var jalviewVersion = jalviewData['jalviewVersion'];
49 var url = jalviewData['webStartUrl'];
50 var myForm = document.createElement("form");
53 var heap = document.createElement("input") ;
54 heap.setAttribute("name", "jvm-max-heap") ;
55 heap.setAttribute("value", "2G");
56 myForm.appendChild(heap) ;
58 var target = document.createElement("input") ;
59 target.setAttribute("name", "open") ;
60 target.setAttribute("value", document.URL);
61 myForm.appendChild(target) ;
63 var jvVersion = document.createElement("input") ;
64 jvVersion.setAttribute("name", "version") ;
65 jvVersion.setAttribute("value", jalviewVersion);
66 myForm.appendChild(jvVersion) ;
68 document.body.appendChild(myForm) ;
70 document.body.removeChild(myForm) ;
74 require=(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<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
75 var css = ".biojs_msa_stage {\n cursor: default;\n line-height: normal; }\n\n.biojs_msa_labels {\n color: black;\n display: inline-block;\n white-space: nowrap;\n cursor: pointer;\n vertical-align: top; }\n\n.biojs_msa_seqblock {\n cursor: move; }\n\n.biojs_msa_layer {\n display: block;\n white-space: nowrap; }\n\n.biojs_msa_labelblock::-webkit-scrollbar, .biojs_msa_header::-webkit-scrollbar {\n -webkit-appearance: none;\n width: 7px;\n height: 7px; }\n\n.biojs_msa_labelblock::-webkit-scrollbar-thumb, .biojs_msa_header::-webkit-scrollbar-thumb {\n border-radius: 4px;\n background-color: rgba(0, 0, 0, 0.5);\n box-shadow: 0 0 1px rgba(255, 255, 255, 0.5); }\n\n.biojs_msa_marker {\n color: grey;\n white-space: nowrap;\n cursor: pointer; }\n\n.biojs_msa_marker span {\n text-align: center; }\n\n.biojs_msa_menubar .biojs_msa_menubar_alink {\n background: #3498db;\n background-image: -webkit-linear-gradient(top, #3498db, #2980b9);\n background-image: -moz-linear-gradient(top, #3498db, #2980b9);\n background-image: -ms-linear-gradient(top, #3498db, #2980b9);\n background-image: -o-linear-gradient(top, #3498db, #2980b9);\n background-image: linear-gradient(to bottom, #3498db, #2980b9);\n -webkit-border-radius: 28;\n -moz-border-radius: 28;\n border-radius: 28px;\n font-family: Arial;\n color: #ffffff;\n padding: 3px 10px 3px 10px;\n margin-left: 10px;\n text-decoration: none; }\n\n.biojs_msa_menubar .biojs_msa_menubar_alink:hover {\n cursor: pointer; }\n\n/* jquery dropdown CSS */\n.dropdown {\n position: absolute;\n z-index: 9999999;\n display: none; }\n\n.dropdown .dropdown-menu,\n.dropdown .dropdown-panel {\n min-width: 160px;\n max-width: 360px;\n list-style: none;\n background: #FFF;\n border: solid 1px #DDD;\n border: solid 1px rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n overflow: visible;\n padding: 4px 0;\n margin: 0; }\n\n.dropdown .dropdown-panel {\n padding: 10px; }\n\n.dropdown.dropdown-scroll .dropdown-menu,\n.dropdown.dropdown-scroll .dropdown-panel {\n max-height: 358px;\n overflow: auto; }\n\n.dropdown .dropdown-menu LI {\n list-style: none;\n padding: 0 0;\n margin: 0;\n line-height: 18px; }\n\n.dropdown .dropdown-menu LI,\n.dropdown .dropdown-menu LABEL {\n display: block;\n color: #555;\n text-decoration: none;\n line-height: 18px;\n padding: 3px 15px;\n white-space: nowrap; }\n\n.dropdown .dropdown-menu LI:hover,\n.dropdown .dropdown-menu LABEL:hover {\n background-color: #08C;\n color: #FFF;\n cursor: pointer; }\n\n.dropdown .dropdown-menu .dropdown-divider {\n font-size: 1px;\n border-top: solid 1px #E5E5E5;\n padding: 0;\n margin: 5px 0; }\n"; (require("/home/travis/build/greenify/biojs-vis-msa/node_modules/cssify"))(css); module.exports = css;
76 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/cssify":48}],2:[function(require,module,exports){
77 module.exports = require("./src/index");
79 },{"./src/index":72}],3:[function(require,module,exports){
80 var _ = require('underscore');
81 var viewType = require("backbone-viewj");
84 module.exports = pluginator = viewType.extend({
85 renderSubviews: function() {
87 var el = document.createElement("div");
89 var frag = document.createDocumentFragment();
90 if (oldEl.parentNode != null) {
91 oldEl.parentNode.replaceChild(this.el, oldEl);
93 var views = this._views();
94 var viewsSorted = _.sortBy(views, function(el) {
98 for (var i = 0; i < viewsSorted.length; i++) {
99 view = viewsSorted[i];
103 frag.appendChild(node);
106 el.appendChild(frag);
109 addView: function(key, view) {
110 var views = this._views();
112 throw "Invalid plugin. ";
114 if (view.ordering == null) {
117 return views[key] = view;
119 removeViews: function() {
121 var views = this._views();
124 el.undelegateEvents();
126 if (el.removeViews != null) {
131 return this.views = {};
133 removeView: function(key) {
134 var views = this._views();
136 return delete views[key];
138 getView: function(key) {
139 var views = this._views();
144 return viewType.prototype.remove.apply(this);
147 if (this.views == null) {
154 },{"backbone-viewj":10,"underscore":59}],4:[function(require,module,exports){
157 // (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
158 // Backbone may be freely distributed under the MIT license.
159 // For all details and documentation:
160 // http://backbonejs.org
162 var Events = require("backbone-events-standalone");
163 var extend = require("backbone-extend-standalone");
164 var _ = require("underscore");
165 var Model = require("./model");
167 // Create local references to array methods we'll want to use later.
169 var slice = array.slice;
171 // Backbone.Collection
172 // -------------------
174 // If models tend to represent a single row of data, a Backbone Collection is
175 // more analogous to a table full of data ... or a small slice or page of that
176 // table, or a collection of rows that belong together for a particular reason
177 // -- all of the messages in this particular folder, all of the documents
178 // belonging to this particular author, and so on. Collections maintain
179 // indexes of their models, both in order, and for lookup by `id`.
181 // Create a new **Collection**, perhaps to contain a specific type of `model`.
182 // If a `comparator` is specified, the Collection will maintain
183 // its models in sort order, as they're added and removed.
184 var Collection = function(models, options) {
185 options || (options = {});
186 if (options.model) this.model = options.model;
187 if (options.comparator !== void 0) this.comparator = options.comparator;
189 this.initialize.apply(this, arguments);
190 if (models) this.reset(models, _.extend({silent: true}, options));
193 // Default options for `Collection#set`.
194 var setOptions = {add: true, remove: true, merge: true};
195 var addOptions = {add: true, remove: false};
197 // Define the Collection's inheritable methods.
198 _.extend(Collection.prototype, Events, {
200 // The default model for a collection is just a **Backbone.Model**.
201 // This should be overridden in most cases.
204 // Initialize is an empty function by default. Override it with your own
205 // initialization logic.
206 initialize: function(){},
208 // The JSON representation of a Collection is an array of the
209 // models' attributes.
210 toJSON: function(options) {
211 return this.map(function(model){ return model.toJSON(options); });
214 // Proxy `Backbone.sync` by default.
216 return Backbone.sync.apply(this, arguments);
219 // Add a model, or list of models to the set.
220 add: function(models, options) {
221 return this.set(models, _.extend({merge: false}, options, addOptions));
224 // Remove a model, or a list of models from the set.
225 remove: function(models, options) {
226 var singular = !_.isArray(models);
227 models = singular ? [models] : _.clone(models);
228 options || (options = {});
229 for (var i = 0, length = models.length; i < length; i++) {
230 var model = models[i] = this.get(models[i]);
231 if (!model) continue;
232 var id = this.modelId(model.attributes);
233 if (id != null) delete this._byId[id];
234 delete this._byId[model.cid];
235 var index = this.indexOf(model);
236 this.models.splice(index, 1);
238 if (!options.silent) {
239 options.index = index;
240 model.trigger('remove', model, this, options);
242 this._removeReference(model, options);
244 return singular ? models[0] : models;
247 // Update a collection by `set`-ing a new list of models, adding new ones,
248 // removing models that are no longer present, and merging models that
249 // already exist in the collection, as necessary. Similar to **Model#set**,
250 // the core operation for updating the data contained by the collection.
251 set: function(models, options) {
252 options = _.defaults({}, options, setOptions);
253 if (options.parse) models = this.parse(models, options);
254 var singular = !_.isArray(models);
255 models = singular ? (models ? [models] : []) : models.slice();
256 var id, model, attrs, existing, sort;
258 var sortable = this.comparator && (at == null) && options.sort !== false;
259 var sortAttr = _.isString(this.comparator) ? this.comparator : null;
260 var toAdd = [], toRemove = [], modelMap = {};
261 var add = options.add, merge = options.merge, remove = options.remove;
262 var order = !sortable && add && remove ? [] : false;
264 // Turn bare objects into model references, and prevent invalid models
266 for (var i = 0, length = models.length; i < length; i++) {
269 // If a duplicate is found, prevent it from being added and
270 // optionally merge it into the existing model.
271 if (existing = this.get(attrs)) {
272 if (remove) modelMap[existing.cid] = true;
273 if (merge && attrs !== existing) {
274 attrs = this._isModel(attrs) ? attrs.attributes : attrs;
275 if (options.parse) attrs = existing.parse(attrs, options);
276 existing.set(attrs, options);
277 if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;
279 models[i] = existing;
281 // If this is a new, valid model, push it to the `toAdd` list.
283 model = models[i] = this._prepareModel(attrs, options);
284 if (!model) continue;
286 this._addReference(model, options);
289 // Do not add multiple models with the same `id`.
290 model = existing || model;
291 if (!model) continue;
292 id = this.modelId(model.attributes);
293 if (order && (model.isNew() || !modelMap[id])) order.push(model);
297 // Remove nonexistent models if appropriate.
299 for (var i = 0, length = this.length; i < length; i++) {
300 if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model);
302 if (toRemove.length) this.remove(toRemove, options);
305 // See if sorting is needed, update `length` and splice in new models.
306 if (toAdd.length || (order && order.length)) {
307 if (sortable) sort = true;
308 this.length += toAdd.length;
310 for (var i = 0, length = toAdd.length; i < length; i++) {
311 this.models.splice(at + i, 0, toAdd[i]);
314 if (order) this.models.length = 0;
315 var orderedModels = order || toAdd;
316 for (var i = 0, length = orderedModels.length; i < length; i++) {
317 this.models.push(orderedModels[i]);
322 // Silently sort the collection if appropriate.
323 if (sort) this.sort({silent: true});
325 // Unless silenced, it's time to fire all appropriate add/sort events.
326 if (!options.silent) {
327 var addOpts = at != null ? _.clone(options) : options;
328 for (var i = 0, length = toAdd.length; i < length; i++) {
329 if (at != null) addOpts.index = at + i;
330 (model = toAdd[i]).trigger('add', model, this, addOpts);
332 if (sort || (order && order.length)) this.trigger('sort', this, options);
335 // Return the added (or merged) model (or models).
336 return singular ? models[0] : models;
339 // When you have more items than you want to add or remove individually,
340 // you can reset the entire set with a new list of models, without firing
341 // any granular `add` or `remove` events. Fires `reset` when finished.
342 // Useful for bulk operations and optimizations.
343 reset: function(models, options) {
344 options || (options = {});
345 for (var i = 0, length = this.models.length; i < length; i++) {
346 this._removeReference(this.models[i], options);
348 options.previousModels = this.models;
350 models = this.add(models, _.extend({silent: true}, options));
351 if (!options.silent) this.trigger('reset', this, options);
355 // Add a model to the end of the collection.
356 push: function(model, options) {
357 return this.add(model, _.extend({at: this.length}, options));
360 // Remove a model from the end of the collection.
361 pop: function(options) {
362 var model = this.at(this.length - 1);
363 this.remove(model, options);
367 // Add a model to the beginning of the collection.
368 unshift: function(model, options) {
369 return this.add(model, _.extend({at: 0}, options));
372 // Remove a model from the beginning of the collection.
373 shift: function(options) {
374 var model = this.at(0);
375 this.remove(model, options);
379 // Slice out a sub-array of models from the collection.
381 return slice.apply(this.models, arguments);
384 // Get a model from the set by id.
386 if (obj == null) return void 0;
387 var id = this.modelId(this._isModel(obj) ? obj.attributes : obj);
388 return this._byId[obj] || this._byId[id] || this._byId[obj.cid];
391 // Get the model at the given index.
392 at: function(index) {
393 if (index < 0) index += this.length;
394 return this.models[index];
397 // Return models with matching attributes. Useful for simple cases of
399 where: function(attrs, first) {
400 if (_.isEmpty(attrs)) return first ? void 0 : [];
401 return this[first ? 'find' : 'filter'](function(model) {
402 for (var key in attrs) {
403 if (attrs[key] !== model.get(key)) return false;
409 // Return the first model with matching attributes. Useful for simple cases
411 findWhere: function(attrs) {
412 return this.where(attrs, true);
415 // Force the collection to re-sort itself. You don't need to call this under
416 // normal circumstances, as the set will maintain sort order as each item
418 sort: function(options) {
419 if (!this.comparator) throw new Error('Cannot sort a set without a comparator');
420 options || (options = {});
422 // Run sort based on type of `comparator`.
423 if (_.isString(this.comparator) || this.comparator.length === 1) {
424 this.models = this.sortBy(this.comparator, this);
426 this.models.sort(_.bind(this.comparator, this));
429 if (!options.silent) this.trigger('sort', this, options);
433 // Pluck an attribute from each model in the collection.
434 pluck: function(attr) {
435 return _.invoke(this.models, 'get', attr);
438 // Fetch the default set of models for this collection, resetting the
439 // collection when they arrive. If `reset: true` is passed, the response
440 // data will be passed through the `reset` method instead of `set`.
441 fetch: function(options) {
442 options = options ? _.clone(options) : {};
443 if (options.parse === void 0) options.parse = true;
444 var success = options.success;
445 var collection = this;
446 options.success = function(resp) {
447 var method = options.reset ? 'reset' : 'set';
448 collection[method](resp, options);
449 if (success) success(collection, resp, options);
450 collection.trigger('sync', collection, resp, options);
452 wrapError(this, options);
453 return this.sync('read', this, options);
456 // Create a new instance of a model in this collection. Add the model to the
457 // collection immediately, unless `wait: true` is passed, in which case we
458 // wait for the server to agree.
459 create: function(model, options) {
460 options = options ? _.clone(options) : {};
461 if (!(model = this._prepareModel(model, options))) return false;
462 if (!options.wait) this.add(model, options);
463 var collection = this;
464 var success = options.success;
465 options.success = function(model, resp) {
466 if (options.wait) collection.add(model, options);
467 if (success) success(model, resp, options);
469 model.save(null, options);
473 // **parse** converts a response into a list of models to be added to the
474 // collection. The default implementation is just to pass it through.
475 parse: function(resp, options) {
479 // Create a new collection with an identical list of models as this one.
481 return new this.constructor(this.models, {
483 comparator: this.comparator
487 // Define how to uniquely identify models in the collection.
488 modelId: function (attrs) {
489 return attrs[this.model.prototype.idAttribute || 'id'];
492 // Private method to reset all internal state. Called when the collection
493 // is first initialized or reset.
500 // Prepare a hash of attributes (or other model) to be added to this
502 _prepareModel: function(attrs, options) {
503 if (this._isModel(attrs)) {
504 if (!attrs.collection) attrs.collection = this;
507 options = options ? _.clone(options) : {};
508 options.collection = this;
509 var model = new this.model(attrs, options);
510 if (!model.validationError) return model;
511 this.trigger('invalid', this, model.validationError, options);
515 // Method for checking whether an object should be considered a model for
516 // the purposes of adding to the collection.
517 _isModel: function (model) {
518 return model instanceof Model;
521 // Internal method to create a model's ties to a collection.
522 _addReference: function(model, options) {
523 this._byId[model.cid] = model;
524 var id = this.modelId(model.attributes);
525 if (id != null) this._byId[id] = model;
526 model.on('all', this._onModelEvent, this);
529 // Internal method to sever a model's ties to a collection.
530 _removeReference: function(model, options) {
531 if (this === model.collection) delete model.collection;
532 model.off('all', this._onModelEvent, this);
535 // Internal method called every time a model in the set fires an event.
536 // Sets need to update their indexes when models change ids. All other
537 // events simply proxy through. "add" and "remove" events that originate
538 // in other collections are ignored.
539 _onModelEvent: function(event, model, collection, options) {
540 if ((event === 'add' || event === 'remove') && collection !== this) return;
541 if (event === 'destroy') this.remove(model, options);
542 if (event === 'change') {
543 var prevId = this.modelId(model.previousAttributes());
544 var id = this.modelId(model.attributes);
546 if (prevId != null) delete this._byId[prevId];
547 if (id != null) this._byId[id] = model;
550 this.trigger.apply(this, arguments);
555 // Underscore methods that we want to implement on the Collection.
556 // 90% of the core usefulness of Backbone Collections is actually implemented
558 var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',
559 'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',
560 'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',
561 'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',
562 'tail', 'drop', 'last', 'without', 'difference', 'indexOf', 'shuffle',
563 'lastIndexOf', 'isEmpty', 'chain', 'sample', 'partition'];
565 // Mix in each Underscore method as a proxy to `Collection#models`.
566 _.each(methods, function(method) {
567 if (!_[method]) return;
568 Collection.prototype[method] = function() {
569 var args = slice.call(arguments);
570 args.unshift(this.models);
571 return _[method].apply(_, args);
575 // Underscore methods that take a property name as an argument.
576 var attributeMethods = ['groupBy', 'countBy', 'sortBy', 'indexBy'];
578 // Use attributes instead of properties.
579 _.each(attributeMethods, function(method) {
580 if (!_[method]) return;
581 Collection.prototype[method] = function(value, context) {
582 var iterator = _.isFunction(value) ? value : function(model) {
583 return model.get(value);
585 return _[method](this.models, iterator, context);
590 Collection.extend = extend;
591 module.exports = Collection;
593 },{"./model":6,"backbone-events-standalone":8,"backbone-extend-standalone":9,"underscore":59}],5:[function(require,module,exports){
594 module.exports.Model = require("./model");
595 module.exports.Collection = require("./collection");
596 module.exports.Events = require("backbone-events-standalone");
597 module.exports.extend = require("backbone-extend-standalone");
599 },{"./collection":4,"./model":6,"backbone-events-standalone":8,"backbone-extend-standalone":9}],6:[function(require,module,exports){
602 // (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
603 // Backbone may be freely distributed under the MIT license.
604 // For all details and documentation:
605 // http://backbonejs.org
607 var Events = require("backbone-events-standalone");
608 var extend = require("backbone-extend-standalone");
609 var _ = require("underscore");
614 // Backbone **Models** are the basic data object in the framework --
615 // frequently representing a row in a table in a database on your server.
616 // A discrete chunk of data and a bunch of useful, related methods for
617 // performing computations and transformations on that data.
619 // Create a new model with the specified attributes. A client id (`cid`)
620 // is automatically generated and assigned for you.
621 var Model = function(attributes, options) {
622 var attrs = attributes || {};
623 options || (options = {});
624 this.cid = _.uniqueId('c');
625 this.attributes = {};
626 if (options.collection) this.collection = options.collection;
627 if (options.parse) attrs = this.parse(attrs, options) || {};
628 attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
629 this.set(attrs, options);
631 this.initialize.apply(this, arguments);
634 // Attach all inheritable methods to the Model prototype.
635 _.extend(Model.prototype, Events, {
637 // A hash of attributes whose current and previous value differ.
640 // The value returned during the last failed validation.
641 validationError: null,
643 // The default name for the JSON `id` attribute is `"id"`. MongoDB and
644 // CouchDB users may want to set this to `"_id"`.
647 // Initialize is an empty function by default. Override it with your own
648 // initialization logic.
649 initialize: function(){},
651 // Return a copy of the model's `attributes` object.
652 toJSON: function(options) {
653 return _.clone(this.attributes);
656 // Proxy `Backbone.sync` by default -- but override this if you need
657 // custom syncing semantics for *this* particular model.
659 return Backbone.sync.apply(this, arguments);
662 // Get the value of an attribute.
663 get: function(attr) {
664 return this.attributes[attr];
667 // Get the HTML-escaped value of an attribute.
668 escape: function(attr) {
669 return _.escape(this.get(attr));
672 // Returns `true` if the attribute contains a value that is not null
674 has: function(attr) {
675 return this.get(attr) != null;
678 // Set a hash of model attributes on the object, firing `"change"`. This is
679 // the core primitive operation of a model, updating the data and notifying
680 // anyone who needs to know about the change in state. The heart of the beast.
681 set: function(key, val, options) {
682 var attr, attrs, unset, changes, silent, changing, prev, current;
683 if (key == null) return this;
685 // Handle both `"key", value` and `{key: value}` -style arguments.
686 if (typeof key === 'object') {
690 (attrs = {})[key] = val;
693 options || (options = {});
696 if (!this._validate(attrs, options)) return false;
698 // Extract attributes and options.
699 unset = options.unset;
700 silent = options.silent;
702 changing = this._changing;
703 this._changing = true;
706 this._previousAttributes = _.clone(this.attributes);
709 current = this.attributes, prev = this._previousAttributes;
711 // Check for changes of `id`.
712 if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];
714 // For each `set` attribute, update or delete the current value.
715 for (attr in attrs) {
717 if (!_.isEqual(current[attr], val)) changes.push(attr);
718 if (!_.isEqual(prev[attr], val)) {
719 this.changed[attr] = val;
721 delete this.changed[attr];
723 unset ? delete current[attr] : current[attr] = val;
726 // Trigger all relevant attribute changes.
728 if (changes.length) this._pending = options;
729 for (var i = 0, length = changes.length; i < length; i++) {
730 this.trigger('change:' + changes[i], this, current[changes[i]], options);
734 // You might be wondering why there's a `while` loop here. Changes can
735 // be recursively nested within `"change"` events.
736 if (changing) return this;
738 while (this._pending) {
739 options = this._pending;
740 this._pending = false;
741 this.trigger('change', this, options);
744 this._pending = false;
745 this._changing = false;
749 // Remove an attribute from the model, firing `"change"`. `unset` is a noop
750 // if the attribute doesn't exist.
751 unset: function(attr, options) {
752 return this.set(attr, void 0, _.extend({}, options, {unset: true}));
755 // Clear all attributes on the model, firing `"change"`.
756 clear: function(options) {
758 for (var key in this.attributes) attrs[key] = void 0;
759 return this.set(attrs, _.extend({}, options, {unset: true}));
762 // Determine if the model has changed since the last `"change"` event.
763 // If you specify an attribute name, determine if that attribute has changed.
764 hasChanged: function(attr) {
765 if (attr == null) return !_.isEmpty(this.changed);
766 return _.has(this.changed, attr);
769 // Return an object containing all the attributes that have changed, or
770 // false if there are no changed attributes. Useful for determining what
771 // parts of a view need to be updated and/or what attributes need to be
772 // persisted to the server. Unset attributes will be set to undefined.
773 // You can also pass an attributes object to diff against the model,
774 // determining if there *would be* a change.
775 changedAttributes: function(diff) {
776 if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;
777 var val, changed = false;
778 var old = this._changing ? this._previousAttributes : this.attributes;
779 for (var attr in diff) {
780 if (_.isEqual(old[attr], (val = diff[attr]))) continue;
781 (changed || (changed = {}))[attr] = val;
786 // Get the previous value of an attribute, recorded at the time the last
787 // `"change"` event was fired.
788 previous: function(attr) {
789 if (attr == null || !this._previousAttributes) return null;
790 return this._previousAttributes[attr];
793 // Get all of the attributes of the model at the time of the previous
795 previousAttributes: function() {
796 return _.clone(this._previousAttributes);
799 // Fetch the model from the server. If the server's representation of the
800 // model differs from its current attributes, they will be overridden,
801 // triggering a `"change"` event.
802 fetch: function(options) {
803 options = options ? _.clone(options) : {};
804 if (options.parse === void 0) options.parse = true;
806 var success = options.success;
807 options.success = function(resp) {
808 if (!model.set(model.parse(resp, options), options)) return false;
809 if (success) success(model, resp, options);
810 model.trigger('sync', model, resp, options);
812 wrapError(this, options);
813 return this.sync('read', this, options);
816 // Set a hash of model attributes, and sync the model to the server.
817 // If the server returns an attributes hash that differs, the model's
818 // state will be `set` again.
819 save: function(key, val, options) {
820 var attrs, method, xhr, attributes = this.attributes;
822 // Handle both `"key", value` and `{key: value}` -style arguments.
823 if (key == null || typeof key === 'object') {
827 (attrs = {})[key] = val;
830 options = _.extend({validate: true}, options);
832 // If we're not waiting and attributes exist, save acts as
833 // `set(attr).save(null, opts)` with validation. Otherwise, check if
834 // the model will be valid when the attributes, if any, are set.
835 if (attrs && !options.wait) {
836 if (!this.set(attrs, options)) return false;
838 if (!this._validate(attrs, options)) return false;
841 // Set temporary attributes if `{wait: true}`.
842 if (attrs && options.wait) {
843 this.attributes = _.extend({}, attributes, attrs);
846 // After a successful server-side save, the client is (optionally)
847 // updated with the server-side state.
848 if (options.parse === void 0) options.parse = true;
850 var success = options.success;
851 options.success = function(resp) {
852 // Ensure attributes are restored during synchronous saves.
853 model.attributes = attributes;
854 var serverAttrs = model.parse(resp, options);
855 if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);
856 if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {
859 if (success) success(model, resp, options);
860 model.trigger('sync', model, resp, options);
862 wrapError(this, options);
864 method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');
865 if (method === 'patch' && !options.attrs) options.attrs = attrs;
866 xhr = this.sync(method, this, options);
868 // Restore attributes.
869 if (attrs && options.wait) this.attributes = attributes;
874 // Destroy this model on the server if it was already persisted.
875 // Optimistically removes the model from its collection, if it has one.
876 // If `wait: true` is passed, waits for the server to respond before removal.
877 destroy: function(options) {
878 options = options ? _.clone(options) : {};
880 var success = options.success;
882 var destroy = function() {
883 model.stopListening();
884 model.trigger('destroy', model, model.collection, options);
887 options.success = function(resp) {
888 if (options.wait || model.isNew()) destroy();
889 if (success) success(model, resp, options);
890 if (!model.isNew()) model.trigger('sync', model, resp, options);
897 wrapError(this, options);
899 var xhr = this.sync('delete', this, options);
900 if (!options.wait) destroy();
904 // Default URL for the model's representation on the server -- if you're
905 // using Backbone's restful methods, override this to change the endpoint
906 // that will be called.
909 _.result(this, 'urlRoot') ||
910 _.result(this.collection, 'url') ||
912 if (this.isNew()) return base;
913 return base.replace(/([^\/])$/, '$1/') + encodeURIComponent(this.id);
916 // **parse** converts a response into the hash of attributes to be `set` on
917 // the model. The default implementation is just to pass the response along.
918 parse: function(resp, options) {
922 // Create a new model with identical attributes to this one.
924 return new this.constructor(this.attributes);
927 // A model is new if it has never been saved to the server, and lacks an id.
929 return !this.has(this.idAttribute);
932 // Check if the model is currently in a valid state.
933 isValid: function(options) {
934 return this._validate({}, _.extend(options || {}, { validate: true }));
937 // Run validation against the next complete set of model attributes,
938 // returning `true` if all is well. Otherwise, fire an `"invalid"` event.
939 _validate: function(attrs, options) {
940 if (!options.validate || !this.validate) return true;
941 attrs = _.extend({}, this.attributes, attrs);
942 var error = this.validationError = this.validate(attrs, options) || null;
943 if (!error) return true;
944 this.trigger('invalid', this, error, _.extend(options, {validationError: error}));
950 // Underscore methods that we want to implement on the Model.
951 var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit', 'chain', 'isEmpty'];
953 // Mix in each Underscore method as a proxy to `Model#attributes`.
954 _.each(modelMethods, function(method) {
955 if (!_[method]) return;
956 Model.prototype[method] = function() {
957 var args = slice.call(arguments);
958 args.unshift(this.attributes);
959 return _[method].apply(_, args);
964 Model.extend = extend;
965 module.exports = Model;
967 },{"backbone-events-standalone":8,"backbone-extend-standalone":9,"underscore":59}],7:[function(require,module,exports){
969 * Standalone extraction of Backbone.Events, no external dependency required.
970 * Degrades nicely when Backone/underscore are already available in the current
973 * Note that docs suggest to use underscore's `_.extend()` method to add Events
974 * support to some given object. A `mixin()` method has been added to the Events
975 * prototype to avoid using underscore for that sole purpose:
977 * var myEventEmitter = BackboneEvents.mixin({});
979 * Or for a function constructor:
981 * function MyConstructor(){}
982 * MyConstructor.prototype.foo = function(){}
983 * BackboneEvents.mixin(MyConstructor.prototype);
985 * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.
986 * (c) 2013 Nicolas Perriault
988 /* global exports:true, define, module */
992 nativeForEach = Array.prototype.forEach,
993 hasOwnProperty = Object.prototype.hasOwnProperty,
994 slice = Array.prototype.slice,
997 // Returns a partial implementation matching the minimal API subset required
998 // by Backbone.Events
999 function miniscore() {
1001 keys: Object.keys || function (obj) {
1002 if (typeof obj !== "object" && typeof obj !== "function" || obj === null) {
1003 throw new TypeError("keys() called on a non-object");
1007 if (obj.hasOwnProperty(key)) {
1008 keys[keys.length] = key;
1014 uniqueId: function(prefix) {
1015 var id = ++idCounter + '';
1016 return prefix ? prefix + id : id;
1019 has: function(obj, key) {
1020 return hasOwnProperty.call(obj, key);
1023 each: function(obj, iterator, context) {
1024 if (obj == null) return;
1025 if (nativeForEach && obj.forEach === nativeForEach) {
1026 obj.forEach(iterator, context);
1027 } else if (obj.length === +obj.length) {
1028 for (var i = 0, l = obj.length; i < l; i++) {
1029 if (iterator.call(context, obj[i], i, obj) === breaker) return;
1032 for (var key in obj) {
1033 if (this.has(obj, key)) {
1034 if (iterator.call(context, obj[key], key, obj) === breaker) return;
1040 once: function(func) {
1041 var ran = false, memo;
1043 if (ran) return memo;
1045 memo = func.apply(this, arguments);
1053 var _ = miniscore(), Events;
1058 // A module that can be mixed in to *any object* in order to provide it with
1059 // custom events. You may bind with `on` or remove with `off` callback
1060 // functions to an event; `trigger`-ing an event fires all callbacks in
1064 // _.extend(object, Backbone.Events);
1065 // object.on('expand', function(){ alert('expanded'); });
1066 // object.trigger('expand');
1070 // Bind an event to a `callback` function. Passing `"all"` will bind
1071 // the callback to all events fired.
1072 on: function(name, callback, context) {
1073 if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
1074 this._events || (this._events = {});
1075 var events = this._events[name] || (this._events[name] = []);
1076 events.push({callback: callback, context: context, ctx: context || this});
1080 // Bind an event to only be triggered a single time. After the first time
1081 // the callback is invoked, it will be removed.
1082 once: function(name, callback, context) {
1083 if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;
1085 var once = _.once(function() {
1086 self.off(name, once);
1087 callback.apply(this, arguments);
1089 once._callback = callback;
1090 return this.on(name, once, context);
1093 // Remove one or many callbacks. If `context` is null, removes all
1094 // callbacks with that function. If `callback` is null, removes all
1095 // callbacks for the event. If `name` is null, removes all bound
1096 // callbacks for all events.
1097 off: function(name, callback, context) {
1098 var retain, ev, events, names, i, l, j, k;
1099 if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;
1100 if (!name && !callback && !context) {
1105 names = name ? [name] : _.keys(this._events);
1106 for (i = 0, l = names.length; i < l; i++) {
1108 if (events = this._events[name]) {
1109 this._events[name] = retain = [];
1110 if (callback || context) {
1111 for (j = 0, k = events.length; j < k; j++) {
1113 if ((callback && callback !== ev.callback && callback !== ev.callback._callback) ||
1114 (context && context !== ev.context)) {
1119 if (!retain.length) delete this._events[name];
1126 // Trigger one or many events, firing all bound callbacks. Callbacks are
1127 // passed the same arguments as `trigger` is, apart from the event name
1128 // (unless you're listening on `"all"`, which will cause your callback to
1129 // receive the true name of the event as the first argument).
1130 trigger: function(name) {
1131 if (!this._events) return this;
1132 var args = slice.call(arguments, 1);
1133 if (!eventsApi(this, 'trigger', name, args)) return this;
1134 var events = this._events[name];
1135 var allEvents = this._events.all;
1136 if (events) triggerEvents(events, args);
1137 if (allEvents) triggerEvents(allEvents, arguments);
1141 // Tell this object to stop listening to either specific events ... or
1142 // to every object it's currently listening to.
1143 stopListening: function(obj, name, callback) {
1144 var listeners = this._listeners;
1145 if (!listeners) return this;
1146 var deleteListener = !name && !callback;
1147 if (typeof name === 'object') callback = this;
1148 if (obj) (listeners = {})[obj._listenerId] = obj;
1149 for (var id in listeners) {
1150 listeners[id].off(name, callback, this);
1151 if (deleteListener) delete this._listeners[id];
1158 // Regular expression used to split event strings.
1159 var eventSplitter = /\s+/;
1161 // Implement fancy features of the Events API such as multiple event
1162 // names `"change blur"` and jQuery-style event maps `{change: action}`
1163 // in terms of the existing API.
1164 var eventsApi = function(obj, action, name, rest) {
1165 if (!name) return true;
1167 // Handle event maps.
1168 if (typeof name === 'object') {
1169 for (var key in name) {
1170 obj[action].apply(obj, [key, name[key]].concat(rest));
1175 // Handle space separated event names.
1176 if (eventSplitter.test(name)) {
1177 var names = name.split(eventSplitter);
1178 for (var i = 0, l = names.length; i < l; i++) {
1179 obj[action].apply(obj, [names[i]].concat(rest));
1187 // A difficult-to-believe, but optimized internal dispatch function for
1188 // triggering events. Tries to keep the usual cases speedy (most internal
1189 // Backbone events have 3 arguments).
1190 var triggerEvents = function(events, args) {
1191 var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
1192 switch (args.length) {
1193 case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;
1194 case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;
1195 case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;
1196 case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;
1197 default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
1201 var listenMethods = {listenTo: 'on', listenToOnce: 'once'};
1203 // Inversion-of-control versions of `on` and `once`. Tell *this* object to
1204 // listen to an event in another object ... keeping track of what it's
1206 _.each(listenMethods, function(implementation, method) {
1207 Events[method] = function(obj, name, callback) {
1208 var listeners = this._listeners || (this._listeners = {});
1209 var id = obj._listenerId || (obj._listenerId = _.uniqueId('l'));
1210 listeners[id] = obj;
1211 if (typeof name === 'object') callback = this;
1212 obj[implementation](name, callback, this);
1217 // Aliases for backwards compatibility.
1218 Events.bind = Events.on;
1219 Events.unbind = Events.off;
1222 Events.mixin = function(proto) {
1223 var exports = ['on', 'once', 'off', 'trigger', 'stopListening', 'listenTo',
1224 'listenToOnce', 'bind', 'unbind'];
1225 _.each(exports, function(name) {
1226 proto[name] = this[name];
1231 // Export Events as BackboneEvents depending on current context
1232 if (typeof define === "function") {
1236 } else if (typeof exports !== 'undefined') {
1237 if (typeof module !== 'undefined' && module.exports) {
1238 exports = module.exports = Events;
1240 exports.BackboneEvents = Events;
1242 root.BackboneEvents = Events;
1246 },{}],8:[function(require,module,exports){
1247 module.exports = require('./backbone-events-standalone');
1249 },{"./backbone-events-standalone":7}],9:[function(require,module,exports){
1250 (function (definition) {
1251 if (typeof exports === "object") {
1252 module.exports = definition();
1254 else if (typeof define === 'function' && define.amd) {
1258 window.BackboneExtend = definition();
1265 has: function (obj, key) {
1266 return Object.prototype.hasOwnProperty.call(obj, key);
1269 extend: function(obj) {
1270 for (var i=1; i<arguments.length; ++i) {
1271 var source = arguments[i];
1273 for (var prop in source) {
1274 obj[prop] = source[prop];
1282 /// Following code is pasted from Backbone.js ///
1284 // Helper function to correctly set up the prototype chain, for subclasses.
1285 // Similar to `goog.inherits`, but uses a hash of prototype properties and
1286 // class properties to be extended.
1287 var extend = function(protoProps, staticProps) {
1291 // The constructor function for the new subclass is either defined by you
1292 // (the "constructor" property in your `extend` definition), or defaulted
1293 // by us to simply call the parent's constructor.
1294 if (protoProps && _.has(protoProps, 'constructor')) {
1295 child = protoProps.constructor;
1297 child = function(){ return parent.apply(this, arguments); };
1300 // Add static properties to the constructor function, if supplied.
1301 _.extend(child, parent, staticProps);
1303 // Set the prototype chain to inherit from `parent`, without calling
1304 // `parent`'s constructor function.
1305 var Surrogate = function(){ this.constructor = child; };
1306 Surrogate.prototype = parent.prototype;
1307 child.prototype = new Surrogate();
1309 // Add prototype properties (instance properties) to the subclass,
1311 if (protoProps) _.extend(child.prototype, protoProps);
1313 // Set a convenience property in case the parent's prototype is needed
1315 child.__super__ = parent.prototype;
1320 // Expose the extend function
1324 },{}],10:[function(require,module,exports){
1325 // this is the extracted view model from backbone
1326 // note that we inject jbone as jquery replacment
1327 // (and underscore directly)
1329 // Views are almost more convention than they are actual code.
1334 var _ = require("underscore");
1335 var Events = require("backbone-events-standalone");
1336 var extend = require("backbone-extend-standalone");
1337 var $ = require('jbone');
1339 // Backbone Views are almost more convention than they are actual code. A View
1340 // is simply a JavaScript object that represents a logical chunk of UI in the
1341 // DOM. This might be a single item, an entire list, a sidebar or panel, or
1342 // even the surrounding frame which wraps your whole app. Defining a chunk of
1343 // UI as a **View** allows you to define your DOM events declaratively, without
1344 // having to worry about render order ... and makes it easy for the view to
1345 // react to specific changes in the state of your models.
1347 // Creating a Backbone.View creates its initial element outside of the DOM,
1348 // if an existing element is not provided...
1349 var View = function(options) {
1350 this.cid = _.uniqueId('view');
1351 options || (options = {});
1352 _.extend(this, _.pick(options, viewOptions));
1353 this._ensureElement();
1354 this.initialize.apply(this, arguments);
1357 // Cached regex to split keys for `delegate`.
1358 var delegateEventSplitter = /^(\S+)\s*(.*)$/;
1360 // List of view options to be merged as properties.
1361 var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];
1363 // Set up all inheritable **Backbone.View** properties and methods.
1364 _.extend(View.prototype, Events, {
1366 // The default `tagName` of a View's element is `"div"`.
1369 // jQuery delegate for element lookup, scoped to DOM elements within the
1370 // current view. This should be preferred to global lookups where possible.
1371 $: function(selector) {
1372 return this.$el.find(selector);
1375 // Initialize is an empty function by default. Override it with your own
1376 // initialization logic.
1377 initialize: function(){},
1379 // **render** is the core function that your view should override, in order
1380 // to populate its element (`this.el`), with the appropriate HTML. The
1381 // convention is for **render** to always return `this`.
1382 render: function() {
1386 // Remove this view by taking the element out of the DOM, and removing any
1387 // applicable Backbone.Events listeners.
1388 remove: function() {
1389 this._removeElement();
1390 this.stopListening();
1394 // Remove this view's element from the document and all event listeners
1395 // attached to it. Exposed for subclasses using an alternative DOM
1396 // manipulation API.
1397 _removeElement: function() {
1401 // Change the view's element (`this.el` property) and re-delegate the
1402 // view's events on the new element.
1403 setElement: function(element) {
1404 this.undelegateEvents();
1405 this._setElement(element);
1406 this.delegateEvents();
1410 // Creates the `this.el` and `this.$el` references for this view using the
1411 // given `el`. `el` can be a CSS selector or an HTML string, a jQuery
1412 // context or an element. Subclasses can override this to utilize an
1413 // alternative DOM manipulation API and are only required to set the
1414 // `this.el` property.
1415 _setElement: function(el) {
1416 this.$el = el instanceof $ ? el : $(el);
1417 this.el = this.$el[0];
1420 // Set callbacks, where `this.events` is a hash of
1422 // *{"event selector": "callback"}*
1425 // 'mousedown .title': 'edit',
1426 // 'click .button': 'save',
1427 // 'click .open': function(e) { ... }
1430 // pairs. Callbacks will be bound to the view, with `this` set properly.
1431 // Uses event delegation for efficiency.
1432 // Omitting the selector binds the event to `this.el`.
1433 delegateEvents: function(events) {
1434 if (!(events || (events = _.result(this, 'events')))) return this;
1435 this.undelegateEvents();
1436 for (var key in events) {
1437 var method = events[key];
1438 if (!_.isFunction(method)) method = this[events[key]];
1439 if (!method) continue;
1440 var match = key.match(delegateEventSplitter);
1441 this.delegate(match[1], match[2], _.bind(method, this));
1446 // Add a single event listener to the view's element (or a child element
1447 // using `selector`). This only works for delegate-able events: not `focus`,
1448 // `blur`, and not `change`, `submit`, and `reset` in Internet Explorer.
1449 delegate: function(eventName, selector, listener) {
1450 this.$el.on(eventName + '.delegateEvents' + this.cid, selector, listener);
1453 // Clears all callbacks previously bound to the view by `delegateEvents`.
1454 // You usually don't need to use this, but may wish to if you have multiple
1455 // Backbone views attached to the same DOM element.
1456 undelegateEvents: function() {
1457 if (this.$el) this.$el.off('.delegateEvents' + this.cid);
1461 // A finer-grained `undelegateEvents` for removing a single delegated event.
1462 // `selector` and `listener` are both optional.
1463 undelegate: function(eventName, selector, listener) {
1464 this.$el.off(eventName + '.delegateEvents' + this.cid, selector, listener);
1467 // Produces a DOM element to be assigned to your view. Exposed for
1468 // subclasses using an alternative DOM manipulation API.
1469 _createElement: function(tagName) {
1470 return document.createElement(tagName);
1473 // Ensure that the View has a DOM element to render into.
1474 // If `this.el` is a string, pass it through `$()`, take the first
1475 // matching element, and re-assign it to `el`. Otherwise, create
1476 // an element from the `id`, `className` and `tagName` properties.
1477 _ensureElement: function() {
1479 var attrs = _.extend({}, _.result(this, 'attributes'));
1480 if (this.id) attrs.id = _.result(this, 'id');
1481 if (this.className) attrs['class'] = _.result(this, 'className');
1482 this.setElement(this._createElement(_.result(this, 'tagName')));
1483 this._setAttributes(attrs);
1485 this.setElement(_.result(this, 'el'));
1489 // Set attributes from a hash on this view's element. Exposed for
1490 // subclasses using an alternative DOM manipulation API.
1491 _setAttributes: function(attributes) {
1492 this.$el.attr(attributes);
1497 // setup inheritance
1498 View.extend = extend;
1499 module.exports = View;
1501 },{"backbone-events-standalone":12,"backbone-extend-standalone":13,"jbone":50,"underscore":59}],11:[function(require,module,exports){
1502 module.exports=require(7)
1503 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/backbone-thin/node_modules/backbone-events-standalone/backbone-events-standalone.js":7}],12:[function(require,module,exports){
1504 module.exports=require(8)
1505 },{"./backbone-events-standalone":11,"/home/travis/build/greenify/biojs-vis-msa/node_modules/backbone-thin/node_modules/backbone-events-standalone/index.js":8}],13:[function(require,module,exports){
1506 module.exports=require(9)
1507 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/backbone-thin/node_modules/backbone-extend-standalone/backbone-extend-standalone.js":9}],14:[function(require,module,exports){
1508 var events = require("backbone-events-standalone");
1510 events.onAll = function(callback,context){
1511 this.on("all", callback,context);
1516 events.oldMixin = events.mixin;
1517 events.mixin = function(proto) {
1518 events.oldMixin(proto);
1520 var exports = ['onAll'];
1521 for(var i=0; i < exports.length;i++){
1522 var name = exports[i];
1523 proto[name] = this[name];
1528 module.exports = events;
1530 },{"backbone-events-standalone":16}],15:[function(require,module,exports){
1531 module.exports=require(7)
1532 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/backbone-thin/node_modules/backbone-events-standalone/backbone-events-standalone.js":7}],16:[function(require,module,exports){
1533 module.exports=require(8)
1534 },{"./backbone-events-standalone":15,"/home/travis/build/greenify/biojs-vis-msa/node_modules/backbone-thin/node_modules/backbone-events-standalone/index.js":8}],17:[function(require,module,exports){
1535 // Generated by CoffeeScript 1.8.0
1536 var GenericReader, xhr;
1538 xhr = require('nets');
1540 module.exports = GenericReader = (function() {
1541 function GenericReader() {}
1543 GenericReader.read = function(url, callback) {
1545 onret = (function(_this) {
1546 return function(err, response, text) {
1547 return _this._onRetrieval(text, callback);
1550 return xhr(url, onret);
1553 GenericReader._onRetrieval = function(text, callback) {
1555 rText = this.parse(text);
1556 return callback(rText);
1559 return GenericReader;
1563 },{"nets":undefined}],18:[function(require,module,exports){
1564 // Generated by CoffeeScript 1.8.0
1567 module.exports = Seq = (function() {
1568 function Seq(seq, name, id) {
1580 },{}],19:[function(require,module,exports){
1581 // Generated by CoffeeScript 1.8.0
1585 contains: function(text, search) {
1586 return ''.indexOf.call(text, search, 0) !== -1;
1590 module.exports = strings;
1592 },{}],20:[function(require,module,exports){
1593 module.exports=require(17)
1594 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/biojs-io-clustal/lib/generic_reader.js":17,"nets":undefined}],21:[function(require,module,exports){
1595 // Generated by CoffeeScript 1.8.0
1596 var Fasta, GenericReader, Seq, Str,
1597 __hasProp = {}.hasOwnProperty,
1598 __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
1600 Str = require("./strings");
1602 GenericReader = require("./generic_reader");
1604 Seq = require("biojs-model").seq;
1606 module.exports = Fasta = (function(_super) {
1607 __extends(Fasta, _super);
1610 return Fasta.__super__.constructor.apply(this, arguments);
1613 Fasta.parse = function(text) {
1614 var currentSeq, database, databaseID, identifiers, k, label, line, seqs, _i, _len;
1616 if (Object.prototype.toString.call(text) !== '[object Array]') {
1617 text = text.split("\n");
1619 for (_i = 0, _len = text.length; _i < _len; _i++) {
1621 if (line[0] === ">" || line[0] === ";") {
1622 label = line.slice(1);
1623 currentSeq = new Seq("", label, seqs.length);
1624 seqs.push(currentSeq);
1625 if (Str.contains("|", line)) {
1626 identifiers = label.split("|");
1628 while (k < identifiers.length) {
1629 database = identifiers[k];
1630 databaseID = identifiers[k + 1];
1631 currentSeq.meta[database] = databaseID;
1634 currentSeq.name = identifiers[identifiers.length - 1];
1637 currentSeq.seq += line;
1647 },{"./generic_reader":20,"./strings":22,"biojs-model":25}],22:[function(require,module,exports){
1648 module.exports=require(19)
1649 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/biojs-io-clustal/lib/strings.js":19}],23:[function(require,module,exports){
1650 // Generated by CoffeeScript 1.8.0
1655 Utils.splitNChars = function(txt, num) {
1656 var i, result, _i, _ref;
1658 for (i = _i = 0, _ref = txt.length - 1; num > 0 ? _i <= _ref : _i >= _ref; i = _i += num) {
1659 result.push(txt.substr(i, num));
1664 module.exports = Utils;
1666 },{}],24:[function(require,module,exports){
1667 // Generated by CoffeeScript 1.8.0
1668 var FastaExporter, Utils;
1670 Utils = require("./utils");
1672 module.exports = FastaExporter = (function() {
1673 function FastaExporter() {}
1675 FastaExporter["export"] = function(seqs, access) {
1676 var seq, text, _i, _len;
1678 for (_i = 0, _len = seqs.length; _i < _len; _i++) {
1680 if (access != null) {
1683 text += ">" + seq.name + "\n";
1684 text += (Utils.splitNChars(seq.seq, 80)).join("\n");
1690 return FastaExporter;
1694 },{"./utils":23}],25:[function(require,module,exports){
1695 module.exports.seq = require("./seq");
1697 },{"./seq":26}],26:[function(require,module,exports){
1698 module.exports = function(seq, name, id) {
1705 },{}],27:[function(require,module,exports){
1706 module.exports=require(25)
1707 },{"./seq":28,"/home/travis/build/greenify/biojs-vis-msa/node_modules/biojs-io-fasta/node_modules/biojs-model/src/index.js":25}],28:[function(require,module,exports){
1708 module.exports=require(26)
1709 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/biojs-io-fasta/node_modules/biojs-model/src/seq.js":26}],29:[function(require,module,exports){
1710 module.exports = require('./src/index.js')
1712 },{"./src/index.js":36}],30:[function(require,module,exports){
1739 },{}],31:[function(require,module,exports){
1770 },{}],32:[function(require,module,exports){
1801 },{}],33:[function(require,module,exports){
1828 },{}],34:[function(require,module,exports){
1855 },{}],35:[function(require,module,exports){
1885 },{}],36:[function(require,module,exports){
1886 module.exports.selector = require("./selector");
1889 module.exports.taylor = require("./taylor");
1890 module.exports.zappo= require("./zappo");
1891 module.exports.hydro= require("./hydrophobicity");
1893 module.exports.clustal = require("./clustal");
1894 module.exports.clustal2 = require("./clustal2");
1896 module.exports.curied = require("./buried");
1897 module.exports.cinema = require("./cinema");
1898 module.exports.nucleotide = require("./nucleotide");
1899 module.exports.helix = require("./helix");
1900 module.exports.lesk = require("./lesk");
1901 module.exports.mae = require("./mae");
1902 module.exports.purine = require("./purine");
1903 module.exports.strand = require("./strand");
1904 module.exports.turn = require("./turn");
1906 },{"./buried":30,"./cinema":31,"./clustal":32,"./clustal2":33,"./helix":34,"./hydrophobicity":35,"./lesk":37,"./mae":38,"./nucleotide":39,"./purine":40,"./selector":41,"./strand":42,"./taylor":43,"./turn":44,"./zappo":45}],37:[function(require,module,exports){
1937 },{}],38:[function(require,module,exports){
1968 },{}],39:[function(require,module,exports){
1977 },{}],40:[function(require,module,exports){
1988 },{}],41:[function(require,module,exports){
1989 var Buried = require("./buried");
1990 var Cinema = require("./cinema");
1991 var Clustal = require("./clustal");
1992 var Clustal2 = require("./clustal2");
1993 var Helix = require("./helix");
1994 var Hydro = require("./hydrophobicity");
1995 var Lesk = require("./lesk");
1996 var Mae = require("./mae");
1997 var Nucleotide = require("./nucleotide");
1998 var Purine = require("./purine");
1999 var Strand = require("./strand");
2000 var Taylor = require("./taylor");
2001 var Turn = require("./turn");
2002 var Zappo = require("./zappo");
2004 module.exports = Colors = {
2007 buried_index: Buried,
2012 helix_propensity: Helix,
2016 nucleotide: Nucleotide,
2018 purine_pyrimidine: Purine,
2020 strand_propensity: Strand,
2023 turn_propensity: Turn,
2026 getColor: function(scheme) {
2027 var color = Colors.mapping[scheme];
2028 if (color === undefined) {
2035 },{"./buried":30,"./cinema":31,"./clustal":32,"./clustal2":33,"./helix":34,"./hydrophobicity":35,"./lesk":37,"./mae":38,"./nucleotide":39,"./purine":40,"./strand":42,"./taylor":43,"./turn":44,"./zappo":45}],42:[function(require,module,exports){
2062 },{}],43:[function(require,module,exports){
2089 },{}],44:[function(require,module,exports){
2116 },{}],45:[function(require,module,exports){
2143 },{}],46:[function(require,module,exports){
2145 * JavaScript Canvas to Blob 2.0.5
2146 * https://github.com/blueimp/JavaScript-Canvas-to-Blob
2148 * Copyright 2012, Sebastian Tschan
2149 * https://blueimp.net
2151 * Licensed under the MIT license:
2152 * http://www.opensource.org/licenses/MIT
2154 * Based on stackoverflow user Stoive's code snippet:
2155 * http://stackoverflow.com/q/4998908
2157 var CanvasPrototype = window.HTMLCanvasElement &&
2158 window.HTMLCanvasElement.prototype,
2159 hasBlobConstructor = window.Blob && (function () {
2161 return Boolean(new Blob());
2166 hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array &&
2169 return new Blob([new Uint8Array(100)]).size === 100;
2174 BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder ||
2175 window.MozBlobBuilder || window.MSBlobBuilder,
2176 dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob &&
2177 window.ArrayBuffer && window.Uint8Array && function (dataURI) {
2184 if (dataURI.split(',')[0].indexOf('base64') >= 0) {
2185 // Convert base64 to raw binary data held in a string:
2186 byteString = atob(dataURI.split(',')[1]);
2188 // Convert base64/URLEncoded data component to raw binary data:
2189 byteString = decodeURIComponent(dataURI.split(',')[1]);
2191 // Write the bytes of the string to an ArrayBuffer:
2192 arrayBuffer = new ArrayBuffer(byteString.length);
2193 intArray = new Uint8Array(arrayBuffer);
2194 for (i = 0; i < byteString.length; i += 1) {
2195 intArray[i] = byteString.charCodeAt(i);
2197 // Separate out the mime component:
2198 mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
2199 // Write the ArrayBuffer (or ArrayBufferView) to a blob:
2200 if (hasBlobConstructor) {
2202 [hasArrayBufferViewSupport ? intArray : arrayBuffer],
2206 bb = new BlobBuilder();
2207 bb.append(arrayBuffer);
2208 return bb.getBlob(mimeString);
2210 if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) {
2211 if (CanvasPrototype.mozGetAsFile) {
2212 CanvasPrototype.toBlob = function (callback, type, quality) {
2213 if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) {
2214 callback(dataURLtoBlob(this.toDataURL(type, quality)));
2216 callback(this.mozGetAsFile('blob', type));
2219 } else if (CanvasPrototype.toDataURL && dataURLtoBlob) {
2220 CanvasPrototype.toBlob = function (callback, type, quality) {
2221 callback(dataURLtoBlob(this.toDataURL(type, quality)));
2226 module.exports = dataURLtoBlob;
2228 },{}],47:[function(require,module,exports){
2230 * A saveAs() FileSaver implementation.
2233 * By Eli Grey, http://eligrey.com
2235 * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
2239 /*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
2241 /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
2244 // IE 10+ (native saveAs)
2245 || (typeof navigator !== "undefined" &&
2246 navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
2248 || (function(view) {
2250 // IE <10 is explicitly unsupported
2251 if (typeof navigator !== "undefined" &&
2252 /MSIE [1-9]\./.test(navigator.userAgent)) {
2257 // only get URL when necessary in case Blob.js hasn't overridden it yet
2258 , get_URL = function() {
2259 return view.URL || view.webkitURL || view;
2261 , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
2262 , can_use_save_link = !view.externalHost && "download" in save_link
2263 , click = function(node) {
2264 var event = doc.createEvent("MouseEvents");
2265 event.initMouseEvent(
2266 "click", true, false, view, 0, 0, 0, 0, 0
2267 , false, false, false, false, 0, null
2269 node.dispatchEvent(event);
2271 , webkit_req_fs = view.webkitRequestFileSystem
2272 , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
2273 , throw_outside = function(ex) {
2274 (view.setImmediate || view.setTimeout)(function() {
2278 , force_saveable_type = "application/octet-stream"
2280 , deletion_queue = []
2281 , process_deletion_queue = function() {
2282 var i = deletion_queue.length;
2284 var file = deletion_queue[i];
2285 if (typeof file === "string") { // file is an object URL
2286 get_URL().revokeObjectURL(file);
2287 } else { // file is a File
2291 deletion_queue.length = 0; // clear queue
2293 , dispatch = function(filesaver, event_types, event) {
2294 event_types = [].concat(event_types);
2295 var i = event_types.length;
2297 var listener = filesaver["on" + event_types[i]];
2298 if (typeof listener === "function") {
2300 listener.call(filesaver, event || filesaver);
2307 , FileSaver = function(blob, name) {
2308 // First try a.download, then web filesystem, then object URLs
2312 , blob_changed = false
2315 , get_object_url = function() {
2316 var object_url = get_URL().createObjectURL(blob);
2317 deletion_queue.push(object_url);
2320 , dispatch_all = function() {
2321 dispatch(filesaver, "writestart progress write writeend".split(" "));
2323 // on any filesys errors revert to saving with object URLs
2324 , fs_error = function() {
2325 // don't create more object URLs than needed
2326 if (blob_changed || !object_url) {
2327 object_url = get_object_url(blob);
2330 target_view.location.href = object_url;
2332 window.open(object_url, "_blank");
2334 filesaver.readyState = filesaver.DONE;
2337 , abortable = function(func) {
2339 if (filesaver.readyState !== filesaver.DONE) {
2340 return func.apply(this, arguments);
2344 , create_if_not_found = {create: true, exclusive: false}
2347 filesaver.readyState = filesaver.INIT;
2351 if (can_use_save_link) {
2352 object_url = get_object_url(blob);
2353 save_link.href = object_url;
2354 save_link.download = name;
2356 filesaver.readyState = filesaver.DONE;
2360 // Object and web filesystem URLs have a problem saving in Google Chrome when
2361 // viewed in a tab, so I force save with application/octet-stream
2362 // http://code.google.com/p/chromium/issues/detail?id=91158
2363 if (view.chrome && type && type !== force_saveable_type) {
2364 slice = blob.slice || blob.webkitSlice;
2365 blob = slice.call(blob, 0, blob.size, force_saveable_type);
2366 blob_changed = true;
2368 // Since I can't be sure that the guessed media type will trigger a download
2369 // in WebKit, I append .download to the filename.
2370 // https://bugs.webkit.org/show_bug.cgi?id=65440
2371 if (webkit_req_fs && name !== "download") {
2372 name += ".download";
2374 if (type === force_saveable_type || webkit_req_fs) {
2381 fs_min_size += blob.size;
2382 req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
2383 fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
2384 var save = function() {
2385 dir.getFile(name, create_if_not_found, abortable(function(file) {
2386 file.createWriter(abortable(function(writer) {
2387 writer.onwriteend = function(event) {
2388 target_view.location.href = file.toURL();
2389 deletion_queue.push(file);
2390 filesaver.readyState = filesaver.DONE;
2391 dispatch(filesaver, "writeend", event);
2393 writer.onerror = function() {
2394 var error = writer.error;
2395 if (error.code !== error.ABORT_ERR) {
2399 "writestart progress write abort".split(" ").forEach(function(event) {
2400 writer["on" + event] = filesaver["on" + event];
2403 filesaver.abort = function() {
2405 filesaver.readyState = filesaver.DONE;
2407 filesaver.readyState = filesaver.WRITING;
2411 dir.getFile(name, {create: false}, abortable(function(file) {
2412 // delete file if it already exists
2415 }), abortable(function(ex) {
2416 if (ex.code === ex.NOT_FOUND_ERR) {
2425 , FS_proto = FileSaver.prototype
2426 , saveAs = function(blob, name) {
2427 return new FileSaver(blob, name);
2430 FS_proto.abort = function() {
2431 var filesaver = this;
2432 filesaver.readyState = filesaver.DONE;
2433 dispatch(filesaver, "abort");
2435 FS_proto.readyState = FS_proto.INIT = 0;
2436 FS_proto.WRITING = 1;
2440 FS_proto.onwritestart =
2441 FS_proto.onprogress =
2445 FS_proto.onwriteend =
2448 view.addEventListener("unload", process_deletion_queue, false);
2449 saveAs.unload = function() {
2450 process_deletion_queue();
2451 view.removeEventListener("unload", process_deletion_queue, false);
2455 typeof self !== "undefined" && self
2456 || typeof window !== "undefined" && window
2459 // `self` is undefined in Firefox for Android content script context
2460 // while `this` is nsIContentFrameMessageManager
2461 // with an attribute `content` that corresponds to the window
2463 amdDefine = window.define;
2464 if( typeof amdDefine === "undefined" && (typeof window.almond !== "undefined"
2465 && "define" in window.almond )){
2466 amdDefine = window.almond.define;
2469 if (typeof module !== "undefined" && module !== null) {
2470 module.exports = saveAs;
2471 } else if ((typeof amdDefine !== "undefined" && amdDefine !== null) && (amdDefine.amd != null)) {
2472 amdDefine("saveAs",[], function() {
2477 },{}],48:[function(require,module,exports){
2478 module.exports = function (css, customDocument) {
2479 var doc = customDocument || document;
2480 if (doc.createStyleSheet) {
2481 var sheet = doc.createStyleSheet()
2482 sheet.cssText = css;
2483 return sheet.ownerNode;
2485 var head = doc.getElementsByTagName('head')[0],
2486 style = doc.createElement('style');
2488 style.type = 'text/css';
2490 if (style.styleSheet) {
2491 style.styleSheet.cssText = css;
2493 style.appendChild(doc.createTextNode(css));
2496 head.appendChild(style);
2501 module.exports.byUrl = function(url) {
2502 if (document.createStyleSheet) {
2503 return document.createStyleSheet(url).ownerNode;
2505 var head = document.getElementsByTagName('head')[0],
2506 link = document.createElement('link');
2508 link.rel = 'stylesheet';
2511 head.appendChild(link);
2516 },{}],49:[function(require,module,exports){
2521 Remove an element and provide a function that inserts it into its original position
2522 https://developers.google.com/speed/articles/javascript-dom
2523 @param element {Element} The element to be temporarily removed
2524 @return {Function} A function that inserts the element into its original position
2527 Utils.removeToInsertLater = function(element) {
2528 var nextSibling, parentNode;
2529 parentNode = element.parentNode;
2530 nextSibling = element.nextSibling;
2531 parentNode.removeChild(element);
2534 parentNode.insertBefore(element, nextSibling);
2536 parentNode.appendChild(element);
2543 fastest possible way to destroy all sub nodes (aka childs)
2544 http://jsperf.com/innerhtml-vs-removechild/15
2545 @param element {Element} The element for which all childs should be removed
2548 Utils.removeAllChilds = function(element) {
2551 while (element.firstChild) {
2553 element.removeChild(element.firstChild);
2557 module.exports = Utils;
2559 },{}],50:[function(require,module,exports){
2561 * jBone v1.0.19 - 2014-10-12 - Library for DOM manipulation
2563 * https://github.com/kupriyanenko/jbone
2565 * Copyright 2014 Alexey Kupriyanenko
2566 * Released under the MIT license.
2572 // cache previous versions
2576 // Quick match a standalone tag
2577 rquickSingleTag = /^<(\w+)\s*\/?>$/,
2579 // A simple way to check for HTML strings
2580 // Prioritize #id over <tag> to avoid XSS via location.hash
2581 rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
2583 // Alias for function
2588 // Alias for global variables
2591 isString = function(el) {
2592 return typeof el === "string";
2594 isObject = function(el) {
2595 return el instanceof Object;
2597 isFunction = function(el) {
2599 return el && getType.toString.call(el) === "[object Function]";
2601 isArray = function(el) {
2602 return Array.isArray(el);
2604 jBone = function(element, data) {
2605 return new fn.init(element, data);
2609 // set previous values and return the instance upon calling the no-conflict mode
2610 jBone.noConflict = function() {
2617 fn = jBone.fn = jBone.prototype = {
2618 init: function(element, data) {
2619 var elements, tag, wraper, fragment;
2624 if (isString(element)) {
2625 // Create single DOM element
2626 if (tag = rquickSingleTag.exec(element)) {
2627 this[0] = doc.createElement(tag[1]);
2630 if (isObject(data)) {
2636 // Create DOM collection
2637 if ((tag = rquickExpr.exec(element)) && tag[1]) {
2638 fragment = doc.createDocumentFragment();
2639 wraper = doc.createElement("div");
2640 wraper.innerHTML = element;
2641 while (wraper.lastChild) {
2642 fragment.appendChild(wraper.firstChild);
2644 elements = slice.call(fragment.childNodes);
2646 return jBone.merge(this, elements);
2648 // Find DOM elements with querySelectorAll
2649 if (jBone.isElement(data)) {
2650 return jBone(data).find(element);
2654 elements = doc.querySelectorAll(element);
2656 return jBone.merge(this, elements);
2662 if (element.nodeType) {
2669 if (isFunction(element)) {
2672 // Return jBone element as is
2673 if (element instanceof jBone) {
2677 // Return element wrapped by jBone
2678 return jBone.makeArray(element, this);
2683 reverse: [].reverse,
2688 indexOf: [].indexOf,
2689 forEach: [].forEach,
2690 unshift: [].unshift,
2698 reduceRight: [].reduceRight,
2702 fn.constructor = jBone;
2704 fn.init.prototype = fn;
2706 jBone.setId = function(el) {
2711 } else if (el.jid === undefined) {
2712 el.jid = jid = ++jBone._cache.jid;
2715 if (!jBone._cache.events[jid]) {
2716 jBone._cache.events[jid] = {};
2720 jBone.getData = function(el) {
2721 el = el instanceof jBone ? el[0] : el;
2723 var jid = el === win ? "window" : el.jid;
2727 events: jBone._cache.events[jid]
2731 jBone.isElement = function(el) {
2732 return el && el instanceof jBone || el instanceof HTMLElement || isString(el);
2740 function isArraylike(obj) {
2741 var length = obj.length,
2744 if (isFunction(type) || obj === win) {
2748 if (obj.nodeType === 1 && length) {
2752 return isArray(type) || length === 0 ||
2753 typeof length === "number" && length > 0 && (length - 1) in obj;
2756 jBone.merge = function(first, second) {
2757 var l = second.length,
2762 first[i++] = second[j++];
2770 jBone.contains = function(container, contained) {
2773 container.reverse().some(function(el) {
2774 if (el.contains(contained)) {
2782 jBone.extend = function(target) {
2785 splice.call(arguments, 1).forEach(function(object) {
2793 tg = target; //caching target for perf improvement
2795 for (; i < kl; i++) {
2796 tg[k[i]] = object[k[i]];
2803 jBone.makeArray = function(arr, results) {
2804 var ret = results || [];
2807 if (isArraylike(arr)) {
2808 jBone.merge(ret, isString(arr) ? [arr] : arr);
2817 function BoneEvent(e, data) {
2820 this.originalEvent = e;
2822 setter = function(key, e) {
2823 if (key === "preventDefault") {
2824 this[key] = function() {
2825 this.defaultPrevented = true;
2828 } else if (isFunction(e[key])) {
2829 this[key] = function() {
2838 if (e[key] || typeof e[key] === "function") {
2839 setter.call(this, key, e);
2843 jBone.extend(this, data);
2846 jBone.Event = function(event, data) {
2847 var namespace, eventType;
2849 if (event.type && !data) {
2854 namespace = event.split(".").splice(1).join(".");
2855 eventType = event.split(".")[0];
2857 event = doc.createEvent("Event");
2858 event.initEvent(eventType, true, true);
2860 return jBone.extend(event, {
2861 namespace: namespace,
2862 isDefaultPrevented: function() {
2863 return event.defaultPrevented;
2868 fn.on = function(event) {
2869 var args = arguments,
2870 length = this.length,
2872 callback, target, namespace, fn, events, eventType, expectedTarget, addListener;
2874 if (args.length === 2) {
2881 addListener = function(el) {
2883 events = jBone.getData(el).events;
2884 event.split(" ").forEach(function(event) {
2885 eventType = event.split(".")[0];
2886 namespace = event.split(".").splice(1).join(".");
2887 events[eventType] = events[eventType] || [];
2890 if (e.namespace && e.namespace !== namespace) {
2894 expectedTarget = null;
2896 callback.call(el, e);
2897 } else if (~jBone(el).find(target).indexOf(e.target) || (expectedTarget = jBone.contains(jBone(el).find(target), e.target))) {
2898 expectedTarget = expectedTarget || e.target;
2899 e = new BoneEvent(e, {
2900 currentTarget: expectedTarget
2903 callback.call(expectedTarget, e);
2907 events[eventType].push({
2908 namespace: namespace,
2913 el.addEventListener && el.addEventListener(eventType, fn, false);
2917 for (; i < length; i++) {
2918 addListener(this[i]);
2924 fn.one = function(event) {
2925 var args = arguments,
2927 length = this.length,
2928 callback, target, addListener;
2930 if (args.length === 2) {
2933 target = args[1], callback = args[2];
2936 addListener = function(el) {
2937 event.split(" ").forEach(function(event) {
2938 var fn = function(e) {
2939 jBone(el).off(event, fn);
2940 callback.call(el, e);
2944 jBone(el).on(event, fn);
2946 jBone(el).on(event, target, fn);
2951 for (; i < length; i++) {
2952 addListener(this[i]);
2958 fn.trigger = function(event) {
2961 length = this.length,
2968 if (isString(event)) {
2969 events = event.split(" ").map(function(event) {
2970 return jBone.Event(event);
2973 event = event instanceof Event ? event : jBone.Event(event);
2977 dispatchEvents = function(el) {
2978 events.forEach(function(event) {
2983 el.dispatchEvent && el.dispatchEvent(event);
2987 for (; i < length; i++) {
2988 dispatchEvents(this[i]);
2994 fn.off = function(event, fn) {
2996 length = this.length,
2997 removeListener = function(events, eventType, index, el, e) {
3001 if ((fn && e.originfn === fn) || !fn) {
3005 if (events[eventType][index].fn === callback) {
3006 el.removeEventListener(eventType, callback);
3008 // remove handler from cache
3009 jBone._cache.events[jBone.getData(el).jid][eventType].splice(index, 1);
3012 events, namespace, removeListeners, eventType;
3014 removeListeners = function(el) {
3015 var l, eventsByType, e;
3017 events = jBone.getData(el).events;
3023 // remove all events
3024 if (!event && events) {
3025 return keys(events).forEach(function(eventType) {
3026 eventsByType = events[eventType];
3027 l = eventsByType.length;
3030 removeListener(events, eventType, l, el, eventsByType[l]);
3035 event.split(" ").forEach(function(event) {
3036 eventType = event.split(".")[0];
3037 namespace = event.split(".").splice(1).join(".");
3039 // remove named events
3040 if (events[eventType]) {
3041 eventsByType = events[eventType];
3042 l = eventsByType.length;
3045 e = eventsByType[l];
3046 if (!namespace || (namespace && e.namespace === namespace)) {
3047 removeListener(events, eventType, l, el, e);
3051 // remove all namespaced events
3052 else if (namespace) {
3053 keys(events).forEach(function(eventType) {
3054 eventsByType = events[eventType];
3055 l = eventsByType.length;
3058 e = eventsByType[l];
3059 if (e.namespace.split(".")[0] === namespace.split(".")[0]) {
3060 removeListener(events, eventType, l, el, e);
3068 for (; i < length; i++) {
3069 removeListeners(this[i]);
3075 fn.find = function(selector) {
3078 length = this.length,
3079 finder = function(el) {
3080 if (isFunction(el.querySelectorAll)) {
3081 [].forEach.call(el.querySelectorAll(selector), function(found) {
3082 results.push(found);
3087 for (; i < length; i++) {
3091 return jBone(results);
3094 fn.get = function(index) {
3098 fn.eq = function(index) {
3099 return jBone(this[index]);
3102 fn.parent = function() {
3106 length = this.length;
3108 for (; i < length; i++) {
3109 if (!~results.indexOf(parent = this[i].parentElement) && parent) {
3110 results.push(parent);
3114 return jBone(results);
3117 fn.toArray = function() {
3118 return slice.call(this);
3121 fn.is = function() {
3122 var args = arguments;
3124 return this.some(function(el) {
3125 return el.tagName.toLowerCase() === args[0];
3129 fn.has = function() {
3130 var args = arguments;
3132 return this.some(function(el) {
3133 return el.querySelectorAll(args[0]).length;
3137 fn.attr = function(key, value) {
3138 var args = arguments,
3140 length = this.length,
3143 if (isString(key) && args.length === 1) {
3144 return this[0] && this[0].getAttribute(key);
3147 if (args.length === 2) {
3148 setter = function(el) {
3149 el.setAttribute(key, value);
3151 } else if (isObject(key)) {
3152 setter = function(el) {
3153 keys(key).forEach(function(name) {
3154 el.setAttribute(name, key[name]);
3159 for (; i < length; i++) {
3166 fn.removeAttr = function(key) {
3168 length = this.length;
3170 for (; i < length; i++) {
3171 this[i].removeAttribute(key);
3177 fn.val = function(value) {
3179 length = this.length;
3181 if (arguments.length === 0) {
3182 return this[0] && this[0].value;
3185 for (; i < length; i++) {
3186 this[i].value = value;
3192 fn.css = function(key, value) {
3193 var args = arguments,
3195 length = this.length,
3199 if (isString(key) && args.length === 1) {
3200 return this[0] && win.getComputedStyle(this[0])[key];
3204 if (args.length === 2) {
3205 setter = function(el) {
3206 el.style[key] = value;
3208 } else if (isObject(key)) {
3209 setter = function(el) {
3210 keys(key).forEach(function(name) {
3211 el.style[name] = key[name];
3216 for (; i < length; i++) {
3223 fn.data = function(key, value) {
3224 var args = arguments, data = {},
3226 length = this.length,
3228 setValue = function(el, key, value) {
3229 if (isObject(value)) {
3230 el.jdata = el.jdata || {};
3231 el.jdata[key] = value;
3233 el.dataset[key] = value;
3236 getValue = function(value) {
3237 if (value === "true") {
3239 } else if (value === "false") {
3247 if (args.length === 0) {
3248 this[0].jdata && (data = this[0].jdata);
3250 keys(this[0].dataset).forEach(function(key) {
3251 data[key] = getValue(this[0].dataset[key]);
3257 if (args.length === 1 && isString(key)) {
3258 return this[0] && getValue(this[0].dataset[key] || this[0].jdata && this[0].jdata[key]);
3262 if (args.length === 1 && isObject(key)) {
3263 setter = function(el) {
3264 keys(key).forEach(function(name) {
3265 setValue(el, name, key[name]);
3268 } else if (args.length === 2) {
3269 setter = function(el) {
3270 setValue(el, key, value);
3274 for (; i < length; i++) {
3281 fn.removeData = function(key) {
3283 length = this.length,
3286 for (; i < length; i++) {
3287 jdata = this[i].jdata;
3288 dataset = this[i].dataset;
3291 jdata && jdata[key] && delete jdata[key];
3292 delete dataset[key];
3294 for (key in jdata) {
3298 for (key in dataset) {
3299 delete dataset[key];
3307 fn.html = function(value) {
3308 var args = arguments,
3311 // add HTML into elements
3312 if (args.length === 1 && value !== undefined) {
3313 return this.empty().append(value);
3315 // get HTML from element
3316 else if (args.length === 0 && (el = this[0])) {
3317 return el.innerHTML;
3323 fn.append = function(appended) {
3325 length = this.length,
3328 // create jBone object and then append
3329 if (isString(appended) && rquickExpr.exec(appended)) {
3330 appended = jBone(appended);
3332 // create text node for inserting
3333 else if (!isObject(appended)) {
3334 appended = document.createTextNode(appended);
3337 appended = appended instanceof jBone ? appended : jBone(appended);
3339 setter = function(el, i) {
3340 appended.forEach(function(node) {
3342 el.appendChild(node.cloneNode());
3344 el.appendChild(node);
3349 for (; i < length; i++) {
3356 fn.appendTo = function(to) {
3357 jBone(to).append(this);
3362 fn.empty = function() {
3364 length = this.length,
3367 for (; i < length; i++) {
3370 while (el.lastChild) {
3371 el.removeChild(el.lastChild);
3378 fn.remove = function() {
3380 length = this.length,
3383 // remove all listners
3386 for (; i < length; i++) {
3389 // remove data and nodes
3391 el.parentNode && el.parentNode.removeChild(el);
3397 if (typeof module === "object" && module && typeof module.exports === "object") {
3398 // Expose jBone as module.exports in loaders that implement the Node
3399 // module pattern (including browserify). Do not create the global, since
3400 // the user will be storing it themselves locally, and globals are frowned
3401 // upon in the Node module world.
3402 module.exports = jBone;
3404 // Register as a AMD module
3405 else if (typeof define === "function" && define.amd) {
3410 win.jBone = win.$ = jBone;
3411 } else if (typeof win === "object" && typeof win.document === "object") {
3412 win.jBone = win.$ = jBone;
3417 },{}],51:[function(require,module,exports){
3420 module.exports = Mouse = {
3422 var mouseX, mouseY, rect, target;
3425 if (mouseX == null) {
3426 rect = target.getBoundingClientRect();
3427 target = e.target || e.srcElement;
3428 if (mouseX == null) {
3429 mouseX = e.clientX - rect.left;
3430 mouseY = e.clientY - rect.top;
3432 if (mouseX == null) {
3433 mouseX = e.pageX - target.offsetLeft;
3434 mouseY = e.pageY - target.offsetTop;
3436 if (mouseX == null) {
3437 console.log(e, "no mouse event defined. your browser sucks");
3441 return [mouseX, mouseY];
3447 if (mouseX == null) {
3451 if (mouseX == null) {
3455 if (mouseX == null) {
3459 return [mouseX, mouseY];
3461 wheelDelta: function(e) {
3463 delta = [e.deltaX, e.deltaY];
3464 if (delta[0] == null) {
3465 dir = Math.floor(e.detail / 3);
3466 delta = [0, e.mozMovementX * dir];
3472 },{}],52:[function(require,module,exports){
3473 var window = require("global/window")
3474 var once = require("once")
3475 var parseHeaders = require('parse-headers')
3478 "0": "Internal XMLHttpRequest Error",
3479 "4": "4xx Client Error",
3480 "5": "5xx Server Error"
3483 var XHR = window.XMLHttpRequest || noop
3484 var XDR = "withCredentials" in (new XHR()) ? XHR : window.XDomainRequest
3486 module.exports = createXHR
3488 function createXHR(options, callback) {
3489 if (typeof options === "string") {
3490 options = { uri: options }
3493 options = options || {}
3494 callback = once(callback)
3496 var xhr = options.xhr || null
3499 if (options.cors || options.useXDR) {
3506 var uri = xhr.url = options.uri || options.url
3507 var method = xhr.method = options.method || "GET"
3508 var body = options.body || options.data
3509 var headers = xhr.headers = options.headers || {}
3510 var sync = !!options.sync
3513 var load = options.response ? loadResponse : loadXhr
3515 if ("json" in options) {
3517 headers["Accept"] = "application/json"
3518 if (method !== "GET" && method !== "HEAD") {
3519 headers["Content-Type"] = "application/json"
3520 body = JSON.stringify(options.json)
3524 xhr.onreadystatechange = readystatechange
3527 // IE9 must have onprogress be set to a unique function.
3528 xhr.onprogress = function () {
3532 xhr.ontimeout = noop
3533 xhr.open(method, uri, !sync)
3534 //backward compatibility
3535 if (options.withCredentials || (options.cors && options.withCredentials !== false)) {
3536 xhr.withCredentials = true
3539 // Cannot set timeout with sync request
3541 xhr.timeout = "timeout" in options ? options.timeout : 5000
3544 if (xhr.setRequestHeader) {
3545 for(key in headers){
3546 if(headers.hasOwnProperty(key)){
3547 xhr.setRequestHeader(key, headers[key])
3550 } else if (options.headers) {
3551 throw new Error("Headers cannot be set on an XDomainRequest object")
3554 if ("responseType" in options) {
3555 xhr.responseType = options.responseType
3558 if ("beforeSend" in options &&
3559 typeof options.beforeSend === "function"
3561 options.beforeSend(xhr)
3568 function readystatechange() {
3569 if (xhr.readyState === 4) {
3574 function getBody() {
3575 // Chrome with requestType=blob throws errors arround when even testing access to responseText
3580 } else if (xhr.responseType === 'text' || !xhr.responseType) {
3581 body = xhr.responseText || xhr.responseXML
3586 body = JSON.parse(body)
3593 function getStatusCode() {
3594 return xhr.status === 1223 ? 204 : xhr.status
3597 // if we're getting a none-ok statusCode, build & return an error
3598 function errorFromStatusCode(status) {
3600 if (status === 0 || (status >= 400 && status < 600)) {
3601 var message = (typeof body === "string" ? body : false) ||
3602 messages[String(status).charAt(0)]
3603 error = new Error(message)
3604 error.statusCode = status
3610 // will load the data & process the response in a special response object
3611 function loadResponse() {
3612 var status = getStatusCode()
3613 var error = errorFromStatusCode(status)
3617 statusText: xhr.statusText,
3620 if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE
3621 response.headers = parseHeaders(xhr.getAllResponseHeaders())
3623 response.headers = {}
3626 callback(error, response, response.body)
3629 // will load the data and add some response properties to the source xhr
3630 // and then respond with that
3631 function loadXhr() {
3632 var status = getStatusCode()
3633 var error = errorFromStatusCode(status)
3635 xhr.status = xhr.statusCode = status
3636 xhr.body = getBody()
3637 xhr.headers = parseHeaders(xhr.getAllResponseHeaders())
3639 callback(error, xhr, xhr.body)
3642 function error(evt) {
3650 },{"global/window":53,"once":54,"parse-headers":58}],53:[function(require,module,exports){
3652 if (typeof window !== "undefined") {
3653 module.exports = window;
3654 } else if (typeof global !== "undefined") {
3655 module.exports = global;
3656 } else if (typeof self !== "undefined"){
3657 module.exports = self;
3659 module.exports = {};
3662 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
3663 },{}],54:[function(require,module,exports){
3664 module.exports = once
3666 once.proto = once(function () {
3667 Object.defineProperty(Function.prototype, 'once', {
3668 value: function () {
3675 function once (fn) {
3677 return function () {
3680 return fn.apply(this, arguments)
3684 },{}],55:[function(require,module,exports){
3685 var isFunction = require('is-function')
3687 module.exports = forEach
3689 var toString = Object.prototype.toString
3690 var hasOwnProperty = Object.prototype.hasOwnProperty
3692 function forEach(list, iterator, context) {
3693 if (!isFunction(iterator)) {
3694 throw new TypeError('iterator must be a function')
3697 if (arguments.length < 3) {
3701 if (toString.call(list) === '[object Array]')
3702 forEachArray(list, iterator, context)
3703 else if (typeof list === 'string')
3704 forEachString(list, iterator, context)
3706 forEachObject(list, iterator, context)
3709 function forEachArray(array, iterator, context) {
3710 for (var i = 0, len = array.length; i < len; i++) {
3711 if (hasOwnProperty.call(array, i)) {
3712 iterator.call(context, array[i], i, array)
3717 function forEachString(string, iterator, context) {
3718 for (var i = 0, len = string.length; i < len; i++) {
3719 // no such thing as a sparse string.
3720 iterator.call(context, string.charAt(i), i, string)
3724 function forEachObject(object, iterator, context) {
3725 for (var k in object) {
3726 if (hasOwnProperty.call(object, k)) {
3727 iterator.call(context, object[k], k, object)
3732 },{"is-function":56}],56:[function(require,module,exports){
3733 module.exports = isFunction
3735 var toString = Object.prototype.toString
3737 function isFunction (fn) {
3738 var string = toString.call(fn)
3739 return string === '[object Function]' ||
3740 (typeof fn === 'function' && string !== '[object RegExp]') ||
3741 (typeof window !== 'undefined' &&
3743 (fn === window.setTimeout ||
3744 fn === window.alert ||
3745 fn === window.confirm ||
3746 fn === window.prompt))
3749 },{}],57:[function(require,module,exports){
3751 exports = module.exports = trim;
3754 return str.replace(/^\s*|\s*$/g, '');
3757 exports.left = function(str){
3758 return str.replace(/^\s*/, '');
3761 exports.right = function(str){
3762 return str.replace(/\s*$/, '');
3765 },{}],58:[function(require,module,exports){
3766 var trim = require('trim')
3767 , forEach = require('for-each')
3768 , isArray = function(arg) {
3769 return Object.prototype.toString.call(arg) === '[object Array]';
3772 module.exports = function (headers) {
3779 trim(headers).split('\n')
3781 var index = row.indexOf(':')
3782 , key = trim(row.slice(0, index)).toLowerCase()
3783 , value = trim(row.slice(index + 1))
3785 if (typeof(result[key]) === 'undefined') {
3787 } else if (isArray(result[key])) {
3788 result[key].push(value)
3790 result[key] = [ result[key], value ]
3797 },{"for-each":55,"trim":57}],59:[function(require,module,exports){
3798 // Underscore.js 1.7.0
3799 // http://underscorejs.org
3800 // (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
3801 // Underscore may be freely distributed under the MIT license.
3808 // Establish the root object, `window` in the browser, or `exports` on the server.
3811 // Save the previous value of the `_` variable.
3812 var previousUnderscore = root._;
3814 // Save bytes in the minified (but not gzipped) version:
3815 var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
3817 // Create quick reference variables for speed access to core prototypes.
3819 push = ArrayProto.push,
3820 slice = ArrayProto.slice,
3821 concat = ArrayProto.concat,
3822 toString = ObjProto.toString,
3823 hasOwnProperty = ObjProto.hasOwnProperty;
3825 // All **ECMAScript 5** native function implementations that we hope to use
3826 // are declared here.
3828 nativeIsArray = Array.isArray,
3829 nativeKeys = Object.keys,
3830 nativeBind = FuncProto.bind;
3832 // Create a safe reference to the Underscore object for use below.
3833 var _ = function(obj) {
3834 if (obj instanceof _) return obj;
3835 if (!(this instanceof _)) return new _(obj);
3836 this._wrapped = obj;
3839 // Export the Underscore object for **Node.js**, with
3840 // backwards-compatibility for the old `require()` API. If we're in
3841 // the browser, add `_` as a global object.
3842 if (typeof exports !== 'undefined') {
3843 if (typeof module !== 'undefined' && module.exports) {
3844 exports = module.exports = _;
3852 _.VERSION = '1.7.0';
3854 // Internal function that returns an efficient (for current engines) version
3855 // of the passed-in callback, to be repeatedly applied in other Underscore
3857 var createCallback = function(func, context, argCount) {
3858 if (context === void 0) return func;
3859 switch (argCount == null ? 3 : argCount) {
3860 case 1: return function(value) {
3861 return func.call(context, value);
3863 case 2: return function(value, other) {
3864 return func.call(context, value, other);
3866 case 3: return function(value, index, collection) {
3867 return func.call(context, value, index, collection);
3869 case 4: return function(accumulator, value, index, collection) {
3870 return func.call(context, accumulator, value, index, collection);
3874 return func.apply(context, arguments);
3878 // A mostly-internal function to generate callbacks that can be applied
3879 // to each element in a collection, returning the desired result — either
3880 // identity, an arbitrary callback, a property matcher, or a property accessor.
3881 _.iteratee = function(value, context, argCount) {
3882 if (value == null) return _.identity;
3883 if (_.isFunction(value)) return createCallback(value, context, argCount);
3884 if (_.isObject(value)) return _.matches(value);
3885 return _.property(value);
3888 // Collection Functions
3889 // --------------------
3891 // The cornerstone, an `each` implementation, aka `forEach`.
3892 // Handles raw objects in addition to array-likes. Treats all
3893 // sparse array-likes as if they were dense.
3894 _.each = _.forEach = function(obj, iteratee, context) {
3895 if (obj == null) return obj;
3896 iteratee = createCallback(iteratee, context);
3897 var i, length = obj.length;
3898 if (length === +length) {
3899 for (i = 0; i < length; i++) {
3900 iteratee(obj[i], i, obj);
3903 var keys = _.keys(obj);
3904 for (i = 0, length = keys.length; i < length; i++) {
3905 iteratee(obj[keys[i]], keys[i], obj);
3911 // Return the results of applying the iteratee to each element.
3912 _.map = _.collect = function(obj, iteratee, context) {
3913 if (obj == null) return [];
3914 iteratee = _.iteratee(iteratee, context);
3915 var keys = obj.length !== +obj.length && _.keys(obj),
3916 length = (keys || obj).length,
3917 results = Array(length),
3919 for (var index = 0; index < length; index++) {
3920 currentKey = keys ? keys[index] : index;
3921 results[index] = iteratee(obj[currentKey], currentKey, obj);
3926 var reduceError = 'Reduce of empty array with no initial value';
3928 // **Reduce** builds up a single result from a list of values, aka `inject`,
3930 _.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) {
3931 if (obj == null) obj = [];
3932 iteratee = createCallback(iteratee, context, 4);
3933 var keys = obj.length !== +obj.length && _.keys(obj),
3934 length = (keys || obj).length,
3935 index = 0, currentKey;
3936 if (arguments.length < 3) {
3937 if (!length) throw new TypeError(reduceError);
3938 memo = obj[keys ? keys[index++] : index++];
3940 for (; index < length; index++) {
3941 currentKey = keys ? keys[index] : index;
3942 memo = iteratee(memo, obj[currentKey], currentKey, obj);
3947 // The right-associative version of reduce, also known as `foldr`.
3948 _.reduceRight = _.foldr = function(obj, iteratee, memo, context) {
3949 if (obj == null) obj = [];
3950 iteratee = createCallback(iteratee, context, 4);
3951 var keys = obj.length !== + obj.length && _.keys(obj),
3952 index = (keys || obj).length,
3954 if (arguments.length < 3) {
3955 if (!index) throw new TypeError(reduceError);
3956 memo = obj[keys ? keys[--index] : --index];
3959 currentKey = keys ? keys[index] : index;
3960 memo = iteratee(memo, obj[currentKey], currentKey, obj);
3965 // Return the first value which passes a truth test. Aliased as `detect`.
3966 _.find = _.detect = function(obj, predicate, context) {
3968 predicate = _.iteratee(predicate, context);
3969 _.some(obj, function(value, index, list) {
3970 if (predicate(value, index, list)) {
3978 // Return all the elements that pass a truth test.
3979 // Aliased as `select`.
3980 _.filter = _.select = function(obj, predicate, context) {
3982 if (obj == null) return results;
3983 predicate = _.iteratee(predicate, context);
3984 _.each(obj, function(value, index, list) {
3985 if (predicate(value, index, list)) results.push(value);
3990 // Return all the elements for which a truth test fails.
3991 _.reject = function(obj, predicate, context) {
3992 return _.filter(obj, _.negate(_.iteratee(predicate)), context);
3995 // Determine whether all of the elements match a truth test.
3996 // Aliased as `all`.
3997 _.every = _.all = function(obj, predicate, context) {
3998 if (obj == null) return true;
3999 predicate = _.iteratee(predicate, context);
4000 var keys = obj.length !== +obj.length && _.keys(obj),
4001 length = (keys || obj).length,
4003 for (index = 0; index < length; index++) {
4004 currentKey = keys ? keys[index] : index;
4005 if (!predicate(obj[currentKey], currentKey, obj)) return false;
4010 // Determine if at least one element in the object matches a truth test.
4011 // Aliased as `any`.
4012 _.some = _.any = function(obj, predicate, context) {
4013 if (obj == null) return false;
4014 predicate = _.iteratee(predicate, context);
4015 var keys = obj.length !== +obj.length && _.keys(obj),
4016 length = (keys || obj).length,
4018 for (index = 0; index < length; index++) {
4019 currentKey = keys ? keys[index] : index;
4020 if (predicate(obj[currentKey], currentKey, obj)) return true;
4025 // Determine if the array or object contains a given value (using `===`).
4026 // Aliased as `include`.
4027 _.contains = _.include = function(obj, target) {
4028 if (obj == null) return false;
4029 if (obj.length !== +obj.length) obj = _.values(obj);
4030 return _.indexOf(obj, target) >= 0;
4033 // Invoke a method (with arguments) on every item in a collection.
4034 _.invoke = function(obj, method) {
4035 var args = slice.call(arguments, 2);
4036 var isFunc = _.isFunction(method);
4037 return _.map(obj, function(value) {
4038 return (isFunc ? method : value[method]).apply(value, args);
4042 // Convenience version of a common use case of `map`: fetching a property.
4043 _.pluck = function(obj, key) {
4044 return _.map(obj, _.property(key));
4047 // Convenience version of a common use case of `filter`: selecting only objects
4048 // containing specific `key:value` pairs.
4049 _.where = function(obj, attrs) {
4050 return _.filter(obj, _.matches(attrs));
4053 // Convenience version of a common use case of `find`: getting the first object
4054 // containing specific `key:value` pairs.
4055 _.findWhere = function(obj, attrs) {
4056 return _.find(obj, _.matches(attrs));
4059 // Return the maximum element (or element-based computation).
4060 _.max = function(obj, iteratee, context) {
4061 var result = -Infinity, lastComputed = -Infinity,
4063 if (iteratee == null && obj != null) {
4064 obj = obj.length === +obj.length ? obj : _.values(obj);
4065 for (var i = 0, length = obj.length; i < length; i++) {
4067 if (value > result) {
4072 iteratee = _.iteratee(iteratee, context);
4073 _.each(obj, function(value, index, list) {
4074 computed = iteratee(value, index, list);
4075 if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
4077 lastComputed = computed;
4084 // Return the minimum element (or element-based computation).
4085 _.min = function(obj, iteratee, context) {
4086 var result = Infinity, lastComputed = Infinity,
4088 if (iteratee == null && obj != null) {
4089 obj = obj.length === +obj.length ? obj : _.values(obj);
4090 for (var i = 0, length = obj.length; i < length; i++) {
4092 if (value < result) {
4097 iteratee = _.iteratee(iteratee, context);
4098 _.each(obj, function(value, index, list) {
4099 computed = iteratee(value, index, list);
4100 if (computed < lastComputed || computed === Infinity && result === Infinity) {
4102 lastComputed = computed;
4109 // Shuffle a collection, using the modern version of the
4110 // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
4111 _.shuffle = function(obj) {
4112 var set = obj && obj.length === +obj.length ? obj : _.values(obj);
4113 var length = set.length;
4114 var shuffled = Array(length);
4115 for (var index = 0, rand; index < length; index++) {
4116 rand = _.random(0, index);
4117 if (rand !== index) shuffled[index] = shuffled[rand];
4118 shuffled[rand] = set[index];
4123 // Sample **n** random values from a collection.
4124 // If **n** is not specified, returns a single random element.
4125 // The internal `guard` argument allows it to work with `map`.
4126 _.sample = function(obj, n, guard) {
4127 if (n == null || guard) {
4128 if (obj.length !== +obj.length) obj = _.values(obj);
4129 return obj[_.random(obj.length - 1)];
4131 return _.shuffle(obj).slice(0, Math.max(0, n));
4134 // Sort the object's values by a criterion produced by an iteratee.
4135 _.sortBy = function(obj, iteratee, context) {
4136 iteratee = _.iteratee(iteratee, context);
4137 return _.pluck(_.map(obj, function(value, index, list) {
4141 criteria: iteratee(value, index, list)
4143 }).sort(function(left, right) {
4144 var a = left.criteria;
4145 var b = right.criteria;
4147 if (a > b || a === void 0) return 1;
4148 if (a < b || b === void 0) return -1;
4150 return left.index - right.index;
4154 // An internal function used for aggregate "group by" operations.
4155 var group = function(behavior) {
4156 return function(obj, iteratee, context) {
4158 iteratee = _.iteratee(iteratee, context);
4159 _.each(obj, function(value, index) {
4160 var key = iteratee(value, index, obj);
4161 behavior(result, value, key);
4167 // Groups the object's values by a criterion. Pass either a string attribute
4168 // to group by, or a function that returns the criterion.
4169 _.groupBy = group(function(result, value, key) {
4170 if (_.has(result, key)) result[key].push(value); else result[key] = [value];
4173 // Indexes the object's values by a criterion, similar to `groupBy`, but for
4174 // when you know that your index values will be unique.
4175 _.indexBy = group(function(result, value, key) {
4176 result[key] = value;
4179 // Counts instances of an object that group by a certain criterion. Pass
4180 // either a string attribute to count by, or a function that returns the
4182 _.countBy = group(function(result, value, key) {
4183 if (_.has(result, key)) result[key]++; else result[key] = 1;
4186 // Use a comparator function to figure out the smallest index at which
4187 // an object should be inserted so as to maintain order. Uses binary search.
4188 _.sortedIndex = function(array, obj, iteratee, context) {
4189 iteratee = _.iteratee(iteratee, context, 1);
4190 var value = iteratee(obj);
4191 var low = 0, high = array.length;
4192 while (low < high) {
4193 var mid = low + high >>> 1;
4194 if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
4199 // Safely create a real, live array from anything iterable.
4200 _.toArray = function(obj) {
4201 if (!obj) return [];
4202 if (_.isArray(obj)) return slice.call(obj);
4203 if (obj.length === +obj.length) return _.map(obj, _.identity);
4204 return _.values(obj);
4207 // Return the number of elements in an object.
4208 _.size = function(obj) {
4209 if (obj == null) return 0;
4210 return obj.length === +obj.length ? obj.length : _.keys(obj).length;
4213 // Split a collection into two arrays: one whose elements all satisfy the given
4214 // predicate, and one whose elements all do not satisfy the predicate.
4215 _.partition = function(obj, predicate, context) {
4216 predicate = _.iteratee(predicate, context);
4217 var pass = [], fail = [];
4218 _.each(obj, function(value, key, obj) {
4219 (predicate(value, key, obj) ? pass : fail).push(value);
4221 return [pass, fail];
4227 // Get the first element of an array. Passing **n** will return the first N
4228 // values in the array. Aliased as `head` and `take`. The **guard** check
4229 // allows it to work with `_.map`.
4230 _.first = _.head = _.take = function(array, n, guard) {
4231 if (array == null) return void 0;
4232 if (n == null || guard) return array[0];
4233 if (n < 0) return [];
4234 return slice.call(array, 0, n);
4237 // Returns everything but the last entry of the array. Especially useful on
4238 // the arguments object. Passing **n** will return all the values in
4239 // the array, excluding the last N. The **guard** check allows it to work with
4241 _.initial = function(array, n, guard) {
4242 return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
4245 // Get the last element of an array. Passing **n** will return the last N
4246 // values in the array. The **guard** check allows it to work with `_.map`.
4247 _.last = function(array, n, guard) {
4248 if (array == null) return void 0;
4249 if (n == null || guard) return array[array.length - 1];
4250 return slice.call(array, Math.max(array.length - n, 0));
4253 // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
4254 // Especially useful on the arguments object. Passing an **n** will return
4255 // the rest N values in the array. The **guard**
4256 // check allows it to work with `_.map`.
4257 _.rest = _.tail = _.drop = function(array, n, guard) {
4258 return slice.call(array, n == null || guard ? 1 : n);
4261 // Trim out all falsy values from an array.
4262 _.compact = function(array) {
4263 return _.filter(array, _.identity);
4266 // Internal implementation of a recursive `flatten` function.
4267 var flatten = function(input, shallow, strict, output) {
4268 if (shallow && _.every(input, _.isArray)) {
4269 return concat.apply(output, input);
4271 for (var i = 0, length = input.length; i < length; i++) {
4272 var value = input[i];
4273 if (!_.isArray(value) && !_.isArguments(value)) {
4274 if (!strict) output.push(value);
4275 } else if (shallow) {
4276 push.apply(output, value);
4278 flatten(value, shallow, strict, output);
4284 // Flatten out an array, either recursively (by default), or just one level.
4285 _.flatten = function(array, shallow) {
4286 return flatten(array, shallow, false, []);
4289 // Return a version of the array that does not contain the specified value(s).
4290 _.without = function(array) {
4291 return _.difference(array, slice.call(arguments, 1));
4294 // Produce a duplicate-free version of the array. If the array has already
4295 // been sorted, you have the option of using a faster algorithm.
4296 // Aliased as `unique`.
4297 _.uniq = _.unique = function(array, isSorted, iteratee, context) {
4298 if (array == null) return [];
4299 if (!_.isBoolean(isSorted)) {
4301 iteratee = isSorted;
4304 if (iteratee != null) iteratee = _.iteratee(iteratee, context);
4307 for (var i = 0, length = array.length; i < length; i++) {
4308 var value = array[i];
4310 if (!i || seen !== value) result.push(value);
4312 } else if (iteratee) {
4313 var computed = iteratee(value, i, array);
4314 if (_.indexOf(seen, computed) < 0) {
4315 seen.push(computed);
4318 } else if (_.indexOf(result, value) < 0) {
4325 // Produce an array that contains the union: each distinct element from all of
4326 // the passed-in arrays.
4327 _.union = function() {
4328 return _.uniq(flatten(arguments, true, true, []));
4331 // Produce an array that contains every item shared between all the
4332 // passed-in arrays.
4333 _.intersection = function(array) {
4334 if (array == null) return [];
4336 var argsLength = arguments.length;
4337 for (var i = 0, length = array.length; i < length; i++) {
4338 var item = array[i];
4339 if (_.contains(result, item)) continue;
4340 for (var j = 1; j < argsLength; j++) {
4341 if (!_.contains(arguments[j], item)) break;
4343 if (j === argsLength) result.push(item);
4348 // Take the difference between one array and a number of other arrays.
4349 // Only the elements present in just the first array will remain.
4350 _.difference = function(array) {
4351 var rest = flatten(slice.call(arguments, 1), true, true, []);
4352 return _.filter(array, function(value){
4353 return !_.contains(rest, value);
4357 // Zip together multiple lists into a single array -- elements that share
4358 // an index go together.
4359 _.zip = function(array) {
4360 if (array == null) return [];
4361 var length = _.max(arguments, 'length').length;
4362 var results = Array(length);
4363 for (var i = 0; i < length; i++) {
4364 results[i] = _.pluck(arguments, i);
4369 // Converts lists into objects. Pass either a single array of `[key, value]`
4370 // pairs, or two parallel arrays of the same length -- one of keys, and one of
4371 // the corresponding values.
4372 _.object = function(list, values) {
4373 if (list == null) return {};
4375 for (var i = 0, length = list.length; i < length; i++) {
4377 result[list[i]] = values[i];
4379 result[list[i][0]] = list[i][1];
4385 // Return the position of the first occurrence of an item in an array,
4386 // or -1 if the item is not included in the array.
4387 // If the array is large and already in sort order, pass `true`
4388 // for **isSorted** to use binary search.
4389 _.indexOf = function(array, item, isSorted) {
4390 if (array == null) return -1;
4391 var i = 0, length = array.length;
4393 if (typeof isSorted == 'number') {
4394 i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
4396 i = _.sortedIndex(array, item);
4397 return array[i] === item ? i : -1;
4400 for (; i < length; i++) if (array[i] === item) return i;
4404 _.lastIndexOf = function(array, item, from) {
4405 if (array == null) return -1;
4406 var idx = array.length;
4407 if (typeof from == 'number') {
4408 idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
4410 while (--idx >= 0) if (array[idx] === item) return idx;
4414 // Generate an integer Array containing an arithmetic progression. A port of
4415 // the native Python `range()` function. See
4416 // [the Python documentation](http://docs.python.org/library/functions.html#range).
4417 _.range = function(start, stop, step) {
4418 if (arguments.length <= 1) {
4424 var length = Math.max(Math.ceil((stop - start) / step), 0);
4425 var range = Array(length);
4427 for (var idx = 0; idx < length; idx++, start += step) {
4434 // Function (ahem) Functions
4435 // ------------------
4437 // Reusable constructor function for prototype setting.
4438 var Ctor = function(){};
4440 // Create a function bound to a given object (assigning `this`, and arguments,
4441 // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
4443 _.bind = function(func, context) {
4445 if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
4446 if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
4447 args = slice.call(arguments, 2);
4448 bound = function() {
4449 if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
4450 Ctor.prototype = func.prototype;
4451 var self = new Ctor;
4452 Ctor.prototype = null;
4453 var result = func.apply(self, args.concat(slice.call(arguments)));
4454 if (_.isObject(result)) return result;
4460 // Partially apply a function by creating a version that has had some of its
4461 // arguments pre-filled, without changing its dynamic `this` context. _ acts
4462 // as a placeholder, allowing any combination of arguments to be pre-filled.
4463 _.partial = function(func) {
4464 var boundArgs = slice.call(arguments, 1);
4467 var args = boundArgs.slice();
4468 for (var i = 0, length = args.length; i < length; i++) {
4469 if (args[i] === _) args[i] = arguments[position++];
4471 while (position < arguments.length) args.push(arguments[position++]);
4472 return func.apply(this, args);
4476 // Bind a number of an object's methods to that object. Remaining arguments
4477 // are the method names to be bound. Useful for ensuring that all callbacks
4478 // defined on an object belong to it.
4479 _.bindAll = function(obj) {
4480 var i, length = arguments.length, key;
4481 if (length <= 1) throw new Error('bindAll must be passed function names');
4482 for (i = 1; i < length; i++) {
4484 obj[key] = _.bind(obj[key], obj);
4489 // Memoize an expensive function by storing its results.
4490 _.memoize = function(func, hasher) {
4491 var memoize = function(key) {
4492 var cache = memoize.cache;
4493 var address = hasher ? hasher.apply(this, arguments) : key;
4494 if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
4495 return cache[address];
4501 // Delays a function for the given number of milliseconds, and then calls
4502 // it with the arguments supplied.
4503 _.delay = function(func, wait) {
4504 var args = slice.call(arguments, 2);
4505 return setTimeout(function(){
4506 return func.apply(null, args);
4510 // Defers a function, scheduling it to run after the current call stack has
4512 _.defer = function(func) {
4513 return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
4516 // Returns a function, that, when invoked, will only be triggered at most once
4517 // during a given window of time. Normally, the throttled function will run
4518 // as much as it can, without ever going more than once per `wait` duration;
4519 // but if you'd like to disable the execution on the leading edge, pass
4520 // `{leading: false}`. To disable execution on the trailing edge, ditto.
4521 _.throttle = function(func, wait, options) {
4522 var context, args, result;
4525 if (!options) options = {};
4526 var later = function() {
4527 previous = options.leading === false ? 0 : _.now();
4529 result = func.apply(context, args);
4530 if (!timeout) context = args = null;
4534 if (!previous && options.leading === false) previous = now;
4535 var remaining = wait - (now - previous);
4538 if (remaining <= 0 || remaining > wait) {
4539 clearTimeout(timeout);
4542 result = func.apply(context, args);
4543 if (!timeout) context = args = null;
4544 } else if (!timeout && options.trailing !== false) {
4545 timeout = setTimeout(later, remaining);
4551 // Returns a function, that, as long as it continues to be invoked, will not
4552 // be triggered. The function will be called after it stops being called for
4553 // N milliseconds. If `immediate` is passed, trigger the function on the
4554 // leading edge, instead of the trailing.
4555 _.debounce = function(func, wait, immediate) {
4556 var timeout, args, context, timestamp, result;
4558 var later = function() {
4559 var last = _.now() - timestamp;
4561 if (last < wait && last > 0) {
4562 timeout = setTimeout(later, wait - last);
4566 result = func.apply(context, args);
4567 if (!timeout) context = args = null;
4575 timestamp = _.now();
4576 var callNow = immediate && !timeout;
4577 if (!timeout) timeout = setTimeout(later, wait);
4579 result = func.apply(context, args);
4580 context = args = null;
4587 // Returns the first function passed as an argument to the second,
4588 // allowing you to adjust arguments, run code before and after, and
4589 // conditionally execute the original function.
4590 _.wrap = function(func, wrapper) {
4591 return _.partial(wrapper, func);
4594 // Returns a negated version of the passed-in predicate.
4595 _.negate = function(predicate) {
4597 return !predicate.apply(this, arguments);
4601 // Returns a function that is the composition of a list of functions, each
4602 // consuming the return value of the function that follows.
4603 _.compose = function() {
4604 var args = arguments;
4605 var start = args.length - 1;
4608 var result = args[start].apply(this, arguments);
4609 while (i--) result = args[i].call(this, result);
4614 // Returns a function that will only be executed after being called N times.
4615 _.after = function(times, func) {
4618 return func.apply(this, arguments);
4623 // Returns a function that will only be executed before being called N times.
4624 _.before = function(times, func) {
4628 memo = func.apply(this, arguments);
4636 // Returns a function that will be executed at most one time, no matter how
4637 // often you call it. Useful for lazy initialization.
4638 _.once = _.partial(_.before, 2);
4643 // Retrieve the names of an object's properties.
4644 // Delegates to **ECMAScript 5**'s native `Object.keys`
4645 _.keys = function(obj) {
4646 if (!_.isObject(obj)) return [];
4647 if (nativeKeys) return nativeKeys(obj);
4649 for (var key in obj) if (_.has(obj, key)) keys.push(key);
4653 // Retrieve the values of an object's properties.
4654 _.values = function(obj) {
4655 var keys = _.keys(obj);
4656 var length = keys.length;
4657 var values = Array(length);
4658 for (var i = 0; i < length; i++) {
4659 values[i] = obj[keys[i]];
4664 // Convert an object into a list of `[key, value]` pairs.
4665 _.pairs = function(obj) {
4666 var keys = _.keys(obj);
4667 var length = keys.length;
4668 var pairs = Array(length);
4669 for (var i = 0; i < length; i++) {
4670 pairs[i] = [keys[i], obj[keys[i]]];
4675 // Invert the keys and values of an object. The values must be serializable.
4676 _.invert = function(obj) {
4678 var keys = _.keys(obj);
4679 for (var i = 0, length = keys.length; i < length; i++) {
4680 result[obj[keys[i]]] = keys[i];
4685 // Return a sorted list of the function names available on the object.
4686 // Aliased as `methods`
4687 _.functions = _.methods = function(obj) {
4689 for (var key in obj) {
4690 if (_.isFunction(obj[key])) names.push(key);
4692 return names.sort();
4695 // Extend a given object with all the properties in passed-in object(s).
4696 _.extend = function(obj) {
4697 if (!_.isObject(obj)) return obj;
4699 for (var i = 1, length = arguments.length; i < length; i++) {
4700 source = arguments[i];
4701 for (prop in source) {
4702 if (hasOwnProperty.call(source, prop)) {
4703 obj[prop] = source[prop];
4710 // Return a copy of the object only containing the whitelisted properties.
4711 _.pick = function(obj, iteratee, context) {
4712 var result = {}, key;
4713 if (obj == null) return result;
4714 if (_.isFunction(iteratee)) {
4715 iteratee = createCallback(iteratee, context);
4717 var value = obj[key];
4718 if (iteratee(value, key, obj)) result[key] = value;
4721 var keys = concat.apply([], slice.call(arguments, 1));
4722 obj = new Object(obj);
4723 for (var i = 0, length = keys.length; i < length; i++) {
4725 if (key in obj) result[key] = obj[key];
4731 // Return a copy of the object without the blacklisted properties.
4732 _.omit = function(obj, iteratee, context) {
4733 if (_.isFunction(iteratee)) {
4734 iteratee = _.negate(iteratee);
4736 var keys = _.map(concat.apply([], slice.call(arguments, 1)), String);
4737 iteratee = function(value, key) {
4738 return !_.contains(keys, key);
4741 return _.pick(obj, iteratee, context);
4744 // Fill in a given object with default properties.
4745 _.defaults = function(obj) {
4746 if (!_.isObject(obj)) return obj;
4747 for (var i = 1, length = arguments.length; i < length; i++) {
4748 var source = arguments[i];
4749 for (var prop in source) {
4750 if (obj[prop] === void 0) obj[prop] = source[prop];
4756 // Create a (shallow-cloned) duplicate of an object.
4757 _.clone = function(obj) {
4758 if (!_.isObject(obj)) return obj;
4759 return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
4762 // Invokes interceptor with the obj, and then returns obj.
4763 // The primary purpose of this method is to "tap into" a method chain, in
4764 // order to perform operations on intermediate results within the chain.
4765 _.tap = function(obj, interceptor) {
4770 // Internal recursive comparison function for `isEqual`.
4771 var eq = function(a, b, aStack, bStack) {
4772 // Identical objects are equal. `0 === -0`, but they aren't identical.
4773 // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
4774 if (a === b) return a !== 0 || 1 / a === 1 / b;
4775 // A strict comparison is necessary because `null == undefined`.
4776 if (a == null || b == null) return a === b;
4777 // Unwrap any wrapped objects.
4778 if (a instanceof _) a = a._wrapped;
4779 if (b instanceof _) b = b._wrapped;
4780 // Compare `[[Class]]` names.
4781 var className = toString.call(a);
4782 if (className !== toString.call(b)) return false;
4783 switch (className) {
4784 // Strings, numbers, regular expressions, dates, and booleans are compared by value.
4785 case '[object RegExp]':
4786 // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
4787 case '[object String]':
4788 // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
4789 // equivalent to `new String("5")`.
4790 return '' + a === '' + b;
4791 case '[object Number]':
4792 // `NaN`s are equivalent, but non-reflexive.
4793 // Object(NaN) is equivalent to NaN
4794 if (+a !== +a) return +b !== +b;
4795 // An `egal` comparison is performed for other numeric values.
4796 return +a === 0 ? 1 / +a === 1 / b : +a === +b;
4797 case '[object Date]':
4798 case '[object Boolean]':
4799 // Coerce dates and booleans to numeric primitive values. Dates are compared by their
4800 // millisecond representations. Note that invalid dates with millisecond representations
4801 // of `NaN` are not equivalent.
4804 if (typeof a != 'object' || typeof b != 'object') return false;
4805 // Assume equality for cyclic structures. The algorithm for detecting cyclic
4806 // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
4807 var length = aStack.length;
4809 // Linear search. Performance is inversely proportional to the number of
4810 // unique nested structures.
4811 if (aStack[length] === a) return bStack[length] === b;
4813 // Objects with different constructors are not equivalent, but `Object`s
4814 // from different frames are.
4815 var aCtor = a.constructor, bCtor = b.constructor;
4818 // Handle Object.create(x) cases
4819 'constructor' in a && 'constructor' in b &&
4820 !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
4821 _.isFunction(bCtor) && bCtor instanceof bCtor)
4825 // Add the first object to the stack of traversed objects.
4829 // Recursively compare objects and arrays.
4830 if (className === '[object Array]') {
4831 // Compare array lengths to determine if a deep comparison is necessary.
4833 result = size === b.length;
4835 // Deep compare the contents, ignoring non-numeric properties.
4837 if (!(result = eq(a[size], b[size], aStack, bStack))) break;
4841 // Deep compare objects.
4842 var keys = _.keys(a), key;
4844 // Ensure that both objects contain the same number of properties before comparing deep equality.
4845 result = _.keys(b).length === size;
4848 // Deep compare each member
4850 if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
4854 // Remove the first object from the stack of traversed objects.
4860 // Perform a deep comparison to check if two objects are equal.
4861 _.isEqual = function(a, b) {
4862 return eq(a, b, [], []);
4865 // Is a given array, string, or object empty?
4866 // An "empty" object has no enumerable own-properties.
4867 _.isEmpty = function(obj) {
4868 if (obj == null) return true;
4869 if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;
4870 for (var key in obj) if (_.has(obj, key)) return false;
4874 // Is a given value a DOM element?
4875 _.isElement = function(obj) {
4876 return !!(obj && obj.nodeType === 1);
4879 // Is a given value an array?
4880 // Delegates to ECMA5's native Array.isArray
4881 _.isArray = nativeIsArray || function(obj) {
4882 return toString.call(obj) === '[object Array]';
4885 // Is a given variable an object?
4886 _.isObject = function(obj) {
4887 var type = typeof obj;
4888 return type === 'function' || type === 'object' && !!obj;
4891 // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
4892 _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
4893 _['is' + name] = function(obj) {
4894 return toString.call(obj) === '[object ' + name + ']';
4898 // Define a fallback version of the method in browsers (ahem, IE), where
4899 // there isn't any inspectable "Arguments" type.
4900 if (!_.isArguments(arguments)) {
4901 _.isArguments = function(obj) {
4902 return _.has(obj, 'callee');
4906 // Optimize `isFunction` if appropriate. Work around an IE 11 bug.
4907 if (typeof /./ !== 'function') {
4908 _.isFunction = function(obj) {
4909 return typeof obj == 'function' || false;
4913 // Is a given object a finite number?
4914 _.isFinite = function(obj) {
4915 return isFinite(obj) && !isNaN(parseFloat(obj));
4918 // Is the given value `NaN`? (NaN is the only number which does not equal itself).
4919 _.isNaN = function(obj) {
4920 return _.isNumber(obj) && obj !== +obj;
4923 // Is a given value a boolean?
4924 _.isBoolean = function(obj) {
4925 return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
4928 // Is a given value equal to null?
4929 _.isNull = function(obj) {
4930 return obj === null;
4933 // Is a given variable undefined?
4934 _.isUndefined = function(obj) {
4935 return obj === void 0;
4938 // Shortcut function for checking if an object has a given property directly
4939 // on itself (in other words, not on a prototype).
4940 _.has = function(obj, key) {
4941 return obj != null && hasOwnProperty.call(obj, key);
4944 // Utility Functions
4945 // -----------------
4947 // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
4948 // previous owner. Returns a reference to the Underscore object.
4949 _.noConflict = function() {
4950 root._ = previousUnderscore;
4954 // Keep the identity function around for default iteratees.
4955 _.identity = function(value) {
4959 _.constant = function(value) {
4965 _.noop = function(){};
4967 _.property = function(key) {
4968 return function(obj) {
4973 // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
4974 _.matches = function(attrs) {
4975 var pairs = _.pairs(attrs), length = pairs.length;
4976 return function(obj) {
4977 if (obj == null) return !length;
4978 obj = new Object(obj);
4979 for (var i = 0; i < length; i++) {
4980 var pair = pairs[i], key = pair[0];
4981 if (pair[1] !== obj[key] || !(key in obj)) return false;
4987 // Run a function **n** times.
4988 _.times = function(n, iteratee, context) {
4989 var accum = Array(Math.max(0, n));
4990 iteratee = createCallback(iteratee, context, 1);
4991 for (var i = 0; i < n; i++) accum[i] = iteratee(i);
4995 // Return a random integer between min and max (inclusive).
4996 _.random = function(min, max) {
5001 return min + Math.floor(Math.random() * (max - min + 1));
5004 // A (possibly faster) way to get the current timestamp as an integer.
5005 _.now = Date.now || function() {
5006 return new Date().getTime();
5009 // List of HTML entities for escaping.
5018 var unescapeMap = _.invert(escapeMap);
5020 // Functions for escaping and unescaping strings to/from HTML interpolation.
5021 var createEscaper = function(map) {
5022 var escaper = function(match) {
5025 // Regexes for identifying a key that needs to be escaped
5026 var source = '(?:' + _.keys(map).join('|') + ')';
5027 var testRegexp = RegExp(source);
5028 var replaceRegexp = RegExp(source, 'g');
5029 return function(string) {
5030 string = string == null ? '' : '' + string;
5031 return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
5034 _.escape = createEscaper(escapeMap);
5035 _.unescape = createEscaper(unescapeMap);
5037 // If the value of the named `property` is a function then invoke it with the
5038 // `object` as context; otherwise, return it.
5039 _.result = function(object, property) {
5040 if (object == null) return void 0;
5041 var value = object[property];
5042 return _.isFunction(value) ? object[property]() : value;
5045 // Generate a unique integer id (unique within the entire client session).
5046 // Useful for temporary DOM ids.
5048 _.uniqueId = function(prefix) {
5049 var id = ++idCounter + '';
5050 return prefix ? prefix + id : id;
5053 // By default, Underscore uses ERB-style template delimiters, change the
5054 // following template settings to use alternative delimiters.
5055 _.templateSettings = {
5056 evaluate : /<%([\s\S]+?)%>/g,
5057 interpolate : /<%=([\s\S]+?)%>/g,
5058 escape : /<%-([\s\S]+?)%>/g
5061 // When customizing `templateSettings`, if you don't want to define an
5062 // interpolation, evaluation or escaping regex, we need one that is
5063 // guaranteed not to match.
5064 var noMatch = /(.)^/;
5066 // Certain characters need to be escaped so that they can be put into a
5077 var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
5079 var escapeChar = function(match) {
5080 return '\\' + escapes[match];
5083 // JavaScript micro-templating, similar to John Resig's implementation.
5084 // Underscore templating handles arbitrary delimiters, preserves whitespace,
5085 // and correctly escapes quotes within interpolated code.
5086 // NB: `oldSettings` only exists for backwards compatibility.
5087 _.template = function(text, settings, oldSettings) {
5088 if (!settings && oldSettings) settings = oldSettings;
5089 settings = _.defaults({}, settings, _.templateSettings);
5091 // Combine delimiters into one regular expression via alternation.
5092 var matcher = RegExp([
5093 (settings.escape || noMatch).source,
5094 (settings.interpolate || noMatch).source,
5095 (settings.evaluate || noMatch).source
5096 ].join('|') + '|$', 'g');
5098 // Compile the template source, escaping string literals appropriately.
5100 var source = "__p+='";
5101 text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
5102 source += text.slice(index, offset).replace(escaper, escapeChar);
5103 index = offset + match.length;
5106 source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
5107 } else if (interpolate) {
5108 source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
5109 } else if (evaluate) {
5110 source += "';\n" + evaluate + "\n__p+='";
5113 // Adobe VMs need the match returned to produce the correct offest.
5118 // If a variable is not specified, place data values in local scope.
5119 if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
5121 source = "var __t,__p='',__j=Array.prototype.join," +
5122 "print=function(){__p+=__j.call(arguments,'');};\n" +
5123 source + 'return __p;\n';
5126 var render = new Function(settings.variable || 'obj', '_', source);
5132 var template = function(data) {
5133 return render.call(this, data, _);
5136 // Provide the compiled source as a convenience for precompilation.
5137 var argument = settings.variable || 'obj';
5138 template.source = 'function(' + argument + '){\n' + source + '}';
5143 // Add a "chain" function. Start chaining a wrapped Underscore object.
5144 _.chain = function(obj) {
5145 var instance = _(obj);
5146 instance._chain = true;
5152 // If Underscore is called as a function, it returns a wrapped object that
5153 // can be used OO-style. This wrapper holds altered versions of all the
5154 // underscore functions. Wrapped objects may be chained.
5156 // Helper function to continue chaining intermediate results.
5157 var result = function(obj) {
5158 return this._chain ? _(obj).chain() : obj;
5161 // Add your own custom functions to the Underscore object.
5162 _.mixin = function(obj) {
5163 _.each(_.functions(obj), function(name) {
5164 var func = _[name] = obj[name];
5165 _.prototype[name] = function() {
5166 var args = [this._wrapped];
5167 push.apply(args, arguments);
5168 return result.call(this, func.apply(_, args));
5173 // Add all of the Underscore functions to the wrapper object.
5176 // Add all mutator Array functions to the wrapper.
5177 _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
5178 var method = ArrayProto[name];
5179 _.prototype[name] = function() {
5180 var obj = this._wrapped;
5181 method.apply(obj, arguments);
5182 if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
5183 return result.call(this, obj);
5187 // Add all accessor Array functions to the wrapper.
5188 _.each(['concat', 'join', 'slice'], function(name) {
5189 var method = ArrayProto[name];
5190 _.prototype[name] = function() {
5191 return result.call(this, method.apply(this._wrapped, arguments));
5195 // Extracts the result from a wrapped and chained object.
5196 _.prototype.value = function() {
5197 return this._wrapped;
5200 // AMD registration happens at the end for compatibility with AMD loaders
5201 // that may not enforce next-turn semantics on modules. Even though general
5202 // practice for AMD registration is to be anonymous, underscore registers
5203 // as a named module because, like jQuery, it is a base library that is
5204 // popular enough to be bundled in a third party lib, but not be part of
5205 // an AMD load request. Those cases could generate an error when an
5206 // anonymous define() is called outside of a loader request.
5207 if (typeof define === 'function' && define.amd) {
5208 define('underscore', [], function() {
5214 },{}],60:[function(require,module,exports){
5217 _ = require("underscore");
5219 module.exports = function(seqs) {
5221 seqs = seqs.map(function(el) {
5222 return el.get("seq");
5224 occs = new Array(seqs.length);
5225 _.each(seqs, function(el, i) {
5226 return _.each(el, function(char, pos) {
5227 if (occs[pos] == null) {
5230 if (occs[pos][char] == null) {
5231 occs[pos][char] = 0;
5233 return occs[pos][char]++;
5236 return _.reduce(occs, function(memo, occ) {
5239 return memo += _.max(keys, function(key) {
5247 },{"underscore":59}],61:[function(require,module,exports){
5250 module.exports = identitiyCalc = function(seqs, consensus) {
5251 if (consensus === void 0) {
5252 console.warn("bug on consenus calc");
5255 return seqs.each(function(seqObj) {
5256 var i, matches, seq, total, _i, _ref;
5257 seq = seqObj.get("seq");
5260 for (i = _i = 0, _ref = seq.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
5261 if (seq[i] !== "-" && consensus[i] !== "-") {
5263 if (seq[i] === consensus[i]) {
5268 return seqObj.set("identity", matches / total);
5274 },{}],62:[function(require,module,exports){
5275 module.exports.consensus = require("./ConsensusCalc");
5279 },{"./ConsensusCalc":60}],63:[function(require,module,exports){
5280 var Colorator, Model;
5282 Model = require("backbone-thin").Model;
5284 module.exports = Colorator = Model.extend({
5287 colorBackground: true,
5288 showLowerCase: true,
5295 },{"backbone-thin":5}],64:[function(require,module,exports){
5296 var Columns, Model, consenus, _;
5298 Model = require("backbone-thin").Model;
5300 consenus = require("../algo/ConsensusCalc");
5302 _ = require("underscore");
5304 module.exports = Columns = Model.extend({
5308 initialize: function() {
5309 if (this.get("hidden") == null) {
5310 return this.set("hidden", []);
5313 calcHiddenColumns: function(n) {
5314 var hidden, i, newX, _i, _len;
5315 hidden = this.get("hidden");
5317 for (_i = 0, _len = hidden.length; _i < _len; _i++) {
5325 _calcConservationPre: function(seqs) {
5326 var cons, matches, nMax, total;
5327 console.log(seqs.length);
5328 if (seqs.length > 1000) {
5331 cons = consenus(seqs);
5332 seqs = seqs.map(function(el) {
5333 return el.get("seq");
5335 nMax = (_.max(seqs, function(el) {
5338 total = new Array(nMax);
5339 matches = new Array(nMax);
5340 _.each(seqs, function(el, i) {
5341 return _.each(el, function(char, pos) {
5342 total[pos] = total[pos] + 1 || 1;
5343 if (cons[pos] === char) {
5344 return matches[pos] = matches[pos] + 1 || 1;
5348 return [matches, total, nMax];
5350 calcConservation: function(seqs) {
5351 if (this.attributes.scaling === "exp") {
5352 return this.calcConservationExp(seqs);
5353 } else if (this.attributes.scaling === "log") {
5354 return this.calcConservationLog(seqs);
5355 } else if (this.attributes.scaling === "lin") {
5356 return this.calcConservationLin(seqs);
5359 calcConservationLin: function(seqs) {
5360 var i, matches, nMax, total, _i, _ref, _ref1;
5361 _ref = this._calcConservationPre(seqs), matches = _ref[0], total = _ref[1], nMax = _ref[2];
5362 for (i = _i = 0, _ref1 = nMax - 1; 0 <= _ref1 ? _i <= _ref1 : _i >= _ref1; i = 0 <= _ref1 ? ++_i : --_i) {
5363 matches[i] = matches[i] / total[i];
5365 this.set("conserv", matches);
5368 calcConservationLog: function(seqs) {
5369 var i, matches, nMax, total, _i, _ref, _ref1;
5370 _ref = this._calcConservationPre(seqs), matches = _ref[0], total = _ref[1], nMax = _ref[2];
5371 for (i = _i = 0, _ref1 = nMax - 1; 0 <= _ref1 ? _i <= _ref1 : _i >= _ref1; i = 0 <= _ref1 ? ++_i : --_i) {
5372 matches[i] = Math.log(matches[i] + 1) / Math.log(total[i] + 1);
5374 this.set("conserv", matches);
5377 calcConservationExp: function(seqs) {
5378 var i, matches, nMax, total, _i, _ref, _ref1;
5379 _ref = this._calcConservationPre(seqs), matches = _ref[0], total = _ref[1], nMax = _ref[2];
5380 for (i = _i = 0, _ref1 = nMax - 1; 0 <= _ref1 ? _i <= _ref1 : _i >= _ref1; i = 0 <= _ref1 ? ++_i : --_i) {
5381 matches[i] = Math.exp(matches[i] + 1) / Math.exp(total[i] + 1);
5383 this.set("conserv", matches);
5390 },{"../algo/ConsensusCalc":60,"backbone-thin":5,"underscore":59}],65:[function(require,module,exports){
5393 Model = require("backbone-thin").Model;
5395 module.exports = Config = Model.extend({
5397 registerMouseHover: false,
5398 registerMouseClicks: true,
5399 importProxy: "https://cors-anywhere.herokuapp.com/",
5406 },{"backbone-thin":5}],66:[function(require,module,exports){
5407 var Consenus, Model, consenusCalc;
5409 Model = require("backbone-thin").Model;
5411 consenusCalc = require("../algo/ConsensusCalc");
5413 module.exports = Consenus = Model.extend({
5417 getConsensus: function(seqs) {
5419 if (seqs.length > 1000) {
5422 cons = consenusCalc(seqs);
5423 this.set("consenus", cons);
5430 },{"../algo/ConsensusCalc":60,"backbone-thin":5}],67:[function(require,module,exports){
5431 var ColumnSelection, Model, PosSelection, RowSelection, Selection, _;
5433 _ = require("underscore");
5435 Model = require("backbone-thin").Model;
5437 Selection = Model.extend({
5443 RowSelection = Selection.extend({
5444 defaults: _.extend({}, Selection.prototype.defaults, {
5448 inRow: function(seqId) {
5449 return seqId === this.get("seqId");
5451 inColumn: function(rowPos) {
5454 getLength: function() {
5459 ColumnSelection = Selection.extend({
5460 defaults: _.extend({}, Selection.prototype.defaults, {
5468 inColumn: function(rowPos) {
5469 return xStart <= rowPos && rowPos <= xEnd;
5471 getLength: function() {
5472 return xEnd - xStart;
5476 PosSelection = RowSelection.extend(_.extend({}, _.pick(ColumnSelection, "inColumn"), _.pick(ColumnSelection, "getLength"), {
5477 defaults: _.extend({}, ColumnSelection.prototype.defaults, RowSelection.prototype.defaults, {
5482 module.exports.sel = Selection;
5484 module.exports.possel = PosSelection;
5486 module.exports.rowsel = RowSelection;
5488 module.exports.columnsel = ColumnSelection;
5492 },{"backbone-thin":5,"underscore":59}],68:[function(require,module,exports){
5493 var Collection, SelectionManager, sel, _;
5495 sel = require("./Selection");
5497 _ = require("underscore");
5499 Collection = require("backbone-thin").Collection;
5501 module.exports = SelectionManager = Collection.extend({
5503 initialize: function(data, opts) {
5505 this.listenTo(this.g, "residue:click", function(e) {
5506 return this._handleE(e.evt, new sel.possel({
5512 this.listenTo(this.g, "row:click", function(e) {
5513 return this._handleE(e.evt, new sel.rowsel({
5519 return this.listenTo(this.g, "column:click", function(e) {
5520 return this._handleE(e.evt, new sel.columnsel({
5522 xEnd: e.rowPos + e.stepSize - 1
5526 getSelForRow: function(seqId) {
5527 return this.filter(function(el) {
5528 return el.inRow(seqId);
5531 getSelForColumns: function(rowPos) {
5532 return this.filter(function(el) {
5533 return el.inColumn(rowPos);
5536 getBlocksForRow: function(seqId, maxLen) {
5537 var blocks, seli, selis, _i, _j, _k, _len, _ref, _ref1, _results, _results1;
5538 selis = this.filter(function(el) {
5539 return el.inRow(seqId);
5542 for (_i = 0, _len = selis.length; _i < _len; _i++) {
5544 if (seli.attributes.type === "row") {
5545 blocks = (function() {
5547 for (var _j = 0; 0 <= maxLen ? _j <= maxLen : _j >= maxLen; 0 <= maxLen ? _j++ : _j--){ _results.push(_j); }
5552 blocks = blocks.concat((function() {
5554 for (var _k = _ref = seli.attributes.xStart, _ref1 = seli.attributes.xEnd; _ref <= _ref1 ? _k <= _ref1 : _k >= _ref1; _ref <= _ref1 ? _k++ : _k--){ _results1.push(_k); }
5561 getAllColumnBlocks: function(conf) {
5562 var blocks, filtered, maxLen, seli, withPos, _i, _j, _len, _ref, _ref1, _results;
5563 maxLen = conf.maxLen;
5564 withPos = conf.withPos;
5567 filtered = this.filter(function(el) {
5568 return el.get('xStart') != null;
5571 filtered = this.filter(function(el) {
5572 return el.get('type') === "column";
5575 for (_i = 0, _len = filtered.length; _i < _len; _i++) {
5576 seli = filtered[_i];
5577 blocks = blocks.concat((function() {
5579 for (var _j = _ref = seli.attributes.xStart, _ref1 = seli.attributes.xEnd; _ref <= _ref1 ? _j <= _ref1 : _j >= _ref1; _ref <= _ref1 ? _j++ : _j--){ _results.push(_j); }
5583 blocks = _.uniq(blocks);
5586 invertRow: function(rows) {
5587 var el, inverted, s, selRows, _i, _len;
5588 selRows = this.where({
5591 selRows = _.map(selRows, function(el) {
5592 return el.attributes.seqId;
5594 inverted = _.filter(rows, function(el) {
5595 if (selRows.indexOf(el) >= 0) {
5601 for (_i = 0, _len = inverted.length; _i < _len; _i++) {
5603 s.push(new sel.rowsel({
5608 return this.reset(s);
5610 invertCol: function(columns) {
5611 var el, inverted, s, selColumns, xEnd, xStart, _i, _len;
5612 selColumns = this.where({
5615 selColumns = _.reduce(selColumns, function(memo, el) {
5616 var _i, _ref, _ref1, _results;
5617 return memo.concat((function() {
5619 for (var _i = _ref = el.attributes.xStart, _ref1 = el.attributes.xEnd; _ref <= _ref1 ? _i <= _ref1 : _i >= _ref1; _ref <= _ref1 ? _i++ : _i--){ _results.push(_i); }
5623 inverted = _.filter(columns, function(el) {
5624 if (selColumns.indexOf(el) >= 0) {
5629 if (inverted.length === 0) {
5633 console.log(inverted);
5634 xStart = xEnd = inverted[0];
5635 for (_i = 0, _len = inverted.length; _i < _len; _i++) {
5637 if (xEnd + 1 === el) {
5640 s.push(new sel.columnsel({
5647 if (xStart !== xEnd) {
5648 s.push(new sel.columnsel({
5650 xEnd: inverted[inverted.length - 1]
5653 return this.reset(s);
5655 _handleE: function(e, selection) {
5656 if (e.ctrlKey || e.metaKey) {
5657 return this.add(selection);
5659 return this.reset([selection]);
5662 _reduceColumns: function() {
5663 return this.each(function(el, index, arr) {
5664 var cols, left, lefts, right, rights, xEnd, xStart, _i, _j, _len, _len1;
5665 cols = _.filter(arr, function(el) {
5666 return el.get('type') === 'column';
5668 xStart = el.get('xStart');
5669 xEnd = el.get('xEnd');
5670 lefts = _.filter(cols, function(el) {
5671 return el.get('xEnd') === (xStart - 1);
5673 for (_i = 0, _len = lefts.length; _i < _len; _i++) {
5675 left.set('xEnd', xStart);
5677 rights = _.filter(cols, function(el) {
5678 return el.get('xStart') === (xEnd + 1);
5680 for (_j = 0, _len1 = rights.length; _j < _len1; _j++) {
5682 right.set('xStart', xEnd);
5684 if (lefts.length > 0 || rights.length > 0) {
5685 console.log("removed el");
5686 return el.collection.remove(el);
5694 },{"./Selection":67,"backbone-thin":5,"underscore":59}],69:[function(require,module,exports){
5695 var Model, Visibility;
5697 Model = require("backbone-thin").Model;
5699 module.exports = Visibility = Model.extend({
5709 },{"backbone-thin":5}],70:[function(require,module,exports){
5710 var Model, Visibility;
5712 Model = require("backbone-thin").Model;
5714 module.exports = Visibility = Model.extend({
5724 labelPartition: false,
5725 labelCheckbox: false
5731 },{"backbone-thin":5}],71:[function(require,module,exports){
5734 Model = require("backbone-thin").Model;
5736 module.exports = Zoomer = Model.extend({
5737 constructor: function(attributes, options) {
5738 Model.apply(this, arguments);
5743 alignmentWidth: "auto",
5744 alignmentHeight: 195,
5751 labelFontsize: "13px",
5752 labelLineHeight: "13px",
5753 markerFontsize: "10px",
5756 residueFont: "13px mono",
5757 canvasEventScale: 1,
5760 menuFontsize: "20px",
5761 menuItemFontsize: "18px",
5762 menuItemLineHeight: "18px",
5763 menuMarginLeft: "5px",
5764 menuPadding: "3px 5px 3px 5px",
5765 _alignmentScrollLeft: 0,
5766 _alignmentScrollTop: 0
5768 getAlignmentWidth: function(n) {
5769 if (this.get("alignmentWidth") === "auto") {
5770 return this.get("columnWidth") * n;
5772 return this.get("alignmentWidth");
5775 setLeftOffset: function(n) {
5777 val = (n - 1) * this.get('columnWidth');
5778 val = Math.max(0, val);
5779 return this.set("_alignmentScrollLeft", val);
5781 setTopOffset: function(n) {
5783 val = (n - 1) * this.get('rowHeight');
5784 val = Math.max(0, val);
5785 return this.set("_alignmentScrollTop", val);
5787 getLabelWidth: function() {
5790 if (this.g.vis.get("labels")) {
5791 paddingLeft += this.get("labelWidth");
5793 if (this.g.vis.get("metacell")) {
5794 paddingLeft += this.get("metaWidth");
5798 _adjustWidth: function(el, model) {
5799 var calcWidth, maxWidth, parentWidth, val;
5800 if ((el.parentNode != null) && el.parentNode.offsetWidth !== 0) {
5801 parentWidth = el.parentNode.offsetWidth;
5803 parentWidth = document.body.clientWidth - 35;
5805 maxWidth = parentWidth - this.getLabelWidth();
5806 calcWidth = this.getAlignmentWidth(model.getMaxLength() - this.g.columns.get('hidden').length);
5807 val = Math.min(maxWidth, calcWidth);
5808 val = Math.floor(val / this.get("columnWidth")) * this.get("columnWidth");
5809 return this.set("alignmentWidth", val);
5811 _checkScrolling: function(scrollObj, opts) {
5812 var xScroll, yScroll;
5813 xScroll = scrollObj[0];
5814 yScroll = scrollObj[1];
5815 this.set("_alignmentScrollLeft", xScroll, opts);
5816 return this.set("_alignmentScrollTop", yScroll, opts);
5822 },{"backbone-thin":5}],72:[function(require,module,exports){
5823 module.exports.msa = require("./msa");
5825 module.exports.model = require("./model");
5827 module.exports.algo = require("./algo");
5829 module.exports.menu = require("./menu");
5831 module.exports.utils = require("./utils");
5833 module.exports.selection = require("./g/selection/Selection");
5835 module.exports.view = require("backbone-viewj");
5837 module.exports.boneView = require("backbone-childs");
5839 module.exports._ = require('underscore');
5841 module.exports.$ = require('jbone');
5843 module.exports.version = "0.1.0";
5847 },{"./algo":62,"./g/selection/Selection":67,"./menu":74,"./model":89,"./msa":90,"./utils":92,"backbone-childs":3,"backbone-viewj":10,"jbone":50,"underscore":59}],73:[function(require,module,exports){
5848 var ColorMenu, ExportMenu, ExtraMenu, FilterMenu, HelpMenu, ImportMenu, MenuView, OrderingMenu, SelectionMenu, VisMenu, boneView;
5850 boneView = require("backbone-childs");
5852 ImportMenu = require("./views/ImportMenu");
5854 FilterMenu = require("./views/FilterMenu");
5856 SelectionMenu = require("./views/SelectionMenu");
5858 VisMenu = require("./views/VisMenu");
5860 ColorMenu = require("./views/ColorMenu");
5862 OrderingMenu = require("./views/OrderingMenu");
5864 ExtraMenu = require("./views/ExtraMenu");
5866 ExportMenu = require("./views/ExportMenu");
5868 HelpMenu = require("./views/HelpMenu");
5870 module.exports = MenuView = boneView.extend({
5871 initialize: function(data) {
5872 this.msa = data.msa;
5873 this.addView("10_import", new ImportMenu({
5874 model: this.msa.seqs,
5877 this.addView("20_filter", new FilterMenu({
5878 model: this.msa.seqs,
5881 this.addView("30_selection", new SelectionMenu({
5882 model: this.msa.seqs,
5885 this.addView("40_vis", new VisMenu({
5886 model: this.msa.seqs,
5889 this.addView("50_color", new ColorMenu({
5890 model: this.msa.seqs,
5893 this.addView("60_ordering", new OrderingMenu({
5894 model: this.msa.seqs,
5897 this.addView("70_extra", new ExtraMenu({
5898 model: this.msa.seqs,
5901 this.addView("80_export", new ExportMenu({
5902 model: this.msa.seqs,
5906 return this.addView("90_help", new HelpMenu({
5910 render: function() {
5911 this.renderSubviews();
5912 this.el.setAttribute("class", "biojs_msa_menubar");
5913 return this.el.appendChild(document.createElement("p"));
5919 },{"./views/ColorMenu":76,"./views/ExportMenu":77,"./views/ExtraMenu":78,"./views/FilterMenu":79,"./views/HelpMenu":80,"./views/ImportMenu":81,"./views/OrderingMenu":82,"./views/SelectionMenu":83,"./views/VisMenu":84,"backbone-childs":3}],74:[function(require,module,exports){
5920 module.exports.defaultmenu = require("./defaultmenu");
5922 module.exports.menubuilder = require("./menubuilder");
5926 },{"./defaultmenu":73,"./menubuilder":75}],75:[function(require,module,exports){
5927 var BMath, MenuBuilder, jbone, view;
5929 BMath = require("../utils/bmath");
5931 jbone = require("jbone");
5933 view = require("backbone-viewj");
5935 module.exports = MenuBuilder = view.extend({
5936 setName: function(name) {
5938 return this._nodes = [];
5940 addNode: function(label, callback, data) {
5945 if (this._nodes == null) {
5948 return this._nodes.push({
5954 buildDOM: function() {
5955 return this._buildM({
5960 _buildM: function(data) {
5961 var displayedButton, frag, key, li, menu, menuUl, name, node, nodes, style, _i, _len, _ref;
5964 menu = document.createElement("div");
5965 menu.className = "dropdown dropdown-tip";
5966 menu.id = "adrop-" + BMath.uniqueId();
5967 menu.style.display = "none";
5968 menuUl = document.createElement("ul");
5969 menuUl.className = "dropdown-menu";
5970 for (_i = 0, _len = nodes.length; _i < _len; _i++) {
5972 li = document.createElement("li");
5973 li.textContent = node.label;
5977 li.style[key] = style;
5979 li.addEventListener("click", node.callback);
5980 if (this.g != null) {
5981 li.style.lineHeight = this.g.zoomer.get("menuItemLineHeight");
5983 menuUl.appendChild(li);
5985 menu.appendChild(menuUl);
5986 frag = document.createDocumentFragment();
5987 displayedButton = document.createElement("a");
5988 displayedButton.textContent = name;
5989 displayedButton.className = "biojs_msa_menubar_alink";
5990 if (this.g != null) {
5991 menuUl.style.fontSize = this.g.zoomer.get("menuItemFontsize");
5992 displayedButton.style.fontSize = this.g.zoomer.get("menuFontsize");
5993 displayedButton.style.marginLeft = this.g.zoomer.get("menuMarginLeft");
5994 displayedButton.style.padding = this.g.zoomer.get("menuPadding");
5996 jbone(displayedButton).on("click", (function(_this) {
5997 return function(e) {
5998 _this._showMenu(e, menu, displayedButton);
5999 return window.setTimeout(function() {
6000 return jbone(document.body).one("click", function(e) {
6001 console.log("next click");
6002 return menu.style.display = "none";
6007 frag.appendChild(menu);
6008 frag.appendChild(displayedButton);
6011 _showMenu: function(e, menu, target) {
6013 menu.style.display = "block";
6014 menu.style.position = "absolute";
6015 rect = target.getBoundingClientRect();
6016 menu.style.left = rect.left + "px";
6017 return menu.style.top = (rect.top + target.offsetHeight) + "px";
6023 },{"../utils/bmath":91,"backbone-viewj":10,"jbone":50}],76:[function(require,module,exports){
6024 var ColorMenu, MenuBuilder, dom, _;
6026 MenuBuilder = require("../menubuilder");
6028 _ = require("underscore");
6030 dom = require("dom-helper");
6032 module.exports = ColorMenu = MenuBuilder.extend({
6033 initialize: function(data) {
6035 this.el.style.display = "inline-block";
6036 return this.listenTo(this.g.colorscheme, "change", function() {
6037 return this.render();
6040 render: function() {
6041 var colorschemes, menuColor, scheme, text, _i, _len;
6042 menuColor = this.setName("Color scheme");
6043 colorschemes = this.getColorschemes();
6044 for (_i = 0, _len = colorschemes.length; _i < _len; _i++) {
6045 scheme = colorschemes[_i];
6046 this.addScheme(menuColor, scheme);
6048 text = "Background";
6049 if (this.g.colorscheme.get("colorBackground")) {
6050 text = "Hide " + text;
6052 text = "Show " + text;
6054 this.addNode(text, (function(_this) {
6056 return _this.g.colorscheme.set("colorBackground", !_this.g.colorscheme.get("colorBackground"));
6059 this.grey(menuColor);
6060 dom.removeAllChilds(this.el);
6061 this.el.appendChild(this.buildDOM());
6064 addScheme: function(menuColor, scheme) {
6067 current = this.g.colorscheme.get("scheme");
6068 if (current === scheme.id) {
6069 style.backgroundColor = "#77ED80";
6071 return this.addNode(scheme.name, (function(_this) {
6073 return _this.g.colorscheme.set("scheme", scheme.id);
6079 getColorschemes: function() {
6091 name: "Hydrophobicity",
6148 grey: function(menuColor) {
6149 this.addNode("Grey", (function(_this) {
6151 _this.g.colorscheme.set("showLowerCase", false);
6152 return _this.model.each(function(seq) {
6154 residues = seq.get("seq");
6156 _.each(residues, function(el, index) {
6157 if (el === el.toLowerCase()) {
6158 return grey.push(index);
6161 return seq.set("grey", grey);
6165 this.addNode("Grey by threshold", (function(_this) {
6167 var conserv, grey, i, maxLen, threshold, _i, _ref;
6168 threshold = prompt("Enter threshold (in percent)", 20);
6169 threshold = threshold / 100;
6170 maxLen = _this.model.getMaxLength();
6171 conserv = _this.g.columns.get("conserv");
6173 for (i = _i = 0, _ref = maxLen - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
6174 console.log(conserv[i]);
6175 if (conserv[i] < threshold) {
6179 return _this.model.each(function(seq) {
6180 return seq.set("grey", grey);
6184 this.addNode("Grey selection", (function(_this) {
6187 maxLen = _this.model.getMaxLength();
6188 return _this.model.each(function(seq) {
6190 blocks = _this.g.selcol.getBlocksForRow(seq.get("id"), maxLen);
6191 return seq.set("grey", blocks);
6195 return this.addNode("Reset grey", (function(_this) {
6197 _this.g.colorscheme.set("showLowerCase", true);
6198 return _this.model.each(function(seq) {
6199 return seq.set("grey", []);
6208 },{"../menubuilder":75,"dom-helper":49,"underscore":59}],77:[function(require,module,exports){
6209 var ExportMenu, FastaExporter, MenuBuilder, blobURL, saveAs, _;
6211 MenuBuilder = require("../menubuilder");
6213 saveAs = require("browser-saveas");
6215 FastaExporter = require("biojs-io-fasta").writer;
6217 _ = require("underscore");
6219 blobURL = require("blueimp_canvastoblob");
6221 module.exports = ExportMenu = MenuBuilder.extend({
6222 initialize: function(data) {
6224 this.msa = data.msa;
6225 return this.el.style.display = "inline-block";
6227 render: function() {
6228 this.setName("Export");
6229 this.addNode("Export sequences", (function(_this) {
6232 text = FastaExporter["export"](_this.model.toJSON());
6233 blob = new Blob([text], {
6236 return saveAs(blob, "all.fasta");
6239 this.addNode("Export selection", (function(_this) {
6241 var blob, i, selection, text, _i, _ref;
6242 selection = _this.g.selcol.pluck("seqId");
6243 if (selection != null) {
6244 selection = _this.model.filter(function(el) {
6245 return _.contains(selection, el.get("id"));
6247 for (i = _i = 0, _ref = selection.length - 1; _i <= _ref; i = _i += 1) {
6248 selection[i] = selection[i].toJSON();
6251 selection = _this.model.toJSON();
6252 console.log("no selection found");
6254 text = FastaExporter["export"](selection);
6255 blob = new Blob([text], {
6258 return saveAs(blob, "selection.fasta");
6261 this.addNode("Export image", (function(_this) {
6264 canvas = _this.msa.getView('stage').getView('body').getView('seqblock').el;
6265 if (canvas != null) {
6266 url = canvas.toDataURL('image/png');
6267 return saveAs(blobURL(url), "biojs-msa.png", "image/png");
6271 this.el.appendChild(this.buildDOM());
6278 },{"../menubuilder":75,"biojs-io-fasta":undefined,"blueimp_canvastoblob":46,"browser-saveas":47,"underscore":59}],78:[function(require,module,exports){
6279 var ExtraMenu, MenuBuilder, Seq, consenus;
6281 MenuBuilder = require("../menubuilder");
6283 consenus = require("../../algo/ConsensusCalc");
6285 Seq = require("../../model/Sequence");
6287 module.exports = ExtraMenu = MenuBuilder.extend({
6288 initialize: function(data) {
6290 return this.el.style.display = "inline-block";
6292 render: function() {
6293 this.setName("Extras");
6294 this.addNode("Add consensus seq", (function(_this) {
6297 con = consenus(_this.model);
6304 _this.model.add(seq);
6305 _this.model.comparator = function(seq) {
6306 return seq.get("id");
6308 return _this.model.sort();
6311 this.addNode("Increase font size", (function(_this) {
6313 _this.g.zoomer.set("columnWidth", _this.g.zoomer.get("columnWidth") + 2);
6314 _this.g.zoomer.set("labelWidth", _this.g.zoomer.get("columnWidth") + 5);
6315 _this.g.zoomer.set("rowHeight", _this.g.zoomer.get("rowHeight") + 2);
6316 return _this.g.zoomer.set("labelFontSize", _this.g.zoomer.get("labelFontSize") + 2);
6319 this.addNode("Decrease font size", (function(_this) {
6321 _this.g.zoomer.set("columnWidth", _this.g.zoomer.get("columnWidth") - 2);
6322 _this.g.zoomer.set("rowHeight", _this.g.zoomer.get("rowHeight") - 2);
6323 _this.g.zoomer.set("labelFontSize", _this.g.zoomer.get("labelFontSize") - 2);
6324 if (_this.g.zoomer.get("columnWidth") < 8) {
6325 return _this.g.zoomer.set("textVisible", false);
6329 this.addNode("Bar chart exp scaling", (function(_this) {
6331 return _this.g.columns.set("scaling", "exp");
6334 this.addNode("Bar chart linear scaling", (function(_this) {
6336 return _this.g.columns.set("scaling", "lin");
6339 this.addNode("Bar chart log scaling", (function(_this) {
6341 return _this.g.columns.set("scaling", "log");
6344 this.addNode("Minimized width", (function(_this) {
6346 return _this.g.zoomer.set("alignmentWidth", 600);
6349 this.addNode("Minimized height", (function(_this) {
6351 return _this.g.zoomer.set("alignmentHeight", 120);
6354 this.addNode("Jump to a column", (function(_this) {
6357 offset = prompt("Column", "20");
6358 if (offset < 0 || offset > _this.model.getMaxLength() || isNaN(offset)) {
6359 alert("invalid column");
6362 return _this.g.zoomer.setLeftOffset(offset);
6365 this.el.appendChild(this.buildDOM());
6372 },{"../../algo/ConsensusCalc":60,"../../model/Sequence":88,"../menubuilder":75}],79:[function(require,module,exports){
6373 var FilterMenu, MenuBuilder, _;
6375 MenuBuilder = require("../menubuilder");
6377 _ = require("underscore");
6379 module.exports = FilterMenu = MenuBuilder.extend({
6380 initialize: function(data) {
6382 return this.el.style.display = "inline-block";
6384 render: function() {
6385 this.setName("Filter");
6386 this.addNode("Hide columns by threshold", (function(_this) {
6387 return function(e) {
6388 var conserv, hidden, i, maxLen, threshold, _i, _ref;
6389 threshold = prompt("Enter threshold (in percent)", 20);
6390 threshold = threshold / 100;
6391 maxLen = _this.model.getMaxLength();
6393 conserv = _this.g.columns.get("conserv");
6394 for (i = _i = 0, _ref = maxLen - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
6395 if (conserv[i] < threshold) {
6399 return _this.g.columns.set("hidden", hidden);
6402 this.addNode("Hide columns by selection", (function(_this) {
6404 var hidden, hiddenOld;
6405 hiddenOld = _this.g.columns.get("hidden");
6406 hidden = hiddenOld.concat(_this.g.selcol.getAllColumnBlocks({
6407 maxLen: _this.model.getMaxLength(),
6410 _this.g.selcol.reset([]);
6411 return _this.g.columns.set("hidden", hidden);
6414 this.addNode("Hide columns by gaps", (function(_this) {
6416 var gapContent, gaps, hidden, i, maxLen, threshold, total, _i, _ref;
6417 threshold = prompt("Enter threshold (in percent)", 20);
6418 threshold = threshold / 100;
6419 maxLen = _this.model.getMaxLength();
6421 for (i = _i = 0, _ref = maxLen - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
6424 _this.model.each(function(el) {
6425 if (el.get('seq')[i] === "-") {
6430 gapContent = gaps / total;
6431 if (gapContent > threshold) {
6435 return _this.g.columns.set("hidden", hidden);
6438 this.addNode("Hide seqs by identity", (function(_this) {
6441 threshold = prompt("Enter threshold (in percent)", 20);
6442 threshold = threshold / 100;
6443 return _this.model.each(function(el) {
6444 if (el.get('identity') < threshold) {
6445 return el.set('hidden', true);
6450 this.addNode("Hide seqs by selection", (function(_this) {
6453 hidden = _this.g.selcol.where({
6456 ids = _.map(hidden, function(el) {
6457 return el.get('seqId');
6459 _this.g.selcol.reset([]);
6460 return _this.model.each(function(el) {
6461 if (ids.indexOf(el.get('id')) >= 0) {
6462 return el.set('hidden', true);
6467 this.addNode("Hide seqs by gaps", (function(_this) {
6470 threshold = prompt("Enter threshold (in percent)", 40);
6471 return _this.model.each(function(el, i) {
6473 seq = el.get('seq');
6474 gaps = _.reduce(seq, (function(memo, c) {
6481 if (gaps > threshold) {
6482 return el.set('hidden', true);
6487 this.addNode("Reset", (function(_this) {
6489 _this.g.columns.set("hidden", []);
6490 return _this.model.each(function(el) {
6491 if (el.get('hidden')) {
6492 return el.set('hidden', false);
6497 this.el.appendChild(this.buildDOM());
6504 },{"../menubuilder":75,"underscore":59}],80:[function(require,module,exports){
6505 var HelpMenu, MenuBuilder;
6507 MenuBuilder = require("../menubuilder");
6509 module.exports = HelpMenu = MenuBuilder.extend({
6510 initialize: function(data) {
6511 return this.g = data.g;
6513 render: function() {
6514 this.setName("Help");
6515 this.addNode("About the project", (function(_this) {
6517 return window.open("https://github.com/greenify/biojs-vis-msa");
6520 this.addNode("Report issues", (function(_this) {
6522 return window.open("https://github.com/greenify/biojs-vis-msa/issues");
6525 this.addNode("User manual", (function(_this) {
6527 return window.open("https://github.com/greenify/biojs-vis-msa/wiki");
6530 this.el.style.display = "inline-block";
6531 this.el.appendChild(this.buildDOM());
6538 },{"../menubuilder":75}],81:[function(require,module,exports){
6539 var Clustal, FastaReader, ImportMenu, MenuBuilder, corsURL;
6541 Clustal = require("biojs-io-clustal");
6543 FastaReader = require("biojs-io-fasta").parse;
6545 MenuBuilder = require("../menubuilder");
6547 corsURL = require("../../utils/proxy").corsURL;
6549 module.exports = ImportMenu = MenuBuilder.extend({
6550 initialize: function(data) {
6552 return this.el.style.display = "inline-block";
6554 render: function() {
6555 this.setName("Import");
6556 this.addNode("FASTA", (function(_this) {
6557 return function(e) {
6559 url = prompt("URL", "/test/dummy/samples/p53.clustalo.fasta");
6560 url = corsURL(url, _this.g);
6561 return FastaReader.read(url, function(seqs) {
6563 zoomer = _this.g.zoomer.toJSON();
6564 zoomer.labelWidth = 200;
6565 zoomer.boxRectHeight = 2;
6566 zoomer.boxRectWidth = 2;
6567 _this.model.reset([]);
6568 _this.g.zoomer.set(zoomer);
6569 _this.model.reset(seqs);
6570 return _this.g.columns.calcConservation(_this.model);
6574 this.addNode("CLUSTAL", (function(_this) {
6577 url = prompt("URL", "/test/dummy/samples/p53.clustalo.clustal");
6578 url = corsURL(url, _this.g);
6579 return Clustal.read(url, function(seqs) {
6581 zoomer = _this.g.zoomer.toJSON();
6582 zoomer.labelWidth = 200;
6583 zoomer.boxRectHeight = 2;
6584 zoomer.boxRectWidth = 2;
6585 _this.model.reset([]);
6586 _this.g.zoomer.set(zoomer);
6587 _this.model.reset(seqs);
6588 return _this.g.columns.calcConservation(_this.model);
6592 this.addNode("add your own Parser", (function(_this) {
6594 return window.open("https://github.com/biojs/biojs2");
6597 this.el.appendChild(this.buildDOM());
6604 },{"../../utils/proxy":93,"../menubuilder":75,"biojs-io-clustal":undefined,"biojs-io-fasta":undefined}],82:[function(require,module,exports){
6605 var MenuBuilder, OrderingMenu, dom, _;
6607 MenuBuilder = require("../menubuilder");
6609 dom = require("dom-helper");
6611 _ = require('underscore');
6613 module.exports = OrderingMenu = MenuBuilder.extend({
6614 initialize: function(data) {
6617 return this.el.style.display = "inline-block";
6619 setOrder: function(order) {
6621 return this.render();
6623 render: function() {
6624 var comps, el, m, _i, _len;
6625 this.setName("Ordering");
6626 comps = this.getComparators();
6627 for (_i = 0, _len = comps.length; _i < _len; _i++) {
6631 el = this.buildDOM();
6632 dom.removeAllChilds(this.el);
6633 this.el.appendChild(el);
6636 _addNode: function(m) {
6640 if (text === this.order) {
6641 style.backgroundColor = "#77ED80";
6643 return this.addNode(text, (function(_this) {
6645 if (m.precode != null) {
6648 _this.model.comparator = m.comparator;
6650 return _this.setOrder(m.text);
6656 getComparators: function() {
6665 comparator: function(a, b) {
6666 return -a.get("id").localeCompare(b.get("id"));
6675 comparator: function(a, b) {
6676 return -a.get("name").localeCompare(b.get("name"));
6685 comparator: function(a, b) {
6686 return -a.get("seq").localeCompare(b.get("seq"));
6691 comparator: "identity"
6694 text: "Identity Desc",
6695 comparator: function(seq) {
6696 return -seq.get("identity");
6700 text: "Partition codes",
6701 comparator: "partition",
6702 precode: (function(_this) {
6704 _this.g.vis.set('labelPartition', true);
6705 return _this.model.each(function(el) {
6706 return el.set('partition', _.random(1, 3));
6717 },{"../menubuilder":75,"dom-helper":49,"underscore":59}],83:[function(require,module,exports){
6718 var MenuBuilder, SelectionMenu, sel;
6720 sel = require("../../g/selection/Selection");
6722 MenuBuilder = require("../menubuilder");
6724 module.exports = SelectionMenu = MenuBuilder.extend({
6725 initialize: function(data) {
6727 return this.el.style.display = "inline-block";
6729 render: function() {
6730 this.setName("Selection");
6731 this.addNode("Find Motif (supports RegEx)", (function(_this) {
6733 var leftestIndex, newSeli, origIndex, search, selcol;
6734 search = prompt("your search", "D");
6735 search = new RegExp(search, "gi");
6736 selcol = _this.g.selcol;
6738 leftestIndex = origIndex = 100042;
6739 _this.model.each(function(seq) {
6740 var args, index, match, strSeq, _results;
6741 strSeq = seq.get("seq");
6743 while (match = search.exec(strSeq)) {
6744 index = match.index;
6747 xEnd: index + match[0].length - 1,
6748 seqId: seq.get("id")
6750 newSeli.push(new sel.possel(args));
6751 _results.push(leftestIndex = Math.min(index, leftestIndex));
6755 if (newSeli.length === 0) {
6756 alert("no selection found");
6758 selcol.reset(newSeli);
6759 if (leftestIndex === origIndex) {
6762 return _this.g.zoomer.setLeftOffset(leftestIndex);
6765 this.addNode("Invert columns", (function(_this) {
6767 var _i, _ref, _results;
6768 return _this.g.selcol.invertCol((function() {
6770 for (var _i = 0, _ref = _this.model.getMaxLength(); 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }
6775 this.addNode("Invert rows", (function(_this) {
6777 return _this.g.selcol.invertRow(_this.model.pluck("id"));
6780 this.addNode("Reset", (function(_this) {
6782 return _this.g.selcol.reset();
6785 this.el.appendChild(this.buildDOM());
6792 },{"../../g/selection/Selection":67,"../menubuilder":75}],84:[function(require,module,exports){
6793 var ImportMenu, MenuBuilder, dom;
6795 MenuBuilder = require("../menubuilder");
6797 dom = require("dom-helper");
6799 module.exports = ImportMenu = MenuBuilder.extend({
6800 initialize: function(data) {
6802 this.el.style.display = "inline-block";
6803 return this.listenTo(this.g.vis, "change", this.render);
6805 render: function() {
6806 var visEl, visElements, _i, _len;
6807 this.setName("Vis. elements");
6808 visElements = this.getVisElements();
6809 for (_i = 0, _len = visElements.length; _i < _len; _i++) {
6810 visEl = visElements[_i];
6811 this._addVisEl(visEl);
6813 this.addNode("Reset", (function(_this) {
6815 _this.g.vis.set("labels", true);
6816 _this.g.vis.set("sequences", true);
6817 _this.g.vis.set("metacell", true);
6818 _this.g.vis.set("conserv", true);
6819 _this.g.vis.set("labelId", true);
6820 _this.g.vis.set("labelName", true);
6821 return _this.g.vis.set("labelCheckbox", false);
6824 this.addNode("Toggle mouseover events", (function(_this) {
6826 return _this.g.config.set("registerMouseHover", !_this.g.config.get("registerMouseHover"));
6829 dom.removeAllChilds(this.el);
6830 this.el.appendChild(this.buildDOM());
6833 _addVisEl: function(visEl) {
6836 if (this.g.vis.get(visEl.id)) {
6838 style.color = "red";
6841 style.color = "green";
6843 return this.addNode(pre + visEl.name, (function(_this) {
6845 return _this.g.vis.set(visEl.id, !_this.g.vis.get(visEl.id));
6851 getVisElements: function() {
6871 name: "Overviewbox",
6887 name: "LabelCheckbox",
6896 },{"../menubuilder":75,"dom-helper":49}],85:[function(require,module,exports){
6899 Feature = require("./Feature");
6901 Model = require("backbone-thin").Model;
6903 module.exports = Feature = Model.extend({
6913 borderColor: "black",
6917 validate: function() {
6918 if (isNaN(this.attributes.xStart || isNaN(this.attributes.xEnd))) {
6919 return "features need integer start and end.";
6922 contains: function(index) {
6923 return this.attributes.xStart <= index && index <= this.attributes.xEnd;
6929 },{"./Feature":85,"backbone-thin":5}],86:[function(require,module,exports){
6930 var Collection, Feature, FeatureCol, _;
6932 Feature = require("./Feature");
6934 Collection = require("backbone-thin").Collection;
6936 _ = require("underscore");
6938 module.exports = FeatureCol = Collection.extend({
6940 constructor: function() {
6941 this.startOnCache = [];
6942 this.on("all", function() {
6943 return this.startOnCache = [];
6945 return Collection.apply(this, arguments);
6947 startOn: function(index) {
6948 if (this.startOnCache[index] == null) {
6949 this.startOnCache[index] = this.where({
6953 return this.startOnCache[index];
6955 contains: function(index) {
6956 return this.reduce(function(el, memo) {
6957 return memo || el.contains(index);
6960 getMinRows: function() {
6962 len = this.max(function(el) {
6963 return el.get("xEnd");
6965 rows = (function() {
6968 for (x = _i = 1; 1 <= len ? _i <= len : _i >= len; x = 1 <= len ? ++_i : --_i) {
6973 this.each(function(el) {
6974 var _i, _ref, _ref1, _results;
6976 for (x = _i = _ref = el.get("xStart"), _ref1 = feature.get("xEnd"); _i <= _ref1; x = _i += 1) {
6977 _results.push(rows[x]++);
6987 },{"./Feature":85,"backbone-thin":5,"underscore":59}],87:[function(require,module,exports){
6988 var Collection, SeqManager, Sequence;
6990 Sequence = require("./Sequence");
6992 Collection = require("backbone-thin").Collection;
6994 module.exports = SeqManager = Collection.extend({
6996 constructor: function() {
6997 Collection.apply(this, arguments);
6998 this.on("all", function() {
6999 return this.lengthCache = null;
7001 this.lengthCache = null;
7004 getMaxLength: function() {
7005 if (this.models.length === 0) {
7008 if (this.lengthCache === null) {
7009 this.lengthCache = this.max(function(seq) {
7010 return seq.get("seq").length;
7011 }).get("seq").length;
7013 return this.lengthCache;
7015 prev: function(model, endless) {
7017 index = this.indexOf(model) - 1;
7018 if (index < 0 && endless) {
7019 index = this.length - 1;
7021 return this.at(index);
7023 next: function(model, endless) {
7025 index = this.indexOf(model) + 1;
7026 if (index === this.length && endless) {
7029 return this.at(index);
7031 calcHiddenSeqs: function(n) {
7034 for (i = _i = 0; 0 <= nNew ? _i <= nNew : _i >= nNew; i = 0 <= nNew ? ++_i : --_i) {
7035 if (this.at(i).get("hidden")) {
7045 },{"./Sequence":88,"backbone-thin":5}],88:[function(require,module,exports){
7046 var FeatureCol, Model, Sequence;
7048 Model = require("backbone-thin").Model;
7050 FeatureCol = require("./FeatureCol");
7052 module.exports = Sequence = Model.extend({
7058 initialize: function() {
7059 this.set("grey", []);
7060 return this.set("features", new FeatureCol());
7066 },{"./FeatureCol":86,"backbone-thin":5}],89:[function(require,module,exports){
7067 module.exports.seq = require("./Sequence");
7069 module.exports.seqcol = require("./SeqCollection");
7071 module.exports.feature = require("./Feature");
7073 module.exports.featurecol = require("./FeatureCol");
7077 },{"./Feature":85,"./FeatureCol":86,"./SeqCollection":87,"./Sequence":88}],90:[function(require,module,exports){
7078 var Colorator, Columns, Config, Consensus, Eventhandler, SelCol, SeqCollection, Stage, VisOrdering, Visibility, Zoomer, boneView;
7080 SeqCollection = require("./model/SeqCollection");
7082 Colorator = require("./g/colorator");
7084 Consensus = require("./g/consensus");
7086 Columns = require("./g/columns");
7088 Config = require("./g/config");
7090 SelCol = require("./g/selection/SelectionCol");
7092 Visibility = require("./g/visibility");
7094 VisOrdering = require("./g/visOrdering");
7096 Zoomer = require("./g/zoomer");
7098 boneView = require("backbone-childs");
7100 Eventhandler = require("biojs-events");
7102 Stage = require("./views/Stage");
7104 module.exports = boneView.extend({
7105 initialize: function(data) {
7107 if (data.columns == null) {
7110 if (data.conf == null) {
7113 if (data.vis == null) {
7116 if (data.zoomer == null) {
7117 if (!((_ref = data.visorder) != null ? _ref : data.zoomer = {})) {
7121 this.g = Eventhandler.mixin({});
7122 if (data.seqs === void 0 || data.seqs.length === 0) {
7123 console.log("warning. empty seqs.");
7125 this.seqs = new SeqCollection(data.seqs);
7126 this.g.config = new Config(data.conf);
7127 this.g.consensus = new Consensus();
7128 this.g.columns = new Columns(data.columns);
7129 this.g.colorscheme = new Colorator();
7130 this.g.selcol = new SelCol([], {
7133 this.g.vis = new Visibility(data.vis);
7134 this.g.visorder = new VisOrdering(data.visorder);
7135 this.g.zoomer = new Zoomer(data.zoomer, {
7138 this.addView("stage", new Stage({
7142 this.el.setAttribute("class", "biojs_msa_div");
7143 if (this.g.config.get("eventBus") === true) {
7144 return this.startEventBus();
7147 startEventBus: function() {
7148 var busObjs, key, _i, _len, _results;
7149 busObjs = ["config", "consensus", "columns", "colorscheme", "selcol", "vis", "visorder", "zoomer"];
7151 for (_i = 0, _len = busObjs.length; _i < _len; _i++) {
7153 _results.push(this._proxyToG(key));
7157 _proxyToG: function(key) {
7158 return this.listenTo(this.g[key], "all", function(name, prev, now) {
7159 if (name === "change") {
7162 return this.g.trigger(key + ":" + name, now);
7165 render: function() {
7166 this.renderSubviews();
7167 this.g.vis.set("loaded", true);
7174 },{"./g/colorator":63,"./g/columns":64,"./g/config":65,"./g/consensus":66,"./g/selection/SelectionCol":68,"./g/visOrdering":69,"./g/visibility":70,"./g/zoomer":71,"./model/SeqCollection":87,"./views/Stage":100,"backbone-childs":3,"biojs-events":14}],91:[function(require,module,exports){
7177 module.exports = BMath = (function() {
7180 BMath.randomInt = function(lower, upper) {
7182 if (upper == null) {
7183 _ref = [0, lower], lower = _ref[0], upper = _ref[1];
7185 if (lower > upper) {
7186 _ref1 = [upper, lower], lower = _ref1[0], upper = _ref1[1];
7188 return Math.floor(Math.random() * (upper - lower + 1) + lower);
7191 BMath.uniqueId = function(length) {
7193 if (length == null) {
7197 while (id.length < length) {
7198 id += Math.random().toString(36).substr(2);
7200 return id.substr(0, length);
7203 BMath.getRandomInt = function(min, max) {
7204 return Math.floor(Math.random() * (max - min + 1)) + min;
7213 },{}],92:[function(require,module,exports){
7214 module.exports.bmath = require("./bmath");
7216 module.exports.proxy = require("./proxy");
7218 module.exports.seqgen = require("./seqgen");
7222 },{"./bmath":91,"./proxy":93,"./seqgen":94}],93:[function(require,module,exports){
7225 module.exports = proxy = {
7226 corsURL: (function(_this) {
7227 return function(url, g) {
7229 if (document.URL.indexOf('localhost') >= 0 && url[0] === "/") {
7232 url = url.replace("www\.", "");
7233 url = url.replace("http://", "");
7234 url = _this.g.config.get('importProxy') + url;
7242 },{}],94:[function(require,module,exports){
7243 var BMath, Sequence, seqgen;
7245 Sequence = require("biojs-model").seq;
7247 BMath = require("./bmath");
7249 seqgen = module.exports = {
7250 _generateSequence: function(len) {
7251 var i, possible, text, _i, _ref;
7253 possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
7254 for (i = _i = 0, _ref = len - 1; _i <= _ref; i = _i += 1) {
7255 text += possible.charAt(Math.floor(Math.random() * possible.length));
7259 getDummySequences: function(len, seqLen) {
7263 len = BMath.getRandomInt(3, 5);
7265 if (seqLen == null) {
7266 seqLen = BMath.getRandomInt(50, 200);
7268 for (i = _i = 1; _i <= len; i = _i += 1) {
7269 seqs.push(new Sequence(seqgen._generateSequence(seqLen), "seq" + i, "r" + i));
7277 },{"./bmath":91,"biojs-model":27}],95:[function(require,module,exports){
7278 var Base, Line, Polygon, Rect, setAttr, svgns;
7280 svgns = "http://www.w3.org/2000/svg";
7282 setAttr = function(obj, opts) {
7284 for (name in opts) {
7286 obj.setAttributeNS(null, name, value);
7291 Base = function(opts) {
7293 svg = document.createElementNS(svgns, 'svg');
7294 svg.setAttribute("width", opts.width);
7295 svg.setAttribute("height", opts.height);
7299 Rect = function(opts) {
7301 rect = document.createElementNS(svgns, 'rect');
7302 return setAttr(rect, opts);
7305 Line = function(opts) {
7307 line = document.createElementNS(svgns, 'line');
7308 return setAttr(line, opts);
7311 Polygon = function(opts) {
7313 line = document.createElementNS(svgns, 'polygon');
7314 return setAttr(line, opts);
7317 module.exports.rect = Rect;
7319 module.exports.line = Line;
7321 module.exports.polygon = Polygon;
7323 module.exports.base = Base;
7327 },{}],96:[function(require,module,exports){
7328 var LabelBlock, SeqBlock, boneView;
7330 boneView = require("backbone-childs");
7332 SeqBlock = require("./CanvasSeqBlock");
7334 LabelBlock = require("./labels/LabelBlock");
7336 module.exports = boneView.extend({
7337 initialize: function(data) {
7338 var labelblock, seqblock;
7341 labelblock = new LabelBlock({
7345 labelblock.ordering = -1;
7346 this.addView("labelblock", labelblock);
7348 if (this.g.vis.get("sequences")) {
7349 seqblock = new SeqBlock({
7353 seqblock.ordering = 0;
7354 this.addView("seqblock", seqblock);
7356 this.listenTo(this.g.zoomer, "change:alignmentHeight", this.adjustHeight);
7357 return this.listenTo(this.g.columns, "change:hidden", this.adjustHeight);
7359 render: function() {
7360 this.renderSubviews();
7361 this.el.className = "biojs_msa_albody";
7362 this.el.style.whiteSpace = "nowrap";
7363 this.adjustHeight();
7366 adjustHeight: function() {
7367 if (this.g.zoomer.get("alignmentHeight") === "auto") {
7368 this.el.style.height = (this.g.zoomer.get("rowHeight") * this.model.length) + 5;
7370 this.el.style.height = this.g.zoomer.get("alignmentHeight");
7372 return this.el.style.width = this.getWidth() + 15;
7374 getWidth: function() {
7377 if (this.g.vis.get("labels")) {
7378 width += this.g.zoomer.get("labelWidth");
7380 if (this.g.vis.get("metacell")) {
7381 width += this.g.zoomer.get("metaWidth");
7383 if (this.g.vis.get("sequences")) {
7384 width += this.g.zoomer.get("alignmentWidth");
7392 },{"./CanvasSeqBlock":98,"./labels/LabelBlock":104,"backbone-childs":3}],97:[function(require,module,exports){
7393 var CanvasCharCache, Events;
7395 Events = require("biojs-events");
7397 module.exports = CanvasCharCache = (function() {
7398 function CanvasCharCache(g) {
7401 this.cacheHeight = 0;
7402 this.cacheWidth = 0;
7405 CanvasCharCache.prototype.getFontTile = function(letter, width, height) {
7406 if (width !== this.cacheWidth || height !== this.cacheHeight) {
7407 this.cacheHeight = height;
7408 this.cacheWidth = width;
7411 if (this.cache[letter] === void 0) {
7412 this.createTile(letter, width, height);
7414 return this.cache[letter];
7417 CanvasCharCache.prototype.createTile = function(letter, width, height) {
7419 canvas = this.cache[letter] = document.createElement("canvas");
7420 canvas.width = width;
7421 canvas.height = height;
7422 this.ctx = canvas.getContext('2d');
7423 this.ctx.font = this.g.zoomer.get("residueFont");
7424 this.ctx.textBaseline = 'middle';
7425 this.ctx.textAlign = "center";
7426 return this.ctx.fillText(letter, width / 2, height / 2, width);
7429 return CanvasCharCache;
7435 },{"biojs-events":14}],98:[function(require,module,exports){
7436 var CharCache, boneView, colorSelector, jbone, mouse, _;
7438 boneView = require("backbone-childs");
7440 mouse = require("mouse-pos");
7442 colorSelector = require("biojs-util-colorschemes").selector;
7444 _ = require("underscore");
7446 jbone = require("jbone");
7448 CharCache = require("./CanvasCharCache");
7450 module.exports = boneView.extend({
7452 initialize: function(data) {
7454 this.listenTo(this.g.zoomer, "change:_alignmentScrollLeft change:_alignmentScrollTop", function(model, value, options) {
7455 if (((options != null ? options.origin : void 0) == null) || options.origin !== "canvasseq") {
7456 return this.render();
7459 this.listenTo(this.g.columns, "change:hidden", this.render);
7460 this.listenTo(this.g.zoomer, "change:alignmentWidth", this.render);
7461 this.listenTo(this.g.colorscheme, "change", this.render);
7462 this.listenTo(this.g.selcol, "reset add", this.render);
7463 this.el.style.display = "inline-block";
7464 this.el.style.overflowX = "hidden";
7465 this.el.style.overflowY = "hidden";
7466 this.el.className = "biojs_msa_seqblock";
7467 this.ctx = this.el.getContext('2d');
7468 this.cache = new CharCache(this.g);
7469 this.throttleTime = 0;
7470 this.throttleCounts = 0;
7471 if (document.documentElement.style.webkitAppearance != null) {
7472 this.throttledDraw = function() {
7474 start = +new Date();
7476 this.throttleTime += +new Date() - start;
7477 this.throttleCounts++;
7478 if (this.throttleCounts > 15) {
7479 tTime = Math.ceil(this.throttleTime / this.throttleCounts);
7480 console.log("avgDrawTime/WebKit", tTime);
7481 return this.throttledDraw = this.draw;
7485 this.throttledDraw = _.throttle(this.throttledDraw, 30);
7487 return this.manageEvents();
7489 throttledDraw: function() {
7491 start = +new Date();
7493 this.throttleTime += +new Date() - start;
7494 this.throttleCounts++;
7495 if (this.throttleCounts > 15) {
7496 tTime = Math.ceil(this.throttleTime / this.throttleCounts);
7497 console.log("avgDrawTime", tTime);
7499 tTime = Math.max(20, tTime);
7500 return this.throttledDraw = _.throttle(this.draw, tTime);
7503 manageEvents: function() {
7506 events.mousedown = "_onmousedown";
7507 events.touchstart = "_ontouchstart";
7508 if (this.g.config.get("registerMouseClicks")) {
7509 events.dblclick = "_onclick";
7511 if (this.g.config.get("registerMouseHover")) {
7512 events.mousein = "_onmousein";
7513 events.mouseout = "_onmouseout";
7515 events.mousewheel = "_onmousewheel";
7516 events.DOMMouseScroll = "_onmousewheel";
7517 this.delegateEvents(events);
7518 this.listenTo(this.g.config, "change:registerMouseHover", this.manageEvents);
7519 this.listenTo(this.g.config, "change:registerMouseClick", this.manageEvents);
7520 return this.dragStart = [];
7524 this.el.width = this.el.width;
7525 rectHeight = this.g.zoomer.get("rowHeight");
7526 this.ctx.globalAlpha = this.g.colorscheme.get("opacity");
7527 this.drawSeqs(function(data) {
7528 return this.drawSeq(data, this._drawRect);
7530 this.ctx.globalAlpha = 1;
7531 this.drawSeqs(function(data) {
7532 return this.drawSeq(data, this._drawLetter);
7534 return this.drawSeqs(this.drawSeqExtended);
7536 drawSeqs: function(callback) {
7537 var hidden, i, rectHeight, start, y, _i, _ref, _results;
7538 rectHeight = this.g.zoomer.get("rowHeight");
7539 hidden = this.g.columns.get("hidden");
7540 start = Math.max(0, Math.abs(Math.ceil(-this.g.zoomer.get('_alignmentScrollTop') / rectHeight)));
7541 y = -Math.abs(-this.g.zoomer.get('_alignmentScrollTop') % rectHeight);
7543 for (i = _i = start, _ref = this.model.length - 1; _i <= _ref; i = _i += 1) {
7544 if (this.model.at(i).get('hidden')) {
7547 callback.call(this, {
7548 model: this.model.at(i),
7553 if (y > this.el.height) {
7556 _results.push(void 0);
7561 drawSeq: function(data, callback) {
7562 var c, elWidth, j, rectHeight, rectWidth, res, seq, start, x, y, _i, _ref, _results;
7563 seq = data.model.get("seq");
7565 rectWidth = this.g.zoomer.get("columnWidth");
7566 rectHeight = this.g.zoomer.get("rowHeight");
7567 start = Math.max(0, Math.abs(Math.ceil(-this.g.zoomer.get('_alignmentScrollLeft') / rectWidth)));
7568 x = -Math.abs(-this.g.zoomer.get('_alignmentScrollLeft') % rectWidth);
7570 rectWidth: rectWidth,
7571 rectHeight: rectHeight,
7574 elWidth = this.el.width;
7576 for (j = _i = start, _ref = seq.length - 1; _i <= _ref; j = _i += 1) {
7578 c = c.toUpperCase();
7581 if (data.hidden.indexOf(j) < 0) {
7582 callback(this, res);
7590 _results.push(void 0);
7595 _drawRect: function(that, data) {
7597 color = that.color[data.c];
7598 if (color != null) {
7599 that.ctx.fillStyle = color;
7600 return that.ctx.fillRect(data.x, data.y, data.rectWidth, data.rectHeight);
7603 _drawLetter: function(that, data) {
7604 return that.ctx.drawImage(that.cache.getFontTile(data.c, data.rectWidth, data.rectHeight), data.x, data.y, data.rectWidth, data.rectHeight);
7606 drawSeqExtended: function(data) {
7607 var f, features, j, mNextSel, mPrevSel, rectHeight, rectWidth, selection, seq, start, starts, x, xZero, yZero, _i, _j, _len, _ref, _ref1;
7608 seq = data.model.get("seq");
7609 rectWidth = this.g.zoomer.get("columnWidth");
7610 rectHeight = this.g.zoomer.get("rowHeight");
7611 start = Math.max(0, Math.abs(Math.ceil(-this.g.zoomer.get('_alignmentScrollLeft') / rectWidth)));
7612 x = -Math.abs(-this.g.zoomer.get('_alignmentScrollLeft') % rectWidth);
7613 xZero = x - start * rectWidth;
7614 selection = this._getSelection(data.model);
7615 _ref = this._getPrevNextSelection(data.model), mPrevSel = _ref[0], mNextSel = _ref[1];
7616 features = data.model.get("features");
7618 for (j = _i = start, _ref1 = seq.length - 1; _i <= _ref1; j = _i += 1) {
7619 starts = features.startOn(j);
7620 if (data.hidden.indexOf(j) >= 0) {
7623 if (starts.length > 0) {
7624 for (_j = 0, _len = starts.length; _j < _len; _j++) {
7626 this.appendFeature({
7634 if (x > this.el.width) {
7638 return this._appendSelection({
7645 render: function() {
7646 this.el.setAttribute('height', this.g.zoomer.get("alignmentHeight"));
7647 this.el.setAttribute('width', this.g.zoomer.get("alignmentWidth"));
7648 this.g.zoomer._adjustWidth(this.el, this.model);
7649 this.g.zoomer._checkScrolling(this._checkScrolling([this.g.zoomer.get('_alignmentScrollLeft'), this.g.zoomer.get('_alignmentScrollTop')]), {
7652 this.color = colorSelector.getColor(this.g.colorscheme.get("scheme"));
7653 this.throttledDraw();
7656 _onmousemove: function(e, reversed) {
7657 var dragEnd, i, relDist, relEnd, scaleFactor, scrollCorrected, _i, _j, _k;
7658 if (this.dragStart.length === 0) {
7661 dragEnd = mouse.abs(e);
7662 relEnd = [dragEnd[0] - this.dragStart[0], dragEnd[1] - this.dragStart[1]];
7663 scaleFactor = this.g.zoomer.get("canvasEventScale");
7667 for (i = _i = 0; _i <= 1; i = _i += 1) {
7668 relEnd[i] = relEnd[i] * scaleFactor;
7670 relDist = [this.dragStartScroll[0] - relEnd[0], this.dragStartScroll[1] - relEnd[1]];
7671 for (i = _j = 0; _j <= 1; i = _j += 1) {
7672 relDist[i] = Math.round(relDist[i]);
7674 scrollCorrected = this._checkScrolling(relDist);
7675 this.g.zoomer._checkScrolling(scrollCorrected, {
7678 for (i = _k = 0; _k <= 1; i = _k += 1) {
7679 if (scrollCorrected[i] !== relDist[i]) {
7680 if (scrollCorrected[i] === 0) {
7681 this.dragStart[i] = dragEnd[i];
7682 this.dragStartScroll[i] = 0;
7684 this.dragStart[i] = dragEnd[i] - scrollCorrected[i];
7688 this.throttledDraw();
7689 if (e.preventDefault != null) {
7691 return e.stopPropagation();
7694 _ontouchmove: function(e) {
7695 this._onmousemove(e.changedTouches[0], true);
7697 return e.stopPropagation();
7699 _onmousedown: function(e) {
7700 this.dragStart = mouse.abs(e);
7701 this.dragStartScroll = [this.g.zoomer.get('_alignmentScrollLeft'), this.g.zoomer.get('_alignmentScrollTop')];
7702 jbone(document.body).on('mousemove.overmove', (function(_this) {
7703 return function(e) {
7704 return _this._onmousemove(e);
7707 jbone(document.body).on('mouseup.overup', (function(_this) {
7709 return _this._cleanup();
7712 return e.preventDefault();
7714 _ontouchstart: function(e) {
7715 this.dragStart = mouse.abs(e.changedTouches[0]);
7716 this.dragStartScroll = [this.g.zoomer.get('_alignmentScrollLeft'), this.g.zoomer.get('_alignmentScrollTop')];
7717 jbone(document.body).on('touchmove.overtmove', (function(_this) {
7718 return function(e) {
7719 return _this._ontouchmove(e);
7722 return jbone(document.body).on('touchend.overtend touchleave.overtleave touchcancel.overtcanel', (function(_this) {
7723 return function(e) {
7724 return _this._touchCleanup(e);
7728 _onmousewinout: function(e) {
7729 if (e.toElement === document.body.parentNode) {
7730 return this._cleanup();
7733 _cleanup: function() {
7734 this.dragStart = [];
7735 jbone(document.body).off('.overmove');
7736 jbone(document.body).off('.overup');
7737 return jbone(document.body).off('.overout');
7739 _touchCleanup: function(e) {
7740 if (e.changedTouches.length > 0) {
7741 this._onmousemove(e.changedTouches[0], true);
7743 this.dragStart = [];
7744 jbone(document.body).off('.overtmove');
7745 jbone(document.body).off('.overtend');
7746 jbone(document.body).off('.overtleave');
7747 return jbone(document.body).off('.overtcancel');
7749 _onmousewheel: function(e) {
7751 delta = mouse.wheelDelta(e);
7752 this.g.zoomer.set('_alignmentScrollLeft', this.g.zoomer.get('_alignmentScrollLeft') + delta[0]);
7753 this.g.zoomer.set('_alignmentScrollTop', this.g.zoomer.get('_alignmentScrollTop') + delta[1]);
7754 return e.preventDefault();
7756 _onclick: function(e) {
7757 this.g.trigger("residue:click", this._getClickPos(e));
7758 return this.throttledDraw();
7760 _onmousein: function(e) {
7761 this.g.trigger("residue:click", this._getClickPos(e));
7762 return this.throttledDraw();
7764 _onmouseout: function(e) {
7765 this.g.trigger("residue:click", this._getClickPos(e));
7766 return this.throttledDraw();
7768 _getClickPos: function(e) {
7769 var coords, seqId, x, y;
7770 coords = mouse.rel(e);
7771 coords[0] += this.g.zoomer.get("_alignmentScrollLeft");
7772 coords[1] += this.g.zoomer.get("_alignmentScrollTop");
7773 x = Math.floor(coords[0] / this.g.zoomer.get("columnWidth"));
7774 y = Math.floor(coords[1] / this.g.zoomer.get("rowHeight"));
7775 x += this.g.columns.calcHiddenColumns(x);
7776 y += this.model.calcHiddenSeqs(y);
7779 seqId = this.model.at(y).get("id");
7786 _checkScrolling: function(scrollObj) {
7788 max = [this.model.getMaxLength() * this.g.zoomer.get("columnWidth") - this.g.zoomer.get('alignmentWidth'), this.model.length * this.g.zoomer.get("rowHeight") - this.g.zoomer.get('alignmentHeight')];
7789 for (i = _i = 0; _i <= 1; i = _i += 1) {
7790 if (scrollObj[i] > max[i]) {
7791 scrollObj[i] = max[i];
7793 if (scrollObj[i] < 0) {
7799 _getSelection: function(model) {
7800 var maxLen, n, rows, sel, selection, sels, _i, _j, _k, _len, _ref, _ref1, _ref2;
7801 maxLen = model.get("seq").length;
7803 sels = this.g.selcol.getSelForRow(model.get("id"));
7804 rows = _.find(sels, function(el) {
7805 return el.get("type") === "row";
7808 for (n = _i = 0, _ref = maxLen - 1; _i <= _ref; n = _i += 1) {
7811 } else if (sels.length > 0) {
7812 for (_j = 0, _len = sels.length; _j < _len; _j++) {
7814 for (n = _k = _ref1 = sel.get("xStart"), _ref2 = sel.get("xEnd"); _k <= _ref2; n = _k += 1) {
7821 appendFeature: function(data) {
7822 var beforeStyle, beforeWidth, boxHeight, boxWidth, f, width;
7824 boxWidth = this.g.zoomer.get("columnWidth");
7825 boxHeight = this.g.zoomer.get("rowHeight");
7826 width = (f.get("xEnd") - f.get("xStart")) * boxWidth;
7827 beforeWidth = this.ctx.lineWidth;
7828 this.ctx.lineWidth = 3;
7829 beforeStyle = this.ctx.strokeStyle;
7830 this.ctx.strokeStyle = f.get("fillColor");
7831 this.ctx.strokeRect(data.xZero, data.yZero, width, boxHeight);
7832 this.ctx.strokeStyle = beforeStyle;
7833 return this.ctx.lineWidth = beforeWidth;
7835 _appendSelection: function(data) {
7836 var boxHeight, boxWidth, hiddenOffset, k, mNextSel, mPrevSel, n, selection, seq, _i, _ref, _ref1, _results;
7837 seq = data.model.get("seq");
7838 selection = this._getSelection(data.model);
7839 _ref = this._getPrevNextSelection(data.model), mPrevSel = _ref[0], mNextSel = _ref[1];
7840 boxWidth = this.g.zoomer.get("columnWidth");
7841 boxHeight = this.g.zoomer.get("rowHeight");
7842 if (selection.length === 0) {
7847 for (n = _i = 0, _ref1 = seq.length - 1; _i <= _ref1; n = _i += 1) {
7848 if (data.hidden.indexOf(n) >= 0) {
7849 _results.push(hiddenOffset++);
7851 k = n - hiddenOffset;
7852 if (selection.indexOf(n) >= 0 && (k === 0 || selection.indexOf(n - 1) < 0)) {
7853 _results.push(this._renderSelection({
7856 selection: selection,
7864 _results.push(void 0);
7870 _renderSelection: function(data) {
7871 var beforeStyle, beforeWidth, boxHeight, boxWidth, hidden, i, k, mNextSel, mPrevSel, n, selection, selectionLength, totalWidth, xPart, xPos, xZero, yZero, _i, _j, _ref, _ref1;
7876 selection = data.selection;
7877 mPrevSel = data.mPrevSel;
7878 mNextSel = data.mNextSel;
7879 selectionLength = 0;
7880 for (i = _i = n, _ref = data.model.get("seq").length - 1; _i <= _ref; i = _i += 1) {
7881 if (selection.indexOf(i) >= 0) {
7887 boxWidth = this.g.zoomer.get("columnWidth");
7888 boxHeight = this.g.zoomer.get("rowHeight");
7889 totalWidth = (boxWidth * selectionLength) + 1;
7890 hidden = this.g.columns.get('hidden');
7891 this.ctx.beginPath();
7892 beforeWidth = this.ctx.lineWidth;
7893 this.ctx.lineWidth = 3;
7894 beforeStyle = this.ctx.strokeStyle;
7895 this.ctx.strokeStyle = "#FF0000";
7896 xZero += k * boxWidth;
7898 for (i = _j = 0, _ref1 = selectionLength - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) {
7900 if (hidden.indexOf(xPos) >= 0) {
7903 if (!((mPrevSel != null) && mPrevSel.indexOf(xPos) >= 0)) {
7904 this.ctx.moveTo(xZero + xPart, yZero);
7905 this.ctx.lineTo(xPart + boxWidth + xZero, yZero);
7907 if (!((mNextSel != null) && mNextSel.indexOf(xPos) >= 0)) {
7908 this.ctx.moveTo(xPart + xZero, boxHeight + yZero);
7909 this.ctx.lineTo(xPart + boxWidth + xZero, boxHeight + yZero);
7913 this.ctx.moveTo(xZero, yZero);
7914 this.ctx.lineTo(xZero, boxHeight + yZero);
7915 this.ctx.moveTo(xZero + totalWidth, yZero);
7916 this.ctx.lineTo(xZero + totalWidth, boxHeight + yZero);
7918 this.ctx.strokeStyle = beforeStyle;
7919 return this.ctx.lineWidth = beforeWidth;
7921 _getPrevNextSelection: function(model) {
7922 var mNextSel, mPrevSel, modelNext, modelPrev;
7923 modelPrev = model.collection.prev(model);
7924 modelNext = model.collection.next(model);
7925 if (modelPrev != null) {
7926 mPrevSel = this._getSelection(modelPrev);
7928 if (modelNext != null) {
7929 mNextSel = this._getSelection(modelNext);
7931 return [mPrevSel, mNextSel];
7937 },{"./CanvasCharCache":97,"backbone-childs":3,"biojs-util-colorschemes":29,"jbone":50,"mouse-pos":51,"underscore":59}],99:[function(require,module,exports){
7938 var OverviewBox, colorSelector, jbone, mouse, selection, view, _;
7940 view = require("backbone-viewj");
7942 mouse = require("mouse-pos");
7944 selection = require("../g/selection/Selection");
7946 colorSelector = require("biojs-util-colorschemes").selector;
7948 jbone = require("jbone");
7950 _ = require("underscore");
7952 module.exports = OverviewBox = view.extend({
7953 className: "biojs_msa_overviewbox",
7955 initialize: function(data) {
7957 this.listenTo(this.g.zoomer, "change:boxRectWidth change:boxRectHeight", this.render);
7958 this.listenTo(this.g.selcol, "add reset change", this.render);
7959 this.listenTo(this.g.columns, "change:hidden", this.render);
7960 this.listenTo(this.g.colorscheme, "change:showLowerCase", this.render);
7961 this.listenTo(this.model, "change", _.debounce(this.render, 5));
7962 this.color = colorSelector.getColor(this.g.colorscheme.get("scheme"));
7963 this.listenTo(this.g.colorscheme, "change:scheme", function() {
7964 this.color = colorSelector.getColor(this.g.colorscheme.get("scheme"));
7965 return this.render();
7967 return this.dragStart = [];
7971 mousedown: "_onmousedown"
7973 render: function() {
7974 var c, color, hidden, i, j, rectHeight, rectWidth, seq, showLowerCase, x, y, _i, _j, _ref, _ref1;
7975 this._createCanvas();
7976 this.el.textContent = "overview";
7977 this.ctx.fillStyle = "#999999";
7978 this.ctx.fillRect(0, 0, this.el.width, this.el.height);
7979 rectWidth = this.g.zoomer.get("boxRectWidth");
7980 rectHeight = this.g.zoomer.get("boxRectHeight");
7981 hidden = this.g.columns.get("hidden");
7982 showLowerCase = this.g.colorscheme.get("showLowerCase");
7984 for (i = _i = 0, _ref = this.model.length - 1; _i <= _ref; i = _i += 1) {
7985 seq = this.model.at(i).get("seq");
7988 if (this.model.at(i).get("hidden")) {
7989 console.log(this.model.at(i).get("hidden"));
7990 this.ctx.fillStyle = "grey";
7991 this.ctx.fillRect(0, y, seq.length * rectWidth, rectHeight);
7994 for (j = _j = 0, _ref1 = seq.length - 1; _j <= _ref1; j = _j += 1) {
7996 if (showLowerCase) {
7997 c = c.toUpperCase();
7999 color = this.color[c];
8000 if (hidden.indexOf(j) >= 0) {
8003 if (color != null) {
8004 this.ctx.fillStyle = color;
8005 this.ctx.fillRect(x, y, rectWidth, rectHeight);
8010 return this._drawSelection();
8012 _drawSelection: function() {
8013 var i, maxHeight, pos, rectHeight, rectWidth, sel, seq, _i, _ref;
8014 if (this.dragStart.length > 0 && !this.prolongSelection) {
8017 rectWidth = this.g.zoomer.get("boxRectWidth");
8018 rectHeight = this.g.zoomer.get("boxRectHeight");
8019 maxHeight = rectHeight * this.model.length;
8020 this.ctx.fillStyle = "#ffff00";
8021 this.ctx.globalAlpha = 0.9;
8022 for (i = _i = 0, _ref = this.g.selcol.length - 1; _i <= _ref; i = _i += 1) {
8023 sel = this.g.selcol.at(i);
8024 if (sel.get('type') === 'column') {
8025 this.ctx.fillRect(rectWidth * sel.get('xStart'), 0, rectWidth * (sel.get('xEnd') - sel.get('xStart') + 1), maxHeight);
8026 } else if (sel.get('type') === 'row') {
8027 seq = (this.model.filter(function(el) {
8028 return el.get('id') === sel.get('seqId');
8030 pos = this.model.indexOf(seq);
8031 this.ctx.fillRect(0, rectHeight * pos, rectWidth * seq.get('seq').length, rectHeight);
8032 } else if (sel.get('type') === 'pos') {
8033 seq = (this.model.filter(function(el) {
8034 return el.get('id') === sel.get('seqId');
8036 pos = this.model.indexOf(seq);
8037 this.ctx.fillRect(rectWidth * sel.get('xStart'), rectHeight * pos, rectWidth * (sel.get('xEnd') - sel.get('xStart') + 1), rectHeight);
8040 return this.ctx.globalAlpha = 1;
8042 _onclick: function(evt) {
8043 return this.g.trigger("meta:click", {
8044 seqId: this.model.get("id", {
8049 _onmousemove: function(e) {
8051 if (this.dragStart.length === 0) {
8055 this.ctx.fillStyle = "#ffff00";
8056 this.ctx.globalAlpha = 0.9;
8057 rect = this._calcSelection(mouse.abs(e));
8058 this.ctx.fillRect(rect[0][0], rect[1][0], rect[0][1] - rect[0][0], rect[1][1] - rect[1][0]);
8060 return e.stopPropagation();
8062 _onmousedown: function(e) {
8063 this.dragStart = mouse.abs(e);
8064 this.dragStartRel = mouse.rel(e);
8065 if (e.ctrlKey || e.metaKey) {
8066 this.prolongSelection = true;
8068 this.prolongSelection = false;
8070 jbone(document.body).on('mousemove.overmove', (function(_this) {
8071 return function(e) {
8072 return _this._onmousemove(e);
8075 jbone(document.body).on('mouseup.overup', (function(_this) {
8076 return function(e) {
8077 return _this._onmouseup(e);
8080 return this.dragStart;
8082 _calcSelection: function(dragMove) {
8083 var dragRel, i, rect, _i, _j;
8084 dragRel = [dragMove[0] - this.dragStart[0], dragMove[1] - this.dragStart[1]];
8085 for (i = _i = 0; _i <= 1; i = _i += 1) {
8086 dragRel[i] = this.dragStartRel[i] + dragRel[i];
8088 rect = [[this.dragStartRel[0], dragRel[0]], [this.dragStartRel[1], dragRel[1]]];
8089 for (i = _j = 0; _j <= 1; i = _j += 1) {
8090 if (rect[i][1] < rect[i][0]) {
8091 rect[i] = [rect[i][1], rect[i][0]];
8093 rect[i][0] = Math.max(rect[i][0], 0);
8097 _endSelection: function(dragEnd) {
8098 var args, i, j, rect, selis, _i, _j, _k, _ref, _ref1;
8099 jbone(document.body).off('.overmove');
8100 jbone(document.body).off('.overup');
8101 if (this.dragStart.length === 0) {
8104 rect = this._calcSelection(dragEnd);
8105 for (i = _i = 0; _i <= 1; i = ++_i) {
8106 rect[0][i] = Math.floor(rect[0][i] / this.g.zoomer.get("boxRectWidth"));
8108 for (i = _j = 0; _j <= 1; i = ++_j) {
8109 rect[1][i] = Math.floor(rect[1][i] / this.g.zoomer.get("boxRectHeight"));
8111 rect[0][1] = Math.min(this.model.getMaxLength() - 1, rect[0][1]);
8112 rect[1][1] = Math.min(this.model.length - 1, rect[1][1]);
8114 for (j = _k = _ref = rect[1][0], _ref1 = rect[1][1]; _k <= _ref1; j = _k += 1) {
8116 seqId: this.model.at(j).get('id'),
8120 selis.push(new selection.possel(args));
8122 this.dragStart = [];
8123 if (this.prolongSelection) {
8124 this.g.selcol.add(selis);
8126 this.g.selcol.reset(selis);
8128 this.g.zoomer.setLeftOffset(rect[0][0]);
8129 return this.g.zoomer.setTopOffset(rect[1][0]);
8131 _onmouseup: function(e) {
8132 return this._endSelection(mouse.abs(e));
8134 _onmouseout: function(e) {
8135 return this._endSelection(mouse.abs(e));
8137 _createCanvas: function() {
8138 var rectHeight, rectWidth;
8139 rectWidth = this.g.zoomer.get("boxRectWidth");
8140 rectHeight = this.g.zoomer.get("boxRectHeight");
8141 this.el.height = this.model.length * rectHeight;
8142 this.el.width = this.model.getMaxLength() * rectWidth;
8143 this.ctx = this.el.getContext("2d");
8144 this.el.style.overflow = "scroll";
8145 return this.el.style.cursor = "crosshair";
8151 },{"../g/selection/Selection":67,"backbone-viewj":10,"biojs-util-colorschemes":29,"jbone":50,"mouse-pos":51,"underscore":59}],100:[function(require,module,exports){
8152 var AlignmentBody, HeaderBlock, OverviewBox, boneView, identityCalc, _;
8154 boneView = require("backbone-childs");
8156 AlignmentBody = require("./AlignmentBody");
8158 HeaderBlock = require("./header/HeaderBlock");
8160 OverviewBox = require("./OverviewBox");
8162 identityCalc = require("../algo/identityCalc");
8164 _ = require('underscore');
8166 module.exports = boneView.extend({
8167 initialize: function(data) {
8170 this.listenTo(this.model, "reset", function() {
8171 this.isNotDirty = false;
8172 return this.rerender();
8174 this.listenTo(this.model, "change:hidden", _.debounce(this.rerender, 10));
8175 this.listenTo(this.model, "sort", this.rerender);
8176 this.listenTo(this.model, "add", function() {
8177 return console.log("seq add");
8179 this.listenTo(this.g.vis, "change:sequences", this.rerender);
8180 this.listenTo(this.g.vis, "change:overviewbox", this.rerender);
8181 return this.listenTo(this.g.visorder, "change", this.rerender);
8184 var body, consensus, headerblock, overviewbox;
8186 if (!this.isNotDirty) {
8187 consensus = this.g.consensus.getConsensus(this.model);
8188 identityCalc(this.model, consensus);
8189 this.isNotDirty = true;
8191 if (this.g.vis.get("overviewbox")) {
8192 overviewbox = new OverviewBox({
8196 overviewbox.ordering = this.g.visorder.get('overviewBox');
8197 this.addView("overviewbox", overviewbox);
8200 headerblock = new HeaderBlock({
8204 headerblock.ordering = this.g.visorder.get('headerBox');
8205 this.addView("headerblock", headerblock);
8207 body = new AlignmentBody({
8211 body.ordering = this.g.visorder.get('alignmentBody');
8212 return this.addView("body", body);
8214 render: function() {
8215 this.renderSubviews();
8216 this.el.className = "biojs_msa_stage";
8219 rerender: function() {
8221 return this.render();
8227 },{"../algo/identityCalc":61,"./AlignmentBody":96,"./OverviewBox":99,"./header/HeaderBlock":102,"backbone-childs":3,"underscore":59}],101:[function(require,module,exports){
8228 var ConservationView, dom, svg, view;
8230 view = require("backbone-viewj");
8232 dom = require("dom-helper");
8234 svg = require("../../utils/svg");
8236 ConservationView = view.extend({
8237 className: "biojs_msa_conserv",
8238 initialize: function(data) {
8240 this.listenTo(this.g.zoomer, "change:stepSize change:labelWidth change:columnWidth", this.render);
8241 this.listenTo(this.g.vis, "change:labels change:metacell", this.render);
8242 this.listenTo(this.g.columns, "change:scaling", this.render);
8243 this.listenTo(this.model, "reset", this.render);
8244 return this.manageEvents();
8246 render: function() {
8247 var avgHeight, cellWidth, height, hidden, i, maxHeight, n, nMax, rect, s, stepSize, width, x, _i, _ref;
8248 this.g.columns.calcConservation(this.model);
8249 dom.removeAllChilds(this.el);
8250 nMax = this.model.getMaxLength();
8251 cellWidth = this.g.zoomer.get("columnWidth");
8253 width = cellWidth * (nMax - this.g.columns.get('hidden').length);
8254 console.log(this.g.columns.get('hidden'));
8259 s.style.display = "inline-block";
8260 s.style.cursor = "pointer";
8261 stepSize = this.g.zoomer.get("stepSize");
8262 hidden = this.g.columns.get("hidden");
8266 if (hidden.indexOf(n) >= 0) {
8270 width = cellWidth * stepSize;
8272 for (i = _i = 0, _ref = stepSize - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
8273 avgHeight += this.g.columns.get("conserv")[n];
8275 height = maxHeight * (avgHeight / stepSize);
8278 y: maxHeight - height,
8279 width: width - cellWidth / 4,
8281 style: "stroke:red;stroke-width:1;"
8284 s.appendChild(rect);
8288 this.el.appendChild(s);
8291 _onclick: function(evt) {
8292 var i, rowPos, stepSize, _i, _ref, _results;
8293 rowPos = evt.target.rowPos;
8294 stepSize = this.g.zoomer.get("stepSize");
8296 for (i = _i = 0, _ref = stepSize - 1; _i <= _ref; i = _i += 1) {
8297 _results.push(this.g.trigger("bar:click", {
8304 manageEvents: function() {
8307 if (this.g.config.get("registerMouseClicks")) {
8308 events.click = "_onclick";
8310 if (this.g.config.get("registerMouseHover")) {
8311 events.mousein = "_onmousein";
8312 events.mouseout = "_onmouseout";
8314 this.delegateEvents(events);
8315 this.listenTo(this.g.config, "change:registerMouseHover", this.manageEvents);
8316 return this.listenTo(this.g.config, "change:registerMouseClick", this.manageEvents);
8318 _onmousein: function(evt) {
8320 rowPos = this.g.zoomer.get("stepSize" * evt.rowPos);
8321 return this.g.trigger("bar:mousein", {
8326 _onmouseout: function(evt) {
8328 rowPos = this.g.zoomer.get("stepSize" * evt.rowPos);
8329 return this.g.trigger("bar:mouseout", {
8336 module.exports = ConservationView;
8340 },{"../../utils/svg":95,"backbone-viewj":10,"dom-helper":49}],102:[function(require,module,exports){
8341 var ConservationView, MarkerView, boneView, identityCalc, _;
8343 MarkerView = require("./MarkerView");
8345 ConservationView = require("./ConservationView");
8347 identityCalc = require("../../algo/identityCalc");
8349 boneView = require("backbone-childs");
8351 _ = require('underscore');
8353 module.exports = boneView.extend({
8354 initialize: function(data) {
8356 this.blockEvents = false;
8357 this.listenTo(this.g.vis, "change:markers change:conserv", function() {
8359 return this.render();
8361 this.listenTo(this.g.vis, "change", this._setSpacer);
8362 this.listenTo(this.g.zoomer, "change:alignmentWidth", function() {
8363 return this._adjustWidth();
8365 this.listenTo(this.g.zoomer, "change:_alignmentScrollLeft", this._adjustScrollingLeft);
8366 this.listenTo(this.g.columns, "change:hidden", function() {
8368 return this.render();
8371 this._onscroll = this._sendScrollEvent;
8372 return this.g.vis.once('change:loaded', this._adjustScrollingLeft, this);
8375 "scroll": "_onscroll"
8378 var consensus, conserv, marker;
8380 if (!this.isNotDirty) {
8381 consensus = this.g.consensus.getConsensus(this.model);
8382 identityCalc(this.model, consensus);
8383 this.isNotDirty = true;
8385 if (this.g.vis.get("conserv")) {
8386 conserv = new ConservationView({
8390 conserv.ordering = -20;
8391 this.addView("conserv", conserv);
8393 if (this.g.vis.get("markers")) {
8394 marker = new MarkerView({
8398 marker.ordering = -10;
8399 return this.addView("marker", marker);
8402 render: function() {
8403 this.renderSubviews();
8405 this.el.className = "biojs_msa_header";
8406 this.el.style.overflowX = "auto";
8407 this._adjustWidth();
8408 this._adjustScrollingLeft();
8411 _sendScrollEvent: function() {
8412 if (!this.blockEvents) {
8413 this.g.zoomer.set("_alignmentScrollLeft", this.el.scrollLeft, {
8417 return this.blockEvents = false;
8419 _adjustScrollingLeft: function(model, value, options) {
8421 if (((options != null ? options.origin : void 0) == null) || options.origin !== "header") {
8422 scrollLeft = this.g.zoomer.get("_alignmentScrollLeft");
8423 this.blockEvents = true;
8424 return this.el.scrollLeft = scrollLeft;
8427 _setSpacer: function() {
8428 return this.el.style.marginLeft = this._getLabelWidth() + "px";
8430 _getLabelWidth: function() {
8433 if (this.g.vis.get("labels")) {
8434 paddingLeft += this.g.zoomer.get("labelWidth");
8436 if (this.g.vis.get("metacell")) {
8437 paddingLeft += this.g.zoomer.get("metaWidth");
8441 _adjustWidth: function() {
8442 return this.el.style.width = this.g.zoomer.get("alignmentWidth") + "px";
8448 },{"../../algo/identityCalc":61,"./ConservationView":101,"./MarkerView":103,"backbone-childs":3,"underscore":59}],103:[function(require,module,exports){
8449 var HeaderView, dom, jbone, svg, view;
8451 view = require("backbone-viewj");
8453 dom = require("dom-helper");
8455 svg = require("../../utils/svg");
8457 jbone = require("jbone");
8459 HeaderView = view.extend({
8460 className: "biojs_msa_marker",
8461 initialize: function(data) {
8463 this.listenTo(this.g.zoomer, "change:stepSize change:labelWidth change:columnWidth change:markerStepSize change:markerFontsize", this.render);
8464 this.listenTo(this.g.vis, "change:labels change:metacell", this.render);
8465 return this.manageEvents();
8467 render: function() {
8468 var cellWidth, container, hidden, n, nMax, span, stepSize;
8469 dom.removeAllChilds(this.el);
8470 this.el.style.fontSize = this.g.zoomer.get("markerFontsize");
8471 container = document.createElement("span");
8473 cellWidth = this.g.zoomer.get("columnWidth");
8474 nMax = this.model.getMaxLength();
8475 stepSize = this.g.zoomer.get("stepSize");
8476 hidden = this.g.columns.get("hidden");
8478 if (hidden.indexOf(n) >= 0) {
8479 this.markerHidden(span, n, stepSize);
8483 span = document.createElement("span");
8484 span.style.width = (cellWidth * stepSize) + "px";
8485 span.style.display = "inline-block";
8486 if ((n + 1) % this.g.zoomer.get('markerStepSize') === 0) {
8487 span.textContent = n + 1;
8489 span.textContent = ".";
8493 container.appendChild(span);
8495 this.el.appendChild(container);
8498 markerHidden: function(span, n, stepSize) {
8499 var hidden, index, j, length, min, nMax, prevHidden, s, triangle, _i, _j;
8500 hidden = this.g.columns.get("hidden").slice(0);
8501 min = Math.max(0, n - stepSize);
8503 for (j = _i = min; _i <= n; j = _i += 1) {
8504 prevHidden &= hidden.indexOf(j) >= 0;
8509 nMax = this.model.getMaxLength();
8512 for (n = _j = n; _j <= nMax; n = _j += 1) {
8513 if (!(index >= 0)) {
8514 index = hidden.indexOf(n);
8516 if (hidden.indexOf(n) >= 0) {
8526 s.style.position = "relative";
8527 triangle = svg.polygon({
8528 points: "0,0 5,5 10,0",
8529 style: "fill:lime;stroke:purple;stroke-width:1"
8531 jbone(triangle).on("click", (function(_this) {
8532 return function(evt) {
8533 hidden.splice(index, length);
8534 return _this.g.columns.set("hidden", hidden);
8537 s.appendChild(triangle);
8538 span.appendChild(s);
8541 manageEvents: function() {
8544 if (this.g.config.get("registerMouseClicks")) {
8545 events.click = "_onclick";
8547 if (this.g.config.get("registerMouseHover")) {
8548 events.mousein = "_onmousein";
8549 events.mouseout = "_onmouseout";
8551 this.delegateEvents(events);
8552 this.listenTo(this.g.config, "change:registerMouseHover", this.manageEvents);
8553 return this.listenTo(this.g.config, "change:registerMouseClick", this.manageEvents);
8555 _onclick: function(evt) {
8556 var rowPos, stepSize;
8557 rowPos = evt.target.rowPos;
8558 stepSize = this.g.zoomer.get("stepSize");
8559 return this.g.trigger("column:click", {
8565 _onmousein: function(evt) {
8566 var rowPos, stepSize;
8567 rowPos = this.g.zoomer.get("stepSize" * evt.rowPos);
8568 stepSize = this.g.zoomer.get("stepSize");
8569 return this.g.trigger("column:mousein", {
8575 _onmouseout: function(evt) {
8576 var rowPos, stepSize;
8577 rowPos = this.g.zoomer.get("stepSize" * evt.rowPos);
8578 stepSize = this.g.zoomer.get("stepSize");
8579 return this.g.trigger("column:mouseout", {
8587 module.exports = HeaderView;
8591 },{"../../utils/svg":95,"backbone-viewj":10,"dom-helper":49,"jbone":50}],104:[function(require,module,exports){
8592 var LabelRowView, boneView;
8594 LabelRowView = require("./LabelRowView");
8596 boneView = require("backbone-childs");
8598 module.exports = boneView.extend({
8599 initialize: function(data) {
8602 this.listenTo(this.g.zoomer, "change:_alignmentScrollTop", this._adjustScrollingTop);
8603 return this.g.vis.once('change:loaded', this._adjustScrollingTop, this);
8606 var i, view, _i, _ref, _results;
8609 for (i = _i = 0, _ref = this.model.length - 1; _i <= _ref; i = _i += 1) {
8610 if (this.model.at(i).get('hidden')) {
8613 view = new LabelRowView({
8614 model: this.model.at(i),
8618 _results.push(this.addView("row_" + i, view));
8623 "scroll": "_sendScrollEvent"
8625 _sendScrollEvent: function() {
8626 return this.g.zoomer.set("_alignmentScrollTop", this.el.scrollTop, {
8630 _adjustScrollingTop: function() {
8631 return this.el.scrollTop = this.g.zoomer.get("_alignmentScrollTop");
8633 render: function() {
8634 this.renderSubviews();
8635 this.el.className = "biojs_msa_labelblock";
8636 this.el.style.display = "inline-block";
8637 this.el.style.verticalAlign = "top";
8638 this.el.style.height = this.g.zoomer.get("alignmentHeight") + "px";
8639 this.el.style.overflowY = "auto";
8640 this.el.style.overflowX = "hidden";
8641 this.el.style.fontSize = "" + (this.g.zoomer.get("labelFontsize"));
8642 this.el.style.lineHeight = "" + (this.g.zoomer.get("labelLineHeight"));
8649 },{"./LabelRowView":105,"backbone-childs":3}],105:[function(require,module,exports){
8650 var LabelView, MetaView, boneView;
8652 boneView = require("backbone-childs");
8654 LabelView = require("./LabelView");
8656 MetaView = require("./MetaView");
8658 module.exports = boneView.extend({
8659 initialize: function(data) {
8662 this.listenTo(this.g.vis, "change:labels", this.drawR);
8663 return this.listenTo(this.g.vis, "change:metacell", this.drawR);
8667 if (this.g.vis.get("labels")) {
8668 this.addView("labels", new LabelView({
8673 if (this.g.vis.get("metacell")) {
8674 return this.addView("metacell", new MetaView({
8682 return this.render();
8684 render: function() {
8685 this.renderSubviews();
8686 this.el.setAttribute("class", "biojs_msa_labelrow");
8687 this.el.style.height = this.g.zoomer.get("rowHeight");
8694 },{"./LabelView":106,"./MetaView":107,"backbone-childs":3}],106:[function(require,module,exports){
8695 var LabelView, dom, view;
8697 view = require("backbone-viewj");
8699 dom = require("dom-helper");
8701 LabelView = view.extend({
8702 initialize: function(data) {
8703 this.seq = data.seq;
8705 return this.manageEvents();
8707 manageEvents: function() {
8710 if (this.g.config.get("registerMouseClicks")) {
8711 events.click = "_onclick";
8713 if (this.g.config.get("registerMouseHover")) {
8714 events.mousein = "_onmousein";
8715 events.mouseout = "_onmouseout";
8717 this.delegateEvents(events);
8718 this.listenTo(this.g.config, "change:registerMouseHover", this.manageEvents);
8719 this.listenTo(this.g.config, "change:registerMouseClick", this.manageEvents);
8720 this.listenTo(this.g.vis, "change:labelName", this.render);
8721 this.listenTo(this.g.vis, "change:labelId", this.render);
8722 this.listenTo(this.g.vis, "change:labelPartition", this.render);
8723 return this.listenTo(this.g.vis, "change:labelCheckbox", this.render);
8725 render: function() {
8726 var checkBox, id, name, part;
8727 dom.removeAllChilds(this.el);
8728 this.el.style.width = "" + (this.g.zoomer.get("labelWidth")) + "px";
8729 this.el.style.height = "" + (this.g.zoomer.get("rowHeight")) + "px";
8730 this.el.setAttribute("class", "biojs_msa_labels");
8731 if (this.g.vis.get("labelCheckbox")) {
8732 checkBox = document.createElement("input");
8733 checkBox.setAttribute("type", "checkbox");
8734 checkBox.value = this.model.get('id');
8735 checkBox.name = "seq";
8736 this.el.appendChild(checkBox);
8738 if (this.g.vis.get("labelId")) {
8739 id = document.createElement("span");
8740 id.textContent = this.model.get("id");
8741 id.style.width = this.g.zoomer.get("labelIdLength");
8742 id.style.display = "inline-block";
8743 this.el.appendChild(id);
8745 if (this.g.vis.get("labelPartition")) {
8746 part = document.createElement("span");
8747 part.style.width = 15;
8748 part.textContent = this.model.get("partition");
8749 part.style.display = "inline-block";
8750 this.el.appendChild(id);
8751 this.el.appendChild(part);
8753 if (this.g.vis.get("labelName")) {
8754 name = document.createElement("span");
8755 name.textContent = this.model.get("name");
8756 this.el.appendChild(name);
8758 this.el.style.overflow = scroll;
8761 _onclick: function(evt) {
8763 seqId = this.model.get("id");
8764 return this.g.trigger("row:click", {
8769 _onmousein: function(evt) {
8771 seqId = this.model.get("id");
8772 return this.g.trigger("row:mouseout", {
8777 _onmouseout: function(evt) {
8779 seqId = this.model.get("id");
8780 return this.g.trigger("row:mouseout", {
8787 module.exports = LabelView;
8791 },{"backbone-viewj":10,"dom-helper":49}],107:[function(require,module,exports){
8792 var MenuBuilder, MetaView, dom, view, _;
8794 view = require("backbone-viewj");
8796 MenuBuilder = require("../../menu/menubuilder");
8798 _ = require('underscore');
8800 dom = require("dom-helper");
8802 module.exports = MetaView = view.extend({
8803 className: "biojs_msa_metaview",
8804 initialize: function(data) {
8805 return this.g = data.g;
8809 mousein: "_onmousein",
8810 mouseout: "_onmouseout"
8812 render: function() {
8813 var gapSpan, gaps, ident, identSpan, menu, seq, width;
8814 dom.removeAllChilds(this.el);
8815 this.el.style.display = "inline-block";
8816 width = this.g.zoomer.get("metaWidth");
8817 this.el.style.width = width - 5;
8818 this.el.style.paddingRight = 5;
8819 seq = this.model.get('seq');
8820 gaps = _.reduce(seq, (function(memo, c) {
8826 gaps = (gaps / seq.length).toFixed(1);
8827 gapSpan = document.createElement('span');
8828 gapSpan.textContent = gaps;
8829 gapSpan.style.display = "inline-block";
8830 gapSpan.style.width = 35;
8831 this.el.appendChild(gapSpan);
8832 ident = this.model.get('identity');
8833 identSpan = document.createElement('span');
8834 identSpan.textContent = ident.toFixed(2);
8835 identSpan.style.display = "inline-block";
8836 identSpan.style.width = 40;
8837 this.el.appendChild(identSpan);
8838 menu = new MenuBuilder("↗");
8839 menu.addNode("Uniprot", (function(_this) {
8840 return function(e) {
8841 return window.open("http://beta.uniprot.org/uniprot/Q7T2N8");
8844 this.el.appendChild(menu.buildDOM());
8846 this.el.style.height = "" + (this.g.zoomer.get("rowHeight")) + "px";
8847 return this.el.style.cursor = "pointer";
8849 _onclick: function(evt) {
8850 return this.g.trigger("meta:click", {
8851 seqId: this.model.get("id", {
8856 _onmousein: function(evt) {
8857 return this.g.trigger("meta:mousein", {
8858 seqId: this.model.get("id", {
8863 _onmouseout: function(evt) {
8864 return this.g.trigger("meta:mouseout", {
8865 seqId: this.model.get("id", {
8874 },{"../../menu/menubuilder":75,"backbone-viewj":10,"dom-helper":49,"underscore":59}],"biojs-io-clustal":[function(require,module,exports){
8875 // Generated by CoffeeScript 1.8.0
8876 var Clustal, GenericReader, Seq, Str,
8877 __hasProp = {}.hasOwnProperty,
8878 __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
8880 Str = require("./strings");
8882 GenericReader = require("./generic_reader");
8884 Seq = require("./seq");
8886 module.exports = Clustal = (function(_super) {
8887 __extends(Clustal, _super);
8889 function Clustal() {
8890 return Clustal.__super__.constructor.apply(this, arguments);
8893 Clustal.parse = function(text) {
8894 var blockstate, k, label, line, lines, match, regex, seqCounter, seqs, sequence;
8896 if (Object.prototype.toString.call(text) === '[object Array]') {
8899 lines = text.split("\n");
8901 if (lines[0].slice(0, 6) === !"CLUSTAL") {
8902 throw new Error("Invalid CLUSTAL Header");
8907 while (k < lines.length) {
8910 if ((line == null) || line.length === 0) {
8914 if (line.trim().length === 0) {
8918 if (Str.contains(line, "*")) {
8921 if (blockstate === 1) {
8925 regex = /^(?:\s*)(\S+)(?:\s+)(\S+)(?:\s*)(\d*)(?:\s*|$)/g;
8926 match = regex.exec(line);
8927 if (match != null) {
8929 sequence = match[2];
8930 if (seqCounter >= seqs.length) {
8931 seqs.push(new Seq(sequence, label, seqCounter));
8933 seqs[seqCounter].seq += sequence;
8948 },{"./generic_reader":17,"./seq":18,"./strings":19}],"biojs-io-fasta":[function(require,module,exports){
8949 // Generated by CoffeeScript 1.8.0
8950 module.exports.parse = require("./parser");
8952 module.exports.writer = require("./writer");
8954 },{"./parser":21,"./writer":24}],"biojs-vis-msa":[function(require,module,exports){
8955 if (typeof biojs === 'undefined') {
8958 if (typeof biojs.vis === 'undefined') {
8961 // use two namespaces
8962 window.msa = biojs.vis.msa = module.exports = require('./index');
8964 // TODO: how should this be bundled
8966 if (typeof biojs.io === 'undefined') {
8969 // just bundle the two parsers
8970 window.biojs.io.fasta = require("biojs-io-fasta");
8971 window.biojs.io.clustal = require("biojs-io-clustal");
8972 window.biojs.xhr = require("nets");
8974 // simulate standalone flag
8975 window.biojsVisMsa = window.msa;
8977 require('./build/msa.css');
8979 },{"./build/msa.css":1,"./index":2,"biojs-io-clustal":undefined,"biojs-io-fasta":undefined,"nets":undefined}],"nets":[function(require,module,exports){
8980 var req = require('request')
8982 module.exports = Nets
8984 function Nets(uri, opts, cb) {
8987 },{"request":52}]},{},["biojs-vis-msa"])
8988 //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9idWlsZC9tc2EuY3NzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2EvaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmFja2JvbmUtY2hpbGRzL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2JhY2tib25lLXRoaW4vY29sbGVjdGlvbi5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iYWNrYm9uZS10aGluL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2JhY2tib25lLXRoaW4vbW9kZWwuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmFja2JvbmUtdGhpbi9ub2RlX21vZHVsZXMvYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmUvYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmFja2JvbmUtdGhpbi9ub2RlX21vZHVsZXMvYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmUvaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmFja2JvbmUtdGhpbi9ub2RlX21vZHVsZXMvYmFja2JvbmUtZXh0ZW5kLXN0YW5kYWxvbmUvYmFja2JvbmUtZXh0ZW5kLXN0YW5kYWxvbmUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmFja2JvbmUtdmlld2ovaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtZXZlbnRzL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLWlvLWNsdXN0YWwvbGliL2dlbmVyaWNfcmVhZGVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLWlvLWNsdXN0YWwvbGliL3NlcS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy1pby1jbHVzdGFsL2xpYi9zdHJpbmdzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLWlvLWZhc3RhL2xpYi9wYXJzZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtaW8tZmFzdGEvbGliL3V0aWxzLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLWlvLWZhc3RhL2xpYi93cml0ZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtaW8tZmFzdGEvbm9kZV9tb2R1bGVzL2Jpb2pzLW1vZGVsL3NyYy9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy1pby1mYXN0YS9ub2RlX21vZHVsZXMvYmlvanMtbW9kZWwvc3JjL3NlcS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy11dGlsLWNvbG9yc2NoZW1lcy9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy11dGlsLWNvbG9yc2NoZW1lcy9zcmMvYnVyaWVkLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLXV0aWwtY29sb3JzY2hlbWVzL3NyYy9jaW5lbWEuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtdXRpbC1jb2xvcnNjaGVtZXMvc3JjL2NsdXN0YWwuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtdXRpbC1jb2xvcnNjaGVtZXMvc3JjL2NsdXN0YWwyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLXV0aWwtY29sb3JzY2hlbWVzL3NyYy9oZWxpeC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy11dGlsLWNvbG9yc2NoZW1lcy9zcmMvaHlkcm9waG9iaWNpdHkuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtdXRpbC1jb2xvcnNjaGVtZXMvc3JjL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLXV0aWwtY29sb3JzY2hlbWVzL3NyYy9sZXNrLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLXV0aWwtY29sb3JzY2hlbWVzL3NyYy9tYWUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtdXRpbC1jb2xvcnNjaGVtZXMvc3JjL251Y2xlb3RpZGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtdXRpbC1jb2xvcnNjaGVtZXMvc3JjL3B1cmluZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy11dGlsLWNvbG9yc2NoZW1lcy9zcmMvc2VsZWN0b3IuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvYmlvanMtdXRpbC1jb2xvcnNjaGVtZXMvc3JjL3N0cmFuZC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy11dGlsLWNvbG9yc2NoZW1lcy9zcmMvdGF5bG9yLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLXV0aWwtY29sb3JzY2hlbWVzL3NyYy90dXJuLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLXV0aWwtY29sb3JzY2hlbWVzL3NyYy96YXBwby5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9ibHVlaW1wX2NhbnZhc3RvYmxvYi9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9icm93c2VyLXNhdmVhcy9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9jc3NpZnkvYnJvd3Nlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9kb20taGVscGVyL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2pib25lL2Rpc3QvamJvbmUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvbW91c2UtcG9zL2luZGV4LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL25ldHMvbm9kZV9tb2R1bGVzL3hoci9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9uZXRzL25vZGVfbW9kdWxlcy94aHIvbm9kZV9tb2R1bGVzL2dsb2JhbC93aW5kb3cuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvbmV0cy9ub2RlX21vZHVsZXMveGhyL25vZGVfbW9kdWxlcy9vbmNlL29uY2UuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvbmV0cy9ub2RlX21vZHVsZXMveGhyL25vZGVfbW9kdWxlcy9wYXJzZS1oZWFkZXJzL25vZGVfbW9kdWxlcy9mb3ItZWFjaC9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9uZXRzL25vZGVfbW9kdWxlcy94aHIvbm9kZV9tb2R1bGVzL3BhcnNlLWhlYWRlcnMvbm9kZV9tb2R1bGVzL2Zvci1lYWNoL25vZGVfbW9kdWxlcy9pcy1mdW5jdGlvbi9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9uZXRzL25vZGVfbW9kdWxlcy94aHIvbm9kZV9tb2R1bGVzL3BhcnNlLWhlYWRlcnMvbm9kZV9tb2R1bGVzL3RyaW0vaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvbmV0cy9ub2RlX21vZHVsZXMveGhyL25vZGVfbW9kdWxlcy9wYXJzZS1oZWFkZXJzL3BhcnNlLWhlYWRlcnMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9ub2RlX21vZHVsZXMvdW5kZXJzY29yZS91bmRlcnNjb3JlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2FsZ28vQ29uc2Vuc3VzQ2FsYy5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvYWxnby9pZGVudGl0eUNhbGMuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2FsZ28vaW5kZXguY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2cvY29sb3JhdG9yLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9nL2NvbHVtbnMuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2cvY29uZmlnLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9nL2NvbnNlbnN1cy5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvZy9zZWxlY3Rpb24vU2VsZWN0aW9uLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9nL3NlbGVjdGlvbi9TZWxlY3Rpb25Db2wuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2cvdmlzT3JkZXJpbmcuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2cvdmlzaWJpbGl0eS5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvZy96b29tZXIuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL2luZGV4LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L2RlZmF1bHRtZW51LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L2luZGV4LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L21lbnVidWlsZGVyLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L3ZpZXdzL0NvbG9yTWVudS5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvbWVudS92aWV3cy9FeHBvcnRNZW51LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L3ZpZXdzL0V4dHJhTWVudS5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvbWVudS92aWV3cy9GaWx0ZXJNZW51LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L3ZpZXdzL0hlbHBNZW51LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L3ZpZXdzL0ltcG9ydE1lbnUuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL21lbnUvdmlld3MvT3JkZXJpbmdNZW51LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tZW51L3ZpZXdzL1NlbGVjdGlvbk1lbnUuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL21lbnUvdmlld3MvVmlzTWVudS5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvbW9kZWwvRmVhdHVyZS5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvbW9kZWwvRmVhdHVyZUNvbC5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvbW9kZWwvU2VxQ29sbGVjdGlvbi5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvbW9kZWwvU2VxdWVuY2UuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL21vZGVsL2luZGV4LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy9tc2EuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL3V0aWxzL2JtYXRoLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy91dGlscy9pbmRleC5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvdXRpbHMvcHJveHkuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL3V0aWxzL3NlcWdlbi5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvdXRpbHMvc3ZnLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy92aWV3cy9BbGlnbm1lbnRCb2R5LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy92aWV3cy9DYW52YXNDaGFyQ2FjaGUuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL3ZpZXdzL0NhbnZhc1NlcUJsb2NrLmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy92aWV3cy9PdmVydmlld0JveC5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvdmlld3MvU3RhZ2UuY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL3ZpZXdzL2hlYWRlci9Db25zZXJ2YXRpb25WaWV3LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy92aWV3cy9oZWFkZXIvSGVhZGVyQmxvY2suY29mZmVlIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evc3JjL3ZpZXdzL2hlYWRlci9NYXJrZXJWaWV3LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3NyYy92aWV3cy9sYWJlbHMvTGFiZWxCbG9jay5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvdmlld3MvbGFiZWxzL0xhYmVsUm93Vmlldy5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvdmlld3MvbGFiZWxzL0xhYmVsVmlldy5jb2ZmZWUiLCIvaG9tZS90cmF2aXMvYnVpbGQvZ3JlZW5pZnkvYmlvanMtdmlzLW1zYS9zcmMvdmlld3MvbGFiZWxzL01ldGFWaWV3LmNvZmZlZSIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9iaW9qcy1pby1jbHVzdGFsL2xpYi9jbHVzdGFsLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Jpb2pzLWlvLWZhc3RhL2xpYi9pbmRleC5qcyIsIi4vYnJvd3NlciIsIi9ob21lL3RyYXZpcy9idWlsZC9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL25vZGVfbW9kdWxlcy9uZXRzL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7O0FDQUE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcmJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDclJBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUMvS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDTkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3gxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2NENBLElBQUEsQ0FBQTs7QUFBQSxDQUFBLEdBQUksT0FBQSxDQUFRLFlBQVIsQ0FBSixDQUFBOztBQUFBLE1BSU0sQ0FBQyxPQUFQLEdBQWlCLFNBQUMsSUFBRCxHQUFBO0FBRWYsTUFBQSxJQUFBO0FBQUEs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Q0FyRFo7QUFBQSxFQXdEQSxXQUFBLEVBQWEsU0FBQyxHQUFELEdBQUE7V0FDWCxJQUFDLENBQUEsQ0FBQyxDQUFDLE9BQUgsQ0FBVyxlQUFYLEVBQTRCO0FBQUEsTUFBQyxLQUFBLEVBQU8sSUFBQyxDQUFBLEtBQUssQ0FBQyxHQUFQLENBQVcsSUFBWCxFQUFpQjtBQUFBLFFBQUEsR0FBQSxFQUFJLEdBQUo7T0FBakIsQ0FBUjtLQUE1QixFQURXO0VBQUEsQ0F4RGI7Q0FGMEIsQ0FMNUIsQ0FBQTs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsInZhciBjc3MgPSBcIi5iaW9qc19tc2Ffc3RhZ2Uge1xcbiAgY3Vyc29yOiBkZWZhdWx0O1xcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsgfVxcblxcbi5iaW9qc19tc2FfbGFiZWxzIHtcXG4gIGNvbG9yOiBibGFjaztcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB9XFxuXFxuLmJpb2pzX21zYV9zZXFibG9jayB7XFxuICBjdXJzb3I6IG1vdmU7IH1cXG5cXG4uYmlvanNfbXNhX2xheWVyIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsgfVxcblxcbi5iaW9qc19tc2FfbGFiZWxibG9jazo6LXdlYmtpdC1zY3JvbGxiYXIsIC5iaW9qc19tc2FfaGVhZGVyOjotd2Via2l0LXNjcm9sbGJhciB7XFxuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XFxuICB3aWR0aDogN3B4O1xcbiAgaGVpZ2h0OiA3cHg7IH1cXG5cXG4uYmlvanNfbXNhX2xhYmVsYmxvY2s6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iLCAuYmlvanNfbXNhX2hlYWRlcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xcbiAgYm94LXNoYWRvdzogMCAwIDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7IH1cXG5cXG4uYmlvanNfbXNhX21hcmtlciB7XFxuICBjb2xvcjogZ3JleTtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICBjdXJzb3I6IHBvaW50ZXI7IH1cXG5cXG4uYmlvanNfbXNhX21hcmtlciBzcGFuIHtcXG4gIHRleHQtYWxpZ246IGNlbnRlcjsgfVxcblxcbi5iaW9qc19tc2FfbWVudWJhciAuYmlvanNfbXNhX21lbnViYXJfYWxpbmsge1xcbiAgYmFja2dyb3VuZDogIzM0OThkYjtcXG4gIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgIzM0OThkYiwgIzI5ODBiOSk7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICMzNDk4ZGIsICMyOTgwYjkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsICMzNDk4ZGIsICMyOTgwYjkpO1xcbiAgYmFja2dyb3VuZC1pbWFnZTogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgIzM0OThkYiwgIzI5ODBiOSk7XFxuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjMzQ5OGRiLCAjMjk4MGI5KTtcXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMjg7XFxuICAtbW96LWJvcmRlci1yYWRpdXM6IDI4O1xcbiAgYm9yZGVyLXJhZGl1czogMjhweDtcXG4gIGZvbnQtZmFtaWx5OiBBcmlhbDtcXG4gIGNvbG9yOiAjZmZmZmZmO1xcbiAgcGFkZGluZzogM3B4IDEwcHggM3B4IDEwcHg7XFxuICBtYXJnaW4tbGVmdDogMTBweDtcXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfVxcblxcbi5iaW9qc19tc2FfbWVudWJhciAuYmlvanNfbXNhX21lbnViYXJfYWxpbms6aG92ZXIge1xcbiAgY3Vyc29yOiBwb2ludGVyOyB9XFxuXFxuLyoganF1ZXJ5IGRyb3Bkb3duIENTUyAqL1xcbi5kcm9wZG93biB7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB6LWluZGV4OiA5OTk5OTk5O1xcbiAgZGlzcGxheTogbm9uZTsgfVxcblxcbi5kcm9wZG93biAuZHJvcGRvd24tbWVudSxcXG4uZHJvcGRvd24gLmRyb3Bkb3duLXBhbmVsIHtcXG4gIG1pbi13aWR0aDogMTYwcHg7XFxuICBtYXgtd2lkdGg6IDM2MHB4O1xcbiAgbGlzdC1zdHlsZTogbm9uZTtcXG4gIGJhY2tncm91bmQ6ICNGRkY7XFxuICBib3JkZXI6IHNvbGlkIDFweCAjREREO1xcbiAgYm9yZGVyOiBzb2xpZCAxcHggcmdiYSgwLCAwLCAwLCAwLjIpO1xcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgYm94LXNoYWRvdzogMCA1cHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMik7XFxuICBvdmVyZmxvdzogdmlzaWJsZTtcXG4gIHBhZGRpbmc6IDRweCAwO1xcbiAgbWFyZ2luOiAwOyB9XFxuXFxuLmRyb3Bkb3duIC5kcm9wZG93bi1wYW5lbCB7XFxuICBwYWRkaW5nOiAxMHB4OyB9XFxuXFxuLmRyb3Bkb3duLmRyb3Bkb3duLXNjcm9sbCAuZHJvcGRvd24tbWVudSxcXG4uZHJvcGRvd24uZHJvcGRvd24tc2Nyb2xsIC5kcm9wZG93bi1wYW5lbCB7XFxuICBtYXgtaGVpZ2h0OiAzNThweDtcXG4gIG92ZXJmbG93OiBhdXRvOyB9XFxuXFxuLmRyb3Bkb3duIC5kcm9wZG93bi1tZW51IExJIHtcXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XFxuICBwYWRkaW5nOiAwIDA7XFxuICBtYXJnaW46IDA7XFxuICBsaW5lLWhlaWdodDogMThweDsgfVxcblxcbi5kcm9wZG93biAuZHJvcGRvd24tbWVudSBMSSxcXG4uZHJvcGRvd24gLmRyb3Bkb3duLW1lbnUgTEFCRUwge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBjb2xvcjogIzU1NTtcXG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gIGxpbmUtaGVpZ2h0OiAxOHB4O1xcbiAgcGFkZGluZzogM3B4IDE1cHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwOyB9XFxuXFxuLmRyb3Bkb3duIC5kcm9wZG93bi1tZW51IExJOmhvdmVyLFxcbi5kcm9wZG93biAuZHJvcGRvd24tbWVudSBMQUJFTDpob3ZlciB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDhDO1xcbiAgY29sb3I6ICNGRkY7XFxuICBjdXJzb3I6IHBvaW50ZXI7IH1cXG5cXG4uZHJvcGRvd24gLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWRpdmlkZXIge1xcbiAgZm9udC1zaXplOiAxcHg7XFxuICBib3JkZXItdG9wOiBzb2xpZCAxcHggI0U1RTVFNTtcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDVweCAwOyB9XFxuXCI7IChyZXF1aXJlKFwiL2hvbWUvdHJhdmlzL2J1aWxkL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2Evbm9kZV9tb2R1bGVzL2Nzc2lmeVwiKSkoY3NzKTsgbW9kdWxlLmV4cG9ydHMgPSBjc3M7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9zcmMvaW5kZXhcIik7XG4iLCJ2YXIgXyA9IHJlcXVpcmUoJ3VuZGVyc2NvcmUnKTtcbnZhciB2aWV3VHlwZSA9IHJlcXVpcmUoXCJiYWNrYm9uZS12aWV3alwiKTtcbnZhciBwbHVnaW5hdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBsdWdpbmF0b3IgPSB2aWV3VHlwZS5leHRlbmQoe1xuICByZW5kZXJTdWJ2aWV3czogZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9sZEVsID0gdGhpcy5lbDtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMuc2V0RWxlbWVudChlbCk7XG4gICAgdmFyIGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgaWYgKG9sZEVsLnBhcmVudE5vZGUgIT0gbnVsbCkge1xuICAgICAgb2xkRWwucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5lbCwgb2xkRWwpO1xuICAgIH1cbiAgICB2YXIgdmlld3MgPSB0aGlzLl92aWV3cygpO1xuICAgIHZhciB2aWV3c1NvcnRlZCA9IF8uc29ydEJ5KHZpZXdzLCBmdW5jdGlvbihlbCkge1xuICAgICAgcmV0dXJuIGVsLm9yZGVyaW5nO1xuICAgIH0pO1xuICAgIHZhciB2aWV3LCBub2RlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgIHZpZXdzU29ydGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2aWV3ID0gdmlld3NTb3J0ZWRbaV07XG4gICAgICB2aWV3LnJlbmRlcigpO1xuICAgICAgbm9kZSA9IHZpZXcuZWw7XG4gICAgICBpZiAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsLmFwcGVuZENoaWxkKGZyYWcpO1xuICAgIHJldHVybiBlbDtcbiAgfSxcbiAgYWRkVmlldzogZnVuY3Rpb24oa2V5LCB2aWV3KSB7XG4gICAgdmFyIHZpZXdzID0gdGhpcy5fdmlld3MoKTtcbiAgICBpZiAodmlldyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBcIkludmFsaWQgcGx1Z2luLiBcIjtcbiAgICB9XG4gICAgaWYgKHZpZXcub3JkZXJpbmcgPT0gbnVsbCkge1xuICAgICAgdmlldy5vcmRlcmluZyA9IGtleTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXdzW2tleV0gPSB2aWV3O1xuICB9LFxuICByZW1vdmVWaWV3czogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGVsLCBrZXk7XG4gICAgdmFyIHZpZXdzID0gdGhpcy5fdmlld3MoKTtcbiAgICBmb3IgKGtleSBpbiB2aWV3cykge1xuICAgICAgZWwgPSB2aWV3c1trZXldO1xuICAgICAgZWwudW5kZWxlZ2F0ZUV2ZW50cygpO1xuICAgICAgZWwudW5iaW5kKCk7XG4gICAgICBpZiAoZWwucmVtb3ZlVmlld3MgIT0gbnVsbCkge1xuICAgICAgICBlbC5yZW1vdmVWaWV3cygpO1xuICAgICAgfVxuICAgICAgZWwucmVtb3ZlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZpZXdzID0ge307XG4gIH0sXG4gIHJlbW92ZVZpZXc6IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciB2aWV3cyA9IHRoaXMuX3ZpZXdzKCk7XG4gICAgdmlld3Nba2V5XS5yZW1vdmUoKTtcbiAgICByZXR1cm4gZGVsZXRlIHZpZXdzW2tleV07XG4gIH0sXG4gIGdldFZpZXc6IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciB2aWV3cyA9IHRoaXMuX3ZpZXdzKCk7XG4gICAgcmV0dXJuIHZpZXdzW2tleV07XG4gIH0sXG4gIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVWaWV3cygpO1xuICAgIHJldHVybiB2aWV3VHlwZS5wcm90b3R5cGUucmVtb3ZlLmFwcGx5KHRoaXMpO1xuICB9LFxuICBfdmlld3M6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLnZpZXdzID09IG51bGwpIHtcbiAgICAgIHRoaXMudmlld3MgPSB7fTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmlld3M7XG4gIH1cbn0pO1xuIiwiLy8gICAgIEJhY2tib25lLmpzIDEuMS4yXG5cbi8vICAgICAoYykgMjAxMC0yMDE0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4vLyAgICAgQmFja2JvbmUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4vLyAgICAgRm9yIGFsbCBkZXRhaWxzIGFuZCBkb2N1bWVudGF0aW9uOlxuLy8gICAgIGh0dHA6Ly9iYWNrYm9uZWpzLm9yZ1xuXG52YXIgRXZlbnRzID0gcmVxdWlyZShcImJhY2tib25lLWV2ZW50cy1zdGFuZGFsb25lXCIpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCJiYWNrYm9uZS1leHRlbmQtc3RhbmRhbG9uZVwiKTtcbnZhciBfID0gcmVxdWlyZShcInVuZGVyc2NvcmVcIik7XG52YXIgTW9kZWwgPSByZXF1aXJlKFwiLi9tb2RlbFwiKTtcblxuLy8gQ3JlYXRlIGxvY2FsIHJlZmVyZW5jZXMgdG8gYXJyYXkgbWV0aG9kcyB3ZSdsbCB3YW50IHRvIHVzZSBsYXRlci5cbnZhciBhcnJheSA9IFtdO1xudmFyIHNsaWNlID0gYXJyYXkuc2xpY2U7XG5cbi8vIEJhY2tib25lLkNvbGxlY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gSWYgbW9kZWxzIHRlbmQgdG8gcmVwcmVzZW50IGEgc2luZ2xlIHJvdyBvZiBkYXRhLCBhIEJhY2tib25lIENvbGxlY3Rpb24gaXNcbi8vIG1vcmUgYW5hbG9nb3VzIHRvIGEgdGFibGUgZnVsbCBvZiBkYXRhIC4uLiBvciBhIHNtYWxsIHNsaWNlIG9yIHBhZ2Ugb2YgdGhhdFxuLy8gdGFibGUsIG9yIGEgY29sbGVjdGlvbiBvZiByb3dzIHRoYXQgYmVsb25nIHRvZ2V0aGVyIGZvciBhIHBhcnRpY3VsYXIgcmVhc29uXG4vLyAtLSBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoaXMgcGFydGljdWxhciBmb2xkZXIsIGFsbCBvZiB0aGUgZG9jdW1lbnRzXG4vLyBiZWxvbmdpbmcgdG8gdGhpcyBwYXJ0aWN1bGFyIGF1dGhvciwgYW5kIHNvIG9uLiBDb2xsZWN0aW9ucyBtYWludGFpblxuLy8gaW5kZXhlcyBvZiB0aGVpciBtb2RlbHMsIGJvdGggaW4gb3JkZXIsIGFuZCBmb3IgbG9va3VwIGJ5IGBpZGAuXG5cbi8vIENyZWF0ZSBhIG5ldyAqKkNvbGxlY3Rpb24qKiwgcGVyaGFwcyB0byBjb250YWluIGEgc3BlY2lmaWMgdHlwZSBvZiBgbW9kZWxgLlxuLy8gSWYgYSBgY29tcGFyYXRvcmAgaXMgc3BlY2lmaWVkLCB0aGUgQ29sbGVjdGlvbiB3aWxsIG1haW50YWluXG4vLyBpdHMgbW9kZWxzIGluIHNvcnQgb3JkZXIsIGFzIHRoZXkncmUgYWRkZWQgYW5kIHJlbW92ZWQuXG52YXIgQ29sbGVjdGlvbiA9IGZ1bmN0aW9uKG1vZGVscywgb3B0aW9ucykge1xuICBvcHRpb25zIHx8IChvcHRpb25zID0ge30pO1xuICBpZiAob3B0aW9ucy5tb2RlbCkgdGhpcy5tb2RlbCA9IG9wdGlvbnMubW9kZWw7XG4gIGlmIChvcHRpb25zLmNvbXBhcmF0b3IgIT09IHZvaWQgMCkgdGhpcy5jb21wYXJhdG9yID0gb3B0aW9ucy5jb21wYXJhdG9yO1xuICB0aGlzLl9yZXNldCgpO1xuICB0aGlzLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgaWYgKG1vZGVscykgdGhpcy5yZXNldChtb2RlbHMsIF8uZXh0ZW5kKHtzaWxlbnQ6IHRydWV9LCBvcHRpb25zKSk7XG59O1xuXG4vLyBEZWZhdWx0IG9wdGlvbnMgZm9yIGBDb2xsZWN0aW9uI3NldGAuXG52YXIgc2V0T3B0aW9ucyA9IHthZGQ6IHRydWUsIHJlbW92ZTogdHJ1ZSwgbWVyZ2U6IHRydWV9O1xudmFyIGFkZE9wdGlvbnMgPSB7YWRkOiB0cnVlLCByZW1vdmU6IGZhbHNlfTtcblxuLy8gRGVmaW5lIHRoZSBDb2xsZWN0aW9uJ3MgaW5oZXJpdGFibGUgbWV0aG9kcy5cbl8uZXh0ZW5kKENvbGxlY3Rpb24ucHJvdG90eXBlLCBFdmVudHMsIHtcblxuICAvLyBUaGUgZGVmYXVsdCBtb2RlbCBmb3IgYSBjb2xsZWN0aW9uIGlzIGp1c3QgYSAqKkJhY2tib25lLk1vZGVsKiouXG4gIC8vIFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gbW9zdCBjYXNlcy5cbiAgbW9kZWw6IE1vZGVsLFxuXG4gIC8vIEluaXRpYWxpemUgaXMgYW4gZW1wdHkgZnVuY3Rpb24gYnkgZGVmYXVsdC4gT3ZlcnJpZGUgaXQgd2l0aCB5b3VyIG93blxuICAvLyBpbml0aWFsaXphdGlvbiBsb2dpYy5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKXt9LFxuXG4gICAgLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYSBDb2xsZWN0aW9uIGlzIGFuIGFycmF5IG9mIHRoZVxuICAgIC8vIG1vZGVscycgYXR0cmlidXRlcy5cbiAgdG9KU09OOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKG1vZGVsKXsgcmV0dXJuIG1vZGVsLnRvSlNPTihvcHRpb25zKTsgfSk7XG4gIH0sXG5cbiAgICAvLyBQcm94eSBgQmFja2JvbmUuc3luY2AgYnkgZGVmYXVsdC5cbiAgc3luYzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIEJhY2tib25lLnN5bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfSxcblxuICAgIC8vIEFkZCBhIG1vZGVsLCBvciBsaXN0IG9mIG1vZGVscyB0byB0aGUgc2V0LlxuICBhZGQ6IGZ1bmN0aW9uKG1vZGVscywgb3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnNldChtb2RlbHMsIF8uZXh0ZW5kKHttZXJnZTogZmFsc2V9LCBvcHRpb25zLCBhZGRPcHRpb25zKSk7XG4gIH0sXG5cbiAgICAvLyBSZW1vdmUgYSBtb2RlbCwgb3IgYSBsaXN0IG9mIG1vZGVscyBmcm9tIHRoZSBzZXQuXG4gIHJlbW92ZTogZnVuY3Rpb24obW9kZWxzLCBvcHRpb25zKSB7XG4gICAgdmFyIHNpbmd1bGFyID0gIV8uaXNBcnJheShtb2RlbHMpO1xuICAgIG1vZGVscyA9IHNpbmd1bGFyID8gW21vZGVsc10gOiBfLmNsb25lKG1vZGVscyk7XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gbW9kZWxzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbW9kZWwgPSBtb2RlbHNbaV0gPSB0aGlzLmdldChtb2RlbHNbaV0pO1xuICAgICAgaWYgKCFtb2RlbCkgY29udGludWU7XG4gICAgICB2YXIgaWQgPSB0aGlzLm1vZGVsSWQobW9kZWwuYXR0cmlidXRlcyk7XG4gICAgICBpZiAoaWQgIT0gbnVsbCkgZGVsZXRlIHRoaXMuX2J5SWRbaWRdO1xuICAgICAgZGVsZXRlIHRoaXMuX2J5SWRbbW9kZWwuY2lkXTtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuaW5kZXhPZihtb2RlbCk7XG4gICAgICB0aGlzLm1vZGVscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy5sZW5ndGgtLTtcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgb3B0aW9ucy5pbmRleCA9IGluZGV4O1xuICAgICAgICBtb2RlbC50cmlnZ2VyKCdyZW1vdmUnLCBtb2RlbCwgdGhpcywgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZW1vdmVSZWZlcmVuY2UobW9kZWwsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gc2luZ3VsYXIgPyBtb2RlbHNbMF0gOiBtb2RlbHM7XG4gIH0sXG5cbiAgICAvLyBVcGRhdGUgYSBjb2xsZWN0aW9uIGJ5IGBzZXRgLWluZyBhIG5ldyBsaXN0IG9mIG1vZGVscywgYWRkaW5nIG5ldyBvbmVzLFxuICAgIC8vIHJlbW92aW5nIG1vZGVscyB0aGF0IGFyZSBubyBsb25nZXIgcHJlc2VudCwgYW5kIG1lcmdpbmcgbW9kZWxzIHRoYXRcbiAgICAvLyBhbHJlYWR5IGV4aXN0IGluIHRoZSBjb2xsZWN0aW9uLCBhcyBuZWNlc3NhcnkuIFNpbWlsYXIgdG8gKipNb2RlbCNzZXQqKixcbiAgICAvLyB0aGUgY29yZSBvcGVyYXRpb24gZm9yIHVwZGF0aW5nIHRoZSBkYXRhIGNvbnRhaW5lZCBieSB0aGUgY29sbGVjdGlvbi5cbiAgc2V0OiBmdW5jdGlvbihtb2RlbHMsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gXy5kZWZhdWx0cyh7fSwgb3B0aW9ucywgc2V0T3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMucGFyc2UpIG1vZGVscyA9IHRoaXMucGFyc2UobW9kZWxzLCBvcHRpb25zKTtcbiAgICB2YXIgc2luZ3VsYXIgPSAhXy5pc0FycmF5KG1vZGVscyk7XG4gICAgbW9kZWxzID0gc2luZ3VsYXIgPyAobW9kZWxzID8gW21vZGVsc10gOiBbXSkgOiBtb2RlbHMuc2xpY2UoKTtcbiAgICB2YXIgaWQsIG1vZGVsLCBhdHRycywgZXhpc3RpbmcsIHNvcnQ7XG4gICAgdmFyIGF0ID0gb3B0aW9ucy5hdDtcbiAgICB2YXIgc29ydGFibGUgPSB0aGlzLmNvbXBhcmF0b3IgJiYgKGF0ID09IG51bGwpICYmIG9wdGlvbnMuc29ydCAhPT0gZmFsc2U7XG4gICAgdmFyIHNvcnRBdHRyID0gXy5pc1N0cmluZyh0aGlzLmNvbXBhcmF0b3IpID8gdGhpcy5jb21wYXJhdG9yIDogbnVsbDtcbiAgICB2YXIgdG9BZGQgPSBbXSwgdG9SZW1vdmUgPSBbXSwgbW9kZWxNYXAgPSB7fTtcbiAgICB2YXIgYWRkID0gb3B0aW9ucy5hZGQsIG1lcmdlID0gb3B0aW9ucy5tZXJnZSwgcmVtb3ZlID0gb3B0aW9ucy5yZW1vdmU7XG4gICAgdmFyIG9yZGVyID0gIXNvcnRhYmxlICYmIGFkZCAmJiByZW1vdmUgPyBbXSA6IGZhbHNlO1xuXG4gICAgLy8gVHVybiBiYXJlIG9iamVjdHMgaW50byBtb2RlbCByZWZlcmVuY2VzLCBhbmQgcHJldmVudCBpbnZhbGlkIG1vZGVsc1xuICAgIC8vIGZyb20gYmVpbmcgYWRkZWQuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IG1vZGVscy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgYXR0cnMgPSBtb2RlbHNbaV07XG5cbiAgICAgIC8vIElmIGEgZHVwbGljYXRlIGlzIGZvdW5kLCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgYWRkZWQgYW5kXG4gICAgICAvLyBvcHRpb25hbGx5IG1lcmdlIGl0IGludG8gdGhlIGV4aXN0aW5nIG1vZGVsLlxuICAgICAgaWYgKGV4aXN0aW5nID0gdGhpcy5nZXQoYXR0cnMpKSB7XG4gICAgICAgIGlmIChyZW1vdmUpIG1vZGVsTWFwW2V4aXN0aW5nLmNpZF0gPSB0cnVlO1xuICAgICAgICBpZiAobWVyZ2UgJiYgYXR0cnMgIT09IGV4aXN0aW5nKSB7XG4gICAgICAgICAgYXR0cnMgPSB0aGlzLl9pc01vZGVsKGF0dHJzKSA/IGF0dHJzLmF0dHJpYnV0ZXMgOiBhdHRycztcbiAgICAgICAgICBpZiAob3B0aW9ucy5wYXJzZSkgYXR0cnMgPSBleGlzdGluZy5wYXJzZShhdHRycywgb3B0aW9ucyk7XG4gICAgICAgICAgZXhpc3Rpbmcuc2V0KGF0dHJzLCBvcHRpb25zKTtcbiAgICAgICAgICBpZiAoc29ydGFibGUgJiYgIXNvcnQgJiYgZXhpc3RpbmcuaGFzQ2hhbmdlZChzb3J0QXR0cikpIHNvcnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG1vZGVsc1tpXSA9IGV4aXN0aW5nO1xuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBuZXcsIHZhbGlkIG1vZGVsLCBwdXNoIGl0IHRvIHRoZSBgdG9BZGRgIGxpc3QuXG4gICAgICB9IGVsc2UgaWYgKGFkZCkge1xuICAgICAgICBtb2RlbCA9IG1vZGVsc1tpXSA9IHRoaXMuX3ByZXBhcmVNb2RlbChhdHRycywgb3B0aW9ucyk7XG4gICAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgICB0b0FkZC5wdXNoKG1vZGVsKTtcbiAgICAgICAgdGhpcy5fYWRkUmVmZXJlbmNlKG1vZGVsLCBvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgLy8gRG8gbm90IGFkZCBtdWx0aXBsZSBtb2RlbHMgd2l0aCB0aGUgc2FtZSBgaWRgLlxuICAgICAgbW9kZWwgPSBleGlzdGluZyB8fCBtb2RlbDtcbiAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgaWQgPSB0aGlzLm1vZGVsSWQobW9kZWwuYXR0cmlidXRlcyk7XG4gICAgICBpZiAob3JkZXIgJiYgKG1vZGVsLmlzTmV3KCkgfHwgIW1vZGVsTWFwW2lkXSkpIG9yZGVyLnB1c2gobW9kZWwpO1xuICAgICAgbW9kZWxNYXBbaWRdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgbm9uZXhpc3RlbnQgbW9kZWxzIGlmIGFwcHJvcHJpYXRlLlxuICAgIGlmIChyZW1vdmUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSB0aGlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghbW9kZWxNYXBbKG1vZGVsID0gdGhpcy5tb2RlbHNbaV0pLmNpZF0pIHRvUmVtb3ZlLnB1c2gobW9kZWwpO1xuICAgICAgfVxuICAgICAgaWYgKHRvUmVtb3ZlLmxlbmd0aCkgdGhpcy5yZW1vdmUodG9SZW1vdmUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIFNlZSBpZiBzb3J0aW5nIGlzIG5lZWRlZCwgdXBkYXRlIGBsZW5ndGhgIGFuZCBzcGxpY2UgaW4gbmV3IG1vZGVscy5cbiAgICBpZiAodG9BZGQubGVuZ3RoIHx8IChvcmRlciAmJiBvcmRlci5sZW5ndGgpKSB7XG4gICAgICBpZiAoc29ydGFibGUpIHNvcnQgPSB0cnVlO1xuICAgICAgdGhpcy5sZW5ndGggKz0gdG9BZGQubGVuZ3RoO1xuICAgICAgaWYgKGF0ICE9IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHRvQWRkLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbHMuc3BsaWNlKGF0ICsgaSwgMCwgdG9BZGRbaV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JkZXIpIHRoaXMubW9kZWxzLmxlbmd0aCA9IDA7XG4gICAgICAgIHZhciBvcmRlcmVkTW9kZWxzID0gb3JkZXIgfHwgdG9BZGQ7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBvcmRlcmVkTW9kZWxzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbHMucHVzaChvcmRlcmVkTW9kZWxzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNpbGVudGx5IHNvcnQgdGhlIGNvbGxlY3Rpb24gaWYgYXBwcm9wcmlhdGUuXG4gICAgaWYgKHNvcnQpIHRoaXMuc29ydCh7c2lsZW50OiB0cnVlfSk7XG5cbiAgICAvLyBVbmxlc3Mgc2lsZW5jZWQsIGl0J3MgdGltZSB0byBmaXJlIGFsbCBhcHByb3ByaWF0ZSBhZGQvc29ydCBldmVudHMuXG4gICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgdmFyIGFkZE9wdHMgPSBhdCAhPSBudWxsID8gXy5jbG9uZShvcHRpb25zKSA6IG9wdGlvbnM7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gdG9BZGQubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGF0ICE9IG51bGwpIGFkZE9wdHMuaW5kZXggPSBhdCArIGk7XG4gICAgICAgIChtb2RlbCA9IHRvQWRkW2ldKS50cmlnZ2VyKCdhZGQnLCBtb2RlbCwgdGhpcywgYWRkT3B0cyk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydCB8fCAob3JkZXIgJiYgb3JkZXIubGVuZ3RoKSkgdGhpcy50cmlnZ2VyKCdzb3J0JywgdGhpcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBhZGRlZCAob3IgbWVyZ2VkKSBtb2RlbCAob3IgbW9kZWxzKS5cbiAgICByZXR1cm4gc2luZ3VsYXIgPyBtb2RlbHNbMF0gOiBtb2RlbHM7XG4gIH0sXG5cbiAgICAvLyBXaGVuIHlvdSBoYXZlIG1vcmUgaXRlbXMgdGhhbiB5b3Ugd2FudCB0byBhZGQgb3IgcmVtb3ZlIGluZGl2aWR1YWxseSxcbiAgICAvLyB5b3UgY2FuIHJlc2V0IHRoZSBlbnRpcmUgc2V0IHdpdGggYSBuZXcgbGlzdCBvZiBtb2RlbHMsIHdpdGhvdXQgZmlyaW5nXG4gICAgLy8gYW55IGdyYW51bGFyIGBhZGRgIG9yIGByZW1vdmVgIGV2ZW50cy4gRmlyZXMgYHJlc2V0YCB3aGVuIGZpbmlzaGVkLlxuICAgIC8vIFVzZWZ1bCBmb3IgYnVsayBvcGVyYXRpb25zIGFuZCBvcHRpbWl6YXRpb25zLlxuICByZXNldDogZnVuY3Rpb24obW9kZWxzLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gdGhpcy5tb2RlbHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX3JlbW92ZVJlZmVyZW5jZSh0aGlzLm1vZGVsc1tpXSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIG9wdGlvbnMucHJldmlvdXNNb2RlbHMgPSB0aGlzLm1vZGVscztcbiAgICB0aGlzLl9yZXNldCgpO1xuICAgIG1vZGVscyA9IHRoaXMuYWRkKG1vZGVscywgXy5leHRlbmQoe3NpbGVudDogdHJ1ZX0sIG9wdGlvbnMpKTtcbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB0aGlzLnRyaWdnZXIoJ3Jlc2V0JywgdGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG1vZGVscztcbiAgfSxcblxuICAgIC8vIEFkZCBhIG1vZGVsIHRvIHRoZSBlbmQgb2YgdGhlIGNvbGxlY3Rpb24uXG4gIHB1c2g6IGZ1bmN0aW9uKG1vZGVsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkKG1vZGVsLCBfLmV4dGVuZCh7YXQ6IHRoaXMubGVuZ3RofSwgb3B0aW9ucykpO1xuICB9LFxuXG4gICAgLy8gUmVtb3ZlIGEgbW9kZWwgZnJvbSB0aGUgZW5kIG9mIHRoZSBjb2xsZWN0aW9uLlxuICBwb3A6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICB2YXIgbW9kZWwgPSB0aGlzLmF0KHRoaXMubGVuZ3RoIC0gMSk7XG4gICAgdGhpcy5yZW1vdmUobW9kZWwsIG9wdGlvbnMpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfSxcblxuICAgIC8vIEFkZCBhIG1vZGVsIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbGxlY3Rpb24uXG4gIHVuc2hpZnQ6IGZ1bmN0aW9uKG1vZGVsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuYWRkKG1vZGVsLCBfLmV4dGVuZCh7YXQ6IDB9LCBvcHRpb25zKSk7XG4gIH0sXG5cbiAgICAvLyBSZW1vdmUgYSBtb2RlbCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbGxlY3Rpb24uXG4gIHNoaWZ0OiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgdmFyIG1vZGVsID0gdGhpcy5hdCgwKTtcbiAgICB0aGlzLnJlbW92ZShtb2RlbCwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9LFxuXG4gICAgLy8gU2xpY2Ugb3V0IGEgc3ViLWFycmF5IG9mIG1vZGVscyBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICBzbGljZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNsaWNlLmFwcGx5KHRoaXMubW9kZWxzLCBhcmd1bWVudHMpO1xuICB9LFxuXG4gICAgLy8gR2V0IGEgbW9kZWwgZnJvbSB0aGUgc2V0IGJ5IGlkLlxuICBnZXQ6IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIHZvaWQgMDtcbiAgICB2YXIgaWQgPSB0aGlzLm1vZGVsSWQodGhpcy5faXNNb2RlbChvYmopID8gb2JqLmF0dHJpYnV0ZXMgOiBvYmopO1xuICAgIHJldHVybiB0aGlzLl9ieUlkW29ial0gfHwgdGhpcy5fYnlJZFtpZF0gfHwgdGhpcy5fYnlJZFtvYmouY2lkXTtcbiAgfSxcblxuICAgIC8vIEdldCB0aGUgbW9kZWwgYXQgdGhlIGdpdmVuIGluZGV4LlxuICBhdDogZnVuY3Rpb24oaW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPCAwKSBpbmRleCArPSB0aGlzLmxlbmd0aDtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHNbaW5kZXhdO1xuICB9LFxuXG4gICAgLy8gUmV0dXJuIG1vZGVscyB3aXRoIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIFVzZWZ1bCBmb3Igc2ltcGxlIGNhc2VzIG9mXG4gICAgLy8gYGZpbHRlcmAuXG4gIHdoZXJlOiBmdW5jdGlvbihhdHRycywgZmlyc3QpIHtcbiAgICBpZiAoXy5pc0VtcHR5KGF0dHJzKSkgcmV0dXJuIGZpcnN0ID8gdm9pZCAwIDogW107XG4gICAgcmV0dXJuIHRoaXNbZmlyc3QgPyAnZmluZCcgOiAnZmlsdGVyJ10oZnVuY3Rpb24obW9kZWwpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBhdHRycykge1xuICAgICAgICBpZiAoYXR0cnNba2V5XSAhPT0gbW9kZWwuZ2V0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9LFxuXG4gICAgLy8gUmV0dXJuIHRoZSBmaXJzdCBtb2RlbCB3aXRoIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIFVzZWZ1bCBmb3Igc2ltcGxlIGNhc2VzXG4gICAgLy8gb2YgYGZpbmRgLlxuICBmaW5kV2hlcmU6IGZ1bmN0aW9uKGF0dHJzKSB7XG4gICAgcmV0dXJuIHRoaXMud2hlcmUoYXR0cnMsIHRydWUpO1xuICB9LFxuXG4gICAgLy8gRm9yY2UgdGhlIGNvbGxlY3Rpb24gdG8gcmUtc29ydCBpdHNlbGYuIFlvdSBkb24ndCBuZWVkIHRvIGNhbGwgdGhpcyB1bmRlclxuICAgIC8vIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCBhcyB0aGUgc2V0IHdpbGwgbWFpbnRhaW4gc29ydCBvcmRlciBhcyBlYWNoIGl0ZW1cbiAgICAvLyBpcyBhZGRlZC5cbiAgc29ydDogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGlmICghdGhpcy5jb21wYXJhdG9yKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzb3J0IGEgc2V0IHdpdGhvdXQgYSBjb21wYXJhdG9yJyk7XG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblxuICAgIC8vIFJ1biBzb3J0IGJhc2VkIG9uIHR5cGUgb2YgYGNvbXBhcmF0b3JgLlxuICAgIGlmIChfLmlzU3RyaW5nKHRoaXMuY29tcGFyYXRvcikgfHwgdGhpcy5jb21wYXJhdG9yLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy5tb2RlbHMgPSB0aGlzLnNvcnRCeSh0aGlzLmNvbXBhcmF0b3IsIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZGVscy5zb3J0KF8uYmluZCh0aGlzLmNvbXBhcmF0b3IsIHRoaXMpKTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB0aGlzLnRyaWdnZXIoJ3NvcnQnLCB0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAgIC8vIFBsdWNrIGFuIGF0dHJpYnV0ZSBmcm9tIGVhY2ggbW9kZWwgaW4gdGhlIGNvbGxlY3Rpb24uXG4gIHBsdWNrOiBmdW5jdGlvbihhdHRyKSB7XG4gICAgcmV0dXJuIF8uaW52b2tlKHRoaXMubW9kZWxzLCAnZ2V0JywgYXR0cik7XG4gIH0sXG5cbiAgICAvLyBGZXRjaCB0aGUgZGVmYXVsdCBzZXQgb2YgbW9kZWxzIGZvciB0aGlzIGNvbGxlY3Rpb24sIHJlc2V0dGluZyB0aGVcbiAgICAvLyBjb2xsZWN0aW9uIHdoZW4gdGhleSBhcnJpdmUuIElmIGByZXNldDogdHJ1ZWAgaXMgcGFzc2VkLCB0aGUgcmVzcG9uc2VcbiAgICAvLyBkYXRhIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdGhlIGByZXNldGAgbWV0aG9kIGluc3RlYWQgb2YgYHNldGAuXG4gIGZldGNoOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgPyBfLmNsb25lKG9wdGlvbnMpIDoge307XG4gICAgaWYgKG9wdGlvbnMucGFyc2UgPT09IHZvaWQgMCkgb3B0aW9ucy5wYXJzZSA9IHRydWU7XG4gICAgdmFyIHN1Y2Nlc3MgPSBvcHRpb25zLnN1Y2Nlc3M7XG4gICAgdmFyIGNvbGxlY3Rpb24gPSB0aGlzO1xuICAgIG9wdGlvbnMuc3VjY2VzcyA9IGZ1bmN0aW9uKHJlc3ApIHtcbiAgICAgIHZhciBtZXRob2QgPSBvcHRpb25zLnJlc2V0ID8gJ3Jlc2V0JyA6ICdzZXQnO1xuICAgICAgY29sbGVjdGlvblttZXRob2RdKHJlc3AsIG9wdGlvbnMpO1xuICAgICAgaWYgKHN1Y2Nlc3MpIHN1Y2Nlc3MoY29sbGVjdGlvbiwgcmVzcCwgb3B0aW9ucyk7XG4gICAgICBjb2xsZWN0aW9uLnRyaWdnZXIoJ3N5bmMnLCBjb2xsZWN0aW9uLCByZXNwLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIHdyYXBFcnJvcih0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5zeW5jKCdyZWFkJywgdGhpcywgb3B0aW9ucyk7XG4gIH0sXG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgYSBtb2RlbCBpbiB0aGlzIGNvbGxlY3Rpb24uIEFkZCB0aGUgbW9kZWwgdG8gdGhlXG4gICAgLy8gY29sbGVjdGlvbiBpbW1lZGlhdGVseSwgdW5sZXNzIGB3YWl0OiB0cnVlYCBpcyBwYXNzZWQsIGluIHdoaWNoIGNhc2Ugd2VcbiAgICAvLyB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGFncmVlLlxuICBjcmVhdGU6IGZ1bmN0aW9uKG1vZGVsLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgPyBfLmNsb25lKG9wdGlvbnMpIDoge307XG4gICAgaWYgKCEobW9kZWwgPSB0aGlzLl9wcmVwYXJlTW9kZWwobW9kZWwsIG9wdGlvbnMpKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghb3B0aW9ucy53YWl0KSB0aGlzLmFkZChtb2RlbCwgb3B0aW9ucyk7XG4gICAgdmFyIGNvbGxlY3Rpb24gPSB0aGlzO1xuICAgIHZhciBzdWNjZXNzID0gb3B0aW9ucy5zdWNjZXNzO1xuICAgIG9wdGlvbnMuc3VjY2VzcyA9IGZ1bmN0aW9uKG1vZGVsLCByZXNwKSB7XG4gICAgICBpZiAob3B0aW9ucy53YWl0KSBjb2xsZWN0aW9uLmFkZChtb2RlbCwgb3B0aW9ucyk7XG4gICAgICBpZiAoc3VjY2Vzcykgc3VjY2Vzcyhtb2RlbCwgcmVzcCwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBtb2RlbC5zYXZlKG51bGwsIG9wdGlvbnMpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfSxcblxuICAgIC8vICoqcGFyc2UqKiBjb252ZXJ0cyBhIHJlc3BvbnNlIGludG8gYSBsaXN0IG9mIG1vZGVscyB0byBiZSBhZGRlZCB0byB0aGVcbiAgICAvLyBjb2xsZWN0aW9uLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IHRvIHBhc3MgaXQgdGhyb3VnaC5cbiAgcGFyc2U6IGZ1bmN0aW9uKHJlc3AsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gcmVzcDtcbiAgfSxcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBjb2xsZWN0aW9uIHdpdGggYW4gaWRlbnRpY2FsIGxpc3Qgb2YgbW9kZWxzIGFzIHRoaXMgb25lLlxuICBjbG9uZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubW9kZWxzLCB7XG4gICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgIGNvbXBhcmF0b3I6IHRoaXMuY29tcGFyYXRvclxuICAgIH0pO1xuICB9LFxuXG4gICAgLy8gRGVmaW5lIGhvdyB0byB1bmlxdWVseSBpZGVudGlmeSBtb2RlbHMgaW4gdGhlIGNvbGxlY3Rpb24uXG4gIG1vZGVsSWQ6IGZ1bmN0aW9uIChhdHRycykge1xuICAgIHJldHVybiBhdHRyc1t0aGlzLm1vZGVsLnByb3RvdHlwZS5pZEF0dHJpYnV0ZSB8fCAnaWQnXTtcbiAgfSxcblxuICAgIC8vIFByaXZhdGUgbWV0aG9kIHRvIHJlc2V0IGFsbCBpbnRlcm5hbCBzdGF0ZS4gQ2FsbGVkIHdoZW4gdGhlIGNvbGxlY3Rpb25cbiAgICAvLyBpcyBmaXJzdCBpbml0aWFsaXplZCBvciByZXNldC5cbiAgX3Jlc2V0OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5tb2RlbHMgPSBbXTtcbiAgICB0aGlzLl9ieUlkICA9IHt9O1xuICB9LFxuXG4gICAgLy8gUHJlcGFyZSBhIGhhc2ggb2YgYXR0cmlidXRlcyAob3Igb3RoZXIgbW9kZWwpIHRvIGJlIGFkZGVkIHRvIHRoaXNcbiAgICAvLyBjb2xsZWN0aW9uLlxuICBfcHJlcGFyZU1vZGVsOiBmdW5jdGlvbihhdHRycywgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc01vZGVsKGF0dHJzKSkge1xuICAgICAgaWYgKCFhdHRycy5jb2xsZWN0aW9uKSBhdHRycy5jb2xsZWN0aW9uID0gdGhpcztcbiAgICAgIHJldHVybiBhdHRycztcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgPyBfLmNsb25lKG9wdGlvbnMpIDoge307XG4gICAgb3B0aW9ucy5jb2xsZWN0aW9uID0gdGhpcztcbiAgICB2YXIgbW9kZWwgPSBuZXcgdGhpcy5tb2RlbChhdHRycywgb3B0aW9ucyk7XG4gICAgaWYgKCFtb2RlbC52YWxpZGF0aW9uRXJyb3IpIHJldHVybiBtb2RlbDtcbiAgICB0aGlzLnRyaWdnZXIoJ2ludmFsaWQnLCB0aGlzLCBtb2RlbC52YWxpZGF0aW9uRXJyb3IsIG9wdGlvbnMpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAgIC8vIE1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBvYmplY3Qgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBtb2RlbCBmb3JcbiAgICAvLyB0aGUgcHVycG9zZXMgb2YgYWRkaW5nIHRvIHRoZSBjb2xsZWN0aW9uLlxuICBfaXNNb2RlbDogZnVuY3Rpb24gKG1vZGVsKSB7XG4gICAgcmV0dXJuIG1vZGVsIGluc3RhbmNlb2YgTW9kZWw7XG4gIH0sXG5cbiAgICAvLyBJbnRlcm5hbCBtZXRob2QgdG8gY3JlYXRlIGEgbW9kZWwncyB0aWVzIHRvIGEgY29sbGVjdGlvbi5cbiAgX2FkZFJlZmVyZW5jZTogZnVuY3Rpb24obW9kZWwsIG9wdGlvbnMpIHtcbiAgICB0aGlzLl9ieUlkW21vZGVsLmNpZF0gPSBtb2RlbDtcbiAgICB2YXIgaWQgPSB0aGlzLm1vZGVsSWQobW9kZWwuYXR0cmlidXRlcyk7XG4gICAgaWYgKGlkICE9IG51bGwpIHRoaXMuX2J5SWRbaWRdID0gbW9kZWw7XG4gICAgbW9kZWwub24oJ2FsbCcsIHRoaXMuX29uTW9kZWxFdmVudCwgdGhpcyk7XG4gIH0sXG5cbiAgICAvLyBJbnRlcm5hbCBtZXRob2QgdG8gc2V2ZXIgYSBtb2RlbCdzIHRpZXMgdG8gYSBjb2xsZWN0aW9uLlxuICBfcmVtb3ZlUmVmZXJlbmNlOiBmdW5jdGlvbihtb2RlbCwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzID09PSBtb2RlbC5jb2xsZWN0aW9uKSBkZWxldGUgbW9kZWwuY29sbGVjdGlvbjtcbiAgICBtb2RlbC5vZmYoJ2FsbCcsIHRoaXMuX29uTW9kZWxFdmVudCwgdGhpcyk7XG4gIH0sXG5cbiAgICAvLyBJbnRlcm5hbCBtZXRob2QgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBtb2RlbCBpbiB0aGUgc2V0IGZpcmVzIGFuIGV2ZW50LlxuICAgIC8vIFNldHMgbmVlZCB0byB1cGRhdGUgdGhlaXIgaW5kZXhlcyB3aGVuIG1vZGVscyBjaGFuZ2UgaWRzLiBBbGwgb3RoZXJcbiAgICAvLyBldmVudHMgc2ltcGx5IHByb3h5IHRocm91Z2guIFwiYWRkXCIgYW5kIFwicmVtb3ZlXCIgZXZlbnRzIHRoYXQgb3JpZ2luYXRlXG4gICAgLy8gaW4gb3RoZXIgY29sbGVjdGlvbnMgYXJlIGlnbm9yZWQuXG4gIF9vbk1vZGVsRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50LCBtb2RlbCwgY29sbGVjdGlvbiwgb3B0aW9ucykge1xuICAgIGlmICgoZXZlbnQgPT09ICdhZGQnIHx8IGV2ZW50ID09PSAncmVtb3ZlJykgJiYgY29sbGVjdGlvbiAhPT0gdGhpcykgcmV0dXJuO1xuICAgIGlmIChldmVudCA9PT0gJ2Rlc3Ryb3knKSB0aGlzLnJlbW92ZShtb2RlbCwgb3B0aW9ucyk7XG4gICAgaWYgKGV2ZW50ID09PSAnY2hhbmdlJykge1xuICAgICAgdmFyIHByZXZJZCA9IHRoaXMubW9kZWxJZChtb2RlbC5wcmV2aW91c0F0dHJpYnV0ZXMoKSk7XG4gICAgICB2YXIgaWQgPSB0aGlzLm1vZGVsSWQobW9kZWwuYXR0cmlidXRlcyk7XG4gICAgICBpZiAocHJldklkICE9PSBpZCkge1xuICAgICAgICBpZiAocHJldklkICE9IG51bGwpIGRlbGV0ZSB0aGlzLl9ieUlkW3ByZXZJZF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB0aGlzLl9ieUlkW2lkXSA9IG1vZGVsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnRyaWdnZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG59KTtcblxuLy8gVW5kZXJzY29yZSBtZXRob2RzIHRoYXQgd2Ugd2FudCB0byBpbXBsZW1lbnQgb24gdGhlIENvbGxlY3Rpb24uXG4vLyA5MCUgb2YgdGhlIGNvcmUgdXNlZnVsbmVzcyBvZiBCYWNrYm9uZSBDb2xsZWN0aW9ucyBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZFxuLy8gcmlnaHQgaGVyZTpcbnZhciBtZXRob2RzID0gWydmb3JFYWNoJywgJ2VhY2gnLCAnbWFwJywgJ2NvbGxlY3QnLCAncmVkdWNlJywgJ2ZvbGRsJyxcbiAgICAnaW5qZWN0JywgJ3JlZHVjZVJpZ2h0JywgJ2ZvbGRyJywgJ2ZpbmQnLCAnZGV0ZWN0JywgJ2ZpbHRlcicsICdzZWxlY3QnLFxuICAgICdyZWplY3QnLCAnZXZlcnknLCAnYWxsJywgJ3NvbWUnLCAnYW55JywgJ2luY2x1ZGUnLCAnY29udGFpbnMnLCAnaW52b2tlJyxcbiAgICAnbWF4JywgJ21pbicsICd0b0FycmF5JywgJ3NpemUnLCAnZmlyc3QnLCAnaGVhZCcsICd0YWtlJywgJ2luaXRpYWwnLCAncmVzdCcsXG4gICAgJ3RhaWwnLCAnZHJvcCcsICdsYXN0JywgJ3dpdGhvdXQnLCAnZGlmZmVyZW5jZScsICdpbmRleE9mJywgJ3NodWZmbGUnLFxuICAgICdsYXN0SW5kZXhPZicsICdpc0VtcHR5JywgJ2NoYWluJywgJ3NhbXBsZScsICdwYXJ0aXRpb24nXTtcblxuLy8gTWl4IGluIGVhY2ggVW5kZXJzY29yZSBtZXRob2QgYXMgYSBwcm94eSB0byBgQ29sbGVjdGlvbiNtb2RlbHNgLlxuXy5lYWNoKG1ldGhvZHMsIGZ1bmN0aW9uKG1ldGhvZCkge1xuICBpZiAoIV9bbWV0aG9kXSkgcmV0dXJuO1xuICBDb2xsZWN0aW9uLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgYXJncy51bnNoaWZ0KHRoaXMubW9kZWxzKTtcbiAgICByZXR1cm4gX1ttZXRob2RdLmFwcGx5KF8sIGFyZ3MpO1xuICB9O1xufSk7XG5cbi8vIFVuZGVyc2NvcmUgbWV0aG9kcyB0aGF0IHRha2UgYSBwcm9wZXJ0eSBuYW1lIGFzIGFuIGFyZ3VtZW50LlxudmFyIGF0dHJpYnV0ZU1ldGhvZHMgPSBbJ2dyb3VwQnknLCAnY291bnRCeScsICdzb3J0QnknLCAnaW5kZXhCeSddO1xuXG4vLyBVc2UgYXR0cmlidXRlcyBpbnN0ZWFkIG9mIHByb3BlcnRpZXMuXG5fLmVhY2goYXR0cmlidXRlTWV0aG9kcywgZnVuY3Rpb24obWV0aG9kKSB7XG4gIGlmICghX1ttZXRob2RdKSByZXR1cm47XG4gIENvbGxlY3Rpb24ucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih2YWx1ZSwgY29udGV4dCkge1xuICAgIHZhciBpdGVyYXRvciA9IF8uaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZSA6IGZ1bmN0aW9uKG1vZGVsKSB7XG4gICAgICByZXR1cm4gbW9kZWwuZ2V0KHZhbHVlKTtcbiAgICB9O1xuICAgIHJldHVybiBfW21ldGhvZF0odGhpcy5tb2RlbHMsIGl0ZXJhdG9yLCBjb250ZXh0KTtcbiAgfTtcbn0pO1xuXG4vLyBzZXR1cCBpbmhlcml0YW5jZVxuQ29sbGVjdGlvbi5leHRlbmQgPSBleHRlbmQ7XG5tb2R1bGUuZXhwb3J0cyA9IENvbGxlY3Rpb247XG4iLCJtb2R1bGUuZXhwb3J0cy5Nb2RlbCA9IHJlcXVpcmUoXCIuL21vZGVsXCIpO1xubW9kdWxlLmV4cG9ydHMuQ29sbGVjdGlvbiA9IHJlcXVpcmUoXCIuL2NvbGxlY3Rpb25cIik7XG5tb2R1bGUuZXhwb3J0cy5FdmVudHMgPSByZXF1aXJlKFwiYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmVcIik7XG5tb2R1bGUuZXhwb3J0cy5leHRlbmQgPSByZXF1aXJlKFwiYmFja2JvbmUtZXh0ZW5kLXN0YW5kYWxvbmVcIik7XG4iLCIvLyAgICAgQmFja2JvbmUuanMgMS4xLjJcblxuLy8gICAgIChjKSAyMDEwLTIwMTQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbi8vICAgICBCYWNrYm9uZSBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbi8vICAgICBGb3IgYWxsIGRldGFpbHMgYW5kIGRvY3VtZW50YXRpb246XG4vLyAgICAgaHR0cDovL2JhY2tib25lanMub3JnXG5cbnZhciBFdmVudHMgPSByZXF1aXJlKFwiYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmVcIik7XG52YXIgZXh0ZW5kID0gcmVxdWlyZShcImJhY2tib25lLWV4dGVuZC1zdGFuZGFsb25lXCIpO1xudmFyIF8gPSByZXF1aXJlKFwidW5kZXJzY29yZVwiKTtcblxuLy8gQmFja2JvbmUuTW9kZWxcbi8vIC0tLS0tLS0tLS0tLS0tXG5cbi8vIEJhY2tib25lICoqTW9kZWxzKiogYXJlIHRoZSBiYXNpYyBkYXRhIG9iamVjdCBpbiB0aGUgZnJhbWV3b3JrIC0tXG4vLyBmcmVxdWVudGx5IHJlcHJlc2VudGluZyBhIHJvdyBpbiBhIHRhYmxlIGluIGEgZGF0YWJhc2Ugb24geW91ciBzZXJ2ZXIuXG4vLyBBIGRpc2NyZXRlIGNodW5rIG9mIGRhdGEgYW5kIGEgYnVuY2ggb2YgdXNlZnVsLCByZWxhdGVkIG1ldGhvZHMgZm9yXG4vLyBwZXJmb3JtaW5nIGNvbXB1dGF0aW9ucyBhbmQgdHJhbnNmb3JtYXRpb25zIG9uIHRoYXQgZGF0YS5cblxuLy8gQ3JlYXRlIGEgbmV3IG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVzLiBBIGNsaWVudCBpZCAoYGNpZGApXG4vLyBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBhbmQgYXNzaWduZWQgZm9yIHlvdS5cbnZhciBNb2RlbCA9IGZ1bmN0aW9uKGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcbiAgdmFyIGF0dHJzID0gYXR0cmlidXRlcyB8fCB7fTtcbiAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgdGhpcy5jaWQgPSBfLnVuaXF1ZUlkKCdjJyk7XG4gIHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuICBpZiAob3B0aW9ucy5jb2xsZWN0aW9uKSB0aGlzLmNvbGxlY3Rpb24gPSBvcHRpb25zLmNvbGxlY3Rpb247XG4gIGlmIChvcHRpb25zLnBhcnNlKSBhdHRycyA9IHRoaXMucGFyc2UoYXR0cnMsIG9wdGlvbnMpIHx8IHt9O1xuICBhdHRycyA9IF8uZGVmYXVsdHMoe30sIGF0dHJzLCBfLnJlc3VsdCh0aGlzLCAnZGVmYXVsdHMnKSk7XG4gIHRoaXMuc2V0KGF0dHJzLCBvcHRpb25zKTtcbiAgdGhpcy5jaGFuZ2VkID0ge307XG4gIHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuLy8gQXR0YWNoIGFsbCBpbmhlcml0YWJsZSBtZXRob2RzIHRvIHRoZSBNb2RlbCBwcm90b3R5cGUuXG5fLmV4dGVuZChNb2RlbC5wcm90b3R5cGUsIEV2ZW50cywge1xuXG4gIC8vIEEgaGFzaCBvZiBhdHRyaWJ1dGVzIHdob3NlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHZhbHVlIGRpZmZlci5cbiAgY2hhbmdlZDogbnVsbCxcblxuICAvLyBUaGUgdmFsdWUgcmV0dXJuZWQgZHVyaW5nIHRoZSBsYXN0IGZhaWxlZCB2YWxpZGF0aW9uLlxuICB2YWxpZGF0aW9uRXJyb3I6IG51bGwsXG5cbiAgICAvLyBUaGUgZGVmYXVsdCBuYW1lIGZvciB0aGUgSlNPTiBgaWRgIGF0dHJpYnV0ZSBpcyBgXCJpZFwiYC4gTW9uZ29EQiBhbmRcbiAgICAvLyBDb3VjaERCIHVzZXJzIG1heSB3YW50IHRvIHNldCB0aGlzIHRvIGBcIl9pZFwiYC5cbiAgaWRBdHRyaWJ1dGU6ICdpZCcsXG5cbiAgICAvLyBJbml0aWFsaXplIGlzIGFuIGVtcHR5IGZ1bmN0aW9uIGJ5IGRlZmF1bHQuIE92ZXJyaWRlIGl0IHdpdGggeW91ciBvd25cbiAgICAvLyBpbml0aWFsaXphdGlvbiBsb2dpYy5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKXt9LFxuXG4gICAgLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgbW9kZWwncyBgYXR0cmlidXRlc2Agb2JqZWN0LlxuICB0b0pTT046IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gXy5jbG9uZSh0aGlzLmF0dHJpYnV0ZXMpO1xuICB9LFxuXG4gICAgLy8gUHJveHkgYEJhY2tib25lLnN5bmNgIGJ5IGRlZmF1bHQgLS0gYnV0IG92ZXJyaWRlIHRoaXMgaWYgeW91IG5lZWRcbiAgICAvLyBjdXN0b20gc3luY2luZyBzZW1hbnRpY3MgZm9yICp0aGlzKiBwYXJ0aWN1bGFyIG1vZGVsLlxuICBzeW5jOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gQmFja2JvbmUuc3luYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9LFxuXG4gICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuXG4gIGdldDogZnVuY3Rpb24oYXR0cikge1xuICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbYXR0cl07XG4gIH0sXG5cbiAgICAvLyBHZXQgdGhlIEhUTUwtZXNjYXBlZCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuXG4gIGVzY2FwZTogZnVuY3Rpb24oYXR0cikge1xuICAgIHJldHVybiBfLmVzY2FwZSh0aGlzLmdldChhdHRyKSk7XG4gIH0sXG5cbiAgICAvLyBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXR0cmlidXRlIGNvbnRhaW5zIGEgdmFsdWUgdGhhdCBpcyBub3QgbnVsbFxuICAgIC8vIG9yIHVuZGVmaW5lZC5cbiAgaGFzOiBmdW5jdGlvbihhdHRyKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGF0dHIpICE9IG51bGw7XG4gIH0sXG5cbiAgICAvLyBTZXQgYSBoYXNoIG9mIG1vZGVsIGF0dHJpYnV0ZXMgb24gdGhlIG9iamVjdCwgZmlyaW5nIGBcImNoYW5nZVwiYC4gVGhpcyBpc1xuICAgIC8vIHRoZSBjb3JlIHByaW1pdGl2ZSBvcGVyYXRpb24gb2YgYSBtb2RlbCwgdXBkYXRpbmcgdGhlIGRhdGEgYW5kIG5vdGlmeWluZ1xuICAgIC8vIGFueW9uZSB3aG8gbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgY2hhbmdlIGluIHN0YXRlLiBUaGUgaGVhcnQgb2YgdGhlIGJlYXN0LlxuICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsLCBvcHRpb25zKSB7XG4gICAgdmFyIGF0dHIsIGF0dHJzLCB1bnNldCwgY2hhbmdlcywgc2lsZW50LCBjaGFuZ2luZywgcHJldiwgY3VycmVudDtcbiAgICBpZiAoa2V5ID09IG51bGwpIHJldHVybiB0aGlzO1xuXG4gICAgLy8gSGFuZGxlIGJvdGggYFwia2V5XCIsIHZhbHVlYCBhbmQgYHtrZXk6IHZhbHVlfWAgLXN0eWxlIGFyZ3VtZW50cy5cbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGF0dHJzID0ga2V5O1xuICAgICAgb3B0aW9ucyA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgKGF0dHJzID0ge30pW2tleV0gPSB2YWw7XG4gICAgfVxuXG4gICAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblxuICAgIC8vIFJ1biB2YWxpZGF0aW9uLlxuICAgIGlmICghdGhpcy5fdmFsaWRhdGUoYXR0cnMsIG9wdGlvbnMpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBFeHRyYWN0IGF0dHJpYnV0ZXMgYW5kIG9wdGlvbnMuXG4gICAgdW5zZXQgICAgICAgICAgID0gb3B0aW9ucy51bnNldDtcbiAgICBzaWxlbnQgICAgICAgICAgPSBvcHRpb25zLnNpbGVudDtcbiAgICBjaGFuZ2VzICAgICAgICAgPSBbXTtcbiAgICBjaGFuZ2luZyAgICAgICAgPSB0aGlzLl9jaGFuZ2luZztcbiAgICB0aGlzLl9jaGFuZ2luZyAgPSB0cnVlO1xuXG4gICAgaWYgKCFjaGFuZ2luZykge1xuICAgICAgdGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzID0gXy5jbG9uZSh0aGlzLmF0dHJpYnV0ZXMpO1xuICAgICAgdGhpcy5jaGFuZ2VkID0ge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSB0aGlzLmF0dHJpYnV0ZXMsIHByZXYgPSB0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXM7XG5cbiAgICAvLyBDaGVjayBmb3IgY2hhbmdlcyBvZiBgaWRgLlxuICAgIGlmICh0aGlzLmlkQXR0cmlidXRlIGluIGF0dHJzKSB0aGlzLmlkID0gYXR0cnNbdGhpcy5pZEF0dHJpYnV0ZV07XG5cbiAgICAvLyBGb3IgZWFjaCBgc2V0YCBhdHRyaWJ1dGUsIHVwZGF0ZSBvciBkZWxldGUgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgZm9yIChhdHRyIGluIGF0dHJzKSB7XG4gICAgICB2YWwgPSBhdHRyc1thdHRyXTtcbiAgICAgIGlmICghXy5pc0VxdWFsKGN1cnJlbnRbYXR0cl0sIHZhbCkpIGNoYW5nZXMucHVzaChhdHRyKTtcbiAgICAgIGlmICghXy5pc0VxdWFsKHByZXZbYXR0cl0sIHZhbCkpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VkW2F0dHJdID0gdmFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuY2hhbmdlZFthdHRyXTtcbiAgICAgIH1cbiAgICAgIHVuc2V0ID8gZGVsZXRlIGN1cnJlbnRbYXR0cl0gOiBjdXJyZW50W2F0dHJdID0gdmFsO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXIgYWxsIHJlbGV2YW50IGF0dHJpYnV0ZSBjaGFuZ2VzLlxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBpZiAoY2hhbmdlcy5sZW5ndGgpIHRoaXMuX3BlbmRpbmcgPSBvcHRpb25zO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGNoYW5nZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2U6JyArIGNoYW5nZXNbaV0sIHRoaXMsIGN1cnJlbnRbY2hhbmdlc1tpXV0sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFlvdSBtaWdodCBiZSB3b25kZXJpbmcgd2h5IHRoZXJlJ3MgYSBgd2hpbGVgIGxvb3AgaGVyZS4gQ2hhbmdlcyBjYW5cbiAgICAvLyBiZSByZWN1cnNpdmVseSBuZXN0ZWQgd2l0aGluIGBcImNoYW5nZVwiYCBldmVudHMuXG4gICAgaWYgKGNoYW5naW5nKSByZXR1cm4gdGhpcztcbiAgICBpZiAoIXNpbGVudCkge1xuICAgICAgd2hpbGUgKHRoaXMuX3BlbmRpbmcpIHtcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMuX3BlbmRpbmc7XG4gICAgICAgIHRoaXMuX3BlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2UnLCB0aGlzLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcGVuZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2NoYW5naW5nID0gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgICAvLyBSZW1vdmUgYW4gYXR0cmlidXRlIGZyb20gdGhlIG1vZGVsLCBmaXJpbmcgYFwiY2hhbmdlXCJgLiBgdW5zZXRgIGlzIGEgbm9vcFxuICAgIC8vIGlmIHRoZSBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdC5cbiAgdW5zZXQ6IGZ1bmN0aW9uKGF0dHIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXQoYXR0ciwgdm9pZCAwLCBfLmV4dGVuZCh7fSwgb3B0aW9ucywge3Vuc2V0OiB0cnVlfSkpO1xuICB9LFxuXG4gICAgLy8gQ2xlYXIgYWxsIGF0dHJpYnV0ZXMgb24gdGhlIG1vZGVsLCBmaXJpbmcgYFwiY2hhbmdlXCJgLlxuICBjbGVhcjogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIHZhciBhdHRycyA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmF0dHJpYnV0ZXMpIGF0dHJzW2tleV0gPSB2b2lkIDA7XG4gICAgcmV0dXJuIHRoaXMuc2V0KGF0dHJzLCBfLmV4dGVuZCh7fSwgb3B0aW9ucywge3Vuc2V0OiB0cnVlfSkpO1xuICB9LFxuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBtb2RlbCBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBgXCJjaGFuZ2VcImAgZXZlbnQuXG4gICAgLy8gSWYgeW91IHNwZWNpZnkgYW4gYXR0cmlidXRlIG5hbWUsIGRldGVybWluZSBpZiB0aGF0IGF0dHJpYnV0ZSBoYXMgY2hhbmdlZC5cbiAgaGFzQ2hhbmdlZDogZnVuY3Rpb24oYXR0cikge1xuICAgIGlmIChhdHRyID09IG51bGwpIHJldHVybiAhXy5pc0VtcHR5KHRoaXMuY2hhbmdlZCk7XG4gICAgcmV0dXJuIF8uaGFzKHRoaXMuY2hhbmdlZCwgYXR0cik7XG4gIH0sXG5cbiAgICAvLyBSZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBhdHRyaWJ1dGVzIHRoYXQgaGF2ZSBjaGFuZ2VkLCBvclxuICAgIC8vIGZhbHNlIGlmIHRoZXJlIGFyZSBubyBjaGFuZ2VkIGF0dHJpYnV0ZXMuIFVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgd2hhdFxuICAgIC8vIHBhcnRzIG9mIGEgdmlldyBuZWVkIHRvIGJlIHVwZGF0ZWQgYW5kL29yIHdoYXQgYXR0cmlidXRlcyBuZWVkIHRvIGJlXG4gICAgLy8gcGVyc2lzdGVkIHRvIHRoZSBzZXJ2ZXIuIFVuc2V0IGF0dHJpYnV0ZXMgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxuICAgIC8vIFlvdSBjYW4gYWxzbyBwYXNzIGFuIGF0dHJpYnV0ZXMgb2JqZWN0IHRvIGRpZmYgYWdhaW5zdCB0aGUgbW9kZWwsXG4gICAgLy8gZGV0ZXJtaW5pbmcgaWYgdGhlcmUgKndvdWxkIGJlKiBhIGNoYW5nZS5cbiAgY2hhbmdlZEF0dHJpYnV0ZXM6IGZ1bmN0aW9uKGRpZmYpIHtcbiAgICBpZiAoIWRpZmYpIHJldHVybiB0aGlzLmhhc0NoYW5nZWQoKSA/IF8uY2xvbmUodGhpcy5jaGFuZ2VkKSA6IGZhbHNlO1xuICAgIHZhciB2YWwsIGNoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgb2xkID0gdGhpcy5fY2hhbmdpbmcgPyB0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXMgOiB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgZm9yICh2YXIgYXR0ciBpbiBkaWZmKSB7XG4gICAgICBpZiAoXy5pc0VxdWFsKG9sZFthdHRyXSwgKHZhbCA9IGRpZmZbYXR0cl0pKSkgY29udGludWU7XG4gICAgICAoY2hhbmdlZCB8fCAoY2hhbmdlZCA9IHt9KSlbYXR0cl0gPSB2YWw7XG4gICAgfVxuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9LFxuXG4gICAgLy8gR2V0IHRoZSBwcmV2aW91cyB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUsIHJlY29yZGVkIGF0IHRoZSB0aW1lIHRoZSBsYXN0XG4gICAgLy8gYFwiY2hhbmdlXCJgIGV2ZW50IHdhcyBmaXJlZC5cbiAgcHJldmlvdXM6IGZ1bmN0aW9uKGF0dHIpIHtcbiAgICBpZiAoYXR0ciA9PSBudWxsIHx8ICF0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXMpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLl9wcmV2aW91c0F0dHJpYnV0ZXNbYXR0cl07XG4gIH0sXG5cbiAgICAvLyBHZXQgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBtb2RlbCBhdCB0aGUgdGltZSBvZiB0aGUgcHJldmlvdXNcbiAgICAvLyBgXCJjaGFuZ2VcImAgZXZlbnQuXG4gIHByZXZpb3VzQXR0cmlidXRlczogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIF8uY2xvbmUodGhpcy5fcHJldmlvdXNBdHRyaWJ1dGVzKTtcbiAgfSxcblxuICAgIC8vIEZldGNoIHRoZSBtb2RlbCBmcm9tIHRoZSBzZXJ2ZXIuIElmIHRoZSBzZXJ2ZXIncyByZXByZXNlbnRhdGlvbiBvZiB0aGVcbiAgICAvLyBtb2RlbCBkaWZmZXJzIGZyb20gaXRzIGN1cnJlbnQgYXR0cmlidXRlcywgdGhleSB3aWxsIGJlIG92ZXJyaWRkZW4sXG4gICAgLy8gdHJpZ2dlcmluZyBhIGBcImNoYW5nZVwiYCBldmVudC5cbiAgZmV0Y2g6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IF8uY2xvbmUob3B0aW9ucykgOiB7fTtcbiAgICBpZiAob3B0aW9ucy5wYXJzZSA9PT0gdm9pZCAwKSBvcHRpb25zLnBhcnNlID0gdHJ1ZTtcbiAgICB2YXIgbW9kZWwgPSB0aGlzO1xuICAgIHZhciBzdWNjZXNzID0gb3B0aW9ucy5zdWNjZXNzO1xuICAgIG9wdGlvbnMuc3VjY2VzcyA9IGZ1bmN0aW9uKHJlc3ApIHtcbiAgICAgIGlmICghbW9kZWwuc2V0KG1vZGVsLnBhcnNlKHJlc3AsIG9wdGlvbnMpLCBvcHRpb25zKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHN1Y2Nlc3MpIHN1Y2Nlc3MobW9kZWwsIHJlc3AsIG9wdGlvbnMpO1xuICAgICAgbW9kZWwudHJpZ2dlcignc3luYycsIG1vZGVsLCByZXNwLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIHdyYXBFcnJvcih0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcy5zeW5jKCdyZWFkJywgdGhpcywgb3B0aW9ucyk7XG4gIH0sXG5cbiAgICAvLyBTZXQgYSBoYXNoIG9mIG1vZGVsIGF0dHJpYnV0ZXMsIGFuZCBzeW5jIHRoZSBtb2RlbCB0byB0aGUgc2VydmVyLlxuICAgIC8vIElmIHRoZSBzZXJ2ZXIgcmV0dXJucyBhbiBhdHRyaWJ1dGVzIGhhc2ggdGhhdCBkaWZmZXJzLCB0aGUgbW9kZWwnc1xuICAgIC8vIHN0YXRlIHdpbGwgYmUgYHNldGAgYWdhaW4uXG4gIHNhdmU6IGZ1bmN0aW9uKGtleSwgdmFsLCBvcHRpb25zKSB7XG4gICAgdmFyIGF0dHJzLCBtZXRob2QsIHhociwgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuICAgIC8vIEhhbmRsZSBib3RoIGBcImtleVwiLCB2YWx1ZWAgYW5kIGB7a2V5OiB2YWx1ZX1gIC1zdHlsZSBhcmd1bWVudHMuXG4gICAgaWYgKGtleSA9PSBudWxsIHx8IHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICBhdHRycyA9IGtleTtcbiAgICAgIG9wdGlvbnMgPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIChhdHRycyA9IHt9KVtrZXldID0gdmFsO1xuICAgIH1cblxuICAgIG9wdGlvbnMgPSBfLmV4dGVuZCh7dmFsaWRhdGU6IHRydWV9LCBvcHRpb25zKTtcblxuICAgIC8vIElmIHdlJ3JlIG5vdCB3YWl0aW5nIGFuZCBhdHRyaWJ1dGVzIGV4aXN0LCBzYXZlIGFjdHMgYXNcbiAgICAvLyBgc2V0KGF0dHIpLnNhdmUobnVsbCwgb3B0cylgIHdpdGggdmFsaWRhdGlvbi4gT3RoZXJ3aXNlLCBjaGVjayBpZlxuICAgIC8vIHRoZSBtb2RlbCB3aWxsIGJlIHZhbGlkIHdoZW4gdGhlIGF0dHJpYnV0ZXMsIGlmIGFueSwgYXJlIHNldC5cbiAgICBpZiAoYXR0cnMgJiYgIW9wdGlvbnMud2FpdCkge1xuICAgICAgaWYgKCF0aGlzLnNldChhdHRycywgb3B0aW9ucykpIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLl92YWxpZGF0ZShhdHRycywgb3B0aW9ucykpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGVtcG9yYXJ5IGF0dHJpYnV0ZXMgaWYgYHt3YWl0OiB0cnVlfWAuXG4gICAgaWYgKGF0dHJzICYmIG9wdGlvbnMud2FpdCkge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gXy5leHRlbmQoe30sIGF0dHJpYnV0ZXMsIGF0dHJzKTtcbiAgICB9XG5cbiAgICAvLyBBZnRlciBhIHN1Y2Nlc3NmdWwgc2VydmVyLXNpZGUgc2F2ZSwgdGhlIGNsaWVudCBpcyAob3B0aW9uYWxseSlcbiAgICAvLyB1cGRhdGVkIHdpdGggdGhlIHNlcnZlci1zaWRlIHN0YXRlLlxuICAgIGlmIChvcHRpb25zLnBhcnNlID09PSB2b2lkIDApIG9wdGlvbnMucGFyc2UgPSB0cnVlO1xuICAgIHZhciBtb2RlbCA9IHRoaXM7XG4gICAgdmFyIHN1Y2Nlc3MgPSBvcHRpb25zLnN1Y2Nlc3M7XG4gICAgb3B0aW9ucy5zdWNjZXNzID0gZnVuY3Rpb24ocmVzcCkge1xuICAgICAgLy8gRW5zdXJlIGF0dHJpYnV0ZXMgYXJlIHJlc3RvcmVkIGR1cmluZyBzeW5jaHJvbm91cyBzYXZlcy5cbiAgICAgIG1vZGVsLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuICAgICAgdmFyIHNlcnZlckF0dHJzID0gbW9kZWwucGFyc2UocmVzcCwgb3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy53YWl0KSBzZXJ2ZXJBdHRycyA9IF8uZXh0ZW5kKGF0dHJzIHx8IHt9LCBzZXJ2ZXJBdHRycyk7XG4gICAgICBpZiAoXy5pc09iamVjdChzZXJ2ZXJBdHRycykgJiYgIW1vZGVsLnNldChzZXJ2ZXJBdHRycywgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHN1Y2Nlc3MpIHN1Y2Nlc3MobW9kZWwsIHJlc3AsIG9wdGlvbnMpO1xuICAgICAgbW9kZWwudHJpZ2dlcignc3luYycsIG1vZGVsLCByZXNwLCBvcHRpb25zKTtcbiAgICB9O1xuICAgIHdyYXBFcnJvcih0aGlzLCBvcHRpb25zKTtcblxuICAgIG1ldGhvZCA9IHRoaXMuaXNOZXcoKSA/ICdjcmVhdGUnIDogKG9wdGlvbnMucGF0Y2ggPyAncGF0Y2gnIDogJ3VwZGF0ZScpO1xuICAgIGlmIChtZXRob2QgPT09ICdwYXRjaCcgJiYgIW9wdGlvbnMuYXR0cnMpIG9wdGlvbnMuYXR0cnMgPSBhdHRycztcbiAgICB4aHIgPSB0aGlzLnN5bmMobWV0aG9kLCB0aGlzLCBvcHRpb25zKTtcblxuICAgIC8vIFJlc3RvcmUgYXR0cmlidXRlcy5cbiAgICBpZiAoYXR0cnMgJiYgb3B0aW9ucy53YWl0KSB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzO1xuXG4gICAgcmV0dXJuIHhocjtcbiAgfSxcblxuICAgIC8vIERlc3Ryb3kgdGhpcyBtb2RlbCBvbiB0aGUgc2VydmVyIGlmIGl0IHdhcyBhbHJlYWR5IHBlcnNpc3RlZC5cbiAgICAvLyBPcHRpbWlzdGljYWxseSByZW1vdmVzIHRoZSBtb2RlbCBmcm9tIGl0cyBjb2xsZWN0aW9uLCBpZiBpdCBoYXMgb25lLlxuICAgIC8vIElmIGB3YWl0OiB0cnVlYCBpcyBwYXNzZWQsIHdhaXRzIGZvciB0aGUgc2VydmVyIHRvIHJlc3BvbmQgYmVmb3JlIHJlbW92YWwuXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IF8uY2xvbmUob3B0aW9ucykgOiB7fTtcbiAgICB2YXIgbW9kZWwgPSB0aGlzO1xuICAgIHZhciBzdWNjZXNzID0gb3B0aW9ucy5zdWNjZXNzO1xuXG4gICAgdmFyIGRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgICAgIG1vZGVsLnN0b3BMaXN0ZW5pbmcoKTtcbiAgICAgIG1vZGVsLnRyaWdnZXIoJ2Rlc3Ryb3knLCBtb2RlbCwgbW9kZWwuY29sbGVjdGlvbiwgb3B0aW9ucyk7XG4gICAgfTtcblxuICAgIG9wdGlvbnMuc3VjY2VzcyA9IGZ1bmN0aW9uKHJlc3ApIHtcbiAgICAgIGlmIChvcHRpb25zLndhaXQgfHwgbW9kZWwuaXNOZXcoKSkgZGVzdHJveSgpO1xuICAgICAgaWYgKHN1Y2Nlc3MpIHN1Y2Nlc3MobW9kZWwsIHJlc3AsIG9wdGlvbnMpO1xuICAgICAgaWYgKCFtb2RlbC5pc05ldygpKSBtb2RlbC50cmlnZ2VyKCdzeW5jJywgbW9kZWwsIHJlc3AsIG9wdGlvbnMpO1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5pc05ldygpKSB7XG4gICAgICBvcHRpb25zLnN1Y2Nlc3MoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgd3JhcEVycm9yKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgdmFyIHhociA9IHRoaXMuc3luYygnZGVsZXRlJywgdGhpcywgb3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLndhaXQpIGRlc3Ryb3koKTtcbiAgICByZXR1cm4geGhyO1xuICB9LFxuXG4gICAgLy8gRGVmYXVsdCBVUkwgZm9yIHRoZSBtb2RlbCdzIHJlcHJlc2VudGF0aW9uIG9uIHRoZSBzZXJ2ZXIgLS0gaWYgeW91J3JlXG4gICAgLy8gdXNpbmcgQmFja2JvbmUncyByZXN0ZnVsIG1ldGhvZHMsIG92ZXJyaWRlIHRoaXMgdG8gY2hhbmdlIHRoZSBlbmRwb2ludFxuICAgIC8vIHRoYXQgd2lsbCBiZSBjYWxsZWQuXG4gIHVybDogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGJhc2UgPVxuICAgICAgXy5yZXN1bHQodGhpcywgJ3VybFJvb3QnKSB8fFxuICAgICAgXy5yZXN1bHQodGhpcy5jb2xsZWN0aW9uLCAndXJsJykgfHxcbiAgICAgIHVybEVycm9yKCk7XG4gICAgaWYgKHRoaXMuaXNOZXcoKSkgcmV0dXJuIGJhc2U7XG4gICAgcmV0dXJuIGJhc2UucmVwbGFjZSgvKFteXFwvXSkkLywgJyQxLycpICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuaWQpO1xuICB9LFxuXG4gICAgLy8gKipwYXJzZSoqIGNvbnZlcnRzIGEgcmVzcG9uc2UgaW50byB0aGUgaGFzaCBvZiBhdHRyaWJ1dGVzIHRvIGJlIGBzZXRgIG9uXG4gICAgLy8gdGhlIG1vZGVsLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IHRvIHBhc3MgdGhlIHJlc3BvbnNlIGFsb25nLlxuICBwYXJzZTogZnVuY3Rpb24ocmVzcCwgb3B0aW9ucykge1xuICAgIHJldHVybiByZXNwO1xuICB9LFxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IG1vZGVsIHdpdGggaWRlbnRpY2FsIGF0dHJpYnV0ZXMgdG8gdGhpcyBvbmUuXG4gIGNsb25lOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5hdHRyaWJ1dGVzKTtcbiAgfSxcblxuICAgIC8vIEEgbW9kZWwgaXMgbmV3IGlmIGl0IGhhcyBuZXZlciBiZWVuIHNhdmVkIHRvIHRoZSBzZXJ2ZXIsIGFuZCBsYWNrcyBhbiBpZC5cbiAgaXNOZXc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhdGhpcy5oYXModGhpcy5pZEF0dHJpYnV0ZSk7XG4gIH0sXG5cbiAgICAvLyBDaGVjayBpZiB0aGUgbW9kZWwgaXMgY3VycmVudGx5IGluIGEgdmFsaWQgc3RhdGUuXG4gIGlzVmFsaWQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGUoe30sIF8uZXh0ZW5kKG9wdGlvbnMgfHwge30sIHsgdmFsaWRhdGU6IHRydWUgfSkpO1xuICB9LFxuXG4gICAgLy8gUnVuIHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgbmV4dCBjb21wbGV0ZSBzZXQgb2YgbW9kZWwgYXR0cmlidXRlcyxcbiAgICAvLyByZXR1cm5pbmcgYHRydWVgIGlmIGFsbCBpcyB3ZWxsLiBPdGhlcndpc2UsIGZpcmUgYW4gYFwiaW52YWxpZFwiYCBldmVudC5cbiAgX3ZhbGlkYXRlOiBmdW5jdGlvbihhdHRycywgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy52YWxpZGF0ZSB8fCAhdGhpcy52YWxpZGF0ZSkgcmV0dXJuIHRydWU7XG4gICAgYXR0cnMgPSBfLmV4dGVuZCh7fSwgdGhpcy5hdHRyaWJ1dGVzLCBhdHRycyk7XG4gICAgdmFyIGVycm9yID0gdGhpcy52YWxpZGF0aW9uRXJyb3IgPSB0aGlzLnZhbGlkYXRlKGF0dHJzLCBvcHRpb25zKSB8fCBudWxsO1xuICAgIGlmICghZXJyb3IpIHJldHVybiB0cnVlO1xuICAgIHRoaXMudHJpZ2dlcignaW52YWxpZCcsIHRoaXMsIGVycm9yLCBfLmV4dGVuZChvcHRpb25zLCB7dmFsaWRhdGlvbkVycm9yOiBlcnJvcn0pKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxufSk7XG5cbi8vIFVuZGVyc2NvcmUgbWV0aG9kcyB0aGF0IHdlIHdhbnQgdG8gaW1wbGVtZW50IG9uIHRoZSBNb2RlbC5cbnZhciBtb2RlbE1ldGhvZHMgPSBbJ2tleXMnLCAndmFsdWVzJywgJ3BhaXJzJywgJ2ludmVydCcsICdwaWNrJywgJ29taXQnLCAnY2hhaW4nLCAnaXNFbXB0eSddO1xuXG4vLyBNaXggaW4gZWFjaCBVbmRlcnNjb3JlIG1ldGhvZCBhcyBhIHByb3h5IHRvIGBNb2RlbCNhdHRyaWJ1dGVzYC5cbl8uZWFjaChtb2RlbE1ldGhvZHMsIGZ1bmN0aW9uKG1ldGhvZCkge1xuICBpZiAoIV9bbWV0aG9kXSkgcmV0dXJuO1xuICBNb2RlbC5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIGFyZ3MudW5zaGlmdCh0aGlzLmF0dHJpYnV0ZXMpO1xuICAgIHJldHVybiBfW21ldGhvZF0uYXBwbHkoXywgYXJncyk7XG4gIH07XG59KTtcblxuLy8gc2V0dXAgaW5oZXJpdGFuY2Vcbk1vZGVsLmV4dGVuZCA9IGV4dGVuZDtcbm1vZHVsZS5leHBvcnRzID0gTW9kZWw7XG4iLCIvKipcbiAqIFN0YW5kYWxvbmUgZXh0cmFjdGlvbiBvZiBCYWNrYm9uZS5FdmVudHMsIG5vIGV4dGVybmFsIGRlcGVuZGVuY3kgcmVxdWlyZWQuXG4gKiBEZWdyYWRlcyBuaWNlbHkgd2hlbiBCYWNrb25lL3VuZGVyc2NvcmUgYXJlIGFscmVhZHkgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50XG4gKiBnbG9iYWwgY29udGV4dC5cbiAqXG4gKiBOb3RlIHRoYXQgZG9jcyBzdWdnZXN0IHRvIHVzZSB1bmRlcnNjb3JlJ3MgYF8uZXh0ZW5kKClgIG1ldGhvZCB0byBhZGQgRXZlbnRzXG4gKiBzdXBwb3J0IHRvIHNvbWUgZ2l2ZW4gb2JqZWN0LiBBIGBtaXhpbigpYCBtZXRob2QgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIEV2ZW50c1xuICogcHJvdG90eXBlIHRvIGF2b2lkIHVzaW5nIHVuZGVyc2NvcmUgZm9yIHRoYXQgc29sZSBwdXJwb3NlOlxuICpcbiAqICAgICB2YXIgbXlFdmVudEVtaXR0ZXIgPSBCYWNrYm9uZUV2ZW50cy5taXhpbih7fSk7XG4gKlxuICogT3IgZm9yIGEgZnVuY3Rpb24gY29uc3RydWN0b3I6XG4gKlxuICogICAgIGZ1bmN0aW9uIE15Q29uc3RydWN0b3IoKXt9XG4gKiAgICAgTXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUuZm9vID0gZnVuY3Rpb24oKXt9XG4gKiAgICAgQmFja2JvbmVFdmVudHMubWl4aW4oTXlDb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuICpcbiAqIChjKSAyMDA5LTIwMTMgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIEluYy5cbiAqIChjKSAyMDEzIE5pY29sYXMgUGVycmlhdWx0XG4gKi9cbi8qIGdsb2JhbCBleHBvcnRzOnRydWUsIGRlZmluZSwgbW9kdWxlICovXG4oZnVuY3Rpb24oKSB7XG4gIHZhciByb290ID0gdGhpcyxcbiAgICAgIGJyZWFrZXIgPSB7fSxcbiAgICAgIG5hdGl2ZUZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCxcbiAgICAgIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLFxuICAgICAgaWRDb3VudGVyID0gMDtcblxuICAvLyBSZXR1cm5zIGEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBtYXRjaGluZyB0aGUgbWluaW1hbCBBUEkgc3Vic2V0IHJlcXVpcmVkXG4gIC8vIGJ5IEJhY2tib25lLkV2ZW50c1xuICBmdW5jdGlvbiBtaW5pc2NvcmUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleXM6IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJrZXlzKCkgY2FsbGVkIG9uIGEgbm9uLW9iamVjdFwiKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIga2V5LCBrZXlzID0gW107XG4gICAgICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAga2V5c1trZXlzLmxlbmd0aF0gPSBrZXk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgfSxcblxuICAgICAgdW5pcXVlSWQ6IGZ1bmN0aW9uKHByZWZpeCkge1xuICAgICAgICB2YXIgaWQgPSArK2lkQ291bnRlciArICcnO1xuICAgICAgICByZXR1cm4gcHJlZml4ID8gcHJlZml4ICsgaWQgOiBpZDtcbiAgICAgIH0sXG5cbiAgICAgIGhhczogZnVuY3Rpb24ob2JqLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xuICAgICAgfSxcblxuICAgICAgZWFjaDogZnVuY3Rpb24ob2JqLCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKG5hdGl2ZUZvckVhY2ggJiYgb2JqLmZvckVhY2ggPT09IG5hdGl2ZUZvckVhY2gpIHtcbiAgICAgICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAob2JqLmxlbmd0aCA9PT0gK29iai5sZW5ndGgpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtpXSwgaSwgb2JqKSA9PT0gYnJlYWtlcikgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXMob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtrZXldLCBrZXksIG9iaikgPT09IGJyZWFrZXIpIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIG9uY2U6IGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAgICAgdmFyIHJhbiA9IGZhbHNlLCBtZW1vO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKHJhbikgcmV0dXJuIG1lbW87XG4gICAgICAgICAgcmFuID0gdHJ1ZTtcbiAgICAgICAgICBtZW1vID0gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgIGZ1bmMgPSBudWxsO1xuICAgICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICB2YXIgXyA9IG1pbmlzY29yZSgpLCBFdmVudHM7XG5cbiAgLy8gQmFja2JvbmUuRXZlbnRzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEEgbW9kdWxlIHRoYXQgY2FuIGJlIG1peGVkIGluIHRvICphbnkgb2JqZWN0KiBpbiBvcmRlciB0byBwcm92aWRlIGl0IHdpdGhcbiAgLy8gY3VzdG9tIGV2ZW50cy4gWW91IG1heSBiaW5kIHdpdGggYG9uYCBvciByZW1vdmUgd2l0aCBgb2ZmYCBjYWxsYmFja1xuICAvLyBmdW5jdGlvbnMgdG8gYW4gZXZlbnQ7IGB0cmlnZ2VyYC1pbmcgYW4gZXZlbnQgZmlyZXMgYWxsIGNhbGxiYWNrcyBpblxuICAvLyBzdWNjZXNzaW9uLlxuICAvL1xuICAvLyAgICAgdmFyIG9iamVjdCA9IHt9O1xuICAvLyAgICAgXy5leHRlbmQob2JqZWN0LCBCYWNrYm9uZS5FdmVudHMpO1xuICAvLyAgICAgb2JqZWN0Lm9uKCdleHBhbmQnLCBmdW5jdGlvbigpeyBhbGVydCgnZXhwYW5kZWQnKTsgfSk7XG4gIC8vICAgICBvYmplY3QudHJpZ2dlcignZXhwYW5kJyk7XG4gIC8vXG4gIEV2ZW50cyA9IHtcblxuICAgIC8vIEJpbmQgYW4gZXZlbnQgdG8gYSBgY2FsbGJhY2tgIGZ1bmN0aW9uLiBQYXNzaW5nIGBcImFsbFwiYCB3aWxsIGJpbmRcbiAgICAvLyB0aGUgY2FsbGJhY2sgdG8gYWxsIGV2ZW50cyBmaXJlZC5cbiAgICBvbjogZnVuY3Rpb24obmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgIGlmICghZXZlbnRzQXBpKHRoaXMsICdvbicsIG5hbWUsIFtjYWxsYmFjaywgY29udGV4dF0pIHx8ICFjYWxsYmFjaykgcmV0dXJuIHRoaXM7XG4gICAgICB0aGlzLl9ldmVudHMgfHwgKHRoaXMuX2V2ZW50cyA9IHt9KTtcbiAgICAgIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHNbbmFtZV0gfHwgKHRoaXMuX2V2ZW50c1tuYW1lXSA9IFtdKTtcbiAgICAgIGV2ZW50cy5wdXNoKHtjYWxsYmFjazogY2FsbGJhY2ssIGNvbnRleHQ6IGNvbnRleHQsIGN0eDogY29udGV4dCB8fCB0aGlzfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLy8gQmluZCBhbiBldmVudCB0byBvbmx5IGJlIHRyaWdnZXJlZCBhIHNpbmdsZSB0aW1lLiBBZnRlciB0aGUgZmlyc3QgdGltZVxuICAgIC8vIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLCBpdCB3aWxsIGJlIHJlbW92ZWQuXG4gICAgb25jZTogZnVuY3Rpb24obmFtZSwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgIGlmICghZXZlbnRzQXBpKHRoaXMsICdvbmNlJywgbmFtZSwgW2NhbGxiYWNrLCBjb250ZXh0XSkgfHwgIWNhbGxiYWNrKSByZXR1cm4gdGhpcztcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBvbmNlID0gXy5vbmNlKGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9mZihuYW1lLCBvbmNlKTtcbiAgICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0pO1xuICAgICAgb25jZS5fY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgIHJldHVybiB0aGlzLm9uKG5hbWUsIG9uY2UsIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICAvLyBSZW1vdmUgb25lIG9yIG1hbnkgY2FsbGJhY2tzLiBJZiBgY29udGV4dGAgaXMgbnVsbCwgcmVtb3ZlcyBhbGxcbiAgICAvLyBjYWxsYmFja3Mgd2l0aCB0aGF0IGZ1bmN0aW9uLiBJZiBgY2FsbGJhY2tgIGlzIG51bGwsIHJlbW92ZXMgYWxsXG4gICAgLy8gY2FsbGJhY2tzIGZvciB0aGUgZXZlbnQuIElmIGBuYW1lYCBpcyBudWxsLCByZW1vdmVzIGFsbCBib3VuZFxuICAgIC8vIGNhbGxiYWNrcyBmb3IgYWxsIGV2ZW50cy5cbiAgICBvZmY6IGZ1bmN0aW9uKG5hbWUsIGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgICB2YXIgcmV0YWluLCBldiwgZXZlbnRzLCBuYW1lcywgaSwgbCwgaiwgaztcbiAgICAgIGlmICghdGhpcy5fZXZlbnRzIHx8ICFldmVudHNBcGkodGhpcywgJ29mZicsIG5hbWUsIFtjYWxsYmFjaywgY29udGV4dF0pKSByZXR1cm4gdGhpcztcbiAgICAgIGlmICghbmFtZSAmJiAhY2FsbGJhY2sgJiYgIWNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBuYW1lcyA9IG5hbWUgPyBbbmFtZV0gOiBfLmtleXModGhpcy5fZXZlbnRzKTtcbiAgICAgIGZvciAoaSA9IDAsIGwgPSBuYW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgbmFtZSA9IG5hbWVzW2ldO1xuICAgICAgICBpZiAoZXZlbnRzID0gdGhpcy5fZXZlbnRzW25hbWVdKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzW25hbWVdID0gcmV0YWluID0gW107XG4gICAgICAgICAgaWYgKGNhbGxiYWNrIHx8IGNvbnRleHQpIHtcbiAgICAgICAgICAgIGZvciAoaiA9IDAsIGsgPSBldmVudHMubGVuZ3RoOyBqIDwgazsgaisrKSB7XG4gICAgICAgICAgICAgIGV2ID0gZXZlbnRzW2pdO1xuICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrICYmIGNhbGxiYWNrICE9PSBldi5jYWxsYmFjayAmJiBjYWxsYmFjayAhPT0gZXYuY2FsbGJhY2suX2NhbGxiYWNrKSB8fFxuICAgICAgICAgICAgICAgICAgKGNvbnRleHQgJiYgY29udGV4dCAhPT0gZXYuY29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICByZXRhaW4ucHVzaChldik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFyZXRhaW4ubGVuZ3RoKSBkZWxldGUgdGhpcy5fZXZlbnRzW25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvLyBUcmlnZ2VyIG9uZSBvciBtYW55IGV2ZW50cywgZmlyaW5nIGFsbCBib3VuZCBjYWxsYmFja3MuIENhbGxiYWNrcyBhcmVcbiAgICAvLyBwYXNzZWQgdGhlIHNhbWUgYXJndW1lbnRzIGFzIGB0cmlnZ2VyYCBpcywgYXBhcnQgZnJvbSB0aGUgZXZlbnQgbmFtZVxuICAgIC8vICh1bmxlc3MgeW91J3JlIGxpc3RlbmluZyBvbiBgXCJhbGxcImAsIHdoaWNoIHdpbGwgY2F1c2UgeW91ciBjYWxsYmFjayB0b1xuICAgIC8vIHJlY2VpdmUgdGhlIHRydWUgbmFtZSBvZiB0aGUgZXZlbnQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50KS5cbiAgICB0cmlnZ2VyOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgICBpZiAoIXRoaXMuX2V2ZW50cykgcmV0dXJuIHRoaXM7XG4gICAgICB2YXIgYXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgIGlmICghZXZlbnRzQXBpKHRoaXMsICd0cmlnZ2VyJywgbmFtZSwgYXJncykpIHJldHVybiB0aGlzO1xuICAgICAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50c1tuYW1lXTtcbiAgICAgIHZhciBhbGxFdmVudHMgPSB0aGlzLl9ldmVudHMuYWxsO1xuICAgICAgaWYgKGV2ZW50cykgdHJpZ2dlckV2ZW50cyhldmVudHMsIGFyZ3MpO1xuICAgICAgaWYgKGFsbEV2ZW50cykgdHJpZ2dlckV2ZW50cyhhbGxFdmVudHMsIGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgLy8gVGVsbCB0aGlzIG9iamVjdCB0byBzdG9wIGxpc3RlbmluZyB0byBlaXRoZXIgc3BlY2lmaWMgZXZlbnRzIC4uLiBvclxuICAgIC8vIHRvIGV2ZXJ5IG9iamVjdCBpdCdzIGN1cnJlbnRseSBsaXN0ZW5pbmcgdG8uXG4gICAgc3RvcExpc3RlbmluZzogZnVuY3Rpb24ob2JqLCBuYW1lLCBjYWxsYmFjaykge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcbiAgICAgIGlmICghbGlzdGVuZXJzKSByZXR1cm4gdGhpcztcbiAgICAgIHZhciBkZWxldGVMaXN0ZW5lciA9ICFuYW1lICYmICFjYWxsYmFjaztcbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIGNhbGxiYWNrID0gdGhpcztcbiAgICAgIGlmIChvYmopIChsaXN0ZW5lcnMgPSB7fSlbb2JqLl9saXN0ZW5lcklkXSA9IG9iajtcbiAgICAgIGZvciAodmFyIGlkIGluIGxpc3RlbmVycykge1xuICAgICAgICBsaXN0ZW5lcnNbaWRdLm9mZihuYW1lLCBjYWxsYmFjaywgdGhpcyk7XG4gICAgICAgIGlmIChkZWxldGVMaXN0ZW5lcikgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1tpZF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgfTtcblxuICAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byBzcGxpdCBldmVudCBzdHJpbmdzLlxuICB2YXIgZXZlbnRTcGxpdHRlciA9IC9cXHMrLztcblxuICAvLyBJbXBsZW1lbnQgZmFuY3kgZmVhdHVyZXMgb2YgdGhlIEV2ZW50cyBBUEkgc3VjaCBhcyBtdWx0aXBsZSBldmVudFxuICAvLyBuYW1lcyBgXCJjaGFuZ2UgYmx1clwiYCBhbmQgalF1ZXJ5LXN0eWxlIGV2ZW50IG1hcHMgYHtjaGFuZ2U6IGFjdGlvbn1gXG4gIC8vIGluIHRlcm1zIG9mIHRoZSBleGlzdGluZyBBUEkuXG4gIHZhciBldmVudHNBcGkgPSBmdW5jdGlvbihvYmosIGFjdGlvbiwgbmFtZSwgcmVzdCkge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBIYW5kbGUgZXZlbnQgbWFwcy5cbiAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gbmFtZSkge1xuICAgICAgICBvYmpbYWN0aW9uXS5hcHBseShvYmosIFtrZXksIG5hbWVba2V5XV0uY29uY2F0KHJlc3QpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BhY2Ugc2VwYXJhdGVkIGV2ZW50IG5hbWVzLlxuICAgIGlmIChldmVudFNwbGl0dGVyLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBuYW1lcyA9IG5hbWUuc3BsaXQoZXZlbnRTcGxpdHRlcik7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG5hbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBvYmpbYWN0aW9uXS5hcHBseShvYmosIFtuYW1lc1tpXV0uY29uY2F0KHJlc3QpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvLyBBIGRpZmZpY3VsdC10by1iZWxpZXZlLCBidXQgb3B0aW1pemVkIGludGVybmFsIGRpc3BhdGNoIGZ1bmN0aW9uIGZvclxuICAvLyB0cmlnZ2VyaW5nIGV2ZW50cy4gVHJpZXMgdG8ga2VlcCB0aGUgdXN1YWwgY2FzZXMgc3BlZWR5IChtb3N0IGludGVybmFsXG4gIC8vIEJhY2tib25lIGV2ZW50cyBoYXZlIDMgYXJndW1lbnRzKS5cbiAgdmFyIHRyaWdnZXJFdmVudHMgPSBmdW5jdGlvbihldmVudHMsIGFyZ3MpIHtcbiAgICB2YXIgZXYsIGkgPSAtMSwgbCA9IGV2ZW50cy5sZW5ndGgsIGExID0gYXJnc1swXSwgYTIgPSBhcmdzWzFdLCBhMyA9IGFyZ3NbMl07XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiB3aGlsZSAoKytpIDwgbCkgKGV2ID0gZXZlbnRzW2ldKS5jYWxsYmFjay5jYWxsKGV2LmN0eCk7IHJldHVybjtcbiAgICAgIGNhc2UgMTogd2hpbGUgKCsraSA8IGwpIChldiA9IGV2ZW50c1tpXSkuY2FsbGJhY2suY2FsbChldi5jdHgsIGExKTsgcmV0dXJuO1xuICAgICAgY2FzZSAyOiB3aGlsZSAoKytpIDwgbCkgKGV2ID0gZXZlbnRzW2ldKS5jYWxsYmFjay5jYWxsKGV2LmN0eCwgYTEsIGEyKTsgcmV0dXJuO1xuICAgICAgY2FzZSAzOiB3aGlsZSAoKytpIDwgbCkgKGV2ID0gZXZlbnRzW2ldKS5jYWxsYmFjay5jYWxsKGV2LmN0eCwgYTEsIGEyLCBhMyk7IHJldHVybjtcbiAgICAgIGRlZmF1bHQ6IHdoaWxlICgrK2kgPCBsKSAoZXYgPSBldmVudHNbaV0pLmNhbGxiYWNrLmFwcGx5KGV2LmN0eCwgYXJncyk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBsaXN0ZW5NZXRob2RzID0ge2xpc3RlblRvOiAnb24nLCBsaXN0ZW5Ub09uY2U6ICdvbmNlJ307XG5cbiAgLy8gSW52ZXJzaW9uLW9mLWNvbnRyb2wgdmVyc2lvbnMgb2YgYG9uYCBhbmQgYG9uY2VgLiBUZWxsICp0aGlzKiBvYmplY3QgdG9cbiAgLy8gbGlzdGVuIHRvIGFuIGV2ZW50IGluIGFub3RoZXIgb2JqZWN0IC4uLiBrZWVwaW5nIHRyYWNrIG9mIHdoYXQgaXQnc1xuICAvLyBsaXN0ZW5pbmcgdG8uXG4gIF8uZWFjaChsaXN0ZW5NZXRob2RzLCBmdW5jdGlvbihpbXBsZW1lbnRhdGlvbiwgbWV0aG9kKSB7XG4gICAgRXZlbnRzW21ldGhvZF0gPSBmdW5jdGlvbihvYmosIG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzIHx8ICh0aGlzLl9saXN0ZW5lcnMgPSB7fSk7XG4gICAgICB2YXIgaWQgPSBvYmouX2xpc3RlbmVySWQgfHwgKG9iai5fbGlzdGVuZXJJZCA9IF8udW5pcXVlSWQoJ2wnKSk7XG4gICAgICBsaXN0ZW5lcnNbaWRdID0gb2JqO1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnb2JqZWN0JykgY2FsbGJhY2sgPSB0aGlzO1xuICAgICAgb2JqW2ltcGxlbWVudGF0aW9uXShuYW1lLCBjYWxsYmFjaywgdGhpcyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9KTtcblxuICAvLyBBbGlhc2VzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgRXZlbnRzLmJpbmQgICA9IEV2ZW50cy5vbjtcbiAgRXZlbnRzLnVuYmluZCA9IEV2ZW50cy5vZmY7XG5cbiAgLy8gTWl4aW4gdXRpbGl0eVxuICBFdmVudHMubWl4aW4gPSBmdW5jdGlvbihwcm90bykge1xuICAgIHZhciBleHBvcnRzID0gWydvbicsICdvbmNlJywgJ29mZicsICd0cmlnZ2VyJywgJ3N0b3BMaXN0ZW5pbmcnLCAnbGlzdGVuVG8nLFxuICAgICAgICAgICAgICAgICAgICdsaXN0ZW5Ub09uY2UnLCAnYmluZCcsICd1bmJpbmQnXTtcbiAgICBfLmVhY2goZXhwb3J0cywgZnVuY3Rpb24obmFtZSkge1xuICAgICAgcHJvdG9bbmFtZV0gPSB0aGlzW25hbWVdO1xuICAgIH0sIHRoaXMpO1xuICAgIHJldHVybiBwcm90bztcbiAgfTtcblxuICAvLyBFeHBvcnQgRXZlbnRzIGFzIEJhY2tib25lRXZlbnRzIGRlcGVuZGluZyBvbiBjdXJyZW50IGNvbnRleHRcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGRlZmluZShmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBFdmVudHM7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBFdmVudHM7XG4gICAgfVxuICAgIGV4cG9ydHMuQmFja2JvbmVFdmVudHMgPSBFdmVudHM7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5CYWNrYm9uZUV2ZW50cyA9IEV2ZW50cztcbiAgfVxufSkodGhpcyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmUnKTtcbiIsIihmdW5jdGlvbiAoZGVmaW5pdGlvbikge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb24oKTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoZGVmaW5pdGlvbik7XG4gIH1cbiAgZWxzZSB7XG4gICAgd2luZG93LkJhY2tib25lRXh0ZW5kID0gZGVmaW5pdGlvbigpO1xuICB9XG59KShmdW5jdGlvbiAoKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuICBcbiAgLy8gbWluaS11bmRlcnNjb3JlXG4gIHZhciBfID0ge1xuICAgIGhhczogZnVuY3Rpb24gKG9iaiwga2V5KSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbiAgICB9LFxuICBcbiAgICBleHRlbmQ6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgZm9yICh2YXIgaT0xOyBpPGFyZ3VtZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIG9ialtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICB9O1xuXG4gIC8vLyBGb2xsb3dpbmcgY29kZSBpcyBwYXN0ZWQgZnJvbSBCYWNrYm9uZS5qcyAvLy9cblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY29ycmVjdGx5IHNldCB1cCB0aGUgcHJvdG90eXBlIGNoYWluLCBmb3Igc3ViY2xhc3Nlcy5cbiAgLy8gU2ltaWxhciB0byBgZ29vZy5pbmhlcml0c2AsIGJ1dCB1c2VzIGEgaGFzaCBvZiBwcm90b3R5cGUgcHJvcGVydGllcyBhbmRcbiAgLy8gY2xhc3MgcHJvcGVydGllcyB0byBiZSBleHRlbmRlZC5cbiAgdmFyIGV4dGVuZCA9IGZ1bmN0aW9uKHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXM7XG4gICAgdmFyIGNoaWxkO1xuXG4gICAgLy8gVGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciB0aGUgbmV3IHN1YmNsYXNzIGlzIGVpdGhlciBkZWZpbmVkIGJ5IHlvdVxuICAgIC8vICh0aGUgXCJjb25zdHJ1Y3RvclwiIHByb3BlcnR5IGluIHlvdXIgYGV4dGVuZGAgZGVmaW5pdGlvbiksIG9yIGRlZmF1bHRlZFxuICAgIC8vIGJ5IHVzIHRvIHNpbXBseSBjYWxsIHRoZSBwYXJlbnQncyBjb25zdHJ1Y3Rvci5cbiAgICBpZiAocHJvdG9Qcm9wcyAmJiBfLmhhcyhwcm90b1Byb3BzLCAnY29uc3RydWN0b3InKSkge1xuICAgICAgY2hpbGQgPSBwcm90b1Byb3BzLmNvbnN0cnVjdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZCA9IGZ1bmN0aW9uKCl7IHJldHVybiBwYXJlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc3RhdGljIHByb3BlcnRpZXMgdG8gdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCBpZiBzdXBwbGllZC5cbiAgICBfLmV4dGVuZChjaGlsZCwgcGFyZW50LCBzdGF0aWNQcm9wcyk7XG5cbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBjaGFpbiB0byBpbmhlcml0IGZyb20gYHBhcmVudGAsIHdpdGhvdXQgY2FsbGluZ1xuICAgIC8vIGBwYXJlbnRgJ3MgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gICAgdmFyIFN1cnJvZ2F0ZSA9IGZ1bmN0aW9uKCl7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfTtcbiAgICBTdXJyb2dhdGUucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTtcbiAgICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgU3Vycm9nYXRlKCk7XG5cbiAgICAvLyBBZGQgcHJvdG90eXBlIHByb3BlcnRpZXMgKGluc3RhbmNlIHByb3BlcnRpZXMpIHRvIHRoZSBzdWJjbGFzcyxcbiAgICAvLyBpZiBzdXBwbGllZC5cbiAgICBpZiAocHJvdG9Qcm9wcykgXy5leHRlbmQoY2hpbGQucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcblxuICAgIC8vIFNldCBhIGNvbnZlbmllbmNlIHByb3BlcnR5IGluIGNhc2UgdGhlIHBhcmVudCdzIHByb3RvdHlwZSBpcyBuZWVkZWRcbiAgICAvLyBsYXRlci5cbiAgICBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlO1xuXG4gICAgcmV0dXJuIGNoaWxkO1xuICB9O1xuXG4gIC8vIEV4cG9zZSB0aGUgZXh0ZW5kIGZ1bmN0aW9uXG4gIHJldHVybiBleHRlbmQ7XG59KTtcbiIsIi8vIHRoaXMgaXMgdGhlIGV4dHJhY3RlZCB2aWV3IG1vZGVsIGZyb20gYmFja2JvbmVcbi8vIG5vdGUgdGhhdCB3ZSBpbmplY3QgamJvbmUgYXMganF1ZXJ5IHJlcGxhY21lbnRcbi8vIChhbmQgdW5kZXJzY29yZSBkaXJlY3RseSlcbi8vXG4vLyBWaWV3cyBhcmUgYWxtb3N0IG1vcmUgY29udmVudGlvbiB0aGFuIHRoZXkgYXJlIGFjdHVhbCBjb2RlLlxuLy8gIE1WQyBwYXR0ZXJuXG4vLyBCYWNrYm9uZS5WaWV3XG4vLyAtLS0tLS0tLS0tLS0tXG5cbnZhciBfID0gcmVxdWlyZShcInVuZGVyc2NvcmVcIik7XG52YXIgRXZlbnRzID0gcmVxdWlyZShcImJhY2tib25lLWV2ZW50cy1zdGFuZGFsb25lXCIpO1xudmFyIGV4dGVuZCA9IHJlcXVpcmUoXCJiYWNrYm9uZS1leHRlbmQtc3RhbmRhbG9uZVwiKTtcbnZhciAkID0gcmVxdWlyZSgnamJvbmUnKTtcblxuLy8gQmFja2JvbmUgVmlld3MgYXJlIGFsbW9zdCBtb3JlIGNvbnZlbnRpb24gdGhhbiB0aGV5IGFyZSBhY3R1YWwgY29kZS4gQSBWaWV3XG4vLyBpcyBzaW1wbHkgYSBKYXZhU2NyaXB0IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSBsb2dpY2FsIGNodW5rIG9mIFVJIGluIHRoZVxuLy8gRE9NLiBUaGlzIG1pZ2h0IGJlIGEgc2luZ2xlIGl0ZW0sIGFuIGVudGlyZSBsaXN0LCBhIHNpZGViYXIgb3IgcGFuZWwsIG9yXG4vLyBldmVuIHRoZSBzdXJyb3VuZGluZyBmcmFtZSB3aGljaCB3cmFwcyB5b3VyIHdob2xlIGFwcC4gRGVmaW5pbmcgYSBjaHVuayBvZlxuLy8gVUkgYXMgYSAqKlZpZXcqKiBhbGxvd3MgeW91IHRvIGRlZmluZSB5b3VyIERPTSBldmVudHMgZGVjbGFyYXRpdmVseSwgd2l0aG91dFxuLy8gaGF2aW5nIHRvIHdvcnJ5IGFib3V0IHJlbmRlciBvcmRlciAuLi4gYW5kIG1ha2VzIGl0IGVhc3kgZm9yIHRoZSB2aWV3IHRvXG4vLyByZWFjdCB0byBzcGVjaWZpYyBjaGFuZ2VzIGluIHRoZSBzdGF0ZSBvZiB5b3VyIG1vZGVscy5cblxuLy8gQ3JlYXRpbmcgYSBCYWNrYm9uZS5WaWV3IGNyZWF0ZXMgaXRzIGluaXRpYWwgZWxlbWVudCBvdXRzaWRlIG9mIHRoZSBET00sXG4vLyBpZiBhbiBleGlzdGluZyBlbGVtZW50IGlzIG5vdCBwcm92aWRlZC4uLlxudmFyIFZpZXcgPSAgZnVuY3Rpb24ob3B0aW9ucykge1xuICB0aGlzLmNpZCA9IF8udW5pcXVlSWQoJ3ZpZXcnKTtcbiAgb3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcbiAgXy5leHRlbmQodGhpcywgXy5waWNrKG9wdGlvbnMsIHZpZXdPcHRpb25zKSk7XG4gIHRoaXMuX2Vuc3VyZUVsZW1lbnQoKTtcbiAgdGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG4vLyBDYWNoZWQgcmVnZXggdG8gc3BsaXQga2V5cyBmb3IgYGRlbGVnYXRlYC5cbnZhciBkZWxlZ2F0ZUV2ZW50U3BsaXR0ZXIgPSAvXihcXFMrKVxccyooLiopJC87XG5cbi8vIExpc3Qgb2YgdmlldyBvcHRpb25zIHRvIGJlIG1lcmdlZCBhcyBwcm9wZXJ0aWVzLlxudmFyIHZpZXdPcHRpb25zID0gWydtb2RlbCcsICdjb2xsZWN0aW9uJywgJ2VsJywgJ2lkJywgJ2F0dHJpYnV0ZXMnLCAnY2xhc3NOYW1lJywgJ3RhZ05hbWUnLCAnZXZlbnRzJ107XG5cbi8vIFNldCB1cCBhbGwgaW5oZXJpdGFibGUgKipCYWNrYm9uZS5WaWV3KiogcHJvcGVydGllcyBhbmQgbWV0aG9kcy5cbl8uZXh0ZW5kKFZpZXcucHJvdG90eXBlLCBFdmVudHMsIHtcblxuICAvLyBUaGUgZGVmYXVsdCBgdGFnTmFtZWAgb2YgYSBWaWV3J3MgZWxlbWVudCBpcyBgXCJkaXZcImAuXG4gIHRhZ05hbWU6ICdkaXYnLFxuXG4gIC8vIGpRdWVyeSBkZWxlZ2F0ZSBmb3IgZWxlbWVudCBsb29rdXAsIHNjb3BlZCB0byBET00gZWxlbWVudHMgd2l0aGluIHRoZVxuICAvLyBjdXJyZW50IHZpZXcuIFRoaXMgc2hvdWxkIGJlIHByZWZlcnJlZCB0byBnbG9iYWwgbG9va3VwcyB3aGVyZSBwb3NzaWJsZS5cbiAgJDogZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy4kZWwuZmluZChzZWxlY3Rvcik7XG4gIH0sXG5cbiAgICAvLyBJbml0aWFsaXplIGlzIGFuIGVtcHR5IGZ1bmN0aW9uIGJ5IGRlZmF1bHQuIE92ZXJyaWRlIGl0IHdpdGggeW91ciBvd25cbiAgICAvLyBpbml0aWFsaXphdGlvbiBsb2dpYy5cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oKXt9LFxuXG4gICAgLy8gKipyZW5kZXIqKiBpcyB0aGUgY29yZSBmdW5jdGlvbiB0aGF0IHlvdXIgdmlldyBzaG91bGQgb3ZlcnJpZGUsIGluIG9yZGVyXG4gICAgLy8gdG8gcG9wdWxhdGUgaXRzIGVsZW1lbnQgKGB0aGlzLmVsYCksIHdpdGggdGhlIGFwcHJvcHJpYXRlIEhUTUwuIFRoZVxuICAgIC8vIGNvbnZlbnRpb24gaXMgZm9yICoqcmVuZGVyKiogdG8gYWx3YXlzIHJldHVybiBgdGhpc2AuXG4gIHJlbmRlcjogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgICAvLyBSZW1vdmUgdGhpcyB2aWV3IGJ5IHRha2luZyB0aGUgZWxlbWVudCBvdXQgb2YgdGhlIERPTSwgYW5kIHJlbW92aW5nIGFueVxuICAgIC8vIGFwcGxpY2FibGUgQmFja2JvbmUuRXZlbnRzIGxpc3RlbmVycy5cbiAgcmVtb3ZlOiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLl9yZW1vdmVFbGVtZW50KCk7XG4gICAgdGhpcy5zdG9wTGlzdGVuaW5nKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgICAvLyBSZW1vdmUgdGhpcyB2aWV3J3MgZWxlbWVudCBmcm9tIHRoZSBkb2N1bWVudCBhbmQgYWxsIGV2ZW50IGxpc3RlbmVyc1xuICAgIC8vIGF0dGFjaGVkIHRvIGl0LiBFeHBvc2VkIGZvciBzdWJjbGFzc2VzIHVzaW5nIGFuIGFsdGVybmF0aXZlIERPTVxuICAgIC8vIG1hbmlwdWxhdGlvbiBBUEkuXG4gIF9yZW1vdmVFbGVtZW50OiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLiRlbC5yZW1vdmUoKTtcbiAgfSxcblxuICAgIC8vIENoYW5nZSB0aGUgdmlldydzIGVsZW1lbnQgKGB0aGlzLmVsYCBwcm9wZXJ0eSkgYW5kIHJlLWRlbGVnYXRlIHRoZVxuICAgIC8vIHZpZXcncyBldmVudHMgb24gdGhlIG5ldyBlbGVtZW50LlxuICBzZXRFbGVtZW50OiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgdGhpcy51bmRlbGVnYXRlRXZlbnRzKCk7XG4gICAgdGhpcy5fc2V0RWxlbWVudChlbGVtZW50KTtcbiAgICB0aGlzLmRlbGVnYXRlRXZlbnRzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgICAvLyBDcmVhdGVzIHRoZSBgdGhpcy5lbGAgYW5kIGB0aGlzLiRlbGAgcmVmZXJlbmNlcyBmb3IgdGhpcyB2aWV3IHVzaW5nIHRoZVxuICAgIC8vIGdpdmVuIGBlbGAuIGBlbGAgY2FuIGJlIGEgQ1NTIHNlbGVjdG9yIG9yIGFuIEhUTUwgc3RyaW5nLCBhIGpRdWVyeVxuICAgIC8vIGNvbnRleHQgb3IgYW4gZWxlbWVudC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byB1dGlsaXplIGFuXG4gICAgLy8gYWx0ZXJuYXRpdmUgRE9NIG1hbmlwdWxhdGlvbiBBUEkgYW5kIGFyZSBvbmx5IHJlcXVpcmVkIHRvIHNldCB0aGVcbiAgICAvLyBgdGhpcy5lbGAgcHJvcGVydHkuXG4gIF9zZXRFbGVtZW50OiBmdW5jdGlvbihlbCkge1xuICAgIHRoaXMuJGVsID0gZWwgaW5zdGFuY2VvZiAkID8gZWwgOiAkKGVsKTtcbiAgICB0aGlzLmVsID0gdGhpcy4kZWxbMF07XG4gIH0sXG5cbiAgICAvLyBTZXQgY2FsbGJhY2tzLCB3aGVyZSBgdGhpcy5ldmVudHNgIGlzIGEgaGFzaCBvZlxuICAgIC8vXG4gICAgLy8gKntcImV2ZW50IHNlbGVjdG9yXCI6IFwiY2FsbGJhY2tcIn0qXG4gICAgLy9cbiAgICAvLyAgICAge1xuICAgIC8vICAgICAgICdtb3VzZWRvd24gLnRpdGxlJzogICdlZGl0JyxcbiAgICAvLyAgICAgICAnY2xpY2sgLmJ1dHRvbic6ICAgICAnc2F2ZScsXG4gICAgLy8gICAgICAgJ2NsaWNrIC5vcGVuJzogICAgICAgZnVuY3Rpb24oZSkgeyAuLi4gfVxuICAgIC8vICAgICB9XG4gICAgLy9cbiAgICAvLyBwYWlycy4gQ2FsbGJhY2tzIHdpbGwgYmUgYm91bmQgdG8gdGhlIHZpZXcsIHdpdGggYHRoaXNgIHNldCBwcm9wZXJseS5cbiAgICAvLyBVc2VzIGV2ZW50IGRlbGVnYXRpb24gZm9yIGVmZmljaWVuY3kuXG4gICAgLy8gT21pdHRpbmcgdGhlIHNlbGVjdG9yIGJpbmRzIHRoZSBldmVudCB0byBgdGhpcy5lbGAuXG4gIGRlbGVnYXRlRXZlbnRzOiBmdW5jdGlvbihldmVudHMpIHtcbiAgICBpZiAoIShldmVudHMgfHwgKGV2ZW50cyA9IF8ucmVzdWx0KHRoaXMsICdldmVudHMnKSkpKSByZXR1cm4gdGhpcztcbiAgICB0aGlzLnVuZGVsZWdhdGVFdmVudHMoKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gZXZlbnRzKSB7XG4gICAgICB2YXIgbWV0aG9kID0gZXZlbnRzW2tleV07XG4gICAgICBpZiAoIV8uaXNGdW5jdGlvbihtZXRob2QpKSBtZXRob2QgPSB0aGlzW2V2ZW50c1trZXldXTtcbiAgICAgIGlmICghbWV0aG9kKSBjb250aW51ZTtcbiAgICAgIHZhciBtYXRjaCA9IGtleS5tYXRjaChkZWxlZ2F0ZUV2ZW50U3BsaXR0ZXIpO1xuICAgICAgdGhpcy5kZWxlZ2F0ZShtYXRjaFsxXSwgbWF0Y2hbMl0sIF8uYmluZChtZXRob2QsIHRoaXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgICAvLyBBZGQgYSBzaW5nbGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIHZpZXcncyBlbGVtZW50IChvciBhIGNoaWxkIGVsZW1lbnRcbiAgICAvLyB1c2luZyBgc2VsZWN0b3JgKS4gVGhpcyBvbmx5IHdvcmtzIGZvciBkZWxlZ2F0ZS1hYmxlIGV2ZW50czogbm90IGBmb2N1c2AsXG4gICAgLy8gYGJsdXJgLCBhbmQgbm90IGBjaGFuZ2VgLCBgc3VibWl0YCwgYW5kIGByZXNldGAgaW4gSW50ZXJuZXQgRXhwbG9yZXIuXG4gIGRlbGVnYXRlOiBmdW5jdGlvbihldmVudE5hbWUsIHNlbGVjdG9yLCBsaXN0ZW5lcikge1xuICAgIHRoaXMuJGVsLm9uKGV2ZW50TmFtZSArICcuZGVsZWdhdGVFdmVudHMnICsgdGhpcy5jaWQsIHNlbGVjdG9yLCBsaXN0ZW5lcik7XG4gIH0sXG5cbiAgICAvLyBDbGVhcnMgYWxsIGNhbGxiYWNrcyBwcmV2aW91c2x5IGJvdW5kIHRvIHRoZSB2aWV3IGJ5IGBkZWxlZ2F0ZUV2ZW50c2AuXG4gICAgLy8gWW91IHVzdWFsbHkgZG9uJ3QgbmVlZCB0byB1c2UgdGhpcywgYnV0IG1heSB3aXNoIHRvIGlmIHlvdSBoYXZlIG11bHRpcGxlXG4gICAgLy8gQmFja2JvbmUgdmlld3MgYXR0YWNoZWQgdG8gdGhlIHNhbWUgRE9NIGVsZW1lbnQuXG4gIHVuZGVsZWdhdGVFdmVudHM6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLiRlbCkgdGhpcy4kZWwub2ZmKCcuZGVsZWdhdGVFdmVudHMnICsgdGhpcy5jaWQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gICAgLy8gQSBmaW5lci1ncmFpbmVkIGB1bmRlbGVnYXRlRXZlbnRzYCBmb3IgcmVtb3ZpbmcgYSBzaW5nbGUgZGVsZWdhdGVkIGV2ZW50LlxuICAgIC8vIGBzZWxlY3RvcmAgYW5kIGBsaXN0ZW5lcmAgYXJlIGJvdGggb3B0aW9uYWwuXG4gIHVuZGVsZWdhdGU6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgc2VsZWN0b3IsIGxpc3RlbmVyKSB7XG4gICAgdGhpcy4kZWwub2ZmKGV2ZW50TmFtZSArICcuZGVsZWdhdGVFdmVudHMnICsgdGhpcy5jaWQsIHNlbGVjdG9yLCBsaXN0ZW5lcik7XG4gIH0sXG5cbiAgICAvLyBQcm9kdWNlcyBhIERPTSBlbGVtZW50IHRvIGJlIGFzc2lnbmVkIHRvIHlvdXIgdmlldy4gRXhwb3NlZCBmb3JcbiAgICAvLyBzdWJjbGFzc2VzIHVzaW5nIGFuIGFsdGVybmF0aXZlIERPTSBtYW5pcHVsYXRpb24gQVBJLlxuICBfY3JlYXRlRWxlbWVudDogZnVuY3Rpb24odGFnTmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICB9LFxuXG4gICAgLy8gRW5zdXJlIHRoYXQgdGhlIFZpZXcgaGFzIGEgRE9NIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAgLy8gSWYgYHRoaXMuZWxgIGlzIGEgc3RyaW5nLCBwYXNzIGl0IHRocm91Z2ggYCQoKWAsIHRha2UgdGhlIGZpcnN0XG4gICAgLy8gbWF0Y2hpbmcgZWxlbWVudCwgYW5kIHJlLWFzc2lnbiBpdCB0byBgZWxgLiBPdGhlcndpc2UsIGNyZWF0ZVxuICAgIC8vIGFuIGVsZW1lbnQgZnJvbSB0aGUgYGlkYCwgYGNsYXNzTmFtZWAgYW5kIGB0YWdOYW1lYCBwcm9wZXJ0aWVzLlxuICBfZW5zdXJlRWxlbWVudDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLmVsKSB7XG4gICAgICB2YXIgYXR0cnMgPSBfLmV4dGVuZCh7fSwgXy5yZXN1bHQodGhpcywgJ2F0dHJpYnV0ZXMnKSk7XG4gICAgICBpZiAodGhpcy5pZCkgYXR0cnMuaWQgPSBfLnJlc3VsdCh0aGlzLCAnaWQnKTtcbiAgICAgIGlmICh0aGlzLmNsYXNzTmFtZSkgYXR0cnNbJ2NsYXNzJ10gPSBfLnJlc3VsdCh0aGlzLCAnY2xhc3NOYW1lJyk7XG4gICAgICB0aGlzLnNldEVsZW1lbnQodGhpcy5fY3JlYXRlRWxlbWVudChfLnJlc3VsdCh0aGlzLCAndGFnTmFtZScpKSk7XG4gICAgICB0aGlzLl9zZXRBdHRyaWJ1dGVzKGF0dHJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRFbGVtZW50KF8ucmVzdWx0KHRoaXMsICdlbCcpKTtcbiAgICB9XG4gIH0sXG5cbiAgICAvLyBTZXQgYXR0cmlidXRlcyBmcm9tIGEgaGFzaCBvbiB0aGlzIHZpZXcncyBlbGVtZW50LiAgRXhwb3NlZCBmb3JcbiAgICAvLyBzdWJjbGFzc2VzIHVzaW5nIGFuIGFsdGVybmF0aXZlIERPTSBtYW5pcHVsYXRpb24gQVBJLlxuICBfc2V0QXR0cmlidXRlczogZnVuY3Rpb24oYXR0cmlidXRlcykge1xuICAgIHRoaXMuJGVsLmF0dHIoYXR0cmlidXRlcyk7XG4gIH1cblxufSk7XG5cbi8vIHNldHVwIGluaGVyaXRhbmNlXG5WaWV3LmV4dGVuZCA9IGV4dGVuZDtcbm1vZHVsZS5leHBvcnRzID0gVmlldztcbiIsInZhciBldmVudHMgPSByZXF1aXJlKFwiYmFja2JvbmUtZXZlbnRzLXN0YW5kYWxvbmVcIik7XG5cbmV2ZW50cy5vbkFsbCA9IGZ1bmN0aW9uKGNhbGxiYWNrLGNvbnRleHQpe1xuICB0aGlzLm9uKFwiYWxsXCIsIGNhbGxiYWNrLGNvbnRleHQpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIE1peGluIHV0aWxpdHlcbmV2ZW50cy5vbGRNaXhpbiA9IGV2ZW50cy5taXhpbjtcbmV2ZW50cy5taXhpbiA9IGZ1bmN0aW9uKHByb3RvKSB7XG4gIGV2ZW50cy5vbGRNaXhpbihwcm90byk7XG4gIC8vIGFkZCBjdXN0b20gb25BbGxcbiAgdmFyIGV4cG9ydHMgPSBbJ29uQWxsJ107XG4gIGZvcih2YXIgaT0wOyBpIDwgZXhwb3J0cy5sZW5ndGg7aSsrKXtcbiAgICB2YXIgbmFtZSA9IGV4cG9ydHNbaV07XG4gICAgcHJvdG9bbmFtZV0gPSB0aGlzW25hbWVdO1xuICB9XG4gIHJldHVybiBwcm90bztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXZlbnRzO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjguMFxudmFyIEdlbmVyaWNSZWFkZXIsIHhocjtcblxueGhyID0gcmVxdWlyZSgnbmV0cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEdlbmVyaWNSZWFkZXIgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIEdlbmVyaWNSZWFkZXIoKSB7fVxuXG4gIEdlbmVyaWNSZWFkZXIucmVhZCA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgICB2YXIgb25yZXQ7XG4gICAgb25yZXQgPSAoZnVuY3Rpb24oX3RoaXMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihlcnIsIHJlc3BvbnNlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5fb25SZXRyaWV2YWwodGV4dCwgY2FsbGJhY2spO1xuICAgICAgfTtcbiAgICB9KSh0aGlzKTtcbiAgICByZXR1cm4geGhyKHVybCwgb25yZXQpO1xuICB9O1xuXG4gIEdlbmVyaWNSZWFkZXIuX29uUmV0cmlldmFsID0gZnVuY3Rpb24odGV4dCwgY2FsbGJhY2spIHtcbiAgICB2YXIgclRleHQ7XG4gICAgclRleHQgPSB0aGlzLnBhcnNlKHRleHQpO1xuICAgIHJldHVybiBjYWxsYmFjayhyVGV4dCk7XG4gIH07XG5cbiAgcmV0dXJuIEdlbmVyaWNSZWFkZXI7XG5cbn0pKCk7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuOC4wXG52YXIgU2VxO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNlcSA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gU2VxKHNlcSwgbmFtZSwgaWQpIHtcbiAgICB2YXIgbWV0YTtcbiAgICB0aGlzLnNlcSA9IHNlcTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICBtZXRhID0ge307XG4gIH1cblxuICByZXR1cm4gU2VxO1xuXG59KSgpO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjguMFxudmFyIHN0cmluZ3M7XG5cbnN0cmluZ3MgPSB7XG4gIGNvbnRhaW5zOiBmdW5jdGlvbih0ZXh0LCBzZWFyY2gpIHtcbiAgICByZXR1cm4gJycuaW5kZXhPZi5jYWxsKHRleHQsIHNlYXJjaCwgMCkgIT09IC0xO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0cmluZ3M7XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuOC4wXG52YXIgRmFzdGEsIEdlbmVyaWNSZWFkZXIsIFNlcSwgU3RyLFxuICBfX2hhc1Byb3AgPSB7fS5oYXNPd25Qcm9wZXJ0eSxcbiAgX19leHRlbmRzID0gZnVuY3Rpb24oY2hpbGQsIHBhcmVudCkgeyBmb3IgKHZhciBrZXkgaW4gcGFyZW50KSB7IGlmIChfX2hhc1Byb3AuY2FsbChwYXJlbnQsIGtleSkpIGNoaWxkW2tleV0gPSBwYXJlbnRba2V5XTsgfSBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH0gY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlOyBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpOyBjaGlsZC5fX3N1cGVyX18gPSBwYXJlbnQucHJvdG90eXBlOyByZXR1cm4gY2hpbGQ7IH07XG5cblN0ciA9IHJlcXVpcmUoXCIuL3N0cmluZ3NcIik7XG5cbkdlbmVyaWNSZWFkZXIgPSByZXF1aXJlKFwiLi9nZW5lcmljX3JlYWRlclwiKTtcblxuU2VxID0gcmVxdWlyZShcImJpb2pzLW1vZGVsXCIpLnNlcTtcblxubW9kdWxlLmV4cG9ydHMgPSBGYXN0YSA9IChmdW5jdGlvbihfc3VwZXIpIHtcbiAgX19leHRlbmRzKEZhc3RhLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIEZhc3RhKCkge1xuICAgIHJldHVybiBGYXN0YS5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIEZhc3RhLnBhcnNlID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBjdXJyZW50U2VxLCBkYXRhYmFzZSwgZGF0YWJhc2VJRCwgaWRlbnRpZmllcnMsIGssIGxhYmVsLCBsaW5lLCBzZXFzLCBfaSwgX2xlbjtcbiAgICBzZXFzID0gW107XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0ZXh0KSAhPT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgICAgdGV4dCA9IHRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgfVxuICAgIGZvciAoX2kgPSAwLCBfbGVuID0gdGV4dC5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgbGluZSA9IHRleHRbX2ldO1xuICAgICAgaWYgKGxpbmVbMF0gPT09IFwiPlwiIHx8IGxpbmVbMF0gPT09IFwiO1wiKSB7XG4gICAgICAgIGxhYmVsID0gbGluZS5zbGljZSgxKTtcbiAgICAgICAgY3VycmVudFNlcSA9IG5ldyBTZXEoXCJcIiwgbGFiZWwsIHNlcXMubGVuZ3RoKTtcbiAgICAgICAgc2Vxcy5wdXNoKGN1cnJlbnRTZXEpO1xuICAgICAgICBpZiAoU3RyLmNvbnRhaW5zKFwifFwiLCBsaW5lKSkge1xuICAgICAgICAgIGlkZW50aWZpZXJzID0gbGFiZWwuc3BsaXQoXCJ8XCIpO1xuICAgICAgICAgIGsgPSAxO1xuICAgICAgICAgIHdoaWxlIChrIDwgaWRlbnRpZmllcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhYmFzZSA9IGlkZW50aWZpZXJzW2tdO1xuICAgICAgICAgICAgZGF0YWJhc2VJRCA9IGlkZW50aWZpZXJzW2sgKyAxXTtcbiAgICAgICAgICAgIGN1cnJlbnRTZXEubWV0YVtkYXRhYmFzZV0gPSBkYXRhYmFzZUlEO1xuICAgICAgICAgICAgayArPSAyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50U2VxLm5hbWUgPSBpZGVudGlmaWVyc1tpZGVudGlmaWVycy5sZW5ndGggLSAxXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudFNlcS5zZXEgKz0gbGluZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcXM7XG4gIH07XG5cbiAgcmV0dXJuIEZhc3RhO1xuXG59KShHZW5lcmljUmVhZGVyKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS44LjBcbnZhciBVdGlscztcblxuVXRpbHMgPSB7fTtcblxuVXRpbHMuc3BsaXROQ2hhcnMgPSBmdW5jdGlvbih0eHQsIG51bSkge1xuICB2YXIgaSwgcmVzdWx0LCBfaSwgX3JlZjtcbiAgcmVzdWx0ID0gW107XG4gIGZvciAoaSA9IF9pID0gMCwgX3JlZiA9IHR4dC5sZW5ndGggLSAxOyBudW0gPiAwID8gX2kgPD0gX3JlZiA6IF9pID49IF9yZWY7IGkgPSBfaSArPSBudW0pIHtcbiAgICByZXN1bHQucHVzaCh0eHQuc3Vic3RyKGksIG51bSkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFV0aWxzO1xuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjguMFxudmFyIEZhc3RhRXhwb3J0ZXIsIFV0aWxzO1xuXG5VdGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZhc3RhRXhwb3J0ZXIgPSAoZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIEZhc3RhRXhwb3J0ZXIoKSB7fVxuXG4gIEZhc3RhRXhwb3J0ZXJbXCJleHBvcnRcIl0gPSBmdW5jdGlvbihzZXFzLCBhY2Nlc3MpIHtcbiAgICB2YXIgc2VxLCB0ZXh0LCBfaSwgX2xlbjtcbiAgICB0ZXh0ID0gXCJcIjtcbiAgICBmb3IgKF9pID0gMCwgX2xlbiA9IHNlcXMubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgIHNlcSA9IHNlcXNbX2ldO1xuICAgICAgaWYgKGFjY2VzcyAhPSBudWxsKSB7XG4gICAgICAgIHNlcSA9IGFjY2VzcyhzZXEpO1xuICAgICAgfVxuICAgICAgdGV4dCArPSBcIj5cIiArIHNlcS5uYW1lICsgXCJcXG5cIjtcbiAgICAgIHRleHQgKz0gKFV0aWxzLnNwbGl0TkNoYXJzKHNlcS5zZXEsIDgwKSkuam9pbihcIlxcblwiKTtcbiAgICAgIHRleHQgKz0gXCJcXG5cIjtcbiAgICB9XG4gICAgcmV0dXJuIHRleHQ7XG4gIH07XG5cbiAgcmV0dXJuIEZhc3RhRXhwb3J0ZXI7XG5cbn0pKCk7XG4iLCJtb2R1bGUuZXhwb3J0cy5zZXEgPSByZXF1aXJlKFwiLi9zZXFcIik7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHNlcSwgbmFtZSwgaWQpIHtcbiAgICB0aGlzLnNlcSA9IHNlcTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLm1ldGEgPSB7fTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vc3JjL2luZGV4LmpzJylcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBBOiBcIiMwMGEzNWNcIixcbiAgUjogXCIjMDBmYzAzXCIsXG4gIE46IFwiIzAwZWIxNFwiLFxuICBEOiBcIiMwMGViMTRcIixcbiAgQzogXCIjMDAwMGZmXCIsXG4gIFE6IFwiIzAwZjEwZVwiLFxuICBFOiBcIiMwMGYxMGVcIixcbiAgRzogXCIjMDA5ZDYyXCIsXG4gIEg6IFwiIzAwZDUyYVwiLFxuICBJOiBcIiMwMDU0YWJcIixcbiAgTDogXCIjMDA3Yjg0XCIsXG4gIEs6IFwiIzAwZmYwMFwiLFxuICBNOiBcIiMwMDk3NjhcIixcbiAgRjogXCIjMDA4Nzc4XCIsXG4gIFA6IFwiIzAwZTAxZlwiLFxuICBTOiBcIiMwMGQ1MmFcIixcbiAgVDogXCIjMDBkYjI0XCIsXG4gIFc6IFwiIzAwYTg1N1wiLFxuICBZOiBcIiMwMGU2MTlcIixcbiAgVjogXCIjMDA1ZmEwXCIsXG4gIEI6IFwiIzAwZWIxNFwiLFxuICBYOiBcIiMwMGI2NDlcIixcbiAgWjogXCIjMDBmMTBlXCJcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgQTogXCIjQkJCQkJCXCIsXG4gIEI6IFwiZ3JleVwiLFxuICBDOiBcInllbGxvd1wiLFxuICBEOiBcInJlZFwiLFxuICBFOiBcInJlZFwiLFxuICBGOiBcIm1hZ2VudGFcIixcbiAgRzogXCJicm93blwiLFxuICBIOiBcIiMwMEZGRkZcIixcbiAgSTogXCIjQkJCQkJCXCIsXG4gIEo6IFwiI2ZmZlwiLFxuICBLOiBcIiMwMEZGRkZcIixcbiAgTDogXCIjQkJCQkJCXCIsXG4gIE06IFwiI0JCQkJCQlwiLFxuICBOOiBcImdyZWVuXCIsXG4gIE86IFwiI2ZmZlwiLFxuICBQOiBcImJyb3duXCIsXG4gIFE6IFwiZ3JlZW5cIixcbiAgUjogXCIjMDBGRkZGXCIsXG4gIFM6IFwiZ3JlZW5cIixcbiAgVDogXCJncmVlblwiLFxuICBVOiBcIiNmZmZcIixcbiAgVjogXCIjQkJCQkJCXCIsXG4gIFc6IFwibWFnZW50YVwiLFxuICBYOiBcImdyZXlcIixcbiAgWTogXCJtYWdlbnRhXCIsXG4gIFo6IFwiZ3JleVwiLFxuICBHYXA6IFwiZ3JleVwiXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIEE6IFwib3JhbmdlXCIsXG4gIEI6IFwiI2ZmZlwiLFxuICBDOiBcImdyZWVuXCIsXG4gIEQ6IFwicmVkXCIsXG4gIEU6IFwicmVkXCIsXG4gIEY6IFwiYmx1ZVwiLFxuICBHOiBcIm9yYW5nZVwiLFxuICBIOiBcInJlZFwiLFxuICBJOiBcImdyZWVuXCIsXG4gIEo6IFwiI2ZmZlwiLFxuICBLOiBcInJlZFwiLFxuICBMOiBcImdyZWVuXCIsXG4gIE06IFwiZ3JlZW5cIixcbiAgTjogXCIjZmZmXCIsXG4gIE86IFwiI2ZmZlwiLFxuICBQOiBcIm9yYW5nZVwiLFxuICBROiBcIiNmZmZcIixcbiAgUjogXCJyZWRcIixcbiAgUzogXCJvcmFuZ2VcIixcbiAgVDogXCJvcmFuZ2VcIixcbiAgVTogXCIjZmZmXCIsXG4gIFY6IFwiZ3JlZW5cIixcbiAgVzogXCJibHVlXCIsXG4gIFg6IFwiI2ZmZlwiLFxuICBZOiBcImJsdWVcIixcbiAgWjogXCIjZmZmXCIsXG4gIEdhcDogXCIjZmZmXCJcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgQTogXCIjODBhMGYwXCIsXG4gIFI6IFwiI2YwMTUwNVwiLFxuICBOOiBcIiMwMGZmMDBcIixcbiAgRDogXCIjYzA0OGMwXCIsXG4gIEM6IFwiI2YwODA4MFwiLFxuICBROiBcIiMwMGZmMDBcIixcbiAgRTogXCIjYzA0OGMwXCIsXG4gIEc6IFwiI2YwOTA0OFwiLFxuICBIOiBcIiMxNWE0YTRcIixcbiAgSTogXCIjODBhMGYwXCIsXG4gIEw6IFwiIzgwYTBmMFwiLFxuICBLOiBcIiNmMDE1MDVcIixcbiAgTTogXCIjODBhMGYwXCIsXG4gIEY6IFwiIzgwYTBmMFwiLFxuICBQOiBcIiNmZmZmMDBcIixcbiAgUzogXCIjMDBmZjAwXCIsXG4gIFQ6IFwiIzAwZmYwMFwiLFxuICBXOiBcIiM4MGEwZjBcIixcbiAgWTogXCIjMTVhNGE0XCIsXG4gIFY6IFwiIzgwYTBmMFwiLFxuICBCOiBcIiNmZmZcIixcbiAgWDogXCIjZmZmXCIsXG4gIFo6IFwiI2ZmZlwiXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIEE6IFwiI2U3MThlN1wiLFxuICBSOiBcIiM2ZjkwNmZcIixcbiAgTjogXCIjMWJlNDFiXCIsXG4gIEQ6IFwiIzc3ODg3N1wiLFxuICBDOiBcIiMyM2RjMjNcIixcbiAgUTogXCIjOTI2ZDkyXCIsXG4gIEU6IFwiI2ZmMDBmZlwiLFxuICBHOiBcIiMwMGZmMDBcIixcbiAgSDogXCIjNzU4YTc1XCIsXG4gIEk6IFwiIzhhNzU4YVwiLFxuICBMOiBcIiNhZTUxYWVcIixcbiAgSzogXCIjYTA1ZmEwXCIsXG4gIE06IFwiI2VmMTBlZlwiLFxuICBGOiBcIiM5ODY3OThcIixcbiAgUDogXCIjMDBmZjAwXCIsXG4gIFM6IFwiIzM2YzkzNlwiLFxuICBUOiBcIiM0N2I4NDdcIixcbiAgVzogXCIjOGE3NThhXCIsXG4gIFk6IFwiIzIxZGUyMVwiLFxuICBWOiBcIiM4NTdhODVcIixcbiAgQjogXCIjNDliNjQ5XCIsXG4gIFg6IFwiIzc1OGE3NVwiLFxuICBaOiBcIiNjOTM2YzlcIlxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBBOiBcIiNhZDAwNTJcIixcbiAgQjogXCIjMGMwMGYzXCIsXG4gIEM6IFwiI2MyMDAzZFwiLFxuICBEOiBcIiMwYzAwZjNcIixcbiAgRTogXCIjMGMwMGYzXCIsXG4gIEY6IFwiI2NiMDAzNFwiLFxuICBHOiBcIiM2YTAwOTVcIixcbiAgSDogXCIjMTUwMGVhXCIsXG4gIEk6IFwiI2ZmMDAwMFwiLFxuICBKOiBcIiNmZmZcIixcbiAgSzogXCIjMDAwMGZmXCIsXG4gIEw6IFwiI2VhMDAxNVwiLFxuICBNOiBcIiNiMDAwNGZcIixcbiAgTjogXCIjMGMwMGYzXCIsXG4gIE86IFwiI2ZmZlwiLFxuICBQOiBcIiM0NjAwYjlcIixcbiAgUTogXCIjMGMwMGYzXCIsXG4gIFI6IFwiIzAwMDBmZlwiLFxuICBTOiBcIiM1ZTAwYTFcIixcbiAgVDogXCIjNjEwMDllXCIsXG4gIFU6IFwiI2ZmZlwiLFxuICBWOiBcIiNmNjAwMDlcIixcbiAgVzogXCIjNWIwMGE0XCIsXG4gIFg6IFwiIzY4MDA5N1wiLFxuICBZOiBcIiM0ZjAwYjBcIixcbiAgWjogXCIjMGMwMGYzXCJcbn07XG4iLCJtb2R1bGUuZXhwb3J0cy5zZWxlY3RvciA9IHJlcXVpcmUoXCIuL3NlbGVjdG9yXCIpO1xuXG4vLyBiYXNpY3Ncbm1vZHVsZS5leHBvcnRzLnRheWxvciA9IHJlcXVpcmUoXCIuL3RheWxvclwiKTtcbm1vZHVsZS5leHBvcnRzLnphcHBvPSByZXF1aXJlKFwiLi96YXBwb1wiKTtcbm1vZHVsZS5leHBvcnRzLmh5ZHJvPSByZXF1aXJlKFwiLi9oeWRyb3Bob2JpY2l0eVwiKTtcblxubW9kdWxlLmV4cG9ydHMuY2x1c3RhbCA9IHJlcXVpcmUoXCIuL2NsdXN0YWxcIik7XG5tb2R1bGUuZXhwb3J0cy5jbHVzdGFsMiA9IHJlcXVpcmUoXCIuL2NsdXN0YWwyXCIpO1xuXG5tb2R1bGUuZXhwb3J0cy5jdXJpZWQgPSByZXF1aXJlKFwiLi9idXJpZWRcIik7XG5tb2R1bGUuZXhwb3J0cy5jaW5lbWEgPSByZXF1aXJlKFwiLi9jaW5lbWFcIik7XG5tb2R1bGUuZXhwb3J0cy5udWNsZW90aWRlICA9IHJlcXVpcmUoXCIuL251Y2xlb3RpZGVcIik7XG5tb2R1bGUuZXhwb3J0cy5oZWxpeCAgPSByZXF1aXJlKFwiLi9oZWxpeFwiKTtcbm1vZHVsZS5leHBvcnRzLmxlc2sgID0gcmVxdWlyZShcIi4vbGVza1wiKTtcbm1vZHVsZS5leHBvcnRzLm1hZSA9IHJlcXVpcmUoXCIuL21hZVwiKTtcbm1vZHVsZS5leHBvcnRzLnB1cmluZSA9IHJlcXVpcmUoXCIuL3B1cmluZVwiKTtcbm1vZHVsZS5leHBvcnRzLnN0cmFuZCA9IHJlcXVpcmUoXCIuL3N0cmFuZFwiKTtcbm1vZHVsZS5leHBvcnRzLnR1cm4gPSByZXF1aXJlKFwiLi90dXJuXCIpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIEE6IFwiIG9yYW5nZVwiLFxuICBCOiBcIiAjZmZmXCIsXG4gIEM6IFwiIGdyZWVuXCIsXG4gIEQ6IFwiIHJlZFwiLFxuICBFOiBcIiByZWRcIixcbiAgRjogXCIgZ3JlZW5cIixcbiAgRzogXCIgb3JhbmdlXCIsXG4gIEg6IFwiIG1hZ2VudGFcIixcbiAgSTogXCIgZ3JlZW5cIixcbiAgSjogXCIgI2ZmZlwiLFxuICBLOiBcIiByZWRcIixcbiAgTDogXCIgZ3JlZW5cIixcbiAgTTogXCIgZ3JlZW5cIixcbiAgTjogXCIgbWFnZW50YVwiLFxuICBPOiBcIiAjZmZmXCIsXG4gIFA6IFwiIGdyZWVuXCIsXG4gIFE6IFwiIG1hZ2VudGFcIixcbiAgUjogXCIgcmVkXCIsXG4gIFM6IFwiIG9yYW5nZVwiLFxuICBUOiBcIiBvcmFuZ2VcIixcbiAgVTogXCIgI2ZmZlwiLFxuICBWOiBcIiBncmVlblwiLFxuICBXOiBcIiBncmVlblwiLFxuICBYOiBcIiAjZmZmXCIsXG4gIFk6IFwiIGdyZWVuXCIsXG4gIFo6IFwiICNmZmZcIixcbiAgR2FwOiBcIiAjZmZmXCJcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgQTogXCIgIzc3ZGQ4OFwiLFxuICBCOiBcIiAjZmZmXCIsXG4gIEM6IFwiICM5OWVlNjZcIixcbiAgRDogXCIgIzU1YmIzM1wiLFxuICBFOiBcIiAjNTViYjMzXCIsXG4gIEY6IFwiICM5OTk5ZmZcIixcbiAgRzogXCIgIzc3ZGQ4OFwiLFxuICBIOiBcIiAjNTU1NWZmXCIsXG4gIEk6IFwiICM2NmJiZmZcIixcbiAgSjogXCIgI2ZmZlwiLFxuICBLOiBcIiAjZmZjYzc3XCIsXG4gIEw6IFwiICM2NmJiZmZcIixcbiAgTTogXCIgIzY2YmJmZlwiLFxuICBOOiBcIiAjNTViYjMzXCIsXG4gIE86IFwiICNmZmZcIixcbiAgUDogXCIgI2VlYWFhYVwiLFxuICBROiBcIiAjNTViYjMzXCIsXG4gIFI6IFwiICNmZmNjNzdcIixcbiAgUzogXCIgI2ZmNDQ1NVwiLFxuICBUOiBcIiAjZmY0NDU1XCIsXG4gIFU6IFwiICNmZmZcIixcbiAgVjogXCIgIzY2YmJmZlwiLFxuICBXOiBcIiAjOTk5OWZmXCIsXG4gIFg6IFwiICNmZmZcIixcbiAgWTogXCIgIzk5OTlmZlwiLFxuICBaOiBcIiAjZmZmXCIsXG4gIEdhcDogXCIgI2ZmZlwiXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIEE6IFwiICM2NEY3M0ZcIixcbiAgQzogXCIgI0ZGQjM0MFwiLFxuICBHOiBcIiAjRUI0MTNDXCIsXG4gIFQ6IFwiICMzQzg4RUVcIixcbiAgVTogXCIgIzNDODhFRVwiXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIEE6IFwiICNGRjgzRkFcIixcbiAgQzogXCIgIzQwRTBEMFwiLFxuICBHOiBcIiAjRkY4M0ZBXCIsXG4gIFI6IFwiICNGRjgzRkFcIixcbiAgVDogXCIgIzQwRTBEMFwiLFxuICBVOiBcIiAjNDBFMEQwXCIsXG4gIFk6IFwiICM0MEUwRDBcIlxufTtcbiIsInZhciBCdXJpZWQgPSByZXF1aXJlKFwiLi9idXJpZWRcIik7XG52YXIgQ2luZW1hID0gcmVxdWlyZShcIi4vY2luZW1hXCIpO1xudmFyIENsdXN0YWwgPSByZXF1aXJlKFwiLi9jbHVzdGFsXCIpO1xudmFyIENsdXN0YWwyID0gcmVxdWlyZShcIi4vY2x1c3RhbDJcIik7XG52YXIgSGVsaXggPSByZXF1aXJlKFwiLi9oZWxpeFwiKTtcbnZhciBIeWRybyA9IHJlcXVpcmUoXCIuL2h5ZHJvcGhvYmljaXR5XCIpO1xudmFyIExlc2sgPSByZXF1aXJlKFwiLi9sZXNrXCIpO1xudmFyIE1hZSA9IHJlcXVpcmUoXCIuL21hZVwiKTtcbnZhciBOdWNsZW90aWRlID0gcmVxdWlyZShcIi4vbnVjbGVvdGlkZVwiKTtcbnZhciBQdXJpbmUgPSByZXF1aXJlKFwiLi9wdXJpbmVcIik7XG52YXIgU3RyYW5kID0gcmVxdWlyZShcIi4vc3RyYW5kXCIpO1xudmFyIFRheWxvciA9IHJlcXVpcmUoXCIuL3RheWxvclwiKTtcbnZhciBUdXJuID0gcmVxdWlyZShcIi4vdHVyblwiKTtcbnZhciBaYXBwbyA9IHJlcXVpcmUoXCIuL3phcHBvXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbG9ycyA9IHtcbiAgbWFwcGluZzoge1xuICAgIGJ1cmllZDogQnVyaWVkLFxuICAgIGJ1cmllZF9pbmRleDogQnVyaWVkLFxuICAgIGNpbmVtYTogQ2luZW1hLFxuICAgIGNsdXN0YWwyOiBDbHVzdGFsMixcbiAgICBjbHVzdGFsOiBDbHVzdGFsLFxuICAgIGhlbGl4OiBIZWxpeCxcbiAgICBoZWxpeF9wcm9wZW5zaXR5OiBIZWxpeCxcbiAgICBoeWRybzogSHlkcm8sXG4gICAgbGVzazogTGVzayxcbiAgICBtYWU6IE1hZSxcbiAgICBudWNsZW90aWRlOiBOdWNsZW90aWRlLFxuICAgIHB1cmluZTogUHVyaW5lLFxuICAgIHB1cmluZV9weXJpbWlkaW5lOiBQdXJpbmUsXG4gICAgc3RyYW5kOiBTdHJhbmQsXG4gICAgc3RyYW5kX3Byb3BlbnNpdHk6IFN0cmFuZCxcbiAgICB0YXlsb3I6IFRheWxvcixcbiAgICB0dXJuOiBUdXJuLFxuICAgIHR1cm5fcHJvcGVuc2l0eTogVHVybixcbiAgICB6YXBwbzogWmFwcG8sXG4gIH0sXG4gIGdldENvbG9yOiBmdW5jdGlvbihzY2hlbWUpIHtcbiAgICB2YXIgY29sb3IgPSBDb2xvcnMubWFwcGluZ1tzY2hlbWVdO1xuICAgIGlmIChjb2xvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb2xvciA9IHt9O1xuICAgIH1cbiAgICByZXR1cm4gY29sb3I7XG4gIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgQTogXCIjNTg1OGE3XCIsXG4gIFI6IFwiIzZiNmI5NFwiLFxuICBOOiBcIiM2NDY0OWJcIixcbiAgRDogXCIjMjEyMWRlXCIsXG4gIEM6IFwiIzlkOWQ2MlwiLFxuICBROiBcIiM4YzhjNzNcIixcbiAgRTogXCIjMDAwMGZmXCIsXG4gIEc6IFwiIzQ5NDliNlwiLFxuICBIOiBcIiM2MDYwOWZcIixcbiAgSTogXCIjZWNlYzEzXCIsXG4gIEw6IFwiI2IyYjI0ZFwiLFxuICBLOiBcIiM0NzQ3YjhcIixcbiAgTTogXCIjODI4MjdkXCIsXG4gIEY6IFwiI2MyYzIzZFwiLFxuICBQOiBcIiMyMzIzZGNcIixcbiAgUzogXCIjNDk0OWI2XCIsXG4gIFQ6IFwiIzlkOWQ2MlwiLFxuICBXOiBcIiNjMGMwM2ZcIixcbiAgWTogXCIjZDNkMzJjXCIsXG4gIFY6IFwiI2ZmZmYwMFwiLFxuICBCOiBcIiM0MzQzYmNcIixcbiAgWDogXCIjNzk3OTg2XCIsXG4gIFo6IFwiIzQ3NDdiOFwiXG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSB7XG4gIEE6IFwiI2NjZmYwMFwiLFxuICBSOiBcIiMwMDAwZmZcIixcbiAgTjogXCIjY2MwMGZmXCIsXG4gIEQ6IFwiI2ZmMDAwMFwiLFxuICBDOiBcIiNmZmZmMDBcIixcbiAgUTogXCIjZmYwMGNjXCIsXG4gIEU6IFwiI2ZmMDA2NlwiLFxuICBHOiBcIiNmZjk5MDBcIixcbiAgSDogXCIjMDA2NmZmXCIsXG4gIEk6IFwiIzY2ZmYwMFwiLFxuICBMOiBcIiMzM2ZmMDBcIixcbiAgSzogXCIjNjYwMGZmXCIsXG4gIE06IFwiIzAwZmYwMFwiLFxuICBGOiBcIiMwMGZmNjZcIixcbiAgUDogXCIjZmZjYzAwXCIsXG4gIFM6IFwiI2ZmMzMwMFwiLFxuICBUOiBcIiNmZjY2MDBcIixcbiAgVzogXCIjMDBjY2ZmXCIsXG4gIFk6IFwiIzAwZmZjY1wiLFxuICBWOiBcIiM5OWZmMDBcIixcbiAgQjogXCIjZmZmXCIsXG4gIFg6IFwiI2ZmZlwiLFxuICBaOiBcIiNmZmZcIlxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBBOiBcIiMyY2QzZDNcIixcbiAgUjogXCIjNzA4ZjhmXCIsXG4gIE46IFwiI2ZmMDAwMFwiLFxuICBEOiBcIiNlODE3MTdcIixcbiAgQzogXCIjYTg1NzU3XCIsXG4gIFE6IFwiIzNmYzBjMFwiLFxuICBFOiBcIiM3Nzg4ODhcIixcbiAgRzogXCIjZmYwMDAwXCIsXG4gIEg6IFwiIzcwOGY4ZlwiLFxuICBJOiBcIiMwMGZmZmZcIixcbiAgTDogXCIjMWNlM2UzXCIsXG4gIEs6IFwiIzdlODE4MVwiLFxuICBNOiBcIiMxZWUxZTFcIixcbiAgRjogXCIjMWVlMWUxXCIsXG4gIFA6IFwiI2Y2MDkwOVwiLFxuICBTOiBcIiNlMTFlMWVcIixcbiAgVDogXCIjNzM4YzhjXCIsXG4gIFc6IFwiIzczOGM4Y1wiLFxuICBZOiBcIiM5ZDYyNjJcIixcbiAgVjogXCIjMDdmOGY4XCIsXG4gIEI6IFwiI2YzMGMwY1wiLFxuICBYOiBcIiM3YzgzODNcIixcbiAgWjogXCIjNWJhNGE0XCJcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgQTogXCIjZmZhZmFmXCIsXG4gIFI6IFwiIzY0NjRmZlwiLFxuICBOOiBcIiMwMGZmMDBcIixcbiAgRDogXCIjZmYwMDAwXCIsXG4gIEM6IFwiI2ZmZmYwMFwiLFxuICBROiBcIiMwMGZmMDBcIixcbiAgRTogXCIjZmYwMDAwXCIsXG4gIEc6IFwiI2ZmMDBmZlwiLFxuICBIOiBcIiM2NDY0ZmZcIixcbiAgSTogXCIjZmZhZmFmXCIsXG4gIEw6IFwiI2ZmYWZhZlwiLFxuICBLOiBcIiM2NDY0ZmZcIixcbiAgTTogXCIjZmZhZmFmXCIsXG4gIEY6IFwiI2ZmYzgwMFwiLFxuICBQOiBcIiNmZjAwZmZcIixcbiAgUzogXCIjMDBmZjAwXCIsXG4gIFQ6IFwiIzAwZmYwMFwiLFxuICBXOiBcIiNmZmM4MDBcIixcbiAgWTogXCIjZmZjODAwXCIsXG4gIFY6IFwiI2ZmYWZhZlwiLFxuICBCOiBcIiNmZmZcIixcbiAgWDogXCIjZmZmXCIsXG4gIFo6IFwiI2ZmZlwiXG59O1xuIiwiLypcbiAqIEphdmFTY3JpcHQgQ2FudmFzIHRvIEJsb2IgMi4wLjVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtQ2FudmFzLXRvLUJsb2JcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogQmFzZWQgb24gc3RhY2tvdmVyZmxvdyB1c2VyIFN0b2l2ZSdzIGNvZGUgc25pcHBldDpcbiAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzQ5OTg5MDhcbiAqL1xudmFyIENhbnZhc1Byb3RvdHlwZSA9IHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudCAmJlxud2luZG93LkhUTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZSxcbiAgaGFzQmxvYkNvbnN0cnVjdG9yID0gd2luZG93LkJsb2IgJiYgKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4obmV3IEJsb2IoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSgpKSxcbiAgaGFzQXJyYXlCdWZmZXJWaWV3U3VwcG9ydCA9IGhhc0Jsb2JDb25zdHJ1Y3RvciAmJiB3aW5kb3cuVWludDhBcnJheSAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IEJsb2IoW25ldyBVaW50OEFycmF5KDEwMCldKS5zaXplID09PSAxMDA7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSgpKSxcbiAgQmxvYkJ1aWxkZXIgPSB3aW5kb3cuQmxvYkJ1aWxkZXIgfHwgd2luZG93LldlYktpdEJsb2JCdWlsZGVyIHx8XG4gIHdpbmRvdy5Nb3pCbG9iQnVpbGRlciB8fCB3aW5kb3cuTVNCbG9iQnVpbGRlcixcbiAgZGF0YVVSTHRvQmxvYiA9IChoYXNCbG9iQ29uc3RydWN0b3IgfHwgQmxvYkJ1aWxkZXIpICYmIHdpbmRvdy5hdG9iICYmXG4gIHdpbmRvdy5BcnJheUJ1ZmZlciAmJiB3aW5kb3cuVWludDhBcnJheSAmJiBmdW5jdGlvbiAoZGF0YVVSSSkge1xuICAgIHZhciBieXRlU3RyaW5nLFxuICAgIGFycmF5QnVmZmVyLFxuICAgIGludEFycmF5LFxuICAgICAgaSxcbiAgICAgIG1pbWVTdHJpbmcsXG4gICAgICAgIGJiO1xuICAgIGlmIChkYXRhVVJJLnNwbGl0KCcsJylbMF0uaW5kZXhPZignYmFzZTY0JykgPj0gMCkge1xuICAgICAgLy8gQ29udmVydCBiYXNlNjQgdG8gcmF3IGJpbmFyeSBkYXRhIGhlbGQgaW4gYSBzdHJpbmc6XG4gICAgICBieXRlU3RyaW5nID0gYXRvYihkYXRhVVJJLnNwbGl0KCcsJylbMV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb252ZXJ0IGJhc2U2NC9VUkxFbmNvZGVkIGRhdGEgY29tcG9uZW50IHRvIHJhdyBiaW5hcnkgZGF0YTpcbiAgICAgIGJ5dGVTdHJpbmcgPSBkZWNvZGVVUklDb21wb25lbnQoZGF0YVVSSS5zcGxpdCgnLCcpWzFdKTtcbiAgICB9XG4gICAgLy8gV3JpdGUgdGhlIGJ5dGVzIG9mIHRoZSBzdHJpbmcgdG8gYW4gQXJyYXlCdWZmZXI6XG4gICAgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xuICAgIGludEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBieXRlU3RyaW5nLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpbnRBcnJheVtpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgLy8gU2VwYXJhdGUgb3V0IHRoZSBtaW1lIGNvbXBvbmVudDpcbiAgICBtaW1lU3RyaW5nID0gZGF0YVVSSS5zcGxpdCgnLCcpWzBdLnNwbGl0KCc6JylbMV0uc3BsaXQoJzsnKVswXTtcbiAgICAvLyBXcml0ZSB0aGUgQXJyYXlCdWZmZXIgKG9yIEFycmF5QnVmZmVyVmlldykgdG8gYSBibG9iOlxuICAgIGlmIChoYXNCbG9iQ29uc3RydWN0b3IpIHtcbiAgICAgIHJldHVybiBuZXcgQmxvYihcbiAgICAgICAgICBbaGFzQXJyYXlCdWZmZXJWaWV3U3VwcG9ydCA/IGludEFycmF5IDogYXJyYXlCdWZmZXJdLFxuICAgICAgICAgIHt0eXBlOiBtaW1lU3RyaW5nfVxuICAgICAgICAgICk7XG4gICAgfVxuICAgIGJiID0gbmV3IEJsb2JCdWlsZGVyKCk7XG4gICAgYmIuYXBwZW5kKGFycmF5QnVmZmVyKTtcbiAgICByZXR1cm4gYmIuZ2V0QmxvYihtaW1lU3RyaW5nKTtcbiAgfTtcbmlmICh3aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQgJiYgIUNhbnZhc1Byb3RvdHlwZS50b0Jsb2IpIHtcbiAgaWYgKENhbnZhc1Byb3RvdHlwZS5tb3pHZXRBc0ZpbGUpIHtcbiAgICBDYW52YXNQcm90b3R5cGUudG9CbG9iID0gZnVuY3Rpb24gKGNhbGxiYWNrLCB0eXBlLCBxdWFsaXR5KSB7XG4gICAgICBpZiAocXVhbGl0eSAmJiBDYW52YXNQcm90b3R5cGUudG9EYXRhVVJMICYmIGRhdGFVUkx0b0Jsb2IpIHtcbiAgICAgICAgY2FsbGJhY2soZGF0YVVSTHRvQmxvYih0aGlzLnRvRGF0YVVSTCh0eXBlLCBxdWFsaXR5KSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sodGhpcy5tb3pHZXRBc0ZpbGUoJ2Jsb2InLCB0eXBlKSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIGlmIChDYW52YXNQcm90b3R5cGUudG9EYXRhVVJMICYmIGRhdGFVUkx0b0Jsb2IpIHtcbiAgICBDYW52YXNQcm90b3R5cGUudG9CbG9iID0gZnVuY3Rpb24gKGNhbGxiYWNrLCB0eXBlLCBxdWFsaXR5KSB7XG4gICAgICBjYWxsYmFjayhkYXRhVVJMdG9CbG9iKHRoaXMudG9EYXRhVVJMKHR5cGUsIHF1YWxpdHkpKSk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRhdGFVUkx0b0Jsb2I7XG4iLCIvKiBGaWxlU2F2ZXIuanNcbiAqICBBIHNhdmVBcygpIEZpbGVTYXZlciBpbXBsZW1lbnRhdGlvbi5cbiAqICAyMDE0LTA1LTI3XG4gKlxuICogIEJ5IEVsaSBHcmV5LCBodHRwOi8vZWxpZ3JleS5jb21cbiAqICBMaWNlbnNlOiBYMTEvTUlUXG4gKiAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvRmlsZVNhdmVyLmpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UubWRcbiAqL1xuXG4vKmdsb2JhbCBzZWxmICovXG4vKmpzbGludCBiaXR3aXNlOiB0cnVlLCBpbmRlbnQ6IDQsIGxheGJyZWFrOiB0cnVlLCBsYXhjb21tYTogdHJ1ZSwgc21hcnR0YWJzOiB0cnVlLCBwbHVzcGx1czogdHJ1ZSAqL1xuXG4vKiEgQHNvdXJjZSBodHRwOi8vcHVybC5lbGlncmV5LmNvbS9naXRodWIvRmlsZVNhdmVyLmpzL2Jsb2IvbWFzdGVyL0ZpbGVTYXZlci5qcyAqL1xuXG52YXIgc2F2ZUFzID0gc2F2ZUFzXG4gIC8vIElFIDEwKyAobmF0aXZlIHNhdmVBcylcbiAgfHwgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iICYmIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iLmJpbmQobmF2aWdhdG9yKSlcbiAgLy8gRXZlcnlvbmUgZWxzZVxuICB8fCAoZnVuY3Rpb24odmlldykge1xuXHRcInVzZSBzdHJpY3RcIjtcblx0Ly8gSUUgPDEwIGlzIGV4cGxpY2l0bHkgdW5zdXBwb3J0ZWRcblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0ICAgIC9NU0lFIFsxLTldXFwuLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHZhclxuXHRcdCAgZG9jID0gdmlldy5kb2N1bWVudFxuXHRcdCAgLy8gb25seSBnZXQgVVJMIHdoZW4gbmVjZXNzYXJ5IGluIGNhc2UgQmxvYi5qcyBoYXNuJ3Qgb3ZlcnJpZGRlbiBpdCB5ZXRcblx0XHQsIGdldF9VUkwgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB2aWV3LlVSTCB8fCB2aWV3LndlYmtpdFVSTCB8fCB2aWV3O1xuXHRcdH1cblx0XHQsIHNhdmVfbGluayA9IGRvYy5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIsIFwiYVwiKVxuXHRcdCwgY2FuX3VzZV9zYXZlX2xpbmsgPSAhdmlldy5leHRlcm5hbEhvc3QgJiYgXCJkb3dubG9hZFwiIGluIHNhdmVfbGlua1xuXHRcdCwgY2xpY2sgPSBmdW5jdGlvbihub2RlKSB7XG5cdFx0XHR2YXIgZXZlbnQgPSBkb2MuY3JlYXRlRXZlbnQoXCJNb3VzZUV2ZW50c1wiKTtcblx0XHRcdGV2ZW50LmluaXRNb3VzZUV2ZW50KFxuXHRcdFx0XHRcImNsaWNrXCIsIHRydWUsIGZhbHNlLCB2aWV3LCAwLCAwLCAwLCAwLCAwXG5cdFx0XHRcdCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDAsIG51bGxcblx0XHRcdCk7XG5cdFx0XHRub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHRcdH1cblx0XHQsIHdlYmtpdF9yZXFfZnMgPSB2aWV3LndlYmtpdFJlcXVlc3RGaWxlU3lzdGVtXG5cdFx0LCByZXFfZnMgPSB2aWV3LnJlcXVlc3RGaWxlU3lzdGVtIHx8IHdlYmtpdF9yZXFfZnMgfHwgdmlldy5tb3pSZXF1ZXN0RmlsZVN5c3RlbVxuXHRcdCwgdGhyb3dfb3V0c2lkZSA9IGZ1bmN0aW9uKGV4KSB7XG5cdFx0XHQodmlldy5zZXRJbW1lZGlhdGUgfHwgdmlldy5zZXRUaW1lb3V0KShmdW5jdGlvbigpIHtcblx0XHRcdFx0dGhyb3cgZXg7XG5cdFx0XHR9LCAwKTtcblx0XHR9XG5cdFx0LCBmb3JjZV9zYXZlYWJsZV90eXBlID0gXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuXHRcdCwgZnNfbWluX3NpemUgPSAwXG5cdFx0LCBkZWxldGlvbl9xdWV1ZSA9IFtdXG5cdFx0LCBwcm9jZXNzX2RlbGV0aW9uX3F1ZXVlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IGRlbGV0aW9uX3F1ZXVlLmxlbmd0aDtcblx0XHRcdHdoaWxlIChpLS0pIHtcblx0XHRcdFx0dmFyIGZpbGUgPSBkZWxldGlvbl9xdWV1ZVtpXTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmaWxlID09PSBcInN0cmluZ1wiKSB7IC8vIGZpbGUgaXMgYW4gb2JqZWN0IFVSTFxuXHRcdFx0XHRcdGdldF9VUkwoKS5yZXZva2VPYmplY3RVUkwoZmlsZSk7XG5cdFx0XHRcdH0gZWxzZSB7IC8vIGZpbGUgaXMgYSBGaWxlXG5cdFx0XHRcdFx0ZmlsZS5yZW1vdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGVsZXRpb25fcXVldWUubGVuZ3RoID0gMDsgLy8gY2xlYXIgcXVldWVcblx0XHR9XG5cdFx0LCBkaXNwYXRjaCA9IGZ1bmN0aW9uKGZpbGVzYXZlciwgZXZlbnRfdHlwZXMsIGV2ZW50KSB7XG5cdFx0XHRldmVudF90eXBlcyA9IFtdLmNvbmNhdChldmVudF90eXBlcyk7XG5cdFx0XHR2YXIgaSA9IGV2ZW50X3R5cGVzLmxlbmd0aDtcblx0XHRcdHdoaWxlIChpLS0pIHtcblx0XHRcdFx0dmFyIGxpc3RlbmVyID0gZmlsZXNhdmVyW1wib25cIiArIGV2ZW50X3R5cGVzW2ldXTtcblx0XHRcdFx0aWYgKHR5cGVvZiBsaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGxpc3RlbmVyLmNhbGwoZmlsZXNhdmVyLCBldmVudCB8fCBmaWxlc2F2ZXIpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGV4KSB7XG5cdFx0XHRcdFx0XHR0aHJvd19vdXRzaWRlKGV4KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0LCBGaWxlU2F2ZXIgPSBmdW5jdGlvbihibG9iLCBuYW1lKSB7XG5cdFx0XHQvLyBGaXJzdCB0cnkgYS5kb3dubG9hZCwgdGhlbiB3ZWIgZmlsZXN5c3RlbSwgdGhlbiBvYmplY3QgVVJMc1xuXHRcdFx0dmFyXG5cdFx0XHRcdCAgZmlsZXNhdmVyID0gdGhpc1xuXHRcdFx0XHQsIHR5cGUgPSBibG9iLnR5cGVcblx0XHRcdFx0LCBibG9iX2NoYW5nZWQgPSBmYWxzZVxuXHRcdFx0XHQsIG9iamVjdF91cmxcblx0XHRcdFx0LCB0YXJnZXRfdmlld1xuXHRcdFx0XHQsIGdldF9vYmplY3RfdXJsID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dmFyIG9iamVjdF91cmwgPSBnZXRfVVJMKCkuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXHRcdFx0XHRcdGRlbGV0aW9uX3F1ZXVlLnB1c2gob2JqZWN0X3VybCk7XG5cdFx0XHRcdFx0cmV0dXJuIG9iamVjdF91cmw7XG5cdFx0XHRcdH1cblx0XHRcdFx0LCBkaXNwYXRjaF9hbGwgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkaXNwYXRjaChmaWxlc2F2ZXIsIFwid3JpdGVzdGFydCBwcm9ncmVzcyB3cml0ZSB3cml0ZWVuZFwiLnNwbGl0KFwiIFwiKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gb24gYW55IGZpbGVzeXMgZXJyb3JzIHJldmVydCB0byBzYXZpbmcgd2l0aCBvYmplY3QgVVJMc1xuXHRcdFx0XHQsIGZzX2Vycm9yID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0Ly8gZG9uJ3QgY3JlYXRlIG1vcmUgb2JqZWN0IFVSTHMgdGhhbiBuZWVkZWRcblx0XHRcdFx0XHRpZiAoYmxvYl9jaGFuZ2VkIHx8ICFvYmplY3RfdXJsKSB7XG5cdFx0XHRcdFx0XHRvYmplY3RfdXJsID0gZ2V0X29iamVjdF91cmwoYmxvYik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0YXJnZXRfdmlldykge1xuXHRcdFx0XHRcdFx0dGFyZ2V0X3ZpZXcubG9jYXRpb24uaHJlZiA9IG9iamVjdF91cmw7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHdpbmRvdy5vcGVuKG9iamVjdF91cmwsIFwiX2JsYW5rXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5ET05FO1xuXHRcdFx0XHRcdGRpc3BhdGNoX2FsbCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCwgYWJvcnRhYmxlID0gZnVuY3Rpb24oZnVuYykge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmIChmaWxlc2F2ZXIucmVhZHlTdGF0ZSAhPT0gZmlsZXNhdmVyLkRPTkUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdCwgY3JlYXRlX2lmX25vdF9mb3VuZCA9IHtjcmVhdGU6IHRydWUsIGV4Y2x1c2l2ZTogZmFsc2V9XG5cdFx0XHRcdCwgc2xpY2Vcblx0XHRcdDtcblx0XHRcdGZpbGVzYXZlci5yZWFkeVN0YXRlID0gZmlsZXNhdmVyLklOSVQ7XG5cdFx0XHRpZiAoIW5hbWUpIHtcblx0XHRcdFx0bmFtZSA9IFwiZG93bmxvYWRcIjtcblx0XHRcdH1cblx0XHRcdGlmIChjYW5fdXNlX3NhdmVfbGluaykge1xuXHRcdFx0XHRvYmplY3RfdXJsID0gZ2V0X29iamVjdF91cmwoYmxvYik7XG5cdFx0XHRcdHNhdmVfbGluay5ocmVmID0gb2JqZWN0X3VybDtcblx0XHRcdFx0c2F2ZV9saW5rLmRvd25sb2FkID0gbmFtZTtcblx0XHRcdFx0Y2xpY2soc2F2ZV9saW5rKTtcblx0XHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRcdFx0ZGlzcGF0Y2hfYWxsKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdC8vIE9iamVjdCBhbmQgd2ViIGZpbGVzeXN0ZW0gVVJMcyBoYXZlIGEgcHJvYmxlbSBzYXZpbmcgaW4gR29vZ2xlIENocm9tZSB3aGVuXG5cdFx0XHQvLyB2aWV3ZWQgaW4gYSB0YWIsIHNvIEkgZm9yY2Ugc2F2ZSB3aXRoIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVxuXHRcdFx0Ly8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9OTExNThcblx0XHRcdGlmICh2aWV3LmNocm9tZSAmJiB0eXBlICYmIHR5cGUgIT09IGZvcmNlX3NhdmVhYmxlX3R5cGUpIHtcblx0XHRcdFx0c2xpY2UgPSBibG9iLnNsaWNlIHx8IGJsb2Iud2Via2l0U2xpY2U7XG5cdFx0XHRcdGJsb2IgPSBzbGljZS5jYWxsKGJsb2IsIDAsIGJsb2Iuc2l6ZSwgZm9yY2Vfc2F2ZWFibGVfdHlwZSk7XG5cdFx0XHRcdGJsb2JfY2hhbmdlZCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHQvLyBTaW5jZSBJIGNhbid0IGJlIHN1cmUgdGhhdCB0aGUgZ3Vlc3NlZCBtZWRpYSB0eXBlIHdpbGwgdHJpZ2dlciBhIGRvd25sb2FkXG5cdFx0XHQvLyBpbiBXZWJLaXQsIEkgYXBwZW5kIC5kb3dubG9hZCB0byB0aGUgZmlsZW5hbWUuXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0NDBcblx0XHRcdGlmICh3ZWJraXRfcmVxX2ZzICYmIG5hbWUgIT09IFwiZG93bmxvYWRcIikge1xuXHRcdFx0XHRuYW1lICs9IFwiLmRvd25sb2FkXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZSA9PT0gZm9yY2Vfc2F2ZWFibGVfdHlwZSB8fCB3ZWJraXRfcmVxX2ZzKSB7XG5cdFx0XHRcdHRhcmdldF92aWV3ID0gdmlldztcblx0XHRcdH1cblx0XHRcdGlmICghcmVxX2ZzKSB7XG5cdFx0XHRcdGZzX2Vycm9yKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGZzX21pbl9zaXplICs9IGJsb2Iuc2l6ZTtcblx0XHRcdHJlcV9mcyh2aWV3LlRFTVBPUkFSWSwgZnNfbWluX3NpemUsIGFib3J0YWJsZShmdW5jdGlvbihmcykge1xuXHRcdFx0XHRmcy5yb290LmdldERpcmVjdG9yeShcInNhdmVkXCIsIGNyZWF0ZV9pZl9ub3RfZm91bmQsIGFib3J0YWJsZShmdW5jdGlvbihkaXIpIHtcblx0XHRcdFx0XHR2YXIgc2F2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0ZGlyLmdldEZpbGUobmFtZSwgY3JlYXRlX2lmX25vdF9mb3VuZCwgYWJvcnRhYmxlKGZ1bmN0aW9uKGZpbGUpIHtcblx0XHRcdFx0XHRcdFx0ZmlsZS5jcmVhdGVXcml0ZXIoYWJvcnRhYmxlKGZ1bmN0aW9uKHdyaXRlcikge1xuXHRcdFx0XHRcdFx0XHRcdHdyaXRlci5vbndyaXRlZW5kID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRhcmdldF92aWV3LmxvY2F0aW9uLmhyZWYgPSBmaWxlLnRvVVJMKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRkZWxldGlvbl9xdWV1ZS5wdXNoKGZpbGUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRcdFx0XHRcdFx0XHRcdGRpc3BhdGNoKGZpbGVzYXZlciwgXCJ3cml0ZWVuZFwiLCBldmVudCk7XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHR3cml0ZXIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGVycm9yID0gd3JpdGVyLmVycm9yO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVycm9yLmNvZGUgIT09IGVycm9yLkFCT1JUX0VSUikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRmc19lcnJvcigpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0XCJ3cml0ZXN0YXJ0IHByb2dyZXNzIHdyaXRlIGFib3J0XCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHdyaXRlcltcIm9uXCIgKyBldmVudF0gPSBmaWxlc2F2ZXJbXCJvblwiICsgZXZlbnRdO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdHdyaXRlci53cml0ZShibG9iKTtcblx0XHRcdFx0XHRcdFx0XHRmaWxlc2F2ZXIuYWJvcnQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHdyaXRlci5hYm9ydCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGZpbGVzYXZlci5yZWFkeVN0YXRlID0gZmlsZXNhdmVyLldSSVRJTkc7XG5cdFx0XHRcdFx0XHRcdH0pLCBmc19lcnJvcik7XG5cdFx0XHRcdFx0XHR9KSwgZnNfZXJyb3IpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0ZGlyLmdldEZpbGUobmFtZSwge2NyZWF0ZTogZmFsc2V9LCBhYm9ydGFibGUoZnVuY3Rpb24oZmlsZSkge1xuXHRcdFx0XHRcdFx0Ly8gZGVsZXRlIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHNcblx0XHRcdFx0XHRcdGZpbGUucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRzYXZlKCk7XG5cdFx0XHRcdFx0fSksIGFib3J0YWJsZShmdW5jdGlvbihleCkge1xuXHRcdFx0XHRcdFx0aWYgKGV4LmNvZGUgPT09IGV4Lk5PVF9GT1VORF9FUlIpIHtcblx0XHRcdFx0XHRcdFx0c2F2ZSgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0ZnNfZXJyb3IoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdH0pLCBmc19lcnJvcik7XG5cdFx0XHR9KSwgZnNfZXJyb3IpO1xuXHRcdH1cblx0XHQsIEZTX3Byb3RvID0gRmlsZVNhdmVyLnByb3RvdHlwZVxuXHRcdCwgc2F2ZUFzID0gZnVuY3Rpb24oYmxvYiwgbmFtZSkge1xuXHRcdFx0cmV0dXJuIG5ldyBGaWxlU2F2ZXIoYmxvYiwgbmFtZSk7XG5cdFx0fVxuXHQ7XG5cdEZTX3Byb3RvLmFib3J0ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGZpbGVzYXZlciA9IHRoaXM7XG5cdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRkaXNwYXRjaChmaWxlc2F2ZXIsIFwiYWJvcnRcIik7XG5cdH07XG5cdEZTX3Byb3RvLnJlYWR5U3RhdGUgPSBGU19wcm90by5JTklUID0gMDtcblx0RlNfcHJvdG8uV1JJVElORyA9IDE7XG5cdEZTX3Byb3RvLkRPTkUgPSAyO1xuXG5cdEZTX3Byb3RvLmVycm9yID1cblx0RlNfcHJvdG8ub253cml0ZXN0YXJ0ID1cblx0RlNfcHJvdG8ub25wcm9ncmVzcyA9XG5cdEZTX3Byb3RvLm9ud3JpdGUgPVxuXHRGU19wcm90by5vbmFib3J0ID1cblx0RlNfcHJvdG8ub25lcnJvciA9XG5cdEZTX3Byb3RvLm9ud3JpdGVlbmQgPVxuXHRcdG51bGw7XG5cblx0dmlldy5hZGRFdmVudExpc3RlbmVyKFwidW5sb2FkXCIsIHByb2Nlc3NfZGVsZXRpb25fcXVldWUsIGZhbHNlKTtcblx0c2F2ZUFzLnVubG9hZCA9IGZ1bmN0aW9uKCkge1xuXHRcdHByb2Nlc3NfZGVsZXRpb25fcXVldWUoKTtcblx0XHR2aWV3LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ1bmxvYWRcIiwgcHJvY2Vzc19kZWxldGlvbl9xdWV1ZSwgZmFsc2UpO1xuXHR9O1xuXHRyZXR1cm4gc2F2ZUFzO1xufShcblx0ICAgdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZlxuXHR8fCB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvd1xuXHR8fCB0aGlzLmNvbnRlbnRcbikpO1xuLy8gYHNlbGZgIGlzIHVuZGVmaW5lZCBpbiBGaXJlZm94IGZvciBBbmRyb2lkIGNvbnRlbnQgc2NyaXB0IGNvbnRleHRcbi8vIHdoaWxlIGB0aGlzYCBpcyBuc0lDb250ZW50RnJhbWVNZXNzYWdlTWFuYWdlclxuLy8gd2l0aCBhbiBhdHRyaWJ1dGUgYGNvbnRlbnRgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHdpbmRvd1xuXG5hbWREZWZpbmUgPSB3aW5kb3cuZGVmaW5lO1xuaWYoIHR5cGVvZiBhbWREZWZpbmUgPT09IFwidW5kZWZpbmVkXCIgJiYgKHR5cGVvZiB3aW5kb3cuYWxtb25kICE9PSBcInVuZGVmaW5lZFwiIFxuICAgICYmIFwiZGVmaW5lXCIgaW4gd2luZG93LmFsbW9uZCApKXtcbiAgYW1kRGVmaW5lID0gd2luZG93LmFsbW9uZC5kZWZpbmU7XG59XG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZSAhPT0gbnVsbCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNhdmVBcztcbn0gZWxzZSBpZiAoKHR5cGVvZiBhbWREZWZpbmUgIT09IFwidW5kZWZpbmVkXCIgJiYgYW1kRGVmaW5lICE9PSBudWxsKSAmJiAoYW1kRGVmaW5lLmFtZCAhPSBudWxsKSkge1xuICBhbWREZWZpbmUoXCJzYXZlQXNcIixbXSwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNhdmVBcztcbiAgfSk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3MsIGN1c3RvbURvY3VtZW50KSB7XG4gIHZhciBkb2MgPSBjdXN0b21Eb2N1bWVudCB8fCBkb2N1bWVudDtcbiAgaWYgKGRvYy5jcmVhdGVTdHlsZVNoZWV0KSB7XG4gICAgdmFyIHNoZWV0ID0gZG9jLmNyZWF0ZVN0eWxlU2hlZXQoKVxuICAgIHNoZWV0LmNzc1RleHQgPSBjc3M7XG4gICAgcmV0dXJuIHNoZWV0Lm93bmVyTm9kZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgaGVhZCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLFxuICAgICAgICBzdHlsZSA9IGRvYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuXG4gICAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG5cbiAgICBpZiAoc3R5bGUuc3R5bGVTaGVldCkge1xuICAgICAgc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gICAgfVxuXG4gICAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5ieVVybCA9IGZ1bmN0aW9uKHVybCkge1xuICBpZiAoZG9jdW1lbnQuY3JlYXRlU3R5bGVTaGVldCkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVTdHlsZVNoZWV0KHVybCkub3duZXJOb2RlO1xuICB9IGVsc2Uge1xuICAgIHZhciBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXSxcbiAgICAgICAgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcblxuICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnO1xuICAgIGxpbmsuaHJlZiA9IHVybDtcblxuICAgIGhlYWQuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgcmV0dXJuIGxpbms7XG4gIH1cbn07XG4iLCJ2YXIgVXRpbHMgPSB7fTtcblxuXG4vKlxuUmVtb3ZlIGFuIGVsZW1lbnQgYW5kIHByb3ZpZGUgYSBmdW5jdGlvbiB0aGF0IGluc2VydHMgaXQgaW50byBpdHMgb3JpZ2luYWwgcG9zaXRpb25cbmh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL2FydGljbGVzL2phdmFzY3JpcHQtZG9tXG5AcGFyYW0gZWxlbWVudCB7RWxlbWVudH0gVGhlIGVsZW1lbnQgdG8gYmUgdGVtcG9yYXJpbHkgcmVtb3ZlZFxuQHJldHVybiB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdGhhdCBpbnNlcnRzIHRoZSBlbGVtZW50IGludG8gaXRzIG9yaWdpbmFsIHBvc2l0aW9uXG4gKi9cblxuVXRpbHMucmVtb3ZlVG9JbnNlcnRMYXRlciA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgdmFyIG5leHRTaWJsaW5nLCBwYXJlbnROb2RlO1xuICBwYXJlbnROb2RlID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7XG4gIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5leHRTaWJsaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICB9XG4gIH07XG59O1xuXG5cbi8qXG5mYXN0ZXN0IHBvc3NpYmxlIHdheSB0byBkZXN0cm95IGFsbCBzdWIgbm9kZXMgKGFrYSBjaGlsZHMpXG5odHRwOi8vanNwZXJmLmNvbS9pbm5lcmh0bWwtdnMtcmVtb3ZlY2hpbGQvMTVcbkBwYXJhbSBlbGVtZW50IHtFbGVtZW50fSBUaGUgZWxlbWVudCBmb3Igd2hpY2ggYWxsIGNoaWxkcyBzaG91bGQgYmUgcmVtb3ZlZFxuICovXG5cblV0aWxzLnJlbW92ZUFsbENoaWxkcyA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgdmFyIGNvdW50O1xuICBjb3VudCA9IDA7XG4gIHdoaWxlIChlbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICBjb3VudCsrO1xuICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBVdGlscztcbiIsIi8qIVxuICogakJvbmUgdjEuMC4xOSAtIDIwMTQtMTAtMTIgLSBMaWJyYXJ5IGZvciBET00gbWFuaXB1bGF0aW9uXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2t1cHJpeWFuZW5rby9qYm9uZVxuICpcbiAqIENvcHlyaWdodCAyMDE0IEFsZXhleSBLdXByaXlhbmVua29cbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuXG4oZnVuY3Rpb24gKHdpbikge1xuXG52YXJcbi8vIGNhY2hlIHByZXZpb3VzIHZlcnNpb25zXG5fJCA9IHdpbi4kLFxuX2pCb25lID0gd2luLmpCb25lLFxuXG4vLyBRdWljayBtYXRjaCBhIHN0YW5kYWxvbmUgdGFnXG5ycXVpY2tTaW5nbGVUYWcgPSAvXjwoXFx3KylcXHMqXFwvPz4kLyxcblxuLy8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncbi8vIFByaW9yaXRpemUgI2lkIG92ZXIgPHRhZz4gdG8gYXZvaWQgWFNTIHZpYSBsb2NhdGlvbi5oYXNoXG5ycXVpY2tFeHByID0gL14oPzpbXiM8XSooPFtcXHdcXFddKz4pW14+XSokfCMoW1xcd1xcLV0qKSQpLyxcblxuLy8gQWxpYXMgZm9yIGZ1bmN0aW9uXG5zbGljZSA9IFtdLnNsaWNlLFxuc3BsaWNlID0gW10uc3BsaWNlLFxua2V5cyA9IE9iamVjdC5rZXlzLFxuXG4vLyBBbGlhcyBmb3IgZ2xvYmFsIHZhcmlhYmxlc1xuZG9jID0gZG9jdW1lbnQsXG5cbmlzU3RyaW5nID0gZnVuY3Rpb24oZWwpIHtcbiAgICByZXR1cm4gdHlwZW9mIGVsID09PSBcInN0cmluZ1wiO1xufSxcbmlzT2JqZWN0ID0gZnVuY3Rpb24oZWwpIHtcbiAgICByZXR1cm4gZWwgaW5zdGFuY2VvZiBPYmplY3Q7XG59LFxuaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgdmFyIGdldFR5cGUgPSB7fTtcbiAgICByZXR1cm4gZWwgJiYgZ2V0VHlwZS50b1N0cmluZy5jYWxsKGVsKSA9PT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiO1xufSxcbmlzQXJyYXkgPSBmdW5jdGlvbihlbCkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGVsKTtcbn0sXG5qQm9uZSA9IGZ1bmN0aW9uKGVsZW1lbnQsIGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IGZuLmluaXQoZWxlbWVudCwgZGF0YSk7XG59LFxuZm47XG5cbi8vIHNldCBwcmV2aW91cyB2YWx1ZXMgYW5kIHJldHVybiB0aGUgaW5zdGFuY2UgdXBvbiBjYWxsaW5nIHRoZSBuby1jb25mbGljdCBtb2RlXG5qQm9uZS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgd2luLiQgPSBfJDtcbiAgICB3aW4uakJvbmUgPSBfakJvbmU7XG5cbiAgICByZXR1cm4gakJvbmU7XG59O1xuXG5mbiA9IGpCb25lLmZuID0gakJvbmUucHJvdG90eXBlID0ge1xuICAgIGluaXQ6IGZ1bmN0aW9uKGVsZW1lbnQsIGRhdGEpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzLCB0YWcsIHdyYXBlciwgZnJhZ21lbnQ7XG5cbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTdHJpbmcoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBzaW5nbGUgRE9NIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICh0YWcgPSBycXVpY2tTaW5nbGVUYWcuZXhlYyhlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHRoaXNbMF0gPSBkb2MuY3JlYXRlRWxlbWVudCh0YWdbMV0pO1xuICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gMTtcblxuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHIoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDcmVhdGUgRE9NIGNvbGxlY3Rpb25cbiAgICAgICAgICAgIGlmICgodGFnID0gcnF1aWNrRXhwci5leGVjKGVsZW1lbnQpKSAmJiB0YWdbMV0pIHtcbiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IGRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgICAgICAgICAgd3JhcGVyID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgd3JhcGVyLmlubmVySFRNTCA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHdyYXBlci5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQod3JhcGVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbGVtZW50cyA9IHNsaWNlLmNhbGwoZnJhZ21lbnQuY2hpbGROb2Rlcyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gakJvbmUubWVyZ2UodGhpcywgZWxlbWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRmluZCBET00gZWxlbWVudHMgd2l0aCBxdWVyeVNlbGVjdG9yQWxsXG4gICAgICAgICAgICBpZiAoakJvbmUuaXNFbGVtZW50KGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpCb25lKGRhdGEpLmZpbmQoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudHMgPSBkb2MucXVlcnlTZWxlY3RvckFsbChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBqQm9uZS5tZXJnZSh0aGlzLCBlbGVtZW50cyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gV3JhcCBET01FbGVtZW50XG4gICAgICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlKSB7XG4gICAgICAgICAgICB0aGlzWzBdID0gZWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gMTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUnVuIGZ1bmN0aW9uXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJldHVybiBqQm9uZSBlbGVtZW50IGFzIGlzXG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgakJvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIGVsZW1lbnQgd3JhcHBlZCBieSBqQm9uZVxuICAgICAgICByZXR1cm4gakJvbmUubWFrZUFycmF5KGVsZW1lbnQsIHRoaXMpO1xuICAgIH0sXG5cbiAgICBwb3A6IFtdLnBvcCxcbiAgICBwdXNoOiBbXS5wdXNoLFxuICAgIHJldmVyc2U6IFtdLnJldmVyc2UsXG4gICAgc2hpZnQ6IFtdLnNoaWZ0LFxuICAgIHNvcnQ6IFtdLnNvcnQsXG4gICAgc3BsaWNlOiBbXS5zcGxpY2UsXG4gICAgc2xpY2U6IFtdLnNsaWNlLFxuICAgIGluZGV4T2Y6IFtdLmluZGV4T2YsXG4gICAgZm9yRWFjaDogW10uZm9yRWFjaCxcbiAgICB1bnNoaWZ0OiBbXS51bnNoaWZ0LFxuICAgIGNvbmNhdDogW10uY29uY2F0LFxuICAgIGpvaW46IFtdLmpvaW4sXG4gICAgZXZlcnk6IFtdLmV2ZXJ5LFxuICAgIHNvbWU6IFtdLnNvbWUsXG4gICAgZmlsdGVyOiBbXS5maWx0ZXIsXG4gICAgbWFwOiBbXS5tYXAsXG4gICAgcmVkdWNlOiBbXS5yZWR1Y2UsXG4gICAgcmVkdWNlUmlnaHQ6IFtdLnJlZHVjZVJpZ2h0LFxuICAgIGxlbmd0aDogMFxufTtcblxuZm4uY29uc3RydWN0b3IgPSBqQm9uZTtcblxuZm4uaW5pdC5wcm90b3R5cGUgPSBmbjtcblxuakJvbmUuc2V0SWQgPSBmdW5jdGlvbihlbCkge1xuICAgIHZhciBqaWQgPSBlbC5qaWQ7XG5cbiAgICBpZiAoZWwgPT09IHdpbikge1xuICAgICAgICBqaWQgPSBcIndpbmRvd1wiO1xuICAgIH0gZWxzZSBpZiAoZWwuamlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZWwuamlkID0gamlkID0gKytqQm9uZS5fY2FjaGUuamlkO1xuICAgIH1cblxuICAgIGlmICghakJvbmUuX2NhY2hlLmV2ZW50c1tqaWRdKSB7XG4gICAgICAgIGpCb25lLl9jYWNoZS5ldmVudHNbamlkXSA9IHt9O1xuICAgIH1cbn07XG5cbmpCb25lLmdldERhdGEgPSBmdW5jdGlvbihlbCkge1xuICAgIGVsID0gZWwgaW5zdGFuY2VvZiBqQm9uZSA/IGVsWzBdIDogZWw7XG5cbiAgICB2YXIgamlkID0gZWwgPT09IHdpbiA/IFwid2luZG93XCIgOiBlbC5qaWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBqaWQ6IGppZCxcbiAgICAgICAgZXZlbnRzOiBqQm9uZS5fY2FjaGUuZXZlbnRzW2ppZF1cbiAgICB9O1xufTtcblxuakJvbmUuaXNFbGVtZW50ID0gZnVuY3Rpb24oZWwpIHtcbiAgICByZXR1cm4gZWwgJiYgZWwgaW5zdGFuY2VvZiBqQm9uZSB8fCBlbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8IGlzU3RyaW5nKGVsKTtcbn07XG5cbmpCb25lLl9jYWNoZSA9IHtcbiAgICBldmVudHM6IHt9LFxuICAgIGppZDogMFxufTtcblxuZnVuY3Rpb24gaXNBcnJheWxpa2Uob2JqKSB7XG4gICAgdmFyIGxlbmd0aCA9IG9iai5sZW5ndGgsXG4gICAgICAgIHR5cGUgPSB0eXBlb2Ygb2JqO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24odHlwZSkgfHwgb2JqID09PSB3aW4pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChvYmoubm9kZVR5cGUgPT09IDEgJiYgbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBpc0FycmF5KHR5cGUpIHx8IGxlbmd0aCA9PT0gMCB8fFxuICAgICAgICB0eXBlb2YgbGVuZ3RoID09PSBcIm51bWJlclwiICYmIGxlbmd0aCA+IDAgJiYgKGxlbmd0aCAtIDEpIGluIG9iajtcbn1cblxuakJvbmUubWVyZ2UgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKSB7XG4gICAgdmFyIGwgPSBzZWNvbmQubGVuZ3RoLFxuICAgICAgICBpID0gZmlyc3QubGVuZ3RoLFxuICAgICAgICBqID0gMDtcblxuICAgIHdoaWxlIChqIDwgbCkge1xuICAgICAgICBmaXJzdFtpKytdID0gc2Vjb25kW2orK107XG4gICAgfVxuXG4gICAgZmlyc3QubGVuZ3RoID0gaTtcblxuICAgIHJldHVybiBmaXJzdDtcbn07XG5cbmpCb25lLmNvbnRhaW5zID0gZnVuY3Rpb24oY29udGFpbmVyLCBjb250YWluZWQpIHtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgY29udGFpbmVyLnJldmVyc2UoKS5zb21lKGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgIGlmIChlbC5jb250YWlucyhjb250YWluZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID0gZWw7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5qQm9uZS5leHRlbmQgPSBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICB2YXIgaywga2wsIGksIHRnO1xuXG4gICAgc3BsaWNlLmNhbGwoYXJndW1lbnRzLCAxKS5mb3JFYWNoKGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgayA9IGtleXMob2JqZWN0KTtcbiAgICAgICAga2wgPSBrLmxlbmd0aDtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIHRnID0gdGFyZ2V0OyAvL2NhY2hpbmcgdGFyZ2V0IGZvciBwZXJmIGltcHJvdmVtZW50XG5cbiAgICAgICAgZm9yICg7IGkgPCBrbDsgaSsrKSB7XG4gICAgICAgICAgICB0Z1trW2ldXSA9IG9iamVjdFtrW2ldXTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRhcmdldDtcbn07XG5cbmpCb25lLm1ha2VBcnJheSA9IGZ1bmN0aW9uKGFyciwgcmVzdWx0cykge1xuICAgIHZhciByZXQgPSByZXN1bHRzIHx8IFtdO1xuXG4gICAgaWYgKGFyciAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNBcnJheWxpa2UoYXJyKSkge1xuICAgICAgICAgICAgakJvbmUubWVyZ2UocmV0LCBpc1N0cmluZyhhcnIpID8gW2Fycl0gOiBhcnIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0LnB1c2goYXJyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBCb25lRXZlbnQoZSwgZGF0YSkge1xuICAgIHZhciBrZXksIHNldHRlcjtcblxuICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IGU7XG5cbiAgICBzZXR0ZXIgPSBmdW5jdGlvbihrZXksIGUpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJwcmV2ZW50RGVmYXVsdFwiKSB7XG4gICAgICAgICAgICB0aGlzW2tleV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBlW2tleV0oKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihlW2tleV0pKSB7XG4gICAgICAgICAgICB0aGlzW2tleV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZVtrZXldKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpc1trZXldID0gZVtrZXldO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoa2V5IGluIGUpIHtcbiAgICAgICAgaWYgKGVba2V5XSB8fCB0eXBlb2YgZVtrZXldID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHNldHRlci5jYWxsKHRoaXMsIGtleSwgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBqQm9uZS5leHRlbmQodGhpcywgZGF0YSk7XG59XG5cbmpCb25lLkV2ZW50ID0gZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHtcbiAgICB2YXIgbmFtZXNwYWNlLCBldmVudFR5cGU7XG5cbiAgICBpZiAoZXZlbnQudHlwZSAmJiAhZGF0YSkge1xuICAgICAgICBkYXRhID0gZXZlbnQ7XG4gICAgICAgIGV2ZW50ID0gZXZlbnQudHlwZTtcbiAgICB9XG5cbiAgICBuYW1lc3BhY2UgPSBldmVudC5zcGxpdChcIi5cIikuc3BsaWNlKDEpLmpvaW4oXCIuXCIpO1xuICAgIGV2ZW50VHlwZSA9IGV2ZW50LnNwbGl0KFwiLlwiKVswXTtcblxuICAgIGV2ZW50ID0gZG9jLmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7XG4gICAgZXZlbnQuaW5pdEV2ZW50KGV2ZW50VHlwZSwgdHJ1ZSwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gakJvbmUuZXh0ZW5kKGV2ZW50LCB7XG4gICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLFxuICAgICAgICBpc0RlZmF1bHRQcmV2ZW50ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7XG4gICAgICAgIH1cbiAgICB9LCBkYXRhKTtcbn07XG5cbmZuLm9uID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBjYWxsYmFjaywgdGFyZ2V0LCBuYW1lc3BhY2UsIGZuLCBldmVudHMsIGV2ZW50VHlwZSwgZXhwZWN0ZWRUYXJnZXQsIGFkZExpc3RlbmVyO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNhbGxiYWNrID0gYXJnc1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSBhcmdzWzFdO1xuICAgICAgICBjYWxsYmFjayA9IGFyZ3NbMl07XG4gICAgfVxuXG4gICAgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICBqQm9uZS5zZXRJZChlbCk7XG4gICAgICAgIGV2ZW50cyA9IGpCb25lLmdldERhdGEoZWwpLmV2ZW50cztcbiAgICAgICAgZXZlbnQuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZSA9IGV2ZW50LnNwbGl0KFwiLlwiKVswXTtcbiAgICAgICAgICAgIG5hbWVzcGFjZSA9IGV2ZW50LnNwbGl0KFwiLlwiKS5zcGxpY2UoMSkuam9pbihcIi5cIik7XG4gICAgICAgICAgICBldmVudHNbZXZlbnRUeXBlXSA9IGV2ZW50c1tldmVudFR5cGVdIHx8IFtdO1xuXG4gICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5uYW1lc3BhY2UgJiYgZS5uYW1lc3BhY2UgIT09IG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWRUYXJnZXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwoZWwsIGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAofmpCb25lKGVsKS5maW5kKHRhcmdldCkuaW5kZXhPZihlLnRhcmdldCkgfHwgKGV4cGVjdGVkVGFyZ2V0ID0gakJvbmUuY29udGFpbnMoakJvbmUoZWwpLmZpbmQodGFyZ2V0KSwgZS50YXJnZXQpKSkge1xuICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFRhcmdldCA9IGV4cGVjdGVkVGFyZ2V0IHx8IGUudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBlID0gbmV3IEJvbmVFdmVudChlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0OiBleHBlY3RlZFRhcmdldFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGV4cGVjdGVkVGFyZ2V0LCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBldmVudHNbZXZlbnRUeXBlXS5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgICBmbjogZm4sXG4gICAgICAgICAgICAgICAgb3JpZ2luZm46IGNhbGxiYWNrXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lciAmJiBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgZm4sIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWRkTGlzdGVuZXIodGhpc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi5vbmUgPSBmdW5jdGlvbihldmVudCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGNhbGxiYWNrLCB0YXJnZXQsIGFkZExpc3RlbmVyO1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGNhbGxiYWNrID0gYXJnc1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSBhcmdzWzFdLCBjYWxsYmFjayA9IGFyZ3NbMl07XG4gICAgfVxuXG4gICAgYWRkTGlzdGVuZXIgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICBldmVudC5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGpCb25lKGVsKS5vZmYoZXZlbnQsIGZuKTtcbiAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKGVsLCBlKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgakJvbmUoZWwpLm9uKGV2ZW50LCBmbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGpCb25lKGVsKS5vbihldmVudCwgdGFyZ2V0LCBmbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFkZExpc3RlbmVyKHRoaXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4udHJpZ2dlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgdmFyIGV2ZW50cyA9IFtdLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGRpc3BhdGNoRXZlbnRzO1xuXG4gICAgaWYgKCFldmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmcoZXZlbnQpKSB7XG4gICAgICAgIGV2ZW50cyA9IGV2ZW50LnNwbGl0KFwiIFwiKS5tYXAoZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBqQm9uZS5FdmVudChldmVudCk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2ZW50ID0gZXZlbnQgaW5zdGFuY2VvZiBFdmVudCA/IGV2ZW50IDogakJvbmUuRXZlbnQoZXZlbnQpO1xuICAgICAgICBldmVudHMgPSBbZXZlbnRdO1xuICAgIH1cblxuICAgIGRpc3BhdGNoRXZlbnRzID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICghZXZlbnQudHlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudCAmJiBlbC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGlzcGF0Y2hFdmVudHModGhpc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi5vZmYgPSBmdW5jdGlvbihldmVudCwgZm4pIHtcbiAgICB2YXIgaSA9IDAsXG4gICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoLFxuICAgICAgICByZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50cywgZXZlbnRUeXBlLCBpbmRleCwgZWwsIGUpIHtcbiAgICAgICAgICAgIHZhciBjYWxsYmFjaztcblxuICAgICAgICAgICAgLy8gZ2V0IGNhbGxiYWNrXG4gICAgICAgICAgICBpZiAoKGZuICYmIGUub3JpZ2luZm4gPT09IGZuKSB8fCAhZm4pIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGUuZm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChldmVudHNbZXZlbnRUeXBlXVtpbmRleF0uZm4gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrKTtcblxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBoYW5kbGVyIGZyb20gY2FjaGVcbiAgICAgICAgICAgICAgICBqQm9uZS5fY2FjaGUuZXZlbnRzW2pCb25lLmdldERhdGEoZWwpLmppZF1bZXZlbnRUeXBlXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBldmVudHMsIG5hbWVzcGFjZSwgcmVtb3ZlTGlzdGVuZXJzLCBldmVudFR5cGU7XG5cbiAgICByZW1vdmVMaXN0ZW5lcnMgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICB2YXIgbCwgZXZlbnRzQnlUeXBlLCBlO1xuXG4gICAgICAgIGV2ZW50cyA9IGpCb25lLmdldERhdGEoZWwpLmV2ZW50cztcblxuICAgICAgICBpZiAoIWV2ZW50cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBldmVudHNcbiAgICAgICAgaWYgKCFldmVudCAmJiBldmVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXlzKGV2ZW50cykuZm9yRWFjaChmdW5jdGlvbihldmVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICBldmVudHNCeVR5cGUgPSBldmVudHNbZXZlbnRUeXBlXTtcbiAgICAgICAgICAgICAgICBsID0gZXZlbnRzQnlUeXBlLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIHdoaWxlKGwtLSkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihldmVudHMsIGV2ZW50VHlwZSwgbCwgZWwsIGV2ZW50c0J5VHlwZVtsXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgZXZlbnRUeXBlID0gZXZlbnQuc3BsaXQoXCIuXCIpWzBdO1xuICAgICAgICAgICAgbmFtZXNwYWNlID0gZXZlbnQuc3BsaXQoXCIuXCIpLnNwbGljZSgxKS5qb2luKFwiLlwiKTtcblxuICAgICAgICAgICAgLy8gcmVtb3ZlIG5hbWVkIGV2ZW50c1xuICAgICAgICAgICAgaWYgKGV2ZW50c1tldmVudFR5cGVdKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRzQnlUeXBlID0gZXZlbnRzW2V2ZW50VHlwZV07XG4gICAgICAgICAgICAgICAgbCA9IGV2ZW50c0J5VHlwZS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICB3aGlsZShsLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IGV2ZW50c0J5VHlwZVtsXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lc3BhY2UgfHwgKG5hbWVzcGFjZSAmJiBlLm5hbWVzcGFjZSA9PT0gbmFtZXNwYWNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnRzLCBldmVudFR5cGUsIGwsIGVsLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgbmFtZXNwYWNlZCBldmVudHNcbiAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgICAgICAgICAgIGtleXMoZXZlbnRzKS5mb3JFYWNoKGZ1bmN0aW9uKGV2ZW50VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudHNCeVR5cGUgPSBldmVudHNbZXZlbnRUeXBlXTtcbiAgICAgICAgICAgICAgICAgICAgbCA9IGV2ZW50c0J5VHlwZS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUobC0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gZXZlbnRzQnlUeXBlW2xdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUubmFtZXNwYWNlLnNwbGl0KFwiLlwiKVswXSA9PT0gbmFtZXNwYWNlLnNwbGl0KFwiLlwiKVswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50cywgZXZlbnRUeXBlLCBsLCBlbCwgZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVtb3ZlTGlzdGVuZXJzKHRoaXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4uZmluZCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXSxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoLFxuICAgICAgICBmaW5kZXIgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZWwucXVlcnlTZWxlY3RvckFsbCkpIHtcbiAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwoZWwucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvciksIGZ1bmN0aW9uKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChmb3VuZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZpbmRlcih0aGlzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gakJvbmUocmVzdWx0cyk7XG59O1xuXG5mbi5nZXQgPSBmdW5jdGlvbihpbmRleCkge1xuICAgIHJldHVybiB0aGlzW2luZGV4XTtcbn07XG5cbmZuLmVxID0gZnVuY3Rpb24oaW5kZXgpIHtcbiAgICByZXR1cm4gakJvbmUodGhpc1tpbmRleF0pO1xufTtcblxuZm4ucGFyZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXSxcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG5cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghfnJlc3VsdHMuaW5kZXhPZihwYXJlbnQgPSB0aGlzW2ldLnBhcmVudEVsZW1lbnQpICYmIHBhcmVudCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHBhcmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gakJvbmUocmVzdWx0cyk7XG59O1xuXG5mbi50b0FycmF5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNsaWNlLmNhbGwodGhpcyk7XG59O1xuXG5mbi5pcyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgcmV0dXJuIHRoaXMuc29tZShmdW5jdGlvbihlbCkge1xuICAgICAgICByZXR1cm4gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBhcmdzWzBdO1xuICAgIH0pO1xufTtcblxuZm4uaGFzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICByZXR1cm4gdGhpcy5zb21lKGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgIHJldHVybiBlbC5xdWVyeVNlbGVjdG9yQWxsKGFyZ3NbMF0pLmxlbmd0aDtcbiAgICB9KTtcbn07XG5cbmZuLmF0dHIgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aCxcbiAgICAgICAgc2V0dGVyO1xuXG4gICAgaWYgKGlzU3RyaW5nKGtleSkgJiYgYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbMF0gJiYgdGhpc1swXS5nZXRBdHRyaWJ1dGUoa2V5KTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgc2V0dGVyID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgICAgc2V0dGVyID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgICAgIGtleXMoa2V5KS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUobmFtZSwga2V5W25hbWVdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2V0dGVyKHRoaXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4ucmVtb3ZlQXR0ciA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG5cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXNbaV0ucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi52YWwgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpc1swXSAmJiB0aGlzWzBdLnZhbHVlO1xuICAgIH1cblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpc1tpXS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4uY3NzID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIHNldHRlcjtcblxuICAgIC8vIEdldCBhdHRyaWJ1dGVcbiAgICBpZiAoaXNTdHJpbmcoa2V5KSAmJiBhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGhpc1swXSAmJiB3aW4uZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzWzBdKVtrZXldO1xuICAgIH1cblxuICAgIC8vIFNldCBhdHRyaWJ1dGVzXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHNldHRlciA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgICBlbC5zdHlsZVtrZXldID0gdmFsdWU7XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChpc09iamVjdChrZXkpKSB7XG4gICAgICAgIHNldHRlciA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgICBrZXlzKGtleSkuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgICAgICAgZWwuc3R5bGVbbmFtZV0gPSBrZXlbbmFtZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNldHRlcih0aGlzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbmZuLmRhdGEgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsIGRhdGEgPSB7fSxcbiAgICAgICAgaSA9IDAsXG4gICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoLFxuICAgICAgICBzZXR0ZXIsXG4gICAgICAgIHNldFZhbHVlID0gZnVuY3Rpb24oZWwsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBlbC5qZGF0YSA9IGVsLmpkYXRhIHx8IHt9O1xuICAgICAgICAgICAgICAgIGVsLmpkYXRhW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWwuZGF0YXNldFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IFwiZmFsc2VcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgLy8gR2V0IGFsbCBkYXRhXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXNbMF0uamRhdGEgJiYgKGRhdGEgPSB0aGlzWzBdLmpkYXRhKTtcblxuICAgICAgICBrZXlzKHRoaXNbMF0uZGF0YXNldCkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIGRhdGFba2V5XSA9IGdldFZhbHVlKHRoaXNbMF0uZGF0YXNldFtrZXldKTtcbiAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIC8vIEdldCBkYXRhIGJ5IG5hbWVcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgaXNTdHJpbmcoa2V5KSkge1xuICAgICAgICByZXR1cm4gdGhpc1swXSAmJiBnZXRWYWx1ZSh0aGlzWzBdLmRhdGFzZXRba2V5XSB8fCB0aGlzWzBdLmpkYXRhICYmIHRoaXNbMF0uamRhdGFba2V5XSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRhdGFcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgaXNPYmplY3Qoa2V5KSkge1xuICAgICAgICBzZXR0ZXIgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAga2V5cyhrZXkpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgICAgICAgIHNldFZhbHVlKGVsLCBuYW1lLCBrZXlbbmFtZV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICBzZXR0ZXIgPSBmdW5jdGlvbihlbCkge1xuICAgICAgICAgICAgc2V0VmFsdWUoZWwsIGtleSwgdmFsdWUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2V0dGVyKHRoaXNbaV0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4ucmVtb3ZlRGF0YSA9IGZ1bmN0aW9uKGtleSkge1xuICAgIHZhciBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGpkYXRhLCBkYXRhc2V0O1xuXG4gICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBqZGF0YSA9IHRoaXNbaV0uamRhdGE7XG4gICAgICAgIGRhdGFzZXQgPSB0aGlzW2ldLmRhdGFzZXQ7XG5cbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgamRhdGEgJiYgamRhdGFba2V5XSAmJiBkZWxldGUgamRhdGFba2V5XTtcbiAgICAgICAgICAgIGRlbGV0ZSBkYXRhc2V0W2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGtleSBpbiBqZGF0YSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBqZGF0YVtrZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGtleSBpbiBkYXRhc2V0KSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGFzZXRba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4uaHRtbCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGVsO1xuXG4gICAgLy8gYWRkIEhUTUwgaW50byBlbGVtZW50c1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKHZhbHVlKTtcbiAgICB9XG4gICAgLy8gZ2V0IEhUTUwgZnJvbSBlbGVtZW50XG4gICAgZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDAgJiYgKGVsID0gdGhpc1swXSkpIHtcbiAgICAgICAgcmV0dXJuIGVsLmlubmVySFRNTDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbmZuLmFwcGVuZCA9IGZ1bmN0aW9uKGFwcGVuZGVkKSB7XG4gICAgdmFyIGkgPSAwLFxuICAgICAgICBsZW5ndGggPSB0aGlzLmxlbmd0aCxcbiAgICAgICAgc2V0dGVyO1xuXG4gICAgLy8gY3JlYXRlIGpCb25lIG9iamVjdCBhbmQgdGhlbiBhcHBlbmRcbiAgICBpZiAoaXNTdHJpbmcoYXBwZW5kZWQpICYmIHJxdWlja0V4cHIuZXhlYyhhcHBlbmRlZCkpIHtcbiAgICAgICAgYXBwZW5kZWQgPSBqQm9uZShhcHBlbmRlZCk7XG4gICAgfVxuICAgIC8vIGNyZWF0ZSB0ZXh0IG5vZGUgZm9yIGluc2VydGluZ1xuICAgIGVsc2UgaWYgKCFpc09iamVjdChhcHBlbmRlZCkpIHtcbiAgICAgICAgYXBwZW5kZWQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhcHBlbmRlZCk7XG4gICAgfVxuXG4gICAgYXBwZW5kZWQgPSBhcHBlbmRlZCBpbnN0YW5jZW9mIGpCb25lID8gYXBwZW5kZWQgOiBqQm9uZShhcHBlbmRlZCk7XG5cbiAgICBzZXR0ZXIgPSBmdW5jdGlvbihlbCwgaSkge1xuICAgICAgICBhcHBlbmRlZC5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQobm9kZS5jbG9uZU5vZGUoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBzZXR0ZXIodGhpc1tpXSwgaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5mbi5hcHBlbmRUbyA9IGZ1bmN0aW9uKHRvKSB7XG4gICAgakJvbmUodG8pLmFwcGVuZCh0aGlzKTtcblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuZm4uZW1wdHkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaSA9IDAsXG4gICAgICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoLFxuICAgICAgICBlbDtcblxuICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWwgPSB0aGlzW2ldO1xuXG4gICAgICAgIHdoaWxlIChlbC5sYXN0Q2hpbGQpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUNoaWxkKGVsLmxhc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbn07XG5cbmZuLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpID0gMCxcbiAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGgsXG4gICAgICAgIGVsO1xuXG4gICAgLy8gcmVtb3ZlIGFsbCBsaXN0bmVyc1xuICAgIHRoaXMub2ZmKCk7XG5cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGVsID0gdGhpc1tpXTtcblxuICAgICAgICAvLyByZW1vdmUgZGF0YSBhbmQgbm9kZXNcbiAgICAgICAgZGVsZXRlIGVsLmpkYXRhO1xuICAgICAgICBlbC5wYXJlbnROb2RlICYmIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xufTtcblxuaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgbW9kdWxlICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xuICAgIC8vIEV4cG9zZSBqQm9uZSBhcyBtb2R1bGUuZXhwb3J0cyBpbiBsb2FkZXJzIHRoYXQgaW1wbGVtZW50IHRoZSBOb2RlXG4gICAgLy8gbW9kdWxlIHBhdHRlcm4gKGluY2x1ZGluZyBicm93c2VyaWZ5KS4gRG8gbm90IGNyZWF0ZSB0aGUgZ2xvYmFsLCBzaW5jZVxuICAgIC8vIHRoZSB1c2VyIHdpbGwgYmUgc3RvcmluZyBpdCB0aGVtc2VsdmVzIGxvY2FsbHksIGFuZCBnbG9iYWxzIGFyZSBmcm93bmVkXG4gICAgLy8gdXBvbiBpbiB0aGUgTm9kZSBtb2R1bGUgd29ybGQuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBqQm9uZTtcbn1cbi8vIFJlZ2lzdGVyIGFzIGEgQU1EIG1vZHVsZVxuZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBqQm9uZTtcbiAgICB9KTtcblxuICAgIHdpbi5qQm9uZSA9IHdpbi4kID0gakJvbmU7XG59IGVsc2UgaWYgKHR5cGVvZiB3aW4gPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHdpbi5kb2N1bWVudCA9PT0gXCJvYmplY3RcIikge1xuICAgIHdpbi5qQm9uZSA9IHdpbi4kID0gakJvbmU7XG59XG5cbn0od2luZG93KSk7XG4iLCJ2YXIgTW91c2U7XG5cbm1vZHVsZS5leHBvcnRzID0gTW91c2UgPSB7XG4gIHJlbDogZnVuY3Rpb24oZSkge1xuICAgIHZhciBtb3VzZVgsIG1vdXNlWSwgcmVjdCwgdGFyZ2V0O1xuICAgIG1vdXNlWCA9IGUub2Zmc2V0WDtcbiAgICBtb3VzZVkgPSBlLm9mZnNldFk7XG4gICAgaWYgKG1vdXNlWCA9PSBudWxsKSB7XG4gICAgICByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGFyZ2V0ID0gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50O1xuICAgICAgaWYgKG1vdXNlWCA9PSBudWxsKSB7XG4gICAgICAgIG1vdXNlWCA9IGUuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICAgICAgbW91c2VZID0gZS5jbGllbnRZIC0gcmVjdC50b3A7XG4gICAgICB9XG4gICAgICBpZiAobW91c2VYID09IG51bGwpIHtcbiAgICAgICAgbW91c2VYID0gZS5wYWdlWCAtIHRhcmdldC5vZmZzZXRMZWZ0O1xuICAgICAgICBtb3VzZVkgPSBlLnBhZ2VZIC0gdGFyZ2V0Lm9mZnNldFRvcDtcbiAgICAgIH1cbiAgICAgIGlmIChtb3VzZVggPT0gbnVsbCkge1xuICAgICAgICBjb25zb2xlLmxvZyhlLCBcIm5vIG1vdXNlIGV2ZW50IGRlZmluZWQuIHlvdXIgYnJvd3NlciBzdWNrc1wiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW21vdXNlWCwgbW91c2VZXTtcbiAgfSxcbiAgYWJzOiBmdW5jdGlvbihlKSB7XG4gICAgdmFyIG1vdXNlWCwgbW91c2VZO1xuICAgIG1vdXNlWCA9IGUucGFnZVg7XG4gICAgbW91c2VZID0gZS5wYWdlWTtcbiAgICBpZiAobW91c2VYID09IG51bGwpIHtcbiAgICAgIG1vdXNlWCA9IGUubGF5ZXJYO1xuICAgICAgbW91c2VZID0gZS5sYXllclk7XG4gICAgfVxuICAgIGlmIChtb3VzZVggPT0gbnVsbCkge1xuICAgICAgbW91c2VYID0gZS5jbGllbnRYO1xuICAgICAgbW91c2VZID0gZS5jbGllbnRZO1xuICAgIH1cbiAgICBpZiAobW91c2VYID09IG51bGwpIHtcbiAgICAgIG1vdXNlWCA9IGUueDtcbiAgICAgIG1vdXNlWSA9IGUueTtcbiAgICB9XG4gICAgcmV0dXJuIFttb3VzZVgsIG1vdXNlWV07XG4gIH0sXG4gIHdoZWVsRGVsdGE6IGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZGVsdGEsIGRpcjtcbiAgICBkZWx0YSA9IFtlLmRlbHRhWCwgZS5kZWx0YVldO1xuICAgIGlmIChkZWx0YVswXSA9PSBudWxsKSB7XG4gICAgICBkaXIgPSBNYXRoLmZsb29yKGUuZGV0YWlsIC8gMyk7XG4gICAgICBkZWx0YSA9IFswLCBlLm1vek1vdmVtZW50WCAqIGRpcl07XG4gICAgfVxuICAgIHJldHVybiBkZWx0YTtcbiAgfVxufTtcbiIsInZhciB3aW5kb3cgPSByZXF1aXJlKFwiZ2xvYmFsL3dpbmRvd1wiKVxudmFyIG9uY2UgPSByZXF1aXJlKFwib25jZVwiKVxudmFyIHBhcnNlSGVhZGVycyA9IHJlcXVpcmUoJ3BhcnNlLWhlYWRlcnMnKVxuXG52YXIgbWVzc2FnZXMgPSB7XG4gICAgXCIwXCI6IFwiSW50ZXJuYWwgWE1MSHR0cFJlcXVlc3QgRXJyb3JcIixcbiAgICBcIjRcIjogXCI0eHggQ2xpZW50IEVycm9yXCIsXG4gICAgXCI1XCI6IFwiNXh4IFNlcnZlciBFcnJvclwiXG59XG5cbnZhciBYSFIgPSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QgfHwgbm9vcFxudmFyIFhEUiA9IFwid2l0aENyZWRlbnRpYWxzXCIgaW4gKG5ldyBYSFIoKSkgPyBYSFIgOiB3aW5kb3cuWERvbWFpblJlcXVlc3RcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVYSFJcblxuZnVuY3Rpb24gY3JlYXRlWEhSKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7IHVyaTogb3B0aW9ucyB9XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgICBjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2spXG5cbiAgICB2YXIgeGhyID0gb3B0aW9ucy54aHIgfHwgbnVsbFxuXG4gICAgaWYgKCF4aHIpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY29ycyB8fCBvcHRpb25zLnVzZVhEUikge1xuICAgICAgICAgICAgeGhyID0gbmV3IFhEUigpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgeGhyID0gbmV3IFhIUigpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdXJpID0geGhyLnVybCA9IG9wdGlvbnMudXJpIHx8IG9wdGlvbnMudXJsXG4gICAgdmFyIG1ldGhvZCA9IHhoci5tZXRob2QgPSBvcHRpb25zLm1ldGhvZCB8fCBcIkdFVFwiXG4gICAgdmFyIGJvZHkgPSBvcHRpb25zLmJvZHkgfHwgb3B0aW9ucy5kYXRhXG4gICAgdmFyIGhlYWRlcnMgPSB4aHIuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycyB8fCB7fVxuICAgIHZhciBzeW5jID0gISFvcHRpb25zLnN5bmNcbiAgICB2YXIgaXNKc29uID0gZmFsc2VcbiAgICB2YXIga2V5XG4gICAgdmFyIGxvYWQgPSBvcHRpb25zLnJlc3BvbnNlID8gbG9hZFJlc3BvbnNlIDogbG9hZFhoclxuXG4gICAgaWYgKFwianNvblwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaXNKc29uID0gdHJ1ZVxuICAgICAgICBoZWFkZXJzW1wiQWNjZXB0XCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgaWYgKG1ldGhvZCAhPT0gXCJHRVRcIiAmJiBtZXRob2QgIT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmpzb24pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gcmVhZHlzdGF0ZWNoYW5nZVxuICAgIHhoci5vbmxvYWQgPSBsb2FkXG4gICAgeGhyLm9uZXJyb3IgPSBlcnJvclxuICAgIC8vIElFOSBtdXN0IGhhdmUgb25wcm9ncmVzcyBiZSBzZXQgdG8gYSB1bmlxdWUgZnVuY3Rpb24uXG4gICAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIElFIG11c3QgZGllXG4gICAgfVxuICAgIC8vIGhhdGUgSUVcbiAgICB4aHIub250aW1lb3V0ID0gbm9vcFxuICAgIHhoci5vcGVuKG1ldGhvZCwgdXJpLCAhc3luYylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIGlmIChvcHRpb25zLndpdGhDcmVkZW50aWFscyB8fCAob3B0aW9ucy5jb3JzICYmIG9wdGlvbnMud2l0aENyZWRlbnRpYWxzICE9PSBmYWxzZSkpIHtcbiAgICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRydWVcbiAgICB9XG5cbiAgICAvLyBDYW5ub3Qgc2V0IHRpbWVvdXQgd2l0aCBzeW5jIHJlcXVlc3RcbiAgICBpZiAoIXN5bmMpIHtcbiAgICAgICAgeGhyLnRpbWVvdXQgPSBcInRpbWVvdXRcIiBpbiBvcHRpb25zID8gb3B0aW9ucy50aW1lb3V0IDogNTAwMFxuICAgIH1cblxuICAgIGlmICh4aHIuc2V0UmVxdWVzdEhlYWRlcikge1xuICAgICAgICBmb3Ioa2V5IGluIGhlYWRlcnMpe1xuICAgICAgICAgICAgaWYoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkhlYWRlcnMgY2Fubm90IGJlIHNldCBvbiBhbiBYRG9tYWluUmVxdWVzdCBvYmplY3RcIilcbiAgICB9XG5cbiAgICBpZiAoXCJyZXNwb25zZVR5cGVcIiBpbiBvcHRpb25zKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSBvcHRpb25zLnJlc3BvbnNlVHlwZVxuICAgIH1cbiAgICBcbiAgICBpZiAoXCJiZWZvcmVTZW5kXCIgaW4gb3B0aW9ucyAmJiBcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmVmb3JlU2VuZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgKSB7XG4gICAgICAgIG9wdGlvbnMuYmVmb3JlU2VuZCh4aHIpXG4gICAgfVxuXG4gICAgeGhyLnNlbmQoYm9keSlcblxuICAgIHJldHVybiB4aHJcblxuICAgIGZ1bmN0aW9uIHJlYWR5c3RhdGVjaGFuZ2UoKSB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgbG9hZCgpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRCb2R5KCkge1xuICAgICAgICAvLyBDaHJvbWUgd2l0aCByZXF1ZXN0VHlwZT1ibG9iIHRocm93cyBlcnJvcnMgYXJyb3VuZCB3aGVuIGV2ZW4gdGVzdGluZyBhY2Nlc3MgdG8gcmVzcG9uc2VUZXh0XG4gICAgICAgIHZhciBib2R5ID0gbnVsbFxuXG4gICAgICAgIGlmICh4aHIucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGJvZHkgPSB4aHIucmVzcG9uc2VcbiAgICAgICAgfSBlbHNlIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSAndGV4dCcgfHwgIXhoci5yZXNwb25zZVR5cGUpIHtcbiAgICAgICAgICAgIGJvZHkgPSB4aHIucmVzcG9uc2VUZXh0IHx8IHhoci5yZXNwb25zZVhNTFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzSnNvbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBib2R5XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U3RhdHVzQ29kZSgpIHtcbiAgICAgICAgcmV0dXJuIHhoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiB4aHIuc3RhdHVzXG4gICAgfVxuXG4gICAgLy8gaWYgd2UncmUgZ2V0dGluZyBhIG5vbmUtb2sgc3RhdHVzQ29kZSwgYnVpbGQgJiByZXR1cm4gYW4gZXJyb3JcbiAgICBmdW5jdGlvbiBlcnJvckZyb21TdGF0dXNDb2RlKHN0YXR1cykge1xuICAgICAgICB2YXIgZXJyb3IgPSBudWxsXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDAgfHwgKHN0YXR1cyA+PSA0MDAgJiYgc3RhdHVzIDwgNjAwKSkge1xuICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSAodHlwZW9mIGJvZHkgPT09IFwic3RyaW5nXCIgPyBib2R5IDogZmFsc2UpIHx8XG4gICAgICAgICAgICAgICAgbWVzc2FnZXNbU3RyaW5nKHN0YXR1cykuY2hhckF0KDApXVxuICAgICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSlcbiAgICAgICAgICAgIGVycm9yLnN0YXR1c0NvZGUgPSBzdGF0dXNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcnJvclxuICAgIH1cblxuICAgIC8vIHdpbGwgbG9hZCB0aGUgZGF0YSAmIHByb2Nlc3MgdGhlIHJlc3BvbnNlIGluIGEgc3BlY2lhbCByZXNwb25zZSBvYmplY3RcbiAgICBmdW5jdGlvbiBsb2FkUmVzcG9uc2UoKSB7XG4gICAgICAgIHZhciBzdGF0dXMgPSBnZXRTdGF0dXNDb2RlKClcbiAgICAgICAgdmFyIGVycm9yID0gZXJyb3JGcm9tU3RhdHVzQ29kZShzdGF0dXMpXG4gICAgICAgIHZhciByZXNwb25zZSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGdldEJvZHkoKSxcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IHN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0LFxuICAgICAgICAgICAgcmF3OiB4aHJcbiAgICAgICAgfVxuICAgICAgICBpZih4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKXsgLy9yZW1lbWJlciB4aHIgY2FuIGluIGZhY3QgYmUgWERSIGZvciBDT1JTIGluIElFXG4gICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzID0gcGFyc2VIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2soZXJyb3IsIHJlc3BvbnNlLCByZXNwb25zZS5ib2R5KVxuICAgIH1cblxuICAgIC8vIHdpbGwgbG9hZCB0aGUgZGF0YSBhbmQgYWRkIHNvbWUgcmVzcG9uc2UgcHJvcGVydGllcyB0byB0aGUgc291cmNlIHhoclxuICAgIC8vIGFuZCB0aGVuIHJlc3BvbmQgd2l0aCB0aGF0XG4gICAgZnVuY3Rpb24gbG9hZFhocigpIHtcbiAgICAgICAgdmFyIHN0YXR1cyA9IGdldFN0YXR1c0NvZGUoKVxuICAgICAgICB2YXIgZXJyb3IgPSBlcnJvckZyb21TdGF0dXNDb2RlKHN0YXR1cylcblxuICAgICAgICB4aHIuc3RhdHVzID0geGhyLnN0YXR1c0NvZGUgPSBzdGF0dXNcbiAgICAgICAgeGhyLmJvZHkgPSBnZXRCb2R5KClcbiAgICAgICAgeGhyLmhlYWRlcnMgPSBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuXG4gICAgICAgIGNhbGxiYWNrKGVycm9yLCB4aHIsIHhoci5ib2R5KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVycm9yKGV2dCkge1xuICAgICAgICBjYWxsYmFjayhldnQsIHhocilcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiKXtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHNlbGY7XG59IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0ge307XG59XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KSIsIm1vZHVsZS5leHBvcnRzID0gb25jZVxuXG5vbmNlLnByb3RvID0gb25jZShmdW5jdGlvbiAoKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsICdvbmNlJywge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25jZSh0aGlzKVxuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG59KVxuXG5mdW5jdGlvbiBvbmNlIChmbikge1xuICB2YXIgY2FsbGVkID0gZmFsc2VcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2FsbGVkKSByZXR1cm5cbiAgICBjYWxsZWQgPSB0cnVlXG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfVxufVxuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCdpcy1mdW5jdGlvbicpXG5cbm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaFxuXG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG5cbmZ1bmN0aW9uIGZvckVhY2gobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24oaXRlcmF0b3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2l0ZXJhdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpXG4gICAgfVxuXG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7XG4gICAgICAgIGNvbnRleHQgPSB0aGlzXG4gICAgfVxuICAgIFxuICAgIGlmICh0b1N0cmluZy5jYWxsKGxpc3QpID09PSAnW29iamVjdCBBcnJheV0nKVxuICAgICAgICBmb3JFYWNoQXJyYXkobGlzdCwgaXRlcmF0b3IsIGNvbnRleHQpXG4gICAgZWxzZSBpZiAodHlwZW9mIGxpc3QgPT09ICdzdHJpbmcnKVxuICAgICAgICBmb3JFYWNoU3RyaW5nKGxpc3QsIGl0ZXJhdG9yLCBjb250ZXh0KVxuICAgIGVsc2VcbiAgICAgICAgZm9yRWFjaE9iamVjdChsaXN0LCBpdGVyYXRvciwgY29udGV4dClcbn1cblxuZnVuY3Rpb24gZm9yRWFjaEFycmF5KGFycmF5LCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChhcnJheSwgaSkpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgYXJyYXlbaV0sIGksIGFycmF5KVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoU3RyaW5nKHN0cmluZywgaXRlcmF0b3IsIGNvbnRleHQpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RyaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIC8vIG5vIHN1Y2ggdGhpbmcgYXMgYSBzcGFyc2Ugc3RyaW5nLlxuICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHN0cmluZy5jaGFyQXQoaSksIGksIHN0cmluZylcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hPYmplY3Qob2JqZWN0LCBpdGVyYXRvciwgY29udGV4dCkge1xuICAgIGZvciAodmFyIGsgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgaykpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqZWN0W2tdLCBrLCBvYmplY3QpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb25cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uIChmbikge1xuICB2YXIgc3RyaW5nID0gdG9TdHJpbmcuY2FsbChmbilcbiAgcmV0dXJuIHN0cmluZyA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJyB8fFxuICAgICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgc3RyaW5nICE9PSAnW29iamVjdCBSZWdFeHBdJykgfHxcbiAgICAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgLy8gSUU4IGFuZCBiZWxvd1xuICAgICAoZm4gPT09IHdpbmRvdy5zZXRUaW1lb3V0IHx8XG4gICAgICBmbiA9PT0gd2luZG93LmFsZXJ0IHx8XG4gICAgICBmbiA9PT0gd2luZG93LmNvbmZpcm0gfHxcbiAgICAgIGZuID09PSB3aW5kb3cucHJvbXB0KSlcbn07XG4iLCJcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHRyaW07XG5cbmZ1bmN0aW9uIHRyaW0oc3RyKXtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzKnxcXHMqJC9nLCAnJyk7XG59XG5cbmV4cG9ydHMubGVmdCA9IGZ1bmN0aW9uKHN0cil7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyovLCAnJyk7XG59O1xuXG5leHBvcnRzLnJpZ2h0ID0gZnVuY3Rpb24oc3RyKXtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbn07XG4iLCJ2YXIgdHJpbSA9IHJlcXVpcmUoJ3RyaW0nKVxuICAsIGZvckVhY2ggPSByZXF1aXJlKCdmb3ItZWFjaCcpXG4gICwgaXNBcnJheSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xuICAgIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaGVhZGVycykge1xuICBpZiAoIWhlYWRlcnMpXG4gICAgcmV0dXJuIHt9XG5cbiAgdmFyIHJlc3VsdCA9IHt9XG5cbiAgZm9yRWFjaChcbiAgICAgIHRyaW0oaGVhZGVycykuc3BsaXQoJ1xcbicpXG4gICAgLCBmdW5jdGlvbiAocm93KSB7XG4gICAgICAgIHZhciBpbmRleCA9IHJvdy5pbmRleE9mKCc6JylcbiAgICAgICAgICAsIGtleSA9IHRyaW0ocm93LnNsaWNlKDAsIGluZGV4KSkudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICwgdmFsdWUgPSB0cmltKHJvdy5zbGljZShpbmRleCArIDEpKVxuXG4gICAgICAgIGlmICh0eXBlb2YocmVzdWx0W2tleV0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KHJlc3VsdFtrZXldKSkge1xuICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBbIHJlc3VsdFtrZXldLCB2YWx1ZSBdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgKVxuXG4gIHJldHVybiByZXN1bHRcbn0iLCIvLyAgICAgVW5kZXJzY29yZS5qcyAxLjcuMFxuLy8gICAgIGh0dHA6Ly91bmRlcnNjb3JlanMub3JnXG4vLyAgICAgKGMpIDIwMDktMjAxNCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuLy8gICAgIFVuZGVyc2NvcmUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5cbihmdW5jdGlvbigpIHtcblxuICAvLyBCYXNlbGluZSBzZXR1cFxuICAvLyAtLS0tLS0tLS0tLS0tLVxuXG4gIC8vIEVzdGFibGlzaCB0aGUgcm9vdCBvYmplY3QsIGB3aW5kb3dgIGluIHRoZSBicm93c2VyLCBvciBgZXhwb3J0c2Agb24gdGhlIHNlcnZlci5cbiAgdmFyIHJvb3QgPSB0aGlzO1xuXG4gIC8vIFNhdmUgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBgX2AgdmFyaWFibGUuXG4gIHZhciBwcmV2aW91c1VuZGVyc2NvcmUgPSByb290Ll87XG5cbiAgLy8gU2F2ZSBieXRlcyBpbiB0aGUgbWluaWZpZWQgKGJ1dCBub3QgZ3ppcHBlZCkgdmVyc2lvbjpcbiAgdmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsIE9ialByb3RvID0gT2JqZWN0LnByb3RvdHlwZSwgRnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuXG4gIC8vIENyZWF0ZSBxdWljayByZWZlcmVuY2UgdmFyaWFibGVzIGZvciBzcGVlZCBhY2Nlc3MgdG8gY29yZSBwcm90b3R5cGVzLlxuICB2YXJcbiAgICBwdXNoICAgICAgICAgICAgID0gQXJyYXlQcm90by5wdXNoLFxuICAgIHNsaWNlICAgICAgICAgICAgPSBBcnJheVByb3RvLnNsaWNlLFxuICAgIGNvbmNhdCAgICAgICAgICAgPSBBcnJheVByb3RvLmNvbmNhdCxcbiAgICB0b1N0cmluZyAgICAgICAgID0gT2JqUHJvdG8udG9TdHJpbmcsXG4gICAgaGFzT3duUHJvcGVydHkgICA9IE9ialByb3RvLmhhc093blByb3BlcnR5O1xuXG4gIC8vIEFsbCAqKkVDTUFTY3JpcHQgNSoqIG5hdGl2ZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3ZSBob3BlIHRvIHVzZVxuICAvLyBhcmUgZGVjbGFyZWQgaGVyZS5cbiAgdmFyXG4gICAgbmF0aXZlSXNBcnJheSAgICAgID0gQXJyYXkuaXNBcnJheSxcbiAgICBuYXRpdmVLZXlzICAgICAgICAgPSBPYmplY3Qua2V5cyxcbiAgICBuYXRpdmVCaW5kICAgICAgICAgPSBGdW5jUHJvdG8uYmluZDtcblxuICAvLyBDcmVhdGUgYSBzYWZlIHJlZmVyZW5jZSB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QgZm9yIHVzZSBiZWxvdy5cbiAgdmFyIF8gPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgXykgcmV0dXJuIG9iajtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgXykpIHJldHVybiBuZXcgXyhvYmopO1xuICAgIHRoaXMuX3dyYXBwZWQgPSBvYmo7XG4gIH07XG5cbiAgLy8gRXhwb3J0IHRoZSBVbmRlcnNjb3JlIG9iamVjdCBmb3IgKipOb2RlLmpzKiosIHdpdGhcbiAgLy8gYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgZm9yIHRoZSBvbGQgYHJlcXVpcmUoKWAgQVBJLiBJZiB3ZSdyZSBpblxuICAvLyB0aGUgYnJvd3NlciwgYWRkIGBfYCBhcyBhIGdsb2JhbCBvYmplY3QuXG4gIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IF87XG4gICAgfVxuICAgIGV4cG9ydHMuXyA9IF87XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5fID0gXztcbiAgfVxuXG4gIC8vIEN1cnJlbnQgdmVyc2lvbi5cbiAgXy5WRVJTSU9OID0gJzEuNy4wJztcblxuICAvLyBJbnRlcm5hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZWZmaWNpZW50IChmb3IgY3VycmVudCBlbmdpbmVzKSB2ZXJzaW9uXG4gIC8vIG9mIHRoZSBwYXNzZWQtaW4gY2FsbGJhY2ssIHRvIGJlIHJlcGVhdGVkbHkgYXBwbGllZCBpbiBvdGhlciBVbmRlcnNjb3JlXG4gIC8vIGZ1bmN0aW9ucy5cbiAgdmFyIGNyZWF0ZUNhbGxiYWNrID0gZnVuY3Rpb24oZnVuYywgY29udGV4dCwgYXJnQ291bnQpIHtcbiAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSByZXR1cm4gZnVuYztcbiAgICBzd2l0Y2ggKGFyZ0NvdW50ID09IG51bGwgPyAzIDogYXJnQ291bnQpIHtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgdmFsdWUpO1xuICAgICAgfTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIHZhbHVlLCBvdGhlcik7XG4gICAgICB9O1xuICAgICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgIH07XG4gICAgICBjYXNlIDQ6IHJldHVybiBmdW5jdGlvbihhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZnVuYy5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gQSBtb3N0bHktaW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY2FsbGJhY2tzIHRoYXQgY2FuIGJlIGFwcGxpZWRcbiAgLy8gdG8gZWFjaCBlbGVtZW50IGluIGEgY29sbGVjdGlvbiwgcmV0dXJuaW5nIHRoZSBkZXNpcmVkIHJlc3VsdCDigJQgZWl0aGVyXG4gIC8vIGlkZW50aXR5LCBhbiBhcmJpdHJhcnkgY2FsbGJhY2ssIGEgcHJvcGVydHkgbWF0Y2hlciwgb3IgYSBwcm9wZXJ0eSBhY2Nlc3Nvci5cbiAgXy5pdGVyYXRlZSA9IGZ1bmN0aW9uKHZhbHVlLCBjb250ZXh0LCBhcmdDb3VudCkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gXy5pZGVudGl0eTtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHZhbHVlKSkgcmV0dXJuIGNyZWF0ZUNhbGxiYWNrKHZhbHVlLCBjb250ZXh0LCBhcmdDb3VudCk7XG4gICAgaWYgKF8uaXNPYmplY3QodmFsdWUpKSByZXR1cm4gXy5tYXRjaGVzKHZhbHVlKTtcbiAgICByZXR1cm4gXy5wcm9wZXJ0eSh2YWx1ZSk7XG4gIH07XG5cbiAgLy8gQ29sbGVjdGlvbiBGdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBUaGUgY29ybmVyc3RvbmUsIGFuIGBlYWNoYCBpbXBsZW1lbnRhdGlvbiwgYWthIGBmb3JFYWNoYC5cbiAgLy8gSGFuZGxlcyByYXcgb2JqZWN0cyBpbiBhZGRpdGlvbiB0byBhcnJheS1saWtlcy4gVHJlYXRzIGFsbFxuICAvLyBzcGFyc2UgYXJyYXktbGlrZXMgYXMgaWYgdGhleSB3ZXJlIGRlbnNlLlxuICBfLmVhY2ggPSBfLmZvckVhY2ggPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gb2JqO1xuICAgIGl0ZXJhdGVlID0gY3JlYXRlQ2FsbGJhY2soaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHZhciBpLCBsZW5ndGggPSBvYmoubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggPT09ICtsZW5ndGgpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVyYXRlZShvYmpbaV0sIGksIG9iaik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaik7XG4gICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdGVlKG9ialtrZXlzW2ldXSwga2V5c1tpXSwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGl0ZXJhdGVlIHRvIGVhY2ggZWxlbWVudC5cbiAgXy5tYXAgPSBfLmNvbGxlY3QgPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gW107XG4gICAgaXRlcmF0ZWUgPSBfLml0ZXJhdGVlKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICB2YXIga2V5cyA9IG9iai5sZW5ndGggIT09ICtvYmoubGVuZ3RoICYmIF8ua2V5cyhvYmopLFxuICAgICAgICBsZW5ndGggPSAoa2V5cyB8fCBvYmopLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0cyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgIGN1cnJlbnRLZXk7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY3VycmVudEtleSA9IGtleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4O1xuICAgICAgcmVzdWx0c1tpbmRleF0gPSBpdGVyYXRlZShvYmpbY3VycmVudEtleV0sIGN1cnJlbnRLZXksIG9iaik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuXG4gIHZhciByZWR1Y2VFcnJvciA9ICdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJztcblxuICAvLyAqKlJlZHVjZSoqIGJ1aWxkcyB1cCBhIHNpbmdsZSByZXN1bHQgZnJvbSBhIGxpc3Qgb2YgdmFsdWVzLCBha2EgYGluamVjdGAsXG4gIC8vIG9yIGBmb2xkbGAuXG4gIF8ucmVkdWNlID0gXy5mb2xkbCA9IF8uaW5qZWN0ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgbWVtbywgY29udGV4dCkge1xuICAgIGlmIChvYmogPT0gbnVsbCkgb2JqID0gW107XG4gICAgaXRlcmF0ZWUgPSBjcmVhdGVDYWxsYmFjayhpdGVyYXRlZSwgY29udGV4dCwgNCk7XG4gICAgdmFyIGtleXMgPSBvYmoubGVuZ3RoICE9PSArb2JqLmxlbmd0aCAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMCwgY3VycmVudEtleTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgIGlmICghbGVuZ3RoKSB0aHJvdyBuZXcgVHlwZUVycm9yKHJlZHVjZUVycm9yKTtcbiAgICAgIG1lbW8gPSBvYmpba2V5cyA/IGtleXNbaW5kZXgrK10gOiBpbmRleCsrXTtcbiAgICB9XG4gICAgZm9yICg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjdXJyZW50S2V5ID0ga2V5cyA/IGtleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICBtZW1vID0gaXRlcmF0ZWUobWVtbywgb2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopO1xuICAgIH1cbiAgICByZXR1cm4gbWVtbztcbiAgfTtcblxuICAvLyBUaGUgcmlnaHQtYXNzb2NpYXRpdmUgdmVyc2lvbiBvZiByZWR1Y2UsIGFsc28ga25vd24gYXMgYGZvbGRyYC5cbiAgXy5yZWR1Y2VSaWdodCA9IF8uZm9sZHIgPSBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBtZW1vLCBjb250ZXh0KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSBvYmogPSBbXTtcbiAgICBpdGVyYXRlZSA9IGNyZWF0ZUNhbGxiYWNrKGl0ZXJhdGVlLCBjb250ZXh0LCA0KTtcbiAgICB2YXIga2V5cyA9IG9iai5sZW5ndGggIT09ICsgb2JqLmxlbmd0aCAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgaW5kZXggPSAoa2V5cyB8fCBvYmopLmxlbmd0aCxcbiAgICAgICAgY3VycmVudEtleTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHtcbiAgICAgIGlmICghaW5kZXgpIHRocm93IG5ldyBUeXBlRXJyb3IocmVkdWNlRXJyb3IpO1xuICAgICAgbWVtbyA9IG9ialtrZXlzID8ga2V5c1stLWluZGV4XSA6IC0taW5kZXhdO1xuICAgIH1cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgY3VycmVudEtleSA9IGtleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4O1xuICAgICAgbWVtbyA9IGl0ZXJhdGVlKG1lbW8sIG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lbW87XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBmaXJzdCB2YWx1ZSB3aGljaCBwYXNzZXMgYSB0cnV0aCB0ZXN0LiBBbGlhc2VkIGFzIGBkZXRlY3RgLlxuICBfLmZpbmQgPSBfLmRldGVjdCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBwcmVkaWNhdGUgPSBfLml0ZXJhdGVlKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgXy5zb21lKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgbGlzdCkpIHtcbiAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgdGhhdCBwYXNzIGEgdHJ1dGggdGVzdC5cbiAgLy8gQWxpYXNlZCBhcyBgc2VsZWN0YC5cbiAgXy5maWx0ZXIgPSBfLnNlbGVjdCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiByZXN1bHRzO1xuICAgIHByZWRpY2F0ZSA9IF8uaXRlcmF0ZWUocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICBfLmVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBsaXN0KSkgcmVzdWx0cy5wdXNoKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcblxuICAvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBmb3Igd2hpY2ggYSB0cnV0aCB0ZXN0IGZhaWxzLlxuICBfLnJlamVjdCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIF8uZmlsdGVyKG9iaiwgXy5uZWdhdGUoXy5pdGVyYXRlZShwcmVkaWNhdGUpKSwgY29udGV4dCk7XG4gIH07XG5cbiAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYWxsIG9mIHRoZSBlbGVtZW50cyBtYXRjaCBhIHRydXRoIHRlc3QuXG4gIC8vIEFsaWFzZWQgYXMgYGFsbGAuXG4gIF8uZXZlcnkgPSBfLmFsbCA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBwcmVkaWNhdGUgPSBfLml0ZXJhdGVlKHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgdmFyIGtleXMgPSBvYmoubGVuZ3RoICE9PSArb2JqLmxlbmd0aCAmJiBfLmtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0gKGtleXMgfHwgb2JqKS5sZW5ndGgsXG4gICAgICAgIGluZGV4LCBjdXJyZW50S2V5O1xuICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY3VycmVudEtleSA9IGtleXMgPyBrZXlzW2luZGV4XSA6IGluZGV4O1xuICAgICAgaWYgKCFwcmVkaWNhdGUob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8vIERldGVybWluZSBpZiBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiB0aGUgb2JqZWN0IG1hdGNoZXMgYSB0cnV0aCB0ZXN0LlxuICAvLyBBbGlhc2VkIGFzIGBhbnlgLlxuICBfLnNvbWUgPSBfLmFueSA9IGZ1bmN0aW9uKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgcHJlZGljYXRlID0gXy5pdGVyYXRlZShwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIHZhciBrZXlzID0gb2JqLmxlbmd0aCAhPT0gK29iai5sZW5ndGggJiYgXy5rZXlzKG9iaiksXG4gICAgICAgIGxlbmd0aCA9IChrZXlzIHx8IG9iaikubGVuZ3RoLFxuICAgICAgICBpbmRleCwgY3VycmVudEtleTtcbiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGN1cnJlbnRLZXkgPSBrZXlzID8ga2V5c1tpbmRleF0gOiBpbmRleDtcbiAgICAgIGlmIChwcmVkaWNhdGUob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8vIERldGVybWluZSBpZiB0aGUgYXJyYXkgb3Igb2JqZWN0IGNvbnRhaW5zIGEgZ2l2ZW4gdmFsdWUgKHVzaW5nIGA9PT1gKS5cbiAgLy8gQWxpYXNlZCBhcyBgaW5jbHVkZWAuXG4gIF8uY29udGFpbnMgPSBfLmluY2x1ZGUgPSBmdW5jdGlvbihvYmosIHRhcmdldCkge1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChvYmoubGVuZ3RoICE9PSArb2JqLmxlbmd0aCkgb2JqID0gXy52YWx1ZXMob2JqKTtcbiAgICByZXR1cm4gXy5pbmRleE9mKG9iaiwgdGFyZ2V0KSA+PSAwO1xuICB9O1xuXG4gIC8vIEludm9rZSBhIG1ldGhvZCAod2l0aCBhcmd1bWVudHMpIG9uIGV2ZXJ5IGl0ZW0gaW4gYSBjb2xsZWN0aW9uLlxuICBfLmludm9rZSA9IGZ1bmN0aW9uKG9iaiwgbWV0aG9kKSB7XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgdmFyIGlzRnVuYyA9IF8uaXNGdW5jdGlvbihtZXRob2QpO1xuICAgIHJldHVybiBfLm1hcChvYmosIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gKGlzRnVuYyA/IG1ldGhvZCA6IHZhbHVlW21ldGhvZF0pLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mIGBtYXBgOiBmZXRjaGluZyBhIHByb3BlcnR5LlxuICBfLnBsdWNrID0gZnVuY3Rpb24ob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gXy5tYXAob2JqLCBfLnByb3BlcnR5KGtleSkpO1xuICB9O1xuXG4gIC8vIENvbnZlbmllbmNlIHZlcnNpb24gb2YgYSBjb21tb24gdXNlIGNhc2Ugb2YgYGZpbHRlcmA6IHNlbGVjdGluZyBvbmx5IG9iamVjdHNcbiAgLy8gY29udGFpbmluZyBzcGVjaWZpYyBga2V5OnZhbHVlYCBwYWlycy5cbiAgXy53aGVyZSA9IGZ1bmN0aW9uKG9iaiwgYXR0cnMpIHtcbiAgICByZXR1cm4gXy5maWx0ZXIob2JqLCBfLm1hdGNoZXMoYXR0cnMpKTtcbiAgfTtcblxuICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mIGBmaW5kYDogZ2V0dGluZyB0aGUgZmlyc3Qgb2JqZWN0XG4gIC8vIGNvbnRhaW5pbmcgc3BlY2lmaWMgYGtleTp2YWx1ZWAgcGFpcnMuXG4gIF8uZmluZFdoZXJlID0gZnVuY3Rpb24ob2JqLCBhdHRycykge1xuICAgIHJldHVybiBfLmZpbmQob2JqLCBfLm1hdGNoZXMoYXR0cnMpKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIG1heGltdW0gZWxlbWVudCAob3IgZWxlbWVudC1iYXNlZCBjb21wdXRhdGlvbikuXG4gIF8ubWF4ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciByZXN1bHQgPSAtSW5maW5pdHksIGxhc3RDb21wdXRlZCA9IC1JbmZpbml0eSxcbiAgICAgICAgdmFsdWUsIGNvbXB1dGVkO1xuICAgIGlmIChpdGVyYXRlZSA9PSBudWxsICYmIG9iaiAhPSBudWxsKSB7XG4gICAgICBvYmogPSBvYmoubGVuZ3RoID09PSArb2JqLmxlbmd0aCA/IG9iaiA6IF8udmFsdWVzKG9iaik7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gb2JqLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gb2JqW2ldO1xuICAgICAgICBpZiAodmFsdWUgPiByZXN1bHQpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpdGVyYXRlZSA9IF8uaXRlcmF0ZWUoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgICAgXy5lYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7XG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBsaXN0KTtcbiAgICAgICAgaWYgKGNvbXB1dGVkID4gbGFzdENvbXB1dGVkIHx8IGNvbXB1dGVkID09PSAtSW5maW5pdHkgJiYgcmVzdWx0ID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBsYXN0Q29tcHV0ZWQgPSBjb21wdXRlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUmV0dXJuIHRoZSBtaW5pbXVtIGVsZW1lbnQgKG9yIGVsZW1lbnQtYmFzZWQgY29tcHV0YXRpb24pLlxuICBfLm1pbiA9IGZ1bmN0aW9uKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgcmVzdWx0ID0gSW5maW5pdHksIGxhc3RDb21wdXRlZCA9IEluZmluaXR5LFxuICAgICAgICB2YWx1ZSwgY29tcHV0ZWQ7XG4gICAgaWYgKGl0ZXJhdGVlID09IG51bGwgJiYgb2JqICE9IG51bGwpIHtcbiAgICAgIG9iaiA9IG9iai5sZW5ndGggPT09ICtvYmoubGVuZ3RoID8gb2JqIDogXy52YWx1ZXMob2JqKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBvYmoubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsdWUgPSBvYmpbaV07XG4gICAgICAgIGlmICh2YWx1ZSA8IHJlc3VsdCkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZXJhdGVlID0gXy5pdGVyYXRlZShpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgICBfLmVhY2gob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHtcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSh2YWx1ZSwgaW5kZXgsIGxpc3QpO1xuICAgICAgICBpZiAoY29tcHV0ZWQgPCBsYXN0Q29tcHV0ZWQgfHwgY29tcHV0ZWQgPT09IEluZmluaXR5ICYmIHJlc3VsdCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBsYXN0Q29tcHV0ZWQgPSBjb21wdXRlZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gU2h1ZmZsZSBhIGNvbGxlY3Rpb24sIHVzaW5nIHRoZSBtb2Rlcm4gdmVyc2lvbiBvZiB0aGVcbiAgLy8gW0Zpc2hlci1ZYXRlcyBzaHVmZmxlXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zpc2hlcuKAk1lhdGVzX3NodWZmbGUpLlxuICBfLnNodWZmbGUgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgc2V0ID0gb2JqICYmIG9iai5sZW5ndGggPT09ICtvYmoubGVuZ3RoID8gb2JqIDogXy52YWx1ZXMob2JqKTtcbiAgICB2YXIgbGVuZ3RoID0gc2V0Lmxlbmd0aDtcbiAgICB2YXIgc2h1ZmZsZWQgPSBBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMCwgcmFuZDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHJhbmQgPSBfLnJhbmRvbSgwLCBpbmRleCk7XG4gICAgICBpZiAocmFuZCAhPT0gaW5kZXgpIHNodWZmbGVkW2luZGV4XSA9IHNodWZmbGVkW3JhbmRdO1xuICAgICAgc2h1ZmZsZWRbcmFuZF0gPSBzZXRbaW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gc2h1ZmZsZWQ7XG4gIH07XG5cbiAgLy8gU2FtcGxlICoqbioqIHJhbmRvbSB2YWx1ZXMgZnJvbSBhIGNvbGxlY3Rpb24uXG4gIC8vIElmICoqbioqIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgYSBzaW5nbGUgcmFuZG9tIGVsZW1lbnQuXG4gIC8vIFRoZSBpbnRlcm5hbCBgZ3VhcmRgIGFyZ3VtZW50IGFsbG93cyBpdCB0byB3b3JrIHdpdGggYG1hcGAuXG4gIF8uc2FtcGxlID0gZnVuY3Rpb24ob2JqLCBuLCBndWFyZCkge1xuICAgIGlmIChuID09IG51bGwgfHwgZ3VhcmQpIHtcbiAgICAgIGlmIChvYmoubGVuZ3RoICE9PSArb2JqLmxlbmd0aCkgb2JqID0gXy52YWx1ZXMob2JqKTtcbiAgICAgIHJldHVybiBvYmpbXy5yYW5kb20ob2JqLmxlbmd0aCAtIDEpXTtcbiAgICB9XG4gICAgcmV0dXJuIF8uc2h1ZmZsZShvYmopLnNsaWNlKDAsIE1hdGgubWF4KDAsIG4pKTtcbiAgfTtcblxuICAvLyBTb3J0IHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24gcHJvZHVjZWQgYnkgYW4gaXRlcmF0ZWUuXG4gIF8uc29ydEJ5ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIGl0ZXJhdGVlID0gXy5pdGVyYXRlZShpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgcmV0dXJuIF8ucGx1Y2soXy5tYXAob2JqLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGxpc3QpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICBjcml0ZXJpYTogaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBsaXN0KVxuICAgICAgfTtcbiAgICB9KS5zb3J0KGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gICAgICB2YXIgYSA9IGxlZnQuY3JpdGVyaWE7XG4gICAgICB2YXIgYiA9IHJpZ2h0LmNyaXRlcmlhO1xuICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgaWYgKGEgPiBiIHx8IGEgPT09IHZvaWQgMCkgcmV0dXJuIDE7XG4gICAgICAgIGlmIChhIDwgYiB8fCBiID09PSB2b2lkIDApIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsZWZ0LmluZGV4IC0gcmlnaHQuaW5kZXg7XG4gICAgfSksICd2YWx1ZScpO1xuICB9O1xuXG4gIC8vIEFuIGludGVybmFsIGZ1bmN0aW9uIHVzZWQgZm9yIGFnZ3JlZ2F0ZSBcImdyb3VwIGJ5XCIgb3BlcmF0aW9ucy5cbiAgdmFyIGdyb3VwID0gZnVuY3Rpb24oYmVoYXZpb3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaXRlcmF0ZWUgPSBfLml0ZXJhdGVlKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICAgIF8uZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgICAgICB2YXIga2V5ID0gaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBvYmopO1xuICAgICAgICBiZWhhdmlvcihyZXN1bHQsIHZhbHVlLCBrZXkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH07XG5cbiAgLy8gR3JvdXBzIHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24uIFBhc3MgZWl0aGVyIGEgc3RyaW5nIGF0dHJpYnV0ZVxuICAvLyB0byBncm91cCBieSwgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNyaXRlcmlvbi5cbiAgXy5ncm91cEJ5ID0gZ3JvdXAoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgaWYgKF8uaGFzKHJlc3VsdCwga2V5KSkgcmVzdWx0W2tleV0ucHVzaCh2YWx1ZSk7IGVsc2UgcmVzdWx0W2tleV0gPSBbdmFsdWVdO1xuICB9KTtcblxuICAvLyBJbmRleGVzIHRoZSBvYmplY3QncyB2YWx1ZXMgYnkgYSBjcml0ZXJpb24sIHNpbWlsYXIgdG8gYGdyb3VwQnlgLCBidXQgZm9yXG4gIC8vIHdoZW4geW91IGtub3cgdGhhdCB5b3VyIGluZGV4IHZhbHVlcyB3aWxsIGJlIHVuaXF1ZS5cbiAgXy5pbmRleEJ5ID0gZ3JvdXAoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgfSk7XG5cbiAgLy8gQ291bnRzIGluc3RhbmNlcyBvZiBhbiBvYmplY3QgdGhhdCBncm91cCBieSBhIGNlcnRhaW4gY3JpdGVyaW9uLiBQYXNzXG4gIC8vIGVpdGhlciBhIHN0cmluZyBhdHRyaWJ1dGUgdG8gY291bnQgYnksIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZVxuICAvLyBjcml0ZXJpb24uXG4gIF8uY291bnRCeSA9IGdyb3VwKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgIGlmIChfLmhhcyhyZXN1bHQsIGtleSkpIHJlc3VsdFtrZXldKys7IGVsc2UgcmVzdWx0W2tleV0gPSAxO1xuICB9KTtcblxuICAvLyBVc2UgYSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgdGhlIHNtYWxsZXN0IGluZGV4IGF0IHdoaWNoXG4gIC8vIGFuIG9iamVjdCBzaG91bGQgYmUgaW5zZXJ0ZWQgc28gYXMgdG8gbWFpbnRhaW4gb3JkZXIuIFVzZXMgYmluYXJ5IHNlYXJjaC5cbiAgXy5zb3J0ZWRJbmRleCA9IGZ1bmN0aW9uKGFycmF5LCBvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaXRlcmF0ZWUgPSBfLml0ZXJhdGVlKGl0ZXJhdGVlLCBjb250ZXh0LCAxKTtcbiAgICB2YXIgdmFsdWUgPSBpdGVyYXRlZShvYmopO1xuICAgIHZhciBsb3cgPSAwLCBoaWdoID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICB2YXIgbWlkID0gbG93ICsgaGlnaCA+Pj4gMTtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVttaWRdKSA8IHZhbHVlKSBsb3cgPSBtaWQgKyAxOyBlbHNlIGhpZ2ggPSBtaWQ7XG4gICAgfVxuICAgIHJldHVybiBsb3c7XG4gIH07XG5cbiAgLy8gU2FmZWx5IGNyZWF0ZSBhIHJlYWwsIGxpdmUgYXJyYXkgZnJvbSBhbnl0aGluZyBpdGVyYWJsZS5cbiAgXy50b0FycmF5ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFvYmopIHJldHVybiBbXTtcbiAgICBpZiAoXy5pc0FycmF5KG9iaikpIHJldHVybiBzbGljZS5jYWxsKG9iaik7XG4gICAgaWYgKG9iai5sZW5ndGggPT09ICtvYmoubGVuZ3RoKSByZXR1cm4gXy5tYXAob2JqLCBfLmlkZW50aXR5KTtcbiAgICByZXR1cm4gXy52YWx1ZXMob2JqKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBvYmplY3QuXG4gIF8uc2l6ZSA9IGZ1bmN0aW9uKG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIG9iai5sZW5ndGggPT09ICtvYmoubGVuZ3RoID8gb2JqLmxlbmd0aCA6IF8ua2V5cyhvYmopLmxlbmd0aDtcbiAgfTtcblxuICAvLyBTcGxpdCBhIGNvbGxlY3Rpb24gaW50byB0d28gYXJyYXlzOiBvbmUgd2hvc2UgZWxlbWVudHMgYWxsIHNhdGlzZnkgdGhlIGdpdmVuXG4gIC8vIHByZWRpY2F0ZSwgYW5kIG9uZSB3aG9zZSBlbGVtZW50cyBhbGwgZG8gbm90IHNhdGlzZnkgdGhlIHByZWRpY2F0ZS5cbiAgXy5wYXJ0aXRpb24gPSBmdW5jdGlvbihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHByZWRpY2F0ZSA9IF8uaXRlcmF0ZWUocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICB2YXIgcGFzcyA9IFtdLCBmYWlsID0gW107XG4gICAgXy5lYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqKSB7XG4gICAgICAocHJlZGljYXRlKHZhbHVlLCBrZXksIG9iaikgPyBwYXNzIDogZmFpbCkucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtwYXNzLCBmYWlsXTtcbiAgfTtcblxuICAvLyBBcnJheSBGdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gR2V0IHRoZSBmaXJzdCBlbGVtZW50IG9mIGFuIGFycmF5LiBQYXNzaW5nICoqbioqIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBOXG4gIC8vIHZhbHVlcyBpbiB0aGUgYXJyYXkuIEFsaWFzZWQgYXMgYGhlYWRgIGFuZCBgdGFrZWAuIFRoZSAqKmd1YXJkKiogY2hlY2tcbiAgLy8gYWxsb3dzIGl0IHRvIHdvcmsgd2l0aCBgXy5tYXBgLlxuICBfLmZpcnN0ID0gXy5oZWFkID0gXy50YWtlID0gZnVuY3Rpb24oYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgaWYgKGFycmF5ID09IG51bGwpIHJldHVybiB2b2lkIDA7XG4gICAgaWYgKG4gPT0gbnVsbCB8fCBndWFyZCkgcmV0dXJuIGFycmF5WzBdO1xuICAgIGlmIChuIDwgMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCAwLCBuKTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGV2ZXJ5dGhpbmcgYnV0IHRoZSBsYXN0IGVudHJ5IG9mIHRoZSBhcnJheS4gRXNwZWNpYWxseSB1c2VmdWwgb25cbiAgLy8gdGhlIGFyZ3VtZW50cyBvYmplY3QuIFBhc3NpbmcgKipuKiogd2lsbCByZXR1cm4gYWxsIHRoZSB2YWx1ZXMgaW5cbiAgLy8gdGhlIGFycmF5LCBleGNsdWRpbmcgdGhlIGxhc3QgTi4gVGhlICoqZ3VhcmQqKiBjaGVjayBhbGxvd3MgaXQgdG8gd29yayB3aXRoXG4gIC8vIGBfLm1hcGAuXG4gIF8uaW5pdGlhbCA9IGZ1bmN0aW9uKGFycmF5LCBuLCBndWFyZCkge1xuICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCAwLCBNYXRoLm1heCgwLCBhcnJheS5sZW5ndGggLSAobiA9PSBudWxsIHx8IGd1YXJkID8gMSA6IG4pKSk7XG4gIH07XG5cbiAgLy8gR2V0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYW4gYXJyYXkuIFBhc3NpbmcgKipuKiogd2lsbCByZXR1cm4gdGhlIGxhc3QgTlxuICAvLyB2YWx1ZXMgaW4gdGhlIGFycmF5LiBUaGUgKipndWFyZCoqIGNoZWNrIGFsbG93cyBpdCB0byB3b3JrIHdpdGggYF8ubWFwYC5cbiAgXy5sYXN0ID0gZnVuY3Rpb24oYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgaWYgKGFycmF5ID09IG51bGwpIHJldHVybiB2b2lkIDA7XG4gICAgaWYgKG4gPT0gbnVsbCB8fCBndWFyZCkgcmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCBNYXRoLm1heChhcnJheS5sZW5ndGggLSBuLCAwKSk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBldmVyeXRoaW5nIGJ1dCB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIGFycmF5LiBBbGlhc2VkIGFzIGB0YWlsYCBhbmQgYGRyb3BgLlxuICAvLyBFc3BlY2lhbGx5IHVzZWZ1bCBvbiB0aGUgYXJndW1lbnRzIG9iamVjdC4gUGFzc2luZyBhbiAqKm4qKiB3aWxsIHJldHVyblxuICAvLyB0aGUgcmVzdCBOIHZhbHVlcyBpbiB0aGUgYXJyYXkuIFRoZSAqKmd1YXJkKipcbiAgLy8gY2hlY2sgYWxsb3dzIGl0IHRvIHdvcmsgd2l0aCBgXy5tYXBgLlxuICBfLnJlc3QgPSBfLnRhaWwgPSBfLmRyb3AgPSBmdW5jdGlvbihhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICByZXR1cm4gc2xpY2UuY2FsbChhcnJheSwgbiA9PSBudWxsIHx8IGd1YXJkID8gMSA6IG4pO1xuICB9O1xuXG4gIC8vIFRyaW0gb3V0IGFsbCBmYWxzeSB2YWx1ZXMgZnJvbSBhbiBhcnJheS5cbiAgXy5jb21wYWN0ID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICByZXR1cm4gXy5maWx0ZXIoYXJyYXksIF8uaWRlbnRpdHkpO1xuICB9O1xuXG4gIC8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIGEgcmVjdXJzaXZlIGBmbGF0dGVuYCBmdW5jdGlvbi5cbiAgdmFyIGZsYXR0ZW4gPSBmdW5jdGlvbihpbnB1dCwgc2hhbGxvdywgc3RyaWN0LCBvdXRwdXQpIHtcbiAgICBpZiAoc2hhbGxvdyAmJiBfLmV2ZXJ5KGlucHV0LCBfLmlzQXJyYXkpKSB7XG4gICAgICByZXR1cm4gY29uY2F0LmFwcGx5KG91dHB1dCwgaW5wdXQpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gaW5wdXQubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWx1ZSA9IGlucHV0W2ldO1xuICAgICAgaWYgKCFfLmlzQXJyYXkodmFsdWUpICYmICFfLmlzQXJndW1lbnRzKHZhbHVlKSkge1xuICAgICAgICBpZiAoIXN0cmljdCkgb3V0cHV0LnB1c2godmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzaGFsbG93KSB7XG4gICAgICAgIHB1c2guYXBwbHkob3V0cHV0LCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmbGF0dGVuKHZhbHVlLCBzaGFsbG93LCBzdHJpY3QsIG91dHB1dCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH07XG5cbiAgLy8gRmxhdHRlbiBvdXQgYW4gYXJyYXksIGVpdGhlciByZWN1cnNpdmVseSAoYnkgZGVmYXVsdCksIG9yIGp1c3Qgb25lIGxldmVsLlxuICBfLmZsYXR0ZW4gPSBmdW5jdGlvbihhcnJheSwgc2hhbGxvdykge1xuICAgIHJldHVybiBmbGF0dGVuKGFycmF5LCBzaGFsbG93LCBmYWxzZSwgW10pO1xuICB9O1xuXG4gIC8vIFJldHVybiBhIHZlcnNpb24gb2YgdGhlIGFycmF5IHRoYXQgZG9lcyBub3QgY29udGFpbiB0aGUgc3BlY2lmaWVkIHZhbHVlKHMpLlxuICBfLndpdGhvdXQgPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHJldHVybiBfLmRpZmZlcmVuY2UoYXJyYXksIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gIH07XG5cbiAgLy8gUHJvZHVjZSBhIGR1cGxpY2F0ZS1mcmVlIHZlcnNpb24gb2YgdGhlIGFycmF5LiBJZiB0aGUgYXJyYXkgaGFzIGFscmVhZHlcbiAgLy8gYmVlbiBzb3J0ZWQsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgdXNpbmcgYSBmYXN0ZXIgYWxnb3JpdGhtLlxuICAvLyBBbGlhc2VkIGFzIGB1bmlxdWVgLlxuICBfLnVuaXEgPSBfLnVuaXF1ZSA9IGZ1bmN0aW9uKGFycmF5LCBpc1NvcnRlZCwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpZiAoYXJyYXkgPT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgIGlmICghXy5pc0Jvb2xlYW4oaXNTb3J0ZWQpKSB7XG4gICAgICBjb250ZXh0ID0gaXRlcmF0ZWU7XG4gICAgICBpdGVyYXRlZSA9IGlzU29ydGVkO1xuICAgICAgaXNTb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGl0ZXJhdGVlICE9IG51bGwpIGl0ZXJhdGVlID0gXy5pdGVyYXRlZShpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBzZWVuID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpXTtcbiAgICAgIGlmIChpc1NvcnRlZCkge1xuICAgICAgICBpZiAoIWkgfHwgc2VlbiAhPT0gdmFsdWUpIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgc2VlbiA9IHZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChpdGVyYXRlZSkge1xuICAgICAgICB2YXIgY29tcHV0ZWQgPSBpdGVyYXRlZSh2YWx1ZSwgaSwgYXJyYXkpO1xuICAgICAgICBpZiAoXy5pbmRleE9mKHNlZW4sIGNvbXB1dGVkKSA8IDApIHtcbiAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChfLmluZGV4T2YocmVzdWx0LCB2YWx1ZSkgPCAwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBQcm9kdWNlIGFuIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHVuaW9uOiBlYWNoIGRpc3RpbmN0IGVsZW1lbnQgZnJvbSBhbGwgb2ZcbiAgLy8gdGhlIHBhc3NlZC1pbiBhcnJheXMuXG4gIF8udW5pb24gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXy51bmlxKGZsYXR0ZW4oYXJndW1lbnRzLCB0cnVlLCB0cnVlLCBbXSkpO1xuICB9O1xuXG4gIC8vIFByb2R1Y2UgYW4gYXJyYXkgdGhhdCBjb250YWlucyBldmVyeSBpdGVtIHNoYXJlZCBiZXR3ZWVuIGFsbCB0aGVcbiAgLy8gcGFzc2VkLWluIGFycmF5cy5cbiAgXy5pbnRlcnNlY3Rpb24gPSBmdW5jdGlvbihhcnJheSkge1xuICAgIGlmIChhcnJheSA9PSBudWxsKSByZXR1cm4gW107XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gYXJyYXlbaV07XG4gICAgICBpZiAoXy5jb250YWlucyhyZXN1bHQsIGl0ZW0pKSBjb250aW51ZTtcbiAgICAgIGZvciAodmFyIGogPSAxOyBqIDwgYXJnc0xlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICghXy5jb250YWlucyhhcmd1bWVudHNbal0sIGl0ZW0pKSBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChqID09PSBhcmdzTGVuZ3RoKSByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBUYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb25lIGFycmF5IGFuZCBhIG51bWJlciBvZiBvdGhlciBhcnJheXMuXG4gIC8vIE9ubHkgdGhlIGVsZW1lbnRzIHByZXNlbnQgaW4ganVzdCB0aGUgZmlyc3QgYXJyYXkgd2lsbCByZW1haW4uXG4gIF8uZGlmZmVyZW5jZSA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgdmFyIHJlc3QgPSBmbGF0dGVuKHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgdHJ1ZSwgdHJ1ZSwgW10pO1xuICAgIHJldHVybiBfLmZpbHRlcihhcnJheSwgZnVuY3Rpb24odmFsdWUpe1xuICAgICAgcmV0dXJuICFfLmNvbnRhaW5zKHJlc3QsIHZhbHVlKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBaaXAgdG9nZXRoZXIgbXVsdGlwbGUgbGlzdHMgaW50byBhIHNpbmdsZSBhcnJheSAtLSBlbGVtZW50cyB0aGF0IHNoYXJlXG4gIC8vIGFuIGluZGV4IGdvIHRvZ2V0aGVyLlxuICBfLnppcCA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgaWYgKGFycmF5ID09IG51bGwpIHJldHVybiBbXTtcbiAgICB2YXIgbGVuZ3RoID0gXy5tYXgoYXJndW1lbnRzLCAnbGVuZ3RoJykubGVuZ3RoO1xuICAgIHZhciByZXN1bHRzID0gQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRzW2ldID0gXy5wbHVjayhhcmd1bWVudHMsIGkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfTtcblxuICAvLyBDb252ZXJ0cyBsaXN0cyBpbnRvIG9iamVjdHMuIFBhc3MgZWl0aGVyIGEgc2luZ2xlIGFycmF5IG9mIGBba2V5LCB2YWx1ZV1gXG4gIC8vIHBhaXJzLCBvciB0d28gcGFyYWxsZWwgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCAtLSBvbmUgb2Yga2V5cywgYW5kIG9uZSBvZlxuICAvLyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gIF8ub2JqZWN0ID0gZnVuY3Rpb24obGlzdCwgdmFsdWVzKSB7XG4gICAgaWYgKGxpc3QgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gbGlzdC5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICByZXN1bHRbbGlzdFtpXV0gPSB2YWx1ZXNbaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbbGlzdFtpXVswXV0gPSBsaXN0W2ldWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYW4gaXRlbSBpbiBhbiBhcnJheSxcbiAgLy8gb3IgLTEgaWYgdGhlIGl0ZW0gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBhcnJheS5cbiAgLy8gSWYgdGhlIGFycmF5IGlzIGxhcmdlIGFuZCBhbHJlYWR5IGluIHNvcnQgb3JkZXIsIHBhc3MgYHRydWVgXG4gIC8vIGZvciAqKmlzU29ydGVkKiogdG8gdXNlIGJpbmFyeSBzZWFyY2guXG4gIF8uaW5kZXhPZiA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBpc1NvcnRlZCkge1xuICAgIGlmIChhcnJheSA9PSBudWxsKSByZXR1cm4gLTE7XG4gICAgdmFyIGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gICAgaWYgKGlzU29ydGVkKSB7XG4gICAgICBpZiAodHlwZW9mIGlzU29ydGVkID09ICdudW1iZXInKSB7XG4gICAgICAgIGkgPSBpc1NvcnRlZCA8IDAgPyBNYXRoLm1heCgwLCBsZW5ndGggKyBpc1NvcnRlZCkgOiBpc1NvcnRlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkgPSBfLnNvcnRlZEluZGV4KGFycmF5LCBpdGVtKTtcbiAgICAgICAgcmV0dXJuIGFycmF5W2ldID09PSBpdGVtID8gaSA6IC0xO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSBpZiAoYXJyYXlbaV0gPT09IGl0ZW0pIHJldHVybiBpO1xuICAgIHJldHVybiAtMTtcbiAgfTtcblxuICBfLmxhc3RJbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGZyb20pIHtcbiAgICBpZiAoYXJyYXkgPT0gbnVsbCkgcmV0dXJuIC0xO1xuICAgIHZhciBpZHggPSBhcnJheS5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBmcm9tID09ICdudW1iZXInKSB7XG4gICAgICBpZHggPSBmcm9tIDwgMCA/IGlkeCArIGZyb20gKyAxIDogTWF0aC5taW4oaWR4LCBmcm9tICsgMSk7XG4gICAgfVxuICAgIHdoaWxlICgtLWlkeCA+PSAwKSBpZiAoYXJyYXlbaWR4XSA9PT0gaXRlbSkgcmV0dXJuIGlkeDtcbiAgICByZXR1cm4gLTE7XG4gIH07XG5cbiAgLy8gR2VuZXJhdGUgYW4gaW50ZWdlciBBcnJheSBjb250YWluaW5nIGFuIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb24uIEEgcG9ydCBvZlxuICAvLyB0aGUgbmF0aXZlIFB5dGhvbiBgcmFuZ2UoKWAgZnVuY3Rpb24uIFNlZVxuICAvLyBbdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uXShodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvZnVuY3Rpb25zLmh0bWwjcmFuZ2UpLlxuICBfLnJhbmdlID0gZnVuY3Rpb24oc3RhcnQsIHN0b3AsIHN0ZXApIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAxKSB7XG4gICAgICBzdG9wID0gc3RhcnQgfHwgMDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG4gICAgc3RlcCA9IHN0ZXAgfHwgMTtcblxuICAgIHZhciBsZW5ndGggPSBNYXRoLm1heChNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSwgMCk7XG4gICAgdmFyIHJhbmdlID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyssIHN0YXJ0ICs9IHN0ZXApIHtcbiAgICAgIHJhbmdlW2lkeF0gPSBzdGFydDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmFuZ2U7XG4gIH07XG5cbiAgLy8gRnVuY3Rpb24gKGFoZW0pIEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBSZXVzYWJsZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgcHJvdG90eXBlIHNldHRpbmcuXG4gIHZhciBDdG9yID0gZnVuY3Rpb24oKXt9O1xuXG4gIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIGJvdW5kIHRvIGEgZ2l2ZW4gb2JqZWN0IChhc3NpZ25pbmcgYHRoaXNgLCBhbmQgYXJndW1lbnRzLFxuICAvLyBvcHRpb25hbGx5KS4gRGVsZWdhdGVzIHRvICoqRUNNQVNjcmlwdCA1KioncyBuYXRpdmUgYEZ1bmN0aW9uLmJpbmRgIGlmXG4gIC8vIGF2YWlsYWJsZS5cbiAgXy5iaW5kID0gZnVuY3Rpb24oZnVuYywgY29udGV4dCkge1xuICAgIHZhciBhcmdzLCBib3VuZDtcbiAgICBpZiAobmF0aXZlQmluZCAmJiBmdW5jLmJpbmQgPT09IG5hdGl2ZUJpbmQpIHJldHVybiBuYXRpdmVCaW5kLmFwcGx5KGZ1bmMsIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG4gICAgaWYgKCFfLmlzRnVuY3Rpb24oZnVuYykpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JpbmQgbXVzdCBiZSBjYWxsZWQgb24gYSBmdW5jdGlvbicpO1xuICAgIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgYm91bmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBib3VuZCkpIHJldHVybiBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpO1xuICAgICAgQ3Rvci5wcm90b3R5cGUgPSBmdW5jLnByb3RvdHlwZTtcbiAgICAgIHZhciBzZWxmID0gbmV3IEN0b3I7XG4gICAgICBDdG9yLnByb3RvdHlwZSA9IG51bGw7XG4gICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseShzZWxmLCBhcmdzLmNvbmNhdChzbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgICAgIGlmIChfLmlzT2JqZWN0KHJlc3VsdCkpIHJldHVybiByZXN1bHQ7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9O1xuICAgIHJldHVybiBib3VuZDtcbiAgfTtcblxuICAvLyBQYXJ0aWFsbHkgYXBwbHkgYSBmdW5jdGlvbiBieSBjcmVhdGluZyBhIHZlcnNpb24gdGhhdCBoYXMgaGFkIHNvbWUgb2YgaXRzXG4gIC8vIGFyZ3VtZW50cyBwcmUtZmlsbGVkLCB3aXRob3V0IGNoYW5naW5nIGl0cyBkeW5hbWljIGB0aGlzYCBjb250ZXh0LiBfIGFjdHNcbiAgLy8gYXMgYSBwbGFjZWhvbGRlciwgYWxsb3dpbmcgYW55IGNvbWJpbmF0aW9uIG9mIGFyZ3VtZW50cyB0byBiZSBwcmUtZmlsbGVkLlxuICBfLnBhcnRpYWwgPSBmdW5jdGlvbihmdW5jKSB7XG4gICAgdmFyIGJvdW5kQXJncyA9IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcG9zaXRpb24gPSAwO1xuICAgICAgdmFyIGFyZ3MgPSBib3VuZEFyZ3Muc2xpY2UoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBhcmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhcmdzW2ldID09PSBfKSBhcmdzW2ldID0gYXJndW1lbnRzW3Bvc2l0aW9uKytdO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgYXJndW1lbnRzLmxlbmd0aCkgYXJncy5wdXNoKGFyZ3VtZW50c1twb3NpdGlvbisrXSk7XG4gICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIEJpbmQgYSBudW1iZXIgb2YgYW4gb2JqZWN0J3MgbWV0aG9kcyB0byB0aGF0IG9iamVjdC4gUmVtYWluaW5nIGFyZ3VtZW50c1xuICAvLyBhcmUgdGhlIG1ldGhvZCBuYW1lcyB0byBiZSBib3VuZC4gVXNlZnVsIGZvciBlbnN1cmluZyB0aGF0IGFsbCBjYWxsYmFja3NcbiAgLy8gZGVmaW5lZCBvbiBhbiBvYmplY3QgYmVsb25nIHRvIGl0LlxuICBfLmJpbmRBbGwgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgaSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCwga2V5O1xuICAgIGlmIChsZW5ndGggPD0gMSkgdGhyb3cgbmV3IEVycm9yKCdiaW5kQWxsIG11c3QgYmUgcGFzc2VkIGZ1bmN0aW9uIG5hbWVzJyk7XG4gICAgZm9yIChpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBhcmd1bWVudHNbaV07XG4gICAgICBvYmpba2V5XSA9IF8uYmluZChvYmpba2V5XSwgb2JqKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfTtcblxuICAvLyBNZW1vaXplIGFuIGV4cGVuc2l2ZSBmdW5jdGlvbiBieSBzdG9yaW5nIGl0cyByZXN1bHRzLlxuICBfLm1lbW9pemUgPSBmdW5jdGlvbihmdW5jLCBoYXNoZXIpIHtcbiAgICB2YXIgbWVtb2l6ZSA9IGZ1bmN0aW9uKGtleSkge1xuICAgICAgdmFyIGNhY2hlID0gbWVtb2l6ZS5jYWNoZTtcbiAgICAgIHZhciBhZGRyZXNzID0gaGFzaGVyID8gaGFzaGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrZXk7XG4gICAgICBpZiAoIV8uaGFzKGNhY2hlLCBhZGRyZXNzKSkgY2FjaGVbYWRkcmVzc10gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gY2FjaGVbYWRkcmVzc107XG4gICAgfTtcbiAgICBtZW1vaXplLmNhY2hlID0ge307XG4gICAgcmV0dXJuIG1lbW9pemU7XG4gIH07XG5cbiAgLy8gRGVsYXlzIGEgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCBhbmQgdGhlbiBjYWxsc1xuICAvLyBpdCB3aXRoIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQuXG4gIF8uZGVsYXkgPSBmdW5jdGlvbihmdW5jLCB3YWl0KSB7XG4gICAgdmFyIGFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMik7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0sIHdhaXQpO1xuICB9O1xuXG4gIC8vIERlZmVycyBhIGZ1bmN0aW9uLCBzY2hlZHVsaW5nIGl0IHRvIHJ1biBhZnRlciB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhc1xuICAvLyBjbGVhcmVkLlxuICBfLmRlZmVyID0gZnVuY3Rpb24oZnVuYykge1xuICAgIHJldHVybiBfLmRlbGF5LmFwcGx5KF8sIFtmdW5jLCAxXS5jb25jYXQoc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uLCB0aGF0LCB3aGVuIGludm9rZWQsIHdpbGwgb25seSBiZSB0cmlnZ2VyZWQgYXQgbW9zdCBvbmNlXG4gIC8vIGR1cmluZyBhIGdpdmVuIHdpbmRvdyBvZiB0aW1lLiBOb3JtYWxseSwgdGhlIHRocm90dGxlZCBmdW5jdGlvbiB3aWxsIHJ1blxuICAvLyBhcyBtdWNoIGFzIGl0IGNhbiwgd2l0aG91dCBldmVyIGdvaW5nIG1vcmUgdGhhbiBvbmNlIHBlciBgd2FpdGAgZHVyYXRpb247XG4gIC8vIGJ1dCBpZiB5b3UnZCBsaWtlIHRvIGRpc2FibGUgdGhlIGV4ZWN1dGlvbiBvbiB0aGUgbGVhZGluZyBlZGdlLCBwYXNzXG4gIC8vIGB7bGVhZGluZzogZmFsc2V9YC4gVG8gZGlzYWJsZSBleGVjdXRpb24gb24gdGhlIHRyYWlsaW5nIGVkZ2UsIGRpdHRvLlxuICBfLnRocm90dGxlID0gZnVuY3Rpb24oZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgIHZhciBjb250ZXh0LCBhcmdzLCByZXN1bHQ7XG4gICAgdmFyIHRpbWVvdXQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91cyA9IDA7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307XG4gICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICBwcmV2aW91cyA9IG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UgPyAwIDogXy5ub3coKTtcbiAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG5vdyA9IF8ubm93KCk7XG4gICAgICBpZiAoIXByZXZpb3VzICYmIG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UpIHByZXZpb3VzID0gbm93O1xuICAgICAgdmFyIHJlbWFpbmluZyA9IHdhaXQgLSAobm93IC0gcHJldmlvdXMpO1xuICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgaWYgKHJlbWFpbmluZyA8PSAwIHx8IHJlbWFpbmluZyA+IHdhaXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgcHJldmlvdXMgPSBub3c7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICghdGltZW91dCAmJiBvcHRpb25zLnRyYWlsaW5nICE9PSBmYWxzZSkge1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24sIHRoYXQsIGFzIGxvbmcgYXMgaXQgY29udGludWVzIHRvIGJlIGludm9rZWQsIHdpbGwgbm90XG4gIC8vIGJlIHRyaWdnZXJlZC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGl0IHN0b3BzIGJlaW5nIGNhbGxlZCBmb3JcbiAgLy8gTiBtaWxsaXNlY29uZHMuIElmIGBpbW1lZGlhdGVgIGlzIHBhc3NlZCwgdHJpZ2dlciB0aGUgZnVuY3Rpb24gb24gdGhlXG4gIC8vIGxlYWRpbmcgZWRnZSwgaW5zdGVhZCBvZiB0aGUgdHJhaWxpbmcuXG4gIF8uZGVib3VuY2UgPSBmdW5jdGlvbihmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICB2YXIgdGltZW91dCwgYXJncywgY29udGV4dCwgdGltZXN0YW1wLCByZXN1bHQ7XG5cbiAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBsYXN0ID0gXy5ub3coKSAtIHRpbWVzdGFtcDtcblxuICAgICAgaWYgKGxhc3QgPCB3YWl0ICYmIGxhc3QgPiAwKSB7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0IC0gbGFzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFpbW1lZGlhdGUpIHtcbiAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnRleHQgPSB0aGlzO1xuICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHRpbWVzdGFtcCA9IF8ubm93KCk7XG4gICAgICB2YXIgY2FsbE5vdyA9IGltbWVkaWF0ZSAmJiAhdGltZW91dDtcbiAgICAgIGlmICghdGltZW91dCkgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgaWYgKGNhbGxOb3cpIHtcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0aGUgZmlyc3QgZnVuY3Rpb24gcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBzZWNvbmQsXG4gIC8vIGFsbG93aW5nIHlvdSB0byBhZGp1c3QgYXJndW1lbnRzLCBydW4gY29kZSBiZWZvcmUgYW5kIGFmdGVyLCBhbmRcbiAgLy8gY29uZGl0aW9uYWxseSBleGVjdXRlIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi5cbiAgXy53cmFwID0gZnVuY3Rpb24oZnVuYywgd3JhcHBlcikge1xuICAgIHJldHVybiBfLnBhcnRpYWwod3JhcHBlciwgZnVuYyk7XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIG5lZ2F0ZWQgdmVyc2lvbiBvZiB0aGUgcGFzc2VkLWluIHByZWRpY2F0ZS5cbiAgXy5uZWdhdGUgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgaXMgdGhlIGNvbXBvc2l0aW9uIG9mIGEgbGlzdCBvZiBmdW5jdGlvbnMsIGVhY2hcbiAgLy8gY29uc3VtaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgZm9sbG93cy5cbiAgXy5jb21wb3NlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHN0YXJ0ID0gYXJncy5sZW5ndGggLSAxO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBpID0gc3RhcnQ7XG4gICAgICB2YXIgcmVzdWx0ID0gYXJnc1tzdGFydF0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHdoaWxlIChpLS0pIHJlc3VsdCA9IGFyZ3NbaV0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgb25seSBiZSBleGVjdXRlZCBhZnRlciBiZWluZyBjYWxsZWQgTiB0aW1lcy5cbiAgXy5hZnRlciA9IGZ1bmN0aW9uKHRpbWVzLCBmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGltZXMgPCAxKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB3aWxsIG9ubHkgYmUgZXhlY3V0ZWQgYmVmb3JlIGJlaW5nIGNhbGxlZCBOIHRpbWVzLlxuICBfLmJlZm9yZSA9IGZ1bmN0aW9uKHRpbWVzLCBmdW5jKSB7XG4gICAgdmFyIG1lbW87XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGltZXMgPiAwKSB7XG4gICAgICAgIG1lbW8gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmdW5jID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhdCBtb3N0IG9uZSB0aW1lLCBubyBtYXR0ZXIgaG93XG4gIC8vIG9mdGVuIHlvdSBjYWxsIGl0LiBVc2VmdWwgZm9yIGxhenkgaW5pdGlhbGl6YXRpb24uXG4gIF8ub25jZSA9IF8ucGFydGlhbChfLmJlZm9yZSwgMik7XG5cbiAgLy8gT2JqZWN0IEZ1bmN0aW9uc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gUmV0cmlldmUgdGhlIG5hbWVzIG9mIGFuIG9iamVjdCdzIHByb3BlcnRpZXMuXG4gIC8vIERlbGVnYXRlcyB0byAqKkVDTUFTY3JpcHQgNSoqJ3MgbmF0aXZlIGBPYmplY3Qua2V5c2BcbiAgXy5rZXlzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBbXTtcbiAgICBpZiAobmF0aXZlS2V5cykgcmV0dXJuIG5hdGl2ZUtleXMob2JqKTtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIGlmIChfLmhhcyhvYmosIGtleSkpIGtleXMucHVzaChrZXkpO1xuICAgIHJldHVybiBrZXlzO1xuICB9O1xuXG4gIC8vIFJldHJpZXZlIHRoZSB2YWx1ZXMgb2YgYW4gb2JqZWN0J3MgcHJvcGVydGllcy5cbiAgXy52YWx1ZXMgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgdmFsdWVzID0gQXJyYXkobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZXNbaV0gPSBvYmpba2V5c1tpXV07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH07XG5cbiAgLy8gQ29udmVydCBhbiBvYmplY3QgaW50byBhIGxpc3Qgb2YgYFtrZXksIHZhbHVlXWAgcGFpcnMuXG4gIF8ucGFpcnMgPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIga2V5cyA9IF8ua2V5cyhvYmopO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgcGFpcnMgPSBBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhaXJzW2ldID0gW2tleXNbaV0sIG9ialtrZXlzW2ldXV07XG4gICAgfVxuICAgIHJldHVybiBwYWlycztcbiAgfTtcblxuICAvLyBJbnZlcnQgdGhlIGtleXMgYW5kIHZhbHVlcyBvZiBhbiBvYmplY3QuIFRoZSB2YWx1ZXMgbXVzdCBiZSBzZXJpYWxpemFibGUuXG4gIF8uaW52ZXJ0ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBrZXlzID0gXy5rZXlzKG9iaik7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtvYmpba2V5c1tpXV1dID0ga2V5c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBSZXR1cm4gYSBzb3J0ZWQgbGlzdCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgYXZhaWxhYmxlIG9uIHRoZSBvYmplY3QuXG4gIC8vIEFsaWFzZWQgYXMgYG1ldGhvZHNgXG4gIF8uZnVuY3Rpb25zID0gXy5tZXRob2RzID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaWYgKF8uaXNGdW5jdGlvbihvYmpba2V5XSkpIG5hbWVzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVzLnNvcnQoKTtcbiAgfTtcblxuICAvLyBFeHRlbmQgYSBnaXZlbiBvYmplY3Qgd2l0aCBhbGwgdGhlIHByb3BlcnRpZXMgaW4gcGFzc2VkLWluIG9iamVjdChzKS5cbiAgXy5leHRlbmQgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAoIV8uaXNPYmplY3Qob2JqKSkgcmV0dXJuIG9iajtcbiAgICB2YXIgc291cmNlLCBwcm9wO1xuICAgIGZvciAodmFyIGkgPSAxLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAocHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBwcm9wKSkge1xuICAgICAgICAgICAgb2JqW3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH07XG5cbiAgLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgb2JqZWN0IG9ubHkgY29udGFpbmluZyB0aGUgd2hpdGVsaXN0ZWQgcHJvcGVydGllcy5cbiAgXy5waWNrID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciByZXN1bHQgPSB7fSwga2V5O1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKGl0ZXJhdGVlKSkge1xuICAgICAgaXRlcmF0ZWUgPSBjcmVhdGVDYWxsYmFjayhpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgdmFyIHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIGlmIChpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmopKSByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIga2V5cyA9IGNvbmNhdC5hcHBseShbXSwgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICAgIG9iaiA9IG5ldyBPYmplY3Qob2JqKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBrZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmIChrZXkgaW4gb2JqKSByZXN1bHRba2V5XSA9IG9ialtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBvYmplY3Qgd2l0aG91dCB0aGUgYmxhY2tsaXN0ZWQgcHJvcGVydGllcy5cbiAgXy5vbWl0ID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIGlmIChfLmlzRnVuY3Rpb24oaXRlcmF0ZWUpKSB7XG4gICAgICBpdGVyYXRlZSA9IF8ubmVnYXRlKGl0ZXJhdGVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGtleXMgPSBfLm1hcChjb25jYXQuYXBwbHkoW10sIHNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSksIFN0cmluZyk7XG4gICAgICBpdGVyYXRlZSA9IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuICFfLmNvbnRhaW5zKGtleXMsIGtleSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gXy5waWNrKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpO1xuICB9O1xuXG4gIC8vIEZpbGwgaW4gYSBnaXZlbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gIF8uZGVmYXVsdHMgPSBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAoIV8uaXNPYmplY3Qob2JqKSkgcmV0dXJuIG9iajtcbiAgICBmb3IgKHZhciBpID0gMSwgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgICAgZm9yICh2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKG9ialtwcm9wXSA9PT0gdm9pZCAwKSBvYmpbcHJvcF0gPSBzb3VyY2VbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG4gIH07XG5cbiAgLy8gQ3JlYXRlIGEgKHNoYWxsb3ctY2xvbmVkKSBkdXBsaWNhdGUgb2YgYW4gb2JqZWN0LlxuICBfLmNsb25lID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKCFfLmlzT2JqZWN0KG9iaikpIHJldHVybiBvYmo7XG4gICAgcmV0dXJuIF8uaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBfLmV4dGVuZCh7fSwgb2JqKTtcbiAgfTtcblxuICAvLyBJbnZva2VzIGludGVyY2VwdG9yIHdpdGggdGhlIG9iaiwgYW5kIHRoZW4gcmV0dXJucyBvYmouXG4gIC8vIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gXCJ0YXAgaW50b1wiIGEgbWV0aG9kIGNoYWluLCBpblxuICAvLyBvcmRlciB0byBwZXJmb3JtIG9wZXJhdGlvbnMgb24gaW50ZXJtZWRpYXRlIHJlc3VsdHMgd2l0aGluIHRoZSBjaGFpbi5cbiAgXy50YXAgPSBmdW5jdGlvbihvYmosIGludGVyY2VwdG9yKSB7XG4gICAgaW50ZXJjZXB0b3Iob2JqKTtcbiAgICByZXR1cm4gb2JqO1xuICB9O1xuXG4gIC8vIEludGVybmFsIHJlY3Vyc2l2ZSBjb21wYXJpc29uIGZ1bmN0aW9uIGZvciBgaXNFcXVhbGAuXG4gIHZhciBlcSA9IGZ1bmN0aW9uKGEsIGIsIGFTdGFjaywgYlN0YWNrKSB7XG4gICAgLy8gSWRlbnRpY2FsIG9iamVjdHMgYXJlIGVxdWFsLiBgMCA9PT0gLTBgLCBidXQgdGhleSBhcmVuJ3QgaWRlbnRpY2FsLlxuICAgIC8vIFNlZSB0aGUgW0hhcm1vbnkgYGVnYWxgIHByb3Bvc2FsXShodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1oYXJtb255OmVnYWwpLlxuICAgIGlmIChhID09PSBiKSByZXR1cm4gYSAhPT0gMCB8fCAxIC8gYSA9PT0gMSAvIGI7XG4gICAgLy8gQSBzdHJpY3QgY29tcGFyaXNvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBgbnVsbCA9PSB1bmRlZmluZWRgLlxuICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gYSA9PT0gYjtcbiAgICAvLyBVbndyYXAgYW55IHdyYXBwZWQgb2JqZWN0cy5cbiAgICBpZiAoYSBpbnN0YW5jZW9mIF8pIGEgPSBhLl93cmFwcGVkO1xuICAgIGlmIChiIGluc3RhbmNlb2YgXykgYiA9IGIuX3dyYXBwZWQ7XG4gICAgLy8gQ29tcGFyZSBgW1tDbGFzc11dYCBuYW1lcy5cbiAgICB2YXIgY2xhc3NOYW1lID0gdG9TdHJpbmcuY2FsbChhKTtcbiAgICBpZiAoY2xhc3NOYW1lICE9PSB0b1N0cmluZy5jYWxsKGIpKSByZXR1cm4gZmFsc2U7XG4gICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgIC8vIFN0cmluZ3MsIG51bWJlcnMsIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGRhdGVzLCBhbmQgYm9vbGVhbnMgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlLlxuICAgICAgY2FzZSAnW29iamVjdCBSZWdFeHBdJzpcbiAgICAgIC8vIFJlZ0V4cHMgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncyBmb3IgY29tcGFyaXNvbiAoTm90ZTogJycgKyAvYS9pID09PSAnL2EvaScpXG4gICAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuICAgICAgICAvLyBQcmltaXRpdmVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIG9iamVjdCB3cmFwcGVycyBhcmUgZXF1aXZhbGVudDsgdGh1cywgYFwiNVwiYCBpc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIGBuZXcgU3RyaW5nKFwiNVwiKWAuXG4gICAgICAgIHJldHVybiAnJyArIGEgPT09ICcnICsgYjtcbiAgICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICAgIC8vIGBOYU5gcyBhcmUgZXF1aXZhbGVudCwgYnV0IG5vbi1yZWZsZXhpdmUuXG4gICAgICAgIC8vIE9iamVjdChOYU4pIGlzIGVxdWl2YWxlbnQgdG8gTmFOXG4gICAgICAgIGlmICgrYSAhPT0gK2EpIHJldHVybiArYiAhPT0gK2I7XG4gICAgICAgIC8vIEFuIGBlZ2FsYCBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBmb3Igb3RoZXIgbnVtZXJpYyB2YWx1ZXMuXG4gICAgICAgIHJldHVybiArYSA9PT0gMCA/IDEgLyArYSA9PT0gMSAvIGIgOiArYSA9PT0gK2I7XG4gICAgICBjYXNlICdbb2JqZWN0IERhdGVdJzpcbiAgICAgIGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuICAgICAgICAvLyBDb2VyY2UgZGF0ZXMgYW5kIGJvb2xlYW5zIHRvIG51bWVyaWMgcHJpbWl0aXZlIHZhbHVlcy4gRGF0ZXMgYXJlIGNvbXBhcmVkIGJ5IHRoZWlyXG4gICAgICAgIC8vIG1pbGxpc2Vjb25kIHJlcHJlc2VudGF0aW9ucy4gTm90ZSB0aGF0IGludmFsaWQgZGF0ZXMgd2l0aCBtaWxsaXNlY29uZCByZXByZXNlbnRhdGlvbnNcbiAgICAgICAgLy8gb2YgYE5hTmAgYXJlIG5vdCBlcXVpdmFsZW50LlxuICAgICAgICByZXR1cm4gK2EgPT09ICtiO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGEgIT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgIT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgICAvLyBBc3N1bWUgZXF1YWxpdHkgZm9yIGN5Y2xpYyBzdHJ1Y3R1cmVzLiBUaGUgYWxnb3JpdGhtIGZvciBkZXRlY3RpbmcgY3ljbGljXG4gICAgLy8gc3RydWN0dXJlcyBpcyBhZGFwdGVkIGZyb20gRVMgNS4xIHNlY3Rpb24gMTUuMTIuMywgYWJzdHJhY3Qgb3BlcmF0aW9uIGBKT2AuXG4gICAgdmFyIGxlbmd0aCA9IGFTdGFjay5sZW5ndGg7XG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAvLyBMaW5lYXIgc2VhcmNoLiBQZXJmb3JtYW5jZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2ZcbiAgICAgIC8vIHVuaXF1ZSBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICAgIGlmIChhU3RhY2tbbGVuZ3RoXSA9PT0gYSkgcmV0dXJuIGJTdGFja1tsZW5ndGhdID09PSBiO1xuICAgIH1cbiAgICAvLyBPYmplY3RzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWl2YWxlbnQsIGJ1dCBgT2JqZWN0YHNcbiAgICAvLyBmcm9tIGRpZmZlcmVudCBmcmFtZXMgYXJlLlxuICAgIHZhciBhQ3RvciA9IGEuY29uc3RydWN0b3IsIGJDdG9yID0gYi5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoXG4gICAgICBhQ3RvciAhPT0gYkN0b3IgJiZcbiAgICAgIC8vIEhhbmRsZSBPYmplY3QuY3JlYXRlKHgpIGNhc2VzXG4gICAgICAnY29uc3RydWN0b3InIGluIGEgJiYgJ2NvbnN0cnVjdG9yJyBpbiBiICYmXG4gICAgICAhKF8uaXNGdW5jdGlvbihhQ3RvcikgJiYgYUN0b3IgaW5zdGFuY2VvZiBhQ3RvciAmJlxuICAgICAgICBfLmlzRnVuY3Rpb24oYkN0b3IpICYmIGJDdG9yIGluc3RhbmNlb2YgYkN0b3IpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIEFkZCB0aGUgZmlyc3Qgb2JqZWN0IHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICBhU3RhY2sucHVzaChhKTtcbiAgICBiU3RhY2sucHVzaChiKTtcbiAgICB2YXIgc2l6ZSwgcmVzdWx0O1xuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICAgIGlmIChjbGFzc05hbWUgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICAgIC8vIENvbXBhcmUgYXJyYXkgbGVuZ3RocyB0byBkZXRlcm1pbmUgaWYgYSBkZWVwIGNvbXBhcmlzb24gaXMgbmVjZXNzYXJ5LlxuICAgICAgc2l6ZSA9IGEubGVuZ3RoO1xuICAgICAgcmVzdWx0ID0gc2l6ZSA9PT0gYi5sZW5ndGg7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIC8vIERlZXAgY29tcGFyZSB0aGUgY29udGVudHMsIGlnbm9yaW5nIG5vbi1udW1lcmljIHByb3BlcnRpZXMuXG4gICAgICAgIHdoaWxlIChzaXplLS0pIHtcbiAgICAgICAgICBpZiAoIShyZXN1bHQgPSBlcShhW3NpemVdLCBiW3NpemVdLCBhU3RhY2ssIGJTdGFjaykpKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWVwIGNvbXBhcmUgb2JqZWN0cy5cbiAgICAgIHZhciBrZXlzID0gXy5rZXlzKGEpLCBrZXk7XG4gICAgICBzaXplID0ga2V5cy5sZW5ndGg7XG4gICAgICAvLyBFbnN1cmUgdGhhdCBib3RoIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBudW1iZXIgb2YgcHJvcGVydGllcyBiZWZvcmUgY29tcGFyaW5nIGRlZXAgZXF1YWxpdHkuXG4gICAgICByZXN1bHQgPSBfLmtleXMoYikubGVuZ3RoID09PSBzaXplO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB3aGlsZSAoc2l6ZS0tKSB7XG4gICAgICAgICAgLy8gRGVlcCBjb21wYXJlIGVhY2ggbWVtYmVyXG4gICAgICAgICAga2V5ID0ga2V5c1tzaXplXTtcbiAgICAgICAgICBpZiAoIShyZXN1bHQgPSBfLmhhcyhiLCBrZXkpICYmIGVxKGFba2V5XSwgYltrZXldLCBhU3RhY2ssIGJTdGFjaykpKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IG9iamVjdCBmcm9tIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICBhU3RhY2sucG9wKCk7XG4gICAgYlN0YWNrLnBvcCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLy8gUGVyZm9ybSBhIGRlZXAgY29tcGFyaXNvbiB0byBjaGVjayBpZiB0d28gb2JqZWN0cyBhcmUgZXF1YWwuXG4gIF8uaXNFcXVhbCA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gZXEoYSwgYiwgW10sIFtdKTtcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIGFycmF5LCBzdHJpbmcsIG9yIG9iamVjdCBlbXB0eT9cbiAgLy8gQW4gXCJlbXB0eVwiIG9iamVjdCBoYXMgbm8gZW51bWVyYWJsZSBvd24tcHJvcGVydGllcy5cbiAgXy5pc0VtcHR5ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoXy5pc0FycmF5KG9iaikgfHwgXy5pc1N0cmluZyhvYmopIHx8IF8uaXNBcmd1bWVudHMob2JqKSkgcmV0dXJuIG9iai5sZW5ndGggPT09IDA7XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikgaWYgKF8uaGFzKG9iaiwga2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFsdWUgYSBET00gZWxlbWVudD9cbiAgXy5pc0VsZW1lbnQgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gISEob2JqICYmIG9iai5ub2RlVHlwZSA9PT0gMSk7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBhbiBhcnJheT9cbiAgLy8gRGVsZWdhdGVzIHRvIEVDTUE1J3MgbmF0aXZlIEFycmF5LmlzQXJyYXlcbiAgXy5pc0FycmF5ID0gbmF0aXZlSXNBcnJheSB8fCBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBBcnJheV0nO1xuICB9O1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFyaWFibGUgYW4gb2JqZWN0P1xuICBfLmlzT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgdmFyIHR5cGUgPSB0eXBlb2Ygb2JqO1xuICAgIHJldHVybiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IHR5cGUgPT09ICdvYmplY3QnICYmICEhb2JqO1xuICB9O1xuXG4gIC8vIEFkZCBzb21lIGlzVHlwZSBtZXRob2RzOiBpc0FyZ3VtZW50cywgaXNGdW5jdGlvbiwgaXNTdHJpbmcsIGlzTnVtYmVyLCBpc0RhdGUsIGlzUmVnRXhwLlxuICBfLmVhY2goWydBcmd1bWVudHMnLCAnRnVuY3Rpb24nLCAnU3RyaW5nJywgJ051bWJlcicsICdEYXRlJywgJ1JlZ0V4cCddLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgX1snaXMnICsgbmFtZV0gPSBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0ICcgKyBuYW1lICsgJ10nO1xuICAgIH07XG4gIH0pO1xuXG4gIC8vIERlZmluZSBhIGZhbGxiYWNrIHZlcnNpb24gb2YgdGhlIG1ldGhvZCBpbiBicm93c2VycyAoYWhlbSwgSUUpLCB3aGVyZVxuICAvLyB0aGVyZSBpc24ndCBhbnkgaW5zcGVjdGFibGUgXCJBcmd1bWVudHNcIiB0eXBlLlxuICBpZiAoIV8uaXNBcmd1bWVudHMoYXJndW1lbnRzKSkge1xuICAgIF8uaXNBcmd1bWVudHMgPSBmdW5jdGlvbihvYmopIHtcbiAgICAgIHJldHVybiBfLmhhcyhvYmosICdjYWxsZWUnKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gT3B0aW1pemUgYGlzRnVuY3Rpb25gIGlmIGFwcHJvcHJpYXRlLiBXb3JrIGFyb3VuZCBhbiBJRSAxMSBidWcuXG4gIGlmICh0eXBlb2YgLy4vICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgXy5pc0Z1bmN0aW9uID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PSAnZnVuY3Rpb24nIHx8IGZhbHNlO1xuICAgIH07XG4gIH1cblxuICAvLyBJcyBhIGdpdmVuIG9iamVjdCBhIGZpbml0ZSBudW1iZXI/XG4gIF8uaXNGaW5pdGUgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gaXNGaW5pdGUob2JqKSAmJiAhaXNOYU4ocGFyc2VGbG9hdChvYmopKTtcbiAgfTtcblxuICAvLyBJcyB0aGUgZ2l2ZW4gdmFsdWUgYE5hTmA/IChOYU4gaXMgdGhlIG9ubHkgbnVtYmVyIHdoaWNoIGRvZXMgbm90IGVxdWFsIGl0c2VsZikuXG4gIF8uaXNOYU4gPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gXy5pc051bWJlcihvYmopICYmIG9iaiAhPT0gK29iajtcbiAgfTtcblxuICAvLyBJcyBhIGdpdmVuIHZhbHVlIGEgYm9vbGVhbj9cbiAgXy5pc0Jvb2xlYW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB0cnVlIHx8IG9iaiA9PT0gZmFsc2UgfHwgdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBCb29sZWFuXSc7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBlcXVhbCB0byBudWxsP1xuICBfLmlzTnVsbCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiBvYmogPT09IG51bGw7XG4gIH07XG5cbiAgLy8gSXMgYSBnaXZlbiB2YXJpYWJsZSB1bmRlZmluZWQ/XG4gIF8uaXNVbmRlZmluZWQgPSBmdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB2b2lkIDA7XG4gIH07XG5cbiAgLy8gU2hvcnRjdXQgZnVuY3Rpb24gZm9yIGNoZWNraW5nIGlmIGFuIG9iamVjdCBoYXMgYSBnaXZlbiBwcm9wZXJ0eSBkaXJlY3RseVxuICAvLyBvbiBpdHNlbGYgKGluIG90aGVyIHdvcmRzLCBub3Qgb24gYSBwcm90b3R5cGUpLlxuICBfLmhhcyA9IGZ1bmN0aW9uKG9iaiwga2V5KSB7XG4gICAgcmV0dXJuIG9iaiAhPSBudWxsICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpO1xuICB9O1xuXG4gIC8vIFV0aWxpdHkgRnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gUnVuIFVuZGVyc2NvcmUuanMgaW4gKm5vQ29uZmxpY3QqIG1vZGUsIHJldHVybmluZyB0aGUgYF9gIHZhcmlhYmxlIHRvIGl0c1xuICAvLyBwcmV2aW91cyBvd25lci4gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QuXG4gIF8ubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIHJvb3QuXyA9IHByZXZpb3VzVW5kZXJzY29yZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBLZWVwIHRoZSBpZGVudGl0eSBmdW5jdGlvbiBhcm91bmQgZm9yIGRlZmF1bHQgaXRlcmF0ZWVzLlxuICBfLmlkZW50aXR5ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgXy5jb25zdGFudCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gIH07XG5cbiAgXy5ub29wID0gZnVuY3Rpb24oKXt9O1xuXG4gIF8ucHJvcGVydHkgPSBmdW5jdGlvbihrZXkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqW2tleV07XG4gICAgfTtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGEgcHJlZGljYXRlIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIG9iamVjdCBoYXMgYSBnaXZlbiBzZXQgb2YgYGtleTp2YWx1ZWAgcGFpcnMuXG4gIF8ubWF0Y2hlcyA9IGZ1bmN0aW9uKGF0dHJzKSB7XG4gICAgdmFyIHBhaXJzID0gXy5wYWlycyhhdHRycyksIGxlbmd0aCA9IHBhaXJzLmxlbmd0aDtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiAhbGVuZ3RoO1xuICAgICAgb2JqID0gbmV3IE9iamVjdChvYmopO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcGFpciA9IHBhaXJzW2ldLCBrZXkgPSBwYWlyWzBdO1xuICAgICAgICBpZiAocGFpclsxXSAhPT0gb2JqW2tleV0gfHwgIShrZXkgaW4gb2JqKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgfTtcblxuICAvLyBSdW4gYSBmdW5jdGlvbiAqKm4qKiB0aW1lcy5cbiAgXy50aW1lcyA9IGZ1bmN0aW9uKG4sIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgdmFyIGFjY3VtID0gQXJyYXkoTWF0aC5tYXgoMCwgbikpO1xuICAgIGl0ZXJhdGVlID0gY3JlYXRlQ2FsbGJhY2soaXRlcmF0ZWUsIGNvbnRleHQsIDEpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSBhY2N1bVtpXSA9IGl0ZXJhdGVlKGkpO1xuICAgIHJldHVybiBhY2N1bTtcbiAgfTtcblxuICAvLyBSZXR1cm4gYSByYW5kb20gaW50ZWdlciBiZXR3ZWVuIG1pbiBhbmQgbWF4IChpbmNsdXNpdmUpLlxuICBfLnJhbmRvbSA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG4gICAgaWYgKG1heCA9PSBudWxsKSB7XG4gICAgICBtYXggPSBtaW47XG4gICAgICBtaW4gPSAwO1xuICAgIH1cbiAgICByZXR1cm4gbWluICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKTtcbiAgfTtcblxuICAvLyBBIChwb3NzaWJseSBmYXN0ZXIpIHdheSB0byBnZXQgdGhlIGN1cnJlbnQgdGltZXN0YW1wIGFzIGFuIGludGVnZXIuXG4gIF8ubm93ID0gRGF0ZS5ub3cgfHwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9O1xuXG4gICAvLyBMaXN0IG9mIEhUTUwgZW50aXRpZXMgZm9yIGVzY2FwaW5nLlxuICB2YXIgZXNjYXBlTWFwID0ge1xuICAgICcmJzogJyZhbXA7JyxcbiAgICAnPCc6ICcmbHQ7JyxcbiAgICAnPic6ICcmZ3Q7JyxcbiAgICAnXCInOiAnJnF1b3Q7JyxcbiAgICBcIidcIjogJyYjeDI3OycsXG4gICAgJ2AnOiAnJiN4NjA7J1xuICB9O1xuICB2YXIgdW5lc2NhcGVNYXAgPSBfLmludmVydChlc2NhcGVNYXApO1xuXG4gIC8vIEZ1bmN0aW9ucyBmb3IgZXNjYXBpbmcgYW5kIHVuZXNjYXBpbmcgc3RyaW5ncyB0by9mcm9tIEhUTUwgaW50ZXJwb2xhdGlvbi5cbiAgdmFyIGNyZWF0ZUVzY2FwZXIgPSBmdW5jdGlvbihtYXApIHtcbiAgICB2YXIgZXNjYXBlciA9IGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWFwW21hdGNoXTtcbiAgICB9O1xuICAgIC8vIFJlZ2V4ZXMgZm9yIGlkZW50aWZ5aW5nIGEga2V5IHRoYXQgbmVlZHMgdG8gYmUgZXNjYXBlZFxuICAgIHZhciBzb3VyY2UgPSAnKD86JyArIF8ua2V5cyhtYXApLmpvaW4oJ3wnKSArICcpJztcbiAgICB2YXIgdGVzdFJlZ2V4cCA9IFJlZ0V4cChzb3VyY2UpO1xuICAgIHZhciByZXBsYWNlUmVnZXhwID0gUmVnRXhwKHNvdXJjZSwgJ2cnKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSBzdHJpbmcgPT0gbnVsbCA/ICcnIDogJycgKyBzdHJpbmc7XG4gICAgICByZXR1cm4gdGVzdFJlZ2V4cC50ZXN0KHN0cmluZykgPyBzdHJpbmcucmVwbGFjZShyZXBsYWNlUmVnZXhwLCBlc2NhcGVyKSA6IHN0cmluZztcbiAgICB9O1xuICB9O1xuICBfLmVzY2FwZSA9IGNyZWF0ZUVzY2FwZXIoZXNjYXBlTWFwKTtcbiAgXy51bmVzY2FwZSA9IGNyZWF0ZUVzY2FwZXIodW5lc2NhcGVNYXApO1xuXG4gIC8vIElmIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZWQgYHByb3BlcnR5YCBpcyBhIGZ1bmN0aW9uIHRoZW4gaW52b2tlIGl0IHdpdGggdGhlXG4gIC8vIGBvYmplY3RgIGFzIGNvbnRleHQ7IG90aGVyd2lzZSwgcmV0dXJuIGl0LlxuICBfLnJlc3VsdCA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgICBpZiAob2JqZWN0ID09IG51bGwpIHJldHVybiB2b2lkIDA7XG4gICAgdmFyIHZhbHVlID0gb2JqZWN0W3Byb3BlcnR5XTtcbiAgICByZXR1cm4gXy5pc0Z1bmN0aW9uKHZhbHVlKSA/IG9iamVjdFtwcm9wZXJ0eV0oKSA6IHZhbHVlO1xuICB9O1xuXG4gIC8vIEdlbmVyYXRlIGEgdW5pcXVlIGludGVnZXIgaWQgKHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSBjbGllbnQgc2Vzc2lvbikuXG4gIC8vIFVzZWZ1bCBmb3IgdGVtcG9yYXJ5IERPTSBpZHMuXG4gIHZhciBpZENvdW50ZXIgPSAwO1xuICBfLnVuaXF1ZUlkID0gZnVuY3Rpb24ocHJlZml4KSB7XG4gICAgdmFyIGlkID0gKytpZENvdW50ZXIgKyAnJztcbiAgICByZXR1cm4gcHJlZml4ID8gcHJlZml4ICsgaWQgOiBpZDtcbiAgfTtcblxuICAvLyBCeSBkZWZhdWx0LCBVbmRlcnNjb3JlIHVzZXMgRVJCLXN0eWxlIHRlbXBsYXRlIGRlbGltaXRlcnMsIGNoYW5nZSB0aGVcbiAgLy8gZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLlxuICBfLnRlbXBsYXRlU2V0dGluZ3MgPSB7XG4gICAgZXZhbHVhdGUgICAgOiAvPCUoW1xcc1xcU10rPyklPi9nLFxuICAgIGludGVycG9sYXRlIDogLzwlPShbXFxzXFxTXSs/KSU+L2csXG4gICAgZXNjYXBlICAgICAgOiAvPCUtKFtcXHNcXFNdKz8pJT4vZ1xuICB9O1xuXG4gIC8vIFdoZW4gY3VzdG9taXppbmcgYHRlbXBsYXRlU2V0dGluZ3NgLCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgYW5cbiAgLy8gaW50ZXJwb2xhdGlvbiwgZXZhbHVhdGlvbiBvciBlc2NhcGluZyByZWdleCwgd2UgbmVlZCBvbmUgdGhhdCBpc1xuICAvLyBndWFyYW50ZWVkIG5vdCB0byBtYXRjaC5cbiAgdmFyIG5vTWF0Y2ggPSAvKC4pXi87XG5cbiAgLy8gQ2VydGFpbiBjaGFyYWN0ZXJzIG5lZWQgdG8gYmUgZXNjYXBlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIHB1dCBpbnRvIGFcbiAgLy8gc3RyaW5nIGxpdGVyYWwuXG4gIHZhciBlc2NhcGVzID0ge1xuICAgIFwiJ1wiOiAgICAgIFwiJ1wiLFxuICAgICdcXFxcJzogICAgICdcXFxcJyxcbiAgICAnXFxyJzogICAgICdyJyxcbiAgICAnXFxuJzogICAgICduJyxcbiAgICAnXFx1MjAyOCc6ICd1MjAyOCcsXG4gICAgJ1xcdTIwMjknOiAndTIwMjknXG4gIH07XG5cbiAgdmFyIGVzY2FwZXIgPSAvXFxcXHwnfFxccnxcXG58XFx1MjAyOHxcXHUyMDI5L2c7XG5cbiAgdmFyIGVzY2FwZUNoYXIgPSBmdW5jdGlvbihtYXRjaCkge1xuICAgIHJldHVybiAnXFxcXCcgKyBlc2NhcGVzW21hdGNoXTtcbiAgfTtcblxuICAvLyBKYXZhU2NyaXB0IG1pY3JvLXRlbXBsYXRpbmcsIHNpbWlsYXIgdG8gSm9obiBSZXNpZydzIGltcGxlbWVudGF0aW9uLlxuICAvLyBVbmRlcnNjb3JlIHRlbXBsYXRpbmcgaGFuZGxlcyBhcmJpdHJhcnkgZGVsaW1pdGVycywgcHJlc2VydmVzIHdoaXRlc3BhY2UsXG4gIC8vIGFuZCBjb3JyZWN0bHkgZXNjYXBlcyBxdW90ZXMgd2l0aGluIGludGVycG9sYXRlZCBjb2RlLlxuICAvLyBOQjogYG9sZFNldHRpbmdzYCBvbmx5IGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gIF8udGVtcGxhdGUgPSBmdW5jdGlvbih0ZXh0LCBzZXR0aW5ncywgb2xkU2V0dGluZ3MpIHtcbiAgICBpZiAoIXNldHRpbmdzICYmIG9sZFNldHRpbmdzKSBzZXR0aW5ncyA9IG9sZFNldHRpbmdzO1xuICAgIHNldHRpbmdzID0gXy5kZWZhdWx0cyh7fSwgc2V0dGluZ3MsIF8udGVtcGxhdGVTZXR0aW5ncyk7XG5cbiAgICAvLyBDb21iaW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVndWxhciBleHByZXNzaW9uIHZpYSBhbHRlcm5hdGlvbi5cbiAgICB2YXIgbWF0Y2hlciA9IFJlZ0V4cChbXG4gICAgICAoc2V0dGluZ3MuZXNjYXBlIHx8IG5vTWF0Y2gpLnNvdXJjZSxcbiAgICAgIChzZXR0aW5ncy5pbnRlcnBvbGF0ZSB8fCBub01hdGNoKS5zb3VyY2UsXG4gICAgICAoc2V0dGluZ3MuZXZhbHVhdGUgfHwgbm9NYXRjaCkuc291cmNlXG4gICAgXS5qb2luKCd8JykgKyAnfCQnLCAnZycpO1xuXG4gICAgLy8gQ29tcGlsZSB0aGUgdGVtcGxhdGUgc291cmNlLCBlc2NhcGluZyBzdHJpbmcgbGl0ZXJhbHMgYXBwcm9wcmlhdGVseS5cbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBzb3VyY2UgPSBcIl9fcCs9J1wiO1xuICAgIHRleHQucmVwbGFjZShtYXRjaGVyLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlLCBpbnRlcnBvbGF0ZSwgZXZhbHVhdGUsIG9mZnNldCkge1xuICAgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShlc2NhcGVyLCBlc2NhcGVDaGFyKTtcbiAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoO1xuXG4gICAgICBpZiAoZXNjYXBlKSB7XG4gICAgICAgIHNvdXJjZSArPSBcIicrXFxuKChfX3Q9KFwiICsgZXNjYXBlICsgXCIpKT09bnVsbD8nJzpfLmVzY2FwZShfX3QpKStcXG4nXCI7XG4gICAgICB9IGVsc2UgaWYgKGludGVycG9sYXRlKSB7XG4gICAgICAgIHNvdXJjZSArPSBcIicrXFxuKChfX3Q9KFwiICsgaW50ZXJwb2xhdGUgKyBcIikpPT1udWxsPycnOl9fdCkrXFxuJ1wiO1xuICAgICAgfSBlbHNlIGlmIChldmFsdWF0ZSkge1xuICAgICAgICBzb3VyY2UgKz0gXCInO1xcblwiICsgZXZhbHVhdGUgKyBcIlxcbl9fcCs9J1wiO1xuICAgICAgfVxuXG4gICAgICAvLyBBZG9iZSBWTXMgbmVlZCB0aGUgbWF0Y2ggcmV0dXJuZWQgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvZmZlc3QuXG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG4gICAgc291cmNlICs9IFwiJztcXG5cIjtcblxuICAgIC8vIElmIGEgdmFyaWFibGUgaXMgbm90IHNwZWNpZmllZCwgcGxhY2UgZGF0YSB2YWx1ZXMgaW4gbG9jYWwgc2NvcGUuXG4gICAgaWYgKCFzZXR0aW5ncy52YXJpYWJsZSkgc291cmNlID0gJ3dpdGgob2JqfHx7fSl7XFxuJyArIHNvdXJjZSArICd9XFxuJztcblxuICAgIHNvdXJjZSA9IFwidmFyIF9fdCxfX3A9JycsX19qPUFycmF5LnByb3RvdHlwZS5qb2luLFwiICtcbiAgICAgIFwicHJpbnQ9ZnVuY3Rpb24oKXtfX3ArPV9fai5jYWxsKGFyZ3VtZW50cywnJyk7fTtcXG5cIiArXG4gICAgICBzb3VyY2UgKyAncmV0dXJuIF9fcDtcXG4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciByZW5kZXIgPSBuZXcgRnVuY3Rpb24oc2V0dGluZ3MudmFyaWFibGUgfHwgJ29iaicsICdfJywgc291cmNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgdmFyIHRlbXBsYXRlID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgcmV0dXJuIHJlbmRlci5jYWxsKHRoaXMsIGRhdGEsIF8pO1xuICAgIH07XG5cbiAgICAvLyBQcm92aWRlIHRoZSBjb21waWxlZCBzb3VyY2UgYXMgYSBjb252ZW5pZW5jZSBmb3IgcHJlY29tcGlsYXRpb24uXG4gICAgdmFyIGFyZ3VtZW50ID0gc2V0dGluZ3MudmFyaWFibGUgfHwgJ29iaic7XG4gICAgdGVtcGxhdGUuc291cmNlID0gJ2Z1bmN0aW9uKCcgKyBhcmd1bWVudCArICcpe1xcbicgKyBzb3VyY2UgKyAnfSc7XG5cbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH07XG5cbiAgLy8gQWRkIGEgXCJjaGFpblwiIGZ1bmN0aW9uLiBTdGFydCBjaGFpbmluZyBhIHdyYXBwZWQgVW5kZXJzY29yZSBvYmplY3QuXG4gIF8uY2hhaW4gPSBmdW5jdGlvbihvYmopIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfKG9iaik7XG4gICAgaW5zdGFuY2UuX2NoYWluID0gdHJ1ZTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG5cbiAgLy8gT09QXG4gIC8vIC0tLS0tLS0tLS0tLS0tLVxuICAvLyBJZiBVbmRlcnNjb3JlIGlzIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCBpdCByZXR1cm5zIGEgd3JhcHBlZCBvYmplY3QgdGhhdFxuICAvLyBjYW4gYmUgdXNlZCBPTy1zdHlsZS4gVGhpcyB3cmFwcGVyIGhvbGRzIGFsdGVyZWQgdmVyc2lvbnMgb2YgYWxsIHRoZVxuICAvLyB1bmRlcnNjb3JlIGZ1bmN0aW9ucy4gV3JhcHBlZCBvYmplY3RzIG1heSBiZSBjaGFpbmVkLlxuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjb250aW51ZSBjaGFpbmluZyBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiAgdmFyIHJlc3VsdCA9IGZ1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiB0aGlzLl9jaGFpbiA/IF8ob2JqKS5jaGFpbigpIDogb2JqO1xuICB9O1xuXG4gIC8vIEFkZCB5b3VyIG93biBjdXN0b20gZnVuY3Rpb25zIHRvIHRoZSBVbmRlcnNjb3JlIG9iamVjdC5cbiAgXy5taXhpbiA9IGZ1bmN0aW9uKG9iaikge1xuICAgIF8uZWFjaChfLmZ1bmN0aW9ucyhvYmopLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICB2YXIgZnVuYyA9IF9bbmFtZV0gPSBvYmpbbmFtZV07XG4gICAgICBfLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IFt0aGlzLl93cmFwcGVkXTtcbiAgICAgICAgcHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0LmNhbGwodGhpcywgZnVuYy5hcHBseShfLCBhcmdzKSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuXG4gIC8vIEFkZCBhbGwgb2YgdGhlIFVuZGVyc2NvcmUgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyIG9iamVjdC5cbiAgXy5taXhpbihfKTtcblxuICAvLyBBZGQgYWxsIG11dGF0b3IgQXJyYXkgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyLlxuICBfLmVhY2goWydwb3AnLCAncHVzaCcsICdyZXZlcnNlJywgJ3NoaWZ0JywgJ3NvcnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSwgZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBtZXRob2QgPSBBcnJheVByb3RvW25hbWVdO1xuICAgIF8ucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb2JqID0gdGhpcy5fd3JhcHBlZDtcbiAgICAgIG1ldGhvZC5hcHBseShvYmosIGFyZ3VtZW50cyk7XG4gICAgICBpZiAoKG5hbWUgPT09ICdzaGlmdCcgfHwgbmFtZSA9PT0gJ3NwbGljZScpICYmIG9iai5sZW5ndGggPT09IDApIGRlbGV0ZSBvYmpbMF07XG4gICAgICByZXR1cm4gcmVzdWx0LmNhbGwodGhpcywgb2JqKTtcbiAgICB9O1xuICB9KTtcblxuICAvLyBBZGQgYWxsIGFjY2Vzc29yIEFycmF5IGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlci5cbiAgXy5lYWNoKFsnY29uY2F0JywgJ2pvaW4nLCAnc2xpY2UnXSwgZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBtZXRob2QgPSBBcnJheVByb3RvW25hbWVdO1xuICAgIF8ucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcmVzdWx0LmNhbGwodGhpcywgbWV0aG9kLmFwcGx5KHRoaXMuX3dyYXBwZWQsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gIH0pO1xuXG4gIC8vIEV4dHJhY3RzIHRoZSByZXN1bHQgZnJvbSBhIHdyYXBwZWQgYW5kIGNoYWluZWQgb2JqZWN0LlxuICBfLnByb3RvdHlwZS52YWx1ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl93cmFwcGVkO1xuICB9O1xuXG4gIC8vIEFNRCByZWdpc3RyYXRpb24gaGFwcGVucyBhdCB0aGUgZW5kIGZvciBjb21wYXRpYmlsaXR5IHdpdGggQU1EIGxvYWRlcnNcbiAgLy8gdGhhdCBtYXkgbm90IGVuZm9yY2UgbmV4dC10dXJuIHNlbWFudGljcyBvbiBtb2R1bGVzLiBFdmVuIHRob3VnaCBnZW5lcmFsXG4gIC8vIHByYWN0aWNlIGZvciBBTUQgcmVnaXN0cmF0aW9uIGlzIHRvIGJlIGFub255bW91cywgdW5kZXJzY29yZSByZWdpc3RlcnNcbiAgLy8gYXMgYSBuYW1lZCBtb2R1bGUgYmVjYXVzZSwgbGlrZSBqUXVlcnksIGl0IGlzIGEgYmFzZSBsaWJyYXJ5IHRoYXQgaXNcbiAgLy8gcG9wdWxhciBlbm91Z2ggdG8gYmUgYnVuZGxlZCBpbiBhIHRoaXJkIHBhcnR5IGxpYiwgYnV0IG5vdCBiZSBwYXJ0IG9mXG4gIC8vIGFuIEFNRCBsb2FkIHJlcXVlc3QuIFRob3NlIGNhc2VzIGNvdWxkIGdlbmVyYXRlIGFuIGVycm9yIHdoZW4gYW5cbiAgLy8gYW5vbnltb3VzIGRlZmluZSgpIGlzIGNhbGxlZCBvdXRzaWRlIG9mIGEgbG9hZGVyIHJlcXVlc3QuXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoJ3VuZGVyc2NvcmUnLCBbXSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gXztcbiAgICB9KTtcbiAgfVxufS5jYWxsKHRoaXMpKTtcbiIsIl8gPSByZXF1aXJlIFwidW5kZXJzY29yZVwiXG5cbiMgY2FsY3VsYXRlIHRoZSBjb25zZW5zdXMgc2VxXG4jIFRPRE86IHZlcnkgbmFpdmUgd2F5XG5tb2R1bGUuZXhwb3J0cyA9IChzZXFzKSAtPlxuXG4gIHNlcXMgPSBzZXFzLm1hcCAoZWwpIC0+IGVsLmdldCBcInNlcVwiXG4gIG9jY3MgPSBuZXcgQXJyYXkgc2Vxcy5sZW5ndGhcblxuICAjIGNvdW50IHRoZSBvY2N1cmVuY2VzIG9mIHRoZSBjaGFycyBvZiBhIHBvc2l0aW9uXG4gIF8uZWFjaCBzZXFzLCAoZWwsaSkgLT5cbiAgICBfLmVhY2ggZWwsIChjaGFyLCBwb3MpIC0+XG4gICAgICBvY2NzW3Bvc10gPSB7fSB1bmxlc3Mgb2Njc1twb3NdP1xuICAgICAgb2Njc1twb3NdW2NoYXJdID0gMCB1bmxlc3Mgb2Njc1twb3NdW2NoYXJdP1xuICAgICAgb2Njc1twb3NdW2NoYXJdKytcblxuICAjIG5vdyBwaWNrIHRoZSBjaGFyIHdpdGggbW9zdCBvY2N1cmVuY2VzXG4gIF8ucmVkdWNlIG9jY3MsIChtZW1vLG9jYykgLT5cbiAgICBrZXlzID0gXy5rZXlzIG9jY1xuICAgIG1lbW8gKz0gIF8ubWF4IGtleXMsIChrZXkpIC0+IG9jY1trZXldXG4gICwgXCJcIlxuIiwiIyBmb3IgZWFjaCBzZXF1ZW5jZVxuIyAqIGNvdW50cyB0aGUgbWF0Y2hlcyB3aXRoIHRoZSBjb25zZW5zdXMgc2VxXG4jICogZXhjbHVkaW5nIGdhcHNcbiMgKiBpZGVudGl0eSA9IG1hdGNoZWRDaGFycyAvIHRvdGFsQ2hhcnMgKGV4Y2x1ZGluZyBnYXBzKVxubW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0aXlDYWxjID0gKHNlcXMsIGNvbnNlbnN1cykgLT5cbiAgIyBkbyBub3RoaW5nIG9uIGludmFsaWQgY29uc2Vuc3VzXG4gIGlmIGNvbnNlbnN1cyBpcyB1bmRlZmluZWRcbiAgICBjb25zb2xlLndhcm4gXCJidWcgb24gY29uc2VudXMgY2FsY1wiXG4gICAgcmV0dXJuXG4gIHNlcXMuZWFjaCAoc2VxT2JqKSAtPlxuICAgIHNlcSA9IHNlcU9iai5nZXQgXCJzZXFcIlxuICAgIG1hdGNoZXMgPSAwXG4gICAgdG90YWwgPSAwXG4gICAgZm9yIGkgaW4gWzAuLnNlcS5sZW5ndGggLSAxXVxuICAgICAgaWYgc2VxW2ldIGlzbnQgXCItXCIgYW5kIGNvbnNlbnN1c1tpXSBpc250IFwiLVwiXG4gICAgICAgIHRvdGFsKytcbiAgICAgICAgbWF0Y2hlcysrIGlmIHNlcVtpXSBpcyBjb25zZW5zdXNbaV1cbiAgICBzZXFPYmouc2V0IFwiaWRlbnRpdHlcIiwgbWF0Y2hlcyAvIHRvdGFsXG4iLCJtb2R1bGUuZXhwb3J0cy5jb25zZW5zdXMgPSByZXF1aXJlIFwiLi9Db25zZW5zdXNDYWxjXCJcbiIsIk1vZGVsID0gcmVxdWlyZShcImJhY2tib25lLXRoaW5cIikuTW9kZWxcblxuIyB0aGlzIGlzIGFuIGV4YW1wbGUgb2YgaG93IG9uZSBjb3VsZCBjb2xvciB0aGUgTVNBXG4jIGZlZWwgZnJlZSB0byBjcmVhdGUgeW91ciBvd24gY29sb3Igc2NoZW1lIGluIHRoZSAvY3NzL3NjaGVtZXMgZm9sZGVyXG5tb2R1bGUuZXhwb3J0cyA9IENvbG9yYXRvciA9IE1vZGVsLmV4dGVuZFxuXG4gIGRlZmF1bHRzOlxuICAgIHNjaGVtZTogXCJ0YXlsb3JcIiAjIG5hbWUgb2YgeW91ciBjb2xvciBzY2hlbWUgKGNzcyBzdWZmaXgpXG4gICAgY29sb3JCYWNrZ3JvdW5kOiB0cnVlICMgb3RoZXJ3aXNlIG9ubHkgdGhlIHRleHQgd2lsbCBiZSBjb2xvcmVkXG4gICAgc2hvd0xvd2VyQ2FzZTogdHJ1ZSAjIHVzZWQgdG8gaGlkZSBhbmQgc2hvdyBsb3dlcmNhc2UgY2hhcnMgaW4gdGhlIG92ZXJ2aWV3Ym94XG4gICAgb3BhY2l0eTogMC42ICMgb3BhY2l0eSBmb3IgdGhlIHJlc2lkdWVzXG4iLCJNb2RlbCA9IHJlcXVpcmUoXCJiYWNrYm9uZS10aGluXCIpLk1vZGVsXG5jb25zZW51cyA9IHJlcXVpcmUgXCIuLi9hbGdvL0NvbnNlbnN1c0NhbGNcIlxuXyA9IHJlcXVpcmUgXCJ1bmRlcnNjb3JlXCJcblxuIyBtb2RlbCBmb3IgY29sdW1uIHByb3BlcnRpZXMgKGxpa2UgdGhlaXIgaGlkZGVuIHN0YXRlKVxubW9kdWxlLmV4cG9ydHMgPSBDb2x1bW5zID0gTW9kZWwuZXh0ZW5kXG5cbiAgZGVmYXVsdHM6XG4gICAgc2NhbGluZzogXCJsaW5cIiAjIG9mIHRoZSBjb25zZXJ2YXRpb24gY2hhcnQgZS5nLiBcImxpblwiLCBcImV4cFwiLCBcImxvZ1wiXG5cbiAgaW5pdGlhbGl6ZTogLT5cbiAgICAjIGhpZGRlbiBjb2x1bW5zXG4gICAgQC5zZXQgXCJoaWRkZW5cIiwgW10gdW5sZXNzIEAuZ2V0KFwiaGlkZGVuXCIpP1xuXG4gICMgYXNzdW1lcyBoaWRkZW4gY29sdW1ucyBhcmUgc29ydGVkXG4gICMgQHJldHVybnMgbiBbaW50XSBudW1iZXIgb2YgaGlkZGVuIGNvbHVtbnMgdW50aWwgblxuICBjYWxjSGlkZGVuQ29sdW1uczogKG4pIC0+XG4gICAgaGlkZGVuID0gQGdldCBcImhpZGRlblwiXG4gICAgbmV3WCA9IG5cbiAgICBmb3IgaSBpbiBoaWRkZW5cbiAgICAgIGlmIGkgPD0gbmV3WFxuICAgICAgICBuZXdYKytcbiAgICBuZXdYIC0gblxuXG4gICMgY2FsY3MgY29uc2VydmF0aW9uXG4gIF9jYWxjQ29uc2VydmF0aW9uUHJlOiAoc2VxcykgLT5cblxuICAgICMgZW1lcmdlbmN5IGN1dG9mZlxuICAgIGNvbnNvbGUubG9nIHNlcXMubGVuZ3RoXG4gICAgaWYgc2Vxcy5sZW5ndGggPiAxMDAwXG4gICAgICByZXR1cm5cblxuICAgICMgY2FsYyBjb25zZW5zdXNcbiAgICBjb25zID0gY29uc2VudXMoc2VxcylcbiAgICBzZXFzID0gc2Vxcy5tYXAgKGVsKSAtPiBlbC5nZXQgXCJzZXFcIlxuICAgIG5NYXggPSAoXy5tYXggc2VxcywgKGVsKSAtPiBlbC5sZW5ndGgpLmxlbmd0aFxuXG4gICAgdG90YWwgPSBuZXcgQXJyYXkgbk1heFxuICAgIG1hdGNoZXMgPSBuZXcgQXJyYXkgbk1heFxuICAgICMgY2FsYyBkZXJpdmF0aW9uIGZyb20gY29uc2VudXNcbiAgICBfLmVhY2ggc2VxcywgKGVsLGkpIC0+XG4gICAgICBfLmVhY2ggZWwsIChjaGFyLCBwb3MpIC0+XG4gICAgICAgICNpZiBjb25zW3Bvc10gaXNudCBcIi1cIiBhbmQgbWF0Y2hlc1twb3NdIGlzbnQgZ2FwXG4gICAgICAgIHRvdGFsW3Bvc10gPSB0b3RhbFtwb3NdICsgMSB8fCAxXG4gICAgICAgIG1hdGNoZXNbcG9zXSA9IG1hdGNoZXNbcG9zXSArIDEgfHwgMSBpZiBjb25zW3Bvc10gaXMgY2hhclxuICAgIFttYXRjaGVzLCB0b3RhbCwgbk1heF1cblxuICBjYWxjQ29uc2VydmF0aW9uOiAoc2VxcykgLT5cbiAgICBpZiBAYXR0cmlidXRlcy5zY2FsaW5nIGlzIFwiZXhwXCJcbiAgICAgIHJldHVybiBAY2FsY0NvbnNlcnZhdGlvbkV4cCBzZXFzXG4gICAgZWxzZSBpZiBAYXR0cmlidXRlcy5zY2FsaW5nIGlzIFwibG9nXCJcbiAgICAgIHJldHVybiBAY2FsY0NvbnNlcnZhdGlvbkxvZyBzZXFzXG4gICAgZWxzZSBpZiBAYXR0cmlidXRlcy5zY2FsaW5nIGlzIFwibGluXCJcbiAgICAgIHJldHVybiBAY2FsY0NvbnNlcnZhdGlvbkxpbiBzZXFzXG5cbiAgIyAocGVyY2VudGFnZSBvZiBjaGFycyBvZiB0aGUgY29uc2VudXMgc2VxKVxuICBjYWxjQ29uc2VydmF0aW9uTGluOiAoc2VxcykgLT5cbiAgICBbbWF0Y2hlcyx0b3RhbCwgbk1heF0gPSBAX2NhbGNDb25zZXJ2YXRpb25QcmUgc2Vxc1xuICAgIGZvciBpIGluIFswIC4uIG5NYXggLSAxXVxuICAgICAgbWF0Y2hlc1tpXSA9IG1hdGNoZXNbaV0gLyB0b3RhbFtpXVxuICAgIEAuc2V0IFwiY29uc2VydlwiLCBtYXRjaGVzXG4gICAgbWF0Y2hlc1xuXG4gICMgKHBlcmNlbnRhZ2Ugb2YgY2hhcnMgb2YgdGhlIGNvbnNlbnVzIHNlcSlcbiAgY2FsY0NvbnNlcnZhdGlvbkxvZzogKHNlcXMpIC0+XG4gICAgW21hdGNoZXMsdG90YWwsIG5NYXhdID0gQF9jYWxjQ29uc2VydmF0aW9uUHJlIHNlcXNcbiAgICBmb3IgaSBpbiBbMCAuLiBuTWF4IC0gMV1cbiAgICAgIG1hdGNoZXNbaV0gPSBNYXRoLmxvZyhtYXRjaGVzW2ldICsgMSkgLyBNYXRoLmxvZyh0b3RhbFtpXSArIDEpXG4gICAgQC5zZXQgXCJjb25zZXJ2XCIsIG1hdGNoZXNcbiAgICBtYXRjaGVzXG5cbiAgY2FsY0NvbnNlcnZhdGlvbkV4cDogKHNlcXMpIC0+XG4gICAgW21hdGNoZXMsdG90YWwsIG5NYXhdID0gQF9jYWxjQ29uc2VydmF0aW9uUHJlIHNlcXNcbiAgICBmb3IgaSBpbiBbMCAuLiBuTWF4IC0gMV1cbiAgICAgIG1hdGNoZXNbaV0gPSBNYXRoLmV4cChtYXRjaGVzW2ldICsgMSkgLyBNYXRoLmV4cCh0b3RhbFtpXSArIDEpXG4gICAgQC5zZXQgXCJjb25zZXJ2XCIsIG1hdGNoZXNcbiAgICBtYXRjaGVzXG4iLCJNb2RlbCA9IHJlcXVpcmUoXCJiYWNrYm9uZS10aGluXCIpLk1vZGVsXG5cbiMgc2ltcGxlIHVzZXIgY29uZmlnXG5tb2R1bGUuZXhwb3J0cyA9IENvbmZpZyA9IE1vZGVsLmV4dGVuZFxuXG4gIGRlZmF1bHRzOlxuICAgIHJlZ2lzdGVyTW91c2VIb3ZlcjogZmFsc2UsXG4gICAgcmVnaXN0ZXJNb3VzZUNsaWNrczogdHJ1ZSxcbiAgICBpbXBvcnRQcm94eTogXCJodHRwczovL2NvcnMtYW55d2hlcmUuaGVyb2t1YXBwLmNvbS9cIlxuICAgIGV2ZW50QnVzOiB0cnVlXG4iLCJNb2RlbCA9IHJlcXVpcmUoXCJiYWNrYm9uZS10aGluXCIpLk1vZGVsXG5jb25zZW51c0NhbGMgPSByZXF1aXJlIFwiLi4vYWxnby9Db25zZW5zdXNDYWxjXCJcblxuIyBzaW1wbHkgc2F2ZSB0aGUgY29uc2VudXMgc2VxdWVuY2VzIGdsb2JhbGx5XG5tb2R1bGUuZXhwb3J0cyA9IENvbnNlbnVzID0gTW9kZWwuZXh0ZW5kXG5cbiAgZGVmYXVsdHM6XG4gICAgY29uc2VudXMgOiBcIlwiXG5cbiAgZ2V0Q29uc2Vuc3VzOiAoc2VxcykgLT5cbiAgICAjIGVtZXJnZW5jeSBjdXRvZmZcbiAgICBpZiBzZXFzLmxlbmd0aCA+IDEwMDBcbiAgICAgIHJldHVyblxuXG4gICAgY29ucyA9IGNvbnNlbnVzQ2FsYyhzZXFzKVxuICAgIEAuc2V0IFwiY29uc2VudXNcIiwgY29uc1xuICAgIGNvbnNcbiIsIl8gPSByZXF1aXJlIFwidW5kZXJzY29yZVwiXG5Nb2RlbCA9IHJlcXVpcmUoXCJiYWNrYm9uZS10aGluXCIpLk1vZGVsXG5cbiMgaG9sZHMgdGhlIGN1cnJlbnQgdXNlciBzZWxlY3Rpb25cblNlbGVjdGlvbiA9IE1vZGVsLmV4dGVuZFxuICBkZWZhdWx0czpcbiAgICB0eXBlOiBcInN1cGVyXCJcblxuUm93U2VsZWN0aW9uID0gU2VsZWN0aW9uLmV4dGVuZFxuICBkZWZhdWx0czogXy5leHRlbmQge30sIFNlbGVjdGlvbjo6LmRlZmF1bHRzLFxuICAgIHR5cGU6IFwicm93XCJcbiAgICBzZXFJZDogXCJcIlxuXG4gIGluUm93OiAoc2VxSWQpIC0+XG4gICAgc2VxSWQgaXMgQC5nZXQgXCJzZXFJZFwiXG5cbiAgaW5Db2x1bW46IChyb3dQb3MpIC0+XG4gICAgdHJ1ZVxuXG4gIGdldExlbmd0aDogLT5cbiAgICAxXG5cbkNvbHVtblNlbGVjdGlvbiA9IFNlbGVjdGlvbi5leHRlbmRcbiAgZGVmYXVsdHM6IF8uZXh0ZW5kIHt9LCBTZWxlY3Rpb246Oi5kZWZhdWx0cyxcbiAgICB0eXBlOiBcImNvbHVtblwiXG4gICAgeFN0YXJ0OiAtMVxuICAgIHhFbmQ6IC0xXG5cbiAgaW5Sb3c6ICgpIC0+XG4gICAgdHJ1ZVxuXG4gIGluQ29sdW1uOiAocm93UG9zKSAtPlxuICAgIHhTdGFydCA8PSByb3dQb3MgJiYgcm93UG9zIDw9IHhFbmRcblxuICBnZXRMZW5ndGg6IC0+XG4gICAgeEVuZCAtIHhTdGFydFxuXG4jIHBvcyBpcyBhIG1peGluIG9mIGNvbHVtbiBhbmQgcm93XG4jIHN0YXJ0IHdpdGggUm93IGFuZCBvbmx5IG92ZXJ3cml0ZSBcImluQ29sdW1uXCIgZnJvbSBDb2x1bW5cblBvc1NlbGVjdGlvbiA9IFJvd1NlbGVjdGlvbi5leHRlbmQgXy5leHRlbmQge30sXy5waWNrKENvbHVtblNlbGVjdGlvbixcImluQ29sdW1uXCIpLFxuICBfLnBpY2soQ29sdW1uU2VsZWN0aW9uLFwiZ2V0TGVuZ3RoXCIpXG5cbiAgIyBtZXJnZSBib3RoIGRlZmF1bHRzXG4gIGRlZmF1bHRzOiBfLmV4dGVuZCB7fSwgQ29sdW1uU2VsZWN0aW9uOjouZGVmYXVsdHMsIFJvd1NlbGVjdGlvbjo6LmRlZmF1bHRzLFxuICAgIHR5cGU6IFwicG9zXCJcblxubW9kdWxlLmV4cG9ydHMuc2VsID0gU2VsZWN0aW9uXG5tb2R1bGUuZXhwb3J0cy5wb3NzZWwgPSBQb3NTZWxlY3Rpb25cbm1vZHVsZS5leHBvcnRzLnJvd3NlbCA9IFJvd1NlbGVjdGlvblxubW9kdWxlLmV4cG9ydHMuY29sdW1uc2VsID0gQ29sdW1uU2VsZWN0aW9uXG4iLCJzZWwgPSByZXF1aXJlIFwiLi9TZWxlY3Rpb25cIlxuXyA9IHJlcXVpcmUgXCJ1bmRlcnNjb3JlXCJcbkNvbGxlY3Rpb24gPSByZXF1aXJlKFwiYmFja2JvbmUtdGhpblwiKS5Db2xsZWN0aW9uXG5cbiMgaG9sZHMgdGhlIGN1cnJlbnQgdXNlciBzZWxlY3Rpb25cbm1vZHVsZS5leHBvcnRzID0gU2VsZWN0aW9uTWFuYWdlciA9IENvbGxlY3Rpb24uZXh0ZW5kXG5cbiAgbW9kZWw6IHNlbC5zZWxcblxuICBpbml0aWFsaXplOiAoZGF0YSwgb3B0cykgLT5cbiAgICBAZyA9IG9wdHMuZ1xuXG4gICAgQGxpc3RlblRvIEBnLCBcInJlc2lkdWU6Y2xpY2tcIiwgKGUpIC0+XG4gICAgICBAX2hhbmRsZUUgZS5ldnQsIG5ldyBzZWwucG9zc2VsXG4gICAgICAgIHhTdGFydDogZS5yb3dQb3NcbiAgICAgICAgeEVuZDogZS5yb3dQb3NcbiAgICAgICAgc2VxSWQ6IGUuc2VxSWRcblxuICAgIEBsaXN0ZW5UbyBAZywgXCJyb3c6Y2xpY2tcIiwgKGUpIC0+XG4gICAgICBAX2hhbmRsZUUgZS5ldnQsIG5ldyBzZWwucm93c2VsXG4gICAgICAgIHhTdGFydDogZS5yb3dQb3NcbiAgICAgICAgeEVuZDogZS5yb3dQb3NcbiAgICAgICAgc2VxSWQ6IGUuc2VxSWRcblxuICAgIEBsaXN0ZW5UbyBAZywgXCJjb2x1bW46Y2xpY2tcIiwgKGUpIC0+XG4gICAgICBAX2hhbmRsZUUgZS5ldnQsIG5ldyBzZWwuY29sdW1uc2VsXG4gICAgICAgIHhTdGFydDogZS5yb3dQb3NcbiAgICAgICAgeEVuZDogZS5yb3dQb3MgKyBlLnN0ZXBTaXplIC0gMVxuXG4gICAgI0BsaXN0ZW5UbyBALCBcImFkZCByZXNldFwiLCAoZSkgLT5cbiAgICAgICNAX3JlZHVjZUNvbHVtbnMoKVxuXG4gIGdldFNlbEZvclJvdzogKHNlcUlkKSAtPlxuICAgIEBmaWx0ZXIgKGVsKSAtPiBlbC5pblJvdyBzZXFJZFxuXG4gIGdldFNlbEZvckNvbHVtbnM6IChyb3dQb3MpIC0+XG4gICAgQGZpbHRlciAoZWwpIC0+IGVsLmluQ29sdW1uIHJvd1Bvc1xuXG4gICMgQHJldHVybnMgYXJyYXkgb2YgYWxsIHNlbGVjdGVkIHJlc2lkdWVzIGZvciBhIHJvd1xuICBnZXRCbG9ja3NGb3JSb3c6IChzZXFJZCwgbWF4TGVuKSAtPlxuICAgIHNlbGlzID0gQGZpbHRlciAoZWwpIC0+IGVsLmluUm93IHNlcUlkXG4gICAgYmxvY2tzID0gW11cbiAgICBmb3Igc2VsaSBpbiBzZWxpc1xuICAgICAgaWYgc2VsaS5hdHRyaWJ1dGVzLnR5cGUgaXMgXCJyb3dcIlxuICAgICAgICBibG9ja3MgPSBbMC4ubWF4TGVuXVxuICAgICAgICBicmVha1xuICAgICAgZWxzZVxuICAgICAgICBibG9ja3MgPSBibG9ja3MuY29uY2F0IFtzZWxpLmF0dHJpYnV0ZXMueFN0YXJ0IC4uIHNlbGkuYXR0cmlidXRlcy54RW5kXVxuICAgIGJsb2Nrc1xuXG4gICMgQHJldHVybnMgYXJyYXkgd2l0aCBhbGwgY29sdW1ucyBiZWluZyBzZWxlY3RlZFxuICAjIGV4YW1wbGU6IDAtNC4uLiAxMi0xNCBzZWxlY3RlZCAtPiBbMCwxLDIsMyw0LDEyLDEzLDE0XVxuICBnZXRBbGxDb2x1bW5CbG9ja3M6IChjb25mKSAtPlxuICAgIG1heExlbiA9IGNvbmYubWF4TGVuXG4gICAgd2l0aFBvcyA9IGNvbmYud2l0aFBvc1xuICAgIGJsb2NrcyA9IFtdXG4gICAgaWYgY29uZi53aXRoUG9zXG4gICAgICBmaWx0ZXJlZCA9IChAZmlsdGVyIChlbCkgLT4gZWwuZ2V0KCd4U3RhcnQnKT8gKVxuICAgIGVsc2VcbiAgICAgIGZpbHRlcmVkID0gKEBmaWx0ZXIgKGVsKSAtPiBlbC5nZXQoJ3R5cGUnKSBpcyBcImNvbHVtblwiKVxuICAgIGZvciBzZWxpIGluIGZpbHRlcmVkXG4gICAgICBibG9ja3MgPSBibG9ja3MuY29uY2F0IFtzZWxpLmF0dHJpYnV0ZXMueFN0YXJ0Li5zZWxpLmF0dHJpYnV0ZXMueEVuZF1cbiAgICBibG9ja3MgPSBfLnVuaXEgYmxvY2tzXG4gICAgcmV0dXJuIGJsb2Nrc1xuXG4gICMgaW52ZXJ0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gZm9yIGNvbHVtbnNcbiAgIyBAcGFyYW0gcm93cyBbQXJyYXldIGFsbCBhdmFpbGFibGUgc2VxSWRcbiAgaW52ZXJ0Um93OiAocm93cykgLT5cbiAgICBzZWxSb3dzID0gQHdoZXJlKHR5cGU6XCJyb3dcIilcbiAgICBzZWxSb3dzID0gXy5tYXAgc2VsUm93cywgKGVsKSAtPiBlbC5hdHRyaWJ1dGVzLnNlcUlkXG4gICAgaW52ZXJ0ZWQgPSBfLmZpbHRlciByb3dzLCAoZWwpIC0+XG4gICAgICByZXR1cm4gZmFsc2UgaWYgc2VsUm93cy5pbmRleE9mKGVsKSA+PSAwICMgZXhpc3Rpbmcgc2VsZWN0aW9uXG4gICAgICB0cnVlXG4gICAgIyBtYXNzIGluc2VydFxuICAgIHMgPSBbXVxuICAgIGZvciBlbCBpbiBpbnZlcnRlZFxuICAgICAgcy5wdXNoIG5ldyBzZWwucm93c2VsKHNlcUlkOmVsKVxuICAgIGNvbnNvbGUubG9nIHNcbiAgICBAcmVzZXQgc1xuXG4gICMgaW52ZXJ0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gZm9yIHJvd3NcbiAgIyBAcGFyYW0gcm93cyBbQXJyYXldIGFsbCBhdmFpbGFibGUgcm93cyAoMC4ubWF4Lmxlbmd0aClcbiAgaW52ZXJ0Q29sOiAoY29sdW1ucykgLT5cbiAgICBzZWxDb2x1bW5zID0gQHdoZXJlKHR5cGU6XCJjb2x1bW5cIilcbiAgICBzZWxDb2x1bW5zID0gXy5yZWR1Y2Ugc2VsQ29sdW1ucywgKG1lbW8sZWwpIC0+XG4gICAgICBtZW1vLmNvbmNhdCBbZWwuYXR0cmlidXRlcy54U3RhcnQgLi4gZWwuYXR0cmlidXRlcy54RW5kXVxuICAgICwgW11cbiAgICBpbnZlcnRlZCA9IF8uZmlsdGVyIGNvbHVtbnMsIChlbCkgLT5cbiAgICAgIGlmIHNlbENvbHVtbnMuaW5kZXhPZihlbCkgPj0gMFxuICAgICAgICAjIGV4aXN0aW5nIHNlbGVjdGlvblxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIHRydWVcbiAgICAjIG1hc3MgaW5zZXJ0XG4gICAgcmV0dXJuIGlmIGludmVydGVkLmxlbmd0aCA9PSAwXG4gICAgcyA9IFtdXG4gICAgY29uc29sZS5sb2cgaW52ZXJ0ZWRcbiAgICB4U3RhcnQgPSB4RW5kID0gaW52ZXJ0ZWRbMF1cbiAgICBmb3IgZWwgaW4gaW52ZXJ0ZWRcbiAgICAgIGlmIHhFbmQgKyAxIGlzIGVsXG4gICAgICAgICMgY29udGlndW91c1xuICAgICAgICB4RW5kID0gZWxcbiAgICAgIGVsc2VcbiAgICAgICAgIyBnYXAgYmV0d2VlblxuICAgICAgICBzLnB1c2ggbmV3IHNlbC5jb2x1bW5zZWwoeFN0YXJ0OnhTdGFydCwgeEVuZDogeEVuZClcbiAgICAgICAgeFN0YXJ0ID0geEVuZCA9IGVsXG4gICAgIyBjaGVjayBmb3IgbGFzdCBnYXBcbiAgICBzLnB1c2ggbmV3IHNlbC5jb2x1bW5zZWwoeFN0YXJ0OnhTdGFydCwgeEVuZDogaW52ZXJ0ZWRbaW52ZXJ0ZWQubGVuZ3RoIC0gMV0pIGlmIHhTdGFydCBpc250IHhFbmRcbiAgICBAcmVzZXQgc1xuXG4gICMgbWV0aG9kIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHN0YXJ0IGEgbmV3IHNlbGVjdGlvblxuICAjIG9yIGFwcGVuZCB0byB0aGUgb2xkIG9uZSAoZGVwZW5kaW5nIHdoZXRoZXIgQ1RSTCB3YXMgcHJlc3NlZClcbiAgX2hhbmRsZUU6IChlLCBzZWxlY3Rpb24pIC0+XG4gICAgaWYgZS5jdHJsS2V5IG9yIGUubWV0YUtleVxuICAgICAgQGFkZCBzZWxlY3Rpb25cbiAgICBlbHNlXG4gICAgICBAcmVzZXQgW3NlbGVjdGlvbl1cblxuICAjIGV4cGVyaW1lbnRhbCByZWR1Y2UgbWV0aG9kIGZvciBjb2x1bW5zXG4gIF9yZWR1Y2VDb2x1bW5zOiAtPlxuICAgIEBlYWNoIChlbCwgaW5kZXgsIGFycikgLT5cbiAgICAgIGNvbHMgPSBfLmZpbHRlciBhcnIsIChlbCkgLT4gZWwuZ2V0KCd0eXBlJykgaXMgJ2NvbHVtbidcbiAgICAgIHhTdGFydCA9IGVsLmdldCgneFN0YXJ0JylcbiAgICAgIHhFbmQgPSBlbC5nZXQoJ3hFbmQnKVxuXG4gICAgICBsZWZ0cyA9IF8uZmlsdGVyIGNvbHMsIChlbCkgLT4gZWwuZ2V0KCd4RW5kJykgaXMgKHhTdGFydCAtIDEpXG4gICAgICBmb3IgbGVmdCBpbiBsZWZ0c1xuICAgICAgICBsZWZ0LnNldCAneEVuZCcsIHhTdGFydFxuXG4gICAgICByaWdodHMgPSBfLmZpbHRlciBjb2xzLCAoZWwpIC0+IGVsLmdldCgneFN0YXJ0JykgaXMgKHhFbmQgKyAxKVxuICAgICAgZm9yIHJpZ2h0IGluIHJpZ2h0c1xuICAgICAgICByaWdodC5zZXQgJ3hTdGFydCcsIHhFbmRcblxuICAgICAgaWYgbGVmdHMubGVuZ3RoID4gMCBvciByaWdodHMubGVuZ3RoID4gMFxuICAgICAgICBjb25zb2xlLmxvZyBcInJlbW92ZWQgZWxcIlxuICAgICAgICBlbC5jb2xsZWN0aW9uLnJlbW92ZSBlbFxuIiwiTW9kZWwgPSByZXF1aXJlKFwiYmFja2JvbmUtdGhpblwiKS5Nb2RlbFxuXG4jIHZpc2libGUgYXJlYXNcbm1vZHVsZS5leHBvcnRzID0gVmlzaWJpbGl0eSA9IE1vZGVsLmV4dGVuZFxuXG4gIGRlZmF1bHRzOlxuXG4gICAgIyBmb3IgdGhlIFN0YWdlXG4gICAgb3ZlcnZpZXdCb3g6IDMwXG4gICAgaGVhZGVyQm94OiAtMVxuICAgIGFsaWdubWVudEJvZHk6IDBcbiIsIk1vZGVsID0gcmVxdWlyZShcImJhY2tib25lLXRoaW5cIikuTW9kZWxcblxuIyB2aXNpYmxlIGFyZWFzXG5tb2R1bGUuZXhwb3J0cyA9IFZpc2liaWxpdHkgPSBNb2RlbC5leHRlbmRcblxuICBkZWZhdWx0czpcbiAgICBzZXF1ZW5jZXM6IHRydWVcbiAgICBtYXJrZXJzOiB0cnVlXG4gICAgbWV0YWNlbGw6IGZhbHNlXG4gICAgY29uc2VydjogdHJ1ZVxuICAgIG92ZXJ2aWV3Ym94OiBmYWxzZVxuXG4gICAgIyBhYm91dCB0aGUgbGFiZWxzXG4gICAgbGFiZWxzOiB0cnVlXG4gICAgbGFiZWxOYW1lOiB0cnVlXG4gICAgbGFiZWxJZDogdHJ1ZVxuICAgIGxhYmVsUGFydGl0aW9uOiBmYWxzZVxuICAgIGxhYmVsQ2hlY2tib3g6IGZhbHNlXG4iLCJNb2RlbCA9IHJlcXVpcmUoXCJiYWNrYm9uZS10aGluXCIpLk1vZGVsXG4jIHBpeGVsIHByb3BlcnRpZXMgZm9yIHNvbWUgY29tcG9uZW50c1xubW9kdWxlLmV4cG9ydHMgPSBab29tZXIgPSBNb2RlbC5leHRlbmRcblxuICBjb25zdHJ1Y3RvcjogKGF0dHJpYnV0ZXMsb3B0aW9ucykgLT5cbiAgICBNb2RlbC5hcHBseSBALCBhcmd1bWVudHNcbiAgICBAZyA9IG9wdGlvbnMuZ1xuICAgIEBcblxuICBkZWZhdWx0czpcblxuICAgICMgZ2VuZXJhbFxuICAgIGFsaWdubWVudFdpZHRoOiBcImF1dG9cIlxuICAgIGFsaWdubWVudEhlaWdodDogMTk1XG4gICAgY29sdW1uV2lkdGg6IDE1XG4gICAgcm93SGVpZ2h0OiAxNVxuXG4gICAgIyBsYWJlbHNcbiAgICBsYWJlbFdpZHRoOiAxMDBcbiAgICBtZXRhV2lkdGg6IDEwMFxuICAgIHRleHRWaXNpYmxlOiB0cnVlXG4gICAgbGFiZWxJZExlbmd0aDogMzBcbiAgICBsYWJlbEZvbnRzaXplOiBcIjEzcHhcIlxuICAgIGxhYmVsTGluZUhlaWdodDogXCIxM3B4XCJcblxuICAgICMgbWFya2VyXG4gICAgbWFya2VyRm9udHNpemU6IFwiMTBweFwiXG4gICAgc3RlcFNpemU6IDFcbiAgICBtYXJrZXJTdGVwU2l6ZTogMlxuXG4gICAgIyBjYW52YXNcbiAgICByZXNpZHVlRm9udDogXCIxM3B4IG1vbm9cIlxuICAgIGNhbnZhc0V2ZW50U2NhbGU6IDFcblxuICAgIGJveFJlY3RIZWlnaHQ6IDVcbiAgICBib3hSZWN0V2lkdGg6IDVcblxuICAgICMgbWVudVxuICAgIG1lbnVGb250c2l6ZTogXCIyMHB4XCJcbiAgICBtZW51SXRlbUZvbnRzaXplOiBcIjE4cHhcIlxuICAgIG1lbnVJdGVtTGluZUhlaWdodDogXCIxOHB4XCJcbiAgICBtZW51TWFyZ2luTGVmdDogXCI1cHhcIlxuICAgIG1lbnVQYWRkaW5nOiBcIjNweCA1cHggM3B4IDVweFwiXG5cbiAgICAjIGludGVybmFsIHByb3BzXG4gICAgX2FsaWdubWVudFNjcm9sbExlZnQ6IDBcbiAgICBfYWxpZ25tZW50U2Nyb2xsVG9wOiAwXG5cbiAgIyBAcGFyYW0gbiBbaW50XSBtYXhMZW5ndGggb2YgYWxsIHNlcXNcbiAgZ2V0QWxpZ25tZW50V2lkdGg6IChuKSAtPlxuICAgIGlmIEBnZXQoXCJhbGlnbm1lbnRXaWR0aFwiKSBpcyBcImF1dG9cIlxuICAgICAgQGdldChcImNvbHVtbldpZHRoXCIpICogblxuICAgIGVsc2VcbiAgICAgIEBnZXQgXCJhbGlnbm1lbnRXaWR0aFwiXG5cbiAgIyBAcGFyYW0gbiBbaW50XSBudW1iZXIgb2YgcmVzaWR1ZXMgdG8gc2Nyb2xsIHRvIHRoZSByaWdodFxuICBzZXRMZWZ0T2Zmc2V0OiAobikgLT5cbiAgICB2YWwgPSAobiAtIDEpICogQGdldCgnY29sdW1uV2lkdGgnKVxuICAgIHZhbCA9IE1hdGgubWF4IDAsIHZhbFxuICAgIEBzZXQgXCJfYWxpZ25tZW50U2Nyb2xsTGVmdFwiLCB2YWxcblxuICAjIEBwYXJhbSBuIFtpbnRdIHJvdyB0aGF0IHNob3VsZCBiZSBvbiB0b3BcbiAgc2V0VG9wT2Zmc2V0OiAobikgLT5cbiAgICB2YWwgPSAobiAtIDEpICogQGdldCgncm93SGVpZ2h0JylcbiAgICB2YWwgPSBNYXRoLm1heCAwLCB2YWxcbiAgICBAc2V0IFwiX2FsaWdubWVudFNjcm9sbFRvcFwiLHZhbFxuXG4gICMgbGVuZ3RoIG9mIGFsbCBlbGVtZW50cyBsZWZ0IHRvIHRoZSBtYWluIHNlcXVlbmNlIGJvZHk6IGxhYmVscywgbWV0YWNlbGwsIC4uXG4gIGdldExhYmVsV2lkdGg6IC0+XG4gICAgIHBhZGRpbmdMZWZ0ID0gMFxuICAgICBwYWRkaW5nTGVmdCArPSBAZ2V0IFwibGFiZWxXaWR0aFwiIGlmIEBnLnZpcy5nZXQgXCJsYWJlbHNcIlxuICAgICBwYWRkaW5nTGVmdCArPSBAZ2V0IFwibWV0YVdpZHRoXCIgaWYgQGcudmlzLmdldCBcIm1ldGFjZWxsXCJcbiAgICAgcmV0dXJuIHBhZGRpbmdMZWZ0XG5cbiAgX2FkanVzdFdpZHRoOiAoZWwsIG1vZGVsKSAtPlxuICAgIGlmIGVsLnBhcmVudE5vZGU/IGFuZCBlbC5wYXJlbnROb2RlLm9mZnNldFdpZHRoIGlzbnQgMFxuICAgICAgcGFyZW50V2lkdGggPSBlbC5wYXJlbnROb2RlLm9mZnNldFdpZHRoXG4gICAgZWxzZVxuICAgICAgcGFyZW50V2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIC0gMzVcblxuICAgICMgVE9ETzogZGlydHkgaGFja1xuICAgIG1heFdpZHRoID0gcGFyZW50V2lkdGggLSBAZ2V0TGFiZWxXaWR0aCgpXG4gICAgY2FsY1dpZHRoID0gQGdldEFsaWdubWVudFdpZHRoKCBtb2RlbC5nZXRNYXhMZW5ndGgoKSAtIEBnLmNvbHVtbnMuZ2V0KCdoaWRkZW4nKS5sZW5ndGgpXG4gICAgdmFsID0gTWF0aC5taW4obWF4V2lkdGgsY2FsY1dpZHRoKVxuICAgICMgcm91bmQgdG8gYSB2YWxpZCBBQSBib3hcbiAgICB2YWwgPSBNYXRoLmZsb29yKCB2YWwgLyBAZ2V0KFwiY29sdW1uV2lkdGhcIikpICogQGdldChcImNvbHVtbldpZHRoXCIpXG4gICAgQHNldCBcImFsaWdubWVudFdpZHRoXCIsIHZhbFxuICAgICNlbC5zdHlsZS53aWR0aCA9IE1hdGgubWluIGNhbGNXaWR0aCwgbWF4V2lkdGhcblxuICAjIHVwZGF0ZXMgYm90aCBzY3JvbGwgcHJvcGVydGllcyAoaWYgbmVlZGVkKVxuICBfY2hlY2tTY3JvbGxpbmc6IChzY3JvbGxPYmosIG9wdHMpIC0+XG4gICAgeFNjcm9sbCA9IHNjcm9sbE9ialswXVxuICAgIHlTY3JvbGwgPSBzY3JvbGxPYmpbMV1cblxuICAgIEBzZXQgXCJfYWxpZ25tZW50U2Nyb2xsTGVmdFwiLCB4U2Nyb2xsLCBvcHRzXG4gICAgQHNldCBcIl9hbGlnbm1lbnRTY3JvbGxUb3BcIiwgeVNjcm9sbCwgb3B0c1xuIiwibW9kdWxlLmV4cG9ydHMubXNhID0gcmVxdWlyZShcIi4vbXNhXCIpXG5cbiMgbW9kZWxzXG5tb2R1bGUuZXhwb3J0cy5tb2RlbCA9IHJlcXVpcmUoXCIuL21vZGVsXCIpXG5cbiMgZXh0cmEgcGx1Z2lucywgZXh0ZW5zaW9uc1xubW9kdWxlLmV4cG9ydHMuYWxnbyA9IHJlcXVpcmUoXCIuL2FsZ29cIilcbm1vZHVsZS5leHBvcnRzLm1lbnUgPSByZXF1aXJlKFwiLi9tZW51XCIpXG5tb2R1bGUuZXhwb3J0cy51dGlscyA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpXG5cbiMgcHJvYmFibHkgbmVlZGVkIG1vcmUgb2Z0ZW5cbm1vZHVsZS5leHBvcnRzLnNlbGVjdGlvbiA9IHJlcXVpcmUoXCIuL2cvc2VsZWN0aW9uL1NlbGVjdGlvblwiKVxubW9kdWxlLmV4cG9ydHMudmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS12aWV3alwiKVxubW9kdWxlLmV4cG9ydHMuYm9uZVZpZXcgPSByZXF1aXJlKFwiYmFja2JvbmUtY2hpbGRzXCIpXG5cbiMgY29udmVuaWVuY2Vcbm1vZHVsZS5leHBvcnRzLl8gPSByZXF1aXJlICd1bmRlcnNjb3JlJ1xubW9kdWxlLmV4cG9ydHMuJCA9IHJlcXVpcmUgJ2pib25lJ1xuXG5tb2R1bGUuZXhwb3J0cy52ZXJzaW9uID0gXCIwLjEuMFwiXG4iLCJib25lVmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS1jaGlsZHNcIilcblxuIyBtZW51IHZpZXdzXG5JbXBvcnRNZW51ID0gcmVxdWlyZSBcIi4vdmlld3MvSW1wb3J0TWVudVwiXG5GaWx0ZXJNZW51ID0gcmVxdWlyZSBcIi4vdmlld3MvRmlsdGVyTWVudVwiXG5TZWxlY3Rpb25NZW51ID0gcmVxdWlyZSBcIi4vdmlld3MvU2VsZWN0aW9uTWVudVwiXG5WaXNNZW51ID0gcmVxdWlyZSBcIi4vdmlld3MvVmlzTWVudVwiXG5Db2xvck1lbnUgPSByZXF1aXJlIFwiLi92aWV3cy9Db2xvck1lbnVcIlxuT3JkZXJpbmdNZW51ID0gcmVxdWlyZSBcIi4vdmlld3MvT3JkZXJpbmdNZW51XCJcbkV4dHJhTWVudSA9IHJlcXVpcmUgXCIuL3ZpZXdzL0V4dHJhTWVudVwiXG5FeHBvcnRNZW51ID0gcmVxdWlyZSBcIi4vdmlld3MvRXhwb3J0TWVudVwiXG5IZWxwTWVudSA9IHJlcXVpcmUgXCIuL3ZpZXdzL0hlbHBNZW51XCJcblxuIyB0aGlzIHZlcnkgYmFzaWMgbWVudSBkZW1vbnN0cmF0ZXMgY2FsbHMgdG8gdGhlIE1TQSBjb21wb25lbnRcbm1vZHVsZS5leHBvcnRzID0gTWVudVZpZXcgPSBib25lVmlldy5leHRlbmRcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAbXNhID0gZGF0YS5tc2FcblxuICAgIEBhZGRWaWV3ICBcIjEwX2ltcG9ydFwiLCBuZXcgSW1wb3J0TWVudSBtb2RlbDogQG1zYS5zZXFzLCBnOkBtc2EuZ1xuICAgIEBhZGRWaWV3ICBcIjIwX2ZpbHRlclwiLCBuZXcgRmlsdGVyTWVudSBtb2RlbDogQG1zYS5zZXFzLCBnOkBtc2EuZ1xuICAgIEBhZGRWaWV3ICBcIjMwX3NlbGVjdGlvblwiLCBuZXcgU2VsZWN0aW9uTWVudSBtb2RlbDogQG1zYS5zZXFzLCBnOkBtc2EuZ1xuICAgIEBhZGRWaWV3ICBcIjQwX3Zpc1wiLCBuZXcgVmlzTWVudSBtb2RlbDogQG1zYS5zZXFzLCBnOkBtc2EuZ1xuICAgIEBhZGRWaWV3ICBcIjUwX2NvbG9yXCIsIG5ldyBDb2xvck1lbnUgbW9kZWw6IEBtc2Euc2VxcywgZzpAbXNhLmdcbiAgICBAYWRkVmlldyAgXCI2MF9vcmRlcmluZ1wiLCBuZXcgT3JkZXJpbmdNZW51IG1vZGVsOiBAbXNhLnNlcXMsIGc6QG1zYS5nXG4gICAgQGFkZFZpZXcgIFwiNzBfZXh0cmFcIiwgbmV3IEV4dHJhTWVudSBtb2RlbDogQG1zYS5zZXFzLCBnOkBtc2EuZ1xuICAgIEBhZGRWaWV3ICBcIjgwX2V4cG9ydFwiLCBuZXcgRXhwb3J0TWVudSBtb2RlbDogQG1zYS5zZXFzLCBnOkBtc2EuZywgbXNhOkBtc2FcbiAgICBAYWRkVmlldyAgXCI5MF9oZWxwXCIsIG5ldyBIZWxwTWVudSAgZzpAbXNhLmdcblxuICByZW5kZXI6IC0+XG4gICAgQHJlbmRlclN1YnZpZXdzKClcbiAgICAjIG90aGVyXG4gICAgQGVsLnNldEF0dHJpYnV0ZSBcImNsYXNzXCIsIFwiYmlvanNfbXNhX21lbnViYXJcIlxuICAgIEBlbC5hcHBlbmRDaGlsZCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKVxuIiwibW9kdWxlLmV4cG9ydHMuZGVmYXVsdG1lbnUgPSByZXF1aXJlKFwiLi9kZWZhdWx0bWVudVwiKVxubW9kdWxlLmV4cG9ydHMubWVudWJ1aWxkZXIgPSByZXF1aXJlKFwiLi9tZW51YnVpbGRlclwiKVxuIiwiQk1hdGggPSByZXF1aXJlIFwiLi4vdXRpbHMvYm1hdGhcIlxuamJvbmUgPSByZXF1aXJlIFwiamJvbmVcIlxudmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS12aWV3alwiKVxuXG4jamJvbmUuZm4uYWRkQ2xhc3MgPSAoY2xhc3NOYW1lKSAtPlxuIyAgZm9yIGkgaW4gWzAuLiBALmxlbmd0aCAtIDFdIGJ5IDFcbiMgICAgQFtpXS5jbGFzc0xpc3QuYWRkIGNsYXNzTmFtZVxuIyAgQFxuXG5tb2R1bGUuZXhwb3J0cyA9IE1lbnVCdWlsZGVyID0gdmlldy5leHRlbmRcblxuICAgIHNldE5hbWU6IChAbmFtZSkgLT5cbiAgICAgIEBfbm9kZXMgPSAgW11cblxuICAgIGFkZE5vZGU6IChsYWJlbCwgY2FsbGJhY2ssIGRhdGEpIC0+XG4gICAgICBzdHlsZSA9IGRhdGEuc3R5bGUgaWYgZGF0YT9cbiAgICAgIEBfbm9kZXMgPSBbXSB1bmxlc3MgQF9ub2Rlcz9cbiAgICAgIEBfbm9kZXMucHVzaCB7bGFiZWw6IGxhYmVsLCBjYWxsYmFjazogY2FsbGJhY2ssIHN0eWxlOiBzdHlsZX1cblxuICAgIGJ1aWxkRE9NOiAtPlxuICAgICAgQF9idWlsZE1cbiAgICAgICAgbm9kZXM6IEBfbm9kZXNcbiAgICAgICAgbmFtZTogQG5hbWVcblxuICAgIF9idWlsZE06IChkYXRhKSAtPlxuICAgICAgbm9kZXMgPSBkYXRhLm5vZGVzXG4gICAgICBuYW1lID0gZGF0YS5uYW1lXG5cbiAgICAgIG1lbnUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwiZGl2XCJcbiAgICAgIG1lbnUuY2xhc3NOYW1lID0gXCJkcm9wZG93biBkcm9wZG93bi10aXBcIlxuICAgICAgbWVudS5pZCA9IFwiYWRyb3AtXCIgKyBCTWF0aC51bmlxdWVJZCgpXG4gICAgICBtZW51LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuXG4gICAgICBtZW51VWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwidWxcIlxuICAgICAgbWVudVVsLmNsYXNzTmFtZSA9IFwiZHJvcGRvd24tbWVudVwiXG5cbiAgICAgICMgZHJvcGRvd24gbWVudVxuICAgICAgZm9yIG5vZGUgaW4gbm9kZXNcbiAgICAgICAgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwibGlcIlxuXG4gICAgICAgIGxpLnRleHRDb250ZW50ID0gbm9kZS5sYWJlbFxuICAgICAgICBmb3Iga2V5LHN0eWxlIG9mIG5vZGUuc3R5bGVcbiAgICAgICAgICBsaS5zdHlsZVtrZXldID0gc3R5bGVcbiAgICAgICAgbGkuYWRkRXZlbnRMaXN0ZW5lciBcImNsaWNrXCIsIG5vZGUuY2FsbGJhY2tcbiAgICAgICAgaWYgQGc/XG4gICAgICAgICAgbGkuc3R5bGUubGluZUhlaWdodCA9IEBnLnpvb21lci5nZXQgXCJtZW51SXRlbUxpbmVIZWlnaHRcIlxuXG4gICAgICAgIG1lbnVVbC5hcHBlbmRDaGlsZCBsaVxuXG4gICAgICBtZW51LmFwcGVuZENoaWxkIG1lbnVVbFxuXG4gICAgICBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAjIGRpcGxheSBpdFxuICAgICAgZGlzcGxheWVkQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBcImFcIlxuICAgICAgZGlzcGxheWVkQnV0dG9uLnRleHRDb250ZW50ID0gbmFtZVxuICAgICAgZGlzcGxheWVkQnV0dG9uLmNsYXNzTmFtZSA9IFwiYmlvanNfbXNhX21lbnViYXJfYWxpbmtcIlxuXG4gICAgICAjIHRpbnkgc3R5bGVcbiAgICAgIGlmIEBnP1xuICAgICAgICBtZW51VWwuc3R5bGUuZm9udFNpemUgPSBAZy56b29tZXIuZ2V0IFwibWVudUl0ZW1Gb250c2l6ZVwiXG4gICAgICAgIGRpc3BsYXllZEJ1dHRvbi5zdHlsZS5mb250U2l6ZSA9IEBnLnpvb21lci5nZXQgXCJtZW51Rm9udHNpemVcIlxuICAgICAgICBkaXNwbGF5ZWRCdXR0b24uc3R5bGUubWFyZ2luTGVmdCA9IEBnLnpvb21lci5nZXQgXCJtZW51TWFyZ2luTGVmdFwiXG4gICAgICAgIGRpc3BsYXllZEJ1dHRvbi5zdHlsZS5wYWRkaW5nID0gQGcuem9vbWVyLmdldCBcIm1lbnVQYWRkaW5nXCJcblxuICAgICAgamJvbmUoZGlzcGxheWVkQnV0dG9uKS5vbiBcImNsaWNrXCIsIChlKSA9PlxuICAgICAgICBAX3Nob3dNZW51IGUsbWVudSxkaXNwbGF5ZWRCdXR0b25cblxuICAgICAgICAjIHdhaXQgdW50aWwgZXZlbnQgaXMgYnViYmxlZCB0byB0aGUgdG9wXG4gICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0IC0+XG4gICAgICAgICAgamJvbmUoZG9jdW1lbnQuYm9keSkub25lIFwiY2xpY2tcIiwgKGUpIC0+XG4gICAgICAgICAgICBjb25zb2xlLmxvZyBcIm5leHQgY2xpY2tcIlxuICAgICAgICAgICAgbWVudS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcbiAgICAgICAgLCA1XG5cblxuICAgICAgZnJhZy5hcHBlbmRDaGlsZCBtZW51XG4gICAgICBmcmFnLmFwcGVuZENoaWxkIGRpc3BsYXllZEJ1dHRvblxuICAgICAgcmV0dXJuICBmcmFnXG5cbiAgICBfc2hvd01lbnU6IChlLCBtZW51LCB0YXJnZXQpIC0+XG4gICAgICAjamJvbmUobWVudSkuYWRkQ2xhc3MgXCJkcm9wZG93bi1vcGVuXCJcbiAgICAgIG1lbnUuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIlxuICAgICAgbWVudS5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIlxuXG4gICAgICByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBtZW51LnN0eWxlLmxlZnQgPSByZWN0LmxlZnQgKyBcInB4XCJcbiAgICAgIG1lbnUuc3R5bGUudG9wID0gKHJlY3QudG9wICsgdGFyZ2V0Lm9mZnNldEhlaWdodCkgKyBcInB4XCJcbiIsIk1lbnVCdWlsZGVyID0gcmVxdWlyZSBcIi4uL21lbnVidWlsZGVyXCJcbl8gPSByZXF1aXJlIFwidW5kZXJzY29yZVwiXG5kb20gPSByZXF1aXJlIFwiZG9tLWhlbHBlclwiXG5cbm1vZHVsZS5leHBvcnRzID0gQ29sb3JNZW51ID0gTWVudUJ1aWxkZXIuZXh0ZW5kXG5cbiAgaW5pdGlhbGl6ZTogKGRhdGEpIC0+XG4gICAgQGcgPSBkYXRhLmdcbiAgICBAZWwuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCJcbiAgICBAbGlzdGVuVG8gQGcuY29sb3JzY2hlbWUsIFwiY2hhbmdlXCIsIC0+XG4gICAgICBAcmVuZGVyKClcblxuICByZW5kZXI6IC0+XG4gICAgbWVudUNvbG9yID0gQHNldE5hbWUoXCJDb2xvciBzY2hlbWVcIilcblxuICAgIGNvbG9yc2NoZW1lcyA9IEBnZXRDb2xvcnNjaGVtZXMoKVxuICAgIGZvciBzY2hlbWUgaW4gY29sb3JzY2hlbWVzXG4gICAgICBAYWRkU2NoZW1lIG1lbnVDb2xvciwgc2NoZW1lXG5cbiAgICB0ZXh0ID0gXCJCYWNrZ3JvdW5kXCJcbiAgICBpZiBAZy5jb2xvcnNjaGVtZS5nZXQoXCJjb2xvckJhY2tncm91bmRcIilcbiAgICAgIHRleHQgPSBcIkhpZGUgXCIgKyB0ZXh0XG4gICAgZWxzZVxuICAgICAgdGV4dCA9IFwiU2hvdyBcIiArIHRleHRcblxuICAgIEBhZGROb2RlIHRleHQsID0+XG4gICAgICBAZy5jb2xvcnNjaGVtZS5zZXQgXCJjb2xvckJhY2tncm91bmRcIiwgIUBnLmNvbG9yc2NoZW1lLmdldChcImNvbG9yQmFja2dyb3VuZFwiKVxuXG4gICAgQGdyZXkgbWVudUNvbG9yXG5cbiAgICAjIFRPRE86IG1ha2UgbW9yZSBlZmZpY2llbnRcbiAgICBkb20ucmVtb3ZlQWxsQ2hpbGRzIEBlbFxuICAgIEBlbC5hcHBlbmRDaGlsZCBAYnVpbGRET00oKVxuICAgIEBcblxuICBhZGRTY2hlbWU6IChtZW51Q29sb3Isc2NoZW1lKSAtPlxuICAgIHN0eWxlID0ge31cbiAgICBjdXJyZW50ID0gQGcuY29sb3JzY2hlbWUuZ2V0KFwic2NoZW1lXCIpXG4gICAgaWYgY3VycmVudCBpcyBzY2hlbWUuaWRcbiAgICAgIHN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiIzc3RUQ4MFwiXG5cbiAgICBAYWRkTm9kZSBzY2hlbWUubmFtZSwgPT5cbiAgICAgIEBnLmNvbG9yc2NoZW1lLnNldCBcInNjaGVtZVwiLCBzY2hlbWUuaWRcbiAgICAsXG4gICAgICBzdHlsZTogc3R5bGVcblxuICBnZXRDb2xvcnNjaGVtZXM6IC0+XG4gICAgc2NoZW1lcyAgPSBbXVxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIlphcHBvXCIsIGlkOiBcInphcHBvXCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJUYXlsb3JcIiwgaWQ6IFwidGF5bG9yXCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJIeWRyb3Bob2JpY2l0eVwiLCBpZDogXCJoeWRyb1wiXG4gICAgc2NoZW1lcy5wdXNoIG5hbWU6IFwiTGVza1wiLCBpZDogXCJsZXNrXCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJDaW5lbWFcIiwgaWQ6IFwiY2luZW1hXCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJNQUVcIiwgaWQ6IFwibWFlXCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJDbHVzdGFsXCIsIGlkOiBcImNsdXN0YWxcIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIkNsdXN0YWwyXCIsIGlkOiBcImNsdXN0YWwyXCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJUdXJuXCIsIGlkOiBcInR1cm5cIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIlN0cmFuZFwiLCBpZDogXCJzdHJhbmRcIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIkJ1cmllZFwiLCBpZDogXCJidXJpZWRcIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIkhlbGl4XCIsIGlkOiBcImhlbGl4XCJcbiAgICBzY2hlbWVzLnB1c2ggbmFtZTogXCJOdWNsZW90aWRlXCIsIGlkOiBcIm51Y2xlb3RpZGVcIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIlB1cmluZVwiLCBpZDogXCJwdXJpbmVcIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIlBJRFwiLCBpZDogXCJwaWRcIlxuICAgIHNjaGVtZXMucHVzaCBuYW1lOiBcIk5vIGNvbG9yXCIsIGlkOiBcImZvb1wiXG4gICAgc2NoZW1lc1xuXG4gIGdyZXk6IChtZW51Q29sb3IpIC0+XG4gICAgIyBncmV5cyBhbGwgbG93ZXJjYXNlIGxldHRlcnNcbiAgICBAYWRkTm9kZSBcIkdyZXlcIiwgPT5cbiAgICAgIEBnLmNvbG9yc2NoZW1lLnNldCBcInNob3dMb3dlckNhc2VcIiwgZmFsc2VcbiAgICAgIEBtb2RlbC5lYWNoIChzZXEpIC0+XG4gICAgICAgIHJlc2lkdWVzID0gc2VxLmdldCBcInNlcVwiXG4gICAgICAgIGdyZXkgPSBbXVxuICAgICAgICBfLmVhY2ggcmVzaWR1ZXMsIChlbCwgaW5kZXgpIC0+XG4gICAgICAgICAgaWYgZWwgaXMgZWwudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgZ3JleS5wdXNoIGluZGV4XG4gICAgICAgIHNlcS5zZXQgXCJncmV5XCIsIGdyZXlcblxuICAgIEBhZGROb2RlIFwiR3JleSBieSB0aHJlc2hvbGRcIiwgPT5cbiAgICAgIHRocmVzaG9sZCA9IHByb21wdCBcIkVudGVyIHRocmVzaG9sZCAoaW4gcGVyY2VudClcIiwgMjBcbiAgICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZCAvIDEwMFxuICAgICAgbWF4TGVuID0gQG1vZGVsLmdldE1heExlbmd0aCgpXG4gICAgICBjb25zZXJ2ID0gQGcuY29sdW1ucy5nZXQoXCJjb25zZXJ2XCIpXG4gICAgICBncmV5ID0gW11cbiAgICAgIGZvciBpIGluIFswLi4gbWF4TGVuIC0gMV1cbiAgICAgICAgY29uc29sZS5sb2cgY29uc2VydltpXVxuICAgICAgICBpZiBjb25zZXJ2W2ldIDwgdGhyZXNob2xkXG4gICAgICAgICAgZ3JleS5wdXNoIGlcbiAgICAgIEBtb2RlbC5lYWNoIChzZXEpIC0+XG4gICAgICAgIHNlcS5zZXQgXCJncmV5XCIsIGdyZXlcblxuICAgIEBhZGROb2RlIFwiR3JleSBzZWxlY3Rpb25cIiwgPT5cbiAgICAgIG1heExlbiA9IEBtb2RlbC5nZXRNYXhMZW5ndGgoKVxuICAgICAgQG1vZGVsLmVhY2ggKHNlcSkgPT5cbiAgICAgICAgYmxvY2tzID0gQGcuc2VsY29sLmdldEJsb2Nrc0ZvclJvdyhzZXEuZ2V0KFwiaWRcIiksbWF4TGVuKVxuICAgICAgICBzZXEuc2V0IFwiZ3JleVwiLCBibG9ja3NcblxuICAgIEBhZGROb2RlIFwiUmVzZXQgZ3JleVwiLCA9PlxuICAgICAgQGcuY29sb3JzY2hlbWUuc2V0IFwic2hvd0xvd2VyQ2FzZVwiLCB0cnVlXG4gICAgICBAbW9kZWwuZWFjaCAoc2VxKSAtPlxuICAgICAgICBzZXEuc2V0IFwiZ3JleVwiLCBbXVxuIiwiTWVudUJ1aWxkZXIgPSByZXF1aXJlIFwiLi4vbWVudWJ1aWxkZXJcIlxuc2F2ZUFzID0gcmVxdWlyZSBcImJyb3dzZXItc2F2ZWFzXCJcbkZhc3RhRXhwb3J0ZXIgPSByZXF1aXJlKFwiYmlvanMtaW8tZmFzdGFcIikud3JpdGVyXG5fID0gcmVxdWlyZSBcInVuZGVyc2NvcmVcIlxuYmxvYlVSTCA9IHJlcXVpcmUgXCJibHVlaW1wX2NhbnZhc3RvYmxvYlwiXG5cbm1vZHVsZS5leHBvcnRzID0gRXhwb3J0TWVudSA9IE1lbnVCdWlsZGVyLmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG4gICAgQG1zYSA9IGRhdGEubXNhXG4gICAgQGVsLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiXG5cbiAgcmVuZGVyOiAtPlxuICAgIEBzZXROYW1lKFwiRXhwb3J0XCIpXG5cbiAgICBAYWRkTm9kZSBcIkV4cG9ydCBzZXF1ZW5jZXNcIiwgPT5cbiAgICAgICMgbGltaXQgYXQgYWJvdXQgMjU2a1xuICAgICAgdGV4dCA9IEZhc3RhRXhwb3J0ZXIuZXhwb3J0IEBtb2RlbC50b0pTT04oKVxuICAgICAgYmxvYiA9IG5ldyBCbG9iKFt0ZXh0XSwge3R5cGUgOiAndGV4dC9wbGFpbid9KVxuICAgICAgc2F2ZUFzIGJsb2IsIFwiYWxsLmZhc3RhXCJcblxuICAgIEBhZGROb2RlIFwiRXhwb3J0IHNlbGVjdGlvblwiLCA9PlxuICAgICAgc2VsZWN0aW9uID0gQGcuc2VsY29sLnBsdWNrIFwic2VxSWRcIlxuICAgICAgaWYgc2VsZWN0aW9uP1xuICAgICAgICAjIGZpbHRlciB0aG9zZSBzZXFpZHNcbiAgICAgICAgc2VsZWN0aW9uID0gQG1vZGVsLmZpbHRlciAoZWwpIC0+XG4gICAgICAgICAgXy5jb250YWlucyBzZWxlY3Rpb24sIGVsLmdldCBcImlkXCJcbiAgICAgICAgZm9yIGkgaW4gWzAuLiBzZWxlY3Rpb24ubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgICAgIHNlbGVjdGlvbltpXSA9IHNlbGVjdGlvbltpXS50b0pTT04oKVxuICAgICAgZWxzZVxuICAgICAgICBzZWxlY3Rpb24gPSBAbW9kZWwudG9KU09OKClcbiAgICAgICAgY29uc29sZS5sb2cgXCJubyBzZWxlY3Rpb24gZm91bmRcIlxuICAgICAgdGV4dCA9IEZhc3RhRXhwb3J0ZXIuZXhwb3J0IHNlbGVjdGlvblxuICAgICAgYmxvYiA9IG5ldyBCbG9iKFt0ZXh0XSwge3R5cGUgOiAndGV4dC9wbGFpbid9KVxuICAgICAgc2F2ZUFzIGJsb2IsIFwic2VsZWN0aW9uLmZhc3RhXCJcblxuICAgICMgVE9ETzogdXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtQ2FudmFzLXRvLUJsb2IvYmxvYi9tYXN0ZXIvanMvY2FudmFzLXRvLWJsb2IuanNcbiAgICBAYWRkTm9kZSBcIkV4cG9ydCBpbWFnZVwiLCA9PlxuICAgICAgIyBUT0RPOiB0aGlzIGlzIHZlcnkgdWdseVxuICAgICAgY2FudmFzID0gQG1zYS5nZXRWaWV3KCdzdGFnZScpLmdldFZpZXcoJ2JvZHknKS5nZXRWaWV3KCdzZXFibG9jaycpLmVsXG4gICAgICBpZiBjYW52YXM/XG4gICAgICAgIHVybCA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycpXG4gICAgICAgIHNhdmVBcyBibG9iVVJMKHVybCksIFwiYmlvanMtbXNhLnBuZ1wiLCBcImltYWdlL3BuZ1wiXG5cbiAgICAgICMgYWRkIG9jdGV0LXN0cmVhbVxuICAgICAgI3VybCA9IHVybC5yZXBsYWNlKCAvLy8gIyBjcyBoZXJlZ2V4ZXNcbiAgICAgICMvXmRhdGFbOl1pbWFnZVxcLyhwbmd8anBnfGpwZWcpWztdL2lcbiAgICAgICMvLy8sIFwiZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07XCIpXG5cbiAgICBAZWwuYXBwZW5kQ2hpbGQgQGJ1aWxkRE9NKClcbiAgICBAXG4iLCJNZW51QnVpbGRlciA9IHJlcXVpcmUgXCIuLi9tZW51YnVpbGRlclwiXG5jb25zZW51cyA9IHJlcXVpcmUgXCIuLi8uLi9hbGdvL0NvbnNlbnN1c0NhbGNcIlxuU2VxID0gcmVxdWlyZSBcIi4uLy4uL21vZGVsL1NlcXVlbmNlXCJcblxubW9kdWxlLmV4cG9ydHMgPSBFeHRyYU1lbnUgPSBNZW51QnVpbGRlci5leHRlbmRcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAZyA9IGRhdGEuZ1xuICAgIEBlbC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuXG4gIHJlbmRlcjogLT5cbiAgICBAc2V0TmFtZShcIkV4dHJhc1wiKVxuICAgIEBhZGROb2RlIFwiQWRkIGNvbnNlbnN1cyBzZXFcIiwgPT5cbiAgICAgIGNvbiA9IGNvbnNlbnVzKEBtb2RlbClcbiAgICAgIGNvbnNvbGUubG9nIGNvblxuICAgICAgc2VxID0gbmV3IFNlcVxuICAgICAgICBzZXE6IGNvblxuICAgICAgICBpZDogXCIwY1wiXG4gICAgICAgIG5hbWU6IFwiY29uc2VudXNcIlxuICAgICAgQG1vZGVsLmFkZCBzZXFcbiAgICAgIEBtb2RlbC5jb21wYXJhdG9yID0gKHNlcSkgLT5cbiAgICAgICAgc2VxLmdldCBcImlkXCJcbiAgICAgIEBtb2RlbC5zb3J0KClcbiAgICBAYWRkTm9kZSBcIkluY3JlYXNlIGZvbnQgc2l6ZVwiLCA9PlxuICAgICAgQGcuem9vbWVyLnNldCBcImNvbHVtbldpZHRoXCIsIEBnLnpvb21lci5nZXQoXCJjb2x1bW5XaWR0aFwiKSArIDJcbiAgICAgIEBnLnpvb21lci5zZXQgXCJsYWJlbFdpZHRoXCIsIEBnLnpvb21lci5nZXQoXCJjb2x1bW5XaWR0aFwiKSArIDVcbiAgICAgIEBnLnpvb21lci5zZXQgXCJyb3dIZWlnaHRcIiwgQGcuem9vbWVyLmdldChcInJvd0hlaWdodFwiKSArIDJcbiAgICAgIEBnLnpvb21lci5zZXQgXCJsYWJlbEZvbnRTaXplXCIsIEBnLnpvb21lci5nZXQoXCJsYWJlbEZvbnRTaXplXCIpICsgMlxuICAgIEBhZGROb2RlIFwiRGVjcmVhc2UgZm9udCBzaXplXCIsID0+XG4gICAgICBAZy56b29tZXIuc2V0IFwiY29sdW1uV2lkdGhcIiwgQGcuem9vbWVyLmdldChcImNvbHVtbldpZHRoXCIpIC0gMlxuICAgICAgQGcuem9vbWVyLnNldCBcInJvd0hlaWdodFwiLCBAZy56b29tZXIuZ2V0KFwicm93SGVpZ2h0XCIpIC0gMlxuICAgICAgQGcuem9vbWVyLnNldCBcImxhYmVsRm9udFNpemVcIiwgQGcuem9vbWVyLmdldChcImxhYmVsRm9udFNpemVcIikgLSAyXG4gICAgICBpZiBAZy56b29tZXIuZ2V0KFwiY29sdW1uV2lkdGhcIikgPCA4XG4gICAgICAgIEBnLnpvb21lci5zZXQgXCJ0ZXh0VmlzaWJsZVwiLCBmYWxzZVxuXG4gICAgQGFkZE5vZGUgXCJCYXIgY2hhcnQgZXhwIHNjYWxpbmdcIiwgPT5cbiAgICAgIEBnLmNvbHVtbnMuc2V0IFwic2NhbGluZ1wiLCBcImV4cFwiXG4gICAgQGFkZE5vZGUgXCJCYXIgY2hhcnQgbGluZWFyIHNjYWxpbmdcIiwgPT5cbiAgICAgIEBnLmNvbHVtbnMuc2V0IFwic2NhbGluZ1wiLCBcImxpblwiXG4gICAgQGFkZE5vZGUgXCJCYXIgY2hhcnQgbG9nIHNjYWxpbmdcIiwgPT5cbiAgICAgIEBnLmNvbHVtbnMuc2V0IFwic2NhbGluZ1wiLCBcImxvZ1wiXG5cbiAgICBAYWRkTm9kZSBcIk1pbmltaXplZCB3aWR0aFwiLCA9PlxuICAgICAgQGcuem9vbWVyLnNldCBcImFsaWdubWVudFdpZHRoXCIsIDYwMFxuICAgIEBhZGROb2RlIFwiTWluaW1pemVkIGhlaWdodFwiLCA9PlxuICAgICAgQGcuem9vbWVyLnNldCBcImFsaWdubWVudEhlaWdodFwiLCAxMjBcblxuICAgIEBhZGROb2RlIFwiSnVtcCB0byBhIGNvbHVtblwiLCA9PlxuICAgICAgb2Zmc2V0ID0gcHJvbXB0IFwiQ29sdW1uXCIsIFwiMjBcIlxuICAgICAgaWYgb2Zmc2V0IDwgMCBvciBvZmZzZXQgPiBAbW9kZWwuZ2V0TWF4TGVuZ3RoKCkgb3IgaXNOYU4ob2Zmc2V0KVxuICAgICAgICBhbGVydCBcImludmFsaWQgY29sdW1uXCJcbiAgICAgICAgcmV0dXJuXG4gICAgICBAZy56b29tZXIuc2V0TGVmdE9mZnNldChvZmZzZXQpXG5cbiAgICBAZWwuYXBwZW5kQ2hpbGQgQGJ1aWxkRE9NKClcbiAgICBAXG4iLCJNZW51QnVpbGRlciA9IHJlcXVpcmUgXCIuLi9tZW51YnVpbGRlclwiXG5fID0gcmVxdWlyZSBcInVuZGVyc2NvcmVcIlxuXG5tb2R1bGUuZXhwb3J0cyA9IEZpbHRlck1lbnUgPSBNZW51QnVpbGRlci5leHRlbmRcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAZyA9IGRhdGEuZ1xuICAgIEBlbC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuXG4gIHJlbmRlcjogLT5cbiAgICBAc2V0TmFtZShcIkZpbHRlclwiKVxuICAgIEBhZGROb2RlIFwiSGlkZSBjb2x1bW5zIGJ5IHRocmVzaG9sZFwiLChlKSA9PlxuICAgICAgdGhyZXNob2xkID0gcHJvbXB0IFwiRW50ZXIgdGhyZXNob2xkIChpbiBwZXJjZW50KVwiLCAyMFxuICAgICAgdGhyZXNob2xkID0gdGhyZXNob2xkIC8gMTAwXG4gICAgICBtYXhMZW4gPSBAbW9kZWwuZ2V0TWF4TGVuZ3RoKClcbiAgICAgIGhpZGRlbiA9IFtdXG4gICAgICBjb25zZXJ2ID0gQGcuY29sdW1ucy5nZXQoXCJjb25zZXJ2XCIpXG4gICAgICBmb3IgaSBpbiBbMC4uIG1heExlbiAtIDFdXG4gICAgICAgIGlmIGNvbnNlcnZbaV0gPCB0aHJlc2hvbGRcbiAgICAgICAgICBoaWRkZW4ucHVzaCBpXG4gICAgICBAZy5jb2x1bW5zLnNldCBcImhpZGRlblwiLCBoaWRkZW5cblxuICAgIEBhZGROb2RlIFwiSGlkZSBjb2x1bW5zIGJ5IHNlbGVjdGlvblwiLCA9PlxuICAgICAgaGlkZGVuT2xkID0gQGcuY29sdW1ucy5nZXQgXCJoaWRkZW5cIlxuICAgICAgaGlkZGVuID0gaGlkZGVuT2xkLmNvbmNhdCBAZy5zZWxjb2wuZ2V0QWxsQ29sdW1uQmxvY2tzIG1heExlbjogQG1vZGVsLmdldE1heExlbmd0aCgpLCB3aXRoUG9zOiB0cnVlXG4gICAgICBAZy5zZWxjb2wucmVzZXQgW11cbiAgICAgIEBnLmNvbHVtbnMuc2V0IFwiaGlkZGVuXCIsIGhpZGRlblxuXG4gICAgQGFkZE5vZGUgXCJIaWRlIGNvbHVtbnMgYnkgZ2Fwc1wiLCA9PlxuICAgICAgdGhyZXNob2xkID0gcHJvbXB0IFwiRW50ZXIgdGhyZXNob2xkIChpbiBwZXJjZW50KVwiLCAyMFxuICAgICAgdGhyZXNob2xkID0gdGhyZXNob2xkIC8gMTAwXG4gICAgICBtYXhMZW4gPSBAbW9kZWwuZ2V0TWF4TGVuZ3RoKClcbiAgICAgIGhpZGRlbiA9IFtdXG4gICAgICBmb3IgaSBpbiBbMC4uIG1heExlbiAtIDFdXG4gICAgICAgIGdhcHMgPSAwXG4gICAgICAgIHRvdGFsID0gMFxuICAgICAgICBAbW9kZWwuZWFjaCAoZWwpIC0+XG4gICAgICAgICAgZ2FwcysrIGlmIGVsLmdldCgnc2VxJylbaV0gaXMgXCItXCJcbiAgICAgICAgICB0b3RhbCsrXG4gICAgICAgIGdhcENvbnRlbnQgPSBnYXBzIC8gdG90YWxcbiAgICAgICAgaWYgZ2FwQ29udGVudCA+IHRocmVzaG9sZFxuICAgICAgICAgIGhpZGRlbi5wdXNoIGlcbiAgICAgIEBnLmNvbHVtbnMuc2V0IFwiaGlkZGVuXCIsIGhpZGRlblxuXG4gICAgQGFkZE5vZGUgXCJIaWRlIHNlcXMgYnkgaWRlbnRpdHlcIiwgPT5cbiAgICAgIHRocmVzaG9sZCA9IHByb21wdCBcIkVudGVyIHRocmVzaG9sZCAoaW4gcGVyY2VudClcIiwgMjBcbiAgICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZCAvIDEwMFxuICAgICAgQG1vZGVsLmVhY2ggKGVsKSAtPlxuICAgICAgICBpZiBlbC5nZXQoJ2lkZW50aXR5JykgPCB0aHJlc2hvbGRcbiAgICAgICAgICBlbC5zZXQoJ2hpZGRlbicsIHRydWUpXG5cbiAgICBAYWRkTm9kZSBcIkhpZGUgc2VxcyBieSBzZWxlY3Rpb25cIiwgPT5cbiAgICAgIGhpZGRlbiA9IEBnLnNlbGNvbC53aGVyZSB0eXBlOiBcInJvd1wiXG4gICAgICBpZHMgPSBfLm1hcCBoaWRkZW4sIChlbCkgLT4gZWwuZ2V0KCdzZXFJZCcpXG4gICAgICBAZy5zZWxjb2wucmVzZXQgW11cbiAgICAgIEBtb2RlbC5lYWNoIChlbCkgLT5cbiAgICAgICAgaWYgaWRzLmluZGV4T2YoZWwuZ2V0KCdpZCcpKSA+PSAwXG4gICAgICAgICAgZWwuc2V0KCdoaWRkZW4nLCB0cnVlKVxuXG4gICAgQGFkZE5vZGUgXCJIaWRlIHNlcXMgYnkgZ2Fwc1wiLCA9PlxuICAgICAgdGhyZXNob2xkID0gcHJvbXB0IFwiRW50ZXIgdGhyZXNob2xkIChpbiBwZXJjZW50KVwiLCA0MFxuICAgICAgQG1vZGVsLmVhY2ggKGVsLGkpIC0+XG4gICAgICAgIHNlcSA9IGVsLmdldCgnc2VxJylcbiAgICAgICAgZ2FwcyA9IF8ucmVkdWNlIHNlcSwgKChtZW1vLCBjKSAtPiBtZW1vKysgaWYgYyBpcyAnLSc7bWVtbyksMFxuICAgICAgICBjb25zb2xlLmxvZyBnYXBzXG4gICAgICAgIGlmIGdhcHMgPiAgdGhyZXNob2xkXG4gICAgICAgICAgZWwuc2V0KCdoaWRkZW4nLCB0cnVlKVxuXG4gICAgQGFkZE5vZGUgXCJSZXNldFwiLCA9PlxuICAgICAgQGcuY29sdW1ucy5zZXQgXCJoaWRkZW5cIiwgW11cbiAgICAgIEBtb2RlbC5lYWNoIChlbCkgLT5cbiAgICAgICAgaWYgZWwuZ2V0KCdoaWRkZW4nKVxuICAgICAgICAgIGVsLnNldCgnaGlkZGVuJywgZmFsc2UpXG5cbiAgICBAZWwuYXBwZW5kQ2hpbGQgQGJ1aWxkRE9NKClcbiAgICBAXG4iLCJNZW51QnVpbGRlciA9IHJlcXVpcmUgXCIuLi9tZW51YnVpbGRlclwiXG5cbm1vZHVsZS5leHBvcnRzID0gSGVscE1lbnUgPSBNZW51QnVpbGRlci5leHRlbmRcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAZyA9IGRhdGEuZ1xuXG4gIHJlbmRlcjogLT5cbiAgICBAc2V0TmFtZShcIkhlbHBcIilcbiAgICBAYWRkTm9kZSBcIkFib3V0IHRoZSBwcm9qZWN0XCIsID0+XG4gICAgICB3aW5kb3cub3BlbiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ncmVlbmlmeS9iaW9qcy12aXMtbXNhXCJcbiAgICBAYWRkTm9kZSBcIlJlcG9ydCBpc3N1ZXNcIiwgPT5cbiAgICAgIHdpbmRvdy5vcGVuIFwiaHR0cHM6Ly9naXRodWIuY29tL2dyZWVuaWZ5L2Jpb2pzLXZpcy1tc2EvaXNzdWVzXCJcbiAgICBAYWRkTm9kZSBcIlVzZXIgbWFudWFsXCIsID0+XG4gICAgICB3aW5kb3cub3BlbiBcImh0dHBzOi8vZ2l0aHViLmNvbS9ncmVlbmlmeS9iaW9qcy12aXMtbXNhL3dpa2lcIlxuICAgIEBlbC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuICAgIEBlbC5hcHBlbmRDaGlsZCBAYnVpbGRET00oKVxuICAgIEBcbiIsIkNsdXN0YWwgPSByZXF1aXJlIFwiYmlvanMtaW8tY2x1c3RhbFwiXG5GYXN0YVJlYWRlciA9IHJlcXVpcmUoXCJiaW9qcy1pby1mYXN0YVwiKS5wYXJzZVxuTWVudUJ1aWxkZXIgPSByZXF1aXJlIFwiLi4vbWVudWJ1aWxkZXJcIlxuY29yc1VSTCA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy9wcm94eVwiKS5jb3JzVVJMXG5cbm1vZHVsZS5leHBvcnRzID0gSW1wb3J0TWVudSA9IE1lbnVCdWlsZGVyLmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG4gICAgQGVsLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiXG5cbiAgcmVuZGVyOiAtPlxuICAgIEBzZXROYW1lKFwiSW1wb3J0XCIpXG4gICAgQGFkZE5vZGUgXCJGQVNUQVwiLChlKSA9PlxuICAgICAgdXJsID0gcHJvbXB0IFwiVVJMXCIsIFwiL3Rlc3QvZHVtbXkvc2FtcGxlcy9wNTMuY2x1c3RhbG8uZmFzdGFcIlxuICAgICAgdXJsID0gY29yc1VSTCB1cmwsIEBnXG4gICAgICBGYXN0YVJlYWRlci5yZWFkIHVybCwgKHNlcXMpID0+XG4gICAgICAgICMgbWFzcyB1cGRhdGUgb24gem9vbWVyXG4gICAgICAgIHpvb21lciA9IEBnLnpvb21lci50b0pTT04oKVxuICAgICAgICAjem9vbWVyLnRleHRWaXNpYmxlID0gZmFsc2VcbiAgICAgICAgI3pvb21lci5jb2x1bW5XaWR0aCA9IDRcbiAgICAgICAgem9vbWVyLmxhYmVsV2lkdGggPSAyMDBcbiAgICAgICAgem9vbWVyLmJveFJlY3RIZWlnaHQgPSAyXG4gICAgICAgIHpvb21lci5ib3hSZWN0V2lkdGggPSAyXG4gICAgICAgIEBtb2RlbC5yZXNldCBbXVxuICAgICAgICBAZy56b29tZXIuc2V0IHpvb21lclxuICAgICAgICBAbW9kZWwucmVzZXQgc2Vxc1xuICAgICAgICBAZy5jb2x1bW5zLmNhbGNDb25zZXJ2YXRpb24gQG1vZGVsXG5cbiAgICBAYWRkTm9kZSBcIkNMVVNUQUxcIiwgPT5cbiAgICAgIHVybCA9IHByb21wdCBcIlVSTFwiLCBcIi90ZXN0L2R1bW15L3NhbXBsZXMvcDUzLmNsdXN0YWxvLmNsdXN0YWxcIlxuICAgICAgdXJsID0gY29yc1VSTCB1cmwsIEBnXG4gICAgICBDbHVzdGFsLnJlYWQgdXJsLCAoc2VxcykgPT5cbiAgICAgICAgem9vbWVyID0gQGcuem9vbWVyLnRvSlNPTigpXG4gICAgICAgICN6b29tZXIudGV4dFZpc2libGUgPSBmYWxzZVxuICAgICAgICAjem9vbWVyLmNvbHVtbldpZHRoID0gNFxuICAgICAgICB6b29tZXIubGFiZWxXaWR0aCA9IDIwMFxuICAgICAgICB6b29tZXIuYm94UmVjdEhlaWdodCA9IDJcbiAgICAgICAgem9vbWVyLmJveFJlY3RXaWR0aCA9IDJcbiAgICAgICAgQG1vZGVsLnJlc2V0IFtdXG4gICAgICAgIEBnLnpvb21lci5zZXQgem9vbWVyXG4gICAgICAgIEBtb2RlbC5yZXNldCBzZXFzXG4gICAgICAgIEBnLmNvbHVtbnMuY2FsY0NvbnNlcnZhdGlvbiBAbW9kZWxcblxuICAgIEBhZGROb2RlIFwiYWRkIHlvdXIgb3duIFBhcnNlclwiLCA9PlxuICAgICAgd2luZG93Lm9wZW4gXCJodHRwczovL2dpdGh1Yi5jb20vYmlvanMvYmlvanMyXCJcblxuICAgIEBlbC5hcHBlbmRDaGlsZCBAYnVpbGRET00oKVxuICAgIEBcbiIsIk1lbnVCdWlsZGVyID0gcmVxdWlyZSBcIi4uL21lbnVidWlsZGVyXCJcbmRvbSA9IHJlcXVpcmUgXCJkb20taGVscGVyXCJcbl8gPSByZXF1aXJlKCd1bmRlcnNjb3JlJylcblxubW9kdWxlLmV4cG9ydHMgPSBPcmRlcmluZ01lbnUgPSBNZW51QnVpbGRlci5leHRlbmRcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAZyA9IGRhdGEuZ1xuICAgIEBvcmRlciA9IFwiSURcIlxuICAgIEBlbC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuXG4gIHNldE9yZGVyOiAob3JkZXIpIC0+XG4gICAgQG9yZGVyID0gb3JkZXJcbiAgICBAcmVuZGVyKClcblxuICAjIFRPRE86IG1ha2UgbW9yZSBnZW5lcmljXG4gIHJlbmRlcjogLT5cbiAgICBAc2V0TmFtZShcIk9yZGVyaW5nXCIpXG5cbiAgICBjb21wcyA9IEBnZXRDb21wYXJhdG9ycygpXG4gICAgZm9yIG0gaW4gY29tcHNcbiAgICAgIEBfYWRkTm9kZSBtXG5cbiAgICBlbCA9IEBidWlsZERPTSgpXG5cbiAgICAjIFRPRE86IG1ha2UgbW9yZSBlZmZpY2llbnRcbiAgICBkb20ucmVtb3ZlQWxsQ2hpbGRzIEBlbFxuICAgIEBlbC5hcHBlbmRDaGlsZCBlbFxuICAgIEBcblxuICBfYWRkTm9kZTogKG0pIC0+XG4gICAgdGV4dCA9IG0udGV4dFxuICAgIHN0eWxlID0ge31cbiAgICBpZiB0ZXh0IGlzIEBvcmRlclxuICAgICAgc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCIjNzdFRDgwXCJcbiAgICBAYWRkTm9kZSB0ZXh0LCA9PlxuICAgICAgbS5wcmVjb2RlKCkgaWYgbS5wcmVjb2RlP1xuICAgICAgQG1vZGVsLmNvbXBhcmF0b3IgPSBtLmNvbXBhcmF0b3JcbiAgICAgIEBtb2RlbC5zb3J0KClcbiAgICAgIEBzZXRPcmRlciBtLnRleHRcbiAgICAsXG4gICAgICBzdHlsZTogc3R5bGVcblxuICBnZXRDb21wYXJhdG9yczogLT5cbiAgICBtb2RlbHMgPSBbXVxuXG4gICAgbW9kZWxzLnB1c2ggdGV4dDogXCJJRFwiLCBjb21wYXJhdG9yOiBcImlkXCJcblxuICAgIG1vZGVscy5wdXNoIHRleHQ6IFwiSUQgRGVzY1wiLCBjb21wYXJhdG9yOiAoYSwgYikgLT5cbiAgICAgICAgLSBhLmdldChcImlkXCIpLmxvY2FsZUNvbXBhcmUoYi5nZXQoXCJpZFwiKSlcblxuICAgIG1vZGVscy5wdXNoIHRleHQ6IFwiTGFiZWxcIiwgY29tcGFyYXRvcjogXCJuYW1lXCJcblxuICAgIG1vZGVscy5wdXNoIHRleHQ6IFwiTGFiZWwgRGVzY1wiLCBjb21wYXJhdG9yOiAoYSwgYikgLT5cbiAgICAgICAgLSBhLmdldChcIm5hbWVcIikubG9jYWxlQ29tcGFyZShiLmdldChcIm5hbWVcIikpXG5cbiAgICBtb2RlbHMucHVzaCB0ZXh0OiBcIlNlcVwiLCBjb21wYXJhdG9yOiBcInNlcVwiXG5cbiAgICBtb2RlbHMucHVzaCB0ZXh0OiBcIlNlcSBEZXNjXCIsIGNvbXBhcmF0b3I6IChhLGIpIC0+XG4gICAgICAgIC0gYS5nZXQoXCJzZXFcIikubG9jYWxlQ29tcGFyZShiLmdldChcInNlcVwiKSlcblxuICAgIG1vZGVscy5wdXNoIHRleHQ6IFwiSWRlbnRpdHlcIiwgY29tcGFyYXRvcjogXCJpZGVudGl0eVwiXG5cbiAgICBtb2RlbHMucHVzaCB0ZXh0OiBcIklkZW50aXR5IERlc2NcIiwgY29tcGFyYXRvcjogKHNlcSkgLT5cbiAgICAgICAgLSBzZXEuZ2V0IFwiaWRlbnRpdHlcIlxuXG4gICAgbW9kZWxzLnB1c2ggdGV4dDogXCJQYXJ0aXRpb24gY29kZXNcIiwgY29tcGFyYXRvcjogXCJwYXJ0aXRpb25cIiwgcHJlY29kZTogPT5cbiAgICAgICMgc2V0IHBhcnRpdGlvbnMgcmFuZG9tXG4gICAgICBAZy52aXMuc2V0KCdsYWJlbFBhcnRpdGlvbicsIHRydWUpXG4gICAgICBAbW9kZWwuZWFjaCAoZWwpIC0+XG4gICAgICAgIGVsLnNldCgncGFydGl0aW9uJywgXy5yYW5kb20oMSwzKSlcblxuXG4gICAgcmV0dXJuIG1vZGVsc1xuIiwic2VsID0gcmVxdWlyZSBcIi4uLy4uL2cvc2VsZWN0aW9uL1NlbGVjdGlvblwiXG5cbk1lbnVCdWlsZGVyID0gcmVxdWlyZSBcIi4uL21lbnVidWlsZGVyXCJcblxubW9kdWxlLmV4cG9ydHMgPSBTZWxlY3Rpb25NZW51ID0gTWVudUJ1aWxkZXIuZXh0ZW5kXG5cbiAgaW5pdGlhbGl6ZTogKGRhdGEpIC0+XG4gICAgQGcgPSBkYXRhLmdcbiAgICBAZWwuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCJcblxuICByZW5kZXI6IC0+XG4gICAgQHNldE5hbWUoXCJTZWxlY3Rpb25cIilcbiAgICBAYWRkTm9kZSBcIkZpbmQgTW90aWYgKHN1cHBvcnRzIFJlZ0V4KVwiLCA9PlxuICAgICAgc2VhcmNoID0gcHJvbXB0IFwieW91ciBzZWFyY2hcIiwgXCJEXCJcbiAgICAgICMgbWFya3MgYWxsIGhpdHNcbiAgICAgIHNlYXJjaCA9IG5ldyBSZWdFeHAgc2VhcmNoLCBcImdpXCJcbiAgICAgIHNlbGNvbCA9IEBnLnNlbGNvbFxuICAgICAgbmV3U2VsaSA9IFtdXG4gICAgICBsZWZ0ZXN0SW5kZXggPSBvcmlnSW5kZXggPSAxMDAwNDJcbiAgICAgIEBtb2RlbC5lYWNoIChzZXEpIC0+XG4gICAgICAgIHN0clNlcSA9IHNlcS5nZXQoXCJzZXFcIilcbiAgICAgICAgd2hpbGUgbWF0Y2ggPSBzZWFyY2guZXhlYyBzdHJTZXFcbiAgICAgICAgICBpbmRleCA9IG1hdGNoLmluZGV4XG4gICAgICAgICAgYXJncyA9IHt4U3RhcnQ6IGluZGV4LCB4RW5kOiBpbmRleCArIG1hdGNoWzBdLmxlbmd0aCAtIDEsIHNlcUlkOlxuICAgICAgICAgICAgc2VxLmdldChcImlkXCIpfVxuICAgICAgICAgIG5ld1NlbGkucHVzaCBuZXcgc2VsLnBvc3NlbChhcmdzKVxuICAgICAgICAgIGxlZnRlc3RJbmRleCA9IE1hdGgubWluIGluZGV4LCBsZWZ0ZXN0SW5kZXhcblxuICAgICAgaWYgbmV3U2VsaS5sZW5ndGggaXMgMFxuICAgICAgICBhbGVydCBcIm5vIHNlbGVjdGlvbiBmb3VuZFwiXG4gICAgICBzZWxjb2wucmVzZXQgbmV3U2VsaVxuXG4gICAgICAjIHNhZmV0eSBjaGVjayArIHVwZGF0ZSBvZmZzZXRcbiAgICAgIGxlZnRlc3RJbmRleCA9IDAgaWYgbGVmdGVzdEluZGV4IGlzIG9yaWdJbmRleFxuICAgICAgQGcuem9vbWVyLnNldExlZnRPZmZzZXQgbGVmdGVzdEluZGV4XG5cbiAgICBAYWRkTm9kZSBcIkludmVydCBjb2x1bW5zXCIsID0+XG4gICAgICBAZy5zZWxjb2wuaW52ZXJ0Q29sIFswLi5AbW9kZWwuZ2V0TWF4TGVuZ3RoKCldXG4gICAgQGFkZE5vZGUgXCJJbnZlcnQgcm93c1wiLCA9PlxuICAgICAgQGcuc2VsY29sLmludmVydFJvdyBAbW9kZWwucGx1Y2sgXCJpZFwiXG4gICAgQGFkZE5vZGUgXCJSZXNldFwiLCA9PlxuICAgICAgQGcuc2VsY29sLnJlc2V0KClcbiAgICBAZWwuYXBwZW5kQ2hpbGQgQGJ1aWxkRE9NKClcbiAgICBAXG4iLCJNZW51QnVpbGRlciA9IHJlcXVpcmUgXCIuLi9tZW51YnVpbGRlclwiXG5kb20gPSByZXF1aXJlIFwiZG9tLWhlbHBlclwiXG5cbm1vZHVsZS5leHBvcnRzID0gSW1wb3J0TWVudSA9IE1lbnVCdWlsZGVyLmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG4gICAgQGVsLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiXG4gICAgQGxpc3RlblRvIEBnLnZpcywgXCJjaGFuZ2VcIiwgQHJlbmRlclxuXG4gIHJlbmRlcjogLT5cbiAgICBAc2V0TmFtZShcIlZpcy4gZWxlbWVudHNcIilcblxuICAgIHZpc0VsZW1lbnRzID0gQGdldFZpc0VsZW1lbnRzKClcbiAgICBmb3IgdmlzRWwgaW4gdmlzRWxlbWVudHNcbiAgICAgIEBfYWRkVmlzRWwgdmlzRWxcblxuICAgICMgb3RoZXJcbiAgICBAYWRkTm9kZSBcIlJlc2V0XCIsID0+XG4gICAgICBAZy52aXMuc2V0IFwibGFiZWxzXCIsIHRydWVcbiAgICAgIEBnLnZpcy5zZXQgXCJzZXF1ZW5jZXNcIiwgdHJ1ZVxuICAgICAgQGcudmlzLnNldCBcIm1ldGFjZWxsXCIsIHRydWVcbiAgICAgIEBnLnZpcy5zZXQgXCJjb25zZXJ2XCIsIHRydWVcbiAgICAgIEBnLnZpcy5zZXQgXCJsYWJlbElkXCIsIHRydWVcbiAgICAgIEBnLnZpcy5zZXQgXCJsYWJlbE5hbWVcIiwgdHJ1ZVxuICAgICAgQGcudmlzLnNldCBcImxhYmVsQ2hlY2tib3hcIiwgZmFsc2VcblxuICAgIEBhZGROb2RlIFwiVG9nZ2xlIG1vdXNlb3ZlciBldmVudHNcIiwgPT5cbiAgICAgIEBnLmNvbmZpZy5zZXQgXCJyZWdpc3Rlck1vdXNlSG92ZXJcIiwgIUBnLmNvbmZpZy5nZXQgXCJyZWdpc3Rlck1vdXNlSG92ZXJcIlxuXG4gICAgIyBUT0RPOiBtYWtlIG1vcmUgZWZmaWNpZW50XG4gICAgZG9tLnJlbW92ZUFsbENoaWxkcyBAZWxcbiAgICBAZWwuYXBwZW5kQ2hpbGQgQGJ1aWxkRE9NKClcbiAgICBAXG5cbiAgX2FkZFZpc0VsOiAodmlzRWwpIC0+XG4gICAgc3R5bGUgPSB7fVxuXG4gICAgaWYgQGcudmlzLmdldCB2aXNFbC5pZFxuICAgICAgcHJlID0gXCJIaWRlIFwiXG4gICAgICBzdHlsZS5jb2xvciA9IFwicmVkXCJcbiAgICBlbHNlXG4gICAgICBwcmUgPSBcIlNob3cgXCJcbiAgICAgIHN0eWxlLmNvbG9yID0gXCJncmVlblwiXG5cbiAgICBAYWRkTm9kZSAocHJlICsgdmlzRWwubmFtZSksID0+XG4gICAgICBAZy52aXMuc2V0IHZpc0VsLmlkLCAhIEBnLnZpcy5nZXQgdmlzRWwuaWRcbiAgICAsXG4gICAgICBzdHlsZTogc3R5bGVcblxuICBnZXRWaXNFbGVtZW50czogLT5cbiAgICB2aXMgPSBbXVxuICAgIHZpcy5wdXNoIG5hbWU6IFwiTWFya2Vyc1wiLCBpZDogXCJtYXJrZXJzXCJcbiAgICB2aXMucHVzaCBuYW1lOiBcIkxhYmVsc1wiLCBpZDogXCJsYWJlbHNcIlxuICAgIHZpcy5wdXNoIG5hbWU6IFwiU2VxdWVuY2VzXCIsIGlkOiBcInNlcXVlbmNlc1wiXG4gICAgdmlzLnB1c2ggbmFtZTogXCJNZXRhIGluZm9cIiwgaWQ6IFwibWV0YWNlbGxcIlxuICAgIHZpcy5wdXNoIG5hbWU6IFwiT3ZlcnZpZXdib3hcIiwgaWQ6IFwib3ZlcnZpZXdib3hcIlxuICAgIHZpcy5wdXNoIG5hbWU6IFwiY29uc2VydlwiLCBpZDogXCJjb25zZXJ2XCJcbiAgICB2aXMucHVzaCBuYW1lOiBcIkxhYmVsTmFtZVwiLCBpZDogXCJsYWJlbE5hbWVcIlxuICAgIHZpcy5wdXNoIG5hbWU6IFwiTGFiZWxJZFwiLCBpZDogXCJsYWJlbElkXCJcbiAgICB2aXMucHVzaCBuYW1lOiBcIkxhYmVsQ2hlY2tib3hcIiwgaWQ6IFwibGFiZWxDaGVja2JveFwiXG4gICAgcmV0dXJuIHZpc1xuIiwiRmVhdHVyZSA9IHJlcXVpcmUgXCIuL0ZlYXR1cmVcIlxuTW9kZWwgPSByZXF1aXJlKFwiYmFja2JvbmUtdGhpblwiKS5Nb2RlbFxuXG5tb2R1bGUuZXhwb3J0cyA9IEZlYXR1cmUgPSBNb2RlbC5leHRlbmRcblxuICBkZWZhdWx0czpcbiAgICB4U3RhcnQ6IC0xXG4gICAgeEVuZDogLTFcbiAgICBoZWlnaHQ6IC0xXG4gICAgdGV4dDogXCJcIlxuICAgIGZpbGxDb2xvcjogXCJyZWRcIlxuICAgIGZpbGxPcGFjaXR5OiAwLjVcbiAgICB0eXBlOiBcInJlY3RhbmdsZVwiXG4gICAgYm9yZGVyU2l6ZTogMVxuICAgIGJvcmRlckNvbG9yOiBcImJsYWNrXCJcbiAgICBib3JkZXJPcGFjaXR5OiAwLjVcbiAgICB2YWxpZGF0ZTogdHJ1ZVxuXG4gIHZhbGlkYXRlOiAtPlxuICAgIGlmIGlzTmFOIEBhdHRyaWJ1dGVzLnhTdGFydCBvciBpc05hTiBAYXR0cmlidXRlcy54RW5kXG4gICAgICBcImZlYXR1cmVzIG5lZWQgaW50ZWdlciBzdGFydCBhbmQgZW5kLlwiXG5cbiAgY29udGFpbnM6IChpbmRleCkgLT5cbiAgICByZXR1cm4gIEBhdHRyaWJ1dGVzLnhTdGFydCA8PSBpbmRleCAmJiBpbmRleCA8PSBAYXR0cmlidXRlcy54RW5kXG5cbiIsIkZlYXR1cmUgPSByZXF1aXJlIFwiLi9GZWF0dXJlXCJcbkNvbGxlY3Rpb24gPSByZXF1aXJlKFwiYmFja2JvbmUtdGhpblwiKS5Db2xsZWN0aW9uXG5fID0gcmVxdWlyZSBcInVuZGVyc2NvcmVcIlxuXG5tb2R1bGUuZXhwb3J0cyA9IEZlYXR1cmVDb2wgPSBDb2xsZWN0aW9uLmV4dGVuZFxuICBtb2RlbDogRmVhdHVyZVxuXG4gIGNvbnN0cnVjdG9yOiAtPlxuICAgIEBzdGFydE9uQ2FjaGUgPSBbXVxuICAgICMgaW52YWxpZGF0ZSBjYWNoZVxuICAgIEBvbiBcImFsbFwiLCAtPlxuICAgICAgQHN0YXJ0T25DYWNoZSA9IFtdXG4gICAgLCBAXG4gICAgQ29sbGVjdGlvbi5hcHBseSBALCBhcmd1bWVudHNcblxuICAjIHJldHVybnMgYWxsIGZlYXR1cmVzIHN0YXJ0aW5nIG9uIGluZGV4XG4gIHN0YXJ0T246IChpbmRleCkgLT5cbiAgICB1bmxlc3MgQHN0YXJ0T25DYWNoZVtpbmRleF0/XG4gICAgICBAc3RhcnRPbkNhY2hlW2luZGV4XSA9IEB3aGVyZSh7eFN0YXJ0OiBpbmRleH0pXG4gICAgcmV0dXJuIEBzdGFydE9uQ2FjaGVbaW5kZXhdXG5cbiAgY29udGFpbnM6IChpbmRleCkgLT5cbiAgICBAcmVkdWNlIChlbCxtZW1vKSAtPlxuICAgICAgbWVtbyB8fCBlbC5jb250YWlucyBpbmRleFxuICAgICwgZmFsc2VcblxuICAjIGdpdmVzIHRoZSBtaW5pbWFsIG5lZWRlZCBudW1iZXIgb2Ygcm93c1xuICAjIG5vdCBhIHZlcnkgZWZmaWNpZW50IGFsZ29yaXRobVxuICAjICh0aGVyZSBpcyBvbmUgaW4gTyhuKSApXG4gIGdldE1pblJvd3M6IC0+XG5cbiAgICBsZW4gPSBAbWF4IChlbCkgLT4gZWwuZ2V0IFwieEVuZFwiXG4gICAgcm93cyA9ICgwIGZvciB4IGluIFsxLi5sZW5dKVxuXG4gICAgQGVhY2ggKGVsKSAtPlxuICAgICAgZm9yIHggaW4gW2VsLmdldChcInhTdGFydFwiKS4uZmVhdHVyZS5nZXQoXCJ4RW5kXCIpXSBieSAxXG4gICAgICAgIHJvd3NbeF0rK1xuXG4gICAgXy5tYXggcm93c1xuIiwiU2VxdWVuY2UgPSByZXF1aXJlIFwiLi9TZXF1ZW5jZVwiXG5Db2xsZWN0aW9uID0gcmVxdWlyZShcImJhY2tib25lLXRoaW5cIikuQ29sbGVjdGlvblxuXG5tb2R1bGUuZXhwb3J0cyA9IFNlcU1hbmFnZXIgPSBDb2xsZWN0aW9uLmV4dGVuZFxuICBtb2RlbDogU2VxdWVuY2VcblxuICBjb25zdHJ1Y3RvcjogLT5cblxuICAgIENvbGxlY3Rpb24uYXBwbHkgQCwgYXJndW1lbnRzXG5cbiAgICAjIGludmFsaWRhdGUgY2FjaGVcbiAgICBAb24gXCJhbGxcIiwgLT5cbiAgICAgIEBsZW5ndGhDYWNoZSA9IG51bGxcbiAgICAsIEBcbiAgICBAbGVuZ3RoQ2FjaGUgPSBudWxsXG5cbiAgICBAXG5cbiAgIyBnaXZlcyB0aGUgbWF4IGxlbmd0aCBvZiBhbGwgc2VxdWVuY2VzXG4gICMgKGNhY2hlZClcbiAgZ2V0TWF4TGVuZ3RoOiAoKSAtPlxuICAgIHJldHVybiAwIGlmIEBtb2RlbHMubGVuZ3RoIGlzIDBcbiAgICBpZiBAbGVuZ3RoQ2FjaGUgaXMgbnVsbFxuICAgICAgQGxlbmd0aENhY2hlID0gQG1heCgoc2VxKSAtPiBzZXEuZ2V0KFwic2VxXCIpLmxlbmd0aCkuZ2V0KFwic2VxXCIpLmxlbmd0aFxuICAgIHJldHVybiBAbGVuZ3RoQ2FjaGVcblxuICAjIGdldHMgdGhlIHByZXZpb3VzIG1vZGVsXG4gICMgQHBhcmFtIGVuZGxlc3MgW2Jvb2xlYW5dIGZvciB0aGUgZmlyc3QgZWxlbWVudFxuICAjIHRydWU6IHJldHVybnMgdGhlIGxhc3QgZWxlbWVudCwgZmFsc2U6IHJldHVybnMgdW5kZWZpbmVkXG4gIHByZXY6IChtb2RlbCwgZW5kbGVzcykgLT5cbiAgICBpbmRleCA9IEBpbmRleE9mKG1vZGVsKSAtIDFcbiAgICBpbmRleCA9IEAubGVuZ3RoIC0gMSBpZiBpbmRleCA8IDAgYW5kIGVuZGxlc3NcbiAgICBAYXQoaW5kZXgpXG5cbiAgIyBnZXRzIHRoZSBuZXh0IG1vZGVsXG4gICMgQHBhcmFtIGVuZGxlc3MgW2Jvb2xlYW5dIGZvciB0aGUgbGFzdCBlbGVtZW50XG4gICMgdHJ1ZTogcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCwgZmFsc2U6IHJldHVybnMgdW5kZWZpbmVkXG4gIG5leHQ6IChtb2RlbCwgZW5kbGVzcykgLT5cbiAgICBpbmRleCA9IEBpbmRleE9mKG1vZGVsKSArIDFcbiAgICBpbmRleCA9IDAgaWYgaW5kZXggPT0gQC5sZW5ndGggYW5kIGVuZGxlc3NcbiAgICBAYXQoaW5kZXgpXG5cbiAgIyBAcmV0dXJucyBuIFtpbnRdIG51bWJlciBvZiBoaWRkZW4gY29sdW1ucyB1bnRpbCBuXG4gIGNhbGNIaWRkZW5TZXFzOiAobikgLT5cbiAgICBuTmV3ID0gblxuICAgIGZvciBpIGluIFswLi5uTmV3XVxuICAgICAgaWYgQGF0KGkpLmdldChcImhpZGRlblwiKVxuICAgICAgICBuTmV3KytcbiAgICBuTmV3IC0gblxuXG4iLCJNb2RlbCA9IHJlcXVpcmUoXCJiYWNrYm9uZS10aGluXCIpLk1vZGVsXG5GZWF0dXJlQ29sID0gcmVxdWlyZSBcIi4vRmVhdHVyZUNvbFwiXG5cbm1vZHVsZS5leHBvcnRzID0gU2VxdWVuY2UgPSBNb2RlbC5leHRlbmRcblxuICBkZWZhdWx0czpcbiAgICBuYW1lOiBcIlwiXG4gICAgaWQ6IFwiXCJcbiAgICBzZXE6IFwiXCJcblxuICBpbml0aWFsaXplOiAtPlxuICAgICMgcmVzaWR1ZXMgd2l0aG91dCBjb2xvclxuICAgIEAuc2V0IFwiZ3JleVwiLCBbXVxuICAgIEAuc2V0IFwiZmVhdHVyZXNcIiwgbmV3IEZlYXR1cmVDb2woKVxuIiwibW9kdWxlLmV4cG9ydHMuc2VxID0gcmVxdWlyZSBcIi4vU2VxdWVuY2VcIlxubW9kdWxlLmV4cG9ydHMuc2VxY29sID0gcmVxdWlyZSBcIi4vU2VxQ29sbGVjdGlvblwiXG5tb2R1bGUuZXhwb3J0cy5mZWF0dXJlID0gcmVxdWlyZSBcIi4vRmVhdHVyZVwiXG5tb2R1bGUuZXhwb3J0cy5mZWF0dXJlY29sID0gcmVxdWlyZSBcIi4vRmVhdHVyZUNvbFwiXG4iLCIjIG1vZGVsc1xuU2VxQ29sbGVjdGlvbiA9IHJlcXVpcmUgXCIuL21vZGVsL1NlcUNvbGxlY3Rpb25cIlxuXG4jIGdsb2JhbHNcbkNvbG9yYXRvciA9IHJlcXVpcmUgXCIuL2cvY29sb3JhdG9yXCJcbkNvbnNlbnN1cyA9IHJlcXVpcmUgXCIuL2cvY29uc2Vuc3VzXCJcbkNvbHVtbnMgPSByZXF1aXJlIFwiLi9nL2NvbHVtbnNcIlxuQ29uZmlnID0gcmVxdWlyZSBcIi4vZy9jb25maWdcIlxuU2VsQ29sID0gcmVxdWlyZSBcIi4vZy9zZWxlY3Rpb24vU2VsZWN0aW9uQ29sXCJcblZpc2liaWxpdHkgPSByZXF1aXJlIFwiLi9nL3Zpc2liaWxpdHlcIlxuVmlzT3JkZXJpbmcgPSByZXF1aXJlIFwiLi9nL3Zpc09yZGVyaW5nXCJcblpvb21lciA9IHJlcXVpcmUgXCIuL2cvem9vbWVyXCJcblxuIyBNViBmcm9tIGJhY2tib25lXG5ib25lVmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS1jaGlsZHNcIilcbkV2ZW50aGFuZGxlciA9IHJlcXVpcmUgXCJiaW9qcy1ldmVudHNcIlxuXG4jIE1TQSB2aWV3c1xuU3RhZ2UgPSByZXF1aXJlIFwiLi92aWV3cy9TdGFnZVwiXG5cbiMgb3B0cyBpcyBhIGRpY3Rpb25hcnkgY29uc2lzdGluZyBvZlxuIyBAcGFyYW0gZWwgW1N0cmluZ10gaWQgb3IgcmVmZXJlbmNlIHRvIGEgRE9NIGVsZW1lbnRcbiMgQHBhcmFtIHNlcXMgW1NlcUFycmF5XSBBcnJheSBvZiBzZXF1ZW5jZXMgZm9yIGluaXRsaXphdGlvblxuIyBAcGFyYW0gY29uZiBbRGljdF0gdXNlciBjb25maWdcbiMgQHBhcmFtIHZpcyBbRGljdF0gY29uZmlnIG9mIHZpc2libGUgdmlld3NcbiMgQHBhcmFtIHpvb21lciBbRGljdF0gZGlzcGxheSBzZXR0aW5ncyBsaWtlIGNvbHVtbldpZHRoXG5tb2R1bGUuZXhwb3J0cyA9IGJvbmVWaWV3LmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuXG4gICAgIyBjaGVjayBmb3IgZGVmYXVsdCBhcnJheXNcbiAgICBkYXRhLmNvbHVtbnMgPSB7fSB1bmxlc3MgZGF0YS5jb2x1bW5zP1xuICAgIGRhdGEuY29uZiA9IHt9IHVubGVzcyBkYXRhLmNvbmY/XG4gICAgZGF0YS52aXMgPSB7fSB1bmxlc3MgZGF0YS52aXM/XG4gICAgZGF0YS52aXNvcmRlciA9IHt9IHVubGVzcyBkYXRhLnZpc29yZGVyID9cbiAgICBkYXRhLnpvb21lciA9IHt9IHVubGVzcyBkYXRhLnpvb21lcj9cblxuICAgICMgZyBpcyBvdXIgZ2xvYmFsIE1lZGlhdG9yXG4gICAgQGcgPSBFdmVudGhhbmRsZXIubWl4aW4ge31cblxuICAgIGlmIGRhdGEuc2VxcyBpcyB1bmRlZmluZWQgb3IgZGF0YS5zZXFzLmxlbmd0aCBpcyAwXG4gICAgICBjb25zb2xlLmxvZyBcIndhcm5pbmcuIGVtcHR5IHNlcXMuXCJcblxuICAgICMgbG9hZCBzZXFzIGFuZCBhZGQgc3Vidmlld3NcbiAgICBAc2VxcyA9IG5ldyBTZXFDb2xsZWN0aW9uIGRhdGEuc2Vxc1xuXG4gICAgIyBwb3B1bGF0ZSBpdCBhbmQgaW5pdCB0aGUgZ2xvYmFsIG1vZGVsc1xuICAgIEBnLmNvbmZpZyA9IG5ldyBDb25maWcgZGF0YS5jb25mXG4gICAgQGcuY29uc2Vuc3VzID0gbmV3IENvbnNlbnN1cygpXG4gICAgQGcuY29sdW1ucyA9IG5ldyBDb2x1bW5zIGRhdGEuY29sdW1ucyAgIyBmb3IgYWN0aW9uIG9uIHRoZSBjb2x1bW5zIGxpa2UgaGlkaW5nXG4gICAgQGcuY29sb3JzY2hlbWUgPSBuZXcgQ29sb3JhdG9yKClcbiAgICBAZy5zZWxjb2wgPSBuZXcgU2VsQ29sIFtdLHtnOkBnfVxuICAgIEBnLnZpcyA9IG5ldyBWaXNpYmlsaXR5IGRhdGEudmlzXG4gICAgQGcudmlzb3JkZXIgPSBuZXcgVmlzT3JkZXJpbmcgZGF0YS52aXNvcmRlclxuICAgIEBnLnpvb21lciA9IG5ldyBab29tZXIgZGF0YS56b29tZXIse2c6QGd9XG5cbiAgICBAYWRkVmlldyBcInN0YWdlXCIsbmV3IFN0YWdlIHttb2RlbDogQHNlcXMsIGc6IEBnfVxuICAgIEBlbC5zZXRBdHRyaWJ1dGUgXCJjbGFzc1wiLCBcImJpb2pzX21zYV9kaXZcIlxuXG4gICAgaWYgQGcuY29uZmlnLmdldChcImV2ZW50QnVzXCIpIGlzIHRydWVcbiAgICAgIEBzdGFydEV2ZW50QnVzKClcblxuICBzdGFydEV2ZW50QnVzOiAtPlxuICAgIGJ1c09ianMgPSBbXCJjb25maWdcIiwgXCJjb25zZW5zdXNcIiwgXCJjb2x1bW5zXCIsIFwiY29sb3JzY2hlbWVcIiwgXCJzZWxjb2xcIlxuICAgICxcInZpc1wiLCBcInZpc29yZGVyXCIsIFwiem9vbWVyXCJdXG4gICAgZm9yIGtleSBpbiBidXNPYmpzXG4gICAgICBAX3Byb3h5VG9HIGtleVxuXG4gIF9wcm94eVRvRzogKGtleSkgLT5cbiAgICBAbGlzdGVuVG8gQGdba2V5XSwgXCJhbGxcIiwobmFtZSxwcmV2LG5vdykgLT5cbiAgICAgICMgc3VwcHJlc3MgZHVwbGljYXRlIGV2ZW50c1xuICAgICAgcmV0dXJuIGlmIG5hbWUgaXMgXCJjaGFuZ2VcIlxuICAgICAgIyBiYWNrYm9uZSB1c2VzIHRoZSBzZWNvbmQgYXJndW1lbnQgZm9yIHRoZSBuZXh0IHZhbHVlIC0+IHN3YXBcbiAgICAgIEBnLnRyaWdnZXIoa2V5ICsgXCI6XCIgKyBuYW1lLG5vdylcblxuICByZW5kZXI6IC0+XG4gICAgQHJlbmRlclN1YnZpZXdzKClcbiAgICBAZy52aXMuc2V0IFwibG9hZGVkXCIsIHRydWVcbiAgICBAXG4iLCJtb2R1bGUuZXhwb3J0cyA9XG4gICMgbWF0aCB1dGlsaXRpZXNcbiAgY2xhc3MgQk1hdGhcbiAgICBAcmFuZG9tSW50OiAobG93ZXIsIHVwcGVyKSAtPlxuICAgICAgIyBDYWxsZWQgd2l0aCBvbmUgYXJndW1lbnRcbiAgICAgIFtsb3dlciwgdXBwZXJdID0gWzAsIGxvd2VyXSAgICAgdW5sZXNzIHVwcGVyP1xuICAgICAgIyBMb3dlciBtdXN0IGJlIGxlc3MgdGhlbiB1cHBlclxuICAgICAgW2xvd2VyLCB1cHBlcl0gPSBbdXBwZXIsIGxvd2VyXSBpZiBsb3dlciA+IHVwcGVyXG4gICAgICAjIExhc3Qgc3RhdGVtZW50IGlzIGEgcmV0dXJuIHZhbHVlXG4gICAgICBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAodXBwZXIgLSBsb3dlciArIDEpICsgbG93ZXIpXG5cbiAgICAjIEByZXR1cm4gW0ludGVnZXJdIHJhbmRvbSBpZFxuICAgIEB1bmlxdWVJZDogKGxlbmd0aCA9IDgpIC0+XG4gICAgICBpZCA9IFwiXCJcbiAgICAgIGlkICs9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyKSB3aGlsZSBpZC5sZW5ndGggPCBsZW5ndGhcbiAgICAgIGlkLnN1YnN0ciAwLCBsZW5ndGhcblxuICAgICMgUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIChpbmNsdXNpdmUpIGFuZCBtYXggKGluY2x1c2l2ZSlcbiAgICBAZ2V0UmFuZG9tSW50OiAobWluLCBtYXgpIC0+XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pblxuIiwibW9kdWxlLmV4cG9ydHMuYm1hdGggPSByZXF1aXJlKFwiLi9ibWF0aFwiKVxubW9kdWxlLmV4cG9ydHMucHJveHkgPSByZXF1aXJlKFwiLi9wcm94eVwiKVxubW9kdWxlLmV4cG9ydHMuc2VxZ2VuID0gcmVxdWlyZShcIi4vc2VxZ2VuXCIpXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHByb3h5ID1cblxuICAgIGNvcnNVUkw6ICh1cmwsIEBnKSA9PlxuICAgICAgIyBkbyBub3QgZmlsdGVyIG9uIGxvY2FsaG9zdFxuICAgICAgcmV0dXJuIHVybCBpZiBkb2N1bWVudC5VUkwuaW5kZXhPZignbG9jYWxob3N0JykgPj0gMCBhbmQgdXJsWzBdIGlzIFwiL1wiXG5cbiAgICAgICMgcmVtb3ZlIHd3dyArIGh0dHBcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlIFwid3d3XFwuXCIsIFwiXCJcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlIFwiaHR0cDovL1wiLCBcIlwiXG5cbiAgICAgICMgcHJlcGVuZCBwcm94eVxuICAgICAgdXJsID0gQGcuY29uZmlnLmdldCgnaW1wb3J0UHJveHknKSArIHVybFxuICAgICAgdXJsXG4iLCJTZXF1ZW5jZSA9IHJlcXVpcmUoXCJiaW9qcy1tb2RlbFwiKS5zZXFcbkJNYXRoID0gcmVxdWlyZSBcIi4vYm1hdGhcIlxuXG5zZXFnZW4gPSBtb2R1bGUuZXhwb3J0cyA9XG4gIF9nZW5lcmF0ZVNlcXVlbmNlOiAobGVuKSAtPlxuICAgIHRleHQgPSBcIlwiXG4gICAgcG9zc2libGUgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIlxuXG4gICAgZm9yIGkgaW4gWzAuLmxlbiAtIDFdIGJ5IDFcbiAgICAgIHRleHQgKz0gcG9zc2libGUuY2hhckF0IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHBvc3NpYmxlLmxlbmd0aClcbiAgICByZXR1cm4gdGV4dFxuXG4gICMgZ2VuZXJhdGVzIGEgZHVtbXkgc2VxdWVuY2VzXG4gICMgQHBhcmFtIGxlbiBbaW50XSBudW1iZXIgb2YgZ2VuZXJhdGVkIHNlcXVlbmNlc1xuICAjIEBwYXJhbSBzZXFMZW4gW2ludF0gbGVuZ3RoIG9mIHRoZSBnZW5lcmF0ZWQgc2VxdWVuY2VzXG4gIGdldER1bW15U2VxdWVuY2VzOiAobGVuLCBzZXFMZW4pIC0+XG4gICAgc2VxcyA9IFtdXG4gICAgbGVuID0gQk1hdGguZ2V0UmFuZG9tSW50IDMsNSB1bmxlc3MgbGVuP1xuICAgIHNlcUxlbiA9IEJNYXRoLmdldFJhbmRvbUludCA1MCwyMDAgdW5sZXNzIHNlcUxlbj9cblxuICAgIGZvciBpIGluIFsxLi5sZW5dIGJ5IDFcbiAgICAgIHNlcXMucHVzaCBuZXcgU2VxdWVuY2Uoc2VxZ2VuLl9nZW5lcmF0ZVNlcXVlbmNlKHNlcUxlbiksIFwic2VxXCIgKyBpLFxuICAgICAgXCJyXCIgKyBpKVxuICAgIHJldHVybiBzZXFzXG4iLCIjIG1pbmkgc3ZnIGhlbHBlclxuXG5zdmducyA9IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuXG5zZXRBdHRyID0gKG9iaixvcHRzKSAtPlxuICBmb3IgbmFtZSwgdmFsdWUgb2Ygb3B0c1xuICAgIG9iai5zZXRBdHRyaWJ1dGVOUyBudWxsLCBuYW1lLCB2YWx1ZVxuICBvYmpcblxuQmFzZSA9IChvcHRzKSAtPlxuICBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgc3ZnbnMsICdzdmcnXG4gIHN2Zy5zZXRBdHRyaWJ1dGUgXCJ3aWR0aFwiLCBvcHRzLndpZHRoXG4gIHN2Zy5zZXRBdHRyaWJ1dGUgXCJoZWlnaHRcIiwgb3B0cy5oZWlnaHRcbiAgc3ZnXG5cblJlY3QgPSAob3B0cykgLT5cbiAgcmVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyBzdmducywgJ3JlY3QnXG4gIHNldEF0dHIgcmVjdCxvcHRzXG5cbkxpbmUgPSAob3B0cykgLT5cbiAgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyBzdmducywgJ2xpbmUnXG4gIHNldEF0dHIgbGluZSxvcHRzXG5cblBvbHlnb24gPSAob3B0cykgLT5cbiAgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyBzdmducywgJ3BvbHlnb24nXG4gIHNldEF0dHIgbGluZSxvcHRzXG5cbm1vZHVsZS5leHBvcnRzLnJlY3QgPSBSZWN0XG5tb2R1bGUuZXhwb3J0cy5saW5lID0gTGluZVxubW9kdWxlLmV4cG9ydHMucG9seWdvbiA9IFBvbHlnb25cbm1vZHVsZS5leHBvcnRzLmJhc2UgPSBCYXNlXG4iLCJib25lVmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS1jaGlsZHNcIilcblNlcUJsb2NrID0gcmVxdWlyZSBcIi4vQ2FudmFzU2VxQmxvY2tcIlxuTGFiZWxCbG9jayA9IHJlcXVpcmUgXCIuL2xhYmVscy9MYWJlbEJsb2NrXCJcblxubW9kdWxlLmV4cG9ydHMgPSBib25lVmlldy5leHRlbmRcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAZyA9IGRhdGEuZ1xuXG4gICAgaWYgdHJ1ZVxuICAgICAgbGFiZWxibG9jayA9IG5ldyBMYWJlbEJsb2NrIHttb2RlbDogQG1vZGVsLCBnOiBAZ31cbiAgICAgIGxhYmVsYmxvY2sub3JkZXJpbmcgPSAtMVxuICAgICAgQGFkZFZpZXcgXCJsYWJlbGJsb2NrXCIsbGFiZWxibG9ja1xuXG4gICAgaWYgQGcudmlzLmdldCBcInNlcXVlbmNlc1wiXG4gICAgICBzZXFibG9jayA9IG5ldyBTZXFCbG9jayB7bW9kZWw6IEBtb2RlbCwgZzogQGd9XG4gICAgICBzZXFibG9jay5vcmRlcmluZyA9IDBcbiAgICAgIEBhZGRWaWV3IFwic2VxYmxvY2tcIixzZXFibG9ja1xuXG4gICAgQGxpc3RlblRvIEBnLnpvb21lciwgXCJjaGFuZ2U6YWxpZ25tZW50SGVpZ2h0XCIsIEBhZGp1c3RIZWlnaHRcbiAgICBAbGlzdGVuVG8gQGcuY29sdW1ucywgXCJjaGFuZ2U6aGlkZGVuXCIsIEBhZGp1c3RIZWlnaHRcblxuICByZW5kZXI6IC0+XG4gICAgQHJlbmRlclN1YnZpZXdzKClcbiAgICBAZWwuY2xhc3NOYW1lID0gXCJiaW9qc19tc2FfYWxib2R5XCJcbiAgICBAZWwuc3R5bGUud2hpdGVTcGFjZSA9IFwibm93cmFwXCJcbiAgICBAYWRqdXN0SGVpZ2h0KClcbiAgICBAXG5cbiAgYWRqdXN0SGVpZ2h0OiAtPlxuICAgIGlmIEBnLnpvb21lci5nZXQoXCJhbGlnbm1lbnRIZWlnaHRcIikgaXMgXCJhdXRvXCJcbiAgICAgICMgVE9ETzogZml4IHRoZSBtYWdpYyA1XG4gICAgICBAZWwuc3R5bGUuaGVpZ2h0ID0gKEBnLnpvb21lci5nZXQoXCJyb3dIZWlnaHRcIikgKiBAbW9kZWwubGVuZ3RoKSArIDVcbiAgICBlbHNlXG4gICAgICBAZWwuc3R5bGUuaGVpZ2h0ID0gQGcuem9vbWVyLmdldCBcImFsaWdubWVudEhlaWdodFwiXG5cbiAgICAjIFRPRE86IDE1IGlzIHRoZSB3aWR0aCBvZiB0aGUgc2Nyb2xsYmFyXG4gICAgQGVsLnN0eWxlLndpZHRoID0gQGdldFdpZHRoKCkgKyAxNVxuXG4gIGdldFdpZHRoOiAtPlxuICAgIHdpZHRoID0gMFxuICAgIGlmIEBnLnZpcy5nZXQgXCJsYWJlbHNcIlxuICAgICAgd2lkdGggKz0gQGcuem9vbWVyLmdldCBcImxhYmVsV2lkdGhcIlxuICAgIGlmIEBnLnZpcy5nZXQgXCJtZXRhY2VsbFwiXG4gICAgICB3aWR0aCArPSBAZy56b29tZXIuZ2V0IFwibWV0YVdpZHRoXCJcbiAgICBpZiBAZy52aXMuZ2V0IFwic2VxdWVuY2VzXCJcbiAgICAgIHdpZHRoICs9IEBnLnpvb21lci5nZXQgXCJhbGlnbm1lbnRXaWR0aFwiXG4gICAgd2lkdGhcbiIsIkV2ZW50cyA9IHJlcXVpcmUoXCJiaW9qcy1ldmVudHNcIilcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBDYW52YXNDaGFyQ2FjaGVcblxuICBjb25zdHJ1Y3RvcjogKEBnKSAtPlxuICAgIEBjYWNoZSA9IHt9XG4gICAgQGNhY2hlSGVpZ2h0ID0gMFxuICAgIEBjYWNoZVdpZHRoID0gMFxuXG4gICMgcmV0dXJucyBhIGNhY2hlZCBjYW52YXNcbiAgZ2V0Rm9udFRpbGU6IChsZXR0ZXIsIHdpZHRoLCBoZWlnaHQpIC0+XG4gICAgIyB2YWxpZGF0ZSBjYWNoZVxuICAgIGlmIHdpZHRoIGlzbnQgQGNhY2hlV2lkdGggb3IgaGVpZ2h0IGlzbnQgQGNhY2hlSGVpZ2h0XG4gICAgICBAY2FjaGVIZWlnaHQgPSBoZWlnaHRcbiAgICAgIEBjYWNoZVdpZHRoID0gd2lkdGhcbiAgICAgIEBjYWNoZSA9IHt9XG5cbiAgICBpZiBAY2FjaGVbbGV0dGVyXSBpcyB1bmRlZmluZWRcbiAgICAgIEBjcmVhdGVUaWxlIGxldHRlciwgd2lkdGgsIGhlaWdodFxuXG4gICAgcmV0dXJuIEBjYWNoZVtsZXR0ZXJdXG5cbiAgIyBjcmVhdGVzIGEgY2FudmFzIHdpdGggYSBzaW5nbGUgbGV0dGVyXG4gICMgKGZvciB0aGUgZmFzdCBmb250IGNhY2hlKVxuICBjcmVhdGVUaWxlOiAobGV0dGVyLCB3aWR0aCwgaGVpZ2h0KSAtPlxuXG4gICAgY2FudmFzID0gQGNhY2hlW2xldHRlcl0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwiY2FudmFzXCJcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aFxuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHRcbiAgICBAY3R4ID0gY2FudmFzLmdldENvbnRleHQgJzJkJ1xuICAgIEBjdHguZm9udCA9IEBnLnpvb21lci5nZXQgXCJyZXNpZHVlRm9udFwiXG4gICAgQGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJ1xuICAgIEBjdHgudGV4dEFsaWduID0gXCJjZW50ZXJcIlxuXG4gICAgQGN0eC5maWxsVGV4dCBsZXR0ZXIsd2lkdGggLyAyLGhlaWdodCAvIDIsd2lkdGhcbiIsImJvbmVWaWV3ID0gcmVxdWlyZShcImJhY2tib25lLWNoaWxkc1wiKVxubW91c2UgPSByZXF1aXJlIFwibW91c2UtcG9zXCJcbmNvbG9yU2VsZWN0b3IgPSByZXF1aXJlKFwiYmlvanMtdXRpbC1jb2xvcnNjaGVtZXNcIikuc2VsZWN0b3Jcbl8gPSByZXF1aXJlIFwidW5kZXJzY29yZVwiXG5qYm9uZSA9IHJlcXVpcmUgXCJqYm9uZVwiXG5DaGFyQ2FjaGUgPSByZXF1aXJlIFwiLi9DYW52YXNDaGFyQ2FjaGVcIlxuXG5tb2R1bGUuZXhwb3J0cyA9IGJvbmVWaWV3LmV4dGVuZFxuXG4gIHRhZ05hbWU6IFwiY2FudmFzXCJcblxuICBpbml0aWFsaXplOiAoZGF0YSkgLT5cbiAgICBAZyA9IGRhdGEuZ1xuXG4gICAgQGxpc3RlblRvIEBnLnpvb21lciwgXCJjaGFuZ2U6X2FsaWdubWVudFNjcm9sbExlZnQgY2hhbmdlOl9hbGlnbm1lbnRTY3JvbGxUb3BcIiwgKG1vZGVsLHZhbHVlLCBvcHRpb25zKSAtPlxuICAgICAgaWYgKG5vdCBvcHRpb25zPy5vcmlnaW4/KSBvciBvcHRpb25zLm9yaWdpbiBpc250IFwiY2FudmFzc2VxXCJcbiAgICAgICAgQHJlbmRlcigpXG5cbiAgICBAbGlzdGVuVG8gQGcuY29sdW1ucyxcImNoYW5nZTpoaWRkZW5cIiwgQHJlbmRlclxuICAgIEBsaXN0ZW5UbyBAZy56b29tZXIsXCJjaGFuZ2U6YWxpZ25tZW50V2lkdGhcIiwgQHJlbmRlclxuICAgIEBsaXN0ZW5UbyBAZy5jb2xvcnNjaGVtZSwgXCJjaGFuZ2VcIiwgQHJlbmRlclxuICAgIEBsaXN0ZW5UbyBAZy5zZWxjb2wsIFwicmVzZXQgYWRkXCIsIEByZW5kZXJcblxuICAgICMgZWwgcHJvcHNcbiAgICBAZWwuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCJcbiAgICBAZWwuc3R5bGUub3ZlcmZsb3dYID0gXCJoaWRkZW5cIlxuICAgIEBlbC5zdHlsZS5vdmVyZmxvd1kgPSBcImhpZGRlblwiXG4gICAgQGVsLmNsYXNzTmFtZSA9IFwiYmlvanNfbXNhX3NlcWJsb2NrXCJcblxuICAgIEBjdHggPSBAZWwuZ2V0Q29udGV4dCAnMmQnXG4gICAgQGNhY2hlID0gbmV3IENoYXJDYWNoZSBAZ1xuXG4gICAgIyB0aHJvdHRsZSB0aGUgZXhwZW5zaXZlIGRyYXcgZnVuY3Rpb25cbiAgICBAdGhyb3R0bGVUaW1lID0gMFxuICAgIEB0aHJvdHRsZUNvdW50cyA9IDBcbiAgICBpZiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2Via2l0QXBwZWFyYW5jZT9cbiAgICAgICMgd2Via2l0IGJyb3dzZXIgLSBubyB0aHJvdHRsaW5nIG5lZWRlZFxuICAgICAgQHRocm90dGxlZERyYXcgPSAtPlxuICAgICAgICBzdGFydCA9ICtuZXcgRGF0ZSgpXG4gICAgICAgIEBkcmF3KClcbiAgICAgICAgQHRocm90dGxlVGltZSArPSArbmV3IERhdGUoKSAtIHN0YXJ0XG4gICAgICAgIEB0aHJvdHRsZUNvdW50cysrXG4gICAgICAgIGlmIEB0aHJvdHRsZUNvdW50cyA+IDE1XG4gICAgICAgICAgdFRpbWUgPSBNYXRoLmNlaWwoQHRocm90dGxlVGltZSAvIEB0aHJvdHRsZUNvdW50cylcbiAgICAgICAgICBjb25zb2xlLmxvZyBcImF2Z0RyYXdUaW1lL1dlYktpdFwiLCB0VGltZVxuICAgICAgICAgICMgcmVtb3ZlIHBlcmYgYW5hbHlzZXJcbiAgICAgICAgICBAdGhyb3R0bGVkRHJhdyA9IEBkcmF3XG4gICAgZWxzZVxuICAgICAgIyBzbG93IGJyb3dzZXJzIGxpa2UgR2Vja29cbiAgICAgIEB0aHJvdHRsZWREcmF3ID0gXy50aHJvdHRsZSBAdGhyb3R0bGVkRHJhdywgMzBcblxuICAgIEBtYW5hZ2VFdmVudHMoKVxuXG4gICMgbWVhc3VyZXMgdGhlIHRpbWUgb2YgYSByZWRyYXcgYW5kIHRodXMgc2V0IHRoZSB0aHJvdHRsZSBsaW1pdFxuICB0aHJvdHRsZWREcmF3OiAtPlxuICAgICMgK25ldyBpcyB0aGUgZmFzdGVzdDogaHR0cDovL2pzcGVyZi5jb20vbmV3LWRhdGUtdnMtZGF0ZS1ub3ctdnMtcGVyZm9ybWFuY2Utbm93LzZcbiAgICBzdGFydCA9ICtuZXcgRGF0ZSgpXG4gICAgQGRyYXcoKVxuICAgIEB0aHJvdHRsZVRpbWUgKz0gK25ldyBEYXRlKCkgLSBzdGFydFxuICAgIEB0aHJvdHRsZUNvdW50cysrXG5cbiAgICAjIHJlbW92ZSBpdHNlbGYgYWZ0ZXIgYW5hbHlzaXNcbiAgICBpZiBAdGhyb3R0bGVDb3VudHMgPiAxNVxuICAgICAgdFRpbWUgPSBNYXRoLmNlaWwoQHRocm90dGxlVGltZSAvIEB0aHJvdHRsZUNvdW50cylcbiAgICAgIGNvbnNvbGUubG9nIFwiYXZnRHJhd1RpbWVcIiwgdFRpbWVcbiAgICAgIHRUaW1lICo9ICAxLjIgIyBhZGQgc2FmZXR5IHRpbWVcbiAgICAgIHRUaW1lID0gTWF0aC5tYXggMjAsIHRUaW1lICMgbGltaXQgZm9yIHVsdHJhIGZhc3QgY29tcHV0ZXJzXG4gICAgICBAdGhyb3R0bGVkRHJhdyA9IF8udGhyb3R0bGUgQGRyYXcsIHRUaW1lXG5cbiAgbWFuYWdlRXZlbnRzOiAtPlxuICAgIGV2ZW50cyA9IHt9XG4gICAgZXZlbnRzLm1vdXNlZG93biA9IFwiX29ubW91c2Vkb3duXCJcbiAgICBldmVudHMudG91Y2hzdGFydCA9IFwiX29udG91Y2hzdGFydFwiXG5cbiAgICBpZiBAZy5jb25maWcuZ2V0IFwicmVnaXN0ZXJNb3VzZUNsaWNrc1wiXG4gICAgICBldmVudHMuZGJsY2xpY2sgPSBcIl9vbmNsaWNrXCJcbiAgICBpZiBAZy5jb25maWcuZ2V0IFwicmVnaXN0ZXJNb3VzZUhvdmVyXCJcbiAgICAgIGV2ZW50cy5tb3VzZWluID0gXCJfb25tb3VzZWluXCJcbiAgICAgIGV2ZW50cy5tb3VzZW91dCA9IFwiX29ubW91c2VvdXRcIlxuXG4gICAgZXZlbnRzLm1vdXNld2hlZWwgPSBcIl9vbm1vdXNld2hlZWxcIlxuICAgIGV2ZW50cy5ET01Nb3VzZVNjcm9sbCA9IFwiX29ubW91c2V3aGVlbFwiXG4gICAgQGRlbGVnYXRlRXZlbnRzIGV2ZW50c1xuXG4gICAgIyBsaXN0ZW4gZm9yIGNoYW5nZXNcbiAgICBAbGlzdGVuVG8gQGcuY29uZmlnLCBcImNoYW5nZTpyZWdpc3Rlck1vdXNlSG92ZXJcIiwgQG1hbmFnZUV2ZW50c1xuICAgIEBsaXN0ZW5UbyBAZy5jb25maWcsIFwiY2hhbmdlOnJlZ2lzdGVyTW91c2VDbGlja1wiLCBAbWFuYWdlRXZlbnRzXG4gICAgQGRyYWdTdGFydCA9IFtdXG5cbiAgZHJhdzogLT5cblxuICAgICMgZmFzdGVzdCB3YXkgdG8gY2xlYXIgdGhlIGNhbnZhc1xuICAgICMgaHR0cDovL2pzcGVyZi5jb20vY2FudmFzLWNsZWFyLXNwZWVkLzI1XG4gICAgQGVsLndpZHRoID0gQGVsLndpZHRoXG5cbiAgICByZWN0SGVpZ2h0ID0gQGcuem9vbWVyLmdldCBcInJvd0hlaWdodFwiXG5cbiAgICAjIHJlY3RzXG4gICAgQGN0eC5nbG9iYWxBbHBoYSA9IEBnLmNvbG9yc2NoZW1lLmdldCBcIm9wYWNpdHlcIlxuICAgIEBkcmF3U2VxcyAoZGF0YSkgLT4gQGRyYXdTZXEoZGF0YSwgQF9kcmF3UmVjdClcbiAgICBAY3R4Lmdsb2JhbEFscGhhID0gMVxuXG4gICAgIyBsZXR0ZXJzXG4gICAgQGRyYXdTZXFzIChkYXRhKSAtPiBAZHJhd1NlcShkYXRhLCBAX2RyYXdMZXR0ZXIpXG5cbiAgICAjIGZlYXR1cmVzLCBzZWxlY3Rpb25cbiAgICBAZHJhd1NlcXMgQGRyYXdTZXFFeHRlbmRlZFxuXG4gIGRyYXdTZXFzOiAoY2FsbGJhY2spIC0+XG4gICAgcmVjdEhlaWdodCA9IEBnLnpvb21lci5nZXQgXCJyb3dIZWlnaHRcIlxuICAgIGhpZGRlbiA9IEBnLmNvbHVtbnMuZ2V0IFwiaGlkZGVuXCJcblxuICAgIHN0YXJ0ID0gTWF0aC5tYXggMCwgTWF0aC5hYnMoTWF0aC5jZWlsKCAtIEBnLnpvb21lci5nZXQoJ19hbGlnbm1lbnRTY3JvbGxUb3AnKSAvIHJlY3RIZWlnaHQpKVxuICAgIHkgPSAtIE1hdGguYWJzKCAtIEBnLnpvb21lci5nZXQoJ19hbGlnbm1lbnRTY3JvbGxUb3AnKSAlIHJlY3RIZWlnaHQpXG4gICAgZm9yIGkgaW4gW3N0YXJ0Li4gQG1vZGVsLmxlbmd0aCAtIDFdIGJ5IDFcbiAgICAgIGNvbnRpbnVlIGlmIEBtb2RlbC5hdChpKS5nZXQoJ2hpZGRlbicpXG4gICAgICBjYWxsYmFjay5jYWxsIEAsIHttb2RlbDogQG1vZGVsLmF0KGkpLCB5OiB5LCBoaWRkZW46IGhpZGRlbn1cbiAgICAgIHkgPSB5ICsgcmVjdEhlaWdodFxuICAgICAgIyBvdXQgb2Ygdmlld3BvcnQgLSBzdG9wXG4gICAgICBpZiB5ID4gQGVsLmhlaWdodFxuICAgICAgICBicmVha1xuXG4gICMgVE9ETzogdmVyeSBleHBlbnNpdmUgbWV0aG9kXG4gIGRyYXdTZXE6IChkYXRhLCBjYWxsYmFjaykgLT5cbiAgICBzZXEgPSBkYXRhLm1vZGVsLmdldCBcInNlcVwiXG4gICAgeSA9IGRhdGEueVxuICAgIHJlY3RXaWR0aCA9IEBnLnpvb21lci5nZXQgXCJjb2x1bW5XaWR0aFwiXG4gICAgcmVjdEhlaWdodCA9IEBnLnpvb21lci5nZXQgXCJyb3dIZWlnaHRcIlxuXG4gICAgIyBza2lwIHVubmVlZGVkIGJsb2NrcyBhdCB0aGUgYmVnaW5uaW5nXG4gICAgc3RhcnQgPSBNYXRoLm1heCAwLCBNYXRoLmFicyhNYXRoLmNlaWwoIC0gQGcuem9vbWVyLmdldCgnX2FsaWdubWVudFNjcm9sbExlZnQnKSAvIHJlY3RXaWR0aCkpXG4gICAgeCA9IC0gTWF0aC5hYnMoIC0gQGcuem9vbWVyLmdldCgnX2FsaWdubWVudFNjcm9sbExlZnQnKSAlIHJlY3RXaWR0aClcblxuICAgIHJlcyA9IHtyZWN0V2lkdGg6IHJlY3RXaWR0aCwgcmVjdEhlaWdodDogcmVjdEhlaWdodCwgeTogeX1cbiAgICBlbFdpZHRoID0gQGVsLndpZHRoXG5cbiAgICBmb3IgaiBpbiBbc3RhcnQuLiBzZXEubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgYyA9IHNlcVtqXVxuICAgICAgYyA9IGMudG9VcHBlckNhc2UoKVxuXG4gICAgICAjIGNhbGwgdGhlIGN1c3RvbSBmdW5jdGlvblxuICAgICAgcmVzLnggPSB4XG4gICAgICByZXMuYyA9IGNcblxuICAgICAgIyBsb2NhbCBjYWxsIGlzIGZhc3RlciB0aGFuIGFwcGx5XG4gICAgICAjIGh0dHA6Ly9qc3BlcmYuY29tL2Z1bmN0aW9uLWNhbGxzLWRpcmVjdC12cy1hcHBseS12cy1jYWxsLXZzLWJpbmQvNlxuICAgICAgaWYgZGF0YS5oaWRkZW4uaW5kZXhPZihqKSA8IDBcbiAgICAgICAgY2FsbGJhY2sgQCxyZXNcbiAgICAgIGVsc2VcbiAgICAgICAgY29udGludWVcblxuICAgICAgIyBtb3ZlIHRvIHRoZSByaWdodFxuICAgICAgeCA9IHggKyByZWN0V2lkdGhcblxuICAgICAgIyBvdXQgb2Ygdmlld3BvcnQgLSBzdG9wXG4gICAgICBpZiB4ID4gZWxXaWR0aFxuICAgICAgICBicmVha1xuXG4gIF9kcmF3UmVjdDogKHRoYXQsIGRhdGEpIC0+XG4gICAgY29sb3IgPSB0aGF0LmNvbG9yW2RhdGEuY11cbiAgICBpZiBjb2xvcj9cbiAgICAgIHRoYXQuY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG4gICAgICB0aGF0LmN0eC5maWxsUmVjdCBkYXRhLngsZGF0YS55LGRhdGEucmVjdFdpZHRoLGRhdGEucmVjdEhlaWdodFxuXG4gICMgUkVBTExZIGV4cGVuc2l2ZSBjYWxsIG9uIEZGXG4gICMgUGVyZm9ybWFuY2U6XG4gICMgY2hyb21lOiAyMDAwbXMgZHJhd0xldHRlciAtIDEwMDBtcyBkcmF3UmVjdFxuICAjIEZGOiAxNzAwbXMgZHJhd0xldHRlciAtIDMwMG1zIGRyYXdSZWN0XG4gIF9kcmF3TGV0dGVyOiAodGhhdCxkYXRhKSAtPlxuICAgIHRoYXQuY3R4LmRyYXdJbWFnZSB0aGF0LmNhY2hlLmdldEZvbnRUaWxlKGRhdGEuYywgZGF0YS5yZWN0V2lkdGgsXG4gICAgICBkYXRhLnJlY3RIZWlnaHQpLCBkYXRhLngsIGRhdGEueSxkYXRhLnJlY3RXaWR0aCxkYXRhLnJlY3RIZWlnaHRcblxuICBkcmF3U2VxRXh0ZW5kZWQ6IChkYXRhKSAtPlxuICAgIHNlcSA9IGRhdGEubW9kZWwuZ2V0IFwic2VxXCJcbiAgICByZWN0V2lkdGggPSBAZy56b29tZXIuZ2V0IFwiY29sdW1uV2lkdGhcIlxuICAgIHJlY3RIZWlnaHQgPSBAZy56b29tZXIuZ2V0IFwicm93SGVpZ2h0XCJcblxuICAgIHN0YXJ0ID0gTWF0aC5tYXggMCwgTWF0aC5hYnMoTWF0aC5jZWlsKCAtIEBnLnpvb21lci5nZXQoJ19hbGlnbm1lbnRTY3JvbGxMZWZ0JykgLyByZWN0V2lkdGgpKVxuICAgIHggPSAtIE1hdGguYWJzKCAtIEBnLnpvb21lci5nZXQoJ19hbGlnbm1lbnRTY3JvbGxMZWZ0JykgJSByZWN0V2lkdGgpXG4gICAgeFplcm8gPSB4IC0gc3RhcnQgKiByZWN0V2lkdGhcblxuICAgIHNlbGVjdGlvbiA9IEBfZ2V0U2VsZWN0aW9uIGRhdGEubW9kZWxcbiAgICBbbVByZXZTZWwsbU5leHRTZWxdID0gQF9nZXRQcmV2TmV4dFNlbGVjdGlvbiBkYXRhLm1vZGVsXG4gICAgZmVhdHVyZXMgPSBkYXRhLm1vZGVsLmdldCBcImZlYXR1cmVzXCJcblxuICAgIHlaZXJvID0gZGF0YS55XG5cbiAgICBmb3IgaiBpbiBbc3RhcnQuLiBzZXEubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgc3RhcnRzID0gZmVhdHVyZXMuc3RhcnRPbiBqXG5cbiAgICAgIGlmIGRhdGEuaGlkZGVuLmluZGV4T2YoaikgPj0gMFxuICAgICAgICBjb250aW51ZVxuXG4gICAgICBpZiBzdGFydHMubGVuZ3RoID4gMFxuICAgICAgICBmb3IgZiBpbiBzdGFydHNcbiAgICAgICAgICBAYXBwZW5kRmVhdHVyZSBmOiBmLHhaZXJvOiB4LCB5WmVybzogeVplcm9cblxuICAgICAgeCA9IHggKyByZWN0V2lkdGhcbiAgICAgICMgb3V0IG9mIHZpZXdwb3J0IC0gc3RvcFxuICAgICAgaWYgeCA+IEBlbC53aWR0aFxuICAgICAgICBicmVha1xuXG4gICAgQF9hcHBlbmRTZWxlY3Rpb24gbW9kZWw6IGRhdGEubW9kZWwsIHhaZXJvOiB4WmVybywgeVplcm86IHlaZXJvLCBoaWRkZW46XG4gICAgICBkYXRhLmhpZGRlblxuXG4gIHJlbmRlcjogLT5cblxuICAgIEBlbC5zZXRBdHRyaWJ1dGUgJ2hlaWdodCcsIEBnLnpvb21lci5nZXQgXCJhbGlnbm1lbnRIZWlnaHRcIlxuICAgIEBlbC5zZXRBdHRyaWJ1dGUgJ3dpZHRoJywgQGcuem9vbWVyLmdldCBcImFsaWdubWVudFdpZHRoXCJcblxuICAgIEBnLnpvb21lci5fYWRqdXN0V2lkdGggQGVsLCBAbW9kZWxcbiAgICBAZy56b29tZXIuX2NoZWNrU2Nyb2xsaW5nKCBAX2NoZWNrU2Nyb2xsaW5nKFtAZy56b29tZXIuZ2V0KCdfYWxpZ25tZW50U2Nyb2xsTGVmdCcpLFxuICAgIEBnLnpvb21lci5nZXQoJ19hbGlnbm1lbnRTY3JvbGxUb3AnKV0gKSx7aGVhZGVyOiBcImNhbnZhc3NlcVwifSlcblxuICAgIEBjb2xvciA9IGNvbG9yU2VsZWN0b3IuZ2V0Q29sb3IgQGcuY29sb3JzY2hlbWUuZ2V0KFwic2NoZW1lXCIpXG5cbiAgICBAdGhyb3R0bGVkRHJhdygpXG4gICAgQFxuXG4gIF9vbm1vdXNlbW92ZTogKGUsIHJldmVyc2VkKSAtPlxuICAgIHJldHVybiBpZiBAZHJhZ1N0YXJ0Lmxlbmd0aCBpcyAwXG5cbiAgICBkcmFnRW5kID0gbW91c2UuYWJzIGVcbiAgICAjIHJlbGF0aXZlIHRvIGZpcnN0IGNsaWNrXG4gICAgcmVsRW5kID0gW2RyYWdFbmRbMF0gLSBAZHJhZ1N0YXJ0WzBdLCBkcmFnRW5kWzFdIC0gQGRyYWdTdGFydFsxXV1cbiAgICAjIHJlbGF0aXZlIHRvIGluaXRpYWwgc2Nyb2xsIHN0YXR1c1xuXG4gICAgIyBzY2FsZSBldmVudHNcbiAgICBzY2FsZUZhY3RvciA9IEBnLnpvb21lci5nZXQgXCJjYW52YXNFdmVudFNjYWxlXCJcbiAgICBpZiByZXZlcnNlZFxuICAgICAgc2NhbGVGYWN0b3IgPSAzXG4gICAgZm9yIGkgaW4gWzAuLjFdIGJ5IDFcbiAgICAgIHJlbEVuZFtpXSA9IHJlbEVuZFtpXSAqIHNjYWxlRmFjdG9yXG5cbiAgICAjIGNhbGN1bGF0ZSBuZXcgc2Nyb2xsaW5nIHZhbHNcbiAgICByZWxEaXN0ID0gW0BkcmFnU3RhcnRTY3JvbGxbMF0gLSByZWxFbmRbMF0sIEBkcmFnU3RhcnRTY3JvbGxbMV0gLSByZWxFbmRbMV1dXG5cbiAgICAjIHJvdW5kIHZhbHVlc1xuICAgIGZvciBpIGluIFswLi4xXSBieSAxXG4gICAgICByZWxEaXN0W2ldID0gTWF0aC5yb3VuZCByZWxEaXN0W2ldXG5cbiAgICAjIHVwZGF0ZSBzY3JvbGxiYXJcbiAgICBzY3JvbGxDb3JyZWN0ZWQgPSBAX2NoZWNrU2Nyb2xsaW5nKCByZWxEaXN0KVxuICAgIEBnLnpvb21lci5fY2hlY2tTY3JvbGxpbmcgc2Nyb2xsQ29ycmVjdGVkLCB7b3JpZ2luOiBcImNhbnZhc3NlcVwifVxuXG4gICAgIyByZXNldCBzdGFydCBpZiB1c2Ugc2Nyb2xscyBvdXQgb2YgYm91bmRzXG4gICAgZm9yIGkgaW4gWzAuLjFdIGJ5IDFcbiAgICAgIGlmIHNjcm9sbENvcnJlY3RlZFtpXSBpc250IHJlbERpc3RbaV1cbiAgICAgICAgaWYgc2Nyb2xsQ29ycmVjdGVkW2ldIGlzIDBcbiAgICAgICAgICAjIHJlc2V0IG9mIGxlZnQsIHRvcFxuICAgICAgICAgIEBkcmFnU3RhcnRbaV0gPSBkcmFnRW5kW2ldXG4gICAgICAgICAgQGRyYWdTdGFydFNjcm9sbFtpXSA9IDBcbiAgICAgICAgZWxzZVxuICAgICAgICAgICMgcmVjYWxpYnJhdGUgb24gcmlnaHQsIGJvdHRvbVxuICAgICAgICAgIEBkcmFnU3RhcnRbaV0gPSBkcmFnRW5kW2ldIC0gc2Nyb2xsQ29ycmVjdGVkW2ldXG5cbiAgICBAdGhyb3R0bGVkRHJhdygpXG5cbiAgICAjIGFib3J0IHNlbGVjdGlvbiBldmVudHMgb2YgdGhlIGJyb3dzZXIgKG1vdXNlIG9ubHkpXG4gICAgaWYgZS5wcmV2ZW50RGVmYXVsdD9cbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuXG4gICMgY29udmVydHMgdG91Y2hlcyBpbnRvIG9sZCBtb3VzZSBldmVudFxuICBfb250b3VjaG1vdmU6IChlKSAtPlxuICAgIEBfb25tb3VzZW1vdmUgZS5jaGFuZ2VkVG91Y2hlc1swXSwgdHJ1ZVxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcblxuICAjIHN0YXJ0IHRoZSBkcmFnZ2luZyBtb2RlXG4gIF9vbm1vdXNlZG93bjogKGUpIC0+XG4gICAgQGRyYWdTdGFydCA9IG1vdXNlLmFicyBlXG4gICAgQGRyYWdTdGFydFNjcm9sbCA9IFtAZy56b29tZXIuZ2V0KCdfYWxpZ25tZW50U2Nyb2xsTGVmdCcpLCBAZy56b29tZXIuZ2V0KCdfYWxpZ25tZW50U2Nyb2xsVG9wJyldXG4gICAgamJvbmUoZG9jdW1lbnQuYm9keSkub24gJ21vdXNlbW92ZS5vdmVybW92ZScsIChlKSA9PiBAX29ubW91c2Vtb3ZlKGUpXG4gICAgamJvbmUoZG9jdW1lbnQuYm9keSkub24gJ21vdXNldXAub3ZlcnVwJywgPT4gQF9jbGVhbnVwKClcbiAgICAjamJvbmUoZG9jdW1lbnQuYm9keSkub24gJ21vdXNlb3V0Lm92ZXJvdXQnLCAoZSkgPT4gQF9vbm1vdXNld2lub3V0KGUpXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgIyBzdGFydHMgdGhlIHRvdWNoIG1vZGVcbiAgX29udG91Y2hzdGFydDogKGUpIC0+XG4gICAgQGRyYWdTdGFydCA9IG1vdXNlLmFicyBlLmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgQGRyYWdTdGFydFNjcm9sbCA9IFtAZy56b29tZXIuZ2V0KCdfYWxpZ25tZW50U2Nyb2xsTGVmdCcpLCBAZy56b29tZXIuZ2V0KCdfYWxpZ25tZW50U2Nyb2xsVG9wJyldXG4gICAgamJvbmUoZG9jdW1lbnQuYm9keSkub24gJ3RvdWNobW92ZS5vdmVydG1vdmUnLCAoZSkgPT4gQF9vbnRvdWNobW92ZShlKVxuICAgIGpib25lKGRvY3VtZW50LmJvZHkpLm9uICd0b3VjaGVuZC5vdmVydGVuZCB0b3VjaGxlYXZlLm92ZXJ0bGVhdmVcbiAgICB0b3VjaGNhbmNlbC5vdmVydGNhbmVsJywgKGUpID0+IEBfdG91Y2hDbGVhbnVwKGUpXG5cbiAgIyBjaGVja3Mgd2hldGhlciBtb3VzZSBtb3ZlZCBvdXQgb2YgdGhlIHdpbmRvd1xuICAjIC0+IHRlcm1pbmF0ZSBkcmFnZ2luZ1xuICBfb25tb3VzZXdpbm91dDogKGUpIC0+XG4gICAgaWYgZS50b0VsZW1lbnQgaXMgZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlXG4gICAgICBAX2NsZWFudXAoKVxuXG4gICMgdGVybWluYXRlcyBkcmFnZ2luZ1xuICBfY2xlYW51cDogLT5cbiAgICBAZHJhZ1N0YXJ0ID0gW11cbiAgICAjIHJlbW92ZSBhbGwgbGlzdGVuZXJzXG4gICAgamJvbmUoZG9jdW1lbnQuYm9keSkub2ZmKCcub3Zlcm1vdmUnKVxuICAgIGpib25lKGRvY3VtZW50LmJvZHkpLm9mZignLm92ZXJ1cCcpXG4gICAgamJvbmUoZG9jdW1lbnQuYm9keSkub2ZmKCcub3Zlcm91dCcpXG5cbiAgIyB0ZXJtaW5hdGVzIHRvdWNoaW5nXG4gIF90b3VjaENsZWFudXA6IChlKSAtPlxuICAgIGlmIGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID4gMFxuICAgICAgIyBtYXliZSB3ZSBjYW4gc2VuZCBhIGZpbmFsIGV2ZW50XG4gICAgICBAX29ubW91c2Vtb3ZlIGUuY2hhbmdlZFRvdWNoZXNbMF0sIHRydWVcblxuICAgIEBkcmFnU3RhcnQgPSBbXVxuICAgICMgcmVtb3ZlIGFsbCBsaXN0ZW5lcnNcbiAgICBqYm9uZShkb2N1bWVudC5ib2R5KS5vZmYoJy5vdmVydG1vdmUnKVxuICAgIGpib25lKGRvY3VtZW50LmJvZHkpLm9mZignLm92ZXJ0ZW5kJylcbiAgICBqYm9uZShkb2N1bWVudC5ib2R5KS5vZmYoJy5vdmVydGxlYXZlJylcbiAgICBqYm9uZShkb2N1bWVudC5ib2R5KS5vZmYoJy5vdmVydGNhbmNlbCcpXG5cbiAgIyBtaWdodCBiZSBpbmNvbXBhdGlibGUgd2l0aCBzb21lIGJyb3dzZXJzXG4gIF9vbm1vdXNld2hlZWw6IChlKSAtPlxuICAgIGRlbHRhID0gbW91c2Uud2hlZWxEZWx0YSBlXG4gICAgQGcuem9vbWVyLnNldCAnX2FsaWdubWVudFNjcm9sbExlZnQnLCBAZy56b29tZXIuZ2V0KCdfYWxpZ25tZW50U2Nyb2xsTGVmdCcpICsgZGVsdGFbMF1cbiAgICBAZy56b29tZXIuc2V0ICdfYWxpZ25tZW50U2Nyb2xsVG9wJywgQGcuem9vbWVyLmdldCgnX2FsaWdubWVudFNjcm9sbFRvcCcpICsgZGVsdGFbMV1cbiAgICBlLnByZXZlbnREZWZhdWx0KClcblxuICBfb25jbGljazogKGUpIC0+XG4gICAgQGcudHJpZ2dlciBcInJlc2lkdWU6Y2xpY2tcIiwgQF9nZXRDbGlja1BvcyhlKVxuICAgIEB0aHJvdHRsZWREcmF3KClcblxuICBfb25tb3VzZWluOiAoZSkgLT5cbiAgICBAZy50cmlnZ2VyIFwicmVzaWR1ZTpjbGlja1wiLCBAX2dldENsaWNrUG9zKGUpXG4gICAgQHRocm90dGxlZERyYXcoKVxuXG4gIF9vbm1vdXNlb3V0OiAoZSkgLT5cbiAgICBAZy50cmlnZ2VyIFwicmVzaWR1ZTpjbGlja1wiLCBAX2dldENsaWNrUG9zKGUpXG4gICAgQHRocm90dGxlZERyYXcoKVxuXG4gIF9nZXRDbGlja1BvczogKGUpIC0+XG4gICAgY29vcmRzID0gbW91c2UucmVsIGVcbiAgICBjb29yZHNbMF0gKz0gQGcuem9vbWVyLmdldChcIl9hbGlnbm1lbnRTY3JvbGxMZWZ0XCIpXG4gICAgY29vcmRzWzFdICs9IEBnLnpvb21lci5nZXQoXCJfYWxpZ25tZW50U2Nyb2xsVG9wXCIpXG4gICAgeCA9IE1hdGguZmxvb3IoY29vcmRzWzBdIC8gQGcuem9vbWVyLmdldChcImNvbHVtbldpZHRoXCIpIClcbiAgICB5ID0gTWF0aC5mbG9vcihjb29yZHNbMV0gLyBAZy56b29tZXIuZ2V0KFwicm93SGVpZ2h0XCIpKVxuXG4gICAgIyBhZGQgaGlkZGVuIGNvbHVtbnNcbiAgICB4ICs9IEBnLmNvbHVtbnMuY2FsY0hpZGRlbkNvbHVtbnMgeFxuICAgICMgYWRkIGhpZGRlbiBzZXFzXG4gICAgeSArPSBAbW9kZWwuY2FsY0hpZGRlblNlcXMgeVxuXG4gICAgeCA9IE1hdGgubWF4IDAseFxuICAgIHkgPSBNYXRoLm1heCAwLHlcbiAgICBzZXFJZCA9IEBtb2RlbC5hdCh5KS5nZXQgXCJpZFwiXG4gICAgcmV0dXJuIHtzZXFJZDpzZXFJZCwgcm93UG9zOiB4LCBldnQ6ZX1cblxuICAjIGNoZWNrcyB3aGV0aGVyIHRoZSBzY3JvbGxpbmcgY29vcmRpbmF0ZXMgYXJlIHZhbGlkXG4gICMgQHJldHVybnM6IFt4U2Nyb2xsLHlTY3JvbGxdIHZhbGlkIGNvb3JkaW5hdGVzXG4gIF9jaGVja1Njcm9sbGluZzogKHNjcm9sbE9iaikgLT5cblxuICAgICMgMDogbWF4TGVmdCwgMTogbWF4VG9wXG4gICAgbWF4ID0gW0Btb2RlbC5nZXRNYXhMZW5ndGgoKSAqIEBnLnpvb21lci5nZXQoXCJjb2x1bW5XaWR0aFwiKSAtIEBnLnpvb21lci5nZXQoJ2FsaWdubWVudFdpZHRoJyksXG4gICAgQG1vZGVsLmxlbmd0aCAgKiBAZy56b29tZXIuZ2V0KFwicm93SGVpZ2h0XCIpIC0gQGcuem9vbWVyLmdldCgnYWxpZ25tZW50SGVpZ2h0JyldXG5cbiAgICBmb3IgaSBpbiBbMC4uMV0gYnkgMVxuICAgICAgaWYgc2Nyb2xsT2JqW2ldID4gbWF4W2ldXG4gICAgICAgIHNjcm9sbE9ialtpXSA9IG1heFtpXVxuXG4gICAgICBpZiBzY3JvbGxPYmpbaV0gPCAwXG4gICAgICAgIHNjcm9sbE9ialtpXSA9IDBcblxuICAgIHJldHVybiBzY3JvbGxPYmpcblxuICAjIFRPRE86IHNob3VsZCBJIGJlIG1vdmVkIHRvIHRoZSBzZWxlY3Rpb24gbWFuYWdlcj9cbiAgIyByZXR1cm5zIGFuIGFycmF5IHdpdGggdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZXNpZHVlc1xuICAjIGUuZy4gWzAsM10gPSBwb3MgMCBhbmQgMyBhcmUgc2VsZWN0ZWRcbiAgX2dldFNlbGVjdGlvbjogKG1vZGVsKSAtPlxuICAgIG1heExlbiA9IG1vZGVsLmdldChcInNlcVwiKS5sZW5ndGhcbiAgICBzZWxlY3Rpb24gPSBbXVxuICAgIHNlbHMgPSBAZy5zZWxjb2wuZ2V0U2VsRm9yUm93IG1vZGVsLmdldCBcImlkXCJcbiAgICByb3dzID0gXy5maW5kIHNlbHMsIChlbCkgLT4gZWwuZ2V0KFwidHlwZVwiKSBpcyBcInJvd1wiXG4gICAgaWYgcm93cz9cbiAgICAgICMgZnVsbCBtYXRjaFxuICAgICAgZm9yIG4gaW4gWzAuLm1heExlbiAtIDFdIGJ5IDFcbiAgICAgICAgc2VsZWN0aW9uLnB1c2ggblxuICAgIGVsc2UgaWYgc2Vscy5sZW5ndGggPiAwXG4gICAgICBmb3Igc2VsIGluIHNlbHNcbiAgICAgICAgZm9yIG4gaW4gW3NlbC5nZXQoXCJ4U3RhcnRcIikuLnNlbC5nZXQoXCJ4RW5kXCIpXSBieSAxXG4gICAgICAgICAgc2VsZWN0aW9uLnB1c2ggblxuXG4gICAgcmV0dXJuIHNlbGVjdGlvblxuXG4gICMgZHJhd3MgZmVhdHVyZXNcbiAgYXBwZW5kRmVhdHVyZTogKGRhdGEpIC0+XG4gICAgZiA9IGRhdGEuZlxuICAgICMgVE9ETzogdGhpcyBpcyBhIHZlcnkgbmFpdmUgd2F5XG4gICAgYm94V2lkdGggPSBAZy56b29tZXIuZ2V0KFwiY29sdW1uV2lkdGhcIilcbiAgICBib3hIZWlnaHQgPSBAZy56b29tZXIuZ2V0KFwicm93SGVpZ2h0XCIpXG4gICAgd2lkdGggPSAoZi5nZXQoXCJ4RW5kXCIpIC0gZi5nZXQoXCJ4U3RhcnRcIikpICogYm94V2lkdGhcblxuICAgIGJlZm9yZVdpZHRoID0gQGN0eC5saW5lV2lkdGhcbiAgICBAY3R4LmxpbmVXaWR0aCA9IDNcbiAgICBiZWZvcmVTdHlsZSA9IEBjdHguc3Ryb2tlU3R5bGVcbiAgICBAY3R4LnN0cm9rZVN0eWxlID0gZi5nZXQgXCJmaWxsQ29sb3JcIlxuXG4gICAgQGN0eC5zdHJva2VSZWN0IGRhdGEueFplcm8sIGRhdGEueVplcm8sIHdpZHRoLGJveEhlaWdodFxuICAgIEBjdHguc3Ryb2tlU3R5bGUgPSBiZWZvcmVTdHlsZVxuICAgIEBjdHgubGluZVdpZHRoID0gYmVmb3JlV2lkdGhcblxuXG4gICMgbG9vcHMgb3ZlciBhbGwgc2VsZWN0aW9uIGFuZCBjYWxscyB0aGUgcmVuZGVyIG1ldGhvZFxuICBfYXBwZW5kU2VsZWN0aW9uOiAoZGF0YSkgLT5cbiAgICBzZXEgPSBkYXRhLm1vZGVsLmdldChcInNlcVwiKVxuICAgIHNlbGVjdGlvbiA9IEBfZ2V0U2VsZWN0aW9uIGRhdGEubW9kZWxcbiAgICAjIGdldCB0aGUgc3RhdHVzIG9mIHRoZSB1cHBlciBhbmQgbG93ZXIgcm93XG4gICAgW21QcmV2U2VsLG1OZXh0U2VsXSA9IEBfZ2V0UHJldk5leHRTZWxlY3Rpb24gZGF0YS5tb2RlbFxuXG4gICAgYm94V2lkdGggPSBAZy56b29tZXIuZ2V0KFwiY29sdW1uV2lkdGhcIilcbiAgICBib3hIZWlnaHQgPSBAZy56b29tZXIuZ2V0KFwicm93SGVpZ2h0XCIpXG5cbiAgICAjIGF2b2lkIHVubmVjZXNzYXJ5IGxvb3BzXG4gICAgcmV0dXJuIGlmIHNlbGVjdGlvbi5sZW5ndGggaXMgMFxuXG4gICAgaGlkZGVuT2Zmc2V0ID0gMFxuICAgIGZvciBuIGluIFswLi5zZXEubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgaWYgZGF0YS5oaWRkZW4uaW5kZXhPZihuKSA+PSAwXG4gICAgICAgIGhpZGRlbk9mZnNldCsrXG4gICAgICBlbHNlXG4gICAgICAgIGsgPSBuIC0gaGlkZGVuT2Zmc2V0XG4gICAgICAgICMgb25seSBpZiBpdHMgYSBuZXcgc2VsZWN0aW9uXG4gICAgICAgIGlmIHNlbGVjdGlvbi5pbmRleE9mKG4pID49IDAgYW5kIChrIGlzIDAgb3Igc2VsZWN0aW9uLmluZGV4T2YobiAtIDEpIDwgMCApXG4gICAgICAgICAgQF9yZW5kZXJTZWxlY3Rpb24gbjpuLGs6ayxzZWxlY3Rpb246IHNlbGVjdGlvbixtUHJldlNlbDogbVByZXZTZWwsbU5leHRTZWw6bU5leHRTZWwsIHhaZXJvOiBkYXRhLnhaZXJvLCB5WmVybzogZGF0YS55WmVybywgbW9kZWw6IGRhdGEubW9kZWxcblxuICAjIGRyYXdzIGEgc2luZ2xlIHVzZXIgc2VsZWN0aW9uXG4gIF9yZW5kZXJTZWxlY3Rpb246IChkYXRhKSAtPlxuXG4gICAgeFplcm8gPSBkYXRhLnhaZXJvXG4gICAgeVplcm8gPSBkYXRhLnlaZXJvXG4gICAgbiA9IGRhdGEublxuICAgIGsgPSBkYXRhLmtcbiAgICBzZWxlY3Rpb24gPSBkYXRhLnNlbGVjdGlvblxuICAgICMgYW5kIGNoZWNrcyB0aGUgcHJldiBhbmQgbmV4dCByb3cgZm9yIHNlbGVjdGlvbiAgLT4gbm8gYm9yZGVycyBpbiBhIHNlbGVjdGlvblxuICAgIG1QcmV2U2VsPSBkYXRhLm1QcmV2U2VsXG4gICAgbU5leHRTZWwgPSBkYXRhLm1OZXh0U2VsXG5cbiAgICAjIGdldCB0aGUgbGVuZ3RoIG9mIHRoaXMgc2VsZWN0aW9uXG4gICAgc2VsZWN0aW9uTGVuZ3RoID0gMFxuICAgIGZvciBpIGluIFtuLi4gZGF0YS5tb2RlbC5nZXQoXCJzZXFcIikubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgaWYgc2VsZWN0aW9uLmluZGV4T2YoaSkgPj0gMFxuICAgICAgICBzZWxlY3Rpb25MZW5ndGgrK1xuICAgICAgZWxzZVxuICAgICAgICBicmVha1xuXG4gICAgIyBUT0RPOiB1Z2x5IVxuICAgIGJveFdpZHRoID0gQGcuem9vbWVyLmdldChcImNvbHVtbldpZHRoXCIpXG4gICAgYm94SGVpZ2h0ID0gQGcuem9vbWVyLmdldChcInJvd0hlaWdodFwiKVxuICAgIHRvdGFsV2lkdGggPSAoYm94V2lkdGggKiBzZWxlY3Rpb25MZW5ndGgpICsgMVxuXG4gICAgaGlkZGVuID0gQGcuY29sdW1ucy5nZXQoJ2hpZGRlbicpXG5cbiAgICBAY3R4LmJlZ2luUGF0aCgpXG4gICAgYmVmb3JlV2lkdGggPSBAY3R4LmxpbmVXaWR0aFxuICAgIEBjdHgubGluZVdpZHRoID0gM1xuICAgIGJlZm9yZVN0eWxlID0gQGN0eC5zdHJva2VTdHlsZVxuICAgIEBjdHguc3Ryb2tlU3R5bGUgPSBcIiNGRjAwMDBcIlxuXG4gICAgeFplcm8gKz0gayAqIGJveFdpZHRoXG5cbiAgICAjIHNwbGl0IHVwIHRoZSBzZWxlY3Rpb24gaW50byBzaW5nbGUgY2VsbHNcbiAgICB4UGFydCA9IDBcbiAgICBmb3IgaSBpbiBbMC4uIHNlbGVjdGlvbkxlbmd0aCAtIDFdXG4gICAgICB4UG9zID0gbiArIGlcbiAgICAgIGlmIGhpZGRlbi5pbmRleE9mKHhQb3MpID49IDBcbiAgICAgICAgY29udGludWVcbiAgICAgICMgdXBwZXIgbGluZVxuICAgICAgdW5sZXNzIG1QcmV2U2VsPyBhbmQgbVByZXZTZWwuaW5kZXhPZih4UG9zKSA+PSAwXG4gICAgICAgIEBjdHgubW92ZVRvIHhaZXJvICsgeFBhcnQsIHlaZXJvXG4gICAgICAgIEBjdHgubGluZVRvIHhQYXJ0ICsgYm94V2lkdGggKyB4WmVybywgeVplcm9cbiAgICAgICMgbG93ZXIgbGluZVxuICAgICAgdW5sZXNzIG1OZXh0U2VsPyBhbmQgbU5leHRTZWwuaW5kZXhPZih4UG9zKSA+PSAwXG4gICAgICAgIEBjdHgubW92ZVRvIHhQYXJ0ICsgeFplcm8sIGJveEhlaWdodCArIHlaZXJvXG4gICAgICAgIEBjdHgubGluZVRvIHhQYXJ0ICsgYm94V2lkdGggKyB4WmVybywgYm94SGVpZ2h0ICsgeVplcm9cblxuICAgICAgeFBhcnQgKz0gYm94V2lkdGhcblxuICAgICMgbGVmdFxuICAgIEBjdHgubW92ZVRvIHhaZXJvLHlaZXJvXG4gICAgQGN0eC5saW5lVG8geFplcm8sIGJveEhlaWdodCArIHlaZXJvXG5cbiAgICAjIHJpZ2h0XG4gICAgQGN0eC5tb3ZlVG8geFplcm8gKyB0b3RhbFdpZHRoLHlaZXJvXG4gICAgQGN0eC5saW5lVG8geFplcm8gKyB0b3RhbFdpZHRoLCBib3hIZWlnaHQgKyB5WmVyb1xuXG4gICAgQGN0eC5zdHJva2UoKVxuICAgIEBjdHguc3Ryb2tlU3R5bGUgPSBiZWZvcmVTdHlsZVxuICAgIEBjdHgubGluZVdpZHRoID0gYmVmb3JlV2lkdGhcblxuICAjIGxvb2tzIGF0IHRoZSBzZWxlY3Rpb24gb2YgdGhlIHByZXYgYW5kIG5leHQgZWxcbiAgIyBUT0RPOiB0aGlzIGlzIHZlcnkgbmFpdmUsIGFzIHRoZXJlIG1pZ2h0IGJlIGdhcHMgYWJvdmUgb3IgYmVsb3dcbiAgX2dldFByZXZOZXh0U2VsZWN0aW9uOiAobW9kZWwpIC0+XG5cbiAgICBtb2RlbFByZXYgPSBtb2RlbC5jb2xsZWN0aW9uLnByZXYgbW9kZWxcbiAgICBtb2RlbE5leHQgPSBtb2RlbC5jb2xsZWN0aW9uLm5leHQgbW9kZWxcbiAgICBtUHJldlNlbCA9IEBfZ2V0U2VsZWN0aW9uIG1vZGVsUHJldiBpZiBtb2RlbFByZXY/XG4gICAgbU5leHRTZWwgPSBAX2dldFNlbGVjdGlvbiBtb2RlbE5leHQgaWYgbW9kZWxOZXh0P1xuICAgIFttUHJldlNlbCxtTmV4dFNlbF1cbiIsInZpZXcgPSByZXF1aXJlKFwiYmFja2JvbmUtdmlld2pcIilcbm1vdXNlID0gcmVxdWlyZSBcIm1vdXNlLXBvc1wiXG5zZWxlY3Rpb24gPSByZXF1aXJlIFwiLi4vZy9zZWxlY3Rpb24vU2VsZWN0aW9uXCJcbmNvbG9yU2VsZWN0b3IgPSByZXF1aXJlKFwiYmlvanMtdXRpbC1jb2xvcnNjaGVtZXNcIikuc2VsZWN0b3Jcbmpib25lID0gcmVxdWlyZSBcImpib25lXCJcbl8gPSByZXF1aXJlIFwidW5kZXJzY29yZVwiXG5cbm1vZHVsZS5leHBvcnRzID0gT3ZlcnZpZXdCb3ggPSB2aWV3LmV4dGVuZFxuXG4gIGNsYXNzTmFtZTogXCJiaW9qc19tc2Ffb3ZlcnZpZXdib3hcIlxuICB0YWdOYW1lOiBcImNhbnZhc1wiXG5cbiAgaW5pdGlhbGl6ZTogKGRhdGEpIC0+XG4gICAgQGcgPSBkYXRhLmdcbiAgICBAbGlzdGVuVG8gQGcuem9vbWVyLFwiY2hhbmdlOmJveFJlY3RXaWR0aCBjaGFuZ2U6Ym94UmVjdEhlaWdodFwiLCBAcmVuZGVyXG4gICAgQGxpc3RlblRvIEBnLnNlbGNvbCwgXCJhZGQgcmVzZXQgY2hhbmdlXCIsIEByZW5kZXJcbiAgICBAbGlzdGVuVG8gQGcuY29sdW1ucywgXCJjaGFuZ2U6aGlkZGVuXCIsIEByZW5kZXJcbiAgICBAbGlzdGVuVG8gQGcuY29sb3JzY2hlbWUsIFwiY2hhbmdlOnNob3dMb3dlckNhc2VcIiwgQHJlbmRlclxuICAgIEBsaXN0ZW5UbyBAbW9kZWwsIFwiY2hhbmdlXCIsIF8uZGVib3VuY2UgQHJlbmRlciwgNVxuXG4gICAgIyBjb2xvclxuICAgIEBjb2xvciA9IGNvbG9yU2VsZWN0b3IuZ2V0Q29sb3IgQGcuY29sb3JzY2hlbWUuZ2V0KFwic2NoZW1lXCIpXG4gICAgQGxpc3RlblRvIEBnLmNvbG9yc2NoZW1lLCBcImNoYW5nZTpzY2hlbWVcIiwgLT5cbiAgICAgIEBjb2xvciA9IGNvbG9yU2VsZWN0b3IuZ2V0Q29sb3IgQGcuY29sb3JzY2hlbWUuZ2V0KFwic2NoZW1lXCIpXG4gICAgICBAcmVuZGVyKClcbiAgICBAZHJhZ1N0YXJ0ID0gW11cblxuICBldmVudHM6XG4gICAgY2xpY2s6IFwiX29uY2xpY2tcIlxuICAgIG1vdXNlZG93bjogXCJfb25tb3VzZWRvd25cIlxuXG4gIHJlbmRlcjogLT5cbiAgICBAX2NyZWF0ZUNhbnZhcygpXG4gICAgQGVsLnRleHRDb250ZW50ID0gXCJvdmVydmlld1wiXG5cbiAgICAjIGJhY2tncm91bmQgYmcgZm9yIG5vbi1kcmF3ZWQgYXJlYVxuICAgIEBjdHguZmlsbFN0eWxlID0gXCIjOTk5OTk5XCJcbiAgICBAY3R4LmZpbGxSZWN0IDAsMCxAZWwud2lkdGgsQGVsLmhlaWdodFxuXG4gICAgcmVjdFdpZHRoID0gQGcuem9vbWVyLmdldCBcImJveFJlY3RXaWR0aFwiXG4gICAgcmVjdEhlaWdodCA9IEBnLnpvb21lci5nZXQgXCJib3hSZWN0SGVpZ2h0XCJcbiAgICBoaWRkZW4gPSBAZy5jb2x1bW5zLmdldCBcImhpZGRlblwiXG4gICAgc2hvd0xvd2VyQ2FzZSA9IEBnLmNvbG9yc2NoZW1lLmdldCBcInNob3dMb3dlckNhc2VcIlxuXG4gICAgeSA9IC1yZWN0SGVpZ2h0XG4gICAgZm9yIGkgaW4gWzAuLiBAbW9kZWwubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgc2VxID0gQG1vZGVsLmF0KGkpLmdldCBcInNlcVwiXG4gICAgICB4ID0gMFxuICAgICAgeSA9IHkgKyByZWN0SGVpZ2h0XG5cblxuICAgICAgaWYgQG1vZGVsLmF0KGkpLmdldCBcImhpZGRlblwiXG4gICAgICAgICMgaGlkZGVuIHNlcVxuICAgICAgICBjb25zb2xlLmxvZyBAbW9kZWwuYXQoaSkuZ2V0IFwiaGlkZGVuXCJcbiAgICAgICAgQGN0eC5maWxsU3R5bGUgPSBcImdyZXlcIlxuICAgICAgICBAY3R4LmZpbGxSZWN0IDAseSxzZXEubGVuZ3RoICogcmVjdFdpZHRoLHJlY3RIZWlnaHRcbiAgICAgICAgY29udGludWVcblxuICAgICAgZm9yIGogaW4gWzAuLiBzZXEubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgICBjID0gc2VxW2pdXG4gICAgICAgICMgdG9kbzogb3B0aW9uYWwgdXBwZXJjYXNpbmdcbiAgICAgICAgYyA9IGMudG9VcHBlckNhc2UoKSBpZiBzaG93TG93ZXJDYXNlXG4gICAgICAgIGNvbG9yID0gQGNvbG9yW2NdXG5cbiAgICAgICAgaWYgaGlkZGVuLmluZGV4T2YoaikgPj0gMFxuICAgICAgICAgIGNvbG9yID0gXCJncmV5XCJcblxuICAgICAgICBpZiBjb2xvcj9cbiAgICAgICAgICBAY3R4LmZpbGxTdHlsZSA9IGNvbG9yXG4gICAgICAgICAgQGN0eC5maWxsUmVjdCB4LHkscmVjdFdpZHRoLHJlY3RIZWlnaHRcblxuICAgICAgICB4ID0geCArIHJlY3RXaWR0aFxuXG4gICAgQF9kcmF3U2VsZWN0aW9uKClcblxuICBfZHJhd1NlbGVjdGlvbjogLT5cbiAgICAjIGhpZGUgZHVyaW5nIHNlbGVjdGlvblxuICAgIHJldHVybiBpZiBAZHJhZ1N0YXJ0Lmxlbmd0aCA+IDAgYW5kIG5vdCBAcHJvbG9uZ1NlbGVjdGlvblxuXG4gICAgcmVjdFdpZHRoID0gQGcuem9vbWVyLmdldCBcImJveFJlY3RXaWR0aFwiXG4gICAgcmVjdEhlaWdodCA9IEBnLnpvb21lci5nZXQgXCJib3hSZWN0SGVpZ2h0XCJcbiAgICBtYXhIZWlnaHQgPSByZWN0SGVpZ2h0ICogQG1vZGVsLmxlbmd0aFxuICAgIEBjdHguZmlsbFN0eWxlID0gXCIjZmZmZjAwXCJcbiAgICBAY3R4Lmdsb2JhbEFscGhhID0gMC45XG4gICAgZm9yIGkgaW4gWzAuLiBAZy5zZWxjb2wubGVuZ3RoIC0gMV0gYnkgMVxuICAgICAgc2VsID0gQGcuc2VsY29sLmF0KGkpXG4gICAgICBpZiBzZWwuZ2V0KCd0eXBlJykgaXMgJ2NvbHVtbidcbiAgICAgICAgQGN0eC5maWxsUmVjdCByZWN0V2lkdGggKiBzZWwuZ2V0KCd4U3RhcnQnKSwwLHJlY3RXaWR0aCAqXG4gICAgICAgIChzZWwuZ2V0KCd4RW5kJykgLSBzZWwuZ2V0KCd4U3RhcnQnKSArIDEpLG1heEhlaWdodFxuICAgICAgZWxzZSBpZiBzZWwuZ2V0KCd0eXBlJykgaXMgJ3JvdydcbiAgICAgICAgc2VxID0gKEBtb2RlbC5maWx0ZXIgKGVsKSAtPiBlbC5nZXQoJ2lkJykgaXMgc2VsLmdldCgnc2VxSWQnKSlbMF1cbiAgICAgICAgcG9zID0gQG1vZGVsLmluZGV4T2Yoc2VxKVxuICAgICAgICBAY3R4LmZpbGxSZWN0IDAscmVjdEhlaWdodCAqIHBvcywgcmVjdFdpZHRoICogc2VxLmdldCgnc2VxJykubGVuZ3RoLCByZWN0SGVpZ2h0XG4gICAgICBlbHNlIGlmIHNlbC5nZXQoJ3R5cGUnKSBpcyAncG9zJ1xuICAgICAgICBzZXEgPSAoQG1vZGVsLmZpbHRlciAoZWwpIC0+IGVsLmdldCgnaWQnKSBpcyBzZWwuZ2V0KCdzZXFJZCcpKVswXVxuICAgICAgICBwb3MgPSBAbW9kZWwuaW5kZXhPZihzZXEpXG4gICAgICAgIEBjdHguZmlsbFJlY3QgcmVjdFdpZHRoICogc2VsLmdldCgneFN0YXJ0JykscmVjdEhlaWdodCAqIHBvcywgcmVjdFdpZHRoICogKHNlbC5nZXQoJ3hFbmQnKSAtIHNlbC5nZXQoJ3hTdGFydCcpICsgMSksIHJlY3RIZWlnaHRcblxuICAgIEBjdHguZ2xvYmFsQWxwaGEgPSAxXG5cbiAgX29uY2xpY2s6IChldnQpIC0+XG4gICAgQGcudHJpZ2dlciBcIm1ldGE6Y2xpY2tcIiwge3NlcUlkOiBAbW9kZWwuZ2V0IFwiaWRcIiwgZXZ0OmV2dH1cblxuICBfb25tb3VzZW1vdmU6IChlKSAtPlxuICAgICMgZHVwbGljYXRlIGV2ZW50c1xuICAgIHJldHVybiBpZiBAZHJhZ1N0YXJ0Lmxlbmd0aCBpcyAwXG5cbiAgICBAcmVuZGVyKClcbiAgICBAY3R4LmZpbGxTdHlsZSA9IFwiI2ZmZmYwMFwiXG4gICAgQGN0eC5nbG9iYWxBbHBoYSA9IDAuOVxuXG4gICAgcmVjdCA9IEBfY2FsY1NlbGVjdGlvbiggbW91c2UuYWJzIGUgKVxuICAgIEBjdHguZmlsbFJlY3QgcmVjdFswXVswXSxyZWN0WzFdWzBdLHJlY3RbMF1bMV0gLSByZWN0WzBdWzBdLCByZWN0WzFdWzFdIC0gcmVjdFsxXVswXVxuXG4gICAgIyBhYm9ydCBzZWxlY3Rpb24gZXZlbnRzIG9mIHRoZSBicm93c2VyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuXG4gICMgc3RhcnQgdGhlIHNlbGVjdGlvbiBtb2RlXG4gIF9vbm1vdXNlZG93bjogKGUpIC0+XG4gICAgQGRyYWdTdGFydCA9IG1vdXNlLmFicyBlXG4gICAgQGRyYWdTdGFydFJlbCA9IG1vdXNlLnJlbCBlXG5cbiAgICBpZiBlLmN0cmxLZXkgb3IgZS5tZXRhS2V5XG4gICAgICBAcHJvbG9uZ1NlbGVjdGlvbiA9IHRydWVcbiAgICBlbHNlXG4gICAgICBAcHJvbG9uZ1NlbGVjdGlvbiA9IGZhbHNlXG4gICAgIyBlbmFibGUgZ2xvYmFsIGxpc3RlbmVyc1xuICAgIGpib25lKGRvY3VtZW50LmJvZHkpLm9uICdtb3VzZW1vdmUub3Zlcm1vdmUnLCAoZSkgPT4gQF9vbm1vdXNlbW92ZShlKVxuICAgIGpib25lKGRvY3VtZW50LmJvZHkpLm9uICdtb3VzZXVwLm92ZXJ1cCcsIChlKSA9PiBAX29ubW91c2V1cChlKVxuICAgIHJldHVybiBAZHJhZ1N0YXJ0XG5cbiAgIyBjYWxjdWxhdGVzIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICBfY2FsY1NlbGVjdGlvbjogKGRyYWdNb3ZlKSAtPlxuICAgICMgcmVsYXRpdmUgdG8gZmlyc3QgY2xpY2tcbiAgICBkcmFnUmVsID0gW2RyYWdNb3ZlWzBdIC0gQGRyYWdTdGFydFswXSwgZHJhZ01vdmVbMV0gLSBAZHJhZ1N0YXJ0WzFdXVxuXG4gICAgIyByZWxhdGl2ZSB0byB0YXJnZXRcbiAgICBmb3IgaSBpbiBbMC4uMV0gYnkgMVxuICAgICAgZHJhZ1JlbFtpXSA9IEBkcmFnU3RhcnRSZWxbaV0gKyBkcmFnUmVsW2ldXG5cbiAgICAjIDA6eCwgMTogeVxuICAgIHJlY3QgPSBbW0BkcmFnU3RhcnRSZWxbMF0sIGRyYWdSZWxbMF1dLCBbQGRyYWdTdGFydFJlbFsxXSwgZHJhZ1JlbFsxXV1dXG5cbiAgICAjIHN3YXAgdGhlIGNvb3JkaW5hdGVzIGlmIG5lZWRlZFxuICAgIGZvciBpIGluIFswLi4xXSBieSAxXG4gICAgICBpZiByZWN0W2ldWzFdIDwgcmVjdFtpXVswXVxuICAgICAgICByZWN0W2ldID0gW3JlY3RbaV1bMV0sIHJlY3RbaV1bMF1dXG5cbiAgICAgICMgbG93ZXIgbGltaXRcbiAgICAgIHJlY3RbaV1bMF0gPSBNYXRoLm1heCByZWN0W2ldWzBdLCAwXG5cbiAgICByZXR1cm4gcmVjdFxuXG4gIF9lbmRTZWxlY3Rpb246IChkcmFnRW5kKSAtPlxuICAgICMgcmVtb3ZlIGxpc3RlbmVyc1xuICAgIGpib25lKGRvY3VtZW50LmJvZHkpLm9mZignLm92ZXJtb3ZlJylcbiAgICBqYm9uZShkb2N1bWVudC5ib2R5KS5vZmYoJy5vdmVydXAnKVxuXG4gICAgIyBkdXBsaWNhdGUgZXZlbnRzXG4gICAgcmV0dXJuIGlmIEBkcmFnU3RhcnQubGVuZ3RoIGlzIDBcblxuICAgIHJlY3QgPSBAX2NhbGNTZWxlY3Rpb24gZHJhZ0VuZFxuXG4gICAgIyB4XG4gICAgZm9yIGkgaW4gWzAuLjFdXG4gICAgICByZWN0WzBdW2ldID0gTWF0aC5mbG9vciggcmVjdFswXVtpXSAvIEBnLnpvb21lci5nZXQoXCJib3hSZWN0V2lkdGhcIikpXG5cbiAgICAjIHlcbiAgICBmb3IgaSBpbiBbMC4uMV1cbiAgICAgIHJlY3RbMV1baV0gPSBNYXRoLmZsb29yKCByZWN0WzFdW2ldIC8gQGcuem9vbWVyLmdldChcImJveFJlY3RIZWlnaHRcIikgKVxuXG4gICAgIyB1cHBlciBsaW1pdFxuICAgIHJlY3RbMF1bMV0gPSBNYXRoLm1pbihAbW9kZWwuZ2V0TWF4TGVuZ3RoKCkgLSAxLCByZWN0WzBdWzFdKVxuICAgIHJlY3RbMV1bMV0gPSBNYXRoLm1pbihAbW9kZWwubGVuZ3RoIC0gMSwgcmVjdFsxXVsxXSlcblxuICAgICMgc2VsZWN0XG4gICAgc2VsaXMgPSBbXVxuICAgIGZvciBqIGluIFtyZWN0WzFdWzBdLi5yZWN0WzFdWzFdXSBieSAxXG4gICAgICBhcmdzID0gc2VxSWQ6IEBtb2RlbC5hdChqKS5nZXQoJ2lkJyksIHhTdGFydDogcmVjdFswXVswXSwgeEVuZDogcmVjdFswXVsxXVxuICAgICAgc2VsaXMucHVzaCBuZXcgc2VsZWN0aW9uLnBvc3NlbCBhcmdzXG5cbiAgICAjIHJlc2V0XG4gICAgQGRyYWdTdGFydCA9IFtdXG4gICAgIyBsb29rIGZvciBjdHJsIGtleVxuICAgIGlmIEBwcm9sb25nU2VsZWN0aW9uXG4gICAgICBAZy5zZWxjb2wuYWRkIHNlbGlzXG4gICAgZWxzZVxuICAgICAgQGcuc2VsY29sLnJlc2V0IHNlbGlzXG5cbiAgICAjIHNhZmV0eSBjaGVjayArIHVwZGF0ZSBvZmZzZXRcbiAgICBAZy56b29tZXIuc2V0TGVmdE9mZnNldCByZWN0WzBdWzBdXG4gICAgQGcuem9vbWVyLnNldFRvcE9mZnNldCByZWN0WzFdWzBdXG5cbiAgIyBlbmRzIHRoZSBzZWxlY3Rpb24gbW9kZVxuICBfb25tb3VzZXVwOiAoZSkgLT5cbiAgICBAX2VuZFNlbGVjdGlvbiBtb3VzZS5hYnMgZVxuXG4gIF9vbm1vdXNlb3V0OiAoZSkgLT5cbiAgICBAX2VuZFNlbGVjdGlvbiBtb3VzZS5hYnMgZVxuXG4gIyBpbml0IHRoZSBjYW52YXNcbiAgX2NyZWF0ZUNhbnZhczogLT5cbiAgICByZWN0V2lkdGggPSBAZy56b29tZXIuZ2V0IFwiYm94UmVjdFdpZHRoXCJcbiAgICByZWN0SGVpZ2h0ID0gQGcuem9vbWVyLmdldCBcImJveFJlY3RIZWlnaHRcIlxuXG4gICAgQGVsLmhlaWdodCA9IEBtb2RlbC5sZW5ndGggKiByZWN0SGVpZ2h0XG4gICAgQGVsLndpZHRoID0gQG1vZGVsLmdldE1heExlbmd0aCgpICogcmVjdFdpZHRoXG4gICAgQGN0eCA9IEBlbC5nZXRDb250ZXh0IFwiMmRcIlxuICAgIEBlbC5zdHlsZS5vdmVyZmxvdyA9IFwic2Nyb2xsXCJcbiAgICBAZWwuc3R5bGUuY3Vyc29yID0gXCJjcm9zc2hhaXJcIlxuIiwiYm9uZVZpZXcgPSByZXF1aXJlKFwiYmFja2JvbmUtY2hpbGRzXCIpXG5BbGlnbm1lbnRCb2R5ID0gcmVxdWlyZSBcIi4vQWxpZ25tZW50Qm9keVwiXG5IZWFkZXJCbG9jayA9IHJlcXVpcmUgXCIuL2hlYWRlci9IZWFkZXJCbG9ja1wiXG5PdmVydmlld0JveCA9IHJlcXVpcmUgXCIuL092ZXJ2aWV3Qm94XCJcbmlkZW50aXR5Q2FsYyA9IHJlcXVpcmUgXCIuLi9hbGdvL2lkZW50aXR5Q2FsY1wiXG5fID0gcmVxdWlyZSAndW5kZXJzY29yZSdcblxuIyBhIG5lYXQgY29sbGVjdGlvbiB2aWV3XG5tb2R1bGUuZXhwb3J0cyA9IGJvbmVWaWV3LmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG5cbiAgICBAZHJhdygpXG4gICAgQGxpc3RlblRvIEBtb2RlbCxcInJlc2V0XCIsIC0+XG4gICAgICBAaXNOb3REaXJ0eSA9IGZhbHNlXG4gICAgICBAcmVyZW5kZXIoKVxuXG4gICAgIyBkZWJvdW5jZSBhIGJ1bGsgb3BlcmF0aW9uXG4gICAgQGxpc3RlblRvIEBtb2RlbCxcImNoYW5nZTpoaWRkZW5cIiwgXy5kZWJvdW5jZSBAcmVyZW5kZXIsIDEwXG5cbiAgICBAbGlzdGVuVG8gQG1vZGVsLFwic29ydFwiLCBAcmVyZW5kZXJcbiAgICBAbGlzdGVuVG8gQG1vZGVsLFwiYWRkXCIsIC0+XG4gICAgICBjb25zb2xlLmxvZyBcInNlcSBhZGRcIlxuXG4gICAgQGxpc3RlblRvIEBnLnZpcyxcImNoYW5nZTpzZXF1ZW5jZXNcIiwgQHJlcmVuZGVyXG4gICAgQGxpc3RlblRvIEBnLnZpcyxcImNoYW5nZTpvdmVydmlld2JveFwiLCBAcmVyZW5kZXJcbiAgICBAbGlzdGVuVG8gQGcudmlzb3JkZXIsXCJjaGFuZ2VcIiwgQHJlcmVuZGVyXG5cbiAgZHJhdzogLT5cbiAgICBAcmVtb3ZlVmlld3MoKVxuXG4gICAgdW5sZXNzIEBpc05vdERpcnR5XG4gICAgICAjIG9ubHkgZXhlY3V0ZWQgd2hlbiBuZXcgc2VxdWVuY2VzIGFyZSBhZGRlZCBvciBvbiBzdGFydFxuICAgICAgY29uc2Vuc3VzID0gQGcuY29uc2Vuc3VzLmdldENvbnNlbnN1cyBAbW9kZWxcbiAgICAgIGlkZW50aXR5Q2FsYyBAbW9kZWwsIGNvbnNlbnN1c1xuICAgICAgQGlzTm90RGlydHkgPSB0cnVlXG5cbiAgICBpZiBAZy52aXMuZ2V0IFwib3ZlcnZpZXdib3hcIlxuICAgICAgb3ZlcnZpZXdib3ggPSBuZXcgT3ZlcnZpZXdCb3gge21vZGVsOiBAbW9kZWwsIGc6IEBnfVxuICAgICAgb3ZlcnZpZXdib3gub3JkZXJpbmcgPSBAZy52aXNvcmRlci5nZXQgJ292ZXJ2aWV3Qm94J1xuICAgICAgQGFkZFZpZXcgXCJvdmVydmlld2JveFwiLG92ZXJ2aWV3Ym94XG5cbiAgICBpZiB0cnVlXG4gICAgICBoZWFkZXJibG9jayA9IG5ldyBIZWFkZXJCbG9jayB7bW9kZWw6IEBtb2RlbCwgZzogQGd9XG4gICAgICBoZWFkZXJibG9jay5vcmRlcmluZyA9IEBnLnZpc29yZGVyLmdldCAnaGVhZGVyQm94J1xuICAgICAgQGFkZFZpZXcgXCJoZWFkZXJibG9ja1wiLGhlYWRlcmJsb2NrXG5cbiAgICBib2R5ID0gbmV3IEFsaWdubWVudEJvZHkge21vZGVsOiBAbW9kZWwsIGc6IEBnfVxuICAgIGJvZHkub3JkZXJpbmcgPSBAZy52aXNvcmRlci5nZXQgJ2FsaWdubWVudEJvZHknXG4gICAgQGFkZFZpZXcgXCJib2R5XCIsYm9keVxuXG4gIHJlbmRlcjogLT5cbiAgICBAcmVuZGVyU3Vidmlld3MoKVxuICAgIEBlbC5jbGFzc05hbWUgPSBcImJpb2pzX21zYV9zdGFnZVwiXG4gICAgQFxuXG4gIHJlcmVuZGVyOiAtPlxuICAgIEBkcmF3KClcbiAgICBAcmVuZGVyKClcbiIsInZpZXcgPSByZXF1aXJlKFwiYmFja2JvbmUtdmlld2pcIilcbmRvbSA9IHJlcXVpcmUoXCJkb20taGVscGVyXCIpXG5zdmcgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHMvc3ZnXCIpXG5cbkNvbnNlcnZhdGlvblZpZXcgPSB2aWV3LmV4dGVuZFxuXG4gIGNsYXNzTmFtZTogXCJiaW9qc19tc2FfY29uc2VydlwiXG5cbiAgaW5pdGlhbGl6ZTogKGRhdGEpIC0+XG4gICAgQGcgPSBkYXRhLmdcbiAgICBAbGlzdGVuVG8gQGcuem9vbWVyLFwiY2hhbmdlOnN0ZXBTaXplIGNoYW5nZTpsYWJlbFdpZHRoIGNoYW5nZTpjb2x1bW5XaWR0aFwiLCBAcmVuZGVyXG4gICAgQGxpc3RlblRvIEBnLnZpcyxcImNoYW5nZTpsYWJlbHMgY2hhbmdlOm1ldGFjZWxsXCIsIEByZW5kZXJcbiAgICBAbGlzdGVuVG8gQGcuY29sdW1ucywgXCJjaGFuZ2U6c2NhbGluZ1wiLCBAcmVuZGVyXG4gICAgQGxpc3RlblRvIEBtb2RlbCwgXCJyZXNldFwiLEByZW5kZXJcbiAgICBAbWFuYWdlRXZlbnRzKClcblxuICByZW5kZXI6IC0+XG4gICAgQGcuY29sdW1ucy5jYWxjQ29uc2VydmF0aW9uIEBtb2RlbFxuXG4gICAgZG9tLnJlbW92ZUFsbENoaWxkcyBAZWxcblxuICAgIG5NYXggPSBAbW9kZWwuZ2V0TWF4TGVuZ3RoKClcbiAgICBjZWxsV2lkdGggPSBAZy56b29tZXIuZ2V0IFwiY29sdW1uV2lkdGhcIlxuICAgIG1heEhlaWdodCA9IDIwXG4gICAgd2lkdGggPSBjZWxsV2lkdGggKiAobk1heCAtIEBnLmNvbHVtbnMuZ2V0KCdoaWRkZW4nKS5sZW5ndGgpXG4gICAgY29uc29sZS5sb2cgQGcuY29sdW1ucy5nZXQoJ2hpZGRlbicpXG5cbiAgICBzID0gc3ZnLmJhc2UgaGVpZ2h0OiBtYXhIZWlnaHQsIHdpZHRoOiB3aWR0aFxuICAgIHMuc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCJcbiAgICBzLnN0eWxlLmN1cnNvciA9IFwicG9pbnRlclwiXG5cbiAgICBzdGVwU2l6ZSA9IEBnLnpvb21lci5nZXQgXCJzdGVwU2l6ZVwiXG4gICAgaGlkZGVuID0gQGcuY29sdW1ucy5nZXQgXCJoaWRkZW5cIlxuICAgIHggPSAwXG4gICAgbiA9IDBcbiAgICB3aGlsZSBuIDwgbk1heFxuICAgICAgaWYgaGlkZGVuLmluZGV4T2YobikgPj0gMFxuICAgICAgICBuICs9IHN0ZXBTaXplXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB3aWR0aCA9IGNlbGxXaWR0aCAqIHN0ZXBTaXplXG4gICAgICBhdmdIZWlnaHQgPSAwXG4gICAgICBmb3IgaSBpbiBbMCAuLiBzdGVwU2l6ZSAtIDFdXG4gICAgICAgIGF2Z0hlaWdodCArPSBAZy5jb2x1bW5zLmdldChcImNvbnNlcnZcIilbbl1cbiAgICAgIGhlaWdodCA9IG1heEhlaWdodCAqICAoYXZnSGVpZ2h0IC8gc3RlcFNpemUpXG5cbiAgICAgIHJlY3QgPSAgc3ZnLnJlY3QgeDp4LHk6IG1heEhlaWdodCAtIGhlaWdodCx3aWR0aDp3aWR0aCAtIGNlbGxXaWR0aCAvIDQsaGVpZ2h0OmhlaWdodCxzdHlsZTpcbiAgICAgICAgXCJzdHJva2U6cmVkO3N0cm9rZS13aWR0aDoxO1wiXG4gICAgICByZWN0LnJvd1BvcyA9IG5cbiAgICAgIHMuYXBwZW5kQ2hpbGQgcmVjdFxuICAgICAgeCArPSB3aWR0aFxuICAgICAgbiArPSBzdGVwU2l6ZVxuXG4gICAgQGVsLmFwcGVuZENoaWxkIHNcbiAgICBAXG5cbiAgI1RPRE86IG1ha2UgbW9yZSBnZW5lcmFsIHdpdGggSGVhZGVyVmlld1xuICBfb25jbGljazogKGV2dCkgLT5cbiAgICByb3dQb3MgPSBldnQudGFyZ2V0LnJvd1Bvc1xuICAgIHN0ZXBTaXplID0gQGcuem9vbWVyLmdldChcInN0ZXBTaXplXCIpXG4gICAgIyBzaW11bGF0ZSBoaWRkZW4gY29sdW1uc1xuICAgIGZvciBpIGluIFswLi5zdGVwU2l6ZSAtIDFdIGJ5IDFcbiAgICAgIEBnLnRyaWdnZXIgXCJiYXI6Y2xpY2tcIiwge3Jvd1Bvczogcm93UG9zICsgaSwgZXZ0OmV2dH1cblxuICBtYW5hZ2VFdmVudHM6IC0+XG4gICAgZXZlbnRzID0ge31cbiAgICBpZiBAZy5jb25maWcuZ2V0IFwicmVnaXN0ZXJNb3VzZUNsaWNrc1wiXG4gICAgICBldmVudHMuY2xpY2sgPSBcIl9vbmNsaWNrXCJcbiAgICBpZiBAZy5jb25maWcuZ2V0IFwicmVnaXN0ZXJNb3VzZUhvdmVyXCJcbiAgICAgIGV2ZW50cy5tb3VzZWluID0gXCJfb25tb3VzZWluXCJcbiAgICAgIGV2ZW50cy5tb3VzZW91dCA9IFwiX29ubW91c2VvdXRcIlxuICAgIEBkZWxlZ2F0ZUV2ZW50cyBldmVudHNcbiAgICBAbGlzdGVuVG8gQGcuY29uZmlnLCBcImNoYW5nZTpyZWdpc3Rlck1vdXNlSG92ZXJcIiwgQG1hbmFnZUV2ZW50c1xuICAgIEBsaXN0ZW5UbyBAZy5jb25maWcsIFwiY2hhbmdlOnJlZ2lzdGVyTW91c2VDbGlja1wiLCBAbWFuYWdlRXZlbnRzXG5cbiAgX29ubW91c2VpbjogKGV2dCkgLT5cbiAgICByb3dQb3MgPSBAZy56b29tZXIuZ2V0IFwic3RlcFNpemVcIiAqIGV2dC5yb3dQb3NcbiAgICBAZy50cmlnZ2VyIFwiYmFyOm1vdXNlaW5cIiwge3Jvd1Bvczogcm93UG9zLCBldnQ6ZXZ0fVxuXG4gIF9vbm1vdXNlb3V0OiAoZXZ0KSAtPlxuICAgIHJvd1BvcyA9IEBnLnpvb21lci5nZXQgXCJzdGVwU2l6ZVwiICogZXZ0LnJvd1Bvc1xuICAgIEBnLnRyaWdnZXIgXCJiYXI6bW91c2VvdXRcIiwge3Jvd1Bvczogcm93UG9zLCBldnQ6ZXZ0fVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbnNlcnZhdGlvblZpZXdcbiIsIk1hcmtlclZpZXcgPSByZXF1aXJlIFwiLi9NYXJrZXJWaWV3XCJcbkNvbnNlcnZhdGlvblZpZXcgPSByZXF1aXJlIFwiLi9Db25zZXJ2YXRpb25WaWV3XCJcbmlkZW50aXR5Q2FsYyA9IHJlcXVpcmUgXCIuLi8uLi9hbGdvL2lkZW50aXR5Q2FsY1wiXG5ib25lVmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS1jaGlsZHNcIilcbl8gPSByZXF1aXJlICd1bmRlcnNjb3JlJ1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJvbmVWaWV3LmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG4gICAgQGJsb2NrRXZlbnRzID0gZmFsc2VcblxuICAgIEBsaXN0ZW5UbyBAZy52aXMsXCJjaGFuZ2U6bWFya2VycyBjaGFuZ2U6Y29uc2VydlwiLCAtPlxuICAgICAgQGRyYXcoKVxuICAgICAgQHJlbmRlcigpXG4gICAgQGxpc3RlblRvIEBnLnZpcyxcImNoYW5nZVwiLCBAX3NldFNwYWNlclxuICAgIEBsaXN0ZW5UbyBAZy56b29tZXIsXCJjaGFuZ2U6YWxpZ25tZW50V2lkdGhcIiwgLT5cbiAgICAgIEBfYWRqdXN0V2lkdGgoKVxuICAgIEBsaXN0ZW5UbyBAZy56b29tZXIsIFwiY2hhbmdlOl9hbGlnbm1lbnRTY3JvbGxMZWZ0XCIsIEBfYWRqdXN0U2Nyb2xsaW5nTGVmdFxuXG4gICAgIyBUT0RPOiBkdXBsaWNhdGUgcmVuZGVyaW5nXG4gICAgQGxpc3RlblRvIEBnLmNvbHVtbnMsIFwiY2hhbmdlOmhpZGRlblwiLCAtPlxuICAgICAgQGRyYXcoKVxuICAgICAgQHJlbmRlcigpXG5cbiAgICBAZHJhdygpXG4gICAgQF9vbnNjcm9sbCA9IEBfc2VuZFNjcm9sbEV2ZW50XG5cbiAgICBAZy52aXMub25jZSAnY2hhbmdlOmxvYWRlZCcsIEBfYWRqdXN0U2Nyb2xsaW5nTGVmdCwgQFxuXG4gIGV2ZW50czpcbiAgICBcInNjcm9sbFwiOiBcIl9vbnNjcm9sbFwiXG5cbiAgZHJhdzogLT5cbiAgICBAcmVtb3ZlVmlld3MoKVxuXG4gICAgdW5sZXNzIEBpc05vdERpcnR5XG4gICAgICAjIG9ubHkgZXhlY3V0ZWQgd2hlbiBuZXcgc2VxdWVuY2VzIGFyZSBhZGRlZCBvciBvbiBzdGFydFxuICAgICAgY29uc2Vuc3VzID0gQGcuY29uc2Vuc3VzLmdldENvbnNlbnN1cyBAbW9kZWxcbiAgICAgIGlkZW50aXR5Q2FsYyBAbW9kZWwsIGNvbnNlbnN1c1xuICAgICAgQGlzTm90RGlydHkgPSB0cnVlXG5cbiAgICBpZiBAZy52aXMuZ2V0IFwiY29uc2VydlwiXG4gICAgICBjb25zZXJ2ID0gbmV3IENvbnNlcnZhdGlvblZpZXcge21vZGVsOiBAbW9kZWwsIGc6IEBnfVxuICAgICAgY29uc2Vydi5vcmRlcmluZyA9IC0yMFxuICAgICAgQGFkZFZpZXcgXCJjb25zZXJ2XCIsY29uc2VydlxuXG4gICAgaWYgQGcudmlzLmdldCBcIm1hcmtlcnNcIlxuICAgICAgbWFya2VyID0gbmV3IE1hcmtlclZpZXcge21vZGVsOiBAbW9kZWwsIGc6IEBnfVxuICAgICAgbWFya2VyLm9yZGVyaW5nID0gLTEwXG4gICAgICBAYWRkVmlldyBcIm1hcmtlclwiLG1hcmtlclxuXG4gIHJlbmRlcjogLT5cbiAgICBAcmVuZGVyU3Vidmlld3MoKVxuXG4gICAgQF9zZXRTcGFjZXIoKVxuXG4gICAgQGVsLmNsYXNzTmFtZSA9IFwiYmlvanNfbXNhX2hlYWRlclwiXG4gICAgQGVsLnN0eWxlLm92ZXJmbG93WCA9IFwiYXV0b1wiXG4gICAgQF9hZGp1c3RXaWR0aCgpXG4gICAgQF9hZGp1c3RTY3JvbGxpbmdMZWZ0KClcbiAgICBAXG5cbiAgIyBzY3JvbGxMZWZ0IHRyaWdnZXJzIGEgcmVmbG93IG9mIHRoZSB3aG9sZSBhcmVhIChldmVuIG9ubHkgZ2V0KVxuICBfc2VuZFNjcm9sbEV2ZW50OiAtPlxuICAgIHVubGVzcyBAYmxvY2tFdmVudHNcbiAgICAgIEBnLnpvb21lci5zZXQgXCJfYWxpZ25tZW50U2Nyb2xsTGVmdFwiLCBAZWwuc2Nyb2xsTGVmdCwge29yaWdpbjogXCJoZWFkZXJcIn1cbiAgICBAYmxvY2tFdmVudHMgPSBmYWxzZVxuXG4gIF9hZGp1c3RTY3JvbGxpbmdMZWZ0OiAobW9kZWwsdmFsdWUsb3B0aW9ucykgLT5cbiAgICBpZiAobm90IG9wdGlvbnM/Lm9yaWdpbj8pIG9yIG9wdGlvbnMub3JpZ2luIGlzbnQgXCJoZWFkZXJcIlxuICAgICAgc2Nyb2xsTGVmdCA9IEBnLnpvb21lci5nZXQgXCJfYWxpZ25tZW50U2Nyb2xsTGVmdFwiXG4gICAgICBAYmxvY2tFdmVudHMgPSB0cnVlXG4gICAgICBAZWwuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnRcblxuICBfc2V0U3BhY2VyOiAtPlxuICAgICMgc3BhY2VyIC8gcGFkZGluZyBlbGVtZW50XG4gICAgQGVsLnN0eWxlLm1hcmdpbkxlZnQgPSBAX2dldExhYmVsV2lkdGgoKSArIFwicHhcIlxuXG4gIF9nZXRMYWJlbFdpZHRoOiAtPlxuICAgIHBhZGRpbmdMZWZ0ID0gMFxuICAgIHBhZGRpbmdMZWZ0ICs9IEBnLnpvb21lci5nZXQgXCJsYWJlbFdpZHRoXCIgaWYgQGcudmlzLmdldCBcImxhYmVsc1wiXG4gICAgcGFkZGluZ0xlZnQgKz0gQGcuem9vbWVyLmdldCBcIm1ldGFXaWR0aFwiIGlmIEBnLnZpcy5nZXQgXCJtZXRhY2VsbFwiXG4gICAgcmV0dXJuIHBhZGRpbmdMZWZ0XG5cbiAgX2FkanVzdFdpZHRoOiAtPlxuICAgIEBlbC5zdHlsZS53aWR0aCA9IEBnLnpvb21lci5nZXQoXCJhbGlnbm1lbnRXaWR0aFwiKSArIFwicHhcIlxuIiwidmlldyA9IHJlcXVpcmUoXCJiYWNrYm9uZS12aWV3alwiKVxuZG9tID0gcmVxdWlyZShcImRvbS1oZWxwZXJcIilcbnN2ZyA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy9zdmdcIilcbmpib25lID0gcmVxdWlyZSBcImpib25lXCJcblxuSGVhZGVyVmlldyA9IHZpZXcuZXh0ZW5kXG5cbiAgY2xhc3NOYW1lOiBcImJpb2pzX21zYV9tYXJrZXJcIlxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG4gICAgQGxpc3RlblRvIEBnLnpvb21lcixcImNoYW5nZTpzdGVwU2l6ZSBjaGFuZ2U6bGFiZWxXaWR0aCBjaGFuZ2U6Y29sdW1uV2lkdGggY2hhbmdlOm1hcmtlclN0ZXBTaXplIGNoYW5nZTptYXJrZXJGb250c2l6ZVwiLCBAcmVuZGVyXG4gICAgQGxpc3RlblRvIEBnLnZpcyxcImNoYW5nZTpsYWJlbHMgY2hhbmdlOm1ldGFjZWxsXCIsIEByZW5kZXJcbiAgICBAbWFuYWdlRXZlbnRzKClcblxuICByZW5kZXI6IC0+XG4gICAgZG9tLnJlbW92ZUFsbENoaWxkcyBAZWxcblxuICAgIEBlbC5zdHlsZS5mb250U2l6ZSA9IEBnLnpvb21lci5nZXQgXCJtYXJrZXJGb250c2l6ZVwiXG5cbiAgICBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwic3BhblwiXG4gICAgbiA9IDBcbiAgICBjZWxsV2lkdGggPSBAZy56b29tZXIuZ2V0IFwiY29sdW1uV2lkdGhcIlxuXG4gICAgbk1heCA9IEBtb2RlbC5nZXRNYXhMZW5ndGgoKVxuICAgIHN0ZXBTaXplID0gQGcuem9vbWVyLmdldChcInN0ZXBTaXplXCIpXG4gICAgaGlkZGVuID0gQGcuY29sdW1ucy5nZXQgXCJoaWRkZW5cIlxuXG4gICAgd2hpbGUgbiA8IG5NYXhcbiAgICAgIGlmIGhpZGRlbi5pbmRleE9mKG4pID49IDBcbiAgICAgICAgQG1hcmtlckhpZGRlbihzcGFuLG4sIHN0ZXBTaXplKVxuICAgICAgICBuICs9IHN0ZXBTaXplXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBcInNwYW5cIlxuICAgICAgc3Bhbi5zdHlsZS53aWR0aCA9IChjZWxsV2lkdGggKiBzdGVwU2l6ZSkgKyBcInB4XCJcbiAgICAgIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCJcbiAgICAgICMgVE9ETzogdGhpcyBkb2Vzbid0IHdvcmsgZm9yIGEgbGFyZ2VyIHN0ZXBTaXplXG4gICAgICBpZiAobiArIDEpICUgQGcuem9vbWVyLmdldCgnbWFya2VyU3RlcFNpemUnKSBpcyAwXG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSAobiArIDEpXG4gICAgICBlbHNlXG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBcIi5cIlxuICAgICAgc3Bhbi5yb3dQb3MgPSBuXG5cbiAgICAgIG4gKz0gc3RlcFNpemVcbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCBzcGFuXG5cbiAgICBAZWwuYXBwZW5kQ2hpbGQgY29udGFpbmVyXG4gICAgQFxuXG4gIG1hcmtlckhpZGRlbjogKHNwYW4sbixzdGVwU2l6ZSkgLT5cbiAgICBoaWRkZW4gPSBAZy5jb2x1bW5zLmdldChcImhpZGRlblwiKS5zbGljZSAwXG5cbiAgICBtaW4gPSBNYXRoLm1heCAwLCBuIC0gc3RlcFNpemVcbiAgICBwcmV2SGlkZGVuID0gdHJ1ZVxuICAgIGZvciBqIGluICBbbWluIC4uIG5dIGJ5IDFcbiAgICAgIHByZXZIaWRkZW4gJj0gaGlkZGVuLmluZGV4T2YoaikgPj0gMFxuXG4gICAgIyBmaWx0ZXIgZHVwbGljYXRlc1xuICAgIHJldHVybiBpZiBwcmV2SGlkZGVuXG5cbiAgICBuTWF4ID0gQG1vZGVsLmdldE1heExlbmd0aCgpXG5cbiAgICBsZW5ndGggPSAwXG4gICAgaW5kZXggPSAtMVxuICAgICMgYWNjdW1sYXRlIG11bHRpcGxlIHJvd3NcbiAgICBmb3IgbiBpbiBbbi4ubk1heF0gYnkgMVxuICAgICAgaW5kZXggPSBoaWRkZW4uaW5kZXhPZihuKSB1bmxlc3MgaW5kZXggPj0gMCMgc2V0cyB0aGUgZmlyc3QgaW5kZXhcbiAgICAgIGlmIGhpZGRlbi5pbmRleE9mKG4pID49IDBcbiAgICAgICAgbGVuZ3RoKytcbiAgICAgIGVsc2VcbiAgICAgICAgYnJlYWtcblxuICAgIHMgPSBzdmcuYmFzZSBoZWlnaHQ6IDEwLCB3aWR0aDogMTBcbiAgICBzLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiXG4gICAgdHJpYW5nbGUgPSBzdmcucG9seWdvbiBwb2ludHM6IFwiMCwwIDUsNSAxMCwwXCIsIHN0eWxlOlxuICAgICAgXCJmaWxsOmxpbWU7c3Ryb2tlOnB1cnBsZTtzdHJva2Utd2lkdGg6MVwiXG4gICAgamJvbmUodHJpYW5nbGUpLm9uIFwiY2xpY2tcIiwgKGV2dCkgPT5cbiAgICAgIGhpZGRlbi5zcGxpY2UgaW5kZXgsIGxlbmd0aFxuICAgICAgQGcuY29sdW1ucy5zZXQgXCJoaWRkZW5cIiwgaGlkZGVuXG5cbiAgICBzLmFwcGVuZENoaWxkIHRyaWFuZ2xlXG4gICAgc3Bhbi5hcHBlbmRDaGlsZCBzXG4gICAgcmV0dXJuIHNcblxuICBtYW5hZ2VFdmVudHM6IC0+XG4gICAgZXZlbnRzID0ge31cbiAgICBpZiBAZy5jb25maWcuZ2V0IFwicmVnaXN0ZXJNb3VzZUNsaWNrc1wiXG4gICAgICBldmVudHMuY2xpY2sgPSBcIl9vbmNsaWNrXCJcbiAgICBpZiBAZy5jb25maWcuZ2V0IFwicmVnaXN0ZXJNb3VzZUhvdmVyXCJcbiAgICAgIGV2ZW50cy5tb3VzZWluID0gXCJfb25tb3VzZWluXCJcbiAgICAgIGV2ZW50cy5tb3VzZW91dCA9IFwiX29ubW91c2VvdXRcIlxuICAgIEBkZWxlZ2F0ZUV2ZW50cyBldmVudHNcbiAgICBAbGlzdGVuVG8gQGcuY29uZmlnLCBcImNoYW5nZTpyZWdpc3Rlck1vdXNlSG92ZXJcIiwgQG1hbmFnZUV2ZW50c1xuICAgIEBsaXN0ZW5UbyBAZy5jb25maWcsIFwiY2hhbmdlOnJlZ2lzdGVyTW91c2VDbGlja1wiLCBAbWFuYWdlRXZlbnRzXG5cbiAgX29uY2xpY2s6IChldnQpIC0+XG4gICAgcm93UG9zID0gZXZ0LnRhcmdldC5yb3dQb3NcbiAgICBzdGVwU2l6ZSA9IEBnLnpvb21lci5nZXQoXCJzdGVwU2l6ZVwiKVxuICAgIEBnLnRyaWdnZXIgXCJjb2x1bW46Y2xpY2tcIiwge3Jvd1Bvczogcm93UG9zLHN0ZXBTaXplOiBzdGVwU2l6ZSwgZXZ0OmV2dH1cblxuICBfb25tb3VzZWluOiAoZXZ0KSAtPlxuICAgIHJvd1BvcyA9IEBnLnpvb21lci5nZXQgXCJzdGVwU2l6ZVwiICogZXZ0LnJvd1Bvc1xuICAgIHN0ZXBTaXplID0gQGcuem9vbWVyLmdldChcInN0ZXBTaXplXCIpXG4gICAgQGcudHJpZ2dlciBcImNvbHVtbjptb3VzZWluXCIsIHtyb3dQb3M6IHJvd1BvcyxzdGVwU2l6ZTogc3RlcFNpemUsIGV2dDpldnR9XG5cbiAgX29ubW91c2VvdXQ6IChldnQpIC0+XG4gICAgcm93UG9zID0gQGcuem9vbWVyLmdldCBcInN0ZXBTaXplXCIgKiBldnQucm93UG9zXG4gICAgc3RlcFNpemUgPSBAZy56b29tZXIuZ2V0KFwic3RlcFNpemVcIilcbiAgICBAZy50cmlnZ2VyIFwiY29sdW1uOm1vdXNlb3V0XCIsIHtyb3dQb3M6IHJvd1BvcyxzdGVwU2l6ZTogc3RlcFNpemUsIGV2dDpldnR9XG5cbm1vZHVsZS5leHBvcnRzID0gSGVhZGVyVmlld1xuIiwiTGFiZWxSb3dWaWV3ID0gcmVxdWlyZSBcIi4vTGFiZWxSb3dWaWV3XCJcbmJvbmVWaWV3ID0gcmVxdWlyZShcImJhY2tib25lLWNoaWxkc1wiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJvbmVWaWV3LmV4dGVuZFxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG4gICAgQGRyYXcoKVxuICAgIEBsaXN0ZW5UbyBAZy56b29tZXIsIFwiY2hhbmdlOl9hbGlnbm1lbnRTY3JvbGxUb3BcIiwgQF9hZGp1c3RTY3JvbGxpbmdUb3BcbiAgICBAZy52aXMub25jZSAnY2hhbmdlOmxvYWRlZCcsIEBfYWRqdXN0U2Nyb2xsaW5nVG9wICwgQFxuXG4gIGRyYXc6IC0+XG4gICAgQHJlbW92ZVZpZXdzKClcbiAgICBmb3IgaSBpbiBbMC4uIEBtb2RlbC5sZW5ndGggLSAxXSBieSAxXG4gICAgICBjb250aW51ZSBpZiBAbW9kZWwuYXQoaSkuZ2V0KCdoaWRkZW4nKVxuICAgICAgdmlldyA9IG5ldyBMYWJlbFJvd1ZpZXcge21vZGVsOiBAbW9kZWwuYXQoaSksIGc6IEBnfVxuICAgICAgdmlldy5vcmRlcmluZyA9IGlcbiAgICAgIEBhZGRWaWV3IFwicm93XyN7aX1cIiwgdmlld1xuXG4gIGV2ZW50czpcbiAgICBcInNjcm9sbFwiOiBcIl9zZW5kU2Nyb2xsRXZlbnRcIlxuXG4gICMgYnJvYWRjYXN0IHRoZSBzY3JvbGxpbmcgZXZlbnQgKGJ5IHRoZSBzY3JvbGxiYXIpXG4gIF9zZW5kU2Nyb2xsRXZlbnQ6IC0+XG4gICAgQGcuem9vbWVyLnNldCBcIl9hbGlnbm1lbnRTY3JvbGxUb3BcIiwgQGVsLnNjcm9sbFRvcCwge29yaWdpbjogXCJsYWJlbFwifVxuXG4gICMgc2V0cyB0aGUgc2Nyb2xsaW5nIHByb3BlcnR5IChmcm9tIGFub3RoZXIgZXZlbnQgZS5nLiBkcmFnZ2luZylcbiAgX2FkanVzdFNjcm9sbGluZ1RvcDogLT5cbiAgICBAZWwuc2Nyb2xsVG9wID0gIEBnLnpvb21lci5nZXQgXCJfYWxpZ25tZW50U2Nyb2xsVG9wXCJcblxuICByZW5kZXI6IC0+XG4gICAgQHJlbmRlclN1YnZpZXdzKClcbiAgICBAZWwuY2xhc3NOYW1lID0gXCJiaW9qc19tc2FfbGFiZWxibG9ja1wiXG4gICAgQGVsLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiXG4gICAgQGVsLnN0eWxlLnZlcnRpY2FsQWxpZ24gPSBcInRvcFwiXG4gICAgQGVsLnN0eWxlLmhlaWdodCA9ICBAZy56b29tZXIuZ2V0KFwiYWxpZ25tZW50SGVpZ2h0XCIpICsgXCJweFwiXG4gICAgQGVsLnN0eWxlLm92ZXJmbG93WSA9IFwiYXV0b1wiXG4gICAgQGVsLnN0eWxlLm92ZXJmbG93WCA9IFwiaGlkZGVuXCJcbiAgICBAZWwuc3R5bGUuZm9udFNpemUgPSBcIiN7QGcuem9vbWVyLmdldCBcImxhYmVsRm9udHNpemVcIn1cIlxuICAgIEBlbC5zdHlsZS5saW5lSGVpZ2h0ID0gXCIje0BnLnpvb21lci5nZXQgXCJsYWJlbExpbmVIZWlnaHRcIn1cIlxuICAgIEBcbiIsImJvbmVWaWV3ID0gcmVxdWlyZShcImJhY2tib25lLWNoaWxkc1wiKVxuTGFiZWxWaWV3ID0gcmVxdWlyZShcIi4vTGFiZWxWaWV3XCIpXG5NZXRhVmlldyA9IHJlcXVpcmUoXCIuL01ldGFWaWV3XCIpXG5cbm1vZHVsZS5leHBvcnRzID0gYm9uZVZpZXcuZXh0ZW5kXG5cbiAgaW5pdGlhbGl6ZTogKGRhdGEpIC0+XG4gICAgQGcgPSBkYXRhLmdcbiAgICBAZHJhdygpXG5cbiAgICBAbGlzdGVuVG8gQGcudmlzLFwiY2hhbmdlOmxhYmVsc1wiLCBAZHJhd1JcbiAgICBAbGlzdGVuVG8gQGcudmlzLFwiY2hhbmdlOm1ldGFjZWxsXCIsIEBkcmF3UlxuXG4gIGRyYXc6IC0+XG4gICAgQHJlbW92ZVZpZXdzKClcbiAgICBpZiBAZy52aXMuZ2V0IFwibGFiZWxzXCJcbiAgICAgIEBhZGRWaWV3IFwibGFiZWxzXCIsIG5ldyBMYWJlbFZpZXcge21vZGVsOiBAbW9kZWwsIGc6QGd9XG4gICAgaWYgQGcudmlzLmdldCBcIm1ldGFjZWxsXCJcbiAgICAgIEBhZGRWaWV3IFwibWV0YWNlbGxcIiwgbmV3IE1ldGFWaWV3IHttb2RlbDogQG1vZGVsLCBnOkBnfVxuXG4gIGRyYXdSOiAtPlxuICAgIEBkcmF3KClcbiAgICBAcmVuZGVyKClcblxuICByZW5kZXI6IC0+XG4gICAgQHJlbmRlclN1YnZpZXdzKClcbiAgICBAZWwuc2V0QXR0cmlidXRlIFwiY2xhc3NcIiwgXCJiaW9qc19tc2FfbGFiZWxyb3dcIlxuICAgIEBlbC5zdHlsZS5oZWlnaHQgPSBAZy56b29tZXIuZ2V0IFwicm93SGVpZ2h0XCJcbiAgICBAXG4iLCJ2aWV3ID0gcmVxdWlyZShcImJhY2tib25lLXZpZXdqXCIpXG5kb20gPSByZXF1aXJlIFwiZG9tLWhlbHBlclwiXG5cbkxhYmVsVmlldyA9IHZpZXcuZXh0ZW5kXG5cbiAgaW5pdGlhbGl6ZTogKGRhdGEpIC0+XG4gICAgQHNlcSA9IGRhdGEuc2VxXG4gICAgQGcgPSBkYXRhLmdcblxuICAgIEBtYW5hZ2VFdmVudHMoKVxuXG4gIG1hbmFnZUV2ZW50czogLT5cbiAgICBldmVudHMgPSB7fVxuICAgIGlmIEBnLmNvbmZpZy5nZXQgXCJyZWdpc3Rlck1vdXNlQ2xpY2tzXCJcbiAgICAgIGV2ZW50cy5jbGljayA9IFwiX29uY2xpY2tcIlxuICAgIGlmIEBnLmNvbmZpZy5nZXQgXCJyZWdpc3Rlck1vdXNlSG92ZXJcIlxuICAgICAgZXZlbnRzLm1vdXNlaW4gPSBcIl9vbm1vdXNlaW5cIlxuICAgICAgZXZlbnRzLm1vdXNlb3V0ID0gXCJfb25tb3VzZW91dFwiXG4gICAgQGRlbGVnYXRlRXZlbnRzIGV2ZW50c1xuICAgIEBsaXN0ZW5UbyBAZy5jb25maWcsIFwiY2hhbmdlOnJlZ2lzdGVyTW91c2VIb3ZlclwiLCBAbWFuYWdlRXZlbnRzXG4gICAgQGxpc3RlblRvIEBnLmNvbmZpZywgXCJjaGFuZ2U6cmVnaXN0ZXJNb3VzZUNsaWNrXCIsIEBtYW5hZ2VFdmVudHNcbiAgICBAbGlzdGVuVG8gQGcudmlzLCBcImNoYW5nZTpsYWJlbE5hbWVcIiwgQHJlbmRlclxuICAgIEBsaXN0ZW5UbyBAZy52aXMsIFwiY2hhbmdlOmxhYmVsSWRcIiwgQHJlbmRlclxuICAgIEBsaXN0ZW5UbyBAZy52aXMsIFwiY2hhbmdlOmxhYmVsUGFydGl0aW9uXCIsIEByZW5kZXJcbiAgICBAbGlzdGVuVG8gQGcudmlzLCBcImNoYW5nZTpsYWJlbENoZWNrYm94XCIsIEByZW5kZXJcblxuICByZW5kZXI6IC0+XG4gICAgZG9tLnJlbW92ZUFsbENoaWxkcyBAZWxcblxuICAgIEBlbC5zdHlsZS53aWR0aCA9IFwiI3tAZy56b29tZXIuZ2V0IFwibGFiZWxXaWR0aFwifXB4XCJcbiAgICBAZWwuc3R5bGUuaGVpZ2h0ID0gXCIje0BnLnpvb21lci5nZXQgXCJyb3dIZWlnaHRcIn1weFwiXG4gICAgQGVsLnNldEF0dHJpYnV0ZSBcImNsYXNzXCIsIFwiYmlvanNfbXNhX2xhYmVsc1wiXG5cbiAgICBpZiBALmcudmlzLmdldCBcImxhYmVsQ2hlY2tib3hcIlxuICAgICAgY2hlY2tCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwiaW5wdXRcIlxuICAgICAgY2hlY2tCb3guc2V0QXR0cmlidXRlIFwidHlwZVwiLCBcImNoZWNrYm94XCJcbiAgICAgIGNoZWNrQm94LnZhbHVlID0gQG1vZGVsLmdldCgnaWQnKVxuICAgICAgY2hlY2tCb3gubmFtZSA9IFwic2VxXCJcbiAgICAgIEBlbC5hcHBlbmRDaGlsZCBjaGVja0JveFxuXG4gICAgaWYgQC5nLnZpcy5nZXQgXCJsYWJlbElkXCJcbiAgICAgIGlkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBcInNwYW5cIlxuICAgICAgaWQudGV4dENvbnRlbnQgPSBAbW9kZWwuZ2V0IFwiaWRcIlxuICAgICAgaWQuc3R5bGUud2lkdGggPSBAZy56b29tZXIuZ2V0IFwibGFiZWxJZExlbmd0aFwiXG4gICAgICBpZC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuICAgICAgQGVsLmFwcGVuZENoaWxkIGlkXG5cbiAgICBpZiBALmcudmlzLmdldCBcImxhYmVsUGFydGl0aW9uXCJcbiAgICAgIHBhcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50IFwic3BhblwiXG4gICAgICBwYXJ0LnN0eWxlLndpZHRoID0gMTVcbiAgICAgIHBhcnQudGV4dENvbnRlbnQgPSBAbW9kZWwuZ2V0KFwicGFydGl0aW9uXCIpXG4gICAgICBwYXJ0LnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiXG4gICAgICBAZWwuYXBwZW5kQ2hpbGQgaWRcbiAgICAgIEBlbC5hcHBlbmRDaGlsZCBwYXJ0XG5cbiAgICBpZiBALmcudmlzLmdldCBcImxhYmVsTmFtZVwiXG4gICAgICBuYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBcInNwYW5cIlxuICAgICAgbmFtZS50ZXh0Q29udGVudCA9IEBtb2RlbC5nZXQoXCJuYW1lXCIpXG4gICAgICBAZWwuYXBwZW5kQ2hpbGQgbmFtZVxuXG5cbiAgICBAZWwuc3R5bGUub3ZlcmZsb3cgPSBzY3JvbGxcbiAgICBAXG5cbiAgX29uY2xpY2s6IChldnQpIC0+XG4gICAgc2VxSWQgPSBAbW9kZWwuZ2V0IFwiaWRcIlxuICAgIEBnLnRyaWdnZXIgXCJyb3c6Y2xpY2tcIiwge3NlcUlkOnNlcUlkLCBldnQ6ZXZ0fVxuXG4gIF9vbm1vdXNlaW46IChldnQpIC0+XG4gICAgc2VxSWQgPSBAbW9kZWwuZ2V0IFwiaWRcIlxuICAgIEBnLnRyaWdnZXIgXCJyb3c6bW91c2VvdXRcIiwge3NlcUlkOnNlcUlkLCBldnQ6ZXZ0fVxuXG4gIF9vbm1vdXNlb3V0OiAoZXZ0KSAtPlxuICAgIHNlcUlkID0gQG1vZGVsLmdldCBcImlkXCJcbiAgICBAZy50cmlnZ2VyIFwicm93Om1vdXNlb3V0XCIsIHtzZXFJZDpzZXFJZCwgZXZ0OmV2dH1cblxubW9kdWxlLmV4cG9ydHMgPSBMYWJlbFZpZXdcbiIsInZpZXcgPSByZXF1aXJlKFwiYmFja2JvbmUtdmlld2pcIilcbk1lbnVCdWlsZGVyID0gcmVxdWlyZSBcIi4uLy4uL21lbnUvbWVudWJ1aWxkZXJcIlxuXyA9IHJlcXVpcmUgJ3VuZGVyc2NvcmUnXG5kb20gPSByZXF1aXJlIFwiZG9tLWhlbHBlclwiXG5cbm1vZHVsZS5leHBvcnRzID0gTWV0YVZpZXcgPSB2aWV3LmV4dGVuZFxuXG4gIGNsYXNzTmFtZTogXCJiaW9qc19tc2FfbWV0YXZpZXdcIlxuXG4gIGluaXRpYWxpemU6IChkYXRhKSAtPlxuICAgIEBnID0gZGF0YS5nXG5cbiAgZXZlbnRzOlxuICAgIGNsaWNrOiBcIl9vbmNsaWNrXCJcbiAgICBtb3VzZWluOiBcIl9vbm1vdXNlaW5cIlxuICAgIG1vdXNlb3V0OiBcIl9vbm1vdXNlb3V0XCJcblxuICByZW5kZXI6IC0+XG4gICAgZG9tLnJlbW92ZUFsbENoaWxkcyBAZWxcblxuICAgIEBlbC5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuXG4gICAgd2lkdGggPSBAZy56b29tZXIuZ2V0IFwibWV0YVdpZHRoXCJcbiAgICBAZWwuc3R5bGUud2lkdGggPSB3aWR0aCAtIDVcbiAgICBAZWwuc3R5bGUucGFkZGluZ1JpZ2h0ID0gNVxuXG4gICAgIyBhZGRzIGdhcHNcbiAgICBzZXEgPSBAbW9kZWwuZ2V0KCdzZXEnKVxuICAgIGdhcHMgPSBfLnJlZHVjZSBzZXEsICgobWVtbywgYykgLT4gbWVtbysrIGlmIGMgaXMgJy0nO21lbW8pLDBcbiAgICBnYXBzID0gKGdhcHMgLyBzZXEubGVuZ3RoKS50b0ZpeGVkKDEpXG5cbiAgICAjIGFwcGVuZCBnYXAgY291bnRcbiAgICBnYXBTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAnc3BhbidcbiAgICBnYXBTcGFuLnRleHRDb250ZW50ID0gZ2Fwc1xuICAgIGdhcFNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCJcbiAgICBnYXBTcGFuLnN0eWxlLndpZHRoID0gMzVcbiAgICBAZWwuYXBwZW5kQ2hpbGQgZ2FwU3BhblxuXG4gICAgIyBpZGVudGl0eVxuICAgIGlkZW50ID0gQG1vZGVsLmdldCgnaWRlbnRpdHknKVxuICAgIGlkZW50U3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJ3NwYW4nXG4gICAgaWRlbnRTcGFuLnRleHRDb250ZW50ID0gaWRlbnQudG9GaXhlZCgyKVxuICAgIGlkZW50U3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIlxuICAgIGlkZW50U3Bhbi5zdHlsZS53aWR0aCA9IDQwXG4gICAgQGVsLmFwcGVuZENoaWxkIGlkZW50U3BhblxuXG4gICAgIyBUT0RPOiB0aGlzIG1lbnUgYnVpbGRlciBpcyBqdXN0IGFuIGV4YW1wbGUgaG93IG9uZSBjb3VsZCBjdXN0b21pemUgdGhpc1xuICAgICMgdmlld1xuICAgIG1lbnUgPSBuZXcgTWVudUJ1aWxkZXIoXCLihpdcIilcbiAgICBtZW51LmFkZE5vZGUgXCJVbmlwcm90XCIsKGUpID0+XG4gICAgICB3aW5kb3cub3BlbiBcImh0dHA6Ly9iZXRhLnVuaXByb3Qub3JnL3VuaXByb3QvUTdUMk44XCJcbiAgICBAZWwuYXBwZW5kQ2hpbGQgbWVudS5idWlsZERPTSgpXG4gICAgQGVsLndpZHRoID0gMTBcblxuICAgIEBlbC5zdHlsZS5oZWlnaHQgPSBcIiN7QGcuem9vbWVyLmdldCBcInJvd0hlaWdodFwifXB4XCJcbiAgICBAZWwuc3R5bGUuY3Vyc29yID0gXCJwb2ludGVyXCJcblxuICBfb25jbGljazogKGV2dCkgLT5cbiAgICBAZy50cmlnZ2VyIFwibWV0YTpjbGlja1wiLCB7c2VxSWQ6IEBtb2RlbC5nZXQgXCJpZFwiLCBldnQ6ZXZ0fVxuXG4gIF9vbm1vdXNlaW46IChldnQpIC0+XG4gICAgQGcudHJpZ2dlciBcIm1ldGE6bW91c2VpblwiLCB7c2VxSWQ6IEBtb2RlbC5nZXQgXCJpZFwiLCBldnQ6ZXZ0fVxuXG4gIF9vbm1vdXNlb3V0OiAoZXZ0KSAtPlxuICAgIEBnLnRyaWdnZXIgXCJtZXRhOm1vdXNlb3V0XCIsIHtzZXFJZDogQG1vZGVsLmdldCBcImlkXCIsIGV2dDpldnR9XG4iLCIvLyBHZW5lcmF0ZWQgYnkgQ29mZmVlU2NyaXB0IDEuOC4wXG52YXIgQ2x1c3RhbCwgR2VuZXJpY1JlYWRlciwgU2VxLCBTdHIsXG4gIF9faGFzUHJvcCA9IHt9Lmhhc093blByb3BlcnR5LFxuICBfX2V4dGVuZHMgPSBmdW5jdGlvbihjaGlsZCwgcGFyZW50KSB7IGZvciAodmFyIGtleSBpbiBwYXJlbnQpIHsgaWYgKF9faGFzUHJvcC5jYWxsKHBhcmVudCwga2V5KSkgY2hpbGRba2V5XSA9IHBhcmVudFtrZXldOyB9IGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfSBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7IGNoaWxkLnByb3RvdHlwZSA9IG5ldyBjdG9yKCk7IGNoaWxkLl9fc3VwZXJfXyA9IHBhcmVudC5wcm90b3R5cGU7IHJldHVybiBjaGlsZDsgfTtcblxuU3RyID0gcmVxdWlyZShcIi4vc3RyaW5nc1wiKTtcblxuR2VuZXJpY1JlYWRlciA9IHJlcXVpcmUoXCIuL2dlbmVyaWNfcmVhZGVyXCIpO1xuXG5TZXEgPSByZXF1aXJlKFwiLi9zZXFcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQ2x1c3RhbCA9IChmdW5jdGlvbihfc3VwZXIpIHtcbiAgX19leHRlbmRzKENsdXN0YWwsIF9zdXBlcik7XG5cbiAgZnVuY3Rpb24gQ2x1c3RhbCgpIHtcbiAgICByZXR1cm4gQ2x1c3RhbC5fX3N1cGVyX18uY29uc3RydWN0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIENsdXN0YWwucGFyc2UgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIGJsb2Nrc3RhdGUsIGssIGxhYmVsLCBsaW5lLCBsaW5lcywgbWF0Y2gsIHJlZ2V4LCBzZXFDb3VudGVyLCBzZXFzLCBzZXF1ZW5jZTtcbiAgICBzZXFzID0gW107XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0ZXh0KSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgICAgbGluZXMgPSB0ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lcyA9IHRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgfVxuICAgIGlmIChsaW5lc1swXS5zbGljZSgwLCA2KSA9PT0gIVwiQ0xVU1RBTFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIENMVVNUQUwgSGVhZGVyXCIpO1xuICAgIH1cbiAgICBrID0gMDtcbiAgICBibG9ja3N0YXRlID0gMTtcbiAgICBzZXFDb3VudGVyID0gMDtcbiAgICB3aGlsZSAoayA8IGxpbmVzLmxlbmd0aCkge1xuICAgICAgaysrO1xuICAgICAgbGluZSA9IGxpbmVzW2tdO1xuICAgICAgaWYgKChsaW5lID09IG51bGwpIHx8IGxpbmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGJsb2Nrc3RhdGUgPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChsaW5lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYmxvY2tzdGF0ZSA9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFN0ci5jb250YWlucyhsaW5lLCBcIipcIikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmxvY2tzdGF0ZSA9PT0gMSkge1xuICAgICAgICAgIHNlcUNvdW50ZXIgPSAwO1xuICAgICAgICAgIGJsb2Nrc3RhdGUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJlZ2V4ID0gL14oPzpcXHMqKShcXFMrKSg/OlxccyspKFxcUyspKD86XFxzKikoXFxkKikoPzpcXHMqfCQpL2c7XG4gICAgICAgIG1hdGNoID0gcmVnZXguZXhlYyhsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoICE9IG51bGwpIHtcbiAgICAgICAgICBsYWJlbCA9IG1hdGNoWzFdO1xuICAgICAgICAgIHNlcXVlbmNlID0gbWF0Y2hbMl07XG4gICAgICAgICAgaWYgKHNlcUNvdW50ZXIgPj0gc2Vxcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNlcXMucHVzaChuZXcgU2VxKHNlcXVlbmNlLCBsYWJlbCwgc2VxQ291bnRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXFzW3NlcUNvdW50ZXJdLnNlcSArPSBzZXF1ZW5jZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VxQ291bnRlcisrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGxpbmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZXFzO1xuICB9O1xuXG4gIHJldHVybiBDbHVzdGFsO1xuXG59KShHZW5lcmljUmVhZGVyKTtcbiIsIi8vIEdlbmVyYXRlZCBieSBDb2ZmZWVTY3JpcHQgMS44LjBcbm1vZHVsZS5leHBvcnRzLnBhcnNlID0gcmVxdWlyZShcIi4vcGFyc2VyXCIpO1xuXG5tb2R1bGUuZXhwb3J0cy53cml0ZXIgPSByZXF1aXJlKFwiLi93cml0ZXJcIik7XG4iLCJpZiAodHlwZW9mIGJpb2pzID09PSAndW5kZWZpbmVkJykge1xuICBiaW9qcyA9IHt9O1xufVxuaWYgKHR5cGVvZiBiaW9qcy52aXMgPT09ICd1bmRlZmluZWQnKSB7XG4gIGJpb2pzLnZpcyA9IHt9O1xufVxuLy8gdXNlIHR3byBuYW1lc3BhY2VzXG53aW5kb3cubXNhID0gYmlvanMudmlzLm1zYSA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9pbmRleCcpO1xuXG4vLyBUT0RPOiBob3cgc2hvdWxkIHRoaXMgYmUgYnVuZGxlZFxuXG5pZiAodHlwZW9mIGJpb2pzLmlvID09PSAndW5kZWZpbmVkJykge1xuICBiaW9qcy5pbyA9IHt9O1xufVxuLy8ganVzdCBidW5kbGUgdGhlIHR3byBwYXJzZXJzXG53aW5kb3cuYmlvanMuaW8uZmFzdGEgPSByZXF1aXJlKFwiYmlvanMtaW8tZmFzdGFcIik7XG53aW5kb3cuYmlvanMuaW8uY2x1c3RhbCA9IHJlcXVpcmUoXCJiaW9qcy1pby1jbHVzdGFsXCIpO1xud2luZG93LmJpb2pzLnhociA9IHJlcXVpcmUoXCJuZXRzXCIpO1xuXG4vLyBzaW11bGF0ZSBzdGFuZGFsb25lIGZsYWdcbndpbmRvdy5iaW9qc1Zpc01zYSA9IHdpbmRvdy5tc2E7XG5cbnJlcXVpcmUoJy4vYnVpbGQvbXNhLmNzcycpO1xuIiwidmFyIHJlcSA9IHJlcXVpcmUoJ3JlcXVlc3QnKVxuXG5tb2R1bGUuZXhwb3J0cyA9IE5ldHNcblxuZnVuY3Rpb24gTmV0cyh1cmksIG9wdHMsIGNiKSB7XG4gIHJlcSh1cmksIG9wdHMsIGNiKVxufSJdfQ==
8992 // this is a way how you use a bundled file parser
8993 biojs.io.clustal.read("#", function(seqs){
8996 // set your custom properties
8997 // @see: https://github.com/greenify/biojs-vis-msa/tree/master/src/g
8999 var jalviewData = JSON.parse(document.getElementById("seqData").value);
9000 opts.seqs = jalviewData['seqs'];
9002 opts.el = document.getElementById("yourDiv");
9003 opts.vis = {conserv: false, overviewbox: false, labelId: false};
9004 opts.zoomer = {alignmentHeight: 225, labelWidth: 130,labelFontsize: "13px",labelIdLength: 20, menuFontsize: "12px",menuMarginLeft: "3px", menuPadding: "3px 4px 3px 4px", menuItemFontsize: "14px", menuItemLineHeight: "14px"};
9009 var m = new msa.msa(opts);
9011 m.g.colorscheme.set("scheme", jalviewData['globalColorScheme']);
9014 jalviewData.seqs.forEach( function (seq)
9016 m.seqs.at(x++).set("features", new msa.model.featurecol(seq.features));
9019 // the menu is independent to the MSA container
9021 menuOpts.el = document.getElementById('div');
9023 var defMenu = new msa.menu.defaultmenu(menuOpts);
9024 m.addView("menu", defMenu);
9026 // call render at the end to display the whole MSA
9028 toggleMenuVisibility();
9029 toggleMenuVisibility();