10 display: inline-block;
13 vertical-align: top; }
20 white-space: nowrap; }
22 .biojs_msa_labelblock::-webkit-scrollbar, .biojs_msa_header::-webkit-scrollbar {
23 -webkit-appearance: none;
27 .biojs_msa_labelblock::-webkit-scrollbar-thumb, .biojs_msa_header::-webkit-scrollbar-thumb {
29 background-color: rgba(0, 0, 0, 0.5);
30 box-shadow: 0 0 1px rgba(255, 255, 255, 0.5); }
37 .biojs_msa_marker span {
40 .biojs_msa_menubar .biojs_msa_menubar_alink {
42 background-image: -webkit-linear-gradient(top, #3498db, #2980b9);
43 background-image: -moz-linear-gradient(top, #3498db, #2980b9);
44 background-image: -ms-linear-gradient(top, #3498db, #2980b9);
45 background-image: -o-linear-gradient(top, #3498db, #2980b9);
46 background-image: linear-gradient(to bottom, #3498db, #2980b9);
47 -webkit-border-radius: 28;
48 -moz-border-radius: 28;
52 padding: 3px 10px 3px 10px;
54 text-decoration: none; }
56 .biojs_msa_menubar .biojs_msa_menubar_alink:hover {
59 /* jquery dropdown CSS */
65 .dropdown .dropdown-menu,
66 .dropdown .dropdown-panel {
71 border: solid 1px #DDD;
72 border: solid 1px rgba(0, 0, 0, 0.2);
74 box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
79 .dropdown .dropdown-panel {
82 .dropdown.dropdown-scroll .dropdown-menu,
83 .dropdown.dropdown-scroll .dropdown-panel {
87 .dropdown .dropdown-menu LI {
93 .dropdown .dropdown-menu LI,
94 .dropdown .dropdown-menu LABEL {
97 text-decoration: none;
100 white-space: nowrap; }
102 .dropdown .dropdown-menu LI:hover,
103 .dropdown .dropdown-menu LABEL:hover {
104 background-color: #08C;
108 .dropdown .dropdown-menu .dropdown-divider {
110 border-top: solid 1px #E5E5E5;
115 <header><title>BioJS viewer</title></header>
119 <!-- include MSA js + css -->
120 <!-- <script src="https://s3-eu-west-1.amazonaws.com/biojs/msa/latest/msa.js"></script> -->
121 <!-- <link type=text/css rel=stylesheet href=https://s3-eu-west-1.amazonaws.com/biojs/msa/latest/msa.css /> -->
124 <div id="menuDiv"></div>
125 <div id="yourDiv">press "Run with JS"</div>
126 <input type='hidden' id='seqData' name='seqData' value='#sequenceData#'/>
129 <div> 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.<div>
131 <div> 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.
135 <button onclick="javascipt:openJalviewUsingCurrentUrl();">Launch in Jalview</button>
143 function openJalviewUsingCurrentUrl(){
144 var url = "http://webservices.compbio.dundee.ac.uk:38080/jalviewServlet/services/launchAppDev";
145 var myForm = document.createElement("form");
148 var myInput = document.createElement("input") ;
149 myInput.setAttribute("name", "jvm-max-heap") ;
150 myInput.setAttribute("value", "2G");
151 myForm.appendChild(myInput) ;
153 var myInput1 = document.createElement("input") ;
154 myInput1.setAttribute("name", "open") ;
155 myInput1.setAttribute("value", document.URL);
156 myForm.appendChild(myInput1) ;
159 document.body.appendChild(myForm) ;
161 document.body.removeChild(myForm) ;
165 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){
166 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;
167 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/cssify":48}],2:[function(require,module,exports){
168 module.exports = require("./src/index");
170 },{"./src/index":72}],3:[function(require,module,exports){
171 var _ = require('underscore');
172 var viewType = require("backbone-viewj");
175 module.exports = pluginator = viewType.extend({
176 renderSubviews: function() {
178 var el = document.createElement("div");
180 var frag = document.createDocumentFragment();
181 if (oldEl.parentNode != null) {
182 oldEl.parentNode.replaceChild(this.el, oldEl);
184 var views = this._views();
185 var viewsSorted = _.sortBy(views, function(el) {
189 for (var i = 0; i < viewsSorted.length; i++) {
190 view = viewsSorted[i];
194 frag.appendChild(node);
197 el.appendChild(frag);
200 addView: function(key, view) {
201 var views = this._views();
203 throw "Invalid plugin. ";
205 if (view.ordering == null) {
208 return views[key] = view;
210 removeViews: function() {
212 var views = this._views();
215 el.undelegateEvents();
217 if (el.removeViews != null) {
222 return this.views = {};
224 removeView: function(key) {
225 var views = this._views();
227 return delete views[key];
229 getView: function(key) {
230 var views = this._views();
235 return viewType.prototype.remove.apply(this);
238 if (this.views == null) {
245 },{"backbone-viewj":10,"underscore":59}],4:[function(require,module,exports){
248 // (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
249 // Backbone may be freely distributed under the MIT license.
250 // For all details and documentation:
251 // http://backbonejs.org
253 var Events = require("backbone-events-standalone");
254 var extend = require("backbone-extend-standalone");
255 var _ = require("underscore");
256 var Model = require("./model");
258 // Create local references to array methods we'll want to use later.
260 var slice = array.slice;
262 // Backbone.Collection
263 // -------------------
265 // If models tend to represent a single row of data, a Backbone Collection is
266 // more analogous to a table full of data ... or a small slice or page of that
267 // table, or a collection of rows that belong together for a particular reason
268 // -- all of the messages in this particular folder, all of the documents
269 // belonging to this particular author, and so on. Collections maintain
270 // indexes of their models, both in order, and for lookup by `id`.
272 // Create a new **Collection**, perhaps to contain a specific type of `model`.
273 // If a `comparator` is specified, the Collection will maintain
274 // its models in sort order, as they're added and removed.
275 var Collection = function(models, options) {
276 options || (options = {});
277 if (options.model) this.model = options.model;
278 if (options.comparator !== void 0) this.comparator = options.comparator;
280 this.initialize.apply(this, arguments);
281 if (models) this.reset(models, _.extend({silent: true}, options));
284 // Default options for `Collection#set`.
285 var setOptions = {add: true, remove: true, merge: true};
286 var addOptions = {add: true, remove: false};
288 // Define the Collection's inheritable methods.
289 _.extend(Collection.prototype, Events, {
291 // The default model for a collection is just a **Backbone.Model**.
292 // This should be overridden in most cases.
295 // Initialize is an empty function by default. Override it with your own
296 // initialization logic.
297 initialize: function(){},
299 // The JSON representation of a Collection is an array of the
300 // models' attributes.
301 toJSON: function(options) {
302 return this.map(function(model){ return model.toJSON(options); });
305 // Proxy `Backbone.sync` by default.
307 return Backbone.sync.apply(this, arguments);
310 // Add a model, or list of models to the set.
311 add: function(models, options) {
312 return this.set(models, _.extend({merge: false}, options, addOptions));
315 // Remove a model, or a list of models from the set.
316 remove: function(models, options) {
317 var singular = !_.isArray(models);
318 models = singular ? [models] : _.clone(models);
319 options || (options = {});
320 for (var i = 0, length = models.length; i < length; i++) {
321 var model = models[i] = this.get(models[i]);
322 if (!model) continue;
323 var id = this.modelId(model.attributes);
324 if (id != null) delete this._byId[id];
325 delete this._byId[model.cid];
326 var index = this.indexOf(model);
327 this.models.splice(index, 1);
329 if (!options.silent) {
330 options.index = index;
331 model.trigger('remove', model, this, options);
333 this._removeReference(model, options);
335 return singular ? models[0] : models;
338 // Update a collection by `set`-ing a new list of models, adding new ones,
339 // removing models that are no longer present, and merging models that
340 // already exist in the collection, as necessary. Similar to **Model#set**,
341 // the core operation for updating the data contained by the collection.
342 set: function(models, options) {
343 options = _.defaults({}, options, setOptions);
344 if (options.parse) models = this.parse(models, options);
345 var singular = !_.isArray(models);
346 models = singular ? (models ? [models] : []) : models.slice();
347 var id, model, attrs, existing, sort;
349 var sortable = this.comparator && (at == null) && options.sort !== false;
350 var sortAttr = _.isString(this.comparator) ? this.comparator : null;
351 var toAdd = [], toRemove = [], modelMap = {};
352 var add = options.add, merge = options.merge, remove = options.remove;
353 var order = !sortable && add && remove ? [] : false;
355 // Turn bare objects into model references, and prevent invalid models
357 for (var i = 0, length = models.length; i < length; i++) {
360 // If a duplicate is found, prevent it from being added and
361 // optionally merge it into the existing model.
362 if (existing = this.get(attrs)) {
363 if (remove) modelMap[existing.cid] = true;
364 if (merge && attrs !== existing) {
365 attrs = this._isModel(attrs) ? attrs.attributes : attrs;
366 if (options.parse) attrs = existing.parse(attrs, options);
367 existing.set(attrs, options);
368 if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;
370 models[i] = existing;
372 // If this is a new, valid model, push it to the `toAdd` list.
374 model = models[i] = this._prepareModel(attrs, options);
375 if (!model) continue;
377 this._addReference(model, options);
380 // Do not add multiple models with the same `id`.
381 model = existing || model;
382 if (!model) continue;
383 id = this.modelId(model.attributes);
384 if (order && (model.isNew() || !modelMap[id])) order.push(model);
388 // Remove nonexistent models if appropriate.
390 for (var i = 0, length = this.length; i < length; i++) {
391 if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model);
393 if (toRemove.length) this.remove(toRemove, options);
396 // See if sorting is needed, update `length` and splice in new models.
397 if (toAdd.length || (order && order.length)) {
398 if (sortable) sort = true;
399 this.length += toAdd.length;
401 for (var i = 0, length = toAdd.length; i < length; i++) {
402 this.models.splice(at + i, 0, toAdd[i]);
405 if (order) this.models.length = 0;
406 var orderedModels = order || toAdd;
407 for (var i = 0, length = orderedModels.length; i < length; i++) {
408 this.models.push(orderedModels[i]);
413 // Silently sort the collection if appropriate.
414 if (sort) this.sort({silent: true});
416 // Unless silenced, it's time to fire all appropriate add/sort events.
417 if (!options.silent) {
418 var addOpts = at != null ? _.clone(options) : options;
419 for (var i = 0, length = toAdd.length; i < length; i++) {
420 if (at != null) addOpts.index = at + i;
421 (model = toAdd[i]).trigger('add', model, this, addOpts);
423 if (sort || (order && order.length)) this.trigger('sort', this, options);
426 // Return the added (or merged) model (or models).
427 return singular ? models[0] : models;
430 // When you have more items than you want to add or remove individually,
431 // you can reset the entire set with a new list of models, without firing
432 // any granular `add` or `remove` events. Fires `reset` when finished.
433 // Useful for bulk operations and optimizations.
434 reset: function(models, options) {
435 options || (options = {});
436 for (var i = 0, length = this.models.length; i < length; i++) {
437 this._removeReference(this.models[i], options);
439 options.previousModels = this.models;
441 models = this.add(models, _.extend({silent: true}, options));
442 if (!options.silent) this.trigger('reset', this, options);
446 // Add a model to the end of the collection.
447 push: function(model, options) {
448 return this.add(model, _.extend({at: this.length}, options));
451 // Remove a model from the end of the collection.
452 pop: function(options) {
453 var model = this.at(this.length - 1);
454 this.remove(model, options);
458 // Add a model to the beginning of the collection.
459 unshift: function(model, options) {
460 return this.add(model, _.extend({at: 0}, options));
463 // Remove a model from the beginning of the collection.
464 shift: function(options) {
465 var model = this.at(0);
466 this.remove(model, options);
470 // Slice out a sub-array of models from the collection.
472 return slice.apply(this.models, arguments);
475 // Get a model from the set by id.
477 if (obj == null) return void 0;
478 var id = this.modelId(this._isModel(obj) ? obj.attributes : obj);
479 return this._byId[obj] || this._byId[id] || this._byId[obj.cid];
482 // Get the model at the given index.
483 at: function(index) {
484 if (index < 0) index += this.length;
485 return this.models[index];
488 // Return models with matching attributes. Useful for simple cases of
490 where: function(attrs, first) {
491 if (_.isEmpty(attrs)) return first ? void 0 : [];
492 return this[first ? 'find' : 'filter'](function(model) {
493 for (var key in attrs) {
494 if (attrs[key] !== model.get(key)) return false;
500 // Return the first model with matching attributes. Useful for simple cases
502 findWhere: function(attrs) {
503 return this.where(attrs, true);
506 // Force the collection to re-sort itself. You don't need to call this under
507 // normal circumstances, as the set will maintain sort order as each item
509 sort: function(options) {
510 if (!this.comparator) throw new Error('Cannot sort a set without a comparator');
511 options || (options = {});
513 // Run sort based on type of `comparator`.
514 if (_.isString(this.comparator) || this.comparator.length === 1) {
515 this.models = this.sortBy(this.comparator, this);
517 this.models.sort(_.bind(this.comparator, this));
520 if (!options.silent) this.trigger('sort', this, options);
524 // Pluck an attribute from each model in the collection.
525 pluck: function(attr) {
526 return _.invoke(this.models, 'get', attr);
529 // Fetch the default set of models for this collection, resetting the
530 // collection when they arrive. If `reset: true` is passed, the response
531 // data will be passed through the `reset` method instead of `set`.
532 fetch: function(options) {
533 options = options ? _.clone(options) : {};
534 if (options.parse === void 0) options.parse = true;
535 var success = options.success;
536 var collection = this;
537 options.success = function(resp) {
538 var method = options.reset ? 'reset' : 'set';
539 collection[method](resp, options);
540 if (success) success(collection, resp, options);
541 collection.trigger('sync', collection, resp, options);
543 wrapError(this, options);
544 return this.sync('read', this, options);
547 // Create a new instance of a model in this collection. Add the model to the
548 // collection immediately, unless `wait: true` is passed, in which case we
549 // wait for the server to agree.
550 create: function(model, options) {
551 options = options ? _.clone(options) : {};
552 if (!(model = this._prepareModel(model, options))) return false;
553 if (!options.wait) this.add(model, options);
554 var collection = this;
555 var success = options.success;
556 options.success = function(model, resp) {
557 if (options.wait) collection.add(model, options);
558 if (success) success(model, resp, options);
560 model.save(null, options);
564 // **parse** converts a response into a list of models to be added to the
565 // collection. The default implementation is just to pass it through.
566 parse: function(resp, options) {
570 // Create a new collection with an identical list of models as this one.
572 return new this.constructor(this.models, {
574 comparator: this.comparator
578 // Define how to uniquely identify models in the collection.
579 modelId: function (attrs) {
580 return attrs[this.model.prototype.idAttribute || 'id'];
583 // Private method to reset all internal state. Called when the collection
584 // is first initialized or reset.
591 // Prepare a hash of attributes (or other model) to be added to this
593 _prepareModel: function(attrs, options) {
594 if (this._isModel(attrs)) {
595 if (!attrs.collection) attrs.collection = this;
598 options = options ? _.clone(options) : {};
599 options.collection = this;
600 var model = new this.model(attrs, options);
601 if (!model.validationError) return model;
602 this.trigger('invalid', this, model.validationError, options);
606 // Method for checking whether an object should be considered a model for
607 // the purposes of adding to the collection.
608 _isModel: function (model) {
609 return model instanceof Model;
612 // Internal method to create a model's ties to a collection.
613 _addReference: function(model, options) {
614 this._byId[model.cid] = model;
615 var id = this.modelId(model.attributes);
616 if (id != null) this._byId[id] = model;
617 model.on('all', this._onModelEvent, this);
620 // Internal method to sever a model's ties to a collection.
621 _removeReference: function(model, options) {
622 if (this === model.collection) delete model.collection;
623 model.off('all', this._onModelEvent, this);
626 // Internal method called every time a model in the set fires an event.
627 // Sets need to update their indexes when models change ids. All other
628 // events simply proxy through. "add" and "remove" events that originate
629 // in other collections are ignored.
630 _onModelEvent: function(event, model, collection, options) {
631 if ((event === 'add' || event === 'remove') && collection !== this) return;
632 if (event === 'destroy') this.remove(model, options);
633 if (event === 'change') {
634 var prevId = this.modelId(model.previousAttributes());
635 var id = this.modelId(model.attributes);
637 if (prevId != null) delete this._byId[prevId];
638 if (id != null) this._byId[id] = model;
641 this.trigger.apply(this, arguments);
646 // Underscore methods that we want to implement on the Collection.
647 // 90% of the core usefulness of Backbone Collections is actually implemented
649 var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',
650 'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',
651 'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',
652 'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',
653 'tail', 'drop', 'last', 'without', 'difference', 'indexOf', 'shuffle',
654 'lastIndexOf', 'isEmpty', 'chain', 'sample', 'partition'];
656 // Mix in each Underscore method as a proxy to `Collection#models`.
657 _.each(methods, function(method) {
658 if (!_[method]) return;
659 Collection.prototype[method] = function() {
660 var args = slice.call(arguments);
661 args.unshift(this.models);
662 return _[method].apply(_, args);
666 // Underscore methods that take a property name as an argument.
667 var attributeMethods = ['groupBy', 'countBy', 'sortBy', 'indexBy'];
669 // Use attributes instead of properties.
670 _.each(attributeMethods, function(method) {
671 if (!_[method]) return;
672 Collection.prototype[method] = function(value, context) {
673 var iterator = _.isFunction(value) ? value : function(model) {
674 return model.get(value);
676 return _[method](this.models, iterator, context);
681 Collection.extend = extend;
682 module.exports = Collection;
684 },{"./model":6,"backbone-events-standalone":8,"backbone-extend-standalone":9,"underscore":59}],5:[function(require,module,exports){
685 module.exports.Model = require("./model");
686 module.exports.Collection = require("./collection");
687 module.exports.Events = require("backbone-events-standalone");
688 module.exports.extend = require("backbone-extend-standalone");
690 },{"./collection":4,"./model":6,"backbone-events-standalone":8,"backbone-extend-standalone":9}],6:[function(require,module,exports){
693 // (c) 2010-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
694 // Backbone may be freely distributed under the MIT license.
695 // For all details and documentation:
696 // http://backbonejs.org
698 var Events = require("backbone-events-standalone");
699 var extend = require("backbone-extend-standalone");
700 var _ = require("underscore");
705 // Backbone **Models** are the basic data object in the framework --
706 // frequently representing a row in a table in a database on your server.
707 // A discrete chunk of data and a bunch of useful, related methods for
708 // performing computations and transformations on that data.
710 // Create a new model with the specified attributes. A client id (`cid`)
711 // is automatically generated and assigned for you.
712 var Model = function(attributes, options) {
713 var attrs = attributes || {};
714 options || (options = {});
715 this.cid = _.uniqueId('c');
716 this.attributes = {};
717 if (options.collection) this.collection = options.collection;
718 if (options.parse) attrs = this.parse(attrs, options) || {};
719 attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
720 this.set(attrs, options);
722 this.initialize.apply(this, arguments);
725 // Attach all inheritable methods to the Model prototype.
726 _.extend(Model.prototype, Events, {
728 // A hash of attributes whose current and previous value differ.
731 // The value returned during the last failed validation.
732 validationError: null,
734 // The default name for the JSON `id` attribute is `"id"`. MongoDB and
735 // CouchDB users may want to set this to `"_id"`.
738 // Initialize is an empty function by default. Override it with your own
739 // initialization logic.
740 initialize: function(){},
742 // Return a copy of the model's `attributes` object.
743 toJSON: function(options) {
744 return _.clone(this.attributes);
747 // Proxy `Backbone.sync` by default -- but override this if you need
748 // custom syncing semantics for *this* particular model.
750 return Backbone.sync.apply(this, arguments);
753 // Get the value of an attribute.
754 get: function(attr) {
755 return this.attributes[attr];
758 // Get the HTML-escaped value of an attribute.
759 escape: function(attr) {
760 return _.escape(this.get(attr));
763 // Returns `true` if the attribute contains a value that is not null
765 has: function(attr) {
766 return this.get(attr) != null;
769 // Set a hash of model attributes on the object, firing `"change"`. This is
770 // the core primitive operation of a model, updating the data and notifying
771 // anyone who needs to know about the change in state. The heart of the beast.
772 set: function(key, val, options) {
773 var attr, attrs, unset, changes, silent, changing, prev, current;
774 if (key == null) return this;
776 // Handle both `"key", value` and `{key: value}` -style arguments.
777 if (typeof key === 'object') {
781 (attrs = {})[key] = val;
784 options || (options = {});
787 if (!this._validate(attrs, options)) return false;
789 // Extract attributes and options.
790 unset = options.unset;
791 silent = options.silent;
793 changing = this._changing;
794 this._changing = true;
797 this._previousAttributes = _.clone(this.attributes);
800 current = this.attributes, prev = this._previousAttributes;
802 // Check for changes of `id`.
803 if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];
805 // For each `set` attribute, update or delete the current value.
806 for (attr in attrs) {
808 if (!_.isEqual(current[attr], val)) changes.push(attr);
809 if (!_.isEqual(prev[attr], val)) {
810 this.changed[attr] = val;
812 delete this.changed[attr];
814 unset ? delete current[attr] : current[attr] = val;
817 // Trigger all relevant attribute changes.
819 if (changes.length) this._pending = options;
820 for (var i = 0, length = changes.length; i < length; i++) {
821 this.trigger('change:' + changes[i], this, current[changes[i]], options);
825 // You might be wondering why there's a `while` loop here. Changes can
826 // be recursively nested within `"change"` events.
827 if (changing) return this;
829 while (this._pending) {
830 options = this._pending;
831 this._pending = false;
832 this.trigger('change', this, options);
835 this._pending = false;
836 this._changing = false;
840 // Remove an attribute from the model, firing `"change"`. `unset` is a noop
841 // if the attribute doesn't exist.
842 unset: function(attr, options) {
843 return this.set(attr, void 0, _.extend({}, options, {unset: true}));
846 // Clear all attributes on the model, firing `"change"`.
847 clear: function(options) {
849 for (var key in this.attributes) attrs[key] = void 0;
850 return this.set(attrs, _.extend({}, options, {unset: true}));
853 // Determine if the model has changed since the last `"change"` event.
854 // If you specify an attribute name, determine if that attribute has changed.
855 hasChanged: function(attr) {
856 if (attr == null) return !_.isEmpty(this.changed);
857 return _.has(this.changed, attr);
860 // Return an object containing all the attributes that have changed, or
861 // false if there are no changed attributes. Useful for determining what
862 // parts of a view need to be updated and/or what attributes need to be
863 // persisted to the server. Unset attributes will be set to undefined.
864 // You can also pass an attributes object to diff against the model,
865 // determining if there *would be* a change.
866 changedAttributes: function(diff) {
867 if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;
868 var val, changed = false;
869 var old = this._changing ? this._previousAttributes : this.attributes;
870 for (var attr in diff) {
871 if (_.isEqual(old[attr], (val = diff[attr]))) continue;
872 (changed || (changed = {}))[attr] = val;
877 // Get the previous value of an attribute, recorded at the time the last
878 // `"change"` event was fired.
879 previous: function(attr) {
880 if (attr == null || !this._previousAttributes) return null;
881 return this._previousAttributes[attr];
884 // Get all of the attributes of the model at the time of the previous
886 previousAttributes: function() {
887 return _.clone(this._previousAttributes);
890 // Fetch the model from the server. If the server's representation of the
891 // model differs from its current attributes, they will be overridden,
892 // triggering a `"change"` event.
893 fetch: function(options) {
894 options = options ? _.clone(options) : {};
895 if (options.parse === void 0) options.parse = true;
897 var success = options.success;
898 options.success = function(resp) {
899 if (!model.set(model.parse(resp, options), options)) return false;
900 if (success) success(model, resp, options);
901 model.trigger('sync', model, resp, options);
903 wrapError(this, options);
904 return this.sync('read', this, options);
907 // Set a hash of model attributes, and sync the model to the server.
908 // If the server returns an attributes hash that differs, the model's
909 // state will be `set` again.
910 save: function(key, val, options) {
911 var attrs, method, xhr, attributes = this.attributes;
913 // Handle both `"key", value` and `{key: value}` -style arguments.
914 if (key == null || typeof key === 'object') {
918 (attrs = {})[key] = val;
921 options = _.extend({validate: true}, options);
923 // If we're not waiting and attributes exist, save acts as
924 // `set(attr).save(null, opts)` with validation. Otherwise, check if
925 // the model will be valid when the attributes, if any, are set.
926 if (attrs && !options.wait) {
927 if (!this.set(attrs, options)) return false;
929 if (!this._validate(attrs, options)) return false;
932 // Set temporary attributes if `{wait: true}`.
933 if (attrs && options.wait) {
934 this.attributes = _.extend({}, attributes, attrs);
937 // After a successful server-side save, the client is (optionally)
938 // updated with the server-side state.
939 if (options.parse === void 0) options.parse = true;
941 var success = options.success;
942 options.success = function(resp) {
943 // Ensure attributes are restored during synchronous saves.
944 model.attributes = attributes;
945 var serverAttrs = model.parse(resp, options);
946 if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);
947 if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {
950 if (success) success(model, resp, options);
951 model.trigger('sync', model, resp, options);
953 wrapError(this, options);
955 method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');
956 if (method === 'patch' && !options.attrs) options.attrs = attrs;
957 xhr = this.sync(method, this, options);
959 // Restore attributes.
960 if (attrs && options.wait) this.attributes = attributes;
965 // Destroy this model on the server if it was already persisted.
966 // Optimistically removes the model from its collection, if it has one.
967 // If `wait: true` is passed, waits for the server to respond before removal.
968 destroy: function(options) {
969 options = options ? _.clone(options) : {};
971 var success = options.success;
973 var destroy = function() {
974 model.stopListening();
975 model.trigger('destroy', model, model.collection, options);
978 options.success = function(resp) {
979 if (options.wait || model.isNew()) destroy();
980 if (success) success(model, resp, options);
981 if (!model.isNew()) model.trigger('sync', model, resp, options);
988 wrapError(this, options);
990 var xhr = this.sync('delete', this, options);
991 if (!options.wait) destroy();
995 // Default URL for the model's representation on the server -- if you're
996 // using Backbone's restful methods, override this to change the endpoint
997 // that will be called.
1000 _.result(this, 'urlRoot') ||
1001 _.result(this.collection, 'url') ||
1003 if (this.isNew()) return base;
1004 return base.replace(/([^\/])$/, '$1/') + encodeURIComponent(this.id);
1007 // **parse** converts a response into the hash of attributes to be `set` on
1008 // the model. The default implementation is just to pass the response along.
1009 parse: function(resp, options) {
1013 // Create a new model with identical attributes to this one.
1015 return new this.constructor(this.attributes);
1018 // A model is new if it has never been saved to the server, and lacks an id.
1020 return !this.has(this.idAttribute);
1023 // Check if the model is currently in a valid state.
1024 isValid: function(options) {
1025 return this._validate({}, _.extend(options || {}, { validate: true }));
1028 // Run validation against the next complete set of model attributes,
1029 // returning `true` if all is well. Otherwise, fire an `"invalid"` event.
1030 _validate: function(attrs, options) {
1031 if (!options.validate || !this.validate) return true;
1032 attrs = _.extend({}, this.attributes, attrs);
1033 var error = this.validationError = this.validate(attrs, options) || null;
1034 if (!error) return true;
1035 this.trigger('invalid', this, error, _.extend(options, {validationError: error}));
1041 // Underscore methods that we want to implement on the Model.
1042 var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit', 'chain', 'isEmpty'];
1044 // Mix in each Underscore method as a proxy to `Model#attributes`.
1045 _.each(modelMethods, function(method) {
1046 if (!_[method]) return;
1047 Model.prototype[method] = function() {
1048 var args = slice.call(arguments);
1049 args.unshift(this.attributes);
1050 return _[method].apply(_, args);
1054 // setup inheritance
1055 Model.extend = extend;
1056 module.exports = Model;
1058 },{"backbone-events-standalone":8,"backbone-extend-standalone":9,"underscore":59}],7:[function(require,module,exports){
1060 * Standalone extraction of Backbone.Events, no external dependency required.
1061 * Degrades nicely when Backone/underscore are already available in the current
1064 * Note that docs suggest to use underscore's `_.extend()` method to add Events
1065 * support to some given object. A `mixin()` method has been added to the Events
1066 * prototype to avoid using underscore for that sole purpose:
1068 * var myEventEmitter = BackboneEvents.mixin({});
1070 * Or for a function constructor:
1072 * function MyConstructor(){}
1073 * MyConstructor.prototype.foo = function(){}
1074 * BackboneEvents.mixin(MyConstructor.prototype);
1076 * (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.
1077 * (c) 2013 Nicolas Perriault
1079 /* global exports:true, define, module */
1083 nativeForEach = Array.prototype.forEach,
1084 hasOwnProperty = Object.prototype.hasOwnProperty,
1085 slice = Array.prototype.slice,
1088 // Returns a partial implementation matching the minimal API subset required
1089 // by Backbone.Events
1090 function miniscore() {
1092 keys: Object.keys || function (obj) {
1093 if (typeof obj !== "object" && typeof obj !== "function" || obj === null) {
1094 throw new TypeError("keys() called on a non-object");
1098 if (obj.hasOwnProperty(key)) {
1099 keys[keys.length] = key;
1105 uniqueId: function(prefix) {
1106 var id = ++idCounter + '';
1107 return prefix ? prefix + id : id;
1110 has: function(obj, key) {
1111 return hasOwnProperty.call(obj, key);
1114 each: function(obj, iterator, context) {
1115 if (obj == null) return;
1116 if (nativeForEach && obj.forEach === nativeForEach) {
1117 obj.forEach(iterator, context);
1118 } else if (obj.length === +obj.length) {
1119 for (var i = 0, l = obj.length; i < l; i++) {
1120 if (iterator.call(context, obj[i], i, obj) === breaker) return;
1123 for (var key in obj) {
1124 if (this.has(obj, key)) {
1125 if (iterator.call(context, obj[key], key, obj) === breaker) return;
1131 once: function(func) {
1132 var ran = false, memo;
1134 if (ran) return memo;
1136 memo = func.apply(this, arguments);
1144 var _ = miniscore(), Events;
1149 // A module that can be mixed in to *any object* in order to provide it with
1150 // custom events. You may bind with `on` or remove with `off` callback
1151 // functions to an event; `trigger`-ing an event fires all callbacks in
1155 // _.extend(object, Backbone.Events);
1156 // object.on('expand', function(){ alert('expanded'); });
1157 // object.trigger('expand');
1161 // Bind an event to a `callback` function. Passing `"all"` will bind
1162 // the callback to all events fired.
1163 on: function(name, callback, context) {
1164 if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
1165 this._events || (this._events = {});
1166 var events = this._events[name] || (this._events[name] = []);
1167 events.push({callback: callback, context: context, ctx: context || this});
1171 // Bind an event to only be triggered a single time. After the first time
1172 // the callback is invoked, it will be removed.
1173 once: function(name, callback, context) {
1174 if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;
1176 var once = _.once(function() {
1177 self.off(name, once);
1178 callback.apply(this, arguments);
1180 once._callback = callback;
1181 return this.on(name, once, context);
1184 // Remove one or many callbacks. If `context` is null, removes all
1185 // callbacks with that function. If `callback` is null, removes all
1186 // callbacks for the event. If `name` is null, removes all bound
1187 // callbacks for all events.
1188 off: function(name, callback, context) {
1189 var retain, ev, events, names, i, l, j, k;
1190 if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;
1191 if (!name && !callback && !context) {
1196 names = name ? [name] : _.keys(this._events);
1197 for (i = 0, l = names.length; i < l; i++) {
1199 if (events = this._events[name]) {
1200 this._events[name] = retain = [];
1201 if (callback || context) {
1202 for (j = 0, k = events.length; j < k; j++) {
1204 if ((callback && callback !== ev.callback && callback !== ev.callback._callback) ||
1205 (context && context !== ev.context)) {
1210 if (!retain.length) delete this._events[name];
1217 // Trigger one or many events, firing all bound callbacks. Callbacks are
1218 // passed the same arguments as `trigger` is, apart from the event name
1219 // (unless you're listening on `"all"`, which will cause your callback to
1220 // receive the true name of the event as the first argument).
1221 trigger: function(name) {
1222 if (!this._events) return this;
1223 var args = slice.call(arguments, 1);
1224 if (!eventsApi(this, 'trigger', name, args)) return this;
1225 var events = this._events[name];
1226 var allEvents = this._events.all;
1227 if (events) triggerEvents(events, args);
1228 if (allEvents) triggerEvents(allEvents, arguments);
1232 // Tell this object to stop listening to either specific events ... or
1233 // to every object it's currently listening to.
1234 stopListening: function(obj, name, callback) {
1235 var listeners = this._listeners;
1236 if (!listeners) return this;
1237 var deleteListener = !name && !callback;
1238 if (typeof name === 'object') callback = this;
1239 if (obj) (listeners = {})[obj._listenerId] = obj;
1240 for (var id in listeners) {
1241 listeners[id].off(name, callback, this);
1242 if (deleteListener) delete this._listeners[id];
1249 // Regular expression used to split event strings.
1250 var eventSplitter = /\s+/;
1252 // Implement fancy features of the Events API such as multiple event
1253 // names `"change blur"` and jQuery-style event maps `{change: action}`
1254 // in terms of the existing API.
1255 var eventsApi = function(obj, action, name, rest) {
1256 if (!name) return true;
1258 // Handle event maps.
1259 if (typeof name === 'object') {
1260 for (var key in name) {
1261 obj[action].apply(obj, [key, name[key]].concat(rest));
1266 // Handle space separated event names.
1267 if (eventSplitter.test(name)) {
1268 var names = name.split(eventSplitter);
1269 for (var i = 0, l = names.length; i < l; i++) {
1270 obj[action].apply(obj, [names[i]].concat(rest));
1278 // A difficult-to-believe, but optimized internal dispatch function for
1279 // triggering events. Tries to keep the usual cases speedy (most internal
1280 // Backbone events have 3 arguments).
1281 var triggerEvents = function(events, args) {
1282 var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
1283 switch (args.length) {
1284 case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;
1285 case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;
1286 case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;
1287 case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;
1288 default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
1292 var listenMethods = {listenTo: 'on', listenToOnce: 'once'};
1294 // Inversion-of-control versions of `on` and `once`. Tell *this* object to
1295 // listen to an event in another object ... keeping track of what it's
1297 _.each(listenMethods, function(implementation, method) {
1298 Events[method] = function(obj, name, callback) {
1299 var listeners = this._listeners || (this._listeners = {});
1300 var id = obj._listenerId || (obj._listenerId = _.uniqueId('l'));
1301 listeners[id] = obj;
1302 if (typeof name === 'object') callback = this;
1303 obj[implementation](name, callback, this);
1308 // Aliases for backwards compatibility.
1309 Events.bind = Events.on;
1310 Events.unbind = Events.off;
1313 Events.mixin = function(proto) {
1314 var exports = ['on', 'once', 'off', 'trigger', 'stopListening', 'listenTo',
1315 'listenToOnce', 'bind', 'unbind'];
1316 _.each(exports, function(name) {
1317 proto[name] = this[name];
1322 // Export Events as BackboneEvents depending on current context
1323 if (typeof define === "function") {
1327 } else if (typeof exports !== 'undefined') {
1328 if (typeof module !== 'undefined' && module.exports) {
1329 exports = module.exports = Events;
1331 exports.BackboneEvents = Events;
1333 root.BackboneEvents = Events;
1337 },{}],8:[function(require,module,exports){
1338 module.exports = require('./backbone-events-standalone');
1340 },{"./backbone-events-standalone":7}],9:[function(require,module,exports){
1341 (function (definition) {
1342 if (typeof exports === "object") {
1343 module.exports = definition();
1345 else if (typeof define === 'function' && define.amd) {
1349 window.BackboneExtend = definition();
1356 has: function (obj, key) {
1357 return Object.prototype.hasOwnProperty.call(obj, key);
1360 extend: function(obj) {
1361 for (var i=1; i<arguments.length; ++i) {
1362 var source = arguments[i];
1364 for (var prop in source) {
1365 obj[prop] = source[prop];
1373 /// Following code is pasted from Backbone.js ///
1375 // Helper function to correctly set up the prototype chain, for subclasses.
1376 // Similar to `goog.inherits`, but uses a hash of prototype properties and
1377 // class properties to be extended.
1378 var extend = function(protoProps, staticProps) {
1382 // The constructor function for the new subclass is either defined by you
1383 // (the "constructor" property in your `extend` definition), or defaulted
1384 // by us to simply call the parent's constructor.
1385 if (protoProps && _.has(protoProps, 'constructor')) {
1386 child = protoProps.constructor;
1388 child = function(){ return parent.apply(this, arguments); };
1391 // Add static properties to the constructor function, if supplied.
1392 _.extend(child, parent, staticProps);
1394 // Set the prototype chain to inherit from `parent`, without calling
1395 // `parent`'s constructor function.
1396 var Surrogate = function(){ this.constructor = child; };
1397 Surrogate.prototype = parent.prototype;
1398 child.prototype = new Surrogate();
1400 // Add prototype properties (instance properties) to the subclass,
1402 if (protoProps) _.extend(child.prototype, protoProps);
1404 // Set a convenience property in case the parent's prototype is needed
1406 child.__super__ = parent.prototype;
1411 // Expose the extend function
1415 },{}],10:[function(require,module,exports){
1416 // this is the extracted view model from backbone
1417 // note that we inject jbone as jquery replacment
1418 // (and underscore directly)
1420 // Views are almost more convention than they are actual code.
1425 var _ = require("underscore");
1426 var Events = require("backbone-events-standalone");
1427 var extend = require("backbone-extend-standalone");
1428 var $ = require('jbone');
1430 // Backbone Views are almost more convention than they are actual code. A View
1431 // is simply a JavaScript object that represents a logical chunk of UI in the
1432 // DOM. This might be a single item, an entire list, a sidebar or panel, or
1433 // even the surrounding frame which wraps your whole app. Defining a chunk of
1434 // UI as a **View** allows you to define your DOM events declaratively, without
1435 // having to worry about render order ... and makes it easy for the view to
1436 // react to specific changes in the state of your models.
1438 // Creating a Backbone.View creates its initial element outside of the DOM,
1439 // if an existing element is not provided...
1440 var View = function(options) {
1441 this.cid = _.uniqueId('view');
1442 options || (options = {});
1443 _.extend(this, _.pick(options, viewOptions));
1444 this._ensureElement();
1445 this.initialize.apply(this, arguments);
1448 // Cached regex to split keys for `delegate`.
1449 var delegateEventSplitter = /^(\S+)\s*(.*)$/;
1451 // List of view options to be merged as properties.
1452 var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];
1454 // Set up all inheritable **Backbone.View** properties and methods.
1455 _.extend(View.prototype, Events, {
1457 // The default `tagName` of a View's element is `"div"`.
1460 // jQuery delegate for element lookup, scoped to DOM elements within the
1461 // current view. This should be preferred to global lookups where possible.
1462 $: function(selector) {
1463 return this.$el.find(selector);
1466 // Initialize is an empty function by default. Override it with your own
1467 // initialization logic.
1468 initialize: function(){},
1470 // **render** is the core function that your view should override, in order
1471 // to populate its element (`this.el`), with the appropriate HTML. The
1472 // convention is for **render** to always return `this`.
1473 render: function() {
1477 // Remove this view by taking the element out of the DOM, and removing any
1478 // applicable Backbone.Events listeners.
1479 remove: function() {
1480 this._removeElement();
1481 this.stopListening();
1485 // Remove this view's element from the document and all event listeners
1486 // attached to it. Exposed for subclasses using an alternative DOM
1487 // manipulation API.
1488 _removeElement: function() {
1492 // Change the view's element (`this.el` property) and re-delegate the
1493 // view's events on the new element.
1494 setElement: function(element) {
1495 this.undelegateEvents();
1496 this._setElement(element);
1497 this.delegateEvents();
1501 // Creates the `this.el` and `this.$el` references for this view using the
1502 // given `el`. `el` can be a CSS selector or an HTML string, a jQuery
1503 // context or an element. Subclasses can override this to utilize an
1504 // alternative DOM manipulation API and are only required to set the
1505 // `this.el` property.
1506 _setElement: function(el) {
1507 this.$el = el instanceof $ ? el : $(el);
1508 this.el = this.$el[0];
1511 // Set callbacks, where `this.events` is a hash of
1513 // *{"event selector": "callback"}*
1516 // 'mousedown .title': 'edit',
1517 // 'click .button': 'save',
1518 // 'click .open': function(e) { ... }
1521 // pairs. Callbacks will be bound to the view, with `this` set properly.
1522 // Uses event delegation for efficiency.
1523 // Omitting the selector binds the event to `this.el`.
1524 delegateEvents: function(events) {
1525 if (!(events || (events = _.result(this, 'events')))) return this;
1526 this.undelegateEvents();
1527 for (var key in events) {
1528 var method = events[key];
1529 if (!_.isFunction(method)) method = this[events[key]];
1530 if (!method) continue;
1531 var match = key.match(delegateEventSplitter);
1532 this.delegate(match[1], match[2], _.bind(method, this));
1537 // Add a single event listener to the view's element (or a child element
1538 // using `selector`). This only works for delegate-able events: not `focus`,
1539 // `blur`, and not `change`, `submit`, and `reset` in Internet Explorer.
1540 delegate: function(eventName, selector, listener) {
1541 this.$el.on(eventName + '.delegateEvents' + this.cid, selector, listener);
1544 // Clears all callbacks previously bound to the view by `delegateEvents`.
1545 // You usually don't need to use this, but may wish to if you have multiple
1546 // Backbone views attached to the same DOM element.
1547 undelegateEvents: function() {
1548 if (this.$el) this.$el.off('.delegateEvents' + this.cid);
1552 // A finer-grained `undelegateEvents` for removing a single delegated event.
1553 // `selector` and `listener` are both optional.
1554 undelegate: function(eventName, selector, listener) {
1555 this.$el.off(eventName + '.delegateEvents' + this.cid, selector, listener);
1558 // Produces a DOM element to be assigned to your view. Exposed for
1559 // subclasses using an alternative DOM manipulation API.
1560 _createElement: function(tagName) {
1561 return document.createElement(tagName);
1564 // Ensure that the View has a DOM element to render into.
1565 // If `this.el` is a string, pass it through `$()`, take the first
1566 // matching element, and re-assign it to `el`. Otherwise, create
1567 // an element from the `id`, `className` and `tagName` properties.
1568 _ensureElement: function() {
1570 var attrs = _.extend({}, _.result(this, 'attributes'));
1571 if (this.id) attrs.id = _.result(this, 'id');
1572 if (this.className) attrs['class'] = _.result(this, 'className');
1573 this.setElement(this._createElement(_.result(this, 'tagName')));
1574 this._setAttributes(attrs);
1576 this.setElement(_.result(this, 'el'));
1580 // Set attributes from a hash on this view's element. Exposed for
1581 // subclasses using an alternative DOM manipulation API.
1582 _setAttributes: function(attributes) {
1583 this.$el.attr(attributes);
1588 // setup inheritance
1589 View.extend = extend;
1590 module.exports = View;
1592 },{"backbone-events-standalone":12,"backbone-extend-standalone":13,"jbone":50,"underscore":59}],11:[function(require,module,exports){
1593 module.exports=require(7)
1594 },{"/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){
1595 module.exports=require(8)
1596 },{"./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){
1597 module.exports=require(9)
1598 },{"/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){
1599 var events = require("backbone-events-standalone");
1601 events.onAll = function(callback,context){
1602 this.on("all", callback,context);
1607 events.oldMixin = events.mixin;
1608 events.mixin = function(proto) {
1609 events.oldMixin(proto);
1611 var exports = ['onAll'];
1612 for(var i=0; i < exports.length;i++){
1613 var name = exports[i];
1614 proto[name] = this[name];
1619 module.exports = events;
1621 },{"backbone-events-standalone":16}],15:[function(require,module,exports){
1622 module.exports=require(7)
1623 },{"/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){
1624 module.exports=require(8)
1625 },{"./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){
1626 // Generated by CoffeeScript 1.8.0
1627 var GenericReader, xhr;
1629 xhr = require('nets');
1631 module.exports = GenericReader = (function() {
1632 function GenericReader() {}
1634 GenericReader.read = function(url, callback) {
1636 onret = (function(_this) {
1637 return function(err, response, text) {
1638 return _this._onRetrieval(text, callback);
1641 return xhr(url, onret);
1644 GenericReader._onRetrieval = function(text, callback) {
1646 rText = this.parse(text);
1647 return callback(rText);
1650 return GenericReader;
1654 },{"nets":undefined}],18:[function(require,module,exports){
1655 // Generated by CoffeeScript 1.8.0
1658 module.exports = Seq = (function() {
1659 function Seq(seq, name, id) {
1671 },{}],19:[function(require,module,exports){
1672 // Generated by CoffeeScript 1.8.0
1676 contains: function(text, search) {
1677 return ''.indexOf.call(text, search, 0) !== -1;
1681 module.exports = strings;
1683 },{}],20:[function(require,module,exports){
1684 module.exports=require(17)
1685 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/biojs-io-clustal/lib/generic_reader.js":17,"nets":undefined}],21:[function(require,module,exports){
1686 // Generated by CoffeeScript 1.8.0
1687 var Fasta, GenericReader, Seq, Str,
1688 __hasProp = {}.hasOwnProperty,
1689 __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; };
1691 Str = require("./strings");
1693 GenericReader = require("./generic_reader");
1695 Seq = require("biojs-model").seq;
1697 module.exports = Fasta = (function(_super) {
1698 __extends(Fasta, _super);
1701 return Fasta.__super__.constructor.apply(this, arguments);
1704 Fasta.parse = function(text) {
1705 var currentSeq, database, databaseID, identifiers, k, label, line, seqs, _i, _len;
1707 if (Object.prototype.toString.call(text) !== '[object Array]') {
1708 text = text.split("\n");
1710 for (_i = 0, _len = text.length; _i < _len; _i++) {
1712 if (line[0] === ">" || line[0] === ";") {
1713 label = line.slice(1);
1714 currentSeq = new Seq("", label, seqs.length);
1715 seqs.push(currentSeq);
1716 if (Str.contains("|", line)) {
1717 identifiers = label.split("|");
1719 while (k < identifiers.length) {
1720 database = identifiers[k];
1721 databaseID = identifiers[k + 1];
1722 currentSeq.meta[database] = databaseID;
1725 currentSeq.name = identifiers[identifiers.length - 1];
1728 currentSeq.seq += line;
1738 },{"./generic_reader":20,"./strings":22,"biojs-model":25}],22:[function(require,module,exports){
1739 module.exports=require(19)
1740 },{"/home/travis/build/greenify/biojs-vis-msa/node_modules/biojs-io-clustal/lib/strings.js":19}],23:[function(require,module,exports){
1741 // Generated by CoffeeScript 1.8.0
1746 Utils.splitNChars = function(txt, num) {
1747 var i, result, _i, _ref;
1749 for (i = _i = 0, _ref = txt.length - 1; num > 0 ? _i <= _ref : _i >= _ref; i = _i += num) {
1750 result.push(txt.substr(i, num));
1755 module.exports = Utils;
1757 },{}],24:[function(require,module,exports){
1758 // Generated by CoffeeScript 1.8.0
1759 var FastaExporter, Utils;
1761 Utils = require("./utils");
1763 module.exports = FastaExporter = (function() {
1764 function FastaExporter() {}
1766 FastaExporter["export"] = function(seqs, access) {
1767 var seq, text, _i, _len;
1769 for (_i = 0, _len = seqs.length; _i < _len; _i++) {
1771 if (access != null) {
1774 text += ">" + seq.name + "\n";
1775 text += (Utils.splitNChars(seq.seq, 80)).join("\n");
1781 return FastaExporter;
1785 },{"./utils":23}],25:[function(require,module,exports){
1786 module.exports.seq = require("./seq");
1788 },{"./seq":26}],26:[function(require,module,exports){
1789 module.exports = function(seq, name, id) {
1796 },{}],27:[function(require,module,exports){
1797 module.exports=require(25)
1798 },{"./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){
1799 module.exports=require(26)
1800 },{"/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){
1801 module.exports = require('./src/index.js')
1803 },{"./src/index.js":36}],30:[function(require,module,exports){
1830 },{}],31:[function(require,module,exports){
1861 },{}],32:[function(require,module,exports){
1892 },{}],33:[function(require,module,exports){
1919 },{}],34:[function(require,module,exports){
1946 },{}],35:[function(require,module,exports){
1976 },{}],36:[function(require,module,exports){
1977 module.exports.selector = require("./selector");
1980 module.exports.taylor = require("./taylor");
1981 module.exports.zappo= require("./zappo");
1982 module.exports.hydro= require("./hydrophobicity");
1984 module.exports.clustal = require("./clustal");
1985 module.exports.clustal2 = require("./clustal2");
1987 module.exports.curied = require("./buried");
1988 module.exports.cinema = require("./cinema");
1989 module.exports.nucleotide = require("./nucleotide");
1990 module.exports.helix = require("./helix");
1991 module.exports.lesk = require("./lesk");
1992 module.exports.mae = require("./mae");
1993 module.exports.purine = require("./purine");
1994 module.exports.strand = require("./strand");
1995 module.exports.turn = require("./turn");
1997 },{"./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){
2028 },{}],38:[function(require,module,exports){
2059 },{}],39:[function(require,module,exports){
2068 },{}],40:[function(require,module,exports){
2079 },{}],41:[function(require,module,exports){
2080 var Buried = require("./buried");
2081 var Cinema = require("./cinema");
2082 var Clustal = require("./clustal");
2083 var Clustal2 = require("./clustal2");
2084 var Helix = require("./helix");
2085 var Hydro = require("./hydrophobicity");
2086 var Lesk = require("./lesk");
2087 var Mae = require("./mae");
2088 var Nucleotide = require("./nucleotide");
2089 var Purine = require("./purine");
2090 var Strand = require("./strand");
2091 var Taylor = require("./taylor");
2092 var Turn = require("./turn");
2093 var Zappo = require("./zappo");
2095 module.exports = Colors = {
2098 buried_index: Buried,
2103 helix_propensity: Helix,
2107 nucleotide: Nucleotide,
2109 purine_pyrimidine: Purine,
2111 strand_propensity: Strand,
2114 turn_propensity: Turn,
2117 getColor: function(scheme) {
2118 var color = Colors.mapping[scheme];
2119 if (color === undefined) {
2126 },{"./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){
2153 },{}],43:[function(require,module,exports){
2180 },{}],44:[function(require,module,exports){
2207 },{}],45:[function(require,module,exports){
2234 },{}],46:[function(require,module,exports){
2236 * JavaScript Canvas to Blob 2.0.5
2237 * https://github.com/blueimp/JavaScript-Canvas-to-Blob
2239 * Copyright 2012, Sebastian Tschan
2240 * https://blueimp.net
2242 * Licensed under the MIT license:
2243 * http://www.opensource.org/licenses/MIT
2245 * Based on stackoverflow user Stoive's code snippet:
2246 * http://stackoverflow.com/q/4998908
2248 var CanvasPrototype = window.HTMLCanvasElement &&
2249 window.HTMLCanvasElement.prototype,
2250 hasBlobConstructor = window.Blob && (function () {
2252 return Boolean(new Blob());
2257 hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array &&
2260 return new Blob([new Uint8Array(100)]).size === 100;
2265 BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder ||
2266 window.MozBlobBuilder || window.MSBlobBuilder,
2267 dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob &&
2268 window.ArrayBuffer && window.Uint8Array && function (dataURI) {
2275 if (dataURI.split(',')[0].indexOf('base64') >= 0) {
2276 // Convert base64 to raw binary data held in a string:
2277 byteString = atob(dataURI.split(',')[1]);
2279 // Convert base64/URLEncoded data component to raw binary data:
2280 byteString = decodeURIComponent(dataURI.split(',')[1]);
2282 // Write the bytes of the string to an ArrayBuffer:
2283 arrayBuffer = new ArrayBuffer(byteString.length);
2284 intArray = new Uint8Array(arrayBuffer);
2285 for (i = 0; i < byteString.length; i += 1) {
2286 intArray[i] = byteString.charCodeAt(i);
2288 // Separate out the mime component:
2289 mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
2290 // Write the ArrayBuffer (or ArrayBufferView) to a blob:
2291 if (hasBlobConstructor) {
2293 [hasArrayBufferViewSupport ? intArray : arrayBuffer],
2297 bb = new BlobBuilder();
2298 bb.append(arrayBuffer);
2299 return bb.getBlob(mimeString);
2301 if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) {
2302 if (CanvasPrototype.mozGetAsFile) {
2303 CanvasPrototype.toBlob = function (callback, type, quality) {
2304 if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) {
2305 callback(dataURLtoBlob(this.toDataURL(type, quality)));
2307 callback(this.mozGetAsFile('blob', type));
2310 } else if (CanvasPrototype.toDataURL && dataURLtoBlob) {
2311 CanvasPrototype.toBlob = function (callback, type, quality) {
2312 callback(dataURLtoBlob(this.toDataURL(type, quality)));
2317 module.exports = dataURLtoBlob;
2319 },{}],47:[function(require,module,exports){
2321 * A saveAs() FileSaver implementation.
2324 * By Eli Grey, http://eligrey.com
2326 * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
2330 /*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
2332 /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
2335 // IE 10+ (native saveAs)
2336 || (typeof navigator !== "undefined" &&
2337 navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
2339 || (function(view) {
2341 // IE <10 is explicitly unsupported
2342 if (typeof navigator !== "undefined" &&
2343 /MSIE [1-9]\./.test(navigator.userAgent)) {
2348 // only get URL when necessary in case Blob.js hasn't overridden it yet
2349 , get_URL = function() {
2350 return view.URL || view.webkitURL || view;
2352 , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
2353 , can_use_save_link = !view.externalHost && "download" in save_link
2354 , click = function(node) {
2355 var event = doc.createEvent("MouseEvents");
2356 event.initMouseEvent(
2357 "click", true, false, view, 0, 0, 0, 0, 0
2358 , false, false, false, false, 0, null
2360 node.dispatchEvent(event);
2362 , webkit_req_fs = view.webkitRequestFileSystem
2363 , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
2364 , throw_outside = function(ex) {
2365 (view.setImmediate || view.setTimeout)(function() {
2369 , force_saveable_type = "application/octet-stream"
2371 , deletion_queue = []
2372 , process_deletion_queue = function() {
2373 var i = deletion_queue.length;
2375 var file = deletion_queue[i];
2376 if (typeof file === "string") { // file is an object URL
2377 get_URL().revokeObjectURL(file);
2378 } else { // file is a File
2382 deletion_queue.length = 0; // clear queue
2384 , dispatch = function(filesaver, event_types, event) {
2385 event_types = [].concat(event_types);
2386 var i = event_types.length;
2388 var listener = filesaver["on" + event_types[i]];
2389 if (typeof listener === "function") {
2391 listener.call(filesaver, event || filesaver);
2398 , FileSaver = function(blob, name) {
2399 // First try a.download, then web filesystem, then object URLs
2403 , blob_changed = false
2406 , get_object_url = function() {
2407 var object_url = get_URL().createObjectURL(blob);
2408 deletion_queue.push(object_url);
2411 , dispatch_all = function() {
2412 dispatch(filesaver, "writestart progress write writeend".split(" "));
2414 // on any filesys errors revert to saving with object URLs
2415 , fs_error = function() {
2416 // don't create more object URLs than needed
2417 if (blob_changed || !object_url) {
2418 object_url = get_object_url(blob);
2421 target_view.location.href = object_url;
2423 window.open(object_url, "_blank");
2425 filesaver.readyState = filesaver.DONE;
2428 , abortable = function(func) {
2430 if (filesaver.readyState !== filesaver.DONE) {
2431 return func.apply(this, arguments);
2435 , create_if_not_found = {create: true, exclusive: false}
2438 filesaver.readyState = filesaver.INIT;
2442 if (can_use_save_link) {
2443 object_url = get_object_url(blob);
2444 save_link.href = object_url;
2445 save_link.download = name;
2447 filesaver.readyState = filesaver.DONE;
2451 // Object and web filesystem URLs have a problem saving in Google Chrome when
2452 // viewed in a tab, so I force save with application/octet-stream
2453 // http://code.google.com/p/chromium/issues/detail?id=91158
2454 if (view.chrome && type && type !== force_saveable_type) {
2455 slice = blob.slice || blob.webkitSlice;
2456 blob = slice.call(blob, 0, blob.size, force_saveable_type);
2457 blob_changed = true;
2459 // Since I can't be sure that the guessed media type will trigger a download
2460 // in WebKit, I append .download to the filename.
2461 // https://bugs.webkit.org/show_bug.cgi?id=65440
2462 if (webkit_req_fs && name !== "download") {
2463 name += ".download";
2465 if (type === force_saveable_type || webkit_req_fs) {
2472 fs_min_size += blob.size;
2473 req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
2474 fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
2475 var save = function() {
2476 dir.getFile(name, create_if_not_found, abortable(function(file) {
2477 file.createWriter(abortable(function(writer) {
2478 writer.onwriteend = function(event) {
2479 target_view.location.href = file.toURL();
2480 deletion_queue.push(file);
2481 filesaver.readyState = filesaver.DONE;
2482 dispatch(filesaver, "writeend", event);
2484 writer.onerror = function() {
2485 var error = writer.error;
2486 if (error.code !== error.ABORT_ERR) {
2490 "writestart progress write abort".split(" ").forEach(function(event) {
2491 writer["on" + event] = filesaver["on" + event];
2494 filesaver.abort = function() {
2496 filesaver.readyState = filesaver.DONE;
2498 filesaver.readyState = filesaver.WRITING;
2502 dir.getFile(name, {create: false}, abortable(function(file) {
2503 // delete file if it already exists
2506 }), abortable(function(ex) {
2507 if (ex.code === ex.NOT_FOUND_ERR) {
2516 , FS_proto = FileSaver.prototype
2517 , saveAs = function(blob, name) {
2518 return new FileSaver(blob, name);
2521 FS_proto.abort = function() {
2522 var filesaver = this;
2523 filesaver.readyState = filesaver.DONE;
2524 dispatch(filesaver, "abort");
2526 FS_proto.readyState = FS_proto.INIT = 0;
2527 FS_proto.WRITING = 1;
2531 FS_proto.onwritestart =
2532 FS_proto.onprogress =
2536 FS_proto.onwriteend =
2539 view.addEventListener("unload", process_deletion_queue, false);
2540 saveAs.unload = function() {
2541 process_deletion_queue();
2542 view.removeEventListener("unload", process_deletion_queue, false);
2546 typeof self !== "undefined" && self
2547 || typeof window !== "undefined" && window
2550 // `self` is undefined in Firefox for Android content script context
2551 // while `this` is nsIContentFrameMessageManager
2552 // with an attribute `content` that corresponds to the window
2554 amdDefine = window.define;
2555 if( typeof amdDefine === "undefined" && (typeof window.almond !== "undefined"
2556 && "define" in window.almond )){
2557 amdDefine = window.almond.define;
2560 if (typeof module !== "undefined" && module !== null) {
2561 module.exports = saveAs;
2562 } else if ((typeof amdDefine !== "undefined" && amdDefine !== null) && (amdDefine.amd != null)) {
2563 amdDefine("saveAs",[], function() {
2568 },{}],48:[function(require,module,exports){
2569 module.exports = function (css, customDocument) {
2570 var doc = customDocument || document;
2571 if (doc.createStyleSheet) {
2572 var sheet = doc.createStyleSheet()
2573 sheet.cssText = css;
2574 return sheet.ownerNode;
2576 var head = doc.getElementsByTagName('head')[0],
2577 style = doc.createElement('style');
2579 style.type = 'text/css';
2581 if (style.styleSheet) {
2582 style.styleSheet.cssText = css;
2584 style.appendChild(doc.createTextNode(css));
2587 head.appendChild(style);
2592 module.exports.byUrl = function(url) {
2593 if (document.createStyleSheet) {
2594 return document.createStyleSheet(url).ownerNode;
2596 var head = document.getElementsByTagName('head')[0],
2597 link = document.createElement('link');
2599 link.rel = 'stylesheet';
2602 head.appendChild(link);
2607 },{}],49:[function(require,module,exports){
2612 Remove an element and provide a function that inserts it into its original position
2613 https://developers.google.com/speed/articles/javascript-dom
2614 @param element {Element} The element to be temporarily removed
2615 @return {Function} A function that inserts the element into its original position
2618 Utils.removeToInsertLater = function(element) {
2619 var nextSibling, parentNode;
2620 parentNode = element.parentNode;
2621 nextSibling = element.nextSibling;
2622 parentNode.removeChild(element);
2625 parentNode.insertBefore(element, nextSibling);
2627 parentNode.appendChild(element);
2634 fastest possible way to destroy all sub nodes (aka childs)
2635 http://jsperf.com/innerhtml-vs-removechild/15
2636 @param element {Element} The element for which all childs should be removed
2639 Utils.removeAllChilds = function(element) {
2642 while (element.firstChild) {
2644 element.removeChild(element.firstChild);
2648 module.exports = Utils;
2650 },{}],50:[function(require,module,exports){
2652 * jBone v1.0.19 - 2014-10-12 - Library for DOM manipulation
2654 * https://github.com/kupriyanenko/jbone
2656 * Copyright 2014 Alexey Kupriyanenko
2657 * Released under the MIT license.
2663 // cache previous versions
2667 // Quick match a standalone tag
2668 rquickSingleTag = /^<(\w+)\s*\/?>$/,
2670 // A simple way to check for HTML strings
2671 // Prioritize #id over <tag> to avoid XSS via location.hash
2672 rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
2674 // Alias for function
2679 // Alias for global variables
2682 isString = function(el) {
2683 return typeof el === "string";
2685 isObject = function(el) {
2686 return el instanceof Object;
2688 isFunction = function(el) {
2690 return el && getType.toString.call(el) === "[object Function]";
2692 isArray = function(el) {
2693 return Array.isArray(el);
2695 jBone = function(element, data) {
2696 return new fn.init(element, data);
2700 // set previous values and return the instance upon calling the no-conflict mode
2701 jBone.noConflict = function() {
2708 fn = jBone.fn = jBone.prototype = {
2709 init: function(element, data) {
2710 var elements, tag, wraper, fragment;
2715 if (isString(element)) {
2716 // Create single DOM element
2717 if (tag = rquickSingleTag.exec(element)) {
2718 this[0] = doc.createElement(tag[1]);
2721 if (isObject(data)) {
2727 // Create DOM collection
2728 if ((tag = rquickExpr.exec(element)) && tag[1]) {
2729 fragment = doc.createDocumentFragment();
2730 wraper = doc.createElement("div");
2731 wraper.innerHTML = element;
2732 while (wraper.lastChild) {
2733 fragment.appendChild(wraper.firstChild);
2735 elements = slice.call(fragment.childNodes);
2737 return jBone.merge(this, elements);
2739 // Find DOM elements with querySelectorAll
2740 if (jBone.isElement(data)) {
2741 return jBone(data).find(element);
2745 elements = doc.querySelectorAll(element);
2747 return jBone.merge(this, elements);
2753 if (element.nodeType) {
2760 if (isFunction(element)) {
2763 // Return jBone element as is
2764 if (element instanceof jBone) {
2768 // Return element wrapped by jBone
2769 return jBone.makeArray(element, this);
2774 reverse: [].reverse,
2779 indexOf: [].indexOf,
2780 forEach: [].forEach,
2781 unshift: [].unshift,
2789 reduceRight: [].reduceRight,
2793 fn.constructor = jBone;
2795 fn.init.prototype = fn;
2797 jBone.setId = function(el) {
2802 } else if (el.jid === undefined) {
2803 el.jid = jid = ++jBone._cache.jid;
2806 if (!jBone._cache.events[jid]) {
2807 jBone._cache.events[jid] = {};
2811 jBone.getData = function(el) {
2812 el = el instanceof jBone ? el[0] : el;
2814 var jid = el === win ? "window" : el.jid;
2818 events: jBone._cache.events[jid]
2822 jBone.isElement = function(el) {
2823 return el && el instanceof jBone || el instanceof HTMLElement || isString(el);
2831 function isArraylike(obj) {
2832 var length = obj.length,
2835 if (isFunction(type) || obj === win) {
2839 if (obj.nodeType === 1 && length) {
2843 return isArray(type) || length === 0 ||
2844 typeof length === "number" && length > 0 && (length - 1) in obj;
2847 jBone.merge = function(first, second) {
2848 var l = second.length,
2853 first[i++] = second[j++];
2861 jBone.contains = function(container, contained) {
2864 container.reverse().some(function(el) {
2865 if (el.contains(contained)) {
2873 jBone.extend = function(target) {
2876 splice.call(arguments, 1).forEach(function(object) {
2884 tg = target; //caching target for perf improvement
2886 for (; i < kl; i++) {
2887 tg[k[i]] = object[k[i]];
2894 jBone.makeArray = function(arr, results) {
2895 var ret = results || [];
2898 if (isArraylike(arr)) {
2899 jBone.merge(ret, isString(arr) ? [arr] : arr);
2908 function BoneEvent(e, data) {
2911 this.originalEvent = e;
2913 setter = function(key, e) {
2914 if (key === "preventDefault") {
2915 this[key] = function() {
2916 this.defaultPrevented = true;
2919 } else if (isFunction(e[key])) {
2920 this[key] = function() {
2929 if (e[key] || typeof e[key] === "function") {
2930 setter.call(this, key, e);
2934 jBone.extend(this, data);
2937 jBone.Event = function(event, data) {
2938 var namespace, eventType;
2940 if (event.type && !data) {
2945 namespace = event.split(".").splice(1).join(".");
2946 eventType = event.split(".")[0];
2948 event = doc.createEvent("Event");
2949 event.initEvent(eventType, true, true);
2951 return jBone.extend(event, {
2952 namespace: namespace,
2953 isDefaultPrevented: function() {
2954 return event.defaultPrevented;
2959 fn.on = function(event) {
2960 var args = arguments,
2961 length = this.length,
2963 callback, target, namespace, fn, events, eventType, expectedTarget, addListener;
2965 if (args.length === 2) {
2972 addListener = function(el) {
2974 events = jBone.getData(el).events;
2975 event.split(" ").forEach(function(event) {
2976 eventType = event.split(".")[0];
2977 namespace = event.split(".").splice(1).join(".");
2978 events[eventType] = events[eventType] || [];
2981 if (e.namespace && e.namespace !== namespace) {
2985 expectedTarget = null;
2987 callback.call(el, e);
2988 } else if (~jBone(el).find(target).indexOf(e.target) || (expectedTarget = jBone.contains(jBone(el).find(target), e.target))) {
2989 expectedTarget = expectedTarget || e.target;
2990 e = new BoneEvent(e, {
2991 currentTarget: expectedTarget
2994 callback.call(expectedTarget, e);
2998 events[eventType].push({
2999 namespace: namespace,
3004 el.addEventListener && el.addEventListener(eventType, fn, false);
3008 for (; i < length; i++) {
3009 addListener(this[i]);
3015 fn.one = function(event) {
3016 var args = arguments,
3018 length = this.length,
3019 callback, target, addListener;
3021 if (args.length === 2) {
3024 target = args[1], callback = args[2];
3027 addListener = function(el) {
3028 event.split(" ").forEach(function(event) {
3029 var fn = function(e) {
3030 jBone(el).off(event, fn);
3031 callback.call(el, e);
3035 jBone(el).on(event, fn);
3037 jBone(el).on(event, target, fn);
3042 for (; i < length; i++) {
3043 addListener(this[i]);
3049 fn.trigger = function(event) {
3052 length = this.length,
3059 if (isString(event)) {
3060 events = event.split(" ").map(function(event) {
3061 return jBone.Event(event);
3064 event = event instanceof Event ? event : jBone.Event(event);
3068 dispatchEvents = function(el) {
3069 events.forEach(function(event) {
3074 el.dispatchEvent && el.dispatchEvent(event);
3078 for (; i < length; i++) {
3079 dispatchEvents(this[i]);
3085 fn.off = function(event, fn) {
3087 length = this.length,
3088 removeListener = function(events, eventType, index, el, e) {
3092 if ((fn && e.originfn === fn) || !fn) {
3096 if (events[eventType][index].fn === callback) {
3097 el.removeEventListener(eventType, callback);
3099 // remove handler from cache
3100 jBone._cache.events[jBone.getData(el).jid][eventType].splice(index, 1);
3103 events, namespace, removeListeners, eventType;
3105 removeListeners = function(el) {
3106 var l, eventsByType, e;
3108 events = jBone.getData(el).events;
3114 // remove all events
3115 if (!event && events) {
3116 return keys(events).forEach(function(eventType) {
3117 eventsByType = events[eventType];
3118 l = eventsByType.length;
3121 removeListener(events, eventType, l, el, eventsByType[l]);
3126 event.split(" ").forEach(function(event) {
3127 eventType = event.split(".")[0];
3128 namespace = event.split(".").splice(1).join(".");
3130 // remove named events
3131 if (events[eventType]) {
3132 eventsByType = events[eventType];
3133 l = eventsByType.length;
3136 e = eventsByType[l];
3137 if (!namespace || (namespace && e.namespace === namespace)) {
3138 removeListener(events, eventType, l, el, e);
3142 // remove all namespaced events
3143 else if (namespace) {
3144 keys(events).forEach(function(eventType) {
3145 eventsByType = events[eventType];
3146 l = eventsByType.length;
3149 e = eventsByType[l];
3150 if (e.namespace.split(".")[0] === namespace.split(".")[0]) {
3151 removeListener(events, eventType, l, el, e);
3159 for (; i < length; i++) {
3160 removeListeners(this[i]);
3166 fn.find = function(selector) {
3169 length = this.length,
3170 finder = function(el) {
3171 if (isFunction(el.querySelectorAll)) {
3172 [].forEach.call(el.querySelectorAll(selector), function(found) {
3173 results.push(found);
3178 for (; i < length; i++) {
3182 return jBone(results);
3185 fn.get = function(index) {
3189 fn.eq = function(index) {
3190 return jBone(this[index]);
3193 fn.parent = function() {
3197 length = this.length;
3199 for (; i < length; i++) {
3200 if (!~results.indexOf(parent = this[i].parentElement) && parent) {
3201 results.push(parent);
3205 return jBone(results);
3208 fn.toArray = function() {
3209 return slice.call(this);
3212 fn.is = function() {
3213 var args = arguments;
3215 return this.some(function(el) {
3216 return el.tagName.toLowerCase() === args[0];
3220 fn.has = function() {
3221 var args = arguments;
3223 return this.some(function(el) {
3224 return el.querySelectorAll(args[0]).length;
3228 fn.attr = function(key, value) {
3229 var args = arguments,
3231 length = this.length,
3234 if (isString(key) && args.length === 1) {
3235 return this[0] && this[0].getAttribute(key);
3238 if (args.length === 2) {
3239 setter = function(el) {
3240 el.setAttribute(key, value);
3242 } else if (isObject(key)) {
3243 setter = function(el) {
3244 keys(key).forEach(function(name) {
3245 el.setAttribute(name, key[name]);
3250 for (; i < length; i++) {
3257 fn.removeAttr = function(key) {
3259 length = this.length;
3261 for (; i < length; i++) {
3262 this[i].removeAttribute(key);
3268 fn.val = function(value) {
3270 length = this.length;
3272 if (arguments.length === 0) {
3273 return this[0] && this[0].value;
3276 for (; i < length; i++) {
3277 this[i].value = value;
3283 fn.css = function(key, value) {
3284 var args = arguments,
3286 length = this.length,
3290 if (isString(key) && args.length === 1) {
3291 return this[0] && win.getComputedStyle(this[0])[key];
3295 if (args.length === 2) {
3296 setter = function(el) {
3297 el.style[key] = value;
3299 } else if (isObject(key)) {
3300 setter = function(el) {
3301 keys(key).forEach(function(name) {
3302 el.style[name] = key[name];
3307 for (; i < length; i++) {
3314 fn.data = function(key, value) {
3315 var args = arguments, data = {},
3317 length = this.length,
3319 setValue = function(el, key, value) {
3320 if (isObject(value)) {
3321 el.jdata = el.jdata || {};
3322 el.jdata[key] = value;
3324 el.dataset[key] = value;
3327 getValue = function(value) {
3328 if (value === "true") {
3330 } else if (value === "false") {
3338 if (args.length === 0) {
3339 this[0].jdata && (data = this[0].jdata);
3341 keys(this[0].dataset).forEach(function(key) {
3342 data[key] = getValue(this[0].dataset[key]);
3348 if (args.length === 1 && isString(key)) {
3349 return this[0] && getValue(this[0].dataset[key] || this[0].jdata && this[0].jdata[key]);
3353 if (args.length === 1 && isObject(key)) {
3354 setter = function(el) {
3355 keys(key).forEach(function(name) {
3356 setValue(el, name, key[name]);
3359 } else if (args.length === 2) {
3360 setter = function(el) {
3361 setValue(el, key, value);
3365 for (; i < length; i++) {
3372 fn.removeData = function(key) {
3374 length = this.length,
3377 for (; i < length; i++) {
3378 jdata = this[i].jdata;
3379 dataset = this[i].dataset;
3382 jdata && jdata[key] && delete jdata[key];
3383 delete dataset[key];
3385 for (key in jdata) {
3389 for (key in dataset) {
3390 delete dataset[key];
3398 fn.html = function(value) {
3399 var args = arguments,
3402 // add HTML into elements
3403 if (args.length === 1 && value !== undefined) {
3404 return this.empty().append(value);
3406 // get HTML from element
3407 else if (args.length === 0 && (el = this[0])) {
3408 return el.innerHTML;
3414 fn.append = function(appended) {
3416 length = this.length,
3419 // create jBone object and then append
3420 if (isString(appended) && rquickExpr.exec(appended)) {
3421 appended = jBone(appended);
3423 // create text node for inserting
3424 else if (!isObject(appended)) {
3425 appended = document.createTextNode(appended);
3428 appended = appended instanceof jBone ? appended : jBone(appended);
3430 setter = function(el, i) {
3431 appended.forEach(function(node) {
3433 el.appendChild(node.cloneNode());
3435 el.appendChild(node);
3440 for (; i < length; i++) {
3447 fn.appendTo = function(to) {
3448 jBone(to).append(this);
3453 fn.empty = function() {
3455 length = this.length,
3458 for (; i < length; i++) {
3461 while (el.lastChild) {
3462 el.removeChild(el.lastChild);
3469 fn.remove = function() {
3471 length = this.length,
3474 // remove all listners
3477 for (; i < length; i++) {
3480 // remove data and nodes
3482 el.parentNode && el.parentNode.removeChild(el);
3488 if (typeof module === "object" && module && typeof module.exports === "object") {
3489 // Expose jBone as module.exports in loaders that implement the Node
3490 // module pattern (including browserify). Do not create the global, since
3491 // the user will be storing it themselves locally, and globals are frowned
3492 // upon in the Node module world.
3493 module.exports = jBone;
3495 // Register as a AMD module
3496 else if (typeof define === "function" && define.amd) {
3501 win.jBone = win.$ = jBone;
3502 } else if (typeof win === "object" && typeof win.document === "object") {
3503 win.jBone = win.$ = jBone;
3508 },{}],51:[function(require,module,exports){
3511 module.exports = Mouse = {
3513 var mouseX, mouseY, rect, target;
3516 if (mouseX == null) {
3517 rect = target.getBoundingClientRect();
3518 target = e.target || e.srcElement;
3519 if (mouseX == null) {
3520 mouseX = e.clientX - rect.left;
3521 mouseY = e.clientY - rect.top;
3523 if (mouseX == null) {
3524 mouseX = e.pageX - target.offsetLeft;
3525 mouseY = e.pageY - target.offsetTop;
3527 if (mouseX == null) {
3528 console.log(e, "no mouse event defined. your browser sucks");
3532 return [mouseX, mouseY];
3538 if (mouseX == null) {
3542 if (mouseX == null) {
3546 if (mouseX == null) {
3550 return [mouseX, mouseY];
3552 wheelDelta: function(e) {
3554 delta = [e.deltaX, e.deltaY];
3555 if (delta[0] == null) {
3556 dir = Math.floor(e.detail / 3);
3557 delta = [0, e.mozMovementX * dir];
3563 },{}],52:[function(require,module,exports){
3564 var window = require("global/window")
3565 var once = require("once")
3566 var parseHeaders = require('parse-headers')
3569 "0": "Internal XMLHttpRequest Error",
3570 "4": "4xx Client Error",
3571 "5": "5xx Server Error"
3574 var XHR = window.XMLHttpRequest || noop
3575 var XDR = "withCredentials" in (new XHR()) ? XHR : window.XDomainRequest
3577 module.exports = createXHR
3579 function createXHR(options, callback) {
3580 if (typeof options === "string") {
3581 options = { uri: options }
3584 options = options || {}
3585 callback = once(callback)
3587 var xhr = options.xhr || null
3590 if (options.cors || options.useXDR) {
3597 var uri = xhr.url = options.uri || options.url
3598 var method = xhr.method = options.method || "GET"
3599 var body = options.body || options.data
3600 var headers = xhr.headers = options.headers || {}
3601 var sync = !!options.sync
3604 var load = options.response ? loadResponse : loadXhr
3606 if ("json" in options) {
3608 headers["Accept"] = "application/json"
3609 if (method !== "GET" && method !== "HEAD") {
3610 headers["Content-Type"] = "application/json"
3611 body = JSON.stringify(options.json)
3615 xhr.onreadystatechange = readystatechange
3618 // IE9 must have onprogress be set to a unique function.
3619 xhr.onprogress = function () {
3623 xhr.ontimeout = noop
3624 xhr.open(method, uri, !sync)
3625 //backward compatibility
3626 if (options.withCredentials || (options.cors && options.withCredentials !== false)) {
3627 xhr.withCredentials = true
3630 // Cannot set timeout with sync request
3632 xhr.timeout = "timeout" in options ? options.timeout : 5000
3635 if (xhr.setRequestHeader) {
3636 for(key in headers){
3637 if(headers.hasOwnProperty(key)){
3638 xhr.setRequestHeader(key, headers[key])
3641 } else if (options.headers) {
3642 throw new Error("Headers cannot be set on an XDomainRequest object")
3645 if ("responseType" in options) {
3646 xhr.responseType = options.responseType
3649 if ("beforeSend" in options &&
3650 typeof options.beforeSend === "function"
3652 options.beforeSend(xhr)
3659 function readystatechange() {
3660 if (xhr.readyState === 4) {
3665 function getBody() {
3666 // Chrome with requestType=blob throws errors arround when even testing access to responseText
3671 } else if (xhr.responseType === 'text' || !xhr.responseType) {
3672 body = xhr.responseText || xhr.responseXML
3677 body = JSON.parse(body)
3684 function getStatusCode() {
3685 return xhr.status === 1223 ? 204 : xhr.status
3688 // if we're getting a none-ok statusCode, build & return an error
3689 function errorFromStatusCode(status) {
3691 if (status === 0 || (status >= 400 && status < 600)) {
3692 var message = (typeof body === "string" ? body : false) ||
3693 messages[String(status).charAt(0)]
3694 error = new Error(message)
3695 error.statusCode = status
3701 // will load the data & process the response in a special response object
3702 function loadResponse() {
3703 var status = getStatusCode()
3704 var error = errorFromStatusCode(status)
3708 statusText: xhr.statusText,
3711 if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE
3712 response.headers = parseHeaders(xhr.getAllResponseHeaders())
3714 response.headers = {}
3717 callback(error, response, response.body)
3720 // will load the data and add some response properties to the source xhr
3721 // and then respond with that
3722 function loadXhr() {
3723 var status = getStatusCode()
3724 var error = errorFromStatusCode(status)
3726 xhr.status = xhr.statusCode = status
3727 xhr.body = getBody()
3728 xhr.headers = parseHeaders(xhr.getAllResponseHeaders())
3730 callback(error, xhr, xhr.body)
3733 function error(evt) {
3741 },{"global/window":53,"once":54,"parse-headers":58}],53:[function(require,module,exports){
3743 if (typeof window !== "undefined") {
3744 module.exports = window;
3745 } else if (typeof global !== "undefined") {
3746 module.exports = global;
3747 } else if (typeof self !== "undefined"){
3748 module.exports = self;
3750 module.exports = {};
3753 }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
3754 },{}],54:[function(require,module,exports){
3755 module.exports = once
3757 once.proto = once(function () {
3758 Object.defineProperty(Function.prototype, 'once', {
3759 value: function () {
3766 function once (fn) {
3768 return function () {
3771 return fn.apply(this, arguments)
3775 },{}],55:[function(require,module,exports){
3776 var isFunction = require('is-function')
3778 module.exports = forEach
3780 var toString = Object.prototype.toString
3781 var hasOwnProperty = Object.prototype.hasOwnProperty
3783 function forEach(list, iterator, context) {
3784 if (!isFunction(iterator)) {
3785 throw new TypeError('iterator must be a function')
3788 if (arguments.length < 3) {
3792 if (toString.call(list) === '[object Array]')
3793 forEachArray(list, iterator, context)
3794 else if (typeof list === 'string')
3795 forEachString(list, iterator, context)
3797 forEachObject(list, iterator, context)
3800 function forEachArray(array, iterator, context) {
3801 for (var i = 0, len = array.length; i < len; i++) {
3802 if (hasOwnProperty.call(array, i)) {
3803 iterator.call(context, array[i], i, array)
3808 function forEachString(string, iterator, context) {
3809 for (var i = 0, len = string.length; i < len; i++) {
3810 // no such thing as a sparse string.
3811 iterator.call(context, string.charAt(i), i, string)
3815 function forEachObject(object, iterator, context) {
3816 for (var k in object) {
3817 if (hasOwnProperty.call(object, k)) {
3818 iterator.call(context, object[k], k, object)
3823 },{"is-function":56}],56:[function(require,module,exports){
3824 module.exports = isFunction
3826 var toString = Object.prototype.toString
3828 function isFunction (fn) {
3829 var string = toString.call(fn)
3830 return string === '[object Function]' ||
3831 (typeof fn === 'function' && string !== '[object RegExp]') ||
3832 (typeof window !== 'undefined' &&
3834 (fn === window.setTimeout ||
3835 fn === window.alert ||
3836 fn === window.confirm ||
3837 fn === window.prompt))
3840 },{}],57:[function(require,module,exports){
3842 exports = module.exports = trim;
3845 return str.replace(/^\s*|\s*$/g, '');
3848 exports.left = function(str){
3849 return str.replace(/^\s*/, '');
3852 exports.right = function(str){
3853 return str.replace(/\s*$/, '');
3856 },{}],58:[function(require,module,exports){
3857 var trim = require('trim')
3858 , forEach = require('for-each')
3859 , isArray = function(arg) {
3860 return Object.prototype.toString.call(arg) === '[object Array]';
3863 module.exports = function (headers) {
3870 trim(headers).split('\n')
3872 var index = row.indexOf(':')
3873 , key = trim(row.slice(0, index)).toLowerCase()
3874 , value = trim(row.slice(index + 1))
3876 if (typeof(result[key]) === 'undefined') {
3878 } else if (isArray(result[key])) {
3879 result[key].push(value)
3881 result[key] = [ result[key], value ]
3888 },{"for-each":55,"trim":57}],59:[function(require,module,exports){
3889 // Underscore.js 1.7.0
3890 // http://underscorejs.org
3891 // (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
3892 // Underscore may be freely distributed under the MIT license.
3899 // Establish the root object, `window` in the browser, or `exports` on the server.
3902 // Save the previous value of the `_` variable.
3903 var previousUnderscore = root._;
3905 // Save bytes in the minified (but not gzipped) version:
3906 var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
3908 // Create quick reference variables for speed access to core prototypes.
3910 push = ArrayProto.push,
3911 slice = ArrayProto.slice,
3912 concat = ArrayProto.concat,
3913 toString = ObjProto.toString,
3914 hasOwnProperty = ObjProto.hasOwnProperty;
3916 // All **ECMAScript 5** native function implementations that we hope to use
3917 // are declared here.
3919 nativeIsArray = Array.isArray,
3920 nativeKeys = Object.keys,
3921 nativeBind = FuncProto.bind;
3923 // Create a safe reference to the Underscore object for use below.
3924 var _ = function(obj) {
3925 if (obj instanceof _) return obj;
3926 if (!(this instanceof _)) return new _(obj);
3927 this._wrapped = obj;
3930 // Export the Underscore object for **Node.js**, with
3931 // backwards-compatibility for the old `require()` API. If we're in
3932 // the browser, add `_` as a global object.
3933 if (typeof exports !== 'undefined') {
3934 if (typeof module !== 'undefined' && module.exports) {
3935 exports = module.exports = _;
3943 _.VERSION = '1.7.0';
3945 // Internal function that returns an efficient (for current engines) version
3946 // of the passed-in callback, to be repeatedly applied in other Underscore
3948 var createCallback = function(func, context, argCount) {
3949 if (context === void 0) return func;
3950 switch (argCount == null ? 3 : argCount) {
3951 case 1: return function(value) {
3952 return func.call(context, value);
3954 case 2: return function(value, other) {
3955 return func.call(context, value, other);
3957 case 3: return function(value, index, collection) {
3958 return func.call(context, value, index, collection);
3960 case 4: return function(accumulator, value, index, collection) {
3961 return func.call(context, accumulator, value, index, collection);
3965 return func.apply(context, arguments);
3969 // A mostly-internal function to generate callbacks that can be applied
3970 // to each element in a collection, returning the desired result — either
3971 // identity, an arbitrary callback, a property matcher, or a property accessor.
3972 _.iteratee = function(value, context, argCount) {
3973 if (value == null) return _.identity;
3974 if (_.isFunction(value)) return createCallback(value, context, argCount);
3975 if (_.isObject(value)) return _.matches(value);
3976 return _.property(value);
3979 // Collection Functions
3980 // --------------------
3982 // The cornerstone, an `each` implementation, aka `forEach`.
3983 // Handles raw objects in addition to array-likes. Treats all
3984 // sparse array-likes as if they were dense.
3985 _.each = _.forEach = function(obj, iteratee, context) {
3986 if (obj == null) return obj;
3987 iteratee = createCallback(iteratee, context);
3988 var i, length = obj.length;
3989 if (length === +length) {
3990 for (i = 0; i < length; i++) {
3991 iteratee(obj[i], i, obj);
3994 var keys = _.keys(obj);
3995 for (i = 0, length = keys.length; i < length; i++) {
3996 iteratee(obj[keys[i]], keys[i], obj);
4002 // Return the results of applying the iteratee to each element.
4003 _.map = _.collect = function(obj, iteratee, context) {
4004 if (obj == null) return [];
4005 iteratee = _.iteratee(iteratee, context);
4006 var keys = obj.length !== +obj.length && _.keys(obj),
4007 length = (keys || obj).length,
4008 results = Array(length),
4010 for (var index = 0; index < length; index++) {
4011 currentKey = keys ? keys[index] : index;
4012 results[index] = iteratee(obj[currentKey], currentKey, obj);
4017 var reduceError = 'Reduce of empty array with no initial value';
4019 // **Reduce** builds up a single result from a list of values, aka `inject`,
4021 _.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) {
4022 if (obj == null) obj = [];
4023 iteratee = createCallback(iteratee, context, 4);
4024 var keys = obj.length !== +obj.length && _.keys(obj),
4025 length = (keys || obj).length,
4026 index = 0, currentKey;
4027 if (arguments.length < 3) {
4028 if (!length) throw new TypeError(reduceError);
4029 memo = obj[keys ? keys[index++] : index++];
4031 for (; index < length; index++) {
4032 currentKey = keys ? keys[index] : index;
4033 memo = iteratee(memo, obj[currentKey], currentKey, obj);
4038 // The right-associative version of reduce, also known as `foldr`.
4039 _.reduceRight = _.foldr = function(obj, iteratee, memo, context) {
4040 if (obj == null) obj = [];
4041 iteratee = createCallback(iteratee, context, 4);
4042 var keys = obj.length !== + obj.length && _.keys(obj),
4043 index = (keys || obj).length,
4045 if (arguments.length < 3) {
4046 if (!index) throw new TypeError(reduceError);
4047 memo = obj[keys ? keys[--index] : --index];
4050 currentKey = keys ? keys[index] : index;
4051 memo = iteratee(memo, obj[currentKey], currentKey, obj);
4056 // Return the first value which passes a truth test. Aliased as `detect`.
4057 _.find = _.detect = function(obj, predicate, context) {
4059 predicate = _.iteratee(predicate, context);
4060 _.some(obj, function(value, index, list) {
4061 if (predicate(value, index, list)) {
4069 // Return all the elements that pass a truth test.
4070 // Aliased as `select`.
4071 _.filter = _.select = function(obj, predicate, context) {
4073 if (obj == null) return results;
4074 predicate = _.iteratee(predicate, context);
4075 _.each(obj, function(value, index, list) {
4076 if (predicate(value, index, list)) results.push(value);
4081 // Return all the elements for which a truth test fails.
4082 _.reject = function(obj, predicate, context) {
4083 return _.filter(obj, _.negate(_.iteratee(predicate)), context);
4086 // Determine whether all of the elements match a truth test.
4087 // Aliased as `all`.
4088 _.every = _.all = function(obj, predicate, context) {
4089 if (obj == null) return true;
4090 predicate = _.iteratee(predicate, context);
4091 var keys = obj.length !== +obj.length && _.keys(obj),
4092 length = (keys || obj).length,
4094 for (index = 0; index < length; index++) {
4095 currentKey = keys ? keys[index] : index;
4096 if (!predicate(obj[currentKey], currentKey, obj)) return false;
4101 // Determine if at least one element in the object matches a truth test.
4102 // Aliased as `any`.
4103 _.some = _.any = function(obj, predicate, context) {
4104 if (obj == null) return false;
4105 predicate = _.iteratee(predicate, context);
4106 var keys = obj.length !== +obj.length && _.keys(obj),
4107 length = (keys || obj).length,
4109 for (index = 0; index < length; index++) {
4110 currentKey = keys ? keys[index] : index;
4111 if (predicate(obj[currentKey], currentKey, obj)) return true;
4116 // Determine if the array or object contains a given value (using `===`).
4117 // Aliased as `include`.
4118 _.contains = _.include = function(obj, target) {
4119 if (obj == null) return false;
4120 if (obj.length !== +obj.length) obj = _.values(obj);
4121 return _.indexOf(obj, target) >= 0;
4124 // Invoke a method (with arguments) on every item in a collection.
4125 _.invoke = function(obj, method) {
4126 var args = slice.call(arguments, 2);
4127 var isFunc = _.isFunction(method);
4128 return _.map(obj, function(value) {
4129 return (isFunc ? method : value[method]).apply(value, args);
4133 // Convenience version of a common use case of `map`: fetching a property.
4134 _.pluck = function(obj, key) {
4135 return _.map(obj, _.property(key));
4138 // Convenience version of a common use case of `filter`: selecting only objects
4139 // containing specific `key:value` pairs.
4140 _.where = function(obj, attrs) {
4141 return _.filter(obj, _.matches(attrs));
4144 // Convenience version of a common use case of `find`: getting the first object
4145 // containing specific `key:value` pairs.
4146 _.findWhere = function(obj, attrs) {
4147 return _.find(obj, _.matches(attrs));
4150 // Return the maximum element (or element-based computation).
4151 _.max = function(obj, iteratee, context) {
4152 var result = -Infinity, lastComputed = -Infinity,
4154 if (iteratee == null && obj != null) {
4155 obj = obj.length === +obj.length ? obj : _.values(obj);
4156 for (var i = 0, length = obj.length; i < length; i++) {
4158 if (value > result) {
4163 iteratee = _.iteratee(iteratee, context);
4164 _.each(obj, function(value, index, list) {
4165 computed = iteratee(value, index, list);
4166 if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
4168 lastComputed = computed;
4175 // Return the minimum element (or element-based computation).
4176 _.min = function(obj, iteratee, context) {
4177 var result = Infinity, lastComputed = Infinity,
4179 if (iteratee == null && obj != null) {
4180 obj = obj.length === +obj.length ? obj : _.values(obj);
4181 for (var i = 0, length = obj.length; i < length; i++) {
4183 if (value < result) {
4188 iteratee = _.iteratee(iteratee, context);
4189 _.each(obj, function(value, index, list) {
4190 computed = iteratee(value, index, list);
4191 if (computed < lastComputed || computed === Infinity && result === Infinity) {
4193 lastComputed = computed;
4200 // Shuffle a collection, using the modern version of the
4201 // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
4202 _.shuffle = function(obj) {
4203 var set = obj && obj.length === +obj.length ? obj : _.values(obj);
4204 var length = set.length;
4205 var shuffled = Array(length);
4206 for (var index = 0, rand; index < length; index++) {
4207 rand = _.random(0, index);
4208 if (rand !== index) shuffled[index] = shuffled[rand];
4209 shuffled[rand] = set[index];
4214 // Sample **n** random values from a collection.
4215 // If **n** is not specified, returns a single random element.
4216 // The internal `guard` argument allows it to work with `map`.
4217 _.sample = function(obj, n, guard) {
4218 if (n == null || guard) {
4219 if (obj.length !== +obj.length) obj = _.values(obj);
4220 return obj[_.random(obj.length - 1)];
4222 return _.shuffle(obj).slice(0, Math.max(0, n));
4225 // Sort the object's values by a criterion produced by an iteratee.
4226 _.sortBy = function(obj, iteratee, context) {
4227 iteratee = _.iteratee(iteratee, context);
4228 return _.pluck(_.map(obj, function(value, index, list) {
4232 criteria: iteratee(value, index, list)
4234 }).sort(function(left, right) {
4235 var a = left.criteria;
4236 var b = right.criteria;
4238 if (a > b || a === void 0) return 1;
4239 if (a < b || b === void 0) return -1;
4241 return left.index - right.index;
4245 // An internal function used for aggregate "group by" operations.
4246 var group = function(behavior) {
4247 return function(obj, iteratee, context) {
4249 iteratee = _.iteratee(iteratee, context);
4250 _.each(obj, function(value, index) {
4251 var key = iteratee(value, index, obj);
4252 behavior(result, value, key);
4258 // Groups the object's values by a criterion. Pass either a string attribute
4259 // to group by, or a function that returns the criterion.
4260 _.groupBy = group(function(result, value, key) {
4261 if (_.has(result, key)) result[key].push(value); else result[key] = [value];
4264 // Indexes the object's values by a criterion, similar to `groupBy`, but for
4265 // when you know that your index values will be unique.
4266 _.indexBy = group(function(result, value, key) {
4267 result[key] = value;
4270 // Counts instances of an object that group by a certain criterion. Pass
4271 // either a string attribute to count by, or a function that returns the
4273 _.countBy = group(function(result, value, key) {
4274 if (_.has(result, key)) result[key]++; else result[key] = 1;
4277 // Use a comparator function to figure out the smallest index at which
4278 // an object should be inserted so as to maintain order. Uses binary search.
4279 _.sortedIndex = function(array, obj, iteratee, context) {
4280 iteratee = _.iteratee(iteratee, context, 1);
4281 var value = iteratee(obj);
4282 var low = 0, high = array.length;
4283 while (low < high) {
4284 var mid = low + high >>> 1;
4285 if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
4290 // Safely create a real, live array from anything iterable.
4291 _.toArray = function(obj) {
4292 if (!obj) return [];
4293 if (_.isArray(obj)) return slice.call(obj);
4294 if (obj.length === +obj.length) return _.map(obj, _.identity);
4295 return _.values(obj);
4298 // Return the number of elements in an object.
4299 _.size = function(obj) {
4300 if (obj == null) return 0;
4301 return obj.length === +obj.length ? obj.length : _.keys(obj).length;
4304 // Split a collection into two arrays: one whose elements all satisfy the given
4305 // predicate, and one whose elements all do not satisfy the predicate.
4306 _.partition = function(obj, predicate, context) {
4307 predicate = _.iteratee(predicate, context);
4308 var pass = [], fail = [];
4309 _.each(obj, function(value, key, obj) {
4310 (predicate(value, key, obj) ? pass : fail).push(value);
4312 return [pass, fail];
4318 // Get the first element of an array. Passing **n** will return the first N
4319 // values in the array. Aliased as `head` and `take`. The **guard** check
4320 // allows it to work with `_.map`.
4321 _.first = _.head = _.take = function(array, n, guard) {
4322 if (array == null) return void 0;
4323 if (n == null || guard) return array[0];
4324 if (n < 0) return [];
4325 return slice.call(array, 0, n);
4328 // Returns everything but the last entry of the array. Especially useful on
4329 // the arguments object. Passing **n** will return all the values in
4330 // the array, excluding the last N. The **guard** check allows it to work with
4332 _.initial = function(array, n, guard) {
4333 return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
4336 // Get the last element of an array. Passing **n** will return the last N
4337 // values in the array. The **guard** check allows it to work with `_.map`.
4338 _.last = function(array, n, guard) {
4339 if (array == null) return void 0;
4340 if (n == null || guard) return array[array.length - 1];
4341 return slice.call(array, Math.max(array.length - n, 0));
4344 // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
4345 // Especially useful on the arguments object. Passing an **n** will return
4346 // the rest N values in the array. The **guard**
4347 // check allows it to work with `_.map`.
4348 _.rest = _.tail = _.drop = function(array, n, guard) {
4349 return slice.call(array, n == null || guard ? 1 : n);
4352 // Trim out all falsy values from an array.
4353 _.compact = function(array) {
4354 return _.filter(array, _.identity);
4357 // Internal implementation of a recursive `flatten` function.
4358 var flatten = function(input, shallow, strict, output) {
4359 if (shallow && _.every(input, _.isArray)) {
4360 return concat.apply(output, input);
4362 for (var i = 0, length = input.length; i < length; i++) {
4363 var value = input[i];
4364 if (!_.isArray(value) && !_.isArguments(value)) {
4365 if (!strict) output.push(value);
4366 } else if (shallow) {
4367 push.apply(output, value);
4369 flatten(value, shallow, strict, output);
4375 // Flatten out an array, either recursively (by default), or just one level.
4376 _.flatten = function(array, shallow) {
4377 return flatten(array, shallow, false, []);
4380 // Return a version of the array that does not contain the specified value(s).
4381 _.without = function(array) {
4382 return _.difference(array, slice.call(arguments, 1));
4385 // Produce a duplicate-free version of the array. If the array has already
4386 // been sorted, you have the option of using a faster algorithm.
4387 // Aliased as `unique`.
4388 _.uniq = _.unique = function(array, isSorted, iteratee, context) {
4389 if (array == null) return [];
4390 if (!_.isBoolean(isSorted)) {
4392 iteratee = isSorted;
4395 if (iteratee != null) iteratee = _.iteratee(iteratee, context);
4398 for (var i = 0, length = array.length; i < length; i++) {
4399 var value = array[i];
4401 if (!i || seen !== value) result.push(value);
4403 } else if (iteratee) {
4404 var computed = iteratee(value, i, array);
4405 if (_.indexOf(seen, computed) < 0) {
4406 seen.push(computed);
4409 } else if (_.indexOf(result, value) < 0) {
4416 // Produce an array that contains the union: each distinct element from all of
4417 // the passed-in arrays.
4418 _.union = function() {
4419 return _.uniq(flatten(arguments, true, true, []));
4422 // Produce an array that contains every item shared between all the
4423 // passed-in arrays.
4424 _.intersection = function(array) {
4425 if (array == null) return [];
4427 var argsLength = arguments.length;
4428 for (var i = 0, length = array.length; i < length; i++) {
4429 var item = array[i];
4430 if (_.contains(result, item)) continue;
4431 for (var j = 1; j < argsLength; j++) {
4432 if (!_.contains(arguments[j], item)) break;
4434 if (j === argsLength) result.push(item);
4439 // Take the difference between one array and a number of other arrays.
4440 // Only the elements present in just the first array will remain.
4441 _.difference = function(array) {
4442 var rest = flatten(slice.call(arguments, 1), true, true, []);
4443 return _.filter(array, function(value){
4444 return !_.contains(rest, value);
4448 // Zip together multiple lists into a single array -- elements that share
4449 // an index go together.
4450 _.zip = function(array) {
4451 if (array == null) return [];
4452 var length = _.max(arguments, 'length').length;
4453 var results = Array(length);
4454 for (var i = 0; i < length; i++) {
4455 results[i] = _.pluck(arguments, i);
4460 // Converts lists into objects. Pass either a single array of `[key, value]`
4461 // pairs, or two parallel arrays of the same length -- one of keys, and one of
4462 // the corresponding values.
4463 _.object = function(list, values) {
4464 if (list == null) return {};
4466 for (var i = 0, length = list.length; i < length; i++) {
4468 result[list[i]] = values[i];
4470 result[list[i][0]] = list[i][1];
4476 // Return the position of the first occurrence of an item in an array,
4477 // or -1 if the item is not included in the array.
4478 // If the array is large and already in sort order, pass `true`
4479 // for **isSorted** to use binary search.
4480 _.indexOf = function(array, item, isSorted) {
4481 if (array == null) return -1;
4482 var i = 0, length = array.length;
4484 if (typeof isSorted == 'number') {
4485 i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
4487 i = _.sortedIndex(array, item);
4488 return array[i] === item ? i : -1;
4491 for (; i < length; i++) if (array[i] === item) return i;
4495 _.lastIndexOf = function(array, item, from) {
4496 if (array == null) return -1;
4497 var idx = array.length;
4498 if (typeof from == 'number') {
4499 idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
4501 while (--idx >= 0) if (array[idx] === item) return idx;
4505 // Generate an integer Array containing an arithmetic progression. A port of
4506 // the native Python `range()` function. See
4507 // [the Python documentation](http://docs.python.org/library/functions.html#range).
4508 _.range = function(start, stop, step) {
4509 if (arguments.length <= 1) {
4515 var length = Math.max(Math.ceil((stop - start) / step), 0);
4516 var range = Array(length);
4518 for (var idx = 0; idx < length; idx++, start += step) {
4525 // Function (ahem) Functions
4526 // ------------------
4528 // Reusable constructor function for prototype setting.
4529 var Ctor = function(){};
4531 // Create a function bound to a given object (assigning `this`, and arguments,
4532 // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
4534 _.bind = function(func, context) {
4536 if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
4537 if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
4538 args = slice.call(arguments, 2);
4539 bound = function() {
4540 if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
4541 Ctor.prototype = func.prototype;
4542 var self = new Ctor;
4543 Ctor.prototype = null;
4544 var result = func.apply(self, args.concat(slice.call(arguments)));
4545 if (_.isObject(result)) return result;
4551 // Partially apply a function by creating a version that has had some of its
4552 // arguments pre-filled, without changing its dynamic `this` context. _ acts
4553 // as a placeholder, allowing any combination of arguments to be pre-filled.
4554 _.partial = function(func) {
4555 var boundArgs = slice.call(arguments, 1);
4558 var args = boundArgs.slice();
4559 for (var i = 0, length = args.length; i < length; i++) {
4560 if (args[i] === _) args[i] = arguments[position++];
4562 while (position < arguments.length) args.push(arguments[position++]);
4563 return func.apply(this, args);
4567 // Bind a number of an object's methods to that object. Remaining arguments
4568 // are the method names to be bound. Useful for ensuring that all callbacks
4569 // defined on an object belong to it.
4570 _.bindAll = function(obj) {
4571 var i, length = arguments.length, key;
4572 if (length <= 1) throw new Error('bindAll must be passed function names');
4573 for (i = 1; i < length; i++) {
4575 obj[key] = _.bind(obj[key], obj);
4580 // Memoize an expensive function by storing its results.
4581 _.memoize = function(func, hasher) {
4582 var memoize = function(key) {
4583 var cache = memoize.cache;
4584 var address = hasher ? hasher.apply(this, arguments) : key;
4585 if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
4586 return cache[address];
4592 // Delays a function for the given number of milliseconds, and then calls
4593 // it with the arguments supplied.
4594 _.delay = function(func, wait) {
4595 var args = slice.call(arguments, 2);
4596 return setTimeout(function(){
4597 return func.apply(null, args);
4601 // Defers a function, scheduling it to run after the current call stack has
4603 _.defer = function(func) {
4604 return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
4607 // Returns a function, that, when invoked, will only be triggered at most once
4608 // during a given window of time. Normally, the throttled function will run
4609 // as much as it can, without ever going more than once per `wait` duration;
4610 // but if you'd like to disable the execution on the leading edge, pass
4611 // `{leading: false}`. To disable execution on the trailing edge, ditto.
4612 _.throttle = function(func, wait, options) {
4613 var context, args, result;
4616 if (!options) options = {};
4617 var later = function() {
4618 previous = options.leading === false ? 0 : _.now();
4620 result = func.apply(context, args);
4621 if (!timeout) context = args = null;
4625 if (!previous && options.leading === false) previous = now;
4626 var remaining = wait - (now - previous);
4629 if (remaining <= 0 || remaining > wait) {
4630 clearTimeout(timeout);
4633 result = func.apply(context, args);
4634 if (!timeout) context = args = null;
4635 } else if (!timeout && options.trailing !== false) {
4636 timeout = setTimeout(later, remaining);
4642 // Returns a function, that, as long as it continues to be invoked, will not
4643 // be triggered. The function will be called after it stops being called for
4644 // N milliseconds. If `immediate` is passed, trigger the function on the
4645 // leading edge, instead of the trailing.
4646 _.debounce = function(func, wait, immediate) {
4647 var timeout, args, context, timestamp, result;
4649 var later = function() {
4650 var last = _.now() - timestamp;
4652 if (last < wait && last > 0) {
4653 timeout = setTimeout(later, wait - last);
4657 result = func.apply(context, args);
4658 if (!timeout) context = args = null;
4666 timestamp = _.now();
4667 var callNow = immediate && !timeout;
4668 if (!timeout) timeout = setTimeout(later, wait);
4670 result = func.apply(context, args);
4671 context = args = null;
4678 // Returns the first function passed as an argument to the second,
4679 // allowing you to adjust arguments, run code before and after, and
4680 // conditionally execute the original function.
4681 _.wrap = function(func, wrapper) {
4682 return _.partial(wrapper, func);
4685 // Returns a negated version of the passed-in predicate.
4686 _.negate = function(predicate) {
4688 return !predicate.apply(this, arguments);
4692 // Returns a function that is the composition of a list of functions, each
4693 // consuming the return value of the function that follows.
4694 _.compose = function() {
4695 var args = arguments;
4696 var start = args.length - 1;
4699 var result = args[start].apply(this, arguments);
4700 while (i--) result = args[i].call(this, result);
4705 // Returns a function that will only be executed after being called N times.
4706 _.after = function(times, func) {
4709 return func.apply(this, arguments);
4714 // Returns a function that will only be executed before being called N times.
4715 _.before = function(times, func) {
4719 memo = func.apply(this, arguments);
4727 // Returns a function that will be executed at most one time, no matter how
4728 // often you call it. Useful for lazy initialization.
4729 _.once = _.partial(_.before, 2);
4734 // Retrieve the names of an object's properties.
4735 // Delegates to **ECMAScript 5**'s native `Object.keys`
4736 _.keys = function(obj) {
4737 if (!_.isObject(obj)) return [];
4738 if (nativeKeys) return nativeKeys(obj);
4740 for (var key in obj) if (_.has(obj, key)) keys.push(key);
4744 // Retrieve the values of an object's properties.
4745 _.values = function(obj) {
4746 var keys = _.keys(obj);
4747 var length = keys.length;
4748 var values = Array(length);
4749 for (var i = 0; i < length; i++) {
4750 values[i] = obj[keys[i]];
4755 // Convert an object into a list of `[key, value]` pairs.
4756 _.pairs = function(obj) {
4757 var keys = _.keys(obj);
4758 var length = keys.length;
4759 var pairs = Array(length);
4760 for (var i = 0; i < length; i++) {
4761 pairs[i] = [keys[i], obj[keys[i]]];
4766 // Invert the keys and values of an object. The values must be serializable.
4767 _.invert = function(obj) {
4769 var keys = _.keys(obj);
4770 for (var i = 0, length = keys.length; i < length; i++) {
4771 result[obj[keys[i]]] = keys[i];
4776 // Return a sorted list of the function names available on the object.
4777 // Aliased as `methods`
4778 _.functions = _.methods = function(obj) {
4780 for (var key in obj) {
4781 if (_.isFunction(obj[key])) names.push(key);
4783 return names.sort();
4786 // Extend a given object with all the properties in passed-in object(s).
4787 _.extend = function(obj) {
4788 if (!_.isObject(obj)) return obj;
4790 for (var i = 1, length = arguments.length; i < length; i++) {
4791 source = arguments[i];
4792 for (prop in source) {
4793 if (hasOwnProperty.call(source, prop)) {
4794 obj[prop] = source[prop];
4801 // Return a copy of the object only containing the whitelisted properties.
4802 _.pick = function(obj, iteratee, context) {
4803 var result = {}, key;
4804 if (obj == null) return result;
4805 if (_.isFunction(iteratee)) {
4806 iteratee = createCallback(iteratee, context);
4808 var value = obj[key];
4809 if (iteratee(value, key, obj)) result[key] = value;
4812 var keys = concat.apply([], slice.call(arguments, 1));
4813 obj = new Object(obj);
4814 for (var i = 0, length = keys.length; i < length; i++) {
4816 if (key in obj) result[key] = obj[key];
4822 // Return a copy of the object without the blacklisted properties.
4823 _.omit = function(obj, iteratee, context) {
4824 if (_.isFunction(iteratee)) {
4825 iteratee = _.negate(iteratee);
4827 var keys = _.map(concat.apply([], slice.call(arguments, 1)), String);
4828 iteratee = function(value, key) {
4829 return !_.contains(keys, key);
4832 return _.pick(obj, iteratee, context);
4835 // Fill in a given object with default properties.
4836 _.defaults = function(obj) {
4837 if (!_.isObject(obj)) return obj;
4838 for (var i = 1, length = arguments.length; i < length; i++) {
4839 var source = arguments[i];
4840 for (var prop in source) {
4841 if (obj[prop] === void 0) obj[prop] = source[prop];
4847 // Create a (shallow-cloned) duplicate of an object.
4848 _.clone = function(obj) {
4849 if (!_.isObject(obj)) return obj;
4850 return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
4853 // Invokes interceptor with the obj, and then returns obj.
4854 // The primary purpose of this method is to "tap into" a method chain, in
4855 // order to perform operations on intermediate results within the chain.
4856 _.tap = function(obj, interceptor) {
4861 // Internal recursive comparison function for `isEqual`.
4862 var eq = function(a, b, aStack, bStack) {
4863 // Identical objects are equal. `0 === -0`, but they aren't identical.
4864 // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
4865 if (a === b) return a !== 0 || 1 / a === 1 / b;
4866 // A strict comparison is necessary because `null == undefined`.
4867 if (a == null || b == null) return a === b;
4868 // Unwrap any wrapped objects.
4869 if (a instanceof _) a = a._wrapped;
4870 if (b instanceof _) b = b._wrapped;
4871 // Compare `[[Class]]` names.
4872 var className = toString.call(a);
4873 if (className !== toString.call(b)) return false;
4874 switch (className) {
4875 // Strings, numbers, regular expressions, dates, and booleans are compared by value.
4876 case '[object RegExp]':
4877 // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
4878 case '[object String]':
4879 // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
4880 // equivalent to `new String("5")`.
4881 return '' + a === '' + b;
4882 case '[object Number]':
4883 // `NaN`s are equivalent, but non-reflexive.
4884 // Object(NaN) is equivalent to NaN
4885 if (+a !== +a) return +b !== +b;
4886 // An `egal` comparison is performed for other numeric values.
4887 return +a === 0 ? 1 / +a === 1 / b : +a === +b;
4888 case '[object Date]':
4889 case '[object Boolean]':
4890 // Coerce dates and booleans to numeric primitive values. Dates are compared by their
4891 // millisecond representations. Note that invalid dates with millisecond representations
4892 // of `NaN` are not equivalent.
4895 if (typeof a != 'object' || typeof b != 'object') return false;
4896 // Assume equality for cyclic structures. The algorithm for detecting cyclic
4897 // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
4898 var length = aStack.length;
4900 // Linear search. Performance is inversely proportional to the number of
4901 // unique nested structures.
4902 if (aStack[length] === a) return bStack[length] === b;
4904 // Objects with different constructors are not equivalent, but `Object`s
4905 // from different frames are.
4906 var aCtor = a.constructor, bCtor = b.constructor;
4909 // Handle Object.create(x) cases
4910 'constructor' in a && 'constructor' in b &&
4911 !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
4912 _.isFunction(bCtor) && bCtor instanceof bCtor)
4916 // Add the first object to the stack of traversed objects.
4920 // Recursively compare objects and arrays.
4921 if (className === '[object Array]') {
4922 // Compare array lengths to determine if a deep comparison is necessary.
4924 result = size === b.length;
4926 // Deep compare the contents, ignoring non-numeric properties.
4928 if (!(result = eq(a[size], b[size], aStack, bStack))) break;
4932 // Deep compare objects.
4933 var keys = _.keys(a), key;
4935 // Ensure that both objects contain the same number of properties before comparing deep equality.
4936 result = _.keys(b).length === size;
4939 // Deep compare each member
4941 if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
4945 // Remove the first object from the stack of traversed objects.
4951 // Perform a deep comparison to check if two objects are equal.
4952 _.isEqual = function(a, b) {
4953 return eq(a, b, [], []);
4956 // Is a given array, string, or object empty?
4957 // An "empty" object has no enumerable own-properties.
4958 _.isEmpty = function(obj) {
4959 if (obj == null) return true;
4960 if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;
4961 for (var key in obj) if (_.has(obj, key)) return false;
4965 // Is a given value a DOM element?
4966 _.isElement = function(obj) {
4967 return !!(obj && obj.nodeType === 1);
4970 // Is a given value an array?
4971 // Delegates to ECMA5's native Array.isArray
4972 _.isArray = nativeIsArray || function(obj) {
4973 return toString.call(obj) === '[object Array]';
4976 // Is a given variable an object?
4977 _.isObject = function(obj) {
4978 var type = typeof obj;
4979 return type === 'function' || type === 'object' && !!obj;
4982 // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
4983 _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
4984 _['is' + name] = function(obj) {
4985 return toString.call(obj) === '[object ' + name + ']';
4989 // Define a fallback version of the method in browsers (ahem, IE), where
4990 // there isn't any inspectable "Arguments" type.
4991 if (!_.isArguments(arguments)) {
4992 _.isArguments = function(obj) {
4993 return _.has(obj, 'callee');
4997 // Optimize `isFunction` if appropriate. Work around an IE 11 bug.
4998 if (typeof /./ !== 'function') {
4999 _.isFunction = function(obj) {
5000 return typeof obj == 'function' || false;
5004 // Is a given object a finite number?
5005 _.isFinite = function(obj) {
5006 return isFinite(obj) && !isNaN(parseFloat(obj));
5009 // Is the given value `NaN`? (NaN is the only number which does not equal itself).
5010 _.isNaN = function(obj) {
5011 return _.isNumber(obj) && obj !== +obj;
5014 // Is a given value a boolean?
5015 _.isBoolean = function(obj) {
5016 return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
5019 // Is a given value equal to null?
5020 _.isNull = function(obj) {
5021 return obj === null;
5024 // Is a given variable undefined?
5025 _.isUndefined = function(obj) {
5026 return obj === void 0;
5029 // Shortcut function for checking if an object has a given property directly
5030 // on itself (in other words, not on a prototype).
5031 _.has = function(obj, key) {
5032 return obj != null && hasOwnProperty.call(obj, key);
5035 // Utility Functions
5036 // -----------------
5038 // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
5039 // previous owner. Returns a reference to the Underscore object.
5040 _.noConflict = function() {
5041 root._ = previousUnderscore;
5045 // Keep the identity function around for default iteratees.
5046 _.identity = function(value) {
5050 _.constant = function(value) {
5056 _.noop = function(){};
5058 _.property = function(key) {
5059 return function(obj) {
5064 // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
5065 _.matches = function(attrs) {
5066 var pairs = _.pairs(attrs), length = pairs.length;
5067 return function(obj) {
5068 if (obj == null) return !length;
5069 obj = new Object(obj);
5070 for (var i = 0; i < length; i++) {
5071 var pair = pairs[i], key = pair[0];
5072 if (pair[1] !== obj[key] || !(key in obj)) return false;
5078 // Run a function **n** times.
5079 _.times = function(n, iteratee, context) {
5080 var accum = Array(Math.max(0, n));
5081 iteratee = createCallback(iteratee, context, 1);
5082 for (var i = 0; i < n; i++) accum[i] = iteratee(i);
5086 // Return a random integer between min and max (inclusive).
5087 _.random = function(min, max) {
5092 return min + Math.floor(Math.random() * (max - min + 1));
5095 // A (possibly faster) way to get the current timestamp as an integer.
5096 _.now = Date.now || function() {
5097 return new Date().getTime();
5100 // List of HTML entities for escaping.
5109 var unescapeMap = _.invert(escapeMap);
5111 // Functions for escaping and unescaping strings to/from HTML interpolation.
5112 var createEscaper = function(map) {
5113 var escaper = function(match) {
5116 // Regexes for identifying a key that needs to be escaped
5117 var source = '(?:' + _.keys(map).join('|') + ')';
5118 var testRegexp = RegExp(source);
5119 var replaceRegexp = RegExp(source, 'g');
5120 return function(string) {
5121 string = string == null ? '' : '' + string;
5122 return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
5125 _.escape = createEscaper(escapeMap);
5126 _.unescape = createEscaper(unescapeMap);
5128 // If the value of the named `property` is a function then invoke it with the
5129 // `object` as context; otherwise, return it.
5130 _.result = function(object, property) {
5131 if (object == null) return void 0;
5132 var value = object[property];
5133 return _.isFunction(value) ? object[property]() : value;
5136 // Generate a unique integer id (unique within the entire client session).
5137 // Useful for temporary DOM ids.
5139 _.uniqueId = function(prefix) {
5140 var id = ++idCounter + '';
5141 return prefix ? prefix + id : id;
5144 // By default, Underscore uses ERB-style template delimiters, change the
5145 // following template settings to use alternative delimiters.
5146 _.templateSettings = {
5147 evaluate : /<%([\s\S]+?)%>/g,
5148 interpolate : /<%=([\s\S]+?)%>/g,
5149 escape : /<%-([\s\S]+?)%>/g
5152 // When customizing `templateSettings`, if you don't want to define an
5153 // interpolation, evaluation or escaping regex, we need one that is
5154 // guaranteed not to match.
5155 var noMatch = /(.)^/;
5157 // Certain characters need to be escaped so that they can be put into a
5168 var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
5170 var escapeChar = function(match) {
5171 return '\\' + escapes[match];
5174 // JavaScript micro-templating, similar to John Resig's implementation.
5175 // Underscore templating handles arbitrary delimiters, preserves whitespace,
5176 // and correctly escapes quotes within interpolated code.
5177 // NB: `oldSettings` only exists for backwards compatibility.
5178 _.template = function(text, settings, oldSettings) {
5179 if (!settings && oldSettings) settings = oldSettings;
5180 settings = _.defaults({}, settings, _.templateSettings);
5182 // Combine delimiters into one regular expression via alternation.
5183 var matcher = RegExp([
5184 (settings.escape || noMatch).source,
5185 (settings.interpolate || noMatch).source,
5186 (settings.evaluate || noMatch).source
5187 ].join('|') + '|$', 'g');
5189 // Compile the template source, escaping string literals appropriately.
5191 var source = "__p+='";
5192 text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
5193 source += text.slice(index, offset).replace(escaper, escapeChar);
5194 index = offset + match.length;
5197 source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
5198 } else if (interpolate) {
5199 source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
5200 } else if (evaluate) {
5201 source += "';\n" + evaluate + "\n__p+='";
5204 // Adobe VMs need the match returned to produce the correct offest.
5209 // If a variable is not specified, place data values in local scope.
5210 if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
5212 source = "var __t,__p='',__j=Array.prototype.join," +
5213 "print=function(){__p+=__j.call(arguments,'');};\n" +
5214 source + 'return __p;\n';
5217 var render = new Function(settings.variable || 'obj', '_', source);
5223 var template = function(data) {
5224 return render.call(this, data, _);
5227 // Provide the compiled source as a convenience for precompilation.
5228 var argument = settings.variable || 'obj';
5229 template.source = 'function(' + argument + '){\n' + source + '}';
5234 // Add a "chain" function. Start chaining a wrapped Underscore object.
5235 _.chain = function(obj) {
5236 var instance = _(obj);
5237 instance._chain = true;
5243 // If Underscore is called as a function, it returns a wrapped object that
5244 // can be used OO-style. This wrapper holds altered versions of all the
5245 // underscore functions. Wrapped objects may be chained.
5247 // Helper function to continue chaining intermediate results.
5248 var result = function(obj) {
5249 return this._chain ? _(obj).chain() : obj;
5252 // Add your own custom functions to the Underscore object.
5253 _.mixin = function(obj) {
5254 _.each(_.functions(obj), function(name) {
5255 var func = _[name] = obj[name];
5256 _.prototype[name] = function() {
5257 var args = [this._wrapped];
5258 push.apply(args, arguments);
5259 return result.call(this, func.apply(_, args));
5264 // Add all of the Underscore functions to the wrapper object.
5267 // Add all mutator Array functions to the wrapper.
5268 _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
5269 var method = ArrayProto[name];
5270 _.prototype[name] = function() {
5271 var obj = this._wrapped;
5272 method.apply(obj, arguments);
5273 if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
5274 return result.call(this, obj);
5278 // Add all accessor Array functions to the wrapper.
5279 _.each(['concat', 'join', 'slice'], function(name) {
5280 var method = ArrayProto[name];
5281 _.prototype[name] = function() {
5282 return result.call(this, method.apply(this._wrapped, arguments));
5286 // Extracts the result from a wrapped and chained object.
5287 _.prototype.value = function() {
5288 return this._wrapped;
5291 // AMD registration happens at the end for compatibility with AMD loaders
5292 // that may not enforce next-turn semantics on modules. Even though general
5293 // practice for AMD registration is to be anonymous, underscore registers
5294 // as a named module because, like jQuery, it is a base library that is
5295 // popular enough to be bundled in a third party lib, but not be part of
5296 // an AMD load request. Those cases could generate an error when an
5297 // anonymous define() is called outside of a loader request.
5298 if (typeof define === 'function' && define.amd) {
5299 define('underscore', [], function() {
5305 },{}],60:[function(require,module,exports){
5308 _ = require("underscore");
5310 module.exports = function(seqs) {
5312 seqs = seqs.map(function(el) {
5313 return el.get("seq");
5315 occs = new Array(seqs.length);
5316 _.each(seqs, function(el, i) {
5317 return _.each(el, function(char, pos) {
5318 if (occs[pos] == null) {
5321 if (occs[pos][char] == null) {
5322 occs[pos][char] = 0;
5324 return occs[pos][char]++;
5327 return _.reduce(occs, function(memo, occ) {
5330 return memo += _.max(keys, function(key) {
5338 },{"underscore":59}],61:[function(require,module,exports){
5341 module.exports = identitiyCalc = function(seqs, consensus) {
5342 if (consensus === void 0) {
5343 console.warn("bug on consenus calc");
5346 return seqs.each(function(seqObj) {
5347 var i, matches, seq, total, _i, _ref;
5348 seq = seqObj.get("seq");
5351 for (i = _i = 0, _ref = seq.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
5352 if (seq[i] !== "-" && consensus[i] !== "-") {
5354 if (seq[i] === consensus[i]) {
5359 return seqObj.set("identity", matches / total);
5365 },{}],62:[function(require,module,exports){
5366 module.exports.consensus = require("./ConsensusCalc");
5370 },{"./ConsensusCalc":60}],63:[function(require,module,exports){
5371 var Colorator, Model;
5373 Model = require("backbone-thin").Model;
5375 module.exports = Colorator = Model.extend({
5378 colorBackground: true,
5379 showLowerCase: true,
5386 },{"backbone-thin":5}],64:[function(require,module,exports){
5387 var Columns, Model, consenus, _;
5389 Model = require("backbone-thin").Model;
5391 consenus = require("../algo/ConsensusCalc");
5393 _ = require("underscore");
5395 module.exports = Columns = Model.extend({
5399 initialize: function() {
5400 if (this.get("hidden") == null) {
5401 return this.set("hidden", []);
5404 calcHiddenColumns: function(n) {
5405 var hidden, i, newX, _i, _len;
5406 hidden = this.get("hidden");
5408 for (_i = 0, _len = hidden.length; _i < _len; _i++) {
5416 _calcConservationPre: function(seqs) {
5417 var cons, matches, nMax, total;
5418 console.log(seqs.length);
5419 if (seqs.length > 1000) {
5422 cons = consenus(seqs);
5423 seqs = seqs.map(function(el) {
5424 return el.get("seq");
5426 nMax = (_.max(seqs, function(el) {
5429 total = new Array(nMax);
5430 matches = new Array(nMax);
5431 _.each(seqs, function(el, i) {
5432 return _.each(el, function(char, pos) {
5433 total[pos] = total[pos] + 1 || 1;
5434 if (cons[pos] === char) {
5435 return matches[pos] = matches[pos] + 1 || 1;
5439 return [matches, total, nMax];
5441 calcConservation: function(seqs) {
5442 if (this.attributes.scaling === "exp") {
5443 return this.calcConservationExp(seqs);
5444 } else if (this.attributes.scaling === "log") {
5445 return this.calcConservationLog(seqs);
5446 } else if (this.attributes.scaling === "lin") {
5447 return this.calcConservationLin(seqs);
5450 calcConservationLin: function(seqs) {
5451 var i, matches, nMax, total, _i, _ref, _ref1;
5452 _ref = this._calcConservationPre(seqs), matches = _ref[0], total = _ref[1], nMax = _ref[2];
5453 for (i = _i = 0, _ref1 = nMax - 1; 0 <= _ref1 ? _i <= _ref1 : _i >= _ref1; i = 0 <= _ref1 ? ++_i : --_i) {
5454 matches[i] = matches[i] / total[i];
5456 this.set("conserv", matches);
5459 calcConservationLog: function(seqs) {
5460 var i, matches, nMax, total, _i, _ref, _ref1;
5461 _ref = this._calcConservationPre(seqs), matches = _ref[0], total = _ref[1], nMax = _ref[2];
5462 for (i = _i = 0, _ref1 = nMax - 1; 0 <= _ref1 ? _i <= _ref1 : _i >= _ref1; i = 0 <= _ref1 ? ++_i : --_i) {
5463 matches[i] = Math.log(matches[i] + 1) / Math.log(total[i] + 1);
5465 this.set("conserv", matches);
5468 calcConservationExp: function(seqs) {
5469 var i, matches, nMax, total, _i, _ref, _ref1;
5470 _ref = this._calcConservationPre(seqs), matches = _ref[0], total = _ref[1], nMax = _ref[2];
5471 for (i = _i = 0, _ref1 = nMax - 1; 0 <= _ref1 ? _i <= _ref1 : _i >= _ref1; i = 0 <= _ref1 ? ++_i : --_i) {
5472 matches[i] = Math.exp(matches[i] + 1) / Math.exp(total[i] + 1);
5474 this.set("conserv", matches);
5481 },{"../algo/ConsensusCalc":60,"backbone-thin":5,"underscore":59}],65:[function(require,module,exports){
5484 Model = require("backbone-thin").Model;
5486 module.exports = Config = Model.extend({
5488 registerMouseHover: false,
5489 registerMouseClicks: true,
5490 importProxy: "https://cors-anywhere.herokuapp.com/",
5497 },{"backbone-thin":5}],66:[function(require,module,exports){
5498 var Consenus, Model, consenusCalc;
5500 Model = require("backbone-thin").Model;
5502 consenusCalc = require("../algo/ConsensusCalc");
5504 module.exports = Consenus = Model.extend({
5508 getConsensus: function(seqs) {
5510 if (seqs.length > 1000) {
5513 cons = consenusCalc(seqs);
5514 this.set("consenus", cons);
5521 },{"../algo/ConsensusCalc":60,"backbone-thin":5}],67:[function(require,module,exports){
5522 var ColumnSelection, Model, PosSelection, RowSelection, Selection, _;
5524 _ = require("underscore");
5526 Model = require("backbone-thin").Model;
5528 Selection = Model.extend({
5534 RowSelection = Selection.extend({
5535 defaults: _.extend({}, Selection.prototype.defaults, {
5539 inRow: function(seqId) {
5540 return seqId === this.get("seqId");
5542 inColumn: function(rowPos) {
5545 getLength: function() {
5550 ColumnSelection = Selection.extend({
5551 defaults: _.extend({}, Selection.prototype.defaults, {
5559 inColumn: function(rowPos) {
5560 return xStart <= rowPos && rowPos <= xEnd;
5562 getLength: function() {
5563 return xEnd - xStart;
5567 PosSelection = RowSelection.extend(_.extend({}, _.pick(ColumnSelection, "inColumn"), _.pick(ColumnSelection, "getLength"), {
5568 defaults: _.extend({}, ColumnSelection.prototype.defaults, RowSelection.prototype.defaults, {
5573 module.exports.sel = Selection;
5575 module.exports.possel = PosSelection;
5577 module.exports.rowsel = RowSelection;
5579 module.exports.columnsel = ColumnSelection;
5583 },{"backbone-thin":5,"underscore":59}],68:[function(require,module,exports){
5584 var Collection, SelectionManager, sel, _;
5586 sel = require("./Selection");
5588 _ = require("underscore");
5590 Collection = require("backbone-thin").Collection;
5592 module.exports = SelectionManager = Collection.extend({
5594 initialize: function(data, opts) {
5596 this.listenTo(this.g, "residue:click", function(e) {
5597 return this._handleE(e.evt, new sel.possel({
5603 this.listenTo(this.g, "row:click", function(e) {
5604 return this._handleE(e.evt, new sel.rowsel({
5610 return this.listenTo(this.g, "column:click", function(e) {
5611 return this._handleE(e.evt, new sel.columnsel({
5613 xEnd: e.rowPos + e.stepSize - 1
5617 getSelForRow: function(seqId) {
5618 return this.filter(function(el) {
5619 return el.inRow(seqId);
5622 getSelForColumns: function(rowPos) {
5623 return this.filter(function(el) {
5624 return el.inColumn(rowPos);
5627 getBlocksForRow: function(seqId, maxLen) {
5628 var blocks, seli, selis, _i, _j, _k, _len, _ref, _ref1, _results, _results1;
5629 selis = this.filter(function(el) {
5630 return el.inRow(seqId);
5633 for (_i = 0, _len = selis.length; _i < _len; _i++) {
5635 if (seli.attributes.type === "row") {
5636 blocks = (function() {
5638 for (var _j = 0; 0 <= maxLen ? _j <= maxLen : _j >= maxLen; 0 <= maxLen ? _j++ : _j--){ _results.push(_j); }
5643 blocks = blocks.concat((function() {
5645 for (var _k = _ref = seli.attributes.xStart, _ref1 = seli.attributes.xEnd; _ref <= _ref1 ? _k <= _ref1 : _k >= _ref1; _ref <= _ref1 ? _k++ : _k--){ _results1.push(_k); }
5652 getAllColumnBlocks: function(conf) {
5653 var blocks, filtered, maxLen, seli, withPos, _i, _j, _len, _ref, _ref1, _results;
5654 maxLen = conf.maxLen;
5655 withPos = conf.withPos;
5658 filtered = this.filter(function(el) {
5659 return el.get('xStart') != null;
5662 filtered = this.filter(function(el) {
5663 return el.get('type') === "column";
5666 for (_i = 0, _len = filtered.length; _i < _len; _i++) {
5667 seli = filtered[_i];
5668 blocks = blocks.concat((function() {
5670 for (var _j = _ref = seli.attributes.xStart, _ref1 = seli.attributes.xEnd; _ref <= _ref1 ? _j <= _ref1 : _j >= _ref1; _ref <= _ref1 ? _j++ : _j--){ _results.push(_j); }
5674 blocks = _.uniq(blocks);
5677 invertRow: function(rows) {
5678 var el, inverted, s, selRows, _i, _len;
5679 selRows = this.where({
5682 selRows = _.map(selRows, function(el) {
5683 return el.attributes.seqId;
5685 inverted = _.filter(rows, function(el) {
5686 if (selRows.indexOf(el) >= 0) {
5692 for (_i = 0, _len = inverted.length; _i < _len; _i++) {
5694 s.push(new sel.rowsel({
5699 return this.reset(s);
5701 invertCol: function(columns) {
5702 var el, inverted, s, selColumns, xEnd, xStart, _i, _len;
5703 selColumns = this.where({
5706 selColumns = _.reduce(selColumns, function(memo, el) {
5707 var _i, _ref, _ref1, _results;
5708 return memo.concat((function() {
5710 for (var _i = _ref = el.attributes.xStart, _ref1 = el.attributes.xEnd; _ref <= _ref1 ? _i <= _ref1 : _i >= _ref1; _ref <= _ref1 ? _i++ : _i--){ _results.push(_i); }
5714 inverted = _.filter(columns, function(el) {
5715 if (selColumns.indexOf(el) >= 0) {
5720 if (inverted.length === 0) {
5724 console.log(inverted);
5725 xStart = xEnd = inverted[0];
5726 for (_i = 0, _len = inverted.length; _i < _len; _i++) {
5728 if (xEnd + 1 === el) {
5731 s.push(new sel.columnsel({
5738 if (xStart !== xEnd) {
5739 s.push(new sel.columnsel({
5741 xEnd: inverted[inverted.length - 1]
5744 return this.reset(s);
5746 _handleE: function(e, selection) {
5747 if (e.ctrlKey || e.metaKey) {
5748 return this.add(selection);
5750 return this.reset([selection]);
5753 _reduceColumns: function() {
5754 return this.each(function(el, index, arr) {
5755 var cols, left, lefts, right, rights, xEnd, xStart, _i, _j, _len, _len1;
5756 cols = _.filter(arr, function(el) {
5757 return el.get('type') === 'column';
5759 xStart = el.get('xStart');
5760 xEnd = el.get('xEnd');
5761 lefts = _.filter(cols, function(el) {
5762 return el.get('xEnd') === (xStart - 1);
5764 for (_i = 0, _len = lefts.length; _i < _len; _i++) {
5766 left.set('xEnd', xStart);
5768 rights = _.filter(cols, function(el) {
5769 return el.get('xStart') === (xEnd + 1);
5771 for (_j = 0, _len1 = rights.length; _j < _len1; _j++) {
5773 right.set('xStart', xEnd);
5775 if (lefts.length > 0 || rights.length > 0) {
5776 console.log("removed el");
5777 return el.collection.remove(el);
5785 },{"./Selection":67,"backbone-thin":5,"underscore":59}],69:[function(require,module,exports){
5786 var Model, Visibility;
5788 Model = require("backbone-thin").Model;
5790 module.exports = Visibility = Model.extend({
5800 },{"backbone-thin":5}],70:[function(require,module,exports){
5801 var Model, Visibility;
5803 Model = require("backbone-thin").Model;
5805 module.exports = Visibility = Model.extend({
5815 labelPartition: false,
5816 labelCheckbox: false
5822 },{"backbone-thin":5}],71:[function(require,module,exports){
5825 Model = require("backbone-thin").Model;
5827 module.exports = Zoomer = Model.extend({
5828 constructor: function(attributes, options) {
5829 Model.apply(this, arguments);
5834 alignmentWidth: "auto",
5835 alignmentHeight: 195,
5842 labelFontsize: "13px",
5843 labelLineHeight: "13px",
5844 markerFontsize: "10px",
5847 residueFont: "13px mono",
5848 canvasEventScale: 1,
5851 menuFontsize: "20px",
5852 menuItemFontsize: "18px",
5853 menuItemLineHeight: "18px",
5854 menuMarginLeft: "5px",
5855 menuPadding: "3px 5px 3px 5px",
5856 _alignmentScrollLeft: 0,
5857 _alignmentScrollTop: 0
5859 getAlignmentWidth: function(n) {
5860 if (this.get("alignmentWidth") === "auto") {
5861 return this.get("columnWidth") * n;
5863 return this.get("alignmentWidth");
5866 setLeftOffset: function(n) {
5868 val = (n - 1) * this.get('columnWidth');
5869 val = Math.max(0, val);
5870 return this.set("_alignmentScrollLeft", val);
5872 setTopOffset: function(n) {
5874 val = (n - 1) * this.get('rowHeight');
5875 val = Math.max(0, val);
5876 return this.set("_alignmentScrollTop", val);
5878 getLabelWidth: function() {
5881 if (this.g.vis.get("labels")) {
5882 paddingLeft += this.get("labelWidth");
5884 if (this.g.vis.get("metacell")) {
5885 paddingLeft += this.get("metaWidth");
5889 _adjustWidth: function(el, model) {
5890 var calcWidth, maxWidth, parentWidth, val;
5891 if ((el.parentNode != null) && el.parentNode.offsetWidth !== 0) {
5892 parentWidth = el.parentNode.offsetWidth;
5894 parentWidth = document.body.clientWidth - 35;
5896 maxWidth = parentWidth - this.getLabelWidth();
5897 calcWidth = this.getAlignmentWidth(model.getMaxLength() - this.g.columns.get('hidden').length);
5898 val = Math.min(maxWidth, calcWidth);
5899 val = Math.floor(val / this.get("columnWidth")) * this.get("columnWidth");
5900 return this.set("alignmentWidth", val);
5902 _checkScrolling: function(scrollObj, opts) {
5903 var xScroll, yScroll;
5904 xScroll = scrollObj[0];
5905 yScroll = scrollObj[1];
5906 this.set("_alignmentScrollLeft", xScroll, opts);
5907 return this.set("_alignmentScrollTop", yScroll, opts);
5913 },{"backbone-thin":5}],72:[function(require,module,exports){
5914 module.exports.msa = require("./msa");
5916 module.exports.model = require("./model");
5918 module.exports.algo = require("./algo");
5920 module.exports.menu = require("./menu");
5922 module.exports.utils = require("./utils");
5924 module.exports.selection = require("./g/selection/Selection");
5926 module.exports.view = require("backbone-viewj");
5928 module.exports.boneView = require("backbone-childs");
5930 module.exports._ = require('underscore');
5932 module.exports.$ = require('jbone');
5934 module.exports.version = "0.1.0";
5938 },{"./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){
5939 var ColorMenu, ExportMenu, ExtraMenu, FilterMenu, HelpMenu, ImportMenu, MenuView, OrderingMenu, SelectionMenu, VisMenu, boneView;
5941 boneView = require("backbone-childs");
5943 ImportMenu = require("./views/ImportMenu");
5945 FilterMenu = require("./views/FilterMenu");
5947 SelectionMenu = require("./views/SelectionMenu");
5949 VisMenu = require("./views/VisMenu");
5951 ColorMenu = require("./views/ColorMenu");
5953 OrderingMenu = require("./views/OrderingMenu");
5955 ExtraMenu = require("./views/ExtraMenu");
5957 ExportMenu = require("./views/ExportMenu");
5959 HelpMenu = require("./views/HelpMenu");
5961 module.exports = MenuView = boneView.extend({
5962 initialize: function(data) {
5963 this.msa = data.msa;
5964 this.addView("10_import", new ImportMenu({
5965 model: this.msa.seqs,
5968 this.addView("20_filter", new FilterMenu({
5969 model: this.msa.seqs,
5972 this.addView("30_selection", new SelectionMenu({
5973 model: this.msa.seqs,
5976 this.addView("40_vis", new VisMenu({
5977 model: this.msa.seqs,
5980 this.addView("50_color", new ColorMenu({
5981 model: this.msa.seqs,
5984 this.addView("60_ordering", new OrderingMenu({
5985 model: this.msa.seqs,
5988 this.addView("70_extra", new ExtraMenu({
5989 model: this.msa.seqs,
5992 this.addView("80_export", new ExportMenu({
5993 model: this.msa.seqs,
5997 return this.addView("90_help", new HelpMenu({
6001 render: function() {
6002 this.renderSubviews();
6003 this.el.setAttribute("class", "biojs_msa_menubar");
6004 return this.el.appendChild(document.createElement("p"));
6010 },{"./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){
6011 module.exports.defaultmenu = require("./defaultmenu");
6013 module.exports.menubuilder = require("./menubuilder");
6017 },{"./defaultmenu":73,"./menubuilder":75}],75:[function(require,module,exports){
6018 var BMath, MenuBuilder, jbone, view;
6020 BMath = require("../utils/bmath");
6022 jbone = require("jbone");
6024 view = require("backbone-viewj");
6026 module.exports = MenuBuilder = view.extend({
6027 setName: function(name) {
6029 return this._nodes = [];
6031 addNode: function(label, callback, data) {
6036 if (this._nodes == null) {
6039 return this._nodes.push({
6045 buildDOM: function() {
6046 return this._buildM({
6051 _buildM: function(data) {
6052 var displayedButton, frag, key, li, menu, menuUl, name, node, nodes, style, _i, _len, _ref;
6055 menu = document.createElement("div");
6056 menu.className = "dropdown dropdown-tip";
6057 menu.id = "adrop-" + BMath.uniqueId();
6058 menu.style.display = "none";
6059 menuUl = document.createElement("ul");
6060 menuUl.className = "dropdown-menu";
6061 for (_i = 0, _len = nodes.length; _i < _len; _i++) {
6063 li = document.createElement("li");
6064 li.textContent = node.label;
6068 li.style[key] = style;
6070 li.addEventListener("click", node.callback);
6071 if (this.g != null) {
6072 li.style.lineHeight = this.g.zoomer.get("menuItemLineHeight");
6074 menuUl.appendChild(li);
6076 menu.appendChild(menuUl);
6077 frag = document.createDocumentFragment();
6078 displayedButton = document.createElement("a");
6079 displayedButton.textContent = name;
6080 displayedButton.className = "biojs_msa_menubar_alink";
6081 if (this.g != null) {
6082 menuUl.style.fontSize = this.g.zoomer.get("menuItemFontsize");
6083 displayedButton.style.fontSize = this.g.zoomer.get("menuFontsize");
6084 displayedButton.style.marginLeft = this.g.zoomer.get("menuMarginLeft");
6085 displayedButton.style.padding = this.g.zoomer.get("menuPadding");
6087 jbone(displayedButton).on("click", (function(_this) {
6088 return function(e) {
6089 _this._showMenu(e, menu, displayedButton);
6090 return window.setTimeout(function() {
6091 return jbone(document.body).one("click", function(e) {
6092 console.log("next click");
6093 return menu.style.display = "none";
6098 frag.appendChild(menu);
6099 frag.appendChild(displayedButton);
6102 _showMenu: function(e, menu, target) {
6104 menu.style.display = "block";
6105 menu.style.position = "absolute";
6106 rect = target.getBoundingClientRect();
6107 menu.style.left = rect.left + "px";
6108 return menu.style.top = (rect.top + target.offsetHeight) + "px";
6114 },{"../utils/bmath":91,"backbone-viewj":10,"jbone":50}],76:[function(require,module,exports){
6115 var ColorMenu, MenuBuilder, dom, _;
6117 MenuBuilder = require("../menubuilder");
6119 _ = require("underscore");
6121 dom = require("dom-helper");
6123 module.exports = ColorMenu = MenuBuilder.extend({
6124 initialize: function(data) {
6126 this.el.style.display = "inline-block";
6127 return this.listenTo(this.g.colorscheme, "change", function() {
6128 return this.render();
6131 render: function() {
6132 var colorschemes, menuColor, scheme, text, _i, _len;
6133 menuColor = this.setName("Color scheme");
6134 colorschemes = this.getColorschemes();
6135 for (_i = 0, _len = colorschemes.length; _i < _len; _i++) {
6136 scheme = colorschemes[_i];
6137 this.addScheme(menuColor, scheme);
6139 text = "Background";
6140 if (this.g.colorscheme.get("colorBackground")) {
6141 text = "Hide " + text;
6143 text = "Show " + text;
6145 this.addNode(text, (function(_this) {
6147 return _this.g.colorscheme.set("colorBackground", !_this.g.colorscheme.get("colorBackground"));
6150 this.grey(menuColor);
6151 dom.removeAllChilds(this.el);
6152 this.el.appendChild(this.buildDOM());
6155 addScheme: function(menuColor, scheme) {
6158 current = this.g.colorscheme.get("scheme");
6159 if (current === scheme.id) {
6160 style.backgroundColor = "#77ED80";
6162 return this.addNode(scheme.name, (function(_this) {
6164 return _this.g.colorscheme.set("scheme", scheme.id);
6170 getColorschemes: function() {
6182 name: "Hydrophobicity",
6239 grey: function(menuColor) {
6240 this.addNode("Grey", (function(_this) {
6242 _this.g.colorscheme.set("showLowerCase", false);
6243 return _this.model.each(function(seq) {
6245 residues = seq.get("seq");
6247 _.each(residues, function(el, index) {
6248 if (el === el.toLowerCase()) {
6249 return grey.push(index);
6252 return seq.set("grey", grey);
6256 this.addNode("Grey by threshold", (function(_this) {
6258 var conserv, grey, i, maxLen, threshold, _i, _ref;
6259 threshold = prompt("Enter threshold (in percent)", 20);
6260 threshold = threshold / 100;
6261 maxLen = _this.model.getMaxLength();
6262 conserv = _this.g.columns.get("conserv");
6264 for (i = _i = 0, _ref = maxLen - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
6265 console.log(conserv[i]);
6266 if (conserv[i] < threshold) {
6270 return _this.model.each(function(seq) {
6271 return seq.set("grey", grey);
6275 this.addNode("Grey selection", (function(_this) {
6278 maxLen = _this.model.getMaxLength();
6279 return _this.model.each(function(seq) {
6281 blocks = _this.g.selcol.getBlocksForRow(seq.get("id"), maxLen);
6282 return seq.set("grey", blocks);
6286 return this.addNode("Reset grey", (function(_this) {
6288 _this.g.colorscheme.set("showLowerCase", true);
6289 return _this.model.each(function(seq) {
6290 return seq.set("grey", []);
6299 },{"../menubuilder":75,"dom-helper":49,"underscore":59}],77:[function(require,module,exports){
6300 var ExportMenu, FastaExporter, MenuBuilder, blobURL, saveAs, _;
6302 MenuBuilder = require("../menubuilder");
6304 saveAs = require("browser-saveas");
6306 FastaExporter = require("biojs-io-fasta").writer;
6308 _ = require("underscore");
6310 blobURL = require("blueimp_canvastoblob");
6312 module.exports = ExportMenu = MenuBuilder.extend({
6313 initialize: function(data) {
6315 this.msa = data.msa;
6316 return this.el.style.display = "inline-block";
6318 render: function() {
6319 this.setName("Export");
6320 this.addNode("Export sequences", (function(_this) {
6323 text = FastaExporter["export"](_this.model.toJSON());
6324 blob = new Blob([text], {
6327 return saveAs(blob, "all.fasta");
6330 this.addNode("Export selection", (function(_this) {
6332 var blob, i, selection, text, _i, _ref;
6333 selection = _this.g.selcol.pluck("seqId");
6334 if (selection != null) {
6335 selection = _this.model.filter(function(el) {
6336 return _.contains(selection, el.get("id"));
6338 for (i = _i = 0, _ref = selection.length - 1; _i <= _ref; i = _i += 1) {
6339 selection[i] = selection[i].toJSON();
6342 selection = _this.model.toJSON();
6343 console.log("no selection found");
6345 text = FastaExporter["export"](selection);
6346 blob = new Blob([text], {
6349 return saveAs(blob, "selection.fasta");
6352 this.addNode("Export image", (function(_this) {
6355 canvas = _this.msa.getView('stage').getView('body').getView('seqblock').el;
6356 if (canvas != null) {
6357 url = canvas.toDataURL('image/png');
6358 return saveAs(blobURL(url), "biojs-msa.png", "image/png");
6362 this.el.appendChild(this.buildDOM());
6369 },{"../menubuilder":75,"biojs-io-fasta":undefined,"blueimp_canvastoblob":46,"browser-saveas":47,"underscore":59}],78:[function(require,module,exports){
6370 var ExtraMenu, MenuBuilder, Seq, consenus;
6372 MenuBuilder = require("../menubuilder");
6374 consenus = require("../../algo/ConsensusCalc");
6376 Seq = require("../../model/Sequence");
6378 module.exports = ExtraMenu = MenuBuilder.extend({
6379 initialize: function(data) {
6381 return this.el.style.display = "inline-block";
6383 render: function() {
6384 this.setName("Extras");
6385 this.addNode("Add consensus seq", (function(_this) {
6388 con = consenus(_this.model);
6395 _this.model.add(seq);
6396 _this.model.comparator = function(seq) {
6397 return seq.get("id");
6399 return _this.model.sort();
6402 this.addNode("Increase font size", (function(_this) {
6404 _this.g.zoomer.set("columnWidth", _this.g.zoomer.get("columnWidth") + 2);
6405 _this.g.zoomer.set("labelWidth", _this.g.zoomer.get("columnWidth") + 5);
6406 _this.g.zoomer.set("rowHeight", _this.g.zoomer.get("rowHeight") + 2);
6407 return _this.g.zoomer.set("labelFontSize", _this.g.zoomer.get("labelFontSize") + 2);
6410 this.addNode("Decrease font size", (function(_this) {
6412 _this.g.zoomer.set("columnWidth", _this.g.zoomer.get("columnWidth") - 2);
6413 _this.g.zoomer.set("rowHeight", _this.g.zoomer.get("rowHeight") - 2);
6414 _this.g.zoomer.set("labelFontSize", _this.g.zoomer.get("labelFontSize") - 2);
6415 if (_this.g.zoomer.get("columnWidth") < 8) {
6416 return _this.g.zoomer.set("textVisible", false);
6420 this.addNode("Bar chart exp scaling", (function(_this) {
6422 return _this.g.columns.set("scaling", "exp");
6425 this.addNode("Bar chart linear scaling", (function(_this) {
6427 return _this.g.columns.set("scaling", "lin");
6430 this.addNode("Bar chart log scaling", (function(_this) {
6432 return _this.g.columns.set("scaling", "log");
6435 this.addNode("Minimized width", (function(_this) {
6437 return _this.g.zoomer.set("alignmentWidth", 600);
6440 this.addNode("Minimized height", (function(_this) {
6442 return _this.g.zoomer.set("alignmentHeight", 120);
6445 this.addNode("Jump to a column", (function(_this) {
6448 offset = prompt("Column", "20");
6449 if (offset < 0 || offset > _this.model.getMaxLength() || isNaN(offset)) {
6450 alert("invalid column");
6453 return _this.g.zoomer.setLeftOffset(offset);
6456 this.el.appendChild(this.buildDOM());
6463 },{"../../algo/ConsensusCalc":60,"../../model/Sequence":88,"../menubuilder":75}],79:[function(require,module,exports){
6464 var FilterMenu, MenuBuilder, _;
6466 MenuBuilder = require("../menubuilder");
6468 _ = require("underscore");
6470 module.exports = FilterMenu = MenuBuilder.extend({
6471 initialize: function(data) {
6473 return this.el.style.display = "inline-block";
6475 render: function() {
6476 this.setName("Filter");
6477 this.addNode("Hide columns by threshold", (function(_this) {
6478 return function(e) {
6479 var conserv, hidden, i, maxLen, threshold, _i, _ref;
6480 threshold = prompt("Enter threshold (in percent)", 20);
6481 threshold = threshold / 100;
6482 maxLen = _this.model.getMaxLength();
6484 conserv = _this.g.columns.get("conserv");
6485 for (i = _i = 0, _ref = maxLen - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
6486 if (conserv[i] < threshold) {
6490 return _this.g.columns.set("hidden", hidden);
6493 this.addNode("Hide columns by selection", (function(_this) {
6495 var hidden, hiddenOld;
6496 hiddenOld = _this.g.columns.get("hidden");
6497 hidden = hiddenOld.concat(_this.g.selcol.getAllColumnBlocks({
6498 maxLen: _this.model.getMaxLength(),
6501 _this.g.selcol.reset([]);
6502 return _this.g.columns.set("hidden", hidden);
6505 this.addNode("Hide columns by gaps", (function(_this) {
6507 var gapContent, gaps, hidden, i, maxLen, threshold, total, _i, _ref;
6508 threshold = prompt("Enter threshold (in percent)", 20);
6509 threshold = threshold / 100;
6510 maxLen = _this.model.getMaxLength();
6512 for (i = _i = 0, _ref = maxLen - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
6515 _this.model.each(function(el) {
6516 if (el.get('seq')[i] === "-") {
6521 gapContent = gaps / total;
6522 if (gapContent > threshold) {
6526 return _this.g.columns.set("hidden", hidden);
6529 this.addNode("Hide seqs by identity", (function(_this) {
6532 threshold = prompt("Enter threshold (in percent)", 20);
6533 threshold = threshold / 100;
6534 return _this.model.each(function(el) {
6535 if (el.get('identity') < threshold) {
6536 return el.set('hidden', true);
6541 this.addNode("Hide seqs by selection", (function(_this) {
6544 hidden = _this.g.selcol.where({
6547 ids = _.map(hidden, function(el) {
6548 return el.get('seqId');
6550 _this.g.selcol.reset([]);
6551 return _this.model.each(function(el) {
6552 if (ids.indexOf(el.get('id')) >= 0) {
6553 return el.set('hidden', true);
6558 this.addNode("Hide seqs by gaps", (function(_this) {
6561 threshold = prompt("Enter threshold (in percent)", 40);
6562 return _this.model.each(function(el, i) {
6564 seq = el.get('seq');
6565 gaps = _.reduce(seq, (function(memo, c) {
6572 if (gaps > threshold) {
6573 return el.set('hidden', true);
6578 this.addNode("Reset", (function(_this) {
6580 _this.g.columns.set("hidden", []);
6581 return _this.model.each(function(el) {
6582 if (el.get('hidden')) {
6583 return el.set('hidden', false);
6588 this.el.appendChild(this.buildDOM());
6595 },{"../menubuilder":75,"underscore":59}],80:[function(require,module,exports){
6596 var HelpMenu, MenuBuilder;
6598 MenuBuilder = require("../menubuilder");
6600 module.exports = HelpMenu = MenuBuilder.extend({
6601 initialize: function(data) {
6602 return this.g = data.g;
6604 render: function() {
6605 this.setName("Help");
6606 this.addNode("About the project", (function(_this) {
6608 return window.open("https://github.com/greenify/biojs-vis-msa");
6611 this.addNode("Report issues", (function(_this) {
6613 return window.open("https://github.com/greenify/biojs-vis-msa/issues");
6616 this.addNode("User manual", (function(_this) {
6618 return window.open("https://github.com/greenify/biojs-vis-msa/wiki");
6621 this.el.style.display = "inline-block";
6622 this.el.appendChild(this.buildDOM());
6629 },{"../menubuilder":75}],81:[function(require,module,exports){
6630 var Clustal, FastaReader, ImportMenu, MenuBuilder, corsURL;
6632 Clustal = require("biojs-io-clustal");
6634 FastaReader = require("biojs-io-fasta").parse;
6636 MenuBuilder = require("../menubuilder");
6638 corsURL = require("../../utils/proxy").corsURL;
6640 module.exports = ImportMenu = MenuBuilder.extend({
6641 initialize: function(data) {
6643 return this.el.style.display = "inline-block";
6645 render: function() {
6646 this.setName("Import");
6647 this.addNode("FASTA", (function(_this) {
6648 return function(e) {
6650 url = prompt("URL", "/test/dummy/samples/p53.clustalo.fasta");
6651 url = corsURL(url, _this.g);
6652 return FastaReader.read(url, function(seqs) {
6654 zoomer = _this.g.zoomer.toJSON();
6655 zoomer.labelWidth = 200;
6656 zoomer.boxRectHeight = 2;
6657 zoomer.boxRectWidth = 2;
6658 _this.model.reset([]);
6659 _this.g.zoomer.set(zoomer);
6660 _this.model.reset(seqs);
6661 return _this.g.columns.calcConservation(_this.model);
6665 this.addNode("CLUSTAL", (function(_this) {
6668 url = prompt("URL", "/test/dummy/samples/p53.clustalo.clustal");
6669 url = corsURL(url, _this.g);
6670 return Clustal.read(url, function(seqs) {
6672 zoomer = _this.g.zoomer.toJSON();
6673 zoomer.labelWidth = 200;
6674 zoomer.boxRectHeight = 2;
6675 zoomer.boxRectWidth = 2;
6676 _this.model.reset([]);
6677 _this.g.zoomer.set(zoomer);
6678 _this.model.reset(seqs);
6679 return _this.g.columns.calcConservation(_this.model);
6683 this.addNode("add your own Parser", (function(_this) {
6685 return window.open("https://github.com/biojs/biojs2");
6688 this.el.appendChild(this.buildDOM());
6695 },{"../../utils/proxy":93,"../menubuilder":75,"biojs-io-clustal":undefined,"biojs-io-fasta":undefined}],82:[function(require,module,exports){
6696 var MenuBuilder, OrderingMenu, dom, _;
6698 MenuBuilder = require("../menubuilder");
6700 dom = require("dom-helper");
6702 _ = require('underscore');
6704 module.exports = OrderingMenu = MenuBuilder.extend({
6705 initialize: function(data) {
6708 return this.el.style.display = "inline-block";
6710 setOrder: function(order) {
6712 return this.render();
6714 render: function() {
6715 var comps, el, m, _i, _len;
6716 this.setName("Ordering");
6717 comps = this.getComparators();
6718 for (_i = 0, _len = comps.length; _i < _len; _i++) {
6722 el = this.buildDOM();
6723 dom.removeAllChilds(this.el);
6724 this.el.appendChild(el);
6727 _addNode: function(m) {
6731 if (text === this.order) {
6732 style.backgroundColor = "#77ED80";
6734 return this.addNode(text, (function(_this) {
6736 if (m.precode != null) {
6739 _this.model.comparator = m.comparator;
6741 return _this.setOrder(m.text);
6747 getComparators: function() {
6756 comparator: function(a, b) {
6757 return -a.get("id").localeCompare(b.get("id"));
6766 comparator: function(a, b) {
6767 return -a.get("name").localeCompare(b.get("name"));
6776 comparator: function(a, b) {
6777 return -a.get("seq").localeCompare(b.get("seq"));
6782 comparator: "identity"
6785 text: "Identity Desc",
6786 comparator: function(seq) {
6787 return -seq.get("identity");
6791 text: "Partition codes",
6792 comparator: "partition",
6793 precode: (function(_this) {
6795 _this.g.vis.set('labelPartition', true);
6796 return _this.model.each(function(el) {
6797 return el.set('partition', _.random(1, 3));
6808 },{"../menubuilder":75,"dom-helper":49,"underscore":59}],83:[function(require,module,exports){
6809 var MenuBuilder, SelectionMenu, sel;
6811 sel = require("../../g/selection/Selection");
6813 MenuBuilder = require("../menubuilder");
6815 module.exports = SelectionMenu = MenuBuilder.extend({
6816 initialize: function(data) {
6818 return this.el.style.display = "inline-block";
6820 render: function() {
6821 this.setName("Selection");
6822 this.addNode("Find Motif (supports RegEx)", (function(_this) {
6824 var leftestIndex, newSeli, origIndex, search, selcol;
6825 search = prompt("your search", "D");
6826 search = new RegExp(search, "gi");
6827 selcol = _this.g.selcol;
6829 leftestIndex = origIndex = 100042;
6830 _this.model.each(function(seq) {
6831 var args, index, match, strSeq, _results;
6832 strSeq = seq.get("seq");
6834 while (match = search.exec(strSeq)) {
6835 index = match.index;
6838 xEnd: index + match[0].length - 1,
6839 seqId: seq.get("id")
6841 newSeli.push(new sel.possel(args));
6842 _results.push(leftestIndex = Math.min(index, leftestIndex));
6846 if (newSeli.length === 0) {
6847 alert("no selection found");
6849 selcol.reset(newSeli);
6850 if (leftestIndex === origIndex) {
6853 return _this.g.zoomer.setLeftOffset(leftestIndex);
6856 this.addNode("Invert columns", (function(_this) {
6858 var _i, _ref, _results;
6859 return _this.g.selcol.invertCol((function() {
6861 for (var _i = 0, _ref = _this.model.getMaxLength(); 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }
6866 this.addNode("Invert rows", (function(_this) {
6868 return _this.g.selcol.invertRow(_this.model.pluck("id"));
6871 this.addNode("Reset", (function(_this) {
6873 return _this.g.selcol.reset();
6876 this.el.appendChild(this.buildDOM());
6883 },{"../../g/selection/Selection":67,"../menubuilder":75}],84:[function(require,module,exports){
6884 var ImportMenu, MenuBuilder, dom;
6886 MenuBuilder = require("../menubuilder");
6888 dom = require("dom-helper");
6890 module.exports = ImportMenu = MenuBuilder.extend({
6891 initialize: function(data) {
6893 this.el.style.display = "inline-block";
6894 return this.listenTo(this.g.vis, "change", this.render);
6896 render: function() {
6897 var visEl, visElements, _i, _len;
6898 this.setName("Vis. elements");
6899 visElements = this.getVisElements();
6900 for (_i = 0, _len = visElements.length; _i < _len; _i++) {
6901 visEl = visElements[_i];
6902 this._addVisEl(visEl);
6904 this.addNode("Reset", (function(_this) {
6906 _this.g.vis.set("labels", true);
6907 _this.g.vis.set("sequences", true);
6908 _this.g.vis.set("metacell", true);
6909 _this.g.vis.set("conserv", true);
6910 _this.g.vis.set("labelId", true);
6911 _this.g.vis.set("labelName", true);
6912 return _this.g.vis.set("labelCheckbox", false);
6915 this.addNode("Toggle mouseover events", (function(_this) {
6917 return _this.g.config.set("registerMouseHover", !_this.g.config.get("registerMouseHover"));
6920 dom.removeAllChilds(this.el);
6921 this.el.appendChild(this.buildDOM());
6924 _addVisEl: function(visEl) {
6927 if (this.g.vis.get(visEl.id)) {
6929 style.color = "red";
6932 style.color = "green";
6934 return this.addNode(pre + visEl.name, (function(_this) {
6936 return _this.g.vis.set(visEl.id, !_this.g.vis.get(visEl.id));
6942 getVisElements: function() {
6962 name: "Overviewbox",
6978 name: "LabelCheckbox",
6987 },{"../menubuilder":75,"dom-helper":49}],85:[function(require,module,exports){
6990 Feature = require("./Feature");
6992 Model = require("backbone-thin").Model;
6994 module.exports = Feature = Model.extend({
7004 borderColor: "black",
7008 validate: function() {
7009 if (isNaN(this.attributes.xStart || isNaN(this.attributes.xEnd))) {
7010 return "features need integer start and end.";
7013 contains: function(index) {
7014 return this.attributes.xStart <= index && index <= this.attributes.xEnd;
7020 },{"./Feature":85,"backbone-thin":5}],86:[function(require,module,exports){
7021 var Collection, Feature, FeatureCol, _;
7023 Feature = require("./Feature");
7025 Collection = require("backbone-thin").Collection;
7027 _ = require("underscore");
7029 module.exports = FeatureCol = Collection.extend({
7031 constructor: function() {
7032 this.startOnCache = [];
7033 this.on("all", function() {
7034 return this.startOnCache = [];
7036 return Collection.apply(this, arguments);
7038 startOn: function(index) {
7039 if (this.startOnCache[index] == null) {
7040 this.startOnCache[index] = this.where({
7044 return this.startOnCache[index];
7046 contains: function(index) {
7047 return this.reduce(function(el, memo) {
7048 return memo || el.contains(index);
7051 getMinRows: function() {
7053 len = this.max(function(el) {
7054 return el.get("xEnd");
7056 rows = (function() {
7059 for (x = _i = 1; 1 <= len ? _i <= len : _i >= len; x = 1 <= len ? ++_i : --_i) {
7064 this.each(function(el) {
7065 var _i, _ref, _ref1, _results;
7067 for (x = _i = _ref = el.get("xStart"), _ref1 = feature.get("xEnd"); _i <= _ref1; x = _i += 1) {
7068 _results.push(rows[x]++);
7078 },{"./Feature":85,"backbone-thin":5,"underscore":59}],87:[function(require,module,exports){
7079 var Collection, SeqManager, Sequence;
7081 Sequence = require("./Sequence");
7083 Collection = require("backbone-thin").Collection;
7085 module.exports = SeqManager = Collection.extend({
7087 constructor: function() {
7088 Collection.apply(this, arguments);
7089 this.on("all", function() {
7090 return this.lengthCache = null;
7092 this.lengthCache = null;
7095 getMaxLength: function() {
7096 if (this.models.length === 0) {
7099 if (this.lengthCache === null) {
7100 this.lengthCache = this.max(function(seq) {
7101 return seq.get("seq").length;
7102 }).get("seq").length;
7104 return this.lengthCache;
7106 prev: function(model, endless) {
7108 index = this.indexOf(model) - 1;
7109 if (index < 0 && endless) {
7110 index = this.length - 1;
7112 return this.at(index);
7114 next: function(model, endless) {
7116 index = this.indexOf(model) + 1;
7117 if (index === this.length && endless) {
7120 return this.at(index);
7122 calcHiddenSeqs: function(n) {
7125 for (i = _i = 0; 0 <= nNew ? _i <= nNew : _i >= nNew; i = 0 <= nNew ? ++_i : --_i) {
7126 if (this.at(i).get("hidden")) {
7136 },{"./Sequence":88,"backbone-thin":5}],88:[function(require,module,exports){
7137 var FeatureCol, Model, Sequence;
7139 Model = require("backbone-thin").Model;
7141 FeatureCol = require("./FeatureCol");
7143 module.exports = Sequence = Model.extend({
7149 initialize: function() {
7150 this.set("grey", []);
7151 return this.set("features", new FeatureCol());
7157 },{"./FeatureCol":86,"backbone-thin":5}],89:[function(require,module,exports){
7158 module.exports.seq = require("./Sequence");
7160 module.exports.seqcol = require("./SeqCollection");
7162 module.exports.feature = require("./Feature");
7164 module.exports.featurecol = require("./FeatureCol");
7168 },{"./Feature":85,"./FeatureCol":86,"./SeqCollection":87,"./Sequence":88}],90:[function(require,module,exports){
7169 var Colorator, Columns, Config, Consensus, Eventhandler, SelCol, SeqCollection, Stage, VisOrdering, Visibility, Zoomer, boneView;
7171 SeqCollection = require("./model/SeqCollection");
7173 Colorator = require("./g/colorator");
7175 Consensus = require("./g/consensus");
7177 Columns = require("./g/columns");
7179 Config = require("./g/config");
7181 SelCol = require("./g/selection/SelectionCol");
7183 Visibility = require("./g/visibility");
7185 VisOrdering = require("./g/visOrdering");
7187 Zoomer = require("./g/zoomer");
7189 boneView = require("backbone-childs");
7191 Eventhandler = require("biojs-events");
7193 Stage = require("./views/Stage");
7195 module.exports = boneView.extend({
7196 initialize: function(data) {
7198 if (data.columns == null) {
7201 if (data.conf == null) {
7204 if (data.vis == null) {
7207 if (data.zoomer == null) {
7208 if (!((_ref = data.visorder) != null ? _ref : data.zoomer = {})) {
7212 this.g = Eventhandler.mixin({});
7213 if (data.seqs === void 0 || data.seqs.length === 0) {
7214 console.log("warning. empty seqs.");
7216 this.seqs = new SeqCollection(data.seqs);
7217 this.g.config = new Config(data.conf);
7218 this.g.consensus = new Consensus();
7219 this.g.columns = new Columns(data.columns);
7220 this.g.colorscheme = new Colorator();
7221 this.g.selcol = new SelCol([], {
7224 this.g.vis = new Visibility(data.vis);
7225 this.g.visorder = new VisOrdering(data.visorder);
7226 this.g.zoomer = new Zoomer(data.zoomer, {
7229 this.addView("stage", new Stage({
7233 this.el.setAttribute("class", "biojs_msa_div");
7234 if (this.g.config.get("eventBus") === true) {
7235 return this.startEventBus();
7238 startEventBus: function() {
7239 var busObjs, key, _i, _len, _results;
7240 busObjs = ["config", "consensus", "columns", "colorscheme", "selcol", "vis", "visorder", "zoomer"];
7242 for (_i = 0, _len = busObjs.length; _i < _len; _i++) {
7244 _results.push(this._proxyToG(key));
7248 _proxyToG: function(key) {
7249 return this.listenTo(this.g[key], "all", function(name, prev, now) {
7250 if (name === "change") {
7253 return this.g.trigger(key + ":" + name, now);
7256 render: function() {
7257 this.renderSubviews();
7258 this.g.vis.set("loaded", true);
7265 },{"./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){
7268 module.exports = BMath = (function() {
7271 BMath.randomInt = function(lower, upper) {
7273 if (upper == null) {
7274 _ref = [0, lower], lower = _ref[0], upper = _ref[1];
7276 if (lower > upper) {
7277 _ref1 = [upper, lower], lower = _ref1[0], upper = _ref1[1];
7279 return Math.floor(Math.random() * (upper - lower + 1) + lower);
7282 BMath.uniqueId = function(length) {
7284 if (length == null) {
7288 while (id.length < length) {
7289 id += Math.random().toString(36).substr(2);
7291 return id.substr(0, length);
7294 BMath.getRandomInt = function(min, max) {
7295 return Math.floor(Math.random() * (max - min + 1)) + min;
7304 },{}],92:[function(require,module,exports){
7305 module.exports.bmath = require("./bmath");
7307 module.exports.proxy = require("./proxy");
7309 module.exports.seqgen = require("./seqgen");
7313 },{"./bmath":91,"./proxy":93,"./seqgen":94}],93:[function(require,module,exports){
7316 module.exports = proxy = {
7317 corsURL: (function(_this) {
7318 return function(url, g) {
7320 if (document.URL.indexOf('localhost') >= 0 && url[0] === "/") {
7323 url = url.replace("www\.", "");
7324 url = url.replace("http://", "");
7325 url = _this.g.config.get('importProxy') + url;
7333 },{}],94:[function(require,module,exports){
7334 var BMath, Sequence, seqgen;
7336 Sequence = require("biojs-model").seq;
7338 BMath = require("./bmath");
7340 seqgen = module.exports = {
7341 _generateSequence: function(len) {
7342 var i, possible, text, _i, _ref;
7344 possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
7345 for (i = _i = 0, _ref = len - 1; _i <= _ref; i = _i += 1) {
7346 text += possible.charAt(Math.floor(Math.random() * possible.length));
7350 getDummySequences: function(len, seqLen) {
7354 len = BMath.getRandomInt(3, 5);
7356 if (seqLen == null) {
7357 seqLen = BMath.getRandomInt(50, 200);
7359 for (i = _i = 1; _i <= len; i = _i += 1) {
7360 seqs.push(new Sequence(seqgen._generateSequence(seqLen), "seq" + i, "r" + i));
7368 },{"./bmath":91,"biojs-model":27}],95:[function(require,module,exports){
7369 var Base, Line, Polygon, Rect, setAttr, svgns;
7371 svgns = "http://www.w3.org/2000/svg";
7373 setAttr = function(obj, opts) {
7375 for (name in opts) {
7377 obj.setAttributeNS(null, name, value);
7382 Base = function(opts) {
7384 svg = document.createElementNS(svgns, 'svg');
7385 svg.setAttribute("width", opts.width);
7386 svg.setAttribute("height", opts.height);
7390 Rect = function(opts) {
7392 rect = document.createElementNS(svgns, 'rect');
7393 return setAttr(rect, opts);
7396 Line = function(opts) {
7398 line = document.createElementNS(svgns, 'line');
7399 return setAttr(line, opts);
7402 Polygon = function(opts) {
7404 line = document.createElementNS(svgns, 'polygon');
7405 return setAttr(line, opts);
7408 module.exports.rect = Rect;
7410 module.exports.line = Line;
7412 module.exports.polygon = Polygon;
7414 module.exports.base = Base;
7418 },{}],96:[function(require,module,exports){
7419 var LabelBlock, SeqBlock, boneView;
7421 boneView = require("backbone-childs");
7423 SeqBlock = require("./CanvasSeqBlock");
7425 LabelBlock = require("./labels/LabelBlock");
7427 module.exports = boneView.extend({
7428 initialize: function(data) {
7429 var labelblock, seqblock;
7432 labelblock = new LabelBlock({
7436 labelblock.ordering = -1;
7437 this.addView("labelblock", labelblock);
7439 if (this.g.vis.get("sequences")) {
7440 seqblock = new SeqBlock({
7444 seqblock.ordering = 0;
7445 this.addView("seqblock", seqblock);
7447 this.listenTo(this.g.zoomer, "change:alignmentHeight", this.adjustHeight);
7448 return this.listenTo(this.g.columns, "change:hidden", this.adjustHeight);
7450 render: function() {
7451 this.renderSubviews();
7452 this.el.className = "biojs_msa_albody";
7453 this.el.style.whiteSpace = "nowrap";
7454 this.adjustHeight();
7457 adjustHeight: function() {
7458 if (this.g.zoomer.get("alignmentHeight") === "auto") {
7459 this.el.style.height = (this.g.zoomer.get("rowHeight") * this.model.length) + 5;
7461 this.el.style.height = this.g.zoomer.get("alignmentHeight");
7463 return this.el.style.width = this.getWidth() + 15;
7465 getWidth: function() {
7468 if (this.g.vis.get("labels")) {
7469 width += this.g.zoomer.get("labelWidth");
7471 if (this.g.vis.get("metacell")) {
7472 width += this.g.zoomer.get("metaWidth");
7474 if (this.g.vis.get("sequences")) {
7475 width += this.g.zoomer.get("alignmentWidth");
7483 },{"./CanvasSeqBlock":98,"./labels/LabelBlock":104,"backbone-childs":3}],97:[function(require,module,exports){
7484 var CanvasCharCache, Events;
7486 Events = require("biojs-events");
7488 module.exports = CanvasCharCache = (function() {
7489 function CanvasCharCache(g) {
7492 this.cacheHeight = 0;
7493 this.cacheWidth = 0;
7496 CanvasCharCache.prototype.getFontTile = function(letter, width, height) {
7497 if (width !== this.cacheWidth || height !== this.cacheHeight) {
7498 this.cacheHeight = height;
7499 this.cacheWidth = width;
7502 if (this.cache[letter] === void 0) {
7503 this.createTile(letter, width, height);
7505 return this.cache[letter];
7508 CanvasCharCache.prototype.createTile = function(letter, width, height) {
7510 canvas = this.cache[letter] = document.createElement("canvas");
7511 canvas.width = width;
7512 canvas.height = height;
7513 this.ctx = canvas.getContext('2d');
7514 this.ctx.font = this.g.zoomer.get("residueFont");
7515 this.ctx.textBaseline = 'middle';
7516 this.ctx.textAlign = "center";
7517 return this.ctx.fillText(letter, width / 2, height / 2, width);
7520 return CanvasCharCache;
7526 },{"biojs-events":14}],98:[function(require,module,exports){
7527 var CharCache, boneView, colorSelector, jbone, mouse, _;
7529 boneView = require("backbone-childs");
7531 mouse = require("mouse-pos");
7533 colorSelector = require("biojs-util-colorschemes").selector;
7535 _ = require("underscore");
7537 jbone = require("jbone");
7539 CharCache = require("./CanvasCharCache");
7541 module.exports = boneView.extend({
7543 initialize: function(data) {
7545 this.listenTo(this.g.zoomer, "change:_alignmentScrollLeft change:_alignmentScrollTop", function(model, value, options) {
7546 if (((options != null ? options.origin : void 0) == null) || options.origin !== "canvasseq") {
7547 return this.render();
7550 this.listenTo(this.g.columns, "change:hidden", this.render);
7551 this.listenTo(this.g.zoomer, "change:alignmentWidth", this.render);
7552 this.listenTo(this.g.colorscheme, "change", this.render);
7553 this.listenTo(this.g.selcol, "reset add", this.render);
7554 this.el.style.display = "inline-block";
7555 this.el.style.overflowX = "hidden";
7556 this.el.style.overflowY = "hidden";
7557 this.el.className = "biojs_msa_seqblock";
7558 this.ctx = this.el.getContext('2d');
7559 this.cache = new CharCache(this.g);
7560 this.throttleTime = 0;
7561 this.throttleCounts = 0;
7562 if (document.documentElement.style.webkitAppearance != null) {
7563 this.throttledDraw = function() {
7565 start = +new Date();
7567 this.throttleTime += +new Date() - start;
7568 this.throttleCounts++;
7569 if (this.throttleCounts > 15) {
7570 tTime = Math.ceil(this.throttleTime / this.throttleCounts);
7571 console.log("avgDrawTime/WebKit", tTime);
7572 return this.throttledDraw = this.draw;
7576 this.throttledDraw = _.throttle(this.throttledDraw, 30);
7578 return this.manageEvents();
7580 throttledDraw: function() {
7582 start = +new Date();
7584 this.throttleTime += +new Date() - start;
7585 this.throttleCounts++;
7586 if (this.throttleCounts > 15) {
7587 tTime = Math.ceil(this.throttleTime / this.throttleCounts);
7588 console.log("avgDrawTime", tTime);
7590 tTime = Math.max(20, tTime);
7591 return this.throttledDraw = _.throttle(this.draw, tTime);
7594 manageEvents: function() {
7597 events.mousedown = "_onmousedown";
7598 events.touchstart = "_ontouchstart";
7599 if (this.g.config.get("registerMouseClicks")) {
7600 events.dblclick = "_onclick";
7602 if (this.g.config.get("registerMouseHover")) {
7603 events.mousein = "_onmousein";
7604 events.mouseout = "_onmouseout";
7606 events.mousewheel = "_onmousewheel";
7607 events.DOMMouseScroll = "_onmousewheel";
7608 this.delegateEvents(events);
7609 this.listenTo(this.g.config, "change:registerMouseHover", this.manageEvents);
7610 this.listenTo(this.g.config, "change:registerMouseClick", this.manageEvents);
7611 return this.dragStart = [];
7615 this.el.width = this.el.width;
7616 rectHeight = this.g.zoomer.get("rowHeight");
7617 this.ctx.globalAlpha = this.g.colorscheme.get("opacity");
7618 this.drawSeqs(function(data) {
7619 return this.drawSeq(data, this._drawRect);
7621 this.ctx.globalAlpha = 1;
7622 this.drawSeqs(function(data) {
7623 return this.drawSeq(data, this._drawLetter);
7625 return this.drawSeqs(this.drawSeqExtended);
7627 drawSeqs: function(callback) {
7628 var hidden, i, rectHeight, start, y, _i, _ref, _results;
7629 rectHeight = this.g.zoomer.get("rowHeight");
7630 hidden = this.g.columns.get("hidden");
7631 start = Math.max(0, Math.abs(Math.ceil(-this.g.zoomer.get('_alignmentScrollTop') / rectHeight)));
7632 y = -Math.abs(-this.g.zoomer.get('_alignmentScrollTop') % rectHeight);
7634 for (i = _i = start, _ref = this.model.length - 1; _i <= _ref; i = _i += 1) {
7635 if (this.model.at(i).get('hidden')) {
7638 callback.call(this, {
7639 model: this.model.at(i),
7644 if (y > this.el.height) {
7647 _results.push(void 0);
7652 drawSeq: function(data, callback) {
7653 var c, elWidth, j, rectHeight, rectWidth, res, seq, start, x, y, _i, _ref, _results;
7654 seq = data.model.get("seq");
7656 rectWidth = this.g.zoomer.get("columnWidth");
7657 rectHeight = this.g.zoomer.get("rowHeight");
7658 start = Math.max(0, Math.abs(Math.ceil(-this.g.zoomer.get('_alignmentScrollLeft') / rectWidth)));
7659 x = -Math.abs(-this.g.zoomer.get('_alignmentScrollLeft') % rectWidth);
7661 rectWidth: rectWidth,
7662 rectHeight: rectHeight,
7665 elWidth = this.el.width;
7667 for (j = _i = start, _ref = seq.length - 1; _i <= _ref; j = _i += 1) {
7669 c = c.toUpperCase();
7672 if (data.hidden.indexOf(j) < 0) {
7673 callback(this, res);
7681 _results.push(void 0);
7686 _drawRect: function(that, data) {
7688 color = that.color[data.c];
7689 if (color != null) {
7690 that.ctx.fillStyle = color;
7691 return that.ctx.fillRect(data.x, data.y, data.rectWidth, data.rectHeight);
7694 _drawLetter: function(that, data) {
7695 return that.ctx.drawImage(that.cache.getFontTile(data.c, data.rectWidth, data.rectHeight), data.x, data.y, data.rectWidth, data.rectHeight);
7697 drawSeqExtended: function(data) {
7698 var f, features, j, mNextSel, mPrevSel, rectHeight, rectWidth, selection, seq, start, starts, x, xZero, yZero, _i, _j, _len, _ref, _ref1;
7699 seq = data.model.get("seq");
7700 rectWidth = this.g.zoomer.get("columnWidth");
7701 rectHeight = this.g.zoomer.get("rowHeight");
7702 start = Math.max(0, Math.abs(Math.ceil(-this.g.zoomer.get('_alignmentScrollLeft') / rectWidth)));
7703 x = -Math.abs(-this.g.zoomer.get('_alignmentScrollLeft') % rectWidth);
7704 xZero = x - start * rectWidth;
7705 selection = this._getSelection(data.model);
7706 _ref = this._getPrevNextSelection(data.model), mPrevSel = _ref[0], mNextSel = _ref[1];
7707 features = data.model.get("features");
7709 for (j = _i = start, _ref1 = seq.length - 1; _i <= _ref1; j = _i += 1) {
7710 starts = features.startOn(j);
7711 if (data.hidden.indexOf(j) >= 0) {
7714 if (starts.length > 0) {
7715 for (_j = 0, _len = starts.length; _j < _len; _j++) {
7717 this.appendFeature({
7725 if (x > this.el.width) {
7729 return this._appendSelection({
7736 render: function() {
7737 this.el.setAttribute('height', this.g.zoomer.get("alignmentHeight"));
7738 this.el.setAttribute('width', this.g.zoomer.get("alignmentWidth"));
7739 this.g.zoomer._adjustWidth(this.el, this.model);
7740 this.g.zoomer._checkScrolling(this._checkScrolling([this.g.zoomer.get('_alignmentScrollLeft'), this.g.zoomer.get('_alignmentScrollTop')]), {
7743 this.color = colorSelector.getColor(this.g.colorscheme.get("scheme"));
7744 this.throttledDraw();
7747 _onmousemove: function(e, reversed) {
7748 var dragEnd, i, relDist, relEnd, scaleFactor, scrollCorrected, _i, _j, _k;
7749 if (this.dragStart.length === 0) {
7752 dragEnd = mouse.abs(e);
7753 relEnd = [dragEnd[0] - this.dragStart[0], dragEnd[1] - this.dragStart[1]];
7754 scaleFactor = this.g.zoomer.get("canvasEventScale");
7758 for (i = _i = 0; _i <= 1; i = _i += 1) {
7759 relEnd[i] = relEnd[i] * scaleFactor;
7761 relDist = [this.dragStartScroll[0] - relEnd[0], this.dragStartScroll[1] - relEnd[1]];
7762 for (i = _j = 0; _j <= 1; i = _j += 1) {
7763 relDist[i] = Math.round(relDist[i]);
7765 scrollCorrected = this._checkScrolling(relDist);
7766 this.g.zoomer._checkScrolling(scrollCorrected, {
7769 for (i = _k = 0; _k <= 1; i = _k += 1) {
7770 if (scrollCorrected[i] !== relDist[i]) {
7771 if (scrollCorrected[i] === 0) {
7772 this.dragStart[i] = dragEnd[i];
7773 this.dragStartScroll[i] = 0;
7775 this.dragStart[i] = dragEnd[i] - scrollCorrected[i];
7779 this.throttledDraw();
7780 if (e.preventDefault != null) {
7782 return e.stopPropagation();
7785 _ontouchmove: function(e) {
7786 this._onmousemove(e.changedTouches[0], true);
7788 return e.stopPropagation();
7790 _onmousedown: function(e) {
7791 this.dragStart = mouse.abs(e);
7792 this.dragStartScroll = [this.g.zoomer.get('_alignmentScrollLeft'), this.g.zoomer.get('_alignmentScrollTop')];
7793 jbone(document.body).on('mousemove.overmove', (function(_this) {
7794 return function(e) {
7795 return _this._onmousemove(e);
7798 jbone(document.body).on('mouseup.overup', (function(_this) {
7800 return _this._cleanup();
7803 return e.preventDefault();
7805 _ontouchstart: function(e) {
7806 this.dragStart = mouse.abs(e.changedTouches[0]);
7807 this.dragStartScroll = [this.g.zoomer.get('_alignmentScrollLeft'), this.g.zoomer.get('_alignmentScrollTop')];
7808 jbone(document.body).on('touchmove.overtmove', (function(_this) {
7809 return function(e) {
7810 return _this._ontouchmove(e);
7813 return jbone(document.body).on('touchend.overtend touchleave.overtleave touchcancel.overtcanel', (function(_this) {
7814 return function(e) {
7815 return _this._touchCleanup(e);
7819 _onmousewinout: function(e) {
7820 if (e.toElement === document.body.parentNode) {
7821 return this._cleanup();
7824 _cleanup: function() {
7825 this.dragStart = [];
7826 jbone(document.body).off('.overmove');
7827 jbone(document.body).off('.overup');
7828 return jbone(document.body).off('.overout');
7830 _touchCleanup: function(e) {
7831 if (e.changedTouches.length > 0) {
7832 this._onmousemove(e.changedTouches[0], true);
7834 this.dragStart = [];
7835 jbone(document.body).off('.overtmove');
7836 jbone(document.body).off('.overtend');
7837 jbone(document.body).off('.overtleave');
7838 return jbone(document.body).off('.overtcancel');
7840 _onmousewheel: function(e) {
7842 delta = mouse.wheelDelta(e);
7843 this.g.zoomer.set('_alignmentScrollLeft', this.g.zoomer.get('_alignmentScrollLeft') + delta[0]);
7844 this.g.zoomer.set('_alignmentScrollTop', this.g.zoomer.get('_alignmentScrollTop') + delta[1]);
7845 return e.preventDefault();
7847 _onclick: function(e) {
7848 this.g.trigger("residue:click", this._getClickPos(e));
7849 return this.throttledDraw();
7851 _onmousein: function(e) {
7852 this.g.trigger("residue:click", this._getClickPos(e));
7853 return this.throttledDraw();
7855 _onmouseout: function(e) {
7856 this.g.trigger("residue:click", this._getClickPos(e));
7857 return this.throttledDraw();
7859 _getClickPos: function(e) {
7860 var coords, seqId, x, y;
7861 coords = mouse.rel(e);
7862 coords[0] += this.g.zoomer.get("_alignmentScrollLeft");
7863 coords[1] += this.g.zoomer.get("_alignmentScrollTop");
7864 x = Math.floor(coords[0] / this.g.zoomer.get("columnWidth"));
7865 y = Math.floor(coords[1] / this.g.zoomer.get("rowHeight"));
7866 x += this.g.columns.calcHiddenColumns(x);
7867 y += this.model.calcHiddenSeqs(y);
7870 seqId = this.model.at(y).get("id");
7877 _checkScrolling: function(scrollObj) {
7879 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')];
7880 for (i = _i = 0; _i <= 1; i = _i += 1) {
7881 if (scrollObj[i] > max[i]) {
7882 scrollObj[i] = max[i];
7884 if (scrollObj[i] < 0) {
7890 _getSelection: function(model) {
7891 var maxLen, n, rows, sel, selection, sels, _i, _j, _k, _len, _ref, _ref1, _ref2;
7892 maxLen = model.get("seq").length;
7894 sels = this.g.selcol.getSelForRow(model.get("id"));
7895 rows = _.find(sels, function(el) {
7896 return el.get("type") === "row";
7899 for (n = _i = 0, _ref = maxLen - 1; _i <= _ref; n = _i += 1) {
7902 } else if (sels.length > 0) {
7903 for (_j = 0, _len = sels.length; _j < _len; _j++) {
7905 for (n = _k = _ref1 = sel.get("xStart"), _ref2 = sel.get("xEnd"); _k <= _ref2; n = _k += 1) {
7912 appendFeature: function(data) {
7913 var beforeStyle, beforeWidth, boxHeight, boxWidth, f, width;
7915 boxWidth = this.g.zoomer.get("columnWidth");
7916 boxHeight = this.g.zoomer.get("rowHeight");
7917 width = (f.get("xEnd") - f.get("xStart")) * boxWidth;
7918 beforeWidth = this.ctx.lineWidth;
7919 this.ctx.lineWidth = 3;
7920 beforeStyle = this.ctx.strokeStyle;
7921 this.ctx.strokeStyle = f.get("fillColor");
7922 this.ctx.strokeRect(data.xZero, data.yZero, width, boxHeight);
7923 this.ctx.strokeStyle = beforeStyle;
7924 return this.ctx.lineWidth = beforeWidth;
7926 _appendSelection: function(data) {
7927 var boxHeight, boxWidth, hiddenOffset, k, mNextSel, mPrevSel, n, selection, seq, _i, _ref, _ref1, _results;
7928 seq = data.model.get("seq");
7929 selection = this._getSelection(data.model);
7930 _ref = this._getPrevNextSelection(data.model), mPrevSel = _ref[0], mNextSel = _ref[1];
7931 boxWidth = this.g.zoomer.get("columnWidth");
7932 boxHeight = this.g.zoomer.get("rowHeight");
7933 if (selection.length === 0) {
7938 for (n = _i = 0, _ref1 = seq.length - 1; _i <= _ref1; n = _i += 1) {
7939 if (data.hidden.indexOf(n) >= 0) {
7940 _results.push(hiddenOffset++);
7942 k = n - hiddenOffset;
7943 if (selection.indexOf(n) >= 0 && (k === 0 || selection.indexOf(n - 1) < 0)) {
7944 _results.push(this._renderSelection({
7947 selection: selection,
7955 _results.push(void 0);
7961 _renderSelection: function(data) {
7962 var beforeStyle, beforeWidth, boxHeight, boxWidth, hidden, i, k, mNextSel, mPrevSel, n, selection, selectionLength, totalWidth, xPart, xPos, xZero, yZero, _i, _j, _ref, _ref1;
7967 selection = data.selection;
7968 mPrevSel = data.mPrevSel;
7969 mNextSel = data.mNextSel;
7970 selectionLength = 0;
7971 for (i = _i = n, _ref = data.model.get("seq").length - 1; _i <= _ref; i = _i += 1) {
7972 if (selection.indexOf(i) >= 0) {
7978 boxWidth = this.g.zoomer.get("columnWidth");
7979 boxHeight = this.g.zoomer.get("rowHeight");
7980 totalWidth = (boxWidth * selectionLength) + 1;
7981 hidden = this.g.columns.get('hidden');
7982 this.ctx.beginPath();
7983 beforeWidth = this.ctx.lineWidth;
7984 this.ctx.lineWidth = 3;
7985 beforeStyle = this.ctx.strokeStyle;
7986 this.ctx.strokeStyle = "#FF0000";
7987 xZero += k * boxWidth;
7989 for (i = _j = 0, _ref1 = selectionLength - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) {
7991 if (hidden.indexOf(xPos) >= 0) {
7994 if (!((mPrevSel != null) && mPrevSel.indexOf(xPos) >= 0)) {
7995 this.ctx.moveTo(xZero + xPart, yZero);
7996 this.ctx.lineTo(xPart + boxWidth + xZero, yZero);
7998 if (!((mNextSel != null) && mNextSel.indexOf(xPos) >= 0)) {
7999 this.ctx.moveTo(xPart + xZero, boxHeight + yZero);
8000 this.ctx.lineTo(xPart + boxWidth + xZero, boxHeight + yZero);
8004 this.ctx.moveTo(xZero, yZero);
8005 this.ctx.lineTo(xZero, boxHeight + yZero);
8006 this.ctx.moveTo(xZero + totalWidth, yZero);
8007 this.ctx.lineTo(xZero + totalWidth, boxHeight + yZero);
8009 this.ctx.strokeStyle = beforeStyle;
8010 return this.ctx.lineWidth = beforeWidth;
8012 _getPrevNextSelection: function(model) {
8013 var mNextSel, mPrevSel, modelNext, modelPrev;
8014 modelPrev = model.collection.prev(model);
8015 modelNext = model.collection.next(model);
8016 if (modelPrev != null) {
8017 mPrevSel = this._getSelection(modelPrev);
8019 if (modelNext != null) {
8020 mNextSel = this._getSelection(modelNext);
8022 return [mPrevSel, mNextSel];
8028 },{"./CanvasCharCache":97,"backbone-childs":3,"biojs-util-colorschemes":29,"jbone":50,"mouse-pos":51,"underscore":59}],99:[function(require,module,exports){
8029 var OverviewBox, colorSelector, jbone, mouse, selection, view, _;
8031 view = require("backbone-viewj");
8033 mouse = require("mouse-pos");
8035 selection = require("../g/selection/Selection");
8037 colorSelector = require("biojs-util-colorschemes").selector;
8039 jbone = require("jbone");
8041 _ = require("underscore");
8043 module.exports = OverviewBox = view.extend({
8044 className: "biojs_msa_overviewbox",
8046 initialize: function(data) {
8048 this.listenTo(this.g.zoomer, "change:boxRectWidth change:boxRectHeight", this.render);
8049 this.listenTo(this.g.selcol, "add reset change", this.render);
8050 this.listenTo(this.g.columns, "change:hidden", this.render);
8051 this.listenTo(this.g.colorscheme, "change:showLowerCase", this.render);
8052 this.listenTo(this.model, "change", _.debounce(this.render, 5));
8053 this.color = colorSelector.getColor(this.g.colorscheme.get("scheme"));
8054 this.listenTo(this.g.colorscheme, "change:scheme", function() {
8055 this.color = colorSelector.getColor(this.g.colorscheme.get("scheme"));
8056 return this.render();
8058 return this.dragStart = [];
8062 mousedown: "_onmousedown"
8064 render: function() {
8065 var c, color, hidden, i, j, rectHeight, rectWidth, seq, showLowerCase, x, y, _i, _j, _ref, _ref1;
8066 this._createCanvas();
8067 this.el.textContent = "overview";
8068 this.ctx.fillStyle = "#999999";
8069 this.ctx.fillRect(0, 0, this.el.width, this.el.height);
8070 rectWidth = this.g.zoomer.get("boxRectWidth");
8071 rectHeight = this.g.zoomer.get("boxRectHeight");
8072 hidden = this.g.columns.get("hidden");
8073 showLowerCase = this.g.colorscheme.get("showLowerCase");
8075 for (i = _i = 0, _ref = this.model.length - 1; _i <= _ref; i = _i += 1) {
8076 seq = this.model.at(i).get("seq");
8079 if (this.model.at(i).get("hidden")) {
8080 console.log(this.model.at(i).get("hidden"));
8081 this.ctx.fillStyle = "grey";
8082 this.ctx.fillRect(0, y, seq.length * rectWidth, rectHeight);
8085 for (j = _j = 0, _ref1 = seq.length - 1; _j <= _ref1; j = _j += 1) {
8087 if (showLowerCase) {
8088 c = c.toUpperCase();
8090 color = this.color[c];
8091 if (hidden.indexOf(j) >= 0) {
8094 if (color != null) {
8095 this.ctx.fillStyle = color;
8096 this.ctx.fillRect(x, y, rectWidth, rectHeight);
8101 return this._drawSelection();
8103 _drawSelection: function() {
8104 var i, maxHeight, pos, rectHeight, rectWidth, sel, seq, _i, _ref;
8105 if (this.dragStart.length > 0 && !this.prolongSelection) {
8108 rectWidth = this.g.zoomer.get("boxRectWidth");
8109 rectHeight = this.g.zoomer.get("boxRectHeight");
8110 maxHeight = rectHeight * this.model.length;
8111 this.ctx.fillStyle = "#ffff00";
8112 this.ctx.globalAlpha = 0.9;
8113 for (i = _i = 0, _ref = this.g.selcol.length - 1; _i <= _ref; i = _i += 1) {
8114 sel = this.g.selcol.at(i);
8115 if (sel.get('type') === 'column') {
8116 this.ctx.fillRect(rectWidth * sel.get('xStart'), 0, rectWidth * (sel.get('xEnd') - sel.get('xStart') + 1), maxHeight);
8117 } else if (sel.get('type') === 'row') {
8118 seq = (this.model.filter(function(el) {
8119 return el.get('id') === sel.get('seqId');
8121 pos = this.model.indexOf(seq);
8122 this.ctx.fillRect(0, rectHeight * pos, rectWidth * seq.get('seq').length, rectHeight);
8123 } else if (sel.get('type') === 'pos') {
8124 seq = (this.model.filter(function(el) {
8125 return el.get('id') === sel.get('seqId');
8127 pos = this.model.indexOf(seq);
8128 this.ctx.fillRect(rectWidth * sel.get('xStart'), rectHeight * pos, rectWidth * (sel.get('xEnd') - sel.get('xStart') + 1), rectHeight);
8131 return this.ctx.globalAlpha = 1;
8133 _onclick: function(evt) {
8134 return this.g.trigger("meta:click", {
8135 seqId: this.model.get("id", {
8140 _onmousemove: function(e) {
8142 if (this.dragStart.length === 0) {
8146 this.ctx.fillStyle = "#ffff00";
8147 this.ctx.globalAlpha = 0.9;
8148 rect = this._calcSelection(mouse.abs(e));
8149 this.ctx.fillRect(rect[0][0], rect[1][0], rect[0][1] - rect[0][0], rect[1][1] - rect[1][0]);
8151 return e.stopPropagation();
8153 _onmousedown: function(e) {
8154 this.dragStart = mouse.abs(e);
8155 this.dragStartRel = mouse.rel(e);
8156 if (e.ctrlKey || e.metaKey) {
8157 this.prolongSelection = true;
8159 this.prolongSelection = false;
8161 jbone(document.body).on('mousemove.overmove', (function(_this) {
8162 return function(e) {
8163 return _this._onmousemove(e);
8166 jbone(document.body).on('mouseup.overup', (function(_this) {
8167 return function(e) {
8168 return _this._onmouseup(e);
8171 return this.dragStart;
8173 _calcSelection: function(dragMove) {
8174 var dragRel, i, rect, _i, _j;
8175 dragRel = [dragMove[0] - this.dragStart[0], dragMove[1] - this.dragStart[1]];
8176 for (i = _i = 0; _i <= 1; i = _i += 1) {
8177 dragRel[i] = this.dragStartRel[i] + dragRel[i];
8179 rect = [[this.dragStartRel[0], dragRel[0]], [this.dragStartRel[1], dragRel[1]]];
8180 for (i = _j = 0; _j <= 1; i = _j += 1) {
8181 if (rect[i][1] < rect[i][0]) {
8182 rect[i] = [rect[i][1], rect[i][0]];
8184 rect[i][0] = Math.max(rect[i][0], 0);
8188 _endSelection: function(dragEnd) {
8189 var args, i, j, rect, selis, _i, _j, _k, _ref, _ref1;
8190 jbone(document.body).off('.overmove');
8191 jbone(document.body).off('.overup');
8192 if (this.dragStart.length === 0) {
8195 rect = this._calcSelection(dragEnd);
8196 for (i = _i = 0; _i <= 1; i = ++_i) {
8197 rect[0][i] = Math.floor(rect[0][i] / this.g.zoomer.get("boxRectWidth"));
8199 for (i = _j = 0; _j <= 1; i = ++_j) {
8200 rect[1][i] = Math.floor(rect[1][i] / this.g.zoomer.get("boxRectHeight"));
8202 rect[0][1] = Math.min(this.model.getMaxLength() - 1, rect[0][1]);
8203 rect[1][1] = Math.min(this.model.length - 1, rect[1][1]);
8205 for (j = _k = _ref = rect[1][0], _ref1 = rect[1][1]; _k <= _ref1; j = _k += 1) {
8207 seqId: this.model.at(j).get('id'),
8211 selis.push(new selection.possel(args));
8213 this.dragStart = [];
8214 if (this.prolongSelection) {
8215 this.g.selcol.add(selis);
8217 this.g.selcol.reset(selis);
8219 this.g.zoomer.setLeftOffset(rect[0][0]);
8220 return this.g.zoomer.setTopOffset(rect[1][0]);
8222 _onmouseup: function(e) {
8223 return this._endSelection(mouse.abs(e));
8225 _onmouseout: function(e) {
8226 return this._endSelection(mouse.abs(e));
8228 _createCanvas: function() {
8229 var rectHeight, rectWidth;
8230 rectWidth = this.g.zoomer.get("boxRectWidth");
8231 rectHeight = this.g.zoomer.get("boxRectHeight");
8232 this.el.height = this.model.length * rectHeight;
8233 this.el.width = this.model.getMaxLength() * rectWidth;
8234 this.ctx = this.el.getContext("2d");
8235 this.el.style.overflow = "scroll";
8236 return this.el.style.cursor = "crosshair";
8242 },{"../g/selection/Selection":67,"backbone-viewj":10,"biojs-util-colorschemes":29,"jbone":50,"mouse-pos":51,"underscore":59}],100:[function(require,module,exports){
8243 var AlignmentBody, HeaderBlock, OverviewBox, boneView, identityCalc, _;
8245 boneView = require("backbone-childs");
8247 AlignmentBody = require("./AlignmentBody");
8249 HeaderBlock = require("./header/HeaderBlock");
8251 OverviewBox = require("./OverviewBox");
8253 identityCalc = require("../algo/identityCalc");
8255 _ = require('underscore');
8257 module.exports = boneView.extend({
8258 initialize: function(data) {
8261 this.listenTo(this.model, "reset", function() {
8262 this.isNotDirty = false;
8263 return this.rerender();
8265 this.listenTo(this.model, "change:hidden", _.debounce(this.rerender, 10));
8266 this.listenTo(this.model, "sort", this.rerender);
8267 this.listenTo(this.model, "add", function() {
8268 return console.log("seq add");
8270 this.listenTo(this.g.vis, "change:sequences", this.rerender);
8271 this.listenTo(this.g.vis, "change:overviewbox", this.rerender);
8272 return this.listenTo(this.g.visorder, "change", this.rerender);
8275 var body, consensus, headerblock, overviewbox;
8277 if (!this.isNotDirty) {
8278 consensus = this.g.consensus.getConsensus(this.model);
8279 identityCalc(this.model, consensus);
8280 this.isNotDirty = true;
8282 if (this.g.vis.get("overviewbox")) {
8283 overviewbox = new OverviewBox({
8287 overviewbox.ordering = this.g.visorder.get('overviewBox');
8288 this.addView("overviewbox", overviewbox);
8291 headerblock = new HeaderBlock({
8295 headerblock.ordering = this.g.visorder.get('headerBox');
8296 this.addView("headerblock", headerblock);
8298 body = new AlignmentBody({
8302 body.ordering = this.g.visorder.get('alignmentBody');
8303 return this.addView("body", body);
8305 render: function() {
8306 this.renderSubviews();
8307 this.el.className = "biojs_msa_stage";
8310 rerender: function() {
8312 return this.render();
8318 },{"../algo/identityCalc":61,"./AlignmentBody":96,"./OverviewBox":99,"./header/HeaderBlock":102,"backbone-childs":3,"underscore":59}],101:[function(require,module,exports){
8319 var ConservationView, dom, svg, view;
8321 view = require("backbone-viewj");
8323 dom = require("dom-helper");
8325 svg = require("../../utils/svg");
8327 ConservationView = view.extend({
8328 className: "biojs_msa_conserv",
8329 initialize: function(data) {
8331 this.listenTo(this.g.zoomer, "change:stepSize change:labelWidth change:columnWidth", this.render);
8332 this.listenTo(this.g.vis, "change:labels change:metacell", this.render);
8333 this.listenTo(this.g.columns, "change:scaling", this.render);
8334 this.listenTo(this.model, "reset", this.render);
8335 return this.manageEvents();
8337 render: function() {
8338 var avgHeight, cellWidth, height, hidden, i, maxHeight, n, nMax, rect, s, stepSize, width, x, _i, _ref;
8339 this.g.columns.calcConservation(this.model);
8340 dom.removeAllChilds(this.el);
8341 nMax = this.model.getMaxLength();
8342 cellWidth = this.g.zoomer.get("columnWidth");
8344 width = cellWidth * (nMax - this.g.columns.get('hidden').length);
8345 console.log(this.g.columns.get('hidden'));
8350 s.style.display = "inline-block";
8351 s.style.cursor = "pointer";
8352 stepSize = this.g.zoomer.get("stepSize");
8353 hidden = this.g.columns.get("hidden");
8357 if (hidden.indexOf(n) >= 0) {
8361 width = cellWidth * stepSize;
8363 for (i = _i = 0, _ref = stepSize - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
8364 avgHeight += this.g.columns.get("conserv")[n];
8366 height = maxHeight * (avgHeight / stepSize);
8369 y: maxHeight - height,
8370 width: width - cellWidth / 4,
8372 style: "stroke:red;stroke-width:1;"
8375 s.appendChild(rect);
8379 this.el.appendChild(s);
8382 _onclick: function(evt) {
8383 var i, rowPos, stepSize, _i, _ref, _results;
8384 rowPos = evt.target.rowPos;
8385 stepSize = this.g.zoomer.get("stepSize");
8387 for (i = _i = 0, _ref = stepSize - 1; _i <= _ref; i = _i += 1) {
8388 _results.push(this.g.trigger("bar:click", {
8395 manageEvents: function() {
8398 if (this.g.config.get("registerMouseClicks")) {
8399 events.click = "_onclick";
8401 if (this.g.config.get("registerMouseHover")) {
8402 events.mousein = "_onmousein";
8403 events.mouseout = "_onmouseout";
8405 this.delegateEvents(events);
8406 this.listenTo(this.g.config, "change:registerMouseHover", this.manageEvents);
8407 return this.listenTo(this.g.config, "change:registerMouseClick", this.manageEvents);
8409 _onmousein: function(evt) {
8411 rowPos = this.g.zoomer.get("stepSize" * evt.rowPos);
8412 return this.g.trigger("bar:mousein", {
8417 _onmouseout: function(evt) {
8419 rowPos = this.g.zoomer.get("stepSize" * evt.rowPos);
8420 return this.g.trigger("bar:mouseout", {
8427 module.exports = ConservationView;
8431 },{"../../utils/svg":95,"backbone-viewj":10,"dom-helper":49}],102:[function(require,module,exports){
8432 var ConservationView, MarkerView, boneView, identityCalc, _;
8434 MarkerView = require("./MarkerView");
8436 ConservationView = require("./ConservationView");
8438 identityCalc = require("../../algo/identityCalc");
8440 boneView = require("backbone-childs");
8442 _ = require('underscore');
8444 module.exports = boneView.extend({
8445 initialize: function(data) {
8447 this.blockEvents = false;
8448 this.listenTo(this.g.vis, "change:markers change:conserv", function() {
8450 return this.render();
8452 this.listenTo(this.g.vis, "change", this._setSpacer);
8453 this.listenTo(this.g.zoomer, "change:alignmentWidth", function() {
8454 return this._adjustWidth();
8456 this.listenTo(this.g.zoomer, "change:_alignmentScrollLeft", this._adjustScrollingLeft);
8457 this.listenTo(this.g.columns, "change:hidden", function() {
8459 return this.render();
8462 this._onscroll = this._sendScrollEvent;
8463 return this.g.vis.once('change:loaded', this._adjustScrollingLeft, this);
8466 "scroll": "_onscroll"
8469 var consensus, conserv, marker;
8471 if (!this.isNotDirty) {
8472 consensus = this.g.consensus.getConsensus(this.model);
8473 identityCalc(this.model, consensus);
8474 this.isNotDirty = true;
8476 if (this.g.vis.get("conserv")) {
8477 conserv = new ConservationView({
8481 conserv.ordering = -20;
8482 this.addView("conserv", conserv);
8484 if (this.g.vis.get("markers")) {
8485 marker = new MarkerView({
8489 marker.ordering = -10;
8490 return this.addView("marker", marker);
8493 render: function() {
8494 this.renderSubviews();
8496 this.el.className = "biojs_msa_header";
8497 this.el.style.overflowX = "auto";
8498 this._adjustWidth();
8499 this._adjustScrollingLeft();
8502 _sendScrollEvent: function() {
8503 if (!this.blockEvents) {
8504 this.g.zoomer.set("_alignmentScrollLeft", this.el.scrollLeft, {
8508 return this.blockEvents = false;
8510 _adjustScrollingLeft: function(model, value, options) {
8512 if (((options != null ? options.origin : void 0) == null) || options.origin !== "header") {
8513 scrollLeft = this.g.zoomer.get("_alignmentScrollLeft");
8514 this.blockEvents = true;
8515 return this.el.scrollLeft = scrollLeft;
8518 _setSpacer: function() {
8519 return this.el.style.marginLeft = this._getLabelWidth() + "px";
8521 _getLabelWidth: function() {
8524 if (this.g.vis.get("labels")) {
8525 paddingLeft += this.g.zoomer.get("labelWidth");
8527 if (this.g.vis.get("metacell")) {
8528 paddingLeft += this.g.zoomer.get("metaWidth");
8532 _adjustWidth: function() {
8533 return this.el.style.width = this.g.zoomer.get("alignmentWidth") + "px";
8539 },{"../../algo/identityCalc":61,"./ConservationView":101,"./MarkerView":103,"backbone-childs":3,"underscore":59}],103:[function(require,module,exports){
8540 var HeaderView, dom, jbone, svg, view;
8542 view = require("backbone-viewj");
8544 dom = require("dom-helper");
8546 svg = require("../../utils/svg");
8548 jbone = require("jbone");
8550 HeaderView = view.extend({
8551 className: "biojs_msa_marker",
8552 initialize: function(data) {
8554 this.listenTo(this.g.zoomer, "change:stepSize change:labelWidth change:columnWidth change:markerStepSize change:markerFontsize", this.render);
8555 this.listenTo(this.g.vis, "change:labels change:metacell", this.render);
8556 return this.manageEvents();
8558 render: function() {
8559 var cellWidth, container, hidden, n, nMax, span, stepSize;
8560 dom.removeAllChilds(this.el);
8561 this.el.style.fontSize = this.g.zoomer.get("markerFontsize");
8562 container = document.createElement("span");
8564 cellWidth = this.g.zoomer.get("columnWidth");
8565 nMax = this.model.getMaxLength();
8566 stepSize = this.g.zoomer.get("stepSize");
8567 hidden = this.g.columns.get("hidden");
8569 if (hidden.indexOf(n) >= 0) {
8570 this.markerHidden(span, n, stepSize);
8574 span = document.createElement("span");
8575 span.style.width = (cellWidth * stepSize) + "px";
8576 span.style.display = "inline-block";
8577 if ((n + 1) % this.g.zoomer.get('markerStepSize') === 0) {
8578 span.textContent = n + 1;
8580 span.textContent = ".";
8584 container.appendChild(span);
8586 this.el.appendChild(container);
8589 markerHidden: function(span, n, stepSize) {
8590 var hidden, index, j, length, min, nMax, prevHidden, s, triangle, _i, _j;
8591 hidden = this.g.columns.get("hidden").slice(0);
8592 min = Math.max(0, n - stepSize);
8594 for (j = _i = min; _i <= n; j = _i += 1) {
8595 prevHidden &= hidden.indexOf(j) >= 0;
8600 nMax = this.model.getMaxLength();
8603 for (n = _j = n; _j <= nMax; n = _j += 1) {
8604 if (!(index >= 0)) {
8605 index = hidden.indexOf(n);
8607 if (hidden.indexOf(n) >= 0) {
8617 s.style.position = "relative";
8618 triangle = svg.polygon({
8619 points: "0,0 5,5 10,0",
8620 style: "fill:lime;stroke:purple;stroke-width:1"
8622 jbone(triangle).on("click", (function(_this) {
8623 return function(evt) {
8624 hidden.splice(index, length);
8625 return _this.g.columns.set("hidden", hidden);
8628 s.appendChild(triangle);
8629 span.appendChild(s);
8632 manageEvents: function() {
8635 if (this.g.config.get("registerMouseClicks")) {
8636 events.click = "_onclick";
8638 if (this.g.config.get("registerMouseHover")) {
8639 events.mousein = "_onmousein";
8640 events.mouseout = "_onmouseout";
8642 this.delegateEvents(events);
8643 this.listenTo(this.g.config, "change:registerMouseHover", this.manageEvents);
8644 return this.listenTo(this.g.config, "change:registerMouseClick", this.manageEvents);
8646 _onclick: function(evt) {
8647 var rowPos, stepSize;
8648 rowPos = evt.target.rowPos;
8649 stepSize = this.g.zoomer.get("stepSize");
8650 return this.g.trigger("column:click", {
8656 _onmousein: function(evt) {
8657 var rowPos, stepSize;
8658 rowPos = this.g.zoomer.get("stepSize" * evt.rowPos);
8659 stepSize = this.g.zoomer.get("stepSize");
8660 return this.g.trigger("column:mousein", {
8666 _onmouseout: function(evt) {
8667 var rowPos, stepSize;
8668 rowPos = this.g.zoomer.get("stepSize" * evt.rowPos);
8669 stepSize = this.g.zoomer.get("stepSize");
8670 return this.g.trigger("column:mouseout", {
8678 module.exports = HeaderView;
8682 },{"../../utils/svg":95,"backbone-viewj":10,"dom-helper":49,"jbone":50}],104:[function(require,module,exports){
8683 var LabelRowView, boneView;
8685 LabelRowView = require("./LabelRowView");
8687 boneView = require("backbone-childs");
8689 module.exports = boneView.extend({
8690 initialize: function(data) {
8693 this.listenTo(this.g.zoomer, "change:_alignmentScrollTop", this._adjustScrollingTop);
8694 return this.g.vis.once('change:loaded', this._adjustScrollingTop, this);
8697 var i, view, _i, _ref, _results;
8700 for (i = _i = 0, _ref = this.model.length - 1; _i <= _ref; i = _i += 1) {
8701 if (this.model.at(i).get('hidden')) {
8704 view = new LabelRowView({
8705 model: this.model.at(i),
8709 _results.push(this.addView("row_" + i, view));
8714 "scroll": "_sendScrollEvent"
8716 _sendScrollEvent: function() {
8717 return this.g.zoomer.set("_alignmentScrollTop", this.el.scrollTop, {
8721 _adjustScrollingTop: function() {
8722 return this.el.scrollTop = this.g.zoomer.get("_alignmentScrollTop");
8724 render: function() {
8725 this.renderSubviews();
8726 this.el.className = "biojs_msa_labelblock";
8727 this.el.style.display = "inline-block";
8728 this.el.style.verticalAlign = "top";
8729 this.el.style.height = this.g.zoomer.get("alignmentHeight") + "px";
8730 this.el.style.overflowY = "auto";
8731 this.el.style.overflowX = "hidden";
8732 this.el.style.fontSize = "" + (this.g.zoomer.get("labelFontsize"));
8733 this.el.style.lineHeight = "" + (this.g.zoomer.get("labelLineHeight"));
8740 },{"./LabelRowView":105,"backbone-childs":3}],105:[function(require,module,exports){
8741 var LabelView, MetaView, boneView;
8743 boneView = require("backbone-childs");
8745 LabelView = require("./LabelView");
8747 MetaView = require("./MetaView");
8749 module.exports = boneView.extend({
8750 initialize: function(data) {
8753 this.listenTo(this.g.vis, "change:labels", this.drawR);
8754 return this.listenTo(this.g.vis, "change:metacell", this.drawR);
8758 if (this.g.vis.get("labels")) {
8759 this.addView("labels", new LabelView({
8764 if (this.g.vis.get("metacell")) {
8765 return this.addView("metacell", new MetaView({
8773 return this.render();
8775 render: function() {
8776 this.renderSubviews();
8777 this.el.setAttribute("class", "biojs_msa_labelrow");
8778 this.el.style.height = this.g.zoomer.get("rowHeight");
8785 },{"./LabelView":106,"./MetaView":107,"backbone-childs":3}],106:[function(require,module,exports){
8786 var LabelView, dom, view;
8788 view = require("backbone-viewj");
8790 dom = require("dom-helper");
8792 LabelView = view.extend({
8793 initialize: function(data) {
8794 this.seq = data.seq;
8796 return this.manageEvents();
8798 manageEvents: function() {
8801 if (this.g.config.get("registerMouseClicks")) {
8802 events.click = "_onclick";
8804 if (this.g.config.get("registerMouseHover")) {
8805 events.mousein = "_onmousein";
8806 events.mouseout = "_onmouseout";
8808 this.delegateEvents(events);
8809 this.listenTo(this.g.config, "change:registerMouseHover", this.manageEvents);
8810 this.listenTo(this.g.config, "change:registerMouseClick", this.manageEvents);
8811 this.listenTo(this.g.vis, "change:labelName", this.render);
8812 this.listenTo(this.g.vis, "change:labelId", this.render);
8813 this.listenTo(this.g.vis, "change:labelPartition", this.render);
8814 return this.listenTo(this.g.vis, "change:labelCheckbox", this.render);
8816 render: function() {
8817 var checkBox, id, name, part;
8818 dom.removeAllChilds(this.el);
8819 this.el.style.width = "" + (this.g.zoomer.get("labelWidth")) + "px";
8820 this.el.style.height = "" + (this.g.zoomer.get("rowHeight")) + "px";
8821 this.el.setAttribute("class", "biojs_msa_labels");
8822 if (this.g.vis.get("labelCheckbox")) {
8823 checkBox = document.createElement("input");
8824 checkBox.setAttribute("type", "checkbox");
8825 checkBox.value = this.model.get('id');
8826 checkBox.name = "seq";
8827 this.el.appendChild(checkBox);
8829 if (this.g.vis.get("labelId")) {
8830 id = document.createElement("span");
8831 id.textContent = this.model.get("id");
8832 id.style.width = this.g.zoomer.get("labelIdLength");
8833 id.style.display = "inline-block";
8834 this.el.appendChild(id);
8836 if (this.g.vis.get("labelPartition")) {
8837 part = document.createElement("span");
8838 part.style.width = 15;
8839 part.textContent = this.model.get("partition");
8840 part.style.display = "inline-block";
8841 this.el.appendChild(id);
8842 this.el.appendChild(part);
8844 if (this.g.vis.get("labelName")) {
8845 name = document.createElement("span");
8846 name.textContent = this.model.get("name");
8847 this.el.appendChild(name);
8849 this.el.style.overflow = scroll;
8852 _onclick: function(evt) {
8854 seqId = this.model.get("id");
8855 return this.g.trigger("row:click", {
8860 _onmousein: function(evt) {
8862 seqId = this.model.get("id");
8863 return this.g.trigger("row:mouseout", {
8868 _onmouseout: function(evt) {
8870 seqId = this.model.get("id");
8871 return this.g.trigger("row:mouseout", {
8878 module.exports = LabelView;
8882 },{"backbone-viewj":10,"dom-helper":49}],107:[function(require,module,exports){
8883 var MenuBuilder, MetaView, dom, view, _;
8885 view = require("backbone-viewj");
8887 MenuBuilder = require("../../menu/menubuilder");
8889 _ = require('underscore');
8891 dom = require("dom-helper");
8893 module.exports = MetaView = view.extend({
8894 className: "biojs_msa_metaview",
8895 initialize: function(data) {
8896 return this.g = data.g;
8900 mousein: "_onmousein",
8901 mouseout: "_onmouseout"
8903 render: function() {
8904 var gapSpan, gaps, ident, identSpan, menu, seq, width;
8905 dom.removeAllChilds(this.el);
8906 this.el.style.display = "inline-block";
8907 width = this.g.zoomer.get("metaWidth");
8908 this.el.style.width = width - 5;
8909 this.el.style.paddingRight = 5;
8910 seq = this.model.get('seq');
8911 gaps = _.reduce(seq, (function(memo, c) {
8917 gaps = (gaps / seq.length).toFixed(1);
8918 gapSpan = document.createElement('span');
8919 gapSpan.textContent = gaps;
8920 gapSpan.style.display = "inline-block";
8921 gapSpan.style.width = 35;
8922 this.el.appendChild(gapSpan);
8923 ident = this.model.get('identity');
8924 identSpan = document.createElement('span');
8925 identSpan.textContent = ident.toFixed(2);
8926 identSpan.style.display = "inline-block";
8927 identSpan.style.width = 40;
8928 this.el.appendChild(identSpan);
8929 menu = new MenuBuilder("↗");
8930 menu.addNode("Uniprot", (function(_this) {
8931 return function(e) {
8932 return window.open("http://beta.uniprot.org/uniprot/Q7T2N8");
8935 this.el.appendChild(menu.buildDOM());
8937 this.el.style.height = "" + (this.g.zoomer.get("rowHeight")) + "px";
8938 return this.el.style.cursor = "pointer";
8940 _onclick: function(evt) {
8941 return this.g.trigger("meta:click", {
8942 seqId: this.model.get("id", {
8947 _onmousein: function(evt) {
8948 return this.g.trigger("meta:mousein", {
8949 seqId: this.model.get("id", {
8954 _onmouseout: function(evt) {
8955 return this.g.trigger("meta:mouseout", {
8956 seqId: this.model.get("id", {
8965 },{"../../menu/menubuilder":75,"backbone-viewj":10,"dom-helper":49,"underscore":59}],"biojs-io-clustal":[function(require,module,exports){
8966 // Generated by CoffeeScript 1.8.0
8967 var Clustal, GenericReader, Seq, Str,
8968 __hasProp = {}.hasOwnProperty,
8969 __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; };
8971 Str = require("./strings");
8973 GenericReader = require("./generic_reader");
8975 Seq = require("./seq");
8977 module.exports = Clustal = (function(_super) {
8978 __extends(Clustal, _super);
8980 function Clustal() {
8981 return Clustal.__super__.constructor.apply(this, arguments);
8984 Clustal.parse = function(text) {
8985 var blockstate, k, label, line, lines, match, regex, seqCounter, seqs, sequence;
8987 if (Object.prototype.toString.call(text) === '[object Array]') {
8990 lines = text.split("\n");
8992 if (lines[0].slice(0, 6) === !"CLUSTAL") {
8993 throw new Error("Invalid CLUSTAL Header");
8998 while (k < lines.length) {
9001 if ((line == null) || line.length === 0) {
9005 if (line.trim().length === 0) {
9009 if (Str.contains(line, "*")) {
9012 if (blockstate === 1) {
9016 regex = /^(?:\s*)(\S+)(?:\s+)(\S+)(?:\s*)(\d*)(?:\s*|$)/g;
9017 match = regex.exec(line);
9018 if (match != null) {
9020 sequence = match[2];
9021 if (seqCounter >= seqs.length) {
9022 seqs.push(new Seq(sequence, label, seqCounter));
9024 seqs[seqCounter].seq += sequence;
9039 },{"./generic_reader":17,"./seq":18,"./strings":19}],"biojs-io-fasta":[function(require,module,exports){
9040 // Generated by CoffeeScript 1.8.0
9041 module.exports.parse = require("./parser");
9043 module.exports.writer = require("./writer");
9045 },{"./parser":21,"./writer":24}],"biojs-vis-msa":[function(require,module,exports){
9046 if (typeof biojs === 'undefined') {
9049 if (typeof biojs.vis === 'undefined') {
9052 // use two namespaces
9053 window.msa = biojs.vis.msa = module.exports = require('./index');
9055 // TODO: how should this be bundled
9057 if (typeof biojs.io === 'undefined') {
9060 // just bundle the two parsers
9061 window.biojs.io.fasta = require("biojs-io-fasta");
9062 window.biojs.io.clustal = require("biojs-io-clustal");
9063 window.biojs.xhr = require("nets");
9065 // simulate standalone flag
9066 window.biojsVisMsa = window.msa;
9068 require('./build/msa.css');
9070 },{"./build/msa.css":1,"./index":2,"biojs-io-clustal":undefined,"biojs-io-fasta":undefined,"nets":undefined}],"nets":[function(require,module,exports){
9071 var req = require('request')
9073 module.exports = Nets
9075 function Nets(uri, opts, cb) {
9078 },{"request":52}]},{},["biojs-vis-msa"])
9079 //# 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==
9083 // this is a way how you use a bundled file parser
9084 biojs.io.clustal.read("#", function(seqs){
9088 // set your custom properties
9089 // @see: https://github.com/greenify/biojs-vis-msa/tree/master/src/g
9091 opts.seqs = JSON.parse(document.getElementById("seqData").value);
9093 opts.el = document.getElementById("yourDiv");
9094 opts.vis = {conserv: false, overviewbox: false, labelid: false};
9095 opts.zoomer = {alignmentHeight: 225, labelWidth: 130,labelFontsize: "13px",labelIdLength: 20, menuFontsize: "12px",menuMarginLeft: "3px", menuPadding: "3px 4px 3px 4px", menuItemFontsize: "14px", menuItemLineHeight: "14px"};
9100 var m = new msa.msa(opts);
9102 m.g.colorscheme.set("scheme", "#scheme#");
9104 // the menu is independent to the MSA container
9106 menuOpts.el = document.getElementById('div');
9108 var defMenu = new msa.menu.defaultmenu(menuOpts);
9109 m.addView("menu", defMenu);
9111 // call render at the end to display the whole MSA