(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);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o throw new Error "You must implement broadcast!" * * Send a message to a peer, or set of peers * send: (peer_s, message)-> throw new Error "You must implement send!" */ performSync: function(user) { var hb, o, _hb, _i, _len; if (this.current_sync_target == null) { this.current_sync_target = user; this.send(user, { sync_step: "getHB", send_again: "true", data: this.getStateVector() }); if (!this.sent_hb_to_all_users) { this.sent_hb_to_all_users = true; hb = this.getHB([]).hb; _hb = []; for (_i = 0, _len = hb.length; _i < _len; _i++) { o = hb[_i]; _hb.push(o); if (_hb.length > 10) { this.broadcast({ sync_step: "applyHB_", data: _hb }); _hb = []; } } return this.broadcast({ sync_step: "applyHB", data: _hb }); } } }, performSyncWithMaster: function(user) { var hb, o, _hb, _i, _len; this.current_sync_target = user; this.send(user, { sync_step: "getHB", send_again: "true", data: this.getStateVector() }); hb = this.getHB([]).hb; _hb = []; for (_i = 0, _len = hb.length; _i < _len; _i++) { o = hb[_i]; _hb.push(o); if (_hb.length > 10) { this.broadcast({ sync_step: "applyHB_", data: _hb }); _hb = []; } } return this.broadcast({ sync_step: "applyHB", data: _hb }); }, setStateSynced: function() { var args, el, f, _i, _len, _ref; if (!this.is_synced) { this.is_synced = true; if (this.compute_when_synced != null) { _ref = this.compute_when_synced; for (_i = 0, _len = _ref.length; _i < _len; _i++) { el = _ref[_i]; f = el[0]; args = el.slice(1); f.apply(args); } delete this.compute_when_synced; } return null; } }, whenReceivedStateVector: function(f) { if (this.when_received_state_vector_listeners == null) { this.when_received_state_vector_listeners = []; } return this.when_received_state_vector_listeners.push(f); }, receiveMessage: function(sender, res) { var data, f, hb, o, sendApplyHB, send_again, _hb, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _results; if (res.sync_step == null) { _ref = this.receive_handlers; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { f = _ref[_i]; _results.push(f(sender, res)); } return _results; } else { if (sender === this.user_id) { return; } if (res.sync_step === "getHB") { if (this.when_received_state_vector_listeners != null) { _ref1 = this.when_received_state_vector_listeners; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { f = _ref1[_j]; f.call(this, res.data); } } delete this.when_received_state_vector_listeners; data = this.getHB(res.data); hb = data.hb; _hb = []; if (this.is_synced) { sendApplyHB = (function(_this) { return function(m) { return _this.send(sender, m); }; })(this); } else { sendApplyHB = (function(_this) { return function(m) { return _this.broadcast(m); }; })(this); } for (_k = 0, _len2 = hb.length; _k < _len2; _k++) { o = hb[_k]; _hb.push(o); if (_hb.length > 10) { sendApplyHB({ sync_step: "applyHB_", data: _hb }); _hb = []; } } sendApplyHB({ sync_step: "applyHB", data: _hb }); if ((res.send_again != null) && this.perform_send_again) { send_again = (function(_this) { return function(sv) { return function() { var _l, _len3; hb = _this.getHB(sv).hb; for (_l = 0, _len3 = hb.length; _l < _len3; _l++) { o = hb[_l]; _hb.push(o); if (_hb.length > 10) { _this.send(sender, { sync_step: "applyHB_", data: _hb }); _hb = []; } } return _this.send(sender, { sync_step: "applyHB", data: _hb, sent_again: "true" }); }; }; })(this)(data.state_vector); return setTimeout(send_again, 3000); } } else if (res.sync_step === "applyHB") { this.applyHB(res.data, sender === this.current_sync_target); if ((this.syncMethod === "syncAll" || (res.sent_again != null)) && (!this.is_synced) && ((this.current_sync_target === sender) || (this.current_sync_target == null))) { this.connections[sender].is_synced = true; return this.findNewSyncTarget(); } } else if (res.sync_step === "applyHB_") { return this.applyHB(res.data, sender === this.current_sync_target); } } }, parseMessageFromXml: function(m) { var parse_array, parse_object; parse_array = function(node) { var n, _i, _len, _ref, _results; _ref = node.children; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { n = _ref[_i]; if (n.getAttribute("isArray") === "true") { _results.push(parse_array(n)); } else { _results.push(parse_object(n)); } } return _results; }; parse_object = function(node) { var int, json, n, name, value, _i, _len, _ref, _ref1; json = {}; _ref = node.attrs; for (name in _ref) { value = _ref[name]; int = parseInt(value); if (isNaN(int) || ("" + int) !== value) { json[name] = value; } else { json[name] = int; } } _ref1 = node.children; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { n = _ref1[_i]; name = n.name; if (n.getAttribute("isArray") === "true") { json[name] = parse_array(n); } else { json[name] = parse_object(n); } } return json; }; return parse_object(m); }, encodeMessageToXml: function(m, json) { var encode_array, encode_object; encode_object = function(m, json) { var name, value; for (name in json) { value = json[name]; if (value == null) { } else if (value.constructor === Object) { encode_object(m.c(name), value); } else if (value.constructor === Array) { encode_array(m.c(name), value); } else { m.setAttribute(name, value); } } return m; }; encode_array = function(m, array) { var e, _i, _len; m.setAttribute("isArray", "true"); for (_i = 0, _len = array.length; _i < _len; _i++) { e = array[_i]; if (e.constructor === Object) { encode_object(m.c("array-element"), e); } else { encode_array(m.c("array-element"), e); } } return m; }; if (json.constructor === Object) { return encode_object(m.c("y", { xmlns: "http://y.ninja/connector-stanza" }), json); } else if (json.constructor === Array) { return encode_array(m.c("y", { xmlns: "http://y.ninja/connector-stanza" }), json); } else { throw new Error("I can't encode this json!"); } }, setIsBoundToY: function() { if (typeof this.on_bound_to_y === "function") { this.on_bound_to_y(); } delete this.when_bound_to_y; return this.is_bound_to_y = true; } }; },{}],3:[function(require,module,exports){ var Engine; if (typeof window !== "undefined" && window !== null) { window.unprocessed_counter = 0; } if (typeof window !== "undefined" && window !== null) { window.unprocessed_exec_counter = 0; } if (typeof window !== "undefined" && window !== null) { window.unprocessed_types = []; } Engine = (function() { function Engine(HB, types) { this.HB = HB; this.types = types; this.unprocessed_ops = []; } Engine.prototype.parseOperation = function(json) { var type; type = this.types[json.type]; if ((type != null ? type.parse : void 0) != null) { return type.parse(json); } else { throw new Error("You forgot to specify a parser for type " + json.type + ". The message is " + (JSON.stringify(json)) + "."); } }; /* applyOpsBundle: (ops_json)-> ops = [] for o in ops_json ops.push @parseOperation o for o in ops if not o.execute() @unprocessed_ops.push o @tryUnprocessed() */ Engine.prototype.applyOpsCheckDouble = function(ops_json) { var o, _i, _len, _results; _results = []; for (_i = 0, _len = ops_json.length; _i < _len; _i++) { o = ops_json[_i]; if (this.HB.getOperation(o.uid) == null) { _results.push(this.applyOp(o)); } else { _results.push(void 0); } } return _results; }; Engine.prototype.applyOps = function(ops_json) { return this.applyOp(ops_json); }; Engine.prototype.applyOp = function(op_json_array, fromHB) { var o, op_json, _i, _len; if (fromHB == null) { fromHB = false; } if (op_json_array.constructor !== Array) { op_json_array = [op_json_array]; } for (_i = 0, _len = op_json_array.length; _i < _len; _i++) { op_json = op_json_array[_i]; if (fromHB) { op_json.fromHB = "true"; } o = this.parseOperation(op_json); o.parsed_from_json = op_json; if (op_json.fromHB != null) { o.fromHB = op_json.fromHB; } if (this.HB.getOperation(o) != null) { } else if (((!this.HB.isExpectedOperation(o)) && (o.fromHB == null)) || (!o.execute())) { this.unprocessed_ops.push(o); if (typeof window !== "undefined" && window !== null) { window.unprocessed_types.push(o.type); } } } return this.tryUnprocessed(); }; Engine.prototype.tryUnprocessed = function() { var old_length, op, unprocessed, _i, _len, _ref; while (true) { old_length = this.unprocessed_ops.length; unprocessed = []; _ref = this.unprocessed_ops; for (_i = 0, _len = _ref.length; _i < _len; _i++) { op = _ref[_i]; if (this.HB.getOperation(op) != null) { } else if ((!this.HB.isExpectedOperation(op) && (op.fromHB == null)) || (!op.execute())) { unprocessed.push(op); } } this.unprocessed_ops = unprocessed; if (this.unprocessed_ops.length === old_length) { break; } } if (this.unprocessed_ops.length !== 0) { return this.HB.invokeSync(); } }; return Engine; })(); module.exports = Engine; },{}],4:[function(require,module,exports){ var HistoryBuffer, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; HistoryBuffer = (function() { function HistoryBuffer(user_id) { this.user_id = user_id; this.emptyGarbage = __bind(this.emptyGarbage, this); this.operation_counter = {}; this.buffer = {}; this.change_listeners = []; this.garbage = []; this.trash = []; this.performGarbageCollection = true; this.garbageCollectTimeout = 30000; this.reserved_identifier_counter = 0; setTimeout(this.emptyGarbage, this.garbageCollectTimeout); } HistoryBuffer.prototype.setUserId = function(user_id, state_vector) { var buff, counter_diff, o, o_name, _base, _name, _ref; this.user_id = user_id; if ((_base = this.buffer)[_name = this.user_id] == null) { _base[_name] = []; } buff = this.buffer[this.user_id]; counter_diff = state_vector[this.user_id] || 0; if (this.buffer._temp != null) { _ref = this.buffer._temp; for (o_name in _ref) { o = _ref[o_name]; o.uid.creator = this.user_id; o.uid.op_number += counter_diff; buff[o.uid.op_number] = o; } } this.operation_counter[this.user_id] = (this.operation_counter._temp || 0) + counter_diff; delete this.operation_counter._temp; return delete this.buffer._temp; }; HistoryBuffer.prototype.emptyGarbage = function() { var o, _i, _len, _ref; _ref = this.garbage; for (_i = 0, _len = _ref.length; _i < _len; _i++) { o = _ref[_i]; if (typeof o.cleanup === "function") { o.cleanup(); } } this.garbage = this.trash; this.trash = []; if (this.garbageCollectTimeout !== -1) { this.garbageCollectTimeoutId = setTimeout(this.emptyGarbage, this.garbageCollectTimeout); } return void 0; }; HistoryBuffer.prototype.getUserId = function() { return this.user_id; }; HistoryBuffer.prototype.addToGarbageCollector = function() { var o, _i, _len, _results; if (this.performGarbageCollection) { _results = []; for (_i = 0, _len = arguments.length; _i < _len; _i++) { o = arguments[_i]; if (o != null) { _results.push(this.garbage.push(o)); } else { _results.push(void 0); } } return _results; } }; HistoryBuffer.prototype.stopGarbageCollection = function() { this.performGarbageCollection = false; this.setManualGarbageCollect(); this.garbage = []; return this.trash = []; }; HistoryBuffer.prototype.setManualGarbageCollect = function() { this.garbageCollectTimeout = -1; clearTimeout(this.garbageCollectTimeoutId); return this.garbageCollectTimeoutId = void 0; }; HistoryBuffer.prototype.setGarbageCollectTimeout = function(garbageCollectTimeout) { this.garbageCollectTimeout = garbageCollectTimeout; }; HistoryBuffer.prototype.getReservedUniqueIdentifier = function() { return { creator: '_', op_number: "_" + (this.reserved_identifier_counter++) }; }; HistoryBuffer.prototype.getOperationCounter = function(user_id) { var ctn, res, user, _ref; if (user_id == null) { res = {}; _ref = this.operation_counter; for (user in _ref) { ctn = _ref[user]; res[user] = ctn; } return res; } else { return this.operation_counter[user_id]; } }; HistoryBuffer.prototype.isExpectedOperation = function(o) { var _base, _name; if ((_base = this.operation_counter)[_name = o.uid.creator] == null) { _base[_name] = 0; } o.uid.op_number <= this.operation_counter[o.uid.creator]; return true; }; HistoryBuffer.prototype._encode = function(state_vector) { var json, o, o_json, o_next, o_number, o_prev, u_name, unknown, user, _ref; if (state_vector == null) { state_vector = {}; } json = []; unknown = function(user, o_number) { if ((user == null) || (o_number == null)) { throw new Error("dah!"); } return (state_vector[user] == null) || state_vector[user] <= o_number; }; _ref = this.buffer; for (u_name in _ref) { user = _ref[u_name]; if (u_name === "_") { continue; } for (o_number in user) { o = user[o_number]; if ((o.uid.noOperation == null) && unknown(u_name, o_number)) { o_json = o._encode(); if (o.next_cl != null) { o_next = o.next_cl; while ((o_next.next_cl != null) && unknown(o_next.uid.creator, o_next.uid.op_number)) { o_next = o_next.next_cl; } o_json.next = o_next.getUid(); } else if (o.prev_cl != null) { o_prev = o.prev_cl; while ((o_prev.prev_cl != null) && unknown(o_prev.uid.creator, o_prev.uid.op_number)) { o_prev = o_prev.prev_cl; } o_json.prev = o_prev.getUid(); } json.push(o_json); } } } return json; }; HistoryBuffer.prototype.getNextOperationIdentifier = function(user_id) { var uid; if (user_id == null) { user_id = this.user_id; } if (this.operation_counter[user_id] == null) { this.operation_counter[user_id] = 0; } uid = { 'creator': user_id, 'op_number': this.operation_counter[user_id] }; this.operation_counter[user_id]++; return uid; }; HistoryBuffer.prototype.getOperation = function(uid) { var o, _ref; if (uid.uid != null) { uid = uid.uid; } o = (_ref = this.buffer[uid.creator]) != null ? _ref[uid.op_number] : void 0; if ((uid.sub != null) && (o != null)) { return o.retrieveSub(uid.sub); } else { return o; } }; HistoryBuffer.prototype.addOperation = function(o) { if (this.buffer[o.uid.creator] == null) { this.buffer[o.uid.creator] = {}; } if (this.buffer[o.uid.creator][o.uid.op_number] != null) { throw new Error("You must not overwrite operations!"); } if ((o.uid.op_number.constructor !== String) && (!this.isExpectedOperation(o)) && (o.fromHB == null)) { throw new Error("this operation was not expected!"); } this.addToCounter(o); this.buffer[o.uid.creator][o.uid.op_number] = o; return o; }; HistoryBuffer.prototype.removeOperation = function(o) { var _ref; return (_ref = this.buffer[o.uid.creator]) != null ? delete _ref[o.uid.op_number] : void 0; }; HistoryBuffer.prototype.setInvokeSyncHandler = function(f) { return this.invokeSync = f; }; HistoryBuffer.prototype.invokeSync = function() {}; HistoryBuffer.prototype.renewStateVector = function(state_vector) { var state, user, _results; _results = []; for (user in state_vector) { state = state_vector[user]; if (((this.operation_counter[user] == null) || (this.operation_counter[user] < state_vector[user])) && (state_vector[user] != null)) { _results.push(this.operation_counter[user] = state_vector[user]); } else { _results.push(void 0); } } return _results; }; HistoryBuffer.prototype.addToCounter = function(o) { var _base, _name; if ((_base = this.operation_counter)[_name = o.uid.creator] == null) { _base[_name] = 0; } if (o.uid.op_number === this.operation_counter[o.uid.creator]) { this.operation_counter[o.uid.creator]++; } while (this.buffer[o.uid.creator][this.operation_counter[o.uid.creator]] != null) { this.operation_counter[o.uid.creator]++; } return void 0; }; return HistoryBuffer; })(); module.exports = HistoryBuffer; },{}],5:[function(require,module,exports){ var YObject; YObject = (function() { function YObject(_object) { var name, val, _ref; this._object = _object != null ? _object : {}; if (this._object.constructor === Object) { _ref = this._object; for (name in _ref) { val = _ref[name]; if (val.constructor === Object) { this._object[name] = new YObject(val); } } } else { throw new Error("Y.Object accepts Json Objects only"); } } YObject.prototype._name = "Object"; YObject.prototype._getModel = function(types, ops) { var n, o, _ref; if (this._model == null) { this._model = new ops.MapManager(this).execute(); _ref = this._object; for (n in _ref) { o = _ref[n]; this._model.val(n, o); } } delete this._object; return this._model; }; YObject.prototype._setModel = function(_model) { this._model = _model; return delete this._object; }; YObject.prototype.observe = function(f) { this._model.observe(f); return this; }; YObject.prototype.unobserve = function(f) { this._model.unobserve(f); return this; }; YObject.prototype.val = function(name, content) { var n, res, v, _ref; if (this._model != null) { return this._model.val.apply(this._model, arguments); } else { if (content != null) { return this._object[name] = content; } else if (name != null) { return this._object[name]; } else { res = {}; _ref = this._object; for (n in _ref) { v = _ref[n]; res[n] = v; } return res; } } }; YObject.prototype["delete"] = function(name) { this._model["delete"](name); return this; }; return YObject; })(); if (typeof window !== "undefined" && window !== null) { if (window.Y != null) { window.Y.Object = YObject; } else { throw new Error("You must first import Y!"); } } if (typeof module !== "undefined" && module !== null) { module.exports = YObject; } },{}],6:[function(require,module,exports){ var __slice = [].slice, __hasProp = {}.hasOwnProperty, __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; }; module.exports = function() { var execution_listener, ops; ops = {}; execution_listener = []; ops.Operation = (function() { function Operation(custom_type, uid, content, content_operations) { var name, op; if (custom_type != null) { this.custom_type = custom_type; } this.is_deleted = false; this.garbage_collected = false; this.event_listeners = []; if (uid != null) { this.uid = uid; } if (content === void 0) { } else if ((content != null) && (content.creator != null)) { this.saveOperation('content', content); } else { this.content = content; } if (content_operations != null) { this.content_operations = {}; for (name in content_operations) { op = content_operations[name]; this.saveOperation(name, op, 'content_operations'); } } } Operation.prototype.type = "Operation"; Operation.prototype.getContent = function(name) { var content, n, v, _ref, _ref1; if (this.content != null) { if (this.content.getCustomType != null) { return this.content.getCustomType(); } else if (this.content.constructor === Object) { if (name != null) { if (this.content[name] != null) { return this.content[name]; } else { return this.content_operations[name].getCustomType(); } } else { content = {}; _ref = this.content; for (n in _ref) { v = _ref[n]; content[n] = v; } if (this.content_operations != null) { _ref1 = this.content_operations; for (n in _ref1) { v = _ref1[n]; v = v.getCustomType(); content[n] = v; } } return content; } } else { return this.content; } } else { return this.content; } }; Operation.prototype.retrieveSub = function() { throw new Error("sub properties are not enable on this operation type!"); }; Operation.prototype.observe = function(f) { return this.event_listeners.push(f); }; Operation.prototype.unobserve = function(f) { return this.event_listeners = this.event_listeners.filter(function(g) { return f !== g; }); }; Operation.prototype.deleteAllObservers = function() { return this.event_listeners = []; }; Operation.prototype["delete"] = function() { (new ops.Delete(void 0, this)).execute(); return null; }; Operation.prototype.callEvent = function() { var callon; if (this.custom_type != null) { callon = this.getCustomType(); } else { callon = this; } return this.forwardEvent.apply(this, [callon].concat(__slice.call(arguments))); }; Operation.prototype.forwardEvent = function() { var args, f, op, _i, _len, _ref, _results; op = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; _ref = this.event_listeners; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { f = _ref[_i]; _results.push(f.call.apply(f, [op].concat(__slice.call(args)))); } return _results; }; Operation.prototype.isDeleted = function() { return this.is_deleted; }; Operation.prototype.applyDelete = function(garbagecollect) { if (garbagecollect == null) { garbagecollect = true; } if (!this.garbage_collected) { this.is_deleted = true; if (garbagecollect) { this.garbage_collected = true; return this.HB.addToGarbageCollector(this); } } }; Operation.prototype.cleanup = function() { this.HB.removeOperation(this); return this.deleteAllObservers(); }; Operation.prototype.setParent = function(parent) { this.parent = parent; }; Operation.prototype.getParent = function() { return this.parent; }; Operation.prototype.getUid = function() { var map_uid; if (this.uid.noOperation == null) { return this.uid; } else { if (this.uid.alt != null) { map_uid = this.uid.alt.cloneUid(); map_uid.sub = this.uid.sub; return map_uid; } else { return void 0; } } }; Operation.prototype.cloneUid = function() { var n, uid, v, _ref; uid = {}; _ref = this.getUid(); for (n in _ref) { v = _ref[n]; uid[n] = v; } return uid; }; Operation.prototype.execute = function() { var l, _i, _len; if (this.validateSavedOperations()) { this.is_executed = true; if (this.uid == null) { this.uid = this.HB.getNextOperationIdentifier(); } if (this.uid.noOperation == null) { this.HB.addOperation(this); for (_i = 0, _len = execution_listener.length; _i < _len; _i++) { l = execution_listener[_i]; l(this._encode()); } } return this; } else { return false; } }; Operation.prototype.saveOperation = function(name, op, base) { var dest, last_path, path, paths, _base, _i, _len; if (base == null) { base = "this"; } if ((op != null) && (op._getModel != null)) { op = op._getModel(this.custom_types, this.operations); } if (op == null) { } else if ((op.execute != null) || !((op.op_number != null) && (op.creator != null))) { if (base === "this") { return this[name] = op; } else { dest = this[base]; paths = name.split("/"); last_path = paths.pop(); for (_i = 0, _len = paths.length; _i < _len; _i++) { path = paths[_i]; dest = dest[path]; } return dest[last_path] = op; } } else { if (this.unchecked == null) { this.unchecked = {}; } if ((_base = this.unchecked)[base] == null) { _base[base] = {}; } return this.unchecked[base][name] = op; } }; Operation.prototype.validateSavedOperations = function() { var base, base_name, dest, last_path, name, op, op_uid, path, paths, success, uninstantiated, _i, _len, _ref; uninstantiated = {}; success = true; _ref = this.unchecked; for (base_name in _ref) { base = _ref[base_name]; for (name in base) { op_uid = base[name]; op = this.HB.getOperation(op_uid); if (op) { if (base_name === "this") { this[name] = op; } else { dest = this[base_name]; paths = name.split("/"); last_path = paths.pop(); for (_i = 0, _len = paths.length; _i < _len; _i++) { path = paths[_i]; dest = dest[path]; } dest[last_path] = op; } } else { if (uninstantiated[base_name] == null) { uninstantiated[base_name] = {}; } uninstantiated[base_name][name] = op_uid; success = false; } } } if (!success) { this.unchecked = uninstantiated; return false; } else { delete this.unchecked; return this; } }; Operation.prototype.getCustomType = function() { var Type, t, _i, _len, _ref; if (this.custom_type == null) { return this; } else { if (this.custom_type.constructor === String) { Type = this.custom_types; _ref = this.custom_type.split("."); for (_i = 0, _len = _ref.length; _i < _len; _i++) { t = _ref[_i]; Type = Type[t]; } this.custom_type = new Type(); this.custom_type._setModel(this); } return this.custom_type; } }; Operation.prototype._encode = function(json) { var n, o, operations, _ref, _ref1; if (json == null) { json = {}; } json.type = this.type; json.uid = this.getUid(); if (this.custom_type != null) { if (this.custom_type.constructor === String) { json.custom_type = this.custom_type; } else { json.custom_type = this.custom_type._name; } } if (((_ref = this.content) != null ? _ref.getUid : void 0) != null) { json.content = this.content.getUid(); } else { json.content = this.content; } if (this.content_operations != null) { operations = {}; _ref1 = this.content_operations; for (n in _ref1) { o = _ref1[n]; if (o._getModel != null) { o = o._getModel(this.custom_types, this.operations); } operations[n] = o.getUid(); } json.content_operations = operations; } return json; }; return Operation; })(); ops.Delete = (function(_super) { __extends(Delete, _super); function Delete(custom_type, uid, deletes) { this.saveOperation('deletes', deletes); Delete.__super__.constructor.call(this, custom_type, uid); } Delete.prototype.type = "Delete"; Delete.prototype._encode = function() { return { 'type': "Delete", 'uid': this.getUid(), 'deletes': this.deletes.getUid() }; }; Delete.prototype.execute = function() { var res; if (this.validateSavedOperations()) { res = Delete.__super__.execute.apply(this, arguments); if (res) { this.deletes.applyDelete(this); } return res; } else { return false; } }; return Delete; })(ops.Operation); ops.Delete.parse = function(o) { var deletes_uid, uid; uid = o['uid'], deletes_uid = o['deletes']; return new this(null, uid, deletes_uid); }; ops.Insert = (function(_super) { __extends(Insert, _super); function Insert(custom_type, content, content_operations, parent, uid, prev_cl, next_cl, origin) { this.saveOperation('parent', parent); this.saveOperation('prev_cl', prev_cl); this.saveOperation('next_cl', next_cl); if (origin != null) { this.saveOperation('origin', origin); } else { this.saveOperation('origin', prev_cl); } Insert.__super__.constructor.call(this, custom_type, uid, content, content_operations); } Insert.prototype.type = "Insert"; Insert.prototype.val = function() { return this.getContent(); }; Insert.prototype.getNext = function(i) { var n; if (i == null) { i = 1; } n = this; while (i > 0 && (n.next_cl != null)) { n = n.next_cl; if (!n.is_deleted) { i--; } } if (n.is_deleted) { null; } return n; }; Insert.prototype.getPrev = function(i) { var n; if (i == null) { i = 1; } n = this; while (i > 0 && (n.prev_cl != null)) { n = n.prev_cl; if (!n.is_deleted) { i--; } } if (n.is_deleted) { return null; } else { return n; } }; Insert.prototype.applyDelete = function(o) { var callLater, garbagecollect; if (this.deleted_by == null) { this.deleted_by = []; } callLater = false; if ((this.parent != null) && !this.is_deleted && (o != null)) { callLater = true; } if (o != null) { this.deleted_by.push(o); } garbagecollect = false; if (this.next_cl.isDeleted()) { garbagecollect = true; } Insert.__super__.applyDelete.call(this, garbagecollect); if (callLater) { this.parent.callOperationSpecificDeleteEvents(this, o); } if ((this.prev_cl != null) && this.prev_cl.isDeleted() && this.prev_cl.garbage_collected !== true) { return this.prev_cl.applyDelete(); } }; Insert.prototype.cleanup = function() { var d, o, _i, _len, _ref; if (this.next_cl.isDeleted()) { _ref = this.deleted_by; for (_i = 0, _len = _ref.length; _i < _len; _i++) { d = _ref[_i]; d.cleanup(); } o = this.next_cl; while (o.type !== "Delimiter") { if (o.origin === this) { o.origin = this.prev_cl; } o = o.next_cl; } this.prev_cl.next_cl = this.next_cl; this.next_cl.prev_cl = this.prev_cl; if (this.content instanceof ops.Operation && !(this.content instanceof ops.Insert)) { this.content.referenced_by--; if (this.content.referenced_by <= 0 && !this.content.is_deleted) { this.content.applyDelete(); } } delete this.content; return Insert.__super__.cleanup.apply(this, arguments); } }; Insert.prototype.getDistanceToOrigin = function() { var d, o; d = 0; o = this.prev_cl; while (true) { if (this.origin === o) { break; } d++; o = o.prev_cl; } return d; }; Insert.prototype.execute = function() { var distance_to_origin, i, o, oDistance, _base; if (!this.validateSavedOperations()) { return false; } else { if (this.content instanceof ops.Operation) { this.content.insert_parent = this; if ((_base = this.content).referenced_by == null) { _base.referenced_by = 0; } this.content.referenced_by++; } if (this.parent != null) { if (this.prev_cl == null) { this.prev_cl = this.parent.beginning; } if (this.origin == null) { this.origin = this.prev_cl; } else if (this.origin === "Delimiter") { this.origin = this.parent.beginning; } if (this.next_cl == null) { this.next_cl = this.parent.end; } } if (this.prev_cl != null) { distance_to_origin = this.getDistanceToOrigin(); o = this.prev_cl.next_cl; i = distance_to_origin; while (true) { if (o !== this.next_cl) { oDistance = o.getDistanceToOrigin(); if (oDistance === i) { if (o.uid.creator < this.uid.creator) { this.prev_cl = o; distance_to_origin = i + 1; } else { } } else if (oDistance < i) { if (i - distance_to_origin <= oDistance) { this.prev_cl = o; distance_to_origin = i + 1; } else { } } else { break; } i++; o = o.next_cl; } else { break; } } this.next_cl = this.prev_cl.next_cl; this.prev_cl.next_cl = this; this.next_cl.prev_cl = this; } this.setParent(this.prev_cl.getParent()); Insert.__super__.execute.apply(this, arguments); this.parent.callOperationSpecificInsertEvents(this); return this; } }; Insert.prototype.getPosition = function() { var position, prev; position = 0; prev = this.prev_cl; while (true) { if (prev instanceof ops.Delimiter) { break; } if (!prev.isDeleted()) { position++; } prev = prev.prev_cl; } return position; }; Insert.prototype._encode = function(json) { if (json == null) { json = {}; } json.prev = this.prev_cl.getUid(); json.next = this.next_cl.getUid(); if (this.origin.type === "Delimiter") { json.origin = "Delimiter"; } else if (this.origin !== this.prev_cl) { json.origin = this.origin.getUid(); } json.parent = this.parent.getUid(); return Insert.__super__._encode.call(this, json); }; return Insert; })(ops.Operation); ops.Insert.parse = function(json) { var content, content_operations, next, origin, parent, prev, uid; content = json['content'], content_operations = json['content_operations'], uid = json['uid'], prev = json['prev'], next = json['next'], origin = json['origin'], parent = json['parent']; return new this(null, content, content_operations, parent, uid, prev, next, origin); }; ops.Delimiter = (function(_super) { __extends(Delimiter, _super); function Delimiter(prev_cl, next_cl, origin) { this.saveOperation('prev_cl', prev_cl); this.saveOperation('next_cl', next_cl); this.saveOperation('origin', prev_cl); Delimiter.__super__.constructor.call(this, null, { noOperation: true }); } Delimiter.prototype.type = "Delimiter"; Delimiter.prototype.applyDelete = function() { var o; Delimiter.__super__.applyDelete.call(this); o = this.prev_cl; while (o != null) { o.applyDelete(); o = o.prev_cl; } return void 0; }; Delimiter.prototype.cleanup = function() { return Delimiter.__super__.cleanup.call(this); }; Delimiter.prototype.execute = function() { var _ref, _ref1; if (((_ref = this.unchecked) != null ? _ref['next_cl'] : void 0) != null) { return Delimiter.__super__.execute.apply(this, arguments); } else if ((_ref1 = this.unchecked) != null ? _ref1['prev_cl'] : void 0) { if (this.validateSavedOperations()) { if (this.prev_cl.next_cl != null) { throw new Error("Probably duplicated operations"); } this.prev_cl.next_cl = this; return Delimiter.__super__.execute.apply(this, arguments); } else { return false; } } else if ((this.prev_cl != null) && (this.prev_cl.next_cl == null)) { delete this.prev_cl.unchecked.next_cl; this.prev_cl.next_cl = this; return Delimiter.__super__.execute.apply(this, arguments); } else if ((this.prev_cl != null) || (this.next_cl != null) || true) { return Delimiter.__super__.execute.apply(this, arguments); } }; Delimiter.prototype._encode = function() { var _ref, _ref1; return { 'type': this.type, 'uid': this.getUid(), 'prev': (_ref = this.prev_cl) != null ? _ref.getUid() : void 0, 'next': (_ref1 = this.next_cl) != null ? _ref1.getUid() : void 0 }; }; return Delimiter; })(ops.Operation); ops.Delimiter.parse = function(json) { var next, prev, uid; uid = json['uid'], prev = json['prev'], next = json['next']; return new this(uid, prev, next); }; return { 'operations': ops, 'execution_listener': execution_listener }; }; },{}],7:[function(require,module,exports){ var RBTReeByIndex, basic_ops_uninitialized, __hasProp = {}.hasOwnProperty, __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; }; basic_ops_uninitialized = require("./Basic"); RBTReeByIndex = require('bintrees/lib/rbtree_by_index'); module.exports = function() { var basic_ops, ops; basic_ops = basic_ops_uninitialized(); ops = basic_ops.operations; ops.MapManager = (function(_super) { __extends(MapManager, _super); function MapManager(custom_type, uid, content, content_operations) { this._map = {}; MapManager.__super__.constructor.call(this, custom_type, uid, content, content_operations); } MapManager.prototype.type = "MapManager"; MapManager.prototype.applyDelete = function() { var name, p, _ref; _ref = this._map; for (name in _ref) { p = _ref[name]; p.applyDelete(); } return MapManager.__super__.applyDelete.call(this); }; MapManager.prototype.cleanup = function() { return MapManager.__super__.cleanup.call(this); }; MapManager.prototype.map = function(f) { var n, v, _ref; _ref = this._map; for (n in _ref) { v = _ref[n]; f(n, v); } return void 0; }; MapManager.prototype.val = function(name, content) { var o, prop, rep, res, result, _ref; if (arguments.length > 1) { if ((content != null) && (content._getModel != null)) { rep = content._getModel(this.custom_types, this.operations); } else { rep = content; } this.retrieveSub(name).replace(rep); return this.getCustomType(); } else if (name != null) { prop = this._map[name]; if ((prop != null) && !prop.isContentDeleted()) { res = prop.val(); if (res instanceof ops.Operation) { return res.getCustomType(); } else { return res; } } else { return void 0; } } else { result = {}; _ref = this._map; for (name in _ref) { o = _ref[name]; if (!o.isContentDeleted()) { result[name] = o.val(); } } return result; } }; MapManager.prototype["delete"] = function(name) { var _ref; if ((_ref = this._map[name]) != null) { _ref.deleteContent(); } return this; }; MapManager.prototype.retrieveSub = function(property_name) { var event_properties, event_this, rm, rm_uid; if (this._map[property_name] == null) { event_properties = { name: property_name }; event_this = this; rm_uid = { noOperation: true, sub: property_name, alt: this }; rm = new ops.ReplaceManager(null, event_properties, event_this, rm_uid); this._map[property_name] = rm; rm.setParent(this, property_name); rm.execute(); } return this._map[property_name]; }; return MapManager; })(ops.Operation); ops.MapManager.parse = function(json) { var content, content_operations, custom_type, uid; uid = json['uid'], custom_type = json['custom_type'], content = json['content'], content_operations = json['content_operations']; return new this(custom_type, uid, content, content_operations); }; ops.ListManager = (function(_super) { __extends(ListManager, _super); function ListManager(custom_type, uid, content, content_operations) { this.beginning = new ops.Delimiter(void 0, void 0); this.end = new ops.Delimiter(this.beginning, void 0); this.beginning.next_cl = this.end; this.beginning.execute(); this.end.execute(); this.shortTree = new RBTreeByIndex(); this.completeTree = new RBTreeByIndex(); ListManager.__super__.constructor.call(this, custom_type, uid, content, content_operations); } ListManager.prototype.type = "ListManager"; ListManager.prototype.applyDelete = function() { var o; o = this.beginning; while (o != null) { o.applyDelete(); o = o.next_cl; } return ListManager.__super__.applyDelete.call(this); }; ListManager.prototype.cleanup = function() { return ListManager.__super__.cleanup.call(this); }; ListManager.prototype.toJson = function(transform_to_value) { var i, o, val, _i, _len, _results; if (transform_to_value == null) { transform_to_value = false; } val = this.val(); _results = []; for (o = _i = 0, _len = val.length; _i < _len; o = ++_i) { i = val[o]; if (o instanceof ops.Object) { _results.push(o.toJson(transform_to_value)); } else if (o instanceof ops.ListManager) { _results.push(o.toJson(transform_to_value)); } else if (transform_to_value && o instanceof ops.Operation) { _results.push(o.val()); } else { _results.push(o); } } return _results; }; ListManager.prototype.execute = function() { if (this.validateSavedOperations()) { this.beginning.setParent(this); this.end.setParent(this); return ListManager.__super__.execute.apply(this, arguments); } else { return false; } }; ListManager.prototype.getLastOperation = function() { return this.end.prev_cl; }; ListManager.prototype.getFirstOperation = function() { return this.beginning.next_cl; }; ListManager.prototype.getNextNonDeleted = function(start) { var operation; if (start.isDeleted() || (start.node == null)) { operation = start.next_cl; while (!(operation instanceof ops.Delimiter)) { if (operation.is_deleted) { operation = operation.next_cl; } else { break; } } } else { operation = start.node.next.node; if (!operation) { return false; } } return operation; }; ListManager.prototype.getPrevNonDeleted = function(start) { var operation; if (start.isDeleted() || (start.node == null)) { operation = start.prev_cl; while (!(operation instanceof ops.Delimiter)) { if (operation.is_deleted) { operation = operation.prev_cl; } else { break; } } } else { operation = start.node.prev.node; if (!operation) { return false; } } return operation; }; ListManager.prototype.toArray = function() { return this.shortTree.map(function(operation) { return operation.val(); }); }; ListManager.prototype.map = function(fun) { return this.shortTree.map(fun); }; ListManager.prototype.fold = function(init, fun) { return this.shortTree.map(function(operation) { return init = fun(init, operation); }); }; ListManager.prototype.val = function(pos) { if (pos != null) { return this.shortTree.find(pos).val(); } else { return this.toArray(); } }; ListManager.prototype.ref = function(pos) { if (pos != null) { return this.shortTree.find(pos); } else { return this.shortTree.map(function(operation) { return operation; }); } }; ListManager.prototype.getOperationByPosition = function(position) { if (position === 0) { return this.beginning; } else if (position === this.shortTree.size + 1) { return this.end; } else { return this.shortTree.find(position - 1); } }; ListManager.prototype.push = function(content) { return this.insertAfter(this.end.prev_cl, [content]); }; ListManager.prototype.insertAfterHelper = function(root, content) { var right; if (!root.right) { root.bt.right = content; return content.bt.parent = root; } else { return right = root.next_cl; } }; ListManager.prototype.insertAfter = function(left, contents) { var c, leftNode, right, rightNode, tmp, _i, _len; if (left === this.beginning) { leftNode = null; rightNode = this.shortTree.findNode(0); right = rightNode ? rightNode.data : this.end; } else { rightNode = left.node.next; leftNode = left.node; right = rightNode ? rightNode.data : this.end; } left = right.prev_cl; if (contents instanceof ops.Operation) { tmp = new ops.Insert(null, content, null, void 0, void 0, left, right); tmp.execute(); } else { for (_i = 0, _len = contents.length; _i < _len; _i++) { c = contents[_i]; if ((c != null) && (c._name != null) && (c._getModel != null)) { c = c._getModel(this.custom_types, this.operations); } tmp = new ops.Insert(null, c, null, void 0, void 0, left, right); tmp.execute(); leftNode = tmp.node; left = tmp; } } return this; }; ListManager.prototype.insert = function(position, contents) { var ith; ith = this.getOperationByPosition(position); return this.insertAfter(ith, contents); }; ListManager.prototype.deleteRef = function(operation, length, dir) { var deleteOperation, i, nextOperation, _i; if (length == null) { length = 1; } if (dir == null) { dir = 'right'; } nextOperation = (function(_this) { return function(operation) { if (dir === 'right') { return _this.getNextNonDeleted(operation); } else { return _this.getPrevNonDeleted(operation); } }; })(this); for (i = _i = 0; 0 <= length ? _i < length : _i > length; i = 0 <= length ? ++_i : --_i) { if (operation instanceof ops.Delimiter) { break; } deleteOperation = (new ops.Delete(null, void 0, operation)).execute(); operation = nextOperation(operation); } return this; }; ListManager.prototype["delete"] = function(position, length) { var operation; if (length == null) { length = 1; } operation = this.getOperationByPosition(position + length); return this.deleteRef(operation, length, 'left'); }; ListManager.prototype.callOperationSpecificInsertEvents = function(operation) { var getContentType, next, nextNode, prev, prevNode; prev = (this.getPrevNonDeleted(operation)) || this.beginning; prevNode = prev ? prev.node : null; next = (this.getNextNonDeleted(operation)) || this.end; nextNode = next ? next.node : null; operation.node = operation.node || (this.shortTree.insert_between(prevNode, nextNode, operation)); operation.completeNode = operation.completeNode || (this.completeTree.insert_between(operation.prev_cl.completeNode, operation.next_cl.completeNode, operation)); getContentType = function(content) { if (content instanceof ops.Operation) { return content.getCustomType(); } else { return content; } }; return this.callEvent([ { type: "insert", reference: operation, position: operation.node.position(), object: this.getCustomType(), changedBy: operation.uid.creator, value: getContentType(operation.val()) } ]); }; ListManager.prototype.callOperationSpecificDeleteEvents = function(operation, del_op) { var position; if (operation.node) { position = operation.node.position(); this.shortTree.remove_node(operation.node); operation.node = null; } return this.callEvent([ { type: "delete", reference: operation, position: position, object: this.getCustomType(), length: 1, changedBy: del_op.uid.creator, oldValue: operation.val() } ]); }; return ListManager; })(ops.Operation); ops.ListManager.parse = function(json) { var content, content_operations, custom_type, uid; uid = json['uid'], custom_type = json['custom_type'], content = json['content'], content_operations = json['content_operations']; return new this(custom_type, uid, content, content_operations); }; ops.Composition = (function(_super) { __extends(Composition, _super); function Composition(custom_type, _composition_value, composition_value_operations, uid, tmp_composition_ref) { var n, o; this._composition_value = _composition_value; Composition.__super__.constructor.call(this, custom_type, uid); if (tmp_composition_ref != null) { this.tmp_composition_ref = tmp_composition_ref; } else { this.composition_ref = this.end.prev_cl; } if (composition_value_operations != null) { this.composition_value_operations = {}; for (n in composition_value_operations) { o = composition_value_operations[n]; this.saveOperation(n, o, '_composition_value'); } } } Composition.prototype.type = "Composition"; Composition.prototype.execute = function() { var composition_ref; if (this.validateSavedOperations()) { this.getCustomType()._setCompositionValue(this._composition_value); delete this._composition_value; if (this.tmp_composition_ref) { composition_ref = this.HB.getOperation(this.tmp_composition_ref); if (composition_ref != null) { delete this.tmp_composition_ref; this.composition_ref = composition_ref; } } return Composition.__super__.execute.apply(this, arguments); } else { return false; } }; Composition.prototype.callOperationSpecificInsertEvents = function(operation) { var o; if (this.tmp_composition_ref != null) { if (operation.uid.creator === this.tmp_composition_ref.creator && operation.uid.op_number === this.tmp_composition_ref.op_number) { this.composition_ref = operation; delete this.tmp_composition_ref; operation = operation.next_cl; if (operation === this.end) { return; } } else { return; } } o = this.end.prev_cl; while (o !== operation) { this.getCustomType()._unapply(o.undo_delta); o = o.prev_cl; } while (o !== this.end) { o.undo_delta = this.getCustomType()._apply(o.val()); o = o.next_cl; } this.composition_ref = this.end.prev_cl; return this.callEvent([ { type: "update", changedBy: operation.uid.creator, newValue: this.val() } ]); }; Composition.prototype.callOperationSpecificDeleteEvents = function(operation, del_op) {}; Composition.prototype.applyDelta = function(delta, operations) { (new ops.Insert(null, delta, operations, this, null, this.end.prev_cl, this.end)).execute(); return void 0; }; Composition.prototype._encode = function(json) { var custom, n, o, _ref; if (json == null) { json = {}; } custom = this.getCustomType()._getCompositionValue(); json.composition_value = custom.composition_value; if (custom.composition_value_operations != null) { json.composition_value_operations = {}; _ref = custom.composition_value_operations; for (n in _ref) { o = _ref[n]; json.composition_value_operations[n] = o.getUid(); } } if (this.composition_ref != null) { json.composition_ref = this.composition_ref.getUid(); } else { json.composition_ref = this.tmp_composition_ref; } return Composition.__super__._encode.call(this, json); }; return Composition; })(ops.ListManager); ops.Composition.parse = function(json) { var composition_ref, composition_value, composition_value_operations, custom_type, uid; uid = json['uid'], custom_type = json['custom_type'], composition_value = json['composition_value'], composition_value_operations = json['composition_value_operations'], composition_ref = json['composition_ref']; return new this(custom_type, composition_value, composition_value_operations, uid, composition_ref); }; ops.ReplaceManager = (function(_super) { __extends(ReplaceManager, _super); function ReplaceManager(custom_type, event_properties, event_this, uid) { this.event_properties = event_properties; this.event_this = event_this; if (this.event_properties['object'] == null) { this.event_properties['object'] = this.event_this.getCustomType(); } ReplaceManager.__super__.constructor.call(this, custom_type, uid); } ReplaceManager.prototype.type = "ReplaceManager"; ReplaceManager.prototype.callEventDecorator = function(events) { var event, name, prop, _i, _len, _ref; if (!this.isDeleted()) { for (_i = 0, _len = events.length; _i < _len; _i++) { event = events[_i]; _ref = this.event_properties; for (name in _ref) { prop = _ref[name]; event[name] = prop; } } this.event_this.callEvent(events); } return void 0; }; ReplaceManager.prototype.callOperationSpecificInsertEvents = function(operation) { var old_value; if (operation.next_cl.type === "Delimiter" && operation.prev_cl.type !== "Delimiter") { if (!operation.is_deleted) { old_value = operation.prev_cl.val(); this.callEventDecorator([ { type: "update", changedBy: operation.uid.creator, oldValue: old_value } ]); } operation.prev_cl.applyDelete(); } else if (operation.next_cl.type !== "Delimiter") { operation.applyDelete(); } else { this.callEventDecorator([ { type: "add", changedBy: operation.uid.creator } ]); } return void 0; }; ReplaceManager.prototype.callOperationSpecificDeleteEvents = function(operation, del_op) { if (operation.next_cl.type === "Delimiter") { return this.callEventDecorator([ { type: "delete", changedBy: del_op.uid.creator, oldValue: operation.val() } ]); } }; ReplaceManager.prototype.replace = function(content, replaceable_uid) { var o, relp; o = this.getLastOperation(); relp = (new ops.Insert(null, content, null, this, replaceable_uid, o, o.next_cl)).execute(); return void 0; }; ReplaceManager.prototype.isContentDeleted = function() { return this.getLastOperation().isDeleted(); }; ReplaceManager.prototype.deleteContent = function() { var last_op; last_op = this.getLastOperation(); if ((!last_op.isDeleted()) && last_op.type !== "Delimiter") { (new ops.Delete(null, void 0, this.getLastOperation().uid)).execute(); } return void 0; }; ReplaceManager.prototype.val = function() { var o; o = this.getLastOperation(); return typeof o.val === "function" ? o.val() : void 0; }; return ReplaceManager; })(ops.ListManager); return basic_ops; }; },{"./Basic":6,"bintrees/lib/rbtree_by_index":9}],8:[function(require,module,exports){ var Engine, HistoryBuffer, adaptConnector, createY, structured_ops_uninitialized; structured_ops_uninitialized = require("./Operations/Structured"); HistoryBuffer = require("./HistoryBuffer"); Engine = require("./Engine"); adaptConnector = require("./ConnectorAdapter"); createY = function(connector) { var HB, ct, engine, model, ops, ops_manager, user_id; if (connector.user_id != null) { user_id = connector.user_id; } else { user_id = "_temp"; connector.when_received_state_vector_listeners = [ function(state_vector) { return HB.setUserId(this.user_id, state_vector); } ]; } HB = new HistoryBuffer(user_id); ops_manager = structured_ops_uninitialized(HB, this.constructor); ops = ops_manager.operations; engine = new Engine(HB, ops); adaptConnector(connector, engine, HB, ops_manager.execution_listener); ops.Operation.prototype.HB = HB; ops.Operation.prototype.operations = ops; ops.Operation.prototype.engine = engine; ops.Operation.prototype.connector = connector; ops.Operation.prototype.custom_types = this.constructor; ct = new createY.Object(); model = new ops.MapManager(ct, HB.getReservedUniqueIdentifier()).execute(); ct._setModel(model); return ct; }; module.exports = createY; if (typeof window !== "undefined" && window !== null) { window.Y = createY; } createY.Object = require("./ObjectType"); },{"./ConnectorAdapter":1,"./Engine":3,"./HistoryBuffer":4,"./ObjectType":5,"./Operations/Structured":7}],9:[function(require,module,exports){ var TreeBase = require('./treebase'); /** algorithm from Cormen, Leiserson - Introduction to algorithm **/ function RBTree(comparator) { this._root = null; this._nil = new Node('nil'); this._nil.red = false; this._nil.weight = 0; } RBTree.prototype = new TreeBase(); RBTree.prototype.insert = function(position, data) { var nodeToInsert = new Node(data); if (this.insert_node(position, nodeToInsert)) { return nodeToInsert; } else { return false; } }; RBTree.prototype.insert_node = function(position, nodeToInsert) { var node = this._root; var insertAfter; if (!node) { this._root = nodeToInsert; this._root.red = false; return true; } while (true) { if (node.weight === position) { // Insert after max of node subtree insertAfter = node.max_tree(function(node) { node.weight += 1; }); insertAfter.set_child('right', nodeToInsert); nodeToInsert.parent = insertAfter; break; } else { left = node.get_child('left'); right = node.get_child('right'); if (!left && position === 0) { node.weight += 1; node.set_child('left', nodeToInsert); nodeToInsert.parent = node; break; } else if (left && left.weight >= position) { node.weight += 1; node = left; } else if (right) { position -= (left? left.weight: 0) + 1; node.weight += 1; node = right; } else { node.weight += 1; node.set_child('right', nodeToInsert); nodeToInsert.parent = node; break; } } } this.insert_correction(nodeToInsert); return true; }; RBTree.prototype.insert_between = function(onLeft, onRight, data) { var newNode = new Node(data); // onLeft and onRight are neighbors, so they can't have an element in between. // For example, if onLeft exists, its right neighbor is either nil or right. If it's onRight, // then onRight has no child. If neither left and right exist, the tree is empty. if (onLeft && !onLeft.right) { onLeft.right = newNode; newNode.parent = onLeft; this.insert_correction(newNode); } else if (onRight && !onRight.left) { onRight.left = newNode; newNode.parent = onRight; this.insert_correction(newNode); } else { this.insert_node(0, newNode); } newNode.traverse_up(function(node, parent) { parent.weight = (parent.left ? parent.left.weight : 0) + (parent.right ? parent.right.weight : 0) + 1; }); return newNode; }; RBTree.prototype.rotate = function(side, node) { // all the comment are with the assumption that side === 'left' var neighbor; // get right neighbor neighbor = node.get_child(side, true); // neighbor's left tree becomes node's right tree node.set_child(side, neighbor.get_child(side), true); // if this right tree was non-empty if (neighbor.get_child(side)) { neighbor.get_child(side).parent = node; // attach neighbor's left child to node } neighbor.parent = node.parent; // link neighbor's parent to node's parent if (!node.parent) { // no parent === is_root this._root = neighbor; } else if (node === node.parent.get_child(side)){ // node is left child node.parent.set_child(side, neighbor); // node's parent left child is now neighbor } else { node.parent.set_child(side, neighbor, true); // node's parent right child is now neighbor } neighbor.set_child(side, node); // attach node on left of child node.parent = neighbor; // set node's parent to neighbor // update node's weight first, then node.weight = (node.left? node.left.weight: 0) + (node.right? node.right.weight: 0) + 1; neighbor.weight = (neighbor.left? neighbor.left.weight: 0) + (neighbor.right? neighbor.right.weight: 0) + 1; }; RBTree.prototype.insert_correction = function(node) { var self = this; function helper(side) { var uncle; uncle = node.parent.parent.get_child(side, true); if (uncle && uncle.red) { // if uncle is undefined, it's a leaf so it's black node.parent.red = false; uncle.red = false; node.parent.parent.red = true; node = node.parent.parent; } else { if (node === node.parent.get_child(side, true)) { node = node.parent; self.rotate(side, node); } node.parent.red = false; node.parent.parent.red = true; var oppositeSide = side === 'left'? 'right': 'left'; self.rotate(oppositeSide, node.parent.parent); } } while (node.parent && node.parent.red) { // is there's no node.parent, then it means the parent // is nil which is black // if node's parent is on left of his parent if (node.parent === node.parent.parent.get_child('left')) { // Check that there is a grandparent helper('left'); } else if (node.parent === node.parent.parent.get_child('right')){ helper('right'); } } this._root.red = false; }; RBTree.prototype.find = function() { var node = this.findNode.apply(this, arguments); if (node) { return node.data; } else { return null; } }; /** Find the node at position @position and return it. If no node is found, returns null. * It is also possible to pass a function as second argument. It will be called * with each node traversed except for the one found. **/ RBTree.prototype.findNode = function(position, fun) { // if the weight is 'n', the biggest index is n-1, so we check that position >= size if (position >= this.get_size() || position < 0) { return null; } var node = this._root; if (!node) { return null; } // Find node to delete while (position > 0 || (position === 0 && node.left)) { left = node.left; right = node.right; if (left && left.weight > position) { // when there's a left neighbor with a weight > position to remove, // go into this subtree and decrease the subtree weight if (fun) { fun(node); } node = left; } else if ((!left && position === 0) || (left && left.weight === position)) { break; } else if (right) { // when there's a right subtee, go into it and decrease the position // by the weight of the left subtree - 1 + 1 (for the previous node) if (fun) { fun(node); } node = right; position -= (left? left.weight: 0) + 1; } else { // this should not happen, except if the position is greater than the size of the tree throw new Error('this should not happen'); } } return node; }; RBTree.prototype.remove = function(position) { // if the weight is 'n', the biggest index is n-1, so we check that position >= size var nodeToRemove; nodeToRemove = this.findNode(position, function(node) { node.weight --; }); return this.remove_helper(nodeToRemove); }; RBTree.prototype.remove_helper = function(nodeToRemove) { var left, right, nextNode, childNode, parent; // if there's only one child, replace the nodeToRemove to delete by it's child and update // the refs. // if there's two children, find it's successor and replace the nodeToRemove to delete by his successor // and update the refs if (!nodeToRemove.left || !nodeToRemove.right) { nextNode = nodeToRemove; } else { nextNode = nodeToRemove.next(function(node) { node.weight -= 1; }); } if (nextNode.left) { childNode = nextNode.left; parent = nextNode.parent; } else { childNode = nextNode.right; parent = nextNode.parent; } if (childNode) { childNode.parent = nextNode.parent; } if (!nextNode.parent) { this._root = childNode; } else { if (nextNode === nextNode.parent.left) { nextNode.parent.left = childNode; } else { nextNode.parent.right = childNode; } } // replace nodeToRemove's data by nextNode's (same as removing nodeToRemove, then inserting nextNode at his place // but easier and more efficient) if (nextNode !== nodeToRemove) { nodeToRemove.data = nextNode.data; nodeToRemove.weight = (nodeToRemove.left? nodeToRemove.left.weight: 0) + (nodeToRemove.right? nodeToRemove.right.weight: 0) + 1; } if (!nextNode.red) { this.remove_correction(childNode, parent); } return nextNode; }; RBTree.prototype.remove_node = function(node) { node.traverse_up(function(node, parent) { parent.weight --; }); return this.remove_helper(node); }; RBTree.prototype.remove_correction = function(node, parent) { var self = this; var oppositeSide; var helper = function(side) { var neighbor = parent.get_child(side, true); if (neighbor && neighbor.red) { neighbor.red = false; parent.red = true; self.rotate(side, parent); neighbor = parent.get_child(side, true); } if ((!neighbor.left || !neighbor.left.red) && (!neighbor.right || !neighbor.right.red )) { neighbor.red = true; node = parent; parent = node.parent; } else { if (!neighbor.get_child(side, true) || !neighbor.get_child(side, true).red) { if (neighbor.get_child(side)) { neighbor.get_child(side).red = false; } neighbor.red = true; oppositeSide = side === 'left'? 'right': 'left'; self.rotate(oppositeSide, neighbor); neighbor = parent.get_child(side, true); } neighbor.red = parent? parent.red: false; parent.red = false; if (neighbor.get_child(side, true)) { neighbor.get_child(side, true).red = false; } self.rotate(side, parent); node = self._root; parent = node.parent; } }; while (node !== this._root && (!node || !node.red)) { if (node === parent.get_child('left')) { tmp = helper('left'); } else if (node === parent.get_child('right')) { tmp = helper('right'); } } if (node) { node.red = false; } }; RBTree.prototype.get_size = function() { return (this._root? this._root.weight : 0); }; function Node(data) { this.data = data; this.left = null; this.right = null; this.parent = null; this.red = true; this.weight = 1; } Node.prototype.get_child = function(side, opposite) { if (opposite) { side = (side === 'left')? 'right': 'left'; } return side === 'left'? this.left: this.right; }; Node.prototype.set_child = function(side, node, opposite) { if (opposite) { side = (side === 'left')? 'right': 'left'; } if (side === 'left') { this.left = node; } else { this.right = node; } }; Node.prototype.max_tree = function(fun) { var node = this; if (fun) { fun(node); } while (node.right) { node = node.right; if (fun) { fun(node); } } return node; }; Node.prototype.min_tree = function(fun) { var node = this; if (fun) { fun(node); } while (node.left) { node = node.left; if (fun) { fun(node); } } return node; }; Node.prototype.next = function(fun) { var node, parent; if (this.get_child('right')) { return this.get_child('right').min_tree(fun); } if (fun) { fun(this); } node = this; parent = this.parent; while (parent && node === parent.get_child('right')) { node = parent; parent = node.parent; if (fun) { fun(parent); } } return parent; }; Node.prototype.prev = function(fun) { var node, parent; if (this.get_child('left')) { return this.get_child('left').max_tree(fun); } if (fun) { fun(this); } node = this; parent = this.parent; while (parent && node === parent.get_child('left')) { node = parent; parent = node.parent; if (fun) { fun(parent); } } return parent; }; /** Traverse the tree upwards until it reaches the top. For each node traversed, * call the function passed as argument with arguments node, parent. * The function will be called h-1 times, h being the height of the branch. **/ Node.prototype.traverse_up = function(fun) { var parent = this.parent; var node = this; while(parent) { fun(node, parent); node = parent; parent = parent.parent; } }; Node.prototype.depth = function() { var depth = 0; this.traverse_up(function() { depth ++; }); return depth; }; Node.prototype.position = function() { var position = this.left? this.left.weight: 0; var countFun = function(node, parent) { if (parent.right === node) { // for the left subtree if (parent.left) { position += parent.left.weight; } position += 1; // for the parent } }; this.traverse_up(countFun); return position; }; module.exports = RBTree; },{"./treebase":10}],10:[function(require,module,exports){ function TreeBase() {} // removes all nodes from the tree TreeBase.prototype.clear = function() { this._root = null; this.size = 0; }; // returns node data if found, null otherwise TreeBase.prototype.find = function(data) { var res = this._root; while(res !== null) { var c = this._comparator(data, res.data); if(c === 0) { return res.data; } else { res = res.get_child(c > 0); } } return null; }; // returns iterator to node if found, null otherwise TreeBase.prototype.findIter = function(data) { var res = this._root; var iter = this.iterator(); while(res !== null) { var c = this._comparator(data, res.data); if(c === 0) { iter._cursor = res; return iter; } else { iter._ancestors.push(res); res = res.get_child(c > 0); } } return null; }; // Returns an interator to the tree node at or immediately after the item TreeBase.prototype.lowerBound = function(item) { var cur = this._root; var iter = this.iterator(); var cmp = this._comparator; while(cur !== null) { var c = cmp(item, cur.data); if(c === 0) { iter._cursor = cur; return iter; } iter._ancestors.push(cur); cur = cur.get_child(c > 0); } for(var i=iter._ancestors.length - 1; i >= 0; --i) { cur = iter._ancestors[i]; if(cmp(item, cur.data) < 0) { iter._cursor = cur; iter._ancestors.length = i; return iter; } } iter._ancestors.length = 0; return iter; }; // Returns an interator to the tree node immediately after the item TreeBase.prototype.upperBound = function(item) { var iter = this.lowerBound(item); var cmp = this._comparator; while(cmp(iter.data(), item) === 0) { iter.next(); } return iter; }; // returns null if tree is empty TreeBase.prototype.min = function() { var res = this._root; if(res === null) { return null; } while(res.left !== null) { res = res.left; } return res.data; }; // returns null if tree is empty TreeBase.prototype.max = function() { var res = this._root; if(res === null) { return null; } while(res.right !== null) { res = res.right; } return res.data; }; // returns a null iterator // call next() or prev() to point to an element TreeBase.prototype.iterator = function() { return new Iterator(this); }; TreeBase.prototype.eachNode = function(cb) { var it=this.iterator(), node; var index = 0; while((node = it.next()) !== null) { cb(node, index); index++; } }; // calls cb on each node's data, in order TreeBase.prototype.each = function(cb) { this.eachNode(function(node, index) { cb(node.data, index); }); }; TreeBase.prototype.mapNode = function(cb) { var it=this.iterator(), node; var results = []; var index = 0; while((node = it.next()) !== null) { results.push(cb(node, index)); index ++; } return results; }; // calls cb on each node-s data, store the result and return it TreeBase.prototype.map = function(cb) { return this.mapNode(function(node, index) { return cb(node.data, index); }); }; function Iterator(tree) { this._tree = tree; this._ancestors = []; this._cursor = null; } Iterator.prototype.data = function() { return this._cursor !== null ? this._cursor.data : null; }; // if null-iterator, returns first node // otherwise, returns next node Iterator.prototype.next = function() { if(this._cursor === null) { var root = this._tree._root; if(root !== null) { this._minNode(root); } } else { if(this._cursor.right === null) { // no greater node in subtree, go up to parent // if coming from a right child, continue up the stack var save; do { save = this._cursor; if(this._ancestors.length) { this._cursor = this._ancestors.pop(); } else { this._cursor = null; break; } } while(this._cursor.right === save); } else { // get the next node from the subtree this._ancestors.push(this._cursor); this._minNode(this._cursor.right); } } return this._cursor !== null ? this._cursor : null; }; // if null-iterator, returns last node // otherwise, returns previous node Iterator.prototype.prev = function() { if(this._cursor === null) { var root = this._tree._root; if(root !== null) { this._maxNode(root); } } else { if(this._cursor.left === null) { var save; do { save = this._cursor; if(this._ancestors.length) { this._cursor = this._ancestors.pop(); } else { this._cursor = null; break; } } while(this._cursor.left === save); } else { this._ancestors.push(this._cursor); this._maxNode(this._cursor.left); } } return this._cursor !== null ? this._cursor : null; }; Iterator.prototype._minNode = function(start) { while(start.left !== null) { this._ancestors.push(start); start = start.left; } this._cursor = start; }; Iterator.prototype._maxNode = function(start) { while(start.right !== null) { this._ancestors.push(start); start = start.right; } this._cursor = start; }; module.exports = TreeBase; },{}]},{},[8]) //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL2NjYy9Eb2N1bWVudHMvcHJvZy9MaW5hZ29yYS95anMvbm9kZV9tb2R1bGVzL2d1bHAtYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiL2hvbWUvY2NjL0RvY3VtZW50cy9wcm9nL0xpbmFnb3JhL3lqcy9saWIvQ29ubmVjdG9yQWRhcHRlci5jb2ZmZWUiLCIvaG9tZS9jY2MvRG9jdW1lbnRzL3Byb2cvTGluYWdvcmEveWpzL2xpYi9Db25uZWN0b3JDbGFzcy5jb2ZmZWUiLCIvaG9tZS9jY2MvRG9jdW1lbnRzL3Byb2cvTGluYWdvcmEveWpzL2xpYi9FbmdpbmUuY29mZmVlIiwiL2hvbWUvY2NjL0RvY3VtZW50cy9wcm9nL0xpbmFnb3JhL3lqcy9saWIvSGlzdG9yeUJ1ZmZlci5jb2ZmZWUiLCIvaG9tZS9jY2MvRG9jdW1lbnRzL3Byb2cvTGluYWdvcmEveWpzL2xpYi9PYmplY3RUeXBlLmNvZmZlZSIsIi9ob21lL2NjYy9Eb2N1bWVudHMvcHJvZy9MaW5hZ29yYS95anMvbGliL09wZXJhdGlvbnMvQmFzaWMuY29mZmVlIiwiL2hvbWUvY2NjL0RvY3VtZW50cy9wcm9nL0xpbmFnb3JhL3lqcy9saWIvT3BlcmF0aW9ucy9TdHJ1Y3R1cmVkLmNvZmZlZSIsIi9ob21lL2NjYy9Eb2N1bWVudHMvcHJvZy9MaW5hZ29yYS95anMvbGliL3kuY29mZmVlIiwiL2hvbWUvY2NjL0RvY3VtZW50cy9wcm9nL0xpbmFnb3JhL3lqcy9ub2RlX21vZHVsZXMvYmludHJlZXMvbGliL3JidHJlZV9ieV9pbmRleC5qcyIsIi9ob21lL2NjYy9Eb2N1bWVudHMvcHJvZy9MaW5hZ29yYS95anMvbm9kZV9tb2R1bGVzL2JpbnRyZWVzL2xpYi90cmVlYmFzZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0NBLElBQUEsOEJBQUE7O0FBQUEsY0FBQSxHQUFpQixPQUFBLENB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpfXZhciBmPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChmLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGYsZi5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCJcbkNvbm5lY3RvckNsYXNzID0gcmVxdWlyZSBcIi4vQ29ubmVjdG9yQ2xhc3NcIlxuI1xuIyBAcGFyYW0ge0VuZ2luZX0gZW5naW5lIFRoZSB0cmFuc2Zvcm1hdGlvbiBlbmdpbmVcbiMgQHBhcmFtIHtIaXN0b3J5QnVmZmVyfSBIQlxuIyBAcGFyYW0ge0FycmF5PEZ1bmN0aW9uPn0gZXhlY3V0aW9uX2xpc3RlbmVyIFlvdSBtdXN0IGVuc3VyZSB0aGF0IHdoZW5ldmVyIGFuIG9wZXJhdGlvbiBpcyBleGVjdXRlZCwgZXZlcnkgZnVuY3Rpb24gaW4gdGhpcyBBcnJheSBpcyBjYWxsZWQuXG4jXG5hZGFwdENvbm5lY3RvciA9IChjb25uZWN0b3IsIGVuZ2luZSwgSEIsIGV4ZWN1dGlvbl9saXN0ZW5lciktPlxuXG4gIGZvciBuYW1lLCBmIG9mIENvbm5lY3RvckNsYXNzXG4gICAgY29ubmVjdG9yW25hbWVdID0gZlxuXG4gIGNvbm5lY3Rvci5zZXRJc0JvdW5kVG9ZKClcblxuICBzZW5kXyA9IChvKS0+XG4gICAgaWYgKG8udWlkLmNyZWF0b3IgaXMgSEIuZ2V0VXNlcklkKCkpIGFuZFxuICAgICAgICAodHlwZW9mIG8udWlkLm9wX251bWJlciBpc250IFwic3RyaW5nXCIpIGFuZCAjIFRPRE86IGkgZG9uJ3QgdGhpbmsgdGhhdCB3ZSBuZWVkIHRoaXMgYW55bW9yZS4uXG4gICAgICAgIChIQi5nZXRVc2VySWQoKSBpc250IFwiX3RlbXBcIilcbiAgICAgIGNvbm5lY3Rvci5icm9hZGNhc3Qgb1xuXG4gIGlmIGNvbm5lY3Rvci5pbnZva2VTeW5jP1xuICAgIEhCLnNldEludm9rZVN5bmNIYW5kbGVyIGNvbm5lY3Rvci5pbnZva2VTeW5jXG5cbiAgZXhlY3V0aW9uX2xpc3RlbmVyLnB1c2ggc2VuZF9cbiAgIyBGb3IgdGhlIFhNUFBDb25uZWN0b3I6IGxldHMgc2VuZCBpdCBhcyBhbiBhcnJheVxuICAjIHRoZXJlZm9yZSwgd2UgaGF2ZSB0byByZXN0cnVjdHVyZSBpdCBsYXRlclxuICBlbmNvZGVfc3RhdGVfdmVjdG9yID0gKHYpLT5cbiAgICBmb3IgbmFtZSx2YWx1ZSBvZiB2XG4gICAgICB1c2VyOiBuYW1lXG4gICAgICBzdGF0ZTogdmFsdWVcbiAgcGFyc2Vfc3RhdGVfdmVjdG9yID0gKHYpLT5cbiAgICBzdGF0ZV92ZWN0b3IgPSB7fVxuICAgIGZvciBzIGluIHZcbiAgICAgIHN0YXRlX3ZlY3RvcltzLnVzZXJdID0gcy5zdGF0ZVxuICAgIHN0YXRlX3ZlY3RvclxuXG4gIGdldFN0YXRlVmVjdG9yID0gKCktPlxuICAgIGVuY29kZV9zdGF0ZV92ZWN0b3IgSEIuZ2V0T3BlcmF0aW9uQ291bnRlcigpXG5cbiAgZ2V0SEIgPSAodiktPlxuICAgIHN0YXRlX3ZlY3RvciA9IHBhcnNlX3N0YXRlX3ZlY3RvciB2XG4gICAgaGIgPSBIQi5fZW5jb2RlIHN0YXRlX3ZlY3RvclxuICAgIGpzb24gPVxuICAgICAgaGI6IGhiXG4gICAgICBzdGF0ZV92ZWN0b3I6IGVuY29kZV9zdGF0ZV92ZWN0b3IgSEIuZ2V0T3BlcmF0aW9uQ291bnRlcigpXG4gICAganNvblxuXG4gIGFwcGx5SEIgPSAoaGIsIGZyb21IQiktPlxuICAgIGVuZ2luZS5hcHBseU9wIGhiLCBmcm9tSEJcblxuICBjb25uZWN0b3IuZ2V0U3RhdGVWZWN0b3IgPSBnZXRTdGF0ZVZlY3RvclxuICBjb25uZWN0b3IuZ2V0SEIgPSBnZXRIQlxuICBjb25uZWN0b3IuYXBwbHlIQiA9IGFwcGx5SEJcblxuICBjb25uZWN0b3IucmVjZWl2ZV9oYW5kbGVycyA/PSBbXVxuICBjb25uZWN0b3IucmVjZWl2ZV9oYW5kbGVycy5wdXNoIChzZW5kZXIsIG9wKS0+XG4gICAgaWYgb3AudWlkLmNyZWF0b3IgaXNudCBIQi5nZXRVc2VySWQoKVxuICAgICAgZW5naW5lLmFwcGx5T3Agb3BcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkYXB0Q29ubmVjdG9yXG4iLCJcbm1vZHVsZS5leHBvcnRzID1cbiAgI1xuICAjIEBwYXJhbXMgbmV3IENvbm5lY3RvcihvcHRpb25zKVxuICAjICAgQHBhcmFtIG9wdGlvbnMuc3luY01ldGhvZCB7U3RyaW5nfSAgaXMgZWl0aGVyIFwic3luY0FsbFwiIG9yIFwibWFzdGVyLXNsYXZlXCIuXG4gICMgICBAcGFyYW0gb3B0aW9ucy5yb2xlIHtTdHJpbmd9IFRoZSByb2xlIG9mIHRoaXMgY2xpZW50XG4gICMgICAgICAgICAgICAoc2xhdmUgb3IgbWFzdGVyIChvbmx5IHVzZWQgd2hlbiBzeW5jTWV0aG9kIGlzIG1hc3Rlci1zbGF2ZSkpXG4gICMgICBAcGFyYW0gb3B0aW9ucy5wZXJmb3JtX3NlbmRfYWdhaW4ge0Jvb2xlYW59IFdoZXRlaHIgdG8gd2hldGhlciB0byByZXNlbmQgdGhlIEhCIGFmdGVyIHNvbWUgdGltZSBwZXJpb2QuIFRoaXMgcmVkdWNlcyBzeW5jIGVycm9ycywgYnV0IGhhcyBzb21lIG92ZXJoZWFkIChvcHRpb25hbClcbiAgI1xuICBpbml0OiAob3B0aW9ucyktPlxuICAgIHJlcSA9IChuYW1lLCBjaG9pY2VzKT0+XG4gICAgICBpZiBvcHRpb25zW25hbWVdP1xuICAgICAgICBpZiAobm90IGNob2ljZXM/KSBvciBjaG9pY2VzLnNvbWUoKGMpLT5jIGlzIG9wdGlvbnNbbmFtZV0pXG4gICAgICAgICAgQFtuYW1lXSA9IG9wdGlvbnNbbmFtZV1cbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvciBcIllvdSBjYW4gc2V0IHRoZSAnXCIrbmFtZStcIicgb3B0aW9uIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNob2ljZXM6IFwiK0pTT04uZW5jb2RlKGNob2ljZXMpXG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvciBcIllvdSBtdXN0IHNwZWNpZnkgXCIrbmFtZStcIiwgd2hlbiBpbml0aWFsaXppbmcgdGhlIENvbm5lY3RvciFcIlxuXG4gICAgcmVxIFwic3luY01ldGhvZFwiLCBbXCJzeW5jQWxsXCIsIFwibWFzdGVyLXNsYXZlXCJdXG4gICAgcmVxIFwicm9sZVwiLCBbXCJtYXN0ZXJcIiwgXCJzbGF2ZVwiXVxuICAgIHJlcSBcInVzZXJfaWRcIlxuICAgIEBvbl91c2VyX2lkX3NldD8oQHVzZXJfaWQpXG5cbiAgICAjIHdoZXRoZXIgdG8gcmVzZW5kIHRoZSBIQiBhZnRlciBzb21lIHRpbWUgcGVyaW9kLiBUaGlzIHJlZHVjZXMgc3luYyBlcnJvcnMuXG4gICAgIyBCdXQgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IGluIHRoZSB0ZXN0LWNvbm5lY3RvclxuICAgIGlmIG9wdGlvbnMucGVyZm9ybV9zZW5kX2FnYWluP1xuICAgICAgQHBlcmZvcm1fc2VuZF9hZ2FpbiA9IG9wdGlvbnMucGVyZm9ybV9zZW5kX2FnYWluXG4gICAgZWxzZVxuICAgICAgQHBlcmZvcm1fc2VuZF9hZ2FpbiA9IHRydWVcblxuICAgICMgQSBNYXN0ZXIgc2hvdWxkIHN5bmMgd2l0aCBldmVyeW9uZSEgVE9ETzogcmVhbGx5PyAtIGZvciBub3cgaXRzIHNhZmVyIHRoaXMgd2F5IVxuICAgIGlmIEByb2xlIGlzIFwibWFzdGVyXCJcbiAgICAgIEBzeW5jTWV0aG9kID0gXCJzeW5jQWxsXCJcblxuICAgICMgaXMgc2V0IHRvIHRydWUgd2hlbiB0aGlzIGlzIHN5bmNlZCB3aXRoIGFsbCBvdGhlciBjb25uZWN0aW9uc1xuICAgIEBpc19zeW5jZWQgPSBmYWxzZVxuICAgICMgUGVlcmpzIENvbm5lY3Rpb25zOiBrZXk6IGNvbm4taWQsIHZhbHVlOiBvYmplY3RcbiAgICBAY29ubmVjdGlvbnMgPSB7fVxuICAgICMgTGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBzaGFsbCBwcm9jZXNzIGluY29taW5nIGRhdGFcbiAgICBAcmVjZWl2ZV9oYW5kbGVycyA/PSBbXVxuXG4gICAgIyB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgaXMgYm91bmQgdG8gYW55IHkgaW5zdGFuY2VcbiAgICBAY29ubmVjdGlvbnMgPSB7fVxuICAgIEBjdXJyZW50X3N5bmNfdGFyZ2V0ID0gbnVsbFxuICAgIEBzZW50X2hiX3RvX2FsbF91c2VycyA9IGZhbHNlXG4gICAgQGlzX2luaXRpYWxpemVkID0gdHJ1ZVxuXG4gIG9uVXNlckV2ZW50OiAoZiktPlxuICAgIEBjb25uZWN0aW9uc19saXN0ZW5lcnMgPz0gW11cbiAgICBAY29ubmVjdGlvbnNfbGlzdGVuZXJzLnB1c2ggZlxuXG4gIGlzUm9sZU1hc3RlcjogLT5cbiAgICBAcm9sZSBpcyBcIm1hc3RlclwiXG5cbiAgaXNSb2xlU2xhdmU6IC0+XG4gICAgQHJvbGUgaXMgXCJzbGF2ZVwiXG5cbiAgZmluZE5ld1N5bmNUYXJnZXQ6ICgpLT5cbiAgICBAY3VycmVudF9zeW5jX3RhcmdldCA9IG51bGxcbiAgICBpZiBAc3luY01ldGhvZCBpcyBcInN5bmNBbGxcIlxuICAgICAgZm9yIHVzZXIsIGMgb2YgQGNvbm5lY3Rpb25zXG4gICAgICAgIGlmIG5vdCBjLmlzX3N5bmNlZFxuICAgICAgICAgIEBwZXJmb3JtU3luYyB1c2VyXG4gICAgICAgICAgYnJlYWtcbiAgICBpZiBub3QgQGN1cnJlbnRfc3luY190YXJnZXQ/XG4gICAgICBAc2V0U3RhdGVTeW5jZWQoKVxuICAgIG51bGxcblxuICB1c2VyTGVmdDogKHVzZXIpLT5cbiAgICBkZWxldGUgQGNvbm5lY3Rpb25zW3VzZXJdXG4gICAgQGZpbmROZXdTeW5jVGFyZ2V0KClcbiAgICBpZiBAY29ubmVjdGlvbnNfbGlzdGVuZXJzP1xuICAgICAgZm9yIGYgaW4gQGNvbm5lY3Rpb25zX2xpc3RlbmVyc1xuICAgICAgICBmIHtcbiAgICAgICAgICBhY3Rpb246IFwidXNlckxlZnRcIlxuICAgICAgICAgIHVzZXI6IHVzZXJcbiAgICAgICAgfVxuXG5cbiAgdXNlckpvaW5lZDogKHVzZXIsIHJvbGUpLT5cbiAgICBpZiBub3Qgcm9sZT9cbiAgICAgIHRocm93IG5ldyBFcnJvciBcIkludGVybmFsOiBZb3UgbXVzdCBzcGVjaWZ5IHRoZSByb2xlIG9mIHRoZSBqb2luZWQgdXNlciEgRS5nLiB1c2VySm9pbmVkKCd1aWQ6MzkzOScsJ3NsYXZlJylcIlxuICAgICMgYSB1c2VyIGpvaW5lZCB0aGUgcm9vbVxuICAgIEBjb25uZWN0aW9uc1t1c2VyXSA/PSB7fVxuICAgIEBjb25uZWN0aW9uc1t1c2VyXS5pc19zeW5jZWQgPSBmYWxzZVxuXG4gICAgaWYgKG5vdCBAaXNfc3luY2VkKSBvciBAc3luY01ldGhvZCBpcyBcInN5bmNBbGxcIlxuICAgICAgaWYgQHN5bmNNZXRob2QgaXMgXCJzeW5jQWxsXCJcbiAgICAgICAgQHBlcmZvcm1TeW5jIHVzZXJcbiAgICAgIGVsc2UgaWYgcm9sZSBpcyBcIm1hc3RlclwiXG4gICAgICAgICMgVE9ETzogV2hhdCBpZiB0aGVyZSBhcmUgdHdvIG1hc3RlcnM/IFByZXZlbnQgc2VuZGluZyBldmVyeXRoaW5nIHR3byB0aW1lcyFcbiAgICAgICAgQHBlcmZvcm1TeW5jV2l0aE1hc3RlciB1c2VyXG5cbiAgICBpZiBAY29ubmVjdGlvbnNfbGlzdGVuZXJzP1xuICAgICAgZm9yIGYgaW4gQGNvbm5lY3Rpb25zX2xpc3RlbmVyc1xuICAgICAgICBmIHtcbiAgICAgICAgICBhY3Rpb246IFwidXNlckpvaW5lZFwiXG4gICAgICAgICAgdXNlcjogdXNlclxuICAgICAgICAgIHJvbGU6IHJvbGVcbiAgICAgICAgfVxuXG4gICNcbiAgIyBFeGVjdXRlIGEgZnVuY3Rpb24gX3doZW5fIHdlIGFyZSBjb25uZWN0ZWQuIElmIG5vdCBjb25uZWN0ZWQsIHdhaXQgdW50aWwgY29ubmVjdGVkLlxuICAjIEBwYXJhbSBmIHtGdW5jdGlvbn0gV2lsbCBiZSBleGVjdXRlZCBvbiB0aGUgQ29ubmVjdG9yIGNvbnRleHQuXG4gICNcbiAgd2hlblN5bmNlZDogKGFyZ3MpLT5cbiAgICBpZiBhcmdzLmNvbnN0cnVjdG9yIGlzIEZ1bmN0aW9uXG4gICAgICBhcmdzID0gW2FyZ3NdXG4gICAgaWYgQGlzX3N5bmNlZFxuICAgICAgYXJnc1swXS5hcHBseSB0aGlzLCBhcmdzWzEuLl1cbiAgICBlbHNlXG4gICAgICBAY29tcHV0ZV93aGVuX3N5bmNlZCA/PSBbXVxuICAgICAgQGNvbXB1dGVfd2hlbl9zeW5jZWQucHVzaCBhcmdzXG5cbiAgI1xuICAjIEV4ZWN1dGUgYW4gZnVuY3Rpb24gd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuXG4gICMgQHBhcmFtIGYge0Z1bmN0aW9ufSBXaWxsIGJlIGV4ZWN1dGVkIG9uIHRoZSBQZWVySnMtQ29ubmVjdG9yIGNvbnRleHQuIGYgd2lsbCBiZSBjYWxsZWQgd2l0aCAoc2VuZGVyX2lkLCBicm9hZGNhc3Qge3RydWV8ZmFsc2V9LCBtZXNzYWdlKS5cbiAgI1xuICBvblJlY2VpdmU6IChmKS0+XG4gICAgQHJlY2VpdmVfaGFuZGxlcnMucHVzaCBmXG5cbiAgIyMjXG4gICMgQnJvYWRjYXN0IGEgbWVzc2FnZSB0byBhbGwgY29ubmVjdGVkIHBlZXJzLlxuICAjIEBwYXJhbSBtZXNzYWdlIHtPYmplY3R9IFRoZSBtZXNzYWdlIHRvIGJyb2FkY2FzdC5cbiAgI1xuICBicm9hZGNhc3Q6IChtZXNzYWdlKS0+XG4gICAgdGhyb3cgbmV3IEVycm9yIFwiWW91IG11c3QgaW1wbGVtZW50IGJyb2FkY2FzdCFcIlxuXG4gICNcbiAgIyBTZW5kIGEgbWVzc2FnZSB0byBhIHBlZXIsIG9yIHNldCBvZiBwZWVyc1xuICAjXG4gIHNlbmQ6IChwZWVyX3MsIG1lc3NhZ2UpLT5cbiAgICB0aHJvdyBuZXcgRXJyb3IgXCJZb3UgbXVzdCBpbXBsZW1lbnQgc2VuZCFcIlxuICAjIyNcblxuICAjXG4gICMgcGVyZm9ybSBhIHN5bmMgd2l0aCBhIHNwZWNpZmljIHVzZXIuXG4gICNcbiAgcGVyZm9ybVN5bmM6ICh1c2VyKS0+XG4gICAgaWYgbm90IEBjdXJyZW50X3N5bmNfdGFyZ2V0P1xuICAgICAgQGN1cnJlbnRfc3luY190YXJnZXQgPSB1c2VyXG4gICAgICBAc2VuZCB1c2VyLFxuICAgICAgICBzeW5jX3N0ZXA6IFwiZ2V0SEJcIlxuICAgICAgICBzZW5kX2FnYWluOiBcInRydWVcIlxuICAgICAgICBkYXRhOiBAZ2V0U3RhdGVWZWN0b3IoKVxuICAgICAgaWYgbm90IEBzZW50X2hiX3RvX2FsbF91c2Vyc1xuICAgICAgICBAc2VudF9oYl90b19hbGxfdXNlcnMgPSB0cnVlXG5cbiAgICAgICAgaGIgPSBAZ2V0SEIoW10pLmhiXG4gICAgICAgIF9oYiA9IFtdXG4gICAgICAgIGZvciBvIGluIGhiXG4gICAgICAgICAgX2hiLnB1c2ggb1xuICAgICAgICAgIGlmIF9oYi5sZW5ndGggPiAxMFxuICAgICAgICAgICAgQGJyb2FkY2FzdFxuICAgICAgICAgICAgICBzeW5jX3N0ZXA6IFwiYXBwbHlIQl9cIlxuICAgICAgICAgICAgICBkYXRhOiBfaGJcbiAgICAgICAgICAgIF9oYiA9IFtdXG4gICAgICAgIEBicm9hZGNhc3RcbiAgICAgICAgICBzeW5jX3N0ZXA6IFwiYXBwbHlIQlwiXG4gICAgICAgICAgZGF0YTogX2hiXG5cblxuXG4gICNcbiAgIyBXaGVuIGEgbWFzdGVyIG5vZGUgam9pbmVkIHRoZSByb29tLCBwZXJmb3JtIHRoaXMgc3luYyB3aXRoIGhpbS4gSXQgd2lsbCBhc2sgdGhlIG1hc3RlciBmb3IgdGhlIEhCLFxuICAjIGFuZCB3aWxsIGJyb2FkY2FzdCBoaXMgb3duIEhCXG4gICNcbiAgcGVyZm9ybVN5bmNXaXRoTWFzdGVyOiAodXNlciktPlxuICAgIEBjdXJyZW50X3N5bmNfdGFyZ2V0ID0gdXNlclxuICAgIEBzZW5kIHVzZXIsXG4gICAgICBzeW5jX3N0ZXA6IFwiZ2V0SEJcIlxuICAgICAgc2VuZF9hZ2FpbjogXCJ0cnVlXCJcbiAgICAgIGRhdGE6IEBnZXRTdGF0ZVZlY3RvcigpXG4gICAgaGIgPSBAZ2V0SEIoW10pLmhiXG4gICAgX2hiID0gW11cbiAgICBmb3IgbyBpbiBoYlxuICAgICAgX2hiLnB1c2ggb1xuICAgICAgaWYgX2hiLmxlbmd0aCA+IDEwXG4gICAgICAgIEBicm9hZGNhc3RcbiAgICAgICAgICBzeW5jX3N0ZXA6IFwiYXBwbHlIQl9cIlxuICAgICAgICAgIGRhdGE6IF9oYlxuICAgICAgICBfaGIgPSBbXVxuICAgIEBicm9hZGNhc3RcbiAgICAgIHN5bmNfc3RlcDogXCJhcHBseUhCXCJcbiAgICAgIGRhdGE6IF9oYlxuXG4gICNcbiAgIyBZb3UgYXJlIHN1cmUgdGhhdCBhbGwgY2xpZW50cyBhcmUgc3luY2VkLCBjYWxsIHRoaXMgZnVuY3Rpb24uXG4gICNcbiAgc2V0U3RhdGVTeW5jZWQ6ICgpLT5cbiAgICBpZiBub3QgQGlzX3N5bmNlZFxuICAgICAgQGlzX3N5bmNlZCA9IHRydWVcbiAgICAgIGlmIEBjb21wdXRlX3doZW5fc3luY2VkP1xuICAgICAgICBmb3IgZWwgaW4gQGNvbXB1dGVfd2hlbl9zeW5jZWRcbiAgICAgICAgICBmID0gZWxbMF1cbiAgICAgICAgICBhcmdzID0gZWxbMS4uXVxuICAgICAgICAgIGYuYXBwbHkoYXJncylcbiAgICAgICAgZGVsZXRlIEBjb21wdXRlX3doZW5fc3luY2VkXG4gICAgICBudWxsXG5cbiAgIyBleGVjdXRlZCB3aGVuIHRoZSBhIHN0YXRlX3ZlY3RvciBpcyByZWNlaXZlZC4gbGlzdGVuZXIgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIVxuICB3aGVuUmVjZWl2ZWRTdGF0ZVZlY3RvcjogKGYpLT5cbiAgICBAd2hlbl9yZWNlaXZlZF9zdGF0ZV92ZWN0b3JfbGlzdGVuZXJzID89IFtdXG4gICAgQHdoZW5fcmVjZWl2ZWRfc3RhdGVfdmVjdG9yX2xpc3RlbmVycy5wdXNoIGZcblxuXG4gICNcbiAgIyBZb3UgcmVjZWl2ZWQgYSByYXcgbWVzc2FnZSwgYW5kIHlvdSBrbm93IHRoYXQgaXQgaXMgaW50ZW5kZWQgZm9yIHRvIFlqcy4gVGhlbiBjYWxsIHRoaXMgZnVuY3Rpb24uXG4gICNcbiAgcmVjZWl2ZU1lc3NhZ2U6IChzZW5kZXIsIHJlcyktPlxuICAgIGlmIG5vdCByZXMuc3luY19zdGVwP1xuICAgICAgZm9yIGYgaW4gQHJlY2VpdmVfaGFuZGxlcnNcbiAgICAgICAgZiBzZW5kZXIsIHJlc1xuICAgIGVsc2VcbiAgICAgIGlmIHNlbmRlciBpcyBAdXNlcl9pZFxuICAgICAgICByZXR1cm5cbiAgICAgIGlmIHJlcy5zeW5jX3N0ZXAgaXMgXCJnZXRIQlwiXG4gICAgICAgICMgY2FsbCBsaXN0ZW5lcnNcbiAgICAgICAgaWYgQHdoZW5fcmVjZWl2ZWRfc3RhdGVfdmVjdG9yX2xpc3RlbmVycz9cbiAgICAgICAgICBmb3IgZiBpbiBAd2hlbl9yZWNlaXZlZF9zdGF0ZV92ZWN0b3JfbGlzdGVuZXJzXG4gICAgICAgICAgICBmLmNhbGwgdGhpcywgcmVzLmRhdGFcbiAgICAgICAgZGVsZXRlIEB3aGVuX3JlY2VpdmVkX3N0YXRlX3ZlY3Rvcl9saXN0ZW5lcnNcblxuICAgICAgICBkYXRhID0gQGdldEhCKHJlcy5kYXRhKVxuICAgICAgICBoYiA9IGRhdGEuaGJcbiAgICAgICAgX2hiID0gW11cbiAgICAgICAgIyBhbHdheXMgYnJvYWRjYXN0LCB3aGVuIG5vdCBzeW5jZWQuXG4gICAgICAgICMgVGhpcyByZWR1Y2VzIGVycm9ycywgd2hlbiB0aGUgY2xpZW50cyBnb2VzIG9mZmxpbmUgcHJlbWF0dXJlbHkuXG4gICAgICAgICMgV2hlbiB0aGlzIGNsaWVudCBvbmx5IHN5bmNzIHRvIG9uZSBvdGhlciBjbGllbnRzLCBidXQgbG9vc2VzIGNvbm5lY3RvcnMsXG4gICAgICAgICMgYmVmb3JlIHN5bmNpbmcgdG8gdGhlIG90aGVyIGNsaWVudHMsIHRoZSBvbmxpbmUgY2xpZW50cyBoYXZlIGRpZmZlcmVudCBzdGF0ZXMuXG4gICAgICAgICMgU2luY2Ugd2UgZG8gbm90IHdhbnQgdG8gcGVyZm9ybSByZWd1bGFyIHN5bmNzLCB0aGlzIGlzIGEgZ29vZCBhbHRlcm5hdGl2ZVxuICAgICAgICBpZiBAaXNfc3luY2VkXG4gICAgICAgICAgc2VuZEFwcGx5SEIgPSAobSk9PlxuICAgICAgICAgICAgQHNlbmQgc2VuZGVyLCBtXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBzZW5kQXBwbHlIQiA9IChtKT0+XG4gICAgICAgICAgICBAYnJvYWRjYXN0IG1cblxuICAgICAgICBmb3IgbyBpbiBoYlxuICAgICAgICAgIF9oYi5wdXNoIG9cbiAgICAgICAgICBpZiBfaGIubGVuZ3RoID4gMTBcbiAgICAgICAgICAgIHNlbmRBcHBseUhCXG4gICAgICAgICAgICAgIHN5bmNfc3RlcDogXCJhcHBseUhCX1wiXG4gICAgICAgICAgICAgIGRhdGE6IF9oYlxuICAgICAgICAgICAgX2hiID0gW11cblxuICAgICAgICBzZW5kQXBwbHlIQlxuICAgICAgICAgIHN5bmNfc3RlcCA6IFwiYXBwbHlIQlwiXG4gICAgICAgICAgZGF0YTogX2hiXG5cbiAgICAgICAgaWYgcmVzLnNlbmRfYWdhaW4/IGFuZCBAcGVyZm9ybV9zZW5kX2FnYWluXG4gICAgICAgICAgc2VuZF9hZ2FpbiA9IGRvIChzdiA9IGRhdGEuc3RhdGVfdmVjdG9yKT0+XG4gICAgICAgICAgICAoKT0+XG4gICAgICAgICAgICAgIGhiID0gQGdldEhCKHN2KS5oYlxuICAgICAgICAgICAgICBmb3IgbyBpbiBoYlxuICAgICAgICAgICAgICAgIF9oYi5wdXNoIG9cbiAgICAgICAgICAgICAgICBpZiBfaGIubGVuZ3RoID4gMTBcbiAgICAgICAgICAgICAgICAgIEBzZW5kIHNlbmRlcixcbiAgICAgICAgICAgICAgICAgICAgc3luY19zdGVwOiBcImFwcGx5SEJfXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogX2hiXG4gICAgICAgICAgICAgICAgICBfaGIgPSBbXVxuICAgICAgICAgICAgICBAc2VuZCBzZW5kZXIsXG4gICAgICAgICAgICAgICAgc3luY19zdGVwOiBcImFwcGx5SEJcIixcbiAgICAgICAgICAgICAgICBkYXRhOiBfaGJcbiAgICAgICAgICAgICAgICBzZW50X2FnYWluOiBcInRydWVcIlxuICAgICAgICAgIHNldFRpbWVvdXQgc2VuZF9hZ2FpbiwgMzAwMFxuICAgICAgZWxzZSBpZiByZXMuc3luY19zdGVwIGlzIFwiYXBwbHlIQlwiXG4gICAgICAgIEBhcHBseUhCKHJlcy5kYXRhLCBzZW5kZXIgaXMgQGN1cnJlbnRfc3luY190YXJnZXQpXG5cbiAgICAgICAgaWYgKEBzeW5jTWV0aG9kIGlzIFwic3luY0FsbFwiIG9yIHJlcy5zZW50X2FnYWluPykgYW5kIChub3QgQGlzX3N5bmNlZCkgYW5kICgoQGN1cnJlbnRfc3luY190YXJnZXQgaXMgc2VuZGVyKSBvciAobm90IEBjdXJyZW50X3N5bmNfdGFyZ2V0PykpXG4gICAgICAgICAgQGNvbm5lY3Rpb25zW3NlbmRlcl0uaXNfc3luY2VkID0gdHJ1ZVxuICAgICAgICAgIEBmaW5kTmV3U3luY1RhcmdldCgpXG5cbiAgICAgIGVsc2UgaWYgcmVzLnN5bmNfc3RlcCBpcyBcImFwcGx5SEJfXCJcbiAgICAgICAgQGFwcGx5SEIocmVzLmRhdGEsIHNlbmRlciBpcyBAY3VycmVudF9zeW5jX3RhcmdldClcblxuXG4gICMgQ3VycmVudGx5LCB0aGUgSEIgZW5jb2RlcyBvcGVyYXRpb25zIGFzIEpTT04uIEZvciB0aGUgbW9tZW50IEkgd2FudCB0byBrZWVwIGl0XG4gICMgdGhhdCB3YXkuIE1heWJlIHdlIHN1cHBvcnQgZW5jb2RpbmcgaW4gdGhlIEhCIGFzIFhNTCBpbiB0aGUgZnV0dXJlLCBidXQgZm9yIG5vdyBJIGRvbid0IHdhbnRcbiAgIyB0b28gbXVjaCBvdmVyaGVhZC4gWSBpcyB2ZXJ5IGxpa2VseSB0byBnZXQgY2hhbmdlZCBhIGxvdCBpbiB0aGUgZnV0dXJlXG4gICNcbiAgIyBCZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZW5jb2RlIEpTT04gYXMgc3RyaW5nICh3aXRoIGNoYXJhY3RlciBlc2NhcGluZywgd2ljaCBtYWtlcyBpdCBwcmV0dHkgbXVjaCB1bnJlYWRhYmxlKVxuICAjIHdlIGVuY29kZSB0aGUgSlNPTiBhcyBYTUwuXG4gICNcbiAgIyBXaGVuIHRoZSBIQiBzdXBwb3J0IGVuY29kaW5nIGFzIFhNTCwgdGhlIGZvcm1hdCBzaG91bGQgbG9vayBwcmV0dHkgbXVjaCBsaWtlIHRoaXMuXG5cbiAgIyBkb2VzIG5vdCBzdXBwb3J0IHByaW1pdGl2ZSB2YWx1ZXMgYXMgYXJyYXkgZWxlbWVudHNcbiAgIyBleHBlY3RzIGFuIGx0eCAobGVzcyB0aGFuIHhtbCkgb2JqZWN0XG4gIHBhcnNlTWVzc2FnZUZyb21YbWw6IChtKS0+XG4gICAgcGFyc2VfYXJyYXkgPSAobm9kZSktPlxuICAgICAgZm9yIG4gaW4gbm9kZS5jaGlsZHJlblxuICAgICAgICBpZiBuLmdldEF0dHJpYnV0ZShcImlzQXJyYXlcIikgaXMgXCJ0cnVlXCJcbiAgICAgICAgICBwYXJzZV9hcnJheSBuXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBwYXJzZV9vYmplY3QgblxuXG4gICAgcGFyc2Vfb2JqZWN0ID0gKG5vZGUpLT5cbiAgICAgIGpzb24gPSB7fVxuICAgICAgZm9yIG5hbWUsIHZhbHVlICBvZiBub2RlLmF0dHJzXG4gICAgICAgIGludCA9IHBhcnNlSW50KHZhbHVlKVxuICAgICAgICBpZiBpc05hTihpbnQpIG9yIChcIlwiK2ludCkgaXNudCB2YWx1ZVxuICAgICAgICAgIGpzb25bbmFtZV0gPSB2YWx1ZVxuICAgICAgICBlbHNlXG4gICAgICAgICAganNvbltuYW1lXSA9IGludFxuICAgICAgZm9yIG4gaW4gbm9kZS5jaGlsZHJlblxuICAgICAgICBuYW1lID0gbi5uYW1lXG4gICAgICAgIGlmIG4uZ2V0QXR0cmlidXRlKFwiaXNBcnJheVwiKSBpcyBcInRydWVcIlxuICAgICAgICAgIGpzb25bbmFtZV0gPSBwYXJzZV9hcnJheSBuXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBqc29uW25hbWVdID0gcGFyc2Vfb2JqZWN0IG5cbiAgICAgIGpzb25cbiAgICBwYXJzZV9vYmplY3QgbVxuXG4gICMgZW5jb2RlIG1lc3NhZ2UgaW4geG1sXG4gICMgd2UgdXNlIHN0cmluZyBiZWNhdXNlIFN0cm9waGUgb25seSBhY2NlcHRzIGFuIFwieG1sLXN0cmluZ1wiLi5cbiAgIyBTbyB7YTo0LGI6e2M6NX19IHdpbGwgbG9vayBsaWtlXG4gICMgPHkgYT1cIjRcIj5cbiAgIyAgIDxiIGM9XCI1XCI+PC9iPlxuICAjIDwveT5cbiAgIyBtIC0gbHR4IGVsZW1lbnRcbiAgIyBqc29uIC0gZ3Vlc3MgaXQgOylcbiAgI1xuICBlbmNvZGVNZXNzYWdlVG9YbWw6IChtLCBqc29uKS0+XG4gICAgIyBhdHRyaWJ1dGVzIGlzIG9wdGlvbmFsXG4gICAgZW5jb2RlX29iamVjdCA9IChtLCBqc29uKS0+XG4gICAgICBmb3IgbmFtZSx2YWx1ZSBvZiBqc29uXG4gICAgICAgIGlmIG5vdCB2YWx1ZT9cbiAgICAgICAgICAjIG5vcFxuICAgICAgICBlbHNlIGlmIHZhbHVlLmNvbnN0cnVjdG9yIGlzIE9iamVjdFxuICAgICAgICAgIGVuY29kZV9vYmplY3QgbS5jKG5hbWUpLCB2YWx1ZVxuICAgICAgICBlbHNlIGlmIHZhbHVlLmNvbnN0cnVjdG9yIGlzIEFycmF5XG4gICAgICAgICAgZW5jb2RlX2FycmF5IG0uYyhuYW1lKSwgdmFsdWVcbiAgICAgICAgZWxzZVxuICAgICAgICAgIG0uc2V0QXR0cmlidXRlKG5hbWUsdmFsdWUpXG4gICAgICBtXG4gICAgZW5jb2RlX2FycmF5ID0gKG0sIGFycmF5KS0+XG4gICAgICBtLnNldEF0dHJpYnV0ZShcImlzQXJyYXlcIixcInRydWVcIilcbiAgICAgIGZvciBlIGluIGFycmF5XG4gICAgICAgIGlmIGUuY29uc3RydWN0b3IgaXMgT2JqZWN0XG4gICAgICAgICAgZW5jb2RlX29iamVjdCBtLmMoXCJhcnJheS1lbGVtZW50XCIpLCBlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBlbmNvZGVfYXJyYXkgbS5jKFwiYXJyYXktZWxlbWVudFwiKSwgZVxuICAgICAgbVxuICAgIGlmIGpzb24uY29uc3RydWN0b3IgaXMgT2JqZWN0XG4gICAgICBlbmNvZGVfb2JqZWN0IG0uYyhcInlcIix7eG1sbnM6XCJodHRwOi8veS5uaW5qYS9jb25uZWN0b3Itc3RhbnphXCJ9KSwganNvblxuICAgIGVsc2UgaWYganNvbi5jb25zdHJ1Y3RvciBpcyBBcnJheVxuICAgICAgZW5jb2RlX2FycmF5IG0uYyhcInlcIix7eG1sbnM6XCJodHRwOi8veS5uaW5qYS9jb25uZWN0b3Itc3RhbnphXCJ9KSwganNvblxuICAgIGVsc2VcbiAgICAgIHRocm93IG5ldyBFcnJvciBcIkkgY2FuJ3QgZW5jb2RlIHRoaXMganNvbiFcIlxuXG4gIHNldElzQm91bmRUb1k6ICgpLT5cbiAgICBAb25fYm91bmRfdG9feT8oKVxuICAgIGRlbGV0ZSBAd2hlbl9ib3VuZF90b195XG4gICAgQGlzX2JvdW5kX3RvX3kgPSB0cnVlXG4iLCJcbndpbmRvdz8udW5wcm9jZXNzZWRfY291bnRlciA9IDAgIyBkZWwgdGhpc1xud2luZG93Py51bnByb2Nlc3NlZF9leGVjX2NvdW50ZXIgPSAwICMgVE9ET1xud2luZG93Py51bnByb2Nlc3NlZF90eXBlcyA9IFtdXG5cbiNcbiMgQG5vZG9jXG4jIFRoZSBFbmdpbmUgaGFuZGxlcyBob3cgYW5kIGluIHdoaWNoIG9yZGVyIHRvIGV4ZWN1dGUgb3BlcmF0aW9ucyBhbmQgYWRkIG9wZXJhdGlvbnMgdG8gdGhlIEhpc3RvcnlCdWZmZXIuXG4jXG5jbGFzcyBFbmdpbmVcblxuICAjXG4gICMgQHBhcmFtIHtIaXN0b3J5QnVmZmVyfSBIQlxuICAjIEBwYXJhbSB7T2JqZWN0fSB0eXBlcyBsaXN0IG9mIGF2YWlsYWJsZSB0eXBlc1xuICAjXG4gIGNvbnN0cnVjdG9yOiAoQEhCLCBAdHlwZXMpLT5cbiAgICBAdW5wcm9jZXNzZWRfb3BzID0gW11cblxuICAjXG4gICMgUGFyc2VzIGFuIG9wZXJhdGlvIGZyb20gdGhlIGpzb24gZm9ybWF0LiBJdCB1c2VzIHRoZSBzcGVjaWZpZWQgcGFyc2VyIGluIHlvdXIgT3BlcmF0aW9uVHlwZSBtb2R1bGUuXG4gICNcbiAgcGFyc2VPcGVyYXRpb246IChqc29uKS0+XG4gICAgdHlwZSA9IEB0eXBlc1tqc29uLnR5cGVdXG4gICAgaWYgdHlwZT8ucGFyc2U/XG4gICAgICB0eXBlLnBhcnNlIGpzb25cbiAgICBlbHNlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IgXCJZb3UgZm9yZ290IHRvIHNwZWNpZnkgYSBwYXJzZXIgZm9yIHR5cGUgI3tqc29uLnR5cGV9LiBUaGUgbWVzc2FnZSBpcyAje0pTT04uc3RyaW5naWZ5IGpzb259LlwiXG5cblxuICAjXG4gICMgQXBwbHkgYSBzZXQgb2Ygb3BlcmF0aW9ucy4gRS5nLiB0aGUgb3BlcmF0aW9ucyB5b3UgcmVjZWl2ZWQgZnJvbSBhbm90aGVyIHVzZXJzIEhCLl9lbmNvZGUoKS5cbiAgIyBAbm90ZSBZb3UgbXVzdCBub3QgdXNlIHRoaXMgbWV0aG9kIHdoZW4geW91IGFscmVhZHkgaGF2ZSBvcHMgaW4geW91ciBIQiFcbiAgIyMjXG4gIGFwcGx5T3BzQnVuZGxlOiAob3BzX2pzb24pLT5cbiAgICBvcHMgPSBbXVxuICAgIGZvciBvIGluIG9wc19qc29uXG4gICAgICBvcHMucHVzaCBAcGFyc2VPcGVyYXRpb24gb1xuICAgIGZvciBvIGluIG9wc1xuICAgICAgaWYgbm90IG8uZXhlY3V0ZSgpXG4gICAgICAgIEB1bnByb2Nlc3NlZF9vcHMucHVzaCBvXG4gICAgQHRyeVVucHJvY2Vzc2VkKClcbiAgIyMjXG5cbiAgI1xuICAjIFNhbWUgYXMgYXBwbHlPcHMgYnV0IG9wZXJhdGlvbnMgdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgSEIgYXJlIG5vdCBhcHBsaWVkLlxuICAjIEBzZWUgRW5naW5lLmFwcGx5T3BzXG4gICNcbiAgYXBwbHlPcHNDaGVja0RvdWJsZTogKG9wc19qc29uKS0+XG4gICAgZm9yIG8gaW4gb3BzX2pzb25cbiAgICAgIGlmIG5vdCBASEIuZ2V0T3BlcmF0aW9uKG8udWlkKT9cbiAgICAgICAgQGFwcGx5T3Agb1xuXG4gICNcbiAgIyBBcHBseSBhIHNldCBvZiBvcGVyYXRpb25zLiAoSGVscGVyIGZvciB1c2luZyBhcHBseU9wIG9uIEFycmF5cylcbiAgIyBAc2VlIEVuZ2luZS5hcHBseU9wXG4gIGFwcGx5T3BzOiAob3BzX2pzb24pLT5cbiAgICBAYXBwbHlPcCBvcHNfanNvblxuXG4gICNcbiAgIyBBcHBseSBhbiBvcGVyYXRpb24gdGhhdCB5b3UgcmVjZWl2ZWQgZnJvbSBhbm90aGVyIHBlZXIuXG4gICMgVE9ETzogbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50ISFcbiAgIyAtIG9wZXJhdGlvbnMgbWF5IG9ubHkgZXhlY3V0ZWQgaW4gb3JkZXIgYnkgY3JlYXRvciwgb3JkZXIgdGhlbSBpbiBvYmplY3Qgb2YgYXJyYXlzIChrZXkgYnkgY3JlYXRvcilcbiAgIyAtIHlvdSBjYW4gcHJvYmFibHkgbWFrZSBzb21ldGhpbmcgbGlrZSBkZXBlbmRlbmNpZXMgKGNyZWF0b3IxIHdhaXRzIGZvciBjcmVhdG9yMilcbiAgYXBwbHlPcDogKG9wX2pzb25fYXJyYXksIGZyb21IQiA9IGZhbHNlKS0+XG4gICAgaWYgb3BfanNvbl9hcnJheS5jb25zdHJ1Y3RvciBpc250IEFycmF5XG4gICAgICBvcF9qc29uX2FycmF5ID0gW29wX2pzb25fYXJyYXldXG4gICAgZm9yIG9wX2pzb24gaW4gb3BfanNvbl9hcnJheVxuICAgICAgaWYgZnJvbUhCXG4gICAgICAgIG9wX2pzb24uZnJvbUhCID0gXCJ0cnVlXCIgIyBleGVjdXRlIGltbWVkaWF0ZWx5LCBpZlxuICAgICAgIyAkcGFyc2VfYW5kX2V4ZWN1dGUgd2lsbCByZXR1cm4gZmFsc2UgaWYgJG9fanNvbiB3YXMgcGFyc2VkIGFuZCBleGVjdXRlZCwgb3RoZXJ3aXNlIHRoZSBwYXJzZWQgb3BlcmFkaW9uXG4gICAgICBvID0gQHBhcnNlT3BlcmF0aW9uIG9wX2pzb25cbiAgICAgIG8ucGFyc2VkX2Zyb21fanNvbiA9IG9wX2pzb25cbiAgICAgIGlmIG9wX2pzb24uZnJvbUhCP1xuICAgICAgICBvLmZyb21IQiA9IG9wX2pzb24uZnJvbUhCXG4gICAgICAjIEBIQi5hZGRPcGVyYXRpb24gb1xuICAgICAgaWYgQEhCLmdldE9wZXJhdGlvbihvKT9cbiAgICAgICAgIyBub3BcbiAgICAgIGVsc2UgaWYgKChub3QgQEhCLmlzRXhwZWN0ZWRPcGVyYXRpb24obykpIGFuZCAobm90IG8uZnJvbUhCPykpIG9yIChub3Qgby5leGVjdXRlKCkpXG4gICAgICAgIEB1bnByb2Nlc3NlZF9vcHMucHVzaCBvXG4gICAgICAgIHdpbmRvdz8udW5wcm9jZXNzZWRfdHlwZXMucHVzaCBvLnR5cGUgIyBUT0RPOiBkZWxldGUgdGhpc1xuICAgIEB0cnlVbnByb2Nlc3NlZCgpXG5cbiAgI1xuICAjIENhbGwgdGhpcyBtZXRob2Qgd2hlbiB5b3UgYXBwbGllZCBhIG5ldyBvcGVyYXRpb24uXG4gICMgSXQgY2hlY2tzIGlmIG9wZXJhdGlvbnMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgbm90IGV4ZWN1dGFibGUgYXJlIG5vdyBleGVjdXRhYmxlLlxuICAjXG4gIHRyeVVucHJvY2Vzc2VkOiAoKS0+XG4gICAgd2hpbGUgdHJ1ZVxuICAgICAgb2xkX2xlbmd0aCA9IEB1bnByb2Nlc3NlZF9vcHMubGVuZ3RoXG4gICAgICB1bnByb2Nlc3NlZCA9IFtdXG4gICAgICBmb3Igb3AgaW4gQHVucHJvY2Vzc2VkX29wc1xuICAgICAgICBpZiBASEIuZ2V0T3BlcmF0aW9uKG9wKT9cbiAgICAgICAgICAjIG5vcFxuICAgICAgICBlbHNlIGlmIChub3QgQEhCLmlzRXhwZWN0ZWRPcGVyYXRpb24ob3ApIGFuZCAobm90IG9wLmZyb21IQj8pKSBvciAobm90IG9wLmV4ZWN1dGUoKSlcbiAgICAgICAgICB1bnByb2Nlc3NlZC5wdXNoIG9wXG4gICAgICBAdW5wcm9jZXNzZWRfb3BzID0gdW5wcm9jZXNzZWRcbiAgICAgIGlmIEB1bnByb2Nlc3NlZF9vcHMubGVuZ3RoIGlzIG9sZF9sZW5ndGhcbiAgICAgICAgYnJlYWtcbiAgICBpZiBAdW5wcm9jZXNzZWRfb3BzLmxlbmd0aCBpc250IDBcbiAgICAgIEBIQi5pbnZva2VTeW5jKClcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEVuZ2luZVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuIiwiXG4jXG4jIEBub2RvY1xuIyBBbiBvYmplY3QgdGhhdCBob2xkcyBhbGwgYXBwbGllZCBvcGVyYXRpb25zLlxuI1xuIyBAbm90ZSBUaGUgSGlzdG9yeUJ1ZmZlciBpcyBjb21tb25seSBhYmJyZXZpYXRlZCB0byBIQi5cbiNcbmNsYXNzIEhpc3RvcnlCdWZmZXJcblxuICAjXG4gICMgQ3JlYXRlcyBhbiBlbXB0eSBIQi5cbiAgIyBAcGFyYW0ge09iamVjdH0gdXNlcl9pZCBDcmVhdG9yIG9mIHRoZSBIQi5cbiAgI1xuICBjb25zdHJ1Y3RvcjogKEB1c2VyX2lkKS0+XG4gICAgQG9wZXJhdGlvbl9jb3VudGVyID0ge31cbiAgICBAYnVmZmVyID0ge31cbiAgICBAY2hhbmdlX2xpc3RlbmVycyA9IFtdXG4gICAgQGdhcmJhZ2UgPSBbXSAjIFdpbGwgYmUgY2xlYW5lZCBvbiBuZXh0IGNhbGwgb2YgZ2FyYmFnZUNvbGxlY3RvclxuICAgIEB0cmFzaCA9IFtdICMgSXMgZGVsZXRlZC4gV2FpdCB1bnRpbCBpdCBpcyBub3QgdXNlZCBhbnltb3JlLlxuICAgIEBwZXJmb3JtR2FyYmFnZUNvbGxlY3Rpb24gPSB0cnVlXG4gICAgQGdhcmJhZ2VDb2xsZWN0VGltZW91dCA9IDMwMDAwXG4gICAgQHJlc2VydmVkX2lkZW50aWZpZXJfY291bnRlciA9IDBcbiAgICBzZXRUaW1lb3V0IEBlbXB0eUdhcmJhZ2UsIEBnYXJiYWdlQ29sbGVjdFRpbWVvdXRcblxuICAjIEF0IHRoZSBiZWdpbm5pbmcgKHdoZW4gdGhlIHVzZXIgaWQgd2FzIG5vdCBhc3NpZ25lZCB5ZXQpLFxuICAjIHRoZSBvcGVyYXRpb25zIGFyZSBhZGRlZCB0byBidWZmZXIuX3RlbXAuIFdoZW4geW91IGZpbmFsbHkgZ2V0IHlvdXIgdXNlciBpZCxcbiAgIyB0aGUgb3BlcmF0aW9ucyBhcmUgY29waWVzIGZyb20gYnVmZmVyLl90ZW1wIHRvIGJ1ZmZlcltpZF0uIEZ1cnRoZXJtb3JlLCB3aGVuIGJ1ZmZlcltpZF0gZG9lcyBhbHJlYWR5IGNvbnRhaW4gb3BlcmF0aW9uc1xuICAjIChiZWNhdXNlIG9mIGEgcHJldmlvdXMgc2Vzc2lvbiksIHRoZSB1aWQub3BfbnVtYmVycyBvZiB0aGUgb3BlcmF0aW9ucyBoYXZlIHRvIGJlIHJlYXNzaWduZWQuXG4gICMgVGhpcyBpcyB3aGF0IHRoaXMgZnVuY3Rpb24gZG9lcy4gSXQgYWRkcyB0aGVtIHRvIGJ1ZmZlcltpZF0sXG4gICMgYW5kIGFzc2lnbnMgdGhlbSB0aGUgY29ycmVjdCB1aWQub3BfbnVtYmVyIGFuZCB1aWQuY3JlYXRvclxuICBzZXRVc2VySWQ6IChAdXNlcl9pZCwgc3RhdGVfdmVjdG9yKS0+XG4gICAgQGJ1ZmZlcltAdXNlcl9pZF0gPz0gW11cbiAgICBidWZmID0gQGJ1ZmZlcltAdXNlcl9pZF1cblxuICAgICMgd2UgYXNzdW1lZCB0aGF0IHdlIHN0YXJ0ZWQgd2l0aCBjb3VudGVyID0gMC5cbiAgICAjIHdoZW4gd2UgcmVjZWl2ZSB0aGEgc3RhdGVfdmVjdG9yLCBhbmQgYWN0dWFsbHkgaGF2ZVxuICAgICMgY291bnRlciA9IDEwLiBUaGVuIHdlIGhhdmUgdG8gYWRkIDEwIHRvIGV2ZXJ5IG9wX2NvdW50ZXJcbiAgICBjb3VudGVyX2RpZmYgPSBzdGF0ZV92ZWN0b3JbQHVzZXJfaWRdIG9yIDBcblxuICAgIGlmIEBidWZmZXIuX3RlbXA/XG4gICAgICBmb3Igb19uYW1lLG8gb2YgQGJ1ZmZlci5fdGVtcFxuICAgICAgICBvLnVpZC5jcmVhdG9yID0gQHVzZXJfaWRcbiAgICAgICAgby51aWQub3BfbnVtYmVyICs9IGNvdW50ZXJfZGlmZlxuICAgICAgICBidWZmW28udWlkLm9wX251bWJlcl0gPSBvXG5cbiAgICBAb3BlcmF0aW9uX2NvdW50ZXJbQHVzZXJfaWRdID0gKEBvcGVyYXRpb25fY291bnRlci5fdGVtcCBvciAwKSArIGNvdW50ZXJfZGlmZlxuXG4gICAgZGVsZXRlIEBvcGVyYXRpb25fY291bnRlci5fdGVtcFxuICAgIGRlbGV0ZSBAYnVmZmVyLl90ZW1wXG5cblxuICBlbXB0eUdhcmJhZ2U6ICgpPT5cbiAgICBmb3IgbyBpbiBAZ2FyYmFnZVxuICAgICAgI2lmIEBnZXRPcGVyYXRpb25Db3VudGVyKG8udWlkLmNyZWF0b3IpID4gby51aWQub3BfbnVtYmVyXG4gICAgICBvLmNsZWFudXA/KClcblxuICAgIEBnYXJiYWdlID0gQHRyYXNoXG4gICAgQHRyYXNoID0gW11cbiAgICBpZiBAZ2FyYmFnZUNvbGxlY3RUaW1lb3V0IGlzbnQgLTFcbiAgICAgIEBnYXJiYWdlQ29sbGVjdFRpbWVvdXRJZCA9IHNldFRpbWVvdXQgQGVtcHR5R2FyYmFnZSwgQGdhcmJhZ2VDb2xsZWN0VGltZW91dFxuICAgIHVuZGVmaW5lZFxuXG4gICNcbiAgIyBHZXQgdGhlIHVzZXIgaWQgd2l0aCB3aWNoIHRoZSBIaXN0b3J5IEJ1ZmZlciB3YXMgaW5pdGlhbGl6ZWQuXG4gICNcbiAgZ2V0VXNlcklkOiAoKS0+XG4gICAgQHVzZXJfaWRcblxuICBhZGRUb0dhcmJhZ2VDb2xsZWN0b3I6ICgpLT5cbiAgICBpZiBAcGVyZm9ybUdhcmJhZ2VDb2xsZWN0aW9uXG4gICAgICBmb3IgbyBpbiBhcmd1bWVudHNcbiAgICAgICAgaWYgbz9cbiAgICAgICAgICBAZ2FyYmFnZS5wdXNoIG9cblxuICBzdG9wR2FyYmFnZUNvbGxlY3Rpb246ICgpLT5cbiAgICBAcGVyZm9ybUdhcmJhZ2VDb2xsZWN0aW9uID0gZmFsc2VcbiAgICBAc2V0TWFudWFsR2FyYmFnZUNvbGxlY3QoKVxuICAgIEBnYXJiYWdlID0gW11cbiAgICBAdHJhc2ggPSBbXVxuXG4gIHNldE1hbnVhbEdhcmJhZ2VDb2xsZWN0OiAoKS0+XG4gICAgQGdhcmJhZ2VDb2xsZWN0VGltZW91dCA9IC0xXG4gICAgY2xlYXJUaW1lb3V0IEBnYXJiYWdlQ29sbGVjdFRpbWVvdXRJZFxuICAgIEBnYXJiYWdlQ29sbGVjdFRpbWVvdXRJZCA9IHVuZGVmaW5lZFxuXG4gIHNldEdhcmJhZ2VDb2xsZWN0VGltZW91dDogKEBnYXJiYWdlQ29sbGVjdFRpbWVvdXQpLT5cblxuICAjXG4gICMgSSBwcm9wb3NlIHRvIHVzZSBpdCBpbiB5b3VyIEZyYW1ld29yaywgdG8gY3JlYXRlIHNvbWV0aGluZyBsaWtlIGEgcm9vdCBlbGVtZW50LlxuICAjIEFuIG9wZXJhdGlvbiB3aXRoIHRoaXMgaWRlbnRpZmllciBpcyBub3QgcHJvcGFnYXRlZCB0byBvdGhlciBjbGllbnRzLlxuICAjIFRoaXMgaXMgd2h5IGV2ZXJ5Ym9kZSBtdXN0IGNyZWF0ZSB0aGUgc2FtZSBvcGVyYXRpb24gd2l0aCB0aGlzIHVpZC5cbiAgI1xuICBnZXRSZXNlcnZlZFVuaXF1ZUlkZW50aWZpZXI6ICgpLT5cbiAgICB7XG4gICAgICBjcmVhdG9yIDogJ18nXG4gICAgICBvcF9udW1iZXIgOiBcIl8je0ByZXNlcnZlZF9pZGVudGlmaWVyX2NvdW50ZXIrK31cIlxuICAgIH1cblxuICAjXG4gICMgR2V0IHRoZSBvcGVyYXRpb24gY291bnRlciB0aGF0IGRlc2NyaWJlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQuXG4gICNcbiAgZ2V0T3BlcmF0aW9uQ291bnRlcjogKHVzZXJfaWQpLT5cbiAgICBpZiBub3QgdXNlcl9pZD9cbiAgICAgIHJlcyA9IHt9XG4gICAgICBmb3IgdXNlcixjdG4gb2YgQG9wZXJhdGlvbl9jb3VudGVyXG4gICAgICAgIHJlc1t1c2VyXSA9IGN0blxuICAgICAgcmVzXG4gICAgZWxzZVxuICAgICAgQG9wZXJhdGlvbl9jb3VudGVyW3VzZXJfaWRdXG5cbiAgaXNFeHBlY3RlZE9wZXJhdGlvbjogKG8pLT5cbiAgICBAb3BlcmF0aW9uX2NvdW50ZXJbby51aWQuY3JlYXRvcl0gPz0gMFxuICAgIG8udWlkLm9wX251bWJlciA8PSBAb3BlcmF0aW9uX2NvdW50ZXJbby51aWQuY3JlYXRvcl1cbiAgICB0cnVlICNUT0RPOiAhISB0aGlzIGNvdWxkIGJyZWFrIHN0dWZmLiBCdXQgSSBkdW5ubyB3aHlcblxuICAjXG4gICMgRW5jb2RlIHRoaXMgb3BlcmF0aW9uIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBjYW4gYmUgcGFyc2VkIGJ5IHJlbW90ZSBwZWVycy5cbiAgIyBUT0RPOiBNYWtlIHRoaXMgbW9yZSBlZmZpY2llbnQhXG4gIF9lbmNvZGU6IChzdGF0ZV92ZWN0b3I9e30pLT5cbiAgICBqc29uID0gW11cbiAgICB1bmtub3duID0gKHVzZXIsIG9fbnVtYmVyKS0+XG4gICAgICBpZiAobm90IHVzZXI/KSBvciAobm90IG9fbnVtYmVyPylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yIFwiZGFoIVwiXG4gICAgICBub3Qgc3RhdGVfdmVjdG9yW3VzZXJdPyBvciBzdGF0ZV92ZWN0b3JbdXNlcl0gPD0gb19udW1iZXJcblxuICAgIGZvciB1X25hbWUsdXNlciBvZiBAYnVmZmVyXG4gICAgICAjIFRPRE8gbmV4dCwgaWYgQHN0YXRlX3ZlY3Rvclt1c2VyXSA8PSBzdGF0ZV92ZWN0b3JbdXNlcl1cbiAgICAgIGlmIHVfbmFtZSBpcyBcIl9cIlxuICAgICAgICBjb250aW51ZVxuICAgICAgZm9yIG9fbnVtYmVyLG8gb2YgdXNlclxuICAgICAgICBpZiAobm90IG8udWlkLm5vT3BlcmF0aW9uPykgYW5kIHVua25vd24odV9uYW1lLCBvX251bWJlcilcbiAgICAgICAgICAjIGl0cyBuZWNlc3NhcnkgdG8gc2VuZCBpdCwgYW5kIG5vdCBrbm93biBpbiBzdGF0ZV92ZWN0b3JcbiAgICAgICAgICBvX2pzb24gPSBvLl9lbmNvZGUoKVxuICAgICAgICAgIGlmIG8ubmV4dF9jbD8gIyBhcHBsaWVzIGZvciBhbGwgb3BzIGJ1dCB0aGUgbW9zdCByaWdodCBkZWxpbWl0ZXIhXG4gICAgICAgICAgICAjIHNlYXJjaCBmb3IgdGhlIG5leHQgX2tub3duXyBvcGVyYXRpb24uIChXaGVuIHN0YXRlX3ZlY3RvciBpcyB7fSB0aGVuIHRoaXMgaXMgdGhlIERlbGltaXRlcilcbiAgICAgICAgICAgIG9fbmV4dCA9IG8ubmV4dF9jbFxuICAgICAgICAgICAgd2hpbGUgb19uZXh0Lm5leHRfY2w/IGFuZCB1bmtub3duKG9fbmV4dC51aWQuY3JlYXRvciwgb19uZXh0LnVpZC5vcF9udW1iZXIpXG4gICAgICAgICAgICAgIG9fbmV4dCA9IG9fbmV4dC5uZXh0X2NsXG4gICAgICAgICAgICBvX2pzb24ubmV4dCA9IG9fbmV4dC5nZXRVaWQoKVxuICAgICAgICAgIGVsc2UgaWYgby5wcmV2X2NsPyAjIG1vc3QgcmlnaHQgZGVsaW1pdGVyIG9ubHkhXG4gICAgICAgICAgICAjIHNhbWUgYXMgdGhlIGFib3ZlIHdpdGggcHJldi5cbiAgICAgICAgICAgIG9fcHJldiA9IG8ucHJldl9jbFxuICAgICAgICAgICAgd2hpbGUgb19wcmV2LnByZXZfY2w/IGFuZCB1bmtub3duKG9fcHJldi51aWQuY3JlYXRvciwgb19wcmV2LnVpZC5vcF9udW1iZXIpXG4gICAgICAgICAgICAgIG9fcHJldiA9IG9fcHJldi5wcmV2X2NsXG4gICAgICAgICAgICBvX2pzb24ucHJldiA9IG9fcHJldi5nZXRVaWQoKVxuICAgICAgICAgIGpzb24ucHVzaCBvX2pzb25cblxuICAgIGpzb25cblxuICAjXG4gICMgR2V0IHRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyB0aGF0IHdlcmUgY3JlYXRlZCBieSBhIHVzZXIuXG4gICMgQWNjb3JkaW5nbHkgeW91IHdpbGwgZ2V0IHRoZSBuZXh0IG9wZXJhdGlvbiBudW1iZXIgdGhhdCBpcyBleHBlY3RlZCBmcm9tIHRoYXQgdXNlci5cbiAgIyBUaGlzIHdpbGwgaW5jcmVtZW50IHRoZSBvcGVyYXRpb24gY291bnRlci5cbiAgI1xuICBnZXROZXh0T3BlcmF0aW9uSWRlbnRpZmllcjogKHVzZXJfaWQpLT5cbiAgICBpZiBub3QgdXNlcl9pZD9cbiAgICAgIHVzZXJfaWQgPSBAdXNlcl9pZFxuICAgIGlmIG5vdCBAb3BlcmF0aW9uX2NvdW50ZXJbdXNlcl9pZF0/XG4gICAgICBAb3BlcmF0aW9uX2NvdW50ZXJbdXNlcl9pZF0gPSAwXG4gICAgdWlkID1cbiAgICAgICdjcmVhdG9yJyA6IHVzZXJfaWRcbiAgICAgICdvcF9udW1iZXInIDogQG9wZXJhdGlvbl9jb3VudGVyW3VzZXJfaWRdXG4gICAgQG9wZXJhdGlvbl9jb3VudGVyW3VzZXJfaWRdKytcbiAgICB1aWRcblxuICAjXG4gICMgUmV0cmlldmUgYW4gb3BlcmF0aW9uIGZyb20gYSB1bmlxdWUgaWQuXG4gICNcbiAgIyB3aGVuIHVpZCBoYXMgYSBcInN1YlwiIHByb3BlcnR5LCB0aGUgdmFsdWUgb2YgaXQgd2lsbCBiZSBhcHBsaWVkXG4gICMgb24gdGhlIG9wZXJhdGlvbnMgcmV0cmlldmVTdWIgbWV0aG9kICh3aGljaCBtdXN0ISBiZSBkZWZpbmVkKVxuICAjXG4gIGdldE9wZXJhdGlvbjogKHVpZCktPlxuICAgIGlmIHVpZC51aWQ/XG4gICAgICB1aWQgPSB1aWQudWlkXG4gICAgbyA9IEBidWZmZXJbdWlkLmNyZWF0b3JdP1t1aWQub3BfbnVtYmVyXVxuICAgIGlmIHVpZC5zdWI/IGFuZCBvP1xuICAgICAgby5yZXRyaWV2ZVN1YiB1aWQuc3ViXG4gICAgZWxzZVxuICAgICAgb1xuXG4gICNcbiAgIyBBZGQgYW4gb3BlcmF0aW9uIHRvIHRoZSBIQi4gTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgbGluayBpdCBhZ2FpbnN0XG4gICMgb3RoZXIgb3BlcmF0aW9ucyAoaXQgd29udCBleGVjdXRlZClcbiAgI1xuICBhZGRPcGVyYXRpb246IChvKS0+XG4gICAgaWYgbm90IEBidWZmZXJbby51aWQuY3JlYXRvcl0/XG4gICAgICBAYnVmZmVyW28udWlkLmNyZWF0b3JdID0ge31cbiAgICBpZiBAYnVmZmVyW28udWlkLmNyZWF0b3JdW28udWlkLm9wX251bWJlcl0/XG4gICAgICB0aHJvdyBuZXcgRXJyb3IgXCJZb3UgbXVzdCBub3Qgb3ZlcndyaXRlIG9wZXJhdGlvbnMhXCJcbiAgICBpZiAoby51aWQub3BfbnVtYmVyLmNvbnN0cnVjdG9yIGlzbnQgU3RyaW5nKSBhbmQgKG5vdCBAaXNFeHBlY3RlZE9wZXJhdGlvbihvKSkgYW5kIChub3Qgby5mcm9tSEI/KSAjIHlvdSBhbHJlYWR5IGRvIHRoaXMgaW4gdGhlIGVuZ2luZSwgc28gZGVsZXRlIGl0IGhlcmUhXG4gICAgICB0aHJvdyBuZXcgRXJyb3IgXCJ0aGlzIG9wZXJhdGlvbiB3YXMgbm90IGV4cGVjdGVkIVwiXG4gICAgQGFkZFRvQ291bnRlcihvKVxuICAgIEBidWZmZXJbby51aWQuY3JlYXRvcl1bby51aWQub3BfbnVtYmVyXSA9IG9cbiAgICBvXG5cbiAgcmVtb3ZlT3BlcmF0aW9uOiAobyktPlxuICAgIGRlbGV0ZSBAYnVmZmVyW28udWlkLmNyZWF0b3JdP1tvLnVpZC5vcF9udW1iZXJdXG5cbiAgIyBXaGVuIHRoZSBIQiBkZXRlcm1pbmVzIGluY29uc2lzdGVuY2llcywgdGhlbiB0aGUgaW52b2tlU3luY1xuICAjIGhhbmRsZXIgd2lsIGJlIGNhbGxlZCwgd2hpY2ggc2hvdWxkIHNvbWVob3cgaW52b2tlIHRoZSBzeW5jIHdpdGggYW5vdGhlciBjb2xsYWJvcmF0b3IuXG4gICMgVGhlIHBhcmFtZXRlciBvZiB0aGUgc3luYyBoYW5kbGVyIGlzIHRoZSB1c2VyX2lkIHdpdGggd2ljaCBhbiBpbmNvbnNpc3RlbmN5IHdhcyBkZXRlcm1pbmVkXG4gIHNldEludm9rZVN5bmNIYW5kbGVyOiAoZiktPlxuICAgIEBpbnZva2VTeW5jID0gZlxuXG4gICMgZW1wdHkgcGVyIGRlZmF1bHQgIyBUT0RPOiBkbyBpIG5lZWQgdGhpcz9cbiAgaW52b2tlU3luYzogKCktPlxuXG4gICMgYWZ0ZXIgeW91IHJlY2VpdmVkIHRoZSBIQiBvZiBhbm90aGVyIHVzZXIgKGluIHRoZSBzeW5jIHByb2Nlc3MpLFxuICAjIHlvdSByZW5ldyB5b3VyIG93biBzdGF0ZV92ZWN0b3IgdG8gdGhlIHN0YXRlX3ZlY3RvciBvZiB0aGUgb3RoZXIgdXNlclxuICByZW5ld1N0YXRlVmVjdG9yOiAoc3RhdGVfdmVjdG9yKS0+XG4gICAgZm9yIHVzZXIsc3RhdGUgb2Ygc3RhdGVfdmVjdG9yXG4gICAgICBpZiAoKG5vdCBAb3BlcmF0aW9uX2NvdW50ZXJbdXNlcl0/KSBvciAoQG9wZXJhdGlvbl9jb3VudGVyW3VzZXJdIDwgc3RhdGVfdmVjdG9yW3VzZXJdKSkgYW5kIHN0YXRlX3ZlY3Rvclt1c2VyXT9cbiAgICAgICAgQG9wZXJhdGlvbl9jb3VudGVyW3VzZXJdID0gc3RhdGVfdmVjdG9yW3VzZXJdXG5cbiAgI1xuICAjIEluY3JlbWVudCB0aGUgb3BlcmF0aW9uX2NvdW50ZXIgdGhhdCBkZWZpbmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBFbmdpbmUuXG4gICNcbiAgYWRkVG9Db3VudGVyOiAobyktPlxuICAgIEBvcGVyYXRpb25fY291bnRlcltvLnVpZC5jcmVhdG9yXSA/PSAwXG4gICAgIyBUT0RPOiBjaGVjayBpZiBvcGVyYXRpb25zIGFyZSBzZW5kIGluIG9yZGVyXG4gICAgaWYgby51aWQub3BfbnVtYmVyIGlzIEBvcGVyYXRpb25fY291bnRlcltvLnVpZC5jcmVhdG9yXVxuICAgICAgQG9wZXJhdGlvbl9jb3VudGVyW28udWlkLmNyZWF0b3JdKytcbiAgICB3aGlsZSBAYnVmZmVyW28udWlkLmNyZWF0b3JdW0BvcGVyYXRpb25fY291bnRlcltvLnVpZC5jcmVhdG9yXV0/XG4gICAgICBAb3BlcmF0aW9uX2NvdW50ZXJbby51aWQuY3JlYXRvcl0rK1xuICAgIHVuZGVmaW5lZFxuXG5tb2R1bGUuZXhwb3J0cyA9IEhpc3RvcnlCdWZmZXJcbiIsIlxuY2xhc3MgWU9iamVjdFxuXG4gIGNvbnN0cnVjdG9yOiAoQF9vYmplY3QgPSB7fSktPlxuICAgIGlmIEBfb2JqZWN0LmNvbnN0cnVjdG9yIGlzIE9iamVjdFxuICAgICAgZm9yIG5hbWUsIHZhbCBvZiBAX29iamVjdFxuICAgICAgICBpZiB2YWwuY29uc3RydWN0b3IgaXMgT2JqZWN0XG4gICAgICAgICAgQF9vYmplY3RbbmFtZV0gPSBuZXcgWU9iamVjdCh2YWwpXG4gICAgZWxzZVxuICAgICAgdGhyb3cgbmV3IEVycm9yIFwiWS5PYmplY3QgYWNjZXB0cyBKc29uIE9iamVjdHMgb25seVwiXG5cbiAgX25hbWU6IFwiT2JqZWN0XCJcblxuICBfZ2V0TW9kZWw6ICh0eXBlcywgb3BzKS0+XG4gICAgaWYgbm90IEBfbW9kZWw/XG4gICAgICBAX21vZGVsID0gbmV3IG9wcy5NYXBNYW5hZ2VyKEApLmV4ZWN1dGUoKVxuICAgICAgZm9yIG4sbyBvZiBAX29iamVjdFxuICAgICAgICBAX21vZGVsLnZhbCBuLCBvXG4gICAgZGVsZXRlIEBfb2JqZWN0XG4gICAgQF9tb2RlbFxuXG4gIF9zZXRNb2RlbDogKEBfbW9kZWwpLT5cbiAgICBkZWxldGUgQF9vYmplY3RcblxuICBvYnNlcnZlOiAoZiktPlxuICAgIEBfbW9kZWwub2JzZXJ2ZSBmXG4gICAgQFxuXG4gIHVub2JzZXJ2ZTogKGYpLT5cbiAgICBAX21vZGVsLnVub2JzZXJ2ZSBmXG4gICAgQFxuXG4gICNcbiAgIyBAb3ZlcmxvYWQgdmFsKClcbiAgIyAgIEdldCB0aGlzIGFzIGEgSnNvbiBvYmplY3QuXG4gICMgICBAcmV0dXJuIFtKc29uXVxuICAjXG4gICMgQG92ZXJsb2FkIHZhbChuYW1lKVxuICAjICAgR2V0IHZhbHVlIG9mIGEgcHJvcGVydHkuXG4gICMgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBvYmplY3QgcHJvcGVydHkuXG4gICMgICBAcmV0dXJuIFsqXSBEZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuXG4gICNcbiAgIyBAb3ZlcmxvYWQgdmFsKG5hbWUsIGNvbnRlbnQpXG4gICMgICBTZXQgYSBuZXcgcHJvcGVydHkuXG4gICMgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBvYmplY3QgcHJvcGVydHkuXG4gICMgICBAcGFyYW0ge09iamVjdHxTdHJpbmd9IGNvbnRlbnQgQ29udGVudCBvZiB0aGUgb2JqZWN0IHByb3BlcnR5LlxuICAjICAgQHJldHVybiBbT2JqZWN0IFR5cGVdIFRoaXMgb2JqZWN0LiAoc3VwcG9ydHMgY2hhaW5pbmcpXG4gICNcbiAgdmFsOiAobmFtZSwgY29udGVudCktPlxuICAgIGlmIEBfbW9kZWw/XG4gICAgICBAX21vZGVsLnZhbC5hcHBseSBAX21vZGVsLCBhcmd1bWVudHNcbiAgICBlbHNlXG4gICAgICBpZiBjb250ZW50P1xuICAgICAgICBAX29iamVjdFtuYW1lXSA9IGNvbnRlbnRcbiAgICAgIGVsc2UgaWYgbmFtZT9cbiAgICAgICAgQF9vYmplY3RbbmFtZV1cbiAgICAgIGVsc2VcbiAgICAgICAgcmVzID0ge31cbiAgICAgICAgZm9yIG4sdiBvZiBAX29iamVjdFxuICAgICAgICAgIHJlc1tuXSA9IHZcbiAgICAgICAgcmVzXG5cbiAgZGVsZXRlOiAobmFtZSktPlxuICAgIEBfbW9kZWwuZGVsZXRlKG5hbWUpXG4gICAgQFxuXG5pZiB3aW5kb3c/XG4gIGlmIHdpbmRvdy5ZP1xuICAgIHdpbmRvdy5ZLk9iamVjdCA9IFlPYmplY3RcbiAgZWxzZVxuICAgIHRocm93IG5ldyBFcnJvciBcIllvdSBtdXN0IGZpcnN0IGltcG9ydCBZIVwiXG5cbmlmIG1vZHVsZT9cbiAgbW9kdWxlLmV4cG9ydHMgPSBZT2JqZWN0XG4iLCJtb2R1bGUuZXhwb3J0cyA9ICgpLT5cbiAgIyBAc2VlIEVuZ2luZS5wYXJzZVxuICBvcHMgPSB7fVxuICBleGVjdXRpb25fbGlzdGVuZXIgPSBbXVxuXG4gICNcbiAgIyBAcHJpdmF0ZVxuICAjIEBhYnN0cmFjdFxuICAjIEBub2RvY1xuICAjIEEgZ2VuZXJpYyBpbnRlcmZhY2UgdG8gb3BzLlxuICAjXG4gICMgQW4gb3BlcmF0aW9uIGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6XG4gICMgKiBfZW5jb2RlOiBlbmNvZGVzIGFuIG9wZXJhdGlvbiAobmVlZGVkIG9ubHkgaWYgaW5zdGFuY2Ugb2YgdGhpcyBvcGVyYXRpb24gaXMgc2VudCkuXG4gICMgKiBleGVjdXRlOiBleGVjdXRlIHRoZSBlZmZlY3RzIG9mIHRoaXMgb3BlcmF0aW9ucy4gR29vZCBleGFtcGxlcyBhcmUgSW5zZXJ0LXR5cGUgYW5kIEFkZE5hbWUtdHlwZVxuICAjICogdmFsOiBpbiB0aGUgY2FzZSB0aGF0IHRoZSBvcGVyYXRpb24gaG9sZHMgYSB2YWx1ZVxuICAjXG4gICMgRnVydGhlcm1vcmUgYW4gZW5jb2RhYmxlIG9wZXJhdGlvbiBoYXMgYSBwYXJzZXIuIFdlIGV4dGVuZCB0aGUgcGFyc2VyIG9iamVjdCBpbiBvcmRlciB0byBwYXJzZSBlbmNvZGVkIG9wZXJhdGlvbnMuXG4gICNcbiAgY2xhc3Mgb3BzLk9wZXJhdGlvblxuXG4gICAgI1xuICAgICMgQHBhcmFtIHtPYmplY3R9IHVpZCBBIHVuaXF1ZSBpZGVudGlmaWVyLlxuICAgICMgSWYgdWlkIGlzIHVuZGVmaW5lZCwgYSBuZXcgdWlkIHdpbGwgYmUgY3JlYXRlZCBiZWZvcmUgYXQgdGhlIGVuZCBvZiB0aGUgZXhlY3V0aW9uIHNlcXVlbmNlXG4gICAgI1xuICAgIGNvbnN0cnVjdG9yOiAoY3VzdG9tX3R5cGUsIHVpZCwgY29udGVudCwgY29udGVudF9vcGVyYXRpb25zKS0+XG4gICAgICBpZiBjdXN0b21fdHlwZT9cbiAgICAgICAgQGN1c3RvbV90eXBlID0gY3VzdG9tX3R5cGVcbiAgICAgIEBpc19kZWxldGVkID0gZmFsc2VcbiAgICAgIEBnYXJiYWdlX2NvbGxlY3RlZCA9IGZhbHNlXG4gICAgICBAZXZlbnRfbGlzdGVuZXJzID0gW10gIyBUT0RPOiByZW5hbWUgdG8gb2JzZXJ2ZXJzIG9yIHN0aCBsaWtlIHRoYXRcbiAgICAgIGlmIHVpZD9cbiAgICAgICAgQHVpZCA9IHVpZFxuXG4gICAgICAjIHNlZSBlbmNvZGUgdG8gc2VlLCB3aHkgd2UgYXJlIGRvaW5nIGl0IHRoaXMgd2F5XG4gICAgICBpZiBjb250ZW50IGlzIHVuZGVmaW5lZFxuICAgICAgICAjIG5vcFxuICAgICAgZWxzZSBpZiBjb250ZW50PyBhbmQgY29udGVudC5jcmVhdG9yP1xuICAgICAgICBAc2F2ZU9wZXJhdGlvbiAnY29udGVudCcsIGNvbnRlbnRcbiAgICAgIGVsc2VcbiAgICAgICAgQGNvbnRlbnQgPSBjb250ZW50XG4gICAgICBpZiBjb250ZW50X29wZXJhdGlvbnM/XG4gICAgICAgIEBjb250ZW50X29wZXJhdGlvbnMgPSB7fVxuICAgICAgICBmb3IgbmFtZSwgb3Agb2YgY29udGVudF9vcGVyYXRpb25zXG4gICAgICAgICAgQHNhdmVPcGVyYXRpb24gbmFtZSwgb3AsICdjb250ZW50X29wZXJhdGlvbnMnXG5cbiAgICB0eXBlOiBcIk9wZXJhdGlvblwiXG5cbiAgICBnZXRDb250ZW50OiAobmFtZSktPlxuICAgICAgaWYgQGNvbnRlbnQ/XG4gICAgICAgIGlmIEBjb250ZW50LmdldEN1c3RvbVR5cGU/XG4gICAgICAgICAgQGNvbnRlbnQuZ2V0Q3VzdG9tVHlwZSgpXG4gICAgICAgIGVsc2UgaWYgQGNvbnRlbnQuY29uc3RydWN0b3IgaXMgT2JqZWN0XG4gICAgICAgICAgaWYgbmFtZT9cbiAgICAgICAgICAgIGlmIEBjb250ZW50W25hbWVdP1xuICAgICAgICAgICAgICBAY29udGVudFtuYW1lXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBAY29udGVudF9vcGVyYXRpb25zW25hbWVdLmdldEN1c3RvbVR5cGUoKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbnRlbnQgPSB7fVxuICAgICAgICAgICAgZm9yIG4sdiBvZiBAY29udGVudFxuICAgICAgICAgICAgICBjb250ZW50W25dID0gdlxuICAgICAgICAgICAgaWYgQGNvbnRlbnRfb3BlcmF0aW9ucz9cbiAgICAgICAgICAgICAgZm9yIG4sdiBvZiBAY29udGVudF9vcGVyYXRpb25zXG4gICAgICAgICAgICAgICAgdiA9IHYuZ2V0Q3VzdG9tVHlwZSgpXG4gICAgICAgICAgICAgICAgY29udGVudFtuXSA9IHZcbiAgICAgICAgICAgIGNvbnRlbnRcbiAgICAgICAgZWxzZVxuICAgICAgICAgIEBjb250ZW50XG4gICAgICBlbHNlXG4gICAgICAgIEBjb250ZW50XG5cbiAgICByZXRyaWV2ZVN1YjogKCktPlxuICAgICAgdGhyb3cgbmV3IEVycm9yIFwic3ViIHByb3BlcnRpZXMgYXJlIG5vdCBlbmFibGUgb24gdGhpcyBvcGVyYXRpb24gdHlwZSFcIlxuXG4gICAgI1xuICAgICMgQWRkIGFuIGV2ZW50IGxpc3RlbmVyLiBJdCBkZXBlbmRzIG9uIHRoZSBvcGVyYXRpb24gd2hpY2ggZXZlbnRzIGFyZSBzdXBwb3J0ZWQuXG4gICAgIyBAcGFyYW0ge0Z1bmN0aW9ufSBmIGYgaXMgZXhlY3V0ZWQgaW4gY2FzZSB0aGUgZXZlbnQgZmlyZXMuXG4gICAgI1xuICAgIG9ic2VydmU6IChmKS0+XG4gICAgICBAZXZlbnRfbGlzdGVuZXJzLnB1c2ggZlxuXG4gICAgI1xuICAgICMgRGVsZXRlcyBmdW5jdGlvbiBmcm9tIHRoZSBvYnNlcnZlciBsaXN0XG4gICAgIyBAc2VlIE9wZXJhdGlvbi5vYnNlcnZlXG4gICAgI1xuICAgICMgQG92ZXJsb2FkIHVub2JzZXJ2ZShldmVudCwgZilcbiAgICAjICAgQHBhcmFtIGYgICAgIHtGdW5jdGlvbn0gVGhlIGZ1bmN0aW9uIHRoYXQgeW91IHdhbnQgdG8gZGVsZXRlXG4gICAgdW5vYnNlcnZlOiAoZiktPlxuICAgICAgQGV2ZW50X2xpc3RlbmVycyA9IEBldmVudF9saXN0ZW5lcnMuZmlsdGVyIChnKS0+XG4gICAgICAgIGYgaXNudCBnXG5cbiAgICAjXG4gICAgIyBEZWxldGVzIGFsbCBzdWJzY3JpYmVkIGV2ZW50IGxpc3RlbmVycy5cbiAgICAjIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCwgZS5nLiBhZnRlciB0aGlzIGhhcyBiZWVuIHJlcGxhY2VkLlxuICAgICMgKFRoZW4gb25seSBvbmUgcmVwbGFjZSBldmVudCBzaG91bGQgZmlyZS4gKVxuICAgICMgVGhpcyBpcyBhbHNvIGNhbGxlZCBpbiB0aGUgY2xlYW51cCBtZXRob2QuXG4gICAgZGVsZXRlQWxsT2JzZXJ2ZXJzOiAoKS0+XG4gICAgICBAZXZlbnRfbGlzdGVuZXJzID0gW11cblxuICAgIGRlbGV0ZTogKCktPlxuICAgICAgKG5ldyBvcHMuRGVsZXRlIHVuZGVmaW5lZCwgQCkuZXhlY3V0ZSgpXG4gICAgICBudWxsXG5cbiAgICAjXG4gICAgIyBGaXJlIGFuIGV2ZW50LlxuICAgICMgVE9ETzogRG8gc29tZXRoaW5nIHdpdGggdGltZW91dHMuIFlvdSBkb24ndCB3YW50IHRoaXMgdG8gZmlyZSBmb3IgZXZlcnkgb3BlcmF0aW9uIChlLmcuIGluc2VydCkuXG4gICAgIyBUT0RPOiBkbyB5b3UgbmVlZCBjYWxsRXZlbnQrZm9yd2FyZEV2ZW50PyBPbmx5IG9uZSBzdWZmaWNlcyBwcm9iYWJseVxuICAgIGNhbGxFdmVudDogKCktPlxuICAgICAgaWYgQGN1c3RvbV90eXBlP1xuICAgICAgICBjYWxsb24gPSBAZ2V0Q3VzdG9tVHlwZSgpXG4gICAgICBlbHNlXG4gICAgICAgIGNhbGxvbiA9IEBcbiAgICAgIEBmb3J3YXJkRXZlbnQgY2FsbG9uLCBhcmd1bWVudHMuLi5cblxuICAgICNcbiAgICAjIEZpcmUgYW4gZXZlbnQgYW5kIHNwZWNpZnkgaW4gd2hpY2ggY29udGV4dCB0aGUgbGlzdGVuZXIgaXMgY2FsbGVkIChzZXQgJ3RoaXMnKS5cbiAgICAjIFRPRE86IGRvIHlvdSBuZWVkIHRoaXMgP1xuICAgIGZvcndhcmRFdmVudDogKG9wLCBhcmdzLi4uKS0+XG4gICAgICBmb3IgZiBpbiBAZXZlbnRfbGlzdGVuZXJzXG4gICAgICAgIGYuY2FsbCBvcCwgYXJncy4uLlxuXG4gICAgaXNEZWxldGVkOiAoKS0+XG4gICAgICBAaXNfZGVsZXRlZFxuXG4gICAgYXBwbHlEZWxldGU6IChnYXJiYWdlY29sbGVjdCA9IHRydWUpLT5cbiAgICAgIGlmIG5vdCBAZ2FyYmFnZV9jb2xsZWN0ZWRcbiAgICAgICAgI2NvbnNvbGUubG9nIFwiYXBwbHlEZWxldGU6ICN7QHR5cGV9XCJcbiAgICAgICAgQGlzX2RlbGV0ZWQgPSB0cnVlXG4gICAgICAgIGlmIGdhcmJhZ2Vjb2xsZWN0XG4gICAgICAgICAgQGdhcmJhZ2VfY29sbGVjdGVkID0gdHJ1ZVxuICAgICAgICAgIEBIQi5hZGRUb0dhcmJhZ2VDb2xsZWN0b3IgQFxuXG4gICAgY2xlYW51cDogKCktPlxuICAgICAgI2NvbnNvbGUubG9nIFwiY2xlYW51cDogI3tAdHlwZX1cIlxuICAgICAgQEhCLnJlbW92ZU9wZXJhdGlvbiBAXG4gICAgICBAZGVsZXRlQWxsT2JzZXJ2ZXJzKClcblxuICAgICNcbiAgICAjIFNldCB0aGUgcGFyZW50IG9mIHRoaXMgb3BlcmF0aW9uLlxuICAgICNcbiAgICBzZXRQYXJlbnQ6IChAcGFyZW50KS0+XG5cbiAgICAjXG4gICAgIyBHZXQgdGhlIHBhcmVudCBvZiB0aGlzIG9wZXJhdGlvbi5cbiAgICAjXG4gICAgZ2V0UGFyZW50OiAoKS0+XG4gICAgICBAcGFyZW50XG5cbiAgICAjXG4gICAgIyBDb21wdXRlcyBhIHVuaXF1ZSBpZGVudGlmaWVyICh1aWQpIHRoYXQgaWRlbnRpZmllcyB0aGlzIG9wZXJhdGlvbi5cbiAgICAjXG4gICAgZ2V0VWlkOiAoKS0+XG4gICAgICBpZiBub3QgQHVpZC5ub09wZXJhdGlvbj9cbiAgICAgICAgQHVpZFxuICAgICAgZWxzZVxuICAgICAgICBpZiBAdWlkLmFsdD8gIyBjb3VsZCBiZSAoc2FmZWx5KSB1bmRlZmluZWRcbiAgICAgICAgICBtYXBfdWlkID0gQHVpZC5hbHQuY2xvbmVVaWQoKVxuICAgICAgICAgIG1hcF91aWQuc3ViID0gQHVpZC5zdWJcbiAgICAgICAgICBtYXBfdWlkXG4gICAgICAgIGVsc2VcbiAgICAgICAgICB1bmRlZmluZWRcblxuICAgIGNsb25lVWlkOiAoKS0+XG4gICAgICB1aWQgPSB7fVxuICAgICAgZm9yIG4sdiBvZiBAZ2V0VWlkKClcbiAgICAgICAgdWlkW25dID0gdlxuICAgICAgdWlkXG5cbiAgICAjXG4gICAgIyBAcHJpdmF0ZVxuICAgICMgSWYgbm90IGFscmVhZHkgZG9uZSwgc2V0IHRoZSB1aWRcbiAgICAjIEFkZCB0aGlzIHRvIHRoZSBIQlxuICAgICMgTm90aWZ5IHRoZSBhbGwgdGhlIGxpc3RlbmVycy5cbiAgICAjXG4gICAgZXhlY3V0ZTogKCktPlxuICAgICAgaWYgQHZhbGlkYXRlU2F2ZWRPcGVyYXRpb25zKClcbiAgICAgICAgQGlzX2V4ZWN1dGVkID0gdHJ1ZVxuICAgICAgICBpZiBub3QgQHVpZD9cbiAgICAgICAgICAjIFdoZW4gdGhpcyBvcGVyYXRpb24gd2FzIGNyZWF0ZWQgd2l0aG91dCBhIHVpZCwgdGhlbiBzZXQgaXQgaGVyZS5cbiAgICAgICAgICAjIFRoZXJlIGlzIG9ubHkgb25lIG90aGVyIHBsYWNlLCB3aGVyZSB0aGlzIGNhbiBiZSBkb25lIC0gYmVmb3JlIGFuIEluc2VydGlvblxuICAgICAgICAgICMgaXMgZXhlY3V0ZWQgKGJlY2F1c2Ugd2UgbmVlZCB0aGUgY3JlYXRvcl9pZClcbiAgICAgICAgICBAdWlkID0gQEhCLmdldE5leHRPcGVyYXRpb25JZGVudGlmaWVyKClcbiAgICAgICAgaWYgbm90IEB1aWQubm9PcGVyYXRpb24/XG4gICAgICAgICAgQEhCLmFkZE9wZXJhdGlvbiBAXG4gICAgICAgICAgZm9yIGwgaW4gZXhlY3V0aW9uX2xpc3RlbmVyXG4gICAgICAgICAgICBsIEBfZW5jb2RlKClcbiAgICAgICAgQFxuICAgICAgZWxzZVxuICAgICAgICBmYWxzZVxuXG4gICAgI1xuICAgICMgQHByaXZhdGVcbiAgICAjIE9wZXJhdGlvbnMgbWF5IGRlcGVuZCBvbiBvdGhlciBvcGVyYXRpb25zIChsaW5rZWQgbGlzdHMsIGV0Yy4pLlxuICAgICMgVGhlIHNhdmVPcGVyYXRpb24gYW5kIHZhbGlkYXRlU2F2ZWRPcGVyYXRpb25zIG1ldGhvZHMgcHJvdmlkZVxuICAgICMgYW4gZWFzeSB3YXkgdG8gcmVmZXIgdG8gdGhlc2Ugb3BlcmF0aW9ucyB2aWEgYW4gdWlkIG9yIG9iamVjdCByZWZlcmVuY2UuXG4gICAgI1xuICAgICMgRm9yIGV4YW1wbGU6IFdlIGNhbiBjcmVhdGUgYSBuZXcgRGVsZXRlIG9wZXJhdGlvbiB0aGF0IGRlbGV0ZXMgdGhlIG9wZXJhdGlvbiAkbyBsaWtlIHRoaXNcbiAgICAjICAgICAtIHZhciBkID0gbmV3IERlbGV0ZSh1aWQsICRvKTsgICBvclxuICAgICMgICAgIC0gdmFyIGQgPSBuZXcgRGVsZXRlKHVpZCwgJG8uZ2V0VWlkKCkpO1xuICAgICMgRWl0aGVyIHdheSB3ZSB3YW50IHRvIGFjY2VzcyAkbyB2aWEgZC5kZWxldGVzLiBJbiB0aGUgc2Vjb25kIGNhc2UgdmFsaWRhdGVTYXZlZE9wZXJhdGlvbnMgbXVzdCBiZSBjYWxsZWQgZmlyc3QuXG4gICAgI1xuICAgICMgQG92ZXJsb2FkIHNhdmVPcGVyYXRpb24obmFtZSwgb3BfdWlkKVxuICAgICMgICBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW9uLiBBZnRlciB2YWxpZGF0aW5nICh3aXRoIHZhbGlkYXRlU2F2ZWRPcGVyYXRpb25zKSB0aGUgaW5zdGFudGlhdGVkIG9wZXJhdGlvbiB3aWxsIGJlIGFjY2Vzc2libGUgdmlhIHRoaXNbbmFtZV0uXG4gICAgIyAgIEBwYXJhbSB7T2JqZWN0fSBvcF91aWQgQSB1aWQgdGhhdCByZWZlcnMgdG8gYW4gb3BlcmF0aW9uXG4gICAgIyBAb3ZlcmxvYWQgc2F2ZU9wZXJhdGlvbihuYW1lLCBvcClcbiAgICAjICAgQHBhcmFtIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbi4gQWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIG9wIGlzIGFjY2Vzc2libGUgdmlhIHRoaXNbbmFtZV0uXG4gICAgIyAgIEBwYXJhbSB7T3BlcmF0aW9ufSBvcCBBbiBPcGVyYXRpb24gb2JqZWN0XG4gICAgI1xuICAgIHNhdmVPcGVyYXRpb246IChuYW1lLCBvcCwgYmFzZSA9IFwidGhpc1wiKS0+XG4gICAgICBpZiBvcD8gYW5kIG9wLl9nZXRNb2RlbD9cbiAgICAgICAgb3AgPSBvcC5fZ2V0TW9kZWwoQGN1c3RvbV90eXBlcywgQG9wZXJhdGlvbnMpXG4gICAgICAjXG4gICAgICAjIEV2ZXJ5IGluc3RhbmNlIG9mICRPcGVyYXRpb24gbXVzdCBoYXZlIGFuICRleGVjdXRlIGZ1bmN0aW9uLlxuICAgICAgIyBXZSB1c2UgZHVjay10eXBpbmcgdG8gY2hlY2sgaWYgb3AgaXMgaW5zdGFudGlhdGVkIHNpbmNlIHRoZXJlXG4gICAgICAjIGNvdWxkIGV4aXN0IG11bHRpcGxlIGNsYXNzZXMgb2YgJE9wZXJhdGlvblxuICAgICAgI1xuICAgICAgaWYgbm90IG9wP1xuICAgICAgICAjIG5vcFxuICAgICAgZWxzZSBpZiBvcC5leGVjdXRlPyBvciBub3QgKG9wLm9wX251bWJlcj8gYW5kIG9wLmNyZWF0b3I/KVxuICAgICAgICAjIGlzIGluc3RhbnRpYXRlZCwgb3Igb3AgaXMgc3RyaW5nLiBDdXJyZW50bHkgXCJEZWxpbWl0ZXJcIiBpcyBzYXZlZCBhcyBzdHJpbmdcbiAgICAgICAgIyAoaW4gY29tYmluYXRpb24gd2l0aCBAcGFyZW50IHlvdSBjYW4gcmV0cmlldmUgdGhlIGRlbGltaXRlci4uKVxuICAgICAgICBpZiBiYXNlIGlzIFwidGhpc1wiXG4gICAgICAgICAgQFtuYW1lXSA9IG9wXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBkZXN0ID0gQFtiYXNlXVxuICAgICAgICAgIHBhdGhzID0gbmFtZS5zcGxpdChcIi9cIilcbiAgICAgICAgICBsYXN0X3BhdGggPSBwYXRocy5wb3AoKVxuICAgICAgICAgIGZvciBwYXRoIGluIHBhdGhzXG4gICAgICAgICAgICBkZXN0ID0gZGVzdFtwYXRoXVxuICAgICAgICAgIGRlc3RbbGFzdF9wYXRoXSA9IG9wXG4gICAgICBlbHNlXG4gICAgICAgICMgbm90IGluaXRpYWxpemVkLiBEbyBpdCB3aGVuIGNhbGxpbmcgJHZhbGlkYXRlU2F2ZWRPcGVyYXRpb25zKClcbiAgICAgICAgQHVuY2hlY2tlZCA/PSB7fVxuICAgICAgICBAdW5jaGVja2VkW2Jhc2VdID89IHt9XG4gICAgICAgIEB1bmNoZWNrZWRbYmFzZV1bbmFtZV0gPSBvcFxuXG4gICAgI1xuICAgICMgQHByaXZhdGVcbiAgICAjIEFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhbGwgbm90IGluc3RhbnRpYXRlZCBvcGVyYXRpb25zIHdpbGwgYmUgYWNjZXNzaWJsZS5cbiAgICAjIEBzZWUgT3BlcmF0aW9uLnNhdmVPcGVyYXRpb25cbiAgICAjXG4gICAgIyBAcmV0dXJuIFtCb29sZWFuXSBXaGV0aGVyIGl0IHdhcyBwb3NzaWJsZSB0byBpbnN0YW50aWF0ZSBhbGwgb3BlcmF0aW9ucy5cbiAgICAjXG4gICAgdmFsaWRhdGVTYXZlZE9wZXJhdGlvbnM6ICgpLT5cbiAgICAgIHVuaW5zdGFudGlhdGVkID0ge31cbiAgICAgIHN1Y2Nlc3MgPSB0cnVlXG4gICAgICBmb3IgYmFzZV9uYW1lLCBiYXNlIG9mIEB1bmNoZWNrZWRcbiAgICAgICAgZm9yIG5hbWUsIG9wX3VpZCBvZiBiYXNlXG4gICAgICAgICAgb3AgPSBASEIuZ2V0T3BlcmF0aW9uIG9wX3VpZFxuICAgICAgICAgIGlmIG9wXG4gICAgICAgICAgICBpZiBiYXNlX25hbWUgaXMgXCJ0aGlzXCJcbiAgICAgICAgICAgICAgQFtuYW1lXSA9IG9wXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGRlc3QgPSBAW2Jhc2VfbmFtZV1cbiAgICAgICAgICAgICAgcGF0aHMgPSBuYW1lLnNwbGl0KFwiL1wiKVxuICAgICAgICAgICAgICBsYXN0X3BhdGggPSBwYXRocy5wb3AoKVxuICAgICAgICAgICAgICBmb3IgcGF0aCBpbiBwYXRoc1xuICAgICAgICAgICAgICAgIGRlc3QgPSBkZXN0W3BhdGhdXG4gICAgICAgICAgICAgIGRlc3RbbGFzdF9wYXRoXSA9IG9wXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdW5pbnN0YW50aWF0ZWRbYmFzZV9uYW1lXSA/PSB7fVxuICAgICAgICAgICAgdW5pbnN0YW50aWF0ZWRbYmFzZV9uYW1lXVtuYW1lXSA9IG9wX3VpZFxuICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlXG4gICAgICBpZiBub3Qgc3VjY2Vzc1xuICAgICAgICBAdW5jaGVja2VkID0gdW5pbnN0YW50aWF0ZWRcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICBlbHNlXG4gICAgICAgIGRlbGV0ZSBAdW5jaGVja2VkXG4gICAgICAgIHJldHVybiBAXG5cbiAgICBnZXRDdXN0b21UeXBlOiAoKS0+XG4gICAgICBpZiBub3QgQGN1c3RvbV90eXBlP1xuICAgICAgICAjIHRocm93IG5ldyBFcnJvciBcIlRoaXMgb3BlcmF0aW9uIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBhIGN1c3RvbSB0eXBlXCJcbiAgICAgICAgQFxuICAgICAgZWxzZVxuICAgICAgICBpZiBAY3VzdG9tX3R5cGUuY29uc3RydWN0b3IgaXMgU3RyaW5nXG4gICAgICAgICAgIyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0IChvbmx5IHRoZSBuYW1lIGlzIHNwZWNpZmllZClcbiAgICAgICAgICBUeXBlID0gQGN1c3RvbV90eXBlc1xuICAgICAgICAgIGZvciB0IGluIEBjdXN0b21fdHlwZS5zcGxpdChcIi5cIilcbiAgICAgICAgICAgIFR5cGUgPSBUeXBlW3RdXG4gICAgICAgICAgQGN1c3RvbV90eXBlID0gbmV3IFR5cGUoKVxuICAgICAgICAgIEBjdXN0b21fdHlwZS5fc2V0TW9kZWwgQFxuICAgICAgICBAY3VzdG9tX3R5cGVcblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgIyBFbmNvZGUgdGhpcyBvcGVyYXRpb24gaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbiBiZSBwYXJzZWQgYnkgcmVtb3RlIHBlZXJzLlxuICAgICNcbiAgICBfZW5jb2RlOiAoanNvbiA9IHt9KS0+XG4gICAgICBqc29uLnR5cGUgPSBAdHlwZVxuICAgICAganNvbi51aWQgPSBAZ2V0VWlkKClcbiAgICAgIGlmIEBjdXN0b21fdHlwZT9cbiAgICAgICAgaWYgQGN1c3RvbV90eXBlLmNvbnN0cnVjdG9yIGlzIFN0cmluZ1xuICAgICAgICAgIGpzb24uY3VzdG9tX3R5cGUgPSBAY3VzdG9tX3R5cGVcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGpzb24uY3VzdG9tX3R5cGUgPSBAY3VzdG9tX3R5cGUuX25hbWVcblxuICAgICAgaWYgQGNvbnRlbnQ/LmdldFVpZD9cbiAgICAgICAganNvbi5jb250ZW50ID0gQGNvbnRlbnQuZ2V0VWlkKClcbiAgICAgIGVsc2VcbiAgICAgICAganNvbi5jb250ZW50ID0gQGNvbnRlbnRcbiAgICAgIGlmIEBjb250ZW50X29wZXJhdGlvbnM/XG4gICAgICAgIG9wZXJhdGlvbnMgPSB7fVxuICAgICAgICBmb3IgbixvIG9mIEBjb250ZW50X29wZXJhdGlvbnNcbiAgICAgICAgICBpZiBvLl9nZXRNb2RlbD9cbiAgICAgICAgICAgIG8gPSBvLl9nZXRNb2RlbChAY3VzdG9tX3R5cGVzLCBAb3BlcmF0aW9ucylcbiAgICAgICAgICBvcGVyYXRpb25zW25dID0gby5nZXRVaWQoKVxuICAgICAgICBqc29uLmNvbnRlbnRfb3BlcmF0aW9ucyA9IG9wZXJhdGlvbnNcbiAgICAgIGpzb25cblxuICAjXG4gICMgQG5vZG9jXG4gICMgQSBzaW1wbGUgRGVsZXRlLXR5cGUgb3BlcmF0aW9uIHRoYXQgZGVsZXRlcyBhbiBvcGVyYXRpb24uXG4gICNcbiAgY2xhc3Mgb3BzLkRlbGV0ZSBleHRlbmRzIG9wcy5PcGVyYXRpb25cblxuICAgICNcbiAgICAjIEBwYXJhbSB7T2JqZWN0fSB1aWQgQSB1bmlxdWUgaWRlbnRpZmllci4gSWYgdWlkIGlzIHVuZGVmaW5lZCwgYSBuZXcgdWlkIHdpbGwgYmUgY3JlYXRlZC5cbiAgICAjIEBwYXJhbSB7T2JqZWN0fSBkZWxldGVzIFVJRCBvciByZWZlcmVuY2Ugb2YgdGhlIG9wZXJhdGlvbiB0aGF0IHRoaXMgdG8gYmUgZGVsZXRlZC5cbiAgICAjXG4gICAgY29uc3RydWN0b3I6IChjdXN0b21fdHlwZSwgdWlkLCBkZWxldGVzKS0+XG4gICAgICBAc2F2ZU9wZXJhdGlvbiAnZGVsZXRlcycsIGRlbGV0ZXNcbiAgICAgIHN1cGVyIGN1c3RvbV90eXBlLCB1aWRcblxuICAgIHR5cGU6IFwiRGVsZXRlXCJcblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgIyBDb252ZXJ0IGFsbCByZWxldmFudCBpbmZvcm1hdGlvbiBvZiB0aGlzIG9wZXJhdGlvbiB0byB0aGUganNvbi1mb3JtYXQuXG4gICAgIyBUaGlzIHJlc3VsdCBjYW4gYmUgc2VudCB0byBvdGhlciBjbGllbnRzLlxuICAgICNcbiAgICBfZW5jb2RlOiAoKS0+XG4gICAgICB7XG4gICAgICAgICd0eXBlJzogXCJEZWxldGVcIlxuICAgICAgICAndWlkJzogQGdldFVpZCgpXG4gICAgICAgICdkZWxldGVzJzogQGRlbGV0ZXMuZ2V0VWlkKClcbiAgICAgIH1cblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgIyBBcHBseSB0aGUgZGVsZXRpb24uXG4gICAgI1xuICAgIGV4ZWN1dGU6ICgpLT5cbiAgICAgIGlmIEB2YWxpZGF0ZVNhdmVkT3BlcmF0aW9ucygpXG4gICAgICAgIHJlcyA9IHN1cGVyXG4gICAgICAgIGlmIHJlc1xuICAgICAgICAgIEBkZWxldGVzLmFwcGx5RGVsZXRlIEBcbiAgICAgICAgcmVzXG4gICAgICBlbHNlXG4gICAgICAgIGZhbHNlXG5cbiAgI1xuICAjIERlZmluZSBob3cgdG8gcGFyc2UgRGVsZXRlIG9wZXJhdGlvbnMuXG4gICNcbiAgb3BzLkRlbGV0ZS5wYXJzZSA9IChvKS0+XG4gICAge1xuICAgICAgJ3VpZCcgOiB1aWRcbiAgICAgICdkZWxldGVzJzogZGVsZXRlc191aWRcbiAgICB9ID0gb1xuICAgIG5ldyB0aGlzKG51bGwsIHVpZCwgZGVsZXRlc191aWQpXG5cbiAgI1xuICAjIEBub2RvY1xuICAjIEEgc2ltcGxlIGluc2VydC10eXBlIG9wZXJhdGlvbi5cbiAgI1xuICAjIEFuIGluc2VydCBvcGVyYXRpb24gaXMgYWx3YXlzIHBvc2l0aW9uZWQgYmV0d2VlbiB0d28gb3RoZXIgaW5zZXJ0IG9wZXJhdGlvbnMuXG4gICMgSW50ZXJuYWxseSB0aGlzIGlzIHJlYWxpemVkIGFzIGFzc29jaWF0aXZlIGxpc3RzLCB3aGVyZWJ5IGVhY2ggaW5zZXJ0IG9wZXJhdGlvbiBoYXMgYSBwcmVkZWNlc3NvciBhbmQgYSBzdWNjZXNzb3IuXG4gICMgRm9yIHRoZSBzYWtlIG9mIGVmZmljaWVuY3kgd2UgbWFpbnRhaW4gdHdvIGxpc3RzOlxuICAjICAgLSBUaGUgc2hvcnQtbGlzdCAoYWJicmV2LiBzbCkgbWFpbnRhaW5zIG9ubHkgdGhlIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IGRlbGV0ZWQgKHVuaW1wbGVtZW50ZWQsIGdvb2QgaWRlYT8pXG4gICMgICAtIFRoZSBjb21wbGV0ZS1saXN0IChhYmJyZXYuIGNsKSBtYWludGFpbnMgYWxsIG9wZXJhdGlvbnNcbiAgI1xuICBjbGFzcyBvcHMuSW5zZXJ0IGV4dGVuZHMgb3BzLk9wZXJhdGlvblxuXG4gICAgI1xuICAgICMgQHBhcmFtIHtPYmplY3R9IHVpZCBBIHVuaXF1ZSBpZGVudGlmaWVyLiBJZiB1aWQgaXMgdW5kZWZpbmVkLCBhIG5ldyB1aWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgICMgQHBhcmFtIHtPcGVyYXRpb259IHByZXZfY2wgVGhlIHByZWRlY2Vzc29yIG9mIHRoaXMgb3BlcmF0aW9uIGluIHRoZSBjb21wbGV0ZS1saXN0IChjbClcbiAgICAjIEBwYXJhbSB7T3BlcmF0aW9ufSBuZXh0X2NsIFRoZSBzdWNjZXNzb3Igb2YgdGhpcyBvcGVyYXRpb24gaW4gdGhlIGNvbXBsZXRlLWxpc3QgKGNsKVxuICAgICNcbiAgICBjb25zdHJ1Y3RvcjogKGN1c3RvbV90eXBlLCBjb250ZW50LCBjb250ZW50X29wZXJhdGlvbnMsIHBhcmVudCwgdWlkLCBwcmV2X2NsLCBuZXh0X2NsLCBvcmlnaW4pLT5cbiAgICAgIEBzYXZlT3BlcmF0aW9uICdwYXJlbnQnLCBwYXJlbnRcbiAgICAgIEBzYXZlT3BlcmF0aW9uICdwcmV2X2NsJywgcHJldl9jbFxuICAgICAgQHNhdmVPcGVyYXRpb24gJ25leHRfY2wnLCBuZXh0X2NsXG4gICAgICBpZiBvcmlnaW4/XG4gICAgICAgIEBzYXZlT3BlcmF0aW9uICdvcmlnaW4nLCBvcmlnaW5cbiAgICAgIGVsc2VcbiAgICAgICAgQHNhdmVPcGVyYXRpb24gJ29yaWdpbicsIHByZXZfY2xcbiAgICAgIHN1cGVyIGN1c3RvbV90eXBlLCB1aWQsIGNvbnRlbnQsIGNvbnRlbnRfb3BlcmF0aW9uc1xuXG4gICAgdHlwZTogXCJJbnNlcnRcIlxuXG4gICAgdmFsOiAoKS0+XG4gICAgICBAZ2V0Q29udGVudCgpXG5cbiAgICBnZXROZXh0OiAoaT0xKS0+XG4gICAgICBuID0gQFxuICAgICAgd2hpbGUgaSA+IDAgYW5kIG4ubmV4dF9jbD9cbiAgICAgICAgbiA9IG4ubmV4dF9jbFxuICAgICAgICBpZiBub3Qgbi5pc19kZWxldGVkXG4gICAgICAgICAgaS0tXG4gICAgICBpZiBuLmlzX2RlbGV0ZWRcbiAgICAgICAgbnVsbFxuICAgICAgblxuXG4gICAgZ2V0UHJldjogKGk9MSktPlxuICAgICAgbiA9IEBcbiAgICAgIHdoaWxlIGkgPiAwIGFuZCBuLnByZXZfY2w/XG4gICAgICAgIG4gPSBuLnByZXZfY2xcbiAgICAgICAgaWYgbm90IG4uaXNfZGVsZXRlZFxuICAgICAgICAgIGktLVxuICAgICAgaWYgbi5pc19kZWxldGVkXG4gICAgICAgIG51bGxcbiAgICAgIGVsc2VcbiAgICAgICAgblxuXG4gICAgI1xuICAgICMgc2V0IGNvbnRlbnQgdG8gbnVsbCBhbmQgb3RoZXIgc3R1ZmZcbiAgICAjIEBwcml2YXRlXG4gICAgI1xuICAgIGFwcGx5RGVsZXRlOiAobyktPlxuICAgICAgQGRlbGV0ZWRfYnkgPz0gW11cbiAgICAgIGNhbGxMYXRlciA9IGZhbHNlXG4gICAgICBpZiBAcGFyZW50PyBhbmQgbm90IEBpc19kZWxldGVkIGFuZCBvPyAjIG8/IDogaWYgbm90IG8/LCB0aGVuIHRoZSBkZWxpbWl0ZXIgZGVsZXRlZCB0aGlzIEluc2VydGlvbi4gRnVydGhlcm1vcmUsIGl0IHdvdWxkIGJlIHdyb25nIHRvIGNhbGwgaXQuIFRPRE86IG1ha2UgdGhpcyBtb3JlIGV4cHJlc3NpdmUgYW5kIHNhdmVcbiAgICAgICAgIyBjYWxsIGlmZiB3YXNuJ3QgZGVsZXRlZCBlYXJseWVyXG4gICAgICAgIGNhbGxMYXRlciA9IHRydWVcbiAgICAgIGlmIG8/XG4gICAgICAgIEBkZWxldGVkX2J5LnB1c2ggb1xuICAgICAgZ2FyYmFnZWNvbGxlY3QgPSBmYWxzZVxuICAgICAgaWYgQG5leHRfY2wuaXNEZWxldGVkKClcbiAgICAgICAgZ2FyYmFnZWNvbGxlY3QgPSB0cnVlXG4gICAgICBzdXBlciBnYXJiYWdlY29sbGVjdFxuICAgICAgaWYgY2FsbExhdGVyXG4gICAgICAgIEBwYXJlbnQuY2FsbE9wZXJhdGlvblNwZWNpZmljRGVsZXRlRXZlbnRzKHRoaXMsIG8pXG4gICAgICBpZiBAcHJldl9jbD8gYW5kIEBwcmV2X2NsLmlzRGVsZXRlZCgpIGFuZCBAcHJldl9jbC5nYXJiYWdlX2NvbGxlY3RlZCBpc250IHRydWVcbiAgICAgICAgIyBnYXJiYWdlIGNvbGxlY3QgcHJldl9jbFxuICAgICAgICBAcHJldl9jbC5hcHBseURlbGV0ZSgpXG5cbiAgICBjbGVhbnVwOiAoKS0+XG4gICAgICBpZiBAbmV4dF9jbC5pc0RlbGV0ZWQoKVxuICAgICAgICAjIGRlbGV0ZSBhbGwgb3BzIHRoYXQgZGVsZXRlIHRoaXMgaW5zZXJ0aW9uXG4gICAgICAgIGZvciBkIGluIEBkZWxldGVkX2J5XG4gICAgICAgICAgZC5jbGVhbnVwKClcblxuICAgICAgICAjIHRocm93IG5ldyBFcnJvciBcInJpZ2h0IGlzIG5vdCBkZWxldGVkLiBpbmNvbnNpc3RlbmN5ISwgd3JhcmFyYXJcIlxuICAgICAgICAjIGNoYW5nZSBvcmlnaW4gcmVmZXJlbmNlcyB0byB0aGUgcmlnaHRcbiAgICAgICAgbyA9IEBuZXh0X2NsXG4gICAgICAgIHdoaWxlIG8udHlwZSBpc250IFwiRGVsaW1pdGVyXCJcbiAgICAgICAgICBpZiBvLm9yaWdpbiBpcyBAXG4gICAgICAgICAgICBvLm9yaWdpbiA9IEBwcmV2X2NsXG4gICAgICAgICAgbyA9IG8ubmV4dF9jbFxuICAgICAgICAjIHJlY29ubmVjdCBsZWZ0L3JpZ2h0XG4gICAgICAgIEBwcmV2X2NsLm5leHRfY2wgPSBAbmV4dF9jbFxuICAgICAgICBAbmV4dF9jbC5wcmV2X2NsID0gQHByZXZfY2xcblxuICAgICAgICAjIGRlbGV0ZSBjb250ZW50XG4gICAgICAgICMgLSB3ZSBtdXN0IG5vdCBkbyB0aGlzIGluIGFwcGx5RGVsZXRlLCBiZWNhdXNlIHRoaXMgd291bGQgbGVhZCB0byBpbmNvbnNpc3RlbmNpZXNcbiAgICAgICAgIyAoZS5nLiB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbiBvcmRlciBtdXN0IGJlIGludmVydGlibGUgOlxuICAgICAgICAjICAgSW5zZXJ0IHJlZmVycyB0byBjb250ZW50LCB0aGVuIHRoZSBjb250ZW50IGlzIGRlbGV0ZWQpXG4gICAgICAgICMgVGhlcmVmb3JlLCB3ZSBoYXZlIHRvIGRvIHRoaXMgaW4gdGhlIGNsZWFudXBcbiAgICAgICAgIyAqIE5PREU6IFdlIG5ldmVyIGRlbGV0ZSBJbnNlcnRpb25zIVxuICAgICAgICBpZiBAY29udGVudCBpbnN0YW5jZW9mIG9wcy5PcGVyYXRpb24gYW5kIG5vdCAoQGNvbnRlbnQgaW5zdGFuY2VvZiBvcHMuSW5zZXJ0KVxuICAgICAgICAgIEBjb250ZW50LnJlZmVyZW5jZWRfYnktLVxuICAgICAgICAgIGlmIEBjb250ZW50LnJlZmVyZW5jZWRfYnkgPD0gMCBhbmQgbm90IEBjb250ZW50LmlzX2RlbGV0ZWRcbiAgICAgICAgICAgIEBjb250ZW50LmFwcGx5RGVsZXRlKClcbiAgICAgICAgZGVsZXRlIEBjb250ZW50XG4gICAgICAgIHN1cGVyXG4gICAgICAjIGVsc2VcbiAgICAgICMgICBTb21lb25lIGluc2VydGVkIHNvbWV0aGluZyBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICAjICAgUmVtZW1iZXI6IHRoaXMgY2FuIG9ubHkgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgd2hlbiBuZXh0X2NsIGlzIGRlbGV0ZWRcblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgIyBUaGUgYW1vdW50IG9mIHBvc2l0aW9ucyB0aGF0ICR0aGlzIG9wZXJhdGlvbiB3YXMgbW92ZWQgdG8gdGhlIHJpZ2h0LlxuICAgICNcbiAgICBnZXREaXN0YW5jZVRvT3JpZ2luOiAoKS0+XG4gICAgICBkID0gMFxuICAgICAgbyA9IEBwcmV2X2NsXG4gICAgICB3aGlsZSB0cnVlXG4gICAgICAgIGlmIEBvcmlnaW4gaXMgb1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGQrK1xuICAgICAgICBvID0gby5wcmV2X2NsXG4gICAgICBkXG5cbiAgICAjXG4gICAgIyBAcHJpdmF0ZVxuICAgICMgSW5jbHVkZSB0aGlzIG9wZXJhdGlvbiBpbiB0aGUgYXNzb2NpYXRpdmUgbGlzdHMuXG4gICAgZXhlY3V0ZTogKCktPlxuICAgICAgaWYgbm90IEB2YWxpZGF0ZVNhdmVkT3BlcmF0aW9ucygpXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgZWxzZVxuICAgICAgICBpZiBAY29udGVudCBpbnN0YW5jZW9mIG9wcy5PcGVyYXRpb25cbiAgICAgICAgICBAY29udGVudC5pbnNlcnRfcGFyZW50ID0gQCAjIFRPRE86IHRoaXMgaXMgcHJvYmFibHkgbm90IG5lY2Vzc2FyeSBhbmQgb25seSBuaWNlIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgICBAY29udGVudC5yZWZlcmVuY2VkX2J5ID89IDBcbiAgICAgICAgICBAY29udGVudC5yZWZlcmVuY2VkX2J5KytcbiAgICAgICAgaWYgQHBhcmVudD9cbiAgICAgICAgICBpZiBub3QgQHByZXZfY2w/XG4gICAgICAgICAgICBAcHJldl9jbCA9IEBwYXJlbnQuYmVnaW5uaW5nXG4gICAgICAgICAgaWYgbm90IEBvcmlnaW4/XG4gICAgICAgICAgICBAb3JpZ2luID0gQHByZXZfY2xcbiAgICAgICAgICBlbHNlIGlmIEBvcmlnaW4gaXMgXCJEZWxpbWl0ZXJcIlxuICAgICAgICAgICAgQG9yaWdpbiA9IEBwYXJlbnQuYmVnaW5uaW5nXG4gICAgICAgICAgaWYgbm90IEBuZXh0X2NsP1xuICAgICAgICAgICAgQG5leHRfY2wgPSBAcGFyZW50LmVuZFxuICAgICAgICBpZiBAcHJldl9jbD9cbiAgICAgICAgICBkaXN0YW5jZV90b19vcmlnaW4gPSBAZ2V0RGlzdGFuY2VUb09yaWdpbigpICMgbW9zdCBjYXNlczogMFxuICAgICAgICAgIG8gPSBAcHJldl9jbC5uZXh0X2NsXG4gICAgICAgICAgaSA9IGRpc3RhbmNlX3RvX29yaWdpbiAjIGxvb3AgY291bnRlclxuXG4gICAgICAgICAgIyAkdGhpcyBoYXMgdG8gZmluZCBhIHVuaXF1ZSBwb3NpdGlvbiBiZXR3ZWVuIG9yaWdpbiBhbmQgdGhlIG5leHQga25vd24gY2hhcmFjdGVyXG4gICAgICAgICAgIyBjYXNlIDE6ICRvcmlnaW4gZXF1YWxzICRvLm9yaWdpbjogdGhlICRjcmVhdG9yIHBhcmFtZXRlciBkZWNpZGVzIGlmIGxlZnQgb3IgcmlnaHRcbiAgICAgICAgICAjICAgICAgICAgbGV0ICRPTD0gW28xLG8yLG8zLG80XSwgd2hlcmVieSAkdGhpcyBpcyB0byBiZSBpbnNlcnRlZCBiZXR3ZWVuIG8xIGFuZCBvNFxuICAgICAgICAgICMgICAgICAgICBvMixvMyBhbmQgbzQgb3JpZ2luIGlzIDEgKHRoZSBwb3NpdGlvbiBvZiBvMilcbiAgICAgICAgICAjICAgICAgICAgdGhlcmUgaXMgdGhlIGNhc2UgdGhhdCAkdGhpcy5jcmVhdG9yIDwgbzIuY3JlYXRvciwgYnV0IG8zLmNyZWF0b3IgPCAkdGhpcy5jcmVhdG9yXG4gICAgICAgICAgIyAgICAgICAgIHRoZW4gbzIga25vd3MgbzMuIFNpbmNlIG9uIGFub3RoZXIgY2xpZW50ICRPTCBjb3VsZCBiZSBbbzEsbzMsbzRdIHRoZSBwcm9ibGVtIGlzIGNvbXBsZXhcbiAgICAgICAgICAjICAgICAgICAgdGhlcmVmb3JlICR0aGlzIHdvdWxkIGJlIGFsd2F5cyB0byB0aGUgcmlnaHQgb2YgbzNcbiAgICAgICAgICAjIGNhc2UgMjogJG9yaWdpbiA8ICRvLm9yaWdpblxuICAgICAgICAgICMgICAgICAgICBpZiBjdXJyZW50ICR0aGlzIGluc2VydF9wb3NpdGlvbiA+ICRvIG9yaWdpbjogJHRoaXMgaW5zXG4gICAgICAgICAgIyAgICAgICAgIGVsc2UgJGluc2VydF9wb3NpdGlvbiB3aWxsIG5vdCBjaGFuZ2VcbiAgICAgICAgICAjICAgICAgICAgKG1heWJlIHdlIGVuY291bnRlciBjYXNlIDEgbGF0ZXIsIHRoZW4gdGhpcyB3aWxsIGJlIHRvIHRoZSByaWdodCBvZiAkbylcbiAgICAgICAgICAjIGNhc2UgMzogJG9yaWdpbiA+ICRvLm9yaWdpblxuICAgICAgICAgICMgICAgICAgICAkdGhpcyBpbnNlcnRfcG9zaXRpb24gaXMgdG8gdGhlIGxlZnQgb2YgJG8gKGZvcmV2ZXIhKVxuICAgICAgICAgIHdoaWxlIHRydWVcbiAgICAgICAgICAgIGlmIG8gaXNudCBAbmV4dF9jbFxuICAgICAgICAgICAgICBvRGlzdGFuY2UgPSBvLmdldERpc3RhbmNlVG9PcmlnaW4oKVxuICAgICAgICAgICAgICAjICRvIGhhcHBlbmVkIGNvbmN1cnJlbnRseVxuICAgICAgICAgICAgICBpZiBvRGlzdGFuY2UgaXMgaVxuICAgICAgICAgICAgICAgICMgY2FzZSAxXG4gICAgICAgICAgICAgICAgaWYgby51aWQuY3JlYXRvciA8IEB1aWQuY3JlYXRvclxuICAgICAgICAgICAgICAgICAgQHByZXZfY2wgPSBvXG4gICAgICAgICAgICAgICAgICBkaXN0YW5jZV90b19vcmlnaW4gPSBpICsgMVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICMgbm9wXG4gICAgICAgICAgICAgIGVsc2UgaWYgb0Rpc3RhbmNlIDwgaVxuICAgICAgICAgICAgICAgICMgY2FzZSAyXG4gICAgICAgICAgICAgICAgaWYgaSAtIGRpc3RhbmNlX3RvX29yaWdpbiA8PSBvRGlzdGFuY2VcbiAgICAgICAgICAgICAgICAgIEBwcmV2X2NsID0gb1xuICAgICAgICAgICAgICAgICAgZGlzdGFuY2VfdG9fb3JpZ2luID0gaSArIDFcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAjbm9wXG4gICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAjIGNhc2UgM1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgICBvID0gby5uZXh0X2NsXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICMgJHRoaXMga25vd3MgdGhhdCAkbyBleGlzdHMsXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgIyBub3cgcmVjb25uZWN0IGV2ZXJ5dGhpbmdcbiAgICAgICAgICBAbmV4dF9jbCA9IEBwcmV2X2NsLm5leHRfY2xcbiAgICAgICAgICBAcHJldl9jbC5uZXh0X2NsID0gQFxuICAgICAgICAgIEBuZXh0X2NsLnByZXZfY2wgPSBAXG5cbiAgICAgICAgQHNldFBhcmVudCBAcHJldl9jbC5nZXRQYXJlbnQoKSAjIGRvIEluc2VydGlvbnMgYWx3YXlzIGhhdmUgYSBwYXJlbnQ/XG4gICAgICAgIHN1cGVyICMgbm90aWZ5IHRoZSBleGVjdXRpb25fbGlzdGVuZXJzXG4gICAgICAgIEBwYXJlbnQuY2FsbE9wZXJhdGlvblNwZWNpZmljSW5zZXJ0RXZlbnRzKHRoaXMpXG4gICAgICAgIEBcblxuICAgICNcbiAgICAjIENvbXB1dGUgdGhlIHBvc2l0aW9uIG9mIHRoaXMgb3BlcmF0aW9uLlxuICAgICNcbiAgICBnZXRQb3NpdGlvbjogKCktPlxuICAgICAgcG9zaXRpb24gPSAwXG4gICAgICBwcmV2ID0gQHByZXZfY2xcbiAgICAgIHdoaWxlIHRydWVcbiAgICAgICAgaWYgcHJldiBpbnN0YW5jZW9mIG9wcy5EZWxpbWl0ZXJcbiAgICAgICAgICBicmVha1xuICAgICAgICBpZiBub3QgcHJldi5pc0RlbGV0ZWQoKVxuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgcHJldiA9IHByZXYucHJldl9jbFxuICAgICAgcG9zaXRpb25cblxuICAgICNcbiAgICAjIENvbnZlcnQgYWxsIHJlbGV2YW50IGluZm9ybWF0aW9uIG9mIHRoaXMgb3BlcmF0aW9uIHRvIHRoZSBqc29uLWZvcm1hdC5cbiAgICAjIFRoaXMgcmVzdWx0IGNhbiBiZSBzZW5kIHRvIG90aGVyIGNsaWVudHMuXG4gICAgI1xuICAgIF9lbmNvZGU6IChqc29uID0ge30pLT5cbiAgICAgIGpzb24ucHJldiA9IEBwcmV2X2NsLmdldFVpZCgpXG4gICAgICBqc29uLm5leHQgPSBAbmV4dF9jbC5nZXRVaWQoKVxuXG4gICAgICBpZiBAb3JpZ2luLnR5cGUgaXMgXCJEZWxpbWl0ZXJcIlxuICAgICAgICBqc29uLm9yaWdpbiA9IFwiRGVsaW1pdGVyXCJcbiAgICAgIGVsc2UgaWYgQG9yaWdpbiBpc250IEBwcmV2X2NsXG4gICAgICAgIGpzb24ub3JpZ2luID0gQG9yaWdpbi5nZXRVaWQoKVxuXG4gICAgICAjIGlmIG5vdCAoanNvbi5wcmV2PyBhbmQganNvbi5uZXh0PylcbiAgICAgIGpzb24ucGFyZW50ID0gQHBhcmVudC5nZXRVaWQoKVxuXG4gICAgICBzdXBlciBqc29uXG5cbiAgb3BzLkluc2VydC5wYXJzZSA9IChqc29uKS0+XG4gICAge1xuICAgICAgJ2NvbnRlbnQnIDogY29udGVudFxuICAgICAgJ2NvbnRlbnRfb3BlcmF0aW9ucycgOiBjb250ZW50X29wZXJhdGlvbnNcbiAgICAgICd1aWQnIDogdWlkXG4gICAgICAncHJldic6IHByZXZcbiAgICAgICduZXh0JzogbmV4dFxuICAgICAgJ29yaWdpbicgOiBvcmlnaW5cbiAgICAgICdwYXJlbnQnIDogcGFyZW50XG4gICAgfSA9IGpzb25cbiAgICBuZXcgdGhpcyBudWxsLCBjb250ZW50LCBjb250ZW50X29wZXJhdGlvbnMsIHBhcmVudCwgdWlkLCBwcmV2LCBuZXh0LCBvcmlnaW5cblxuICAjXG4gICMgQG5vZG9jXG4gICMgQSBkZWxpbWl0ZXIgaXMgcGxhY2VkIGF0IHRoZSBlbmQgYW5kIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFzc29jaWF0aXZlIGxpc3RzLlxuICAjIFRoaXMgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGhhdmUgYSBiZWdpbm5pbmcgYW5kIGFuIGVuZCBldmVuIGlmIHRoZSBjb250ZW50XG4gICMgb2YgdGhlIEVuZ2luZSBpcyBlbXB0eS5cbiAgI1xuICBjbGFzcyBvcHMuRGVsaW1pdGVyIGV4dGVuZHMgb3BzLk9wZXJhdGlvblxuICAgICNcbiAgICAjIEBwYXJhbSB7T2JqZWN0fSB1aWQgQSB1bmlxdWUgaWRlbnRpZmllci4gSWYgdWlkIGlzIHVuZGVmaW5lZCwgYSBuZXcgdWlkIHdpbGwgYmUgY3JlYXRlZC5cbiAgICAjIEBwYXJhbSB7T3BlcmF0aW9ufSBwcmV2X2NsIFRoZSBwcmVkZWNlc3NvciBvZiB0aGlzIG9wZXJhdGlvbiBpbiB0aGUgY29tcGxldGUtbGlzdCAoY2wpXG4gICAgIyBAcGFyYW0ge09wZXJhdGlvbn0gbmV4dF9jbCBUaGUgc3VjY2Vzc29yIG9mIHRoaXMgb3BlcmF0aW9uIGluIHRoZSBjb21wbGV0ZS1saXN0IChjbClcbiAgICAjXG4gICAgY29uc3RydWN0b3I6IChwcmV2X2NsLCBuZXh0X2NsLCBvcmlnaW4pLT5cbiAgICAgIEBzYXZlT3BlcmF0aW9uICdwcmV2X2NsJywgcHJldl9jbFxuICAgICAgQHNhdmVPcGVyYXRpb24gJ25leHRfY2wnLCBuZXh0X2NsXG4gICAgICBAc2F2ZU9wZXJhdGlvbiAnb3JpZ2luJywgcHJldl9jbFxuICAgICAgc3VwZXIgbnVsbCwge25vT3BlcmF0aW9uOiB0cnVlfVxuXG4gICAgdHlwZTogXCJEZWxpbWl0ZXJcIlxuXG4gICAgYXBwbHlEZWxldGU6ICgpLT5cbiAgICAgIHN1cGVyKClcbiAgICAgIG8gPSBAcHJldl9jbFxuICAgICAgd2hpbGUgbz9cbiAgICAgICAgby5hcHBseURlbGV0ZSgpXG4gICAgICAgIG8gPSBvLnByZXZfY2xcbiAgICAgIHVuZGVmaW5lZFxuXG4gICAgY2xlYW51cDogKCktPlxuICAgICAgc3VwZXIoKVxuXG4gICAgI1xuICAgICMgQHByaXZhdGVcbiAgICAjXG4gICAgZXhlY3V0ZTogKCktPlxuICAgICAgaWYgQHVuY2hlY2tlZD9bJ25leHRfY2wnXT9cbiAgICAgICAgc3VwZXJcbiAgICAgIGVsc2UgaWYgQHVuY2hlY2tlZD9bJ3ByZXZfY2wnXVxuICAgICAgICBpZiBAdmFsaWRhdGVTYXZlZE9wZXJhdGlvbnMoKVxuICAgICAgICAgIGlmIEBwcmV2X2NsLm5leHRfY2w/XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IgXCJQcm9iYWJseSBkdXBsaWNhdGVkIG9wZXJhdGlvbnNcIlxuICAgICAgICAgIEBwcmV2X2NsLm5leHRfY2wgPSBAXG4gICAgICAgICAgc3VwZXJcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGZhbHNlXG4gICAgICBlbHNlIGlmIEBwcmV2X2NsPyBhbmQgbm90IEBwcmV2X2NsLm5leHRfY2w/XG4gICAgICAgIGRlbGV0ZSBAcHJldl9jbC51bmNoZWNrZWQubmV4dF9jbFxuICAgICAgICBAcHJldl9jbC5uZXh0X2NsID0gQFxuICAgICAgICBzdXBlclxuICAgICAgZWxzZSBpZiBAcHJldl9jbD8gb3IgQG5leHRfY2w/IG9yIHRydWUgIyBUT0RPOiBhcmUgeW91IHN1cmU/IFRoaXMgY2FuIGhhcHBlbiByaWdodD9cbiAgICAgICAgc3VwZXJcbiAgICAgICNlbHNlXG4gICAgICAjICB0aHJvdyBuZXcgRXJyb3IgXCJEZWxpbWl0ZXIgaXMgdW5zdWZmaWNpZW50IGRlZmluZWQhXCJcblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgI1xuICAgIF9lbmNvZGU6ICgpLT5cbiAgICAgIHtcbiAgICAgICAgJ3R5cGUnIDogQHR5cGVcbiAgICAgICAgJ3VpZCcgOiBAZ2V0VWlkKClcbiAgICAgICAgJ3ByZXYnIDogQHByZXZfY2w/LmdldFVpZCgpXG4gICAgICAgICduZXh0JyA6IEBuZXh0X2NsPy5nZXRVaWQoKVxuICAgICAgfVxuXG4gIG9wcy5EZWxpbWl0ZXIucGFyc2UgPSAoanNvbiktPlxuICAgIHtcbiAgICAndWlkJyA6IHVpZFxuICAgICdwcmV2JyA6IHByZXZcbiAgICAnbmV4dCcgOiBuZXh0XG4gICAgfSA9IGpzb25cbiAgICBuZXcgdGhpcyh1aWQsIHByZXYsIG5leHQpXG5cbiAgIyBUaGlzIGlzIHdoYXQgdGhpcyBtb2R1bGUgZXhwb3J0cyBhZnRlciBpbml0aWFsaXppbmcgaXQgd2l0aCB0aGUgSGlzdG9yeUJ1ZmZlclxuICB7XG4gICAgJ29wZXJhdGlvbnMnIDogb3BzXG4gICAgJ2V4ZWN1dGlvbl9saXN0ZW5lcicgOiBleGVjdXRpb25fbGlzdGVuZXJcbiAgfVxuIiwiYmFzaWNfb3BzX3VuaW5pdGlhbGl6ZWQgPSByZXF1aXJlIFwiLi9CYXNpY1wiXG5SQlRSZWVCeUluZGV4ID0gcmVxdWlyZSAnYmludHJlZXMvbGliL3JidHJlZV9ieV9pbmRleCdcblxubW9kdWxlLmV4cG9ydHMgPSAoKS0+XG4gIGJhc2ljX29wcyA9IGJhc2ljX29wc191bmluaXRpYWxpemVkKClcbiAgb3BzID0gYmFzaWNfb3BzLm9wZXJhdGlvbnNcblxuICAjXG4gICMgQG5vZG9jXG4gICMgTWFuYWdlcyBtYXAgbGlrZSBvYmplY3RzLiBFLmcuIEpzb24tVHlwZSBhbmQgWE1MIGF0dHJpYnV0ZXMuXG4gICNcbiAgY2xhc3Mgb3BzLk1hcE1hbmFnZXIgZXh0ZW5kcyBvcHMuT3BlcmF0aW9uXG5cbiAgICAjXG4gICAgIyBAcGFyYW0ge09iamVjdH0gdWlkIEEgdW5pcXVlIGlkZW50aWZpZXIuIElmIHVpZCBpcyB1bmRlZmluZWQsIGEgbmV3IHVpZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAgI1xuICAgIGNvbnN0cnVjdG9yOiAoY3VzdG9tX3R5cGUsIHVpZCwgY29udGVudCwgY29udGVudF9vcGVyYXRpb25zKS0+XG4gICAgICBAX21hcCA9IHt9XG4gICAgICBzdXBlciBjdXN0b21fdHlwZSwgdWlkLCBjb250ZW50LCBjb250ZW50X29wZXJhdGlvbnNcblxuICAgIHR5cGU6IFwiTWFwTWFuYWdlclwiXG5cbiAgICBhcHBseURlbGV0ZTogKCktPlxuICAgICAgZm9yIG5hbWUscCBvZiBAX21hcFxuICAgICAgICBwLmFwcGx5RGVsZXRlKClcbiAgICAgIHN1cGVyKClcblxuICAgIGNsZWFudXA6ICgpLT5cbiAgICAgIHN1cGVyKClcblxuICAgIG1hcDogKGYpLT5cbiAgICAgIGZvciBuLHYgb2YgQF9tYXBcbiAgICAgICAgZihuLHYpXG4gICAgICB1bmRlZmluZWRcblxuICAgICNcbiAgICAjIEBzZWUgSnNvbk9wZXJhdGlvbnMudmFsXG4gICAgI1xuICAgIHZhbDogKG5hbWUsIGNvbnRlbnQpLT5cbiAgICAgIGlmIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICAgIGlmIGNvbnRlbnQ/IGFuZCBjb250ZW50Ll9nZXRNb2RlbD9cbiAgICAgICAgICByZXAgPSBjb250ZW50Ll9nZXRNb2RlbChAY3VzdG9tX3R5cGVzLCBAb3BlcmF0aW9ucylcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJlcCA9IGNvbnRlbnRcbiAgICAgICAgQHJldHJpZXZlU3ViKG5hbWUpLnJlcGxhY2UgcmVwXG4gICAgICAgIEBnZXRDdXN0b21UeXBlKClcbiAgICAgIGVsc2UgaWYgbmFtZT9cbiAgICAgICAgcHJvcCA9IEBfbWFwW25hbWVdXG4gICAgICAgIGlmIHByb3A/IGFuZCBub3QgcHJvcC5pc0NvbnRlbnREZWxldGVkKClcbiAgICAgICAgICByZXMgPSBwcm9wLnZhbCgpXG4gICAgICAgICAgaWYgcmVzIGluc3RhbmNlb2Ygb3BzLk9wZXJhdGlvblxuICAgICAgICAgICAgcmVzLmdldEN1c3RvbVR5cGUoKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdW5kZWZpbmVkXG4gICAgICBlbHNlXG4gICAgICAgIHJlc3VsdCA9IHt9XG4gICAgICAgIGZvciBuYW1lLG8gb2YgQF9tYXBcbiAgICAgICAgICBpZiBub3Qgby5pc0NvbnRlbnREZWxldGVkKClcbiAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IG8udmFsKClcbiAgICAgICAgcmVzdWx0XG5cbiAgICBkZWxldGU6IChuYW1lKS0+XG4gICAgICBAX21hcFtuYW1lXT8uZGVsZXRlQ29udGVudCgpXG4gICAgICBAXG5cbiAgICByZXRyaWV2ZVN1YjogKHByb3BlcnR5X25hbWUpLT5cbiAgICAgIGlmIG5vdCBAX21hcFtwcm9wZXJ0eV9uYW1lXT9cbiAgICAgICAgZXZlbnRfcHJvcGVydGllcyA9XG4gICAgICAgICAgbmFtZTogcHJvcGVydHlfbmFtZVxuICAgICAgICBldmVudF90aGlzID0gQFxuICAgICAgICBybV91aWQgPVxuICAgICAgICAgIG5vT3BlcmF0aW9uOiB0cnVlXG4gICAgICAgICAgc3ViOiBwcm9wZXJ0eV9uYW1lXG4gICAgICAgICAgYWx0OiBAXG4gICAgICAgIHJtID0gbmV3IG9wcy5SZXBsYWNlTWFuYWdlciBudWxsLCBldmVudF9wcm9wZXJ0aWVzLCBldmVudF90aGlzLCBybV91aWQgIyB0aGlzIG9wZXJhdGlvbiBzaGFsbCBub3QgYmUgc2F2ZWQgaW4gdGhlIEhCXG4gICAgICAgIEBfbWFwW3Byb3BlcnR5X25hbWVdID0gcm1cbiAgICAgICAgcm0uc2V0UGFyZW50IEAsIHByb3BlcnR5X25hbWVcbiAgICAgICAgcm0uZXhlY3V0ZSgpXG4gICAgICBAX21hcFtwcm9wZXJ0eV9uYW1lXVxuXG4gIG9wcy5NYXBNYW5hZ2VyLnBhcnNlID0gKGpzb24pLT5cbiAgICB7XG4gICAgICAndWlkJyA6IHVpZFxuICAgICAgJ2N1c3RvbV90eXBlJyA6IGN1c3RvbV90eXBlXG4gICAgICAnY29udGVudCcgOiBjb250ZW50XG4gICAgICAnY29udGVudF9vcGVyYXRpb25zJyA6IGNvbnRlbnRfb3BlcmF0aW9uc1xuICAgIH0gPSBqc29uXG4gICAgbmV3IHRoaXMoY3VzdG9tX3R5cGUsIHVpZCwgY29udGVudCwgY29udGVudF9vcGVyYXRpb25zKVxuXG5cblxuICAjXG4gICMgQG5vZG9jXG4gICMgTWFuYWdlcyBhIGxpc3Qgb2YgSW5zZXJ0LXR5cGUgb3BlcmF0aW9ucy5cbiAgI1xuICBjbGFzcyBvcHMuTGlzdE1hbmFnZXIgZXh0ZW5kcyBvcHMuT3BlcmF0aW9uXG5cbiAgICAjXG4gICAgIyBBIExpc3RNYW5hZ2VyIG1haW50YWlucyBhIG5vbi1lbXB0eSBsaXN0IHRoYXQgaGFzIGEgYmVnaW5uaW5nIGFuZCBhbiBlbmQgKGJvdGggRGVsaW1pdGVycyEpXG4gICAgIyBAcGFyYW0ge09iamVjdH0gdWlkIEEgdW5pcXVlIGlkZW50aWZpZXIuIElmIHVpZCBpcyB1bmRlZmluZWQsIGEgbmV3IHVpZCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAgIyBAcGFyYW0ge0RlbGltaXRlcn0gYmVnaW5uaW5nIFJlZmVyZW5jZSBvciBPYmplY3QuXG4gICAgIyBAcGFyYW0ge0RlbGltaXRlcn0gZW5kIFJlZmVyZW5jZSBvciBPYmplY3QuXG4gICAgY29uc3RydWN0b3I6IChjdXN0b21fdHlwZSwgdWlkLCBjb250ZW50LCBjb250ZW50X29wZXJhdGlvbnMpLT5cbiAgICAgIEBiZWdpbm5pbmcgPSBuZXcgb3BzLkRlbGltaXRlciB1bmRlZmluZWQsIHVuZGVmaW5lZFxuICAgICAgQGVuZCA9ICAgICAgIG5ldyBvcHMuRGVsaW1pdGVyIEBiZWdpbm5pbmcsIHVuZGVmaW5lZFxuICAgICAgQGJlZ2lubmluZy5uZXh0X2NsID0gQGVuZFxuICAgICAgQGJlZ2lubmluZy5leGVjdXRlKClcbiAgICAgIEBlbmQuZXhlY3V0ZSgpXG5cblxuICAgICAgIyBUaGUgc2hvcnQgdHJlZSBpcyBzdG9yaW5nIHRoZSBub24gZGVsZXRlZCBvcGVyYXRpb25zXG4gICAgICBAc2hvcnRUcmVlID0gbmV3IFJCVHJlZUJ5SW5kZXgoKVxuICAgICAgIyBUaGUgY29tcGxldGUgdHJlZSBpcyBzdG9yaW5nIGFsbCB0aGUgb3BlcmF0aW9uc1xuICAgICAgQGNvbXBsZXRlVHJlZSA9IG5ldyBSQlRyZWVCeUluZGV4KClcblxuICAgICAgc3VwZXIgY3VzdG9tX3R5cGUsIHVpZCwgY29udGVudCwgY29udGVudF9vcGVyYXRpb25zXG5cbiAgICB0eXBlOiBcIkxpc3RNYW5hZ2VyXCJcblxuXG4gICAgYXBwbHlEZWxldGU6ICgpLT5cbiAgICAgIG8gPSBAYmVnaW5uaW5nXG4gICAgICB3aGlsZSBvP1xuICAgICAgICBvLmFwcGx5RGVsZXRlKClcbiAgICAgICAgbyA9IG8ubmV4dF9jbFxuICAgICAgc3VwZXIoKVxuXG4gICAgY2xlYW51cDogKCktPlxuICAgICAgc3VwZXIoKVxuXG5cbiAgICB0b0pzb246ICh0cmFuc2Zvcm1fdG9fdmFsdWUgPSBmYWxzZSktPlxuICAgICAgdmFsID0gQHZhbCgpXG4gICAgICBmb3IgaSwgbyBpbiB2YWxcbiAgICAgICAgaWYgbyBpbnN0YW5jZW9mIG9wcy5PYmplY3RcbiAgICAgICAgICBvLnRvSnNvbih0cmFuc2Zvcm1fdG9fdmFsdWUpXG4gICAgICAgIGVsc2UgaWYgbyBpbnN0YW5jZW9mIG9wcy5MaXN0TWFuYWdlclxuICAgICAgICAgIG8udG9Kc29uKHRyYW5zZm9ybV90b192YWx1ZSlcbiAgICAgICAgZWxzZSBpZiB0cmFuc2Zvcm1fdG9fdmFsdWUgYW5kIG8gaW5zdGFuY2VvZiBvcHMuT3BlcmF0aW9uXG4gICAgICAgICAgby52YWwoKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgb1xuXG4gICAgI1xuICAgICMgQHByaXZhdGVcbiAgICAjIEBzZWUgT3BlcmF0aW9uLmV4ZWN1dGVcbiAgICAjXG4gICAgZXhlY3V0ZTogKCktPlxuICAgICAgaWYgQHZhbGlkYXRlU2F2ZWRPcGVyYXRpb25zKClcbiAgICAgICAgQGJlZ2lubmluZy5zZXRQYXJlbnQgQFxuICAgICAgICBAZW5kLnNldFBhcmVudCBAXG4gICAgICAgIHN1cGVyXG4gICAgICBlbHNlXG4gICAgICAgIGZhbHNlXG5cbiAgICAjIEdldCB0aGUgZWxlbWVudCBwcmV2aW91cyB0byB0aGUgZGVsZW1pdGVyIGF0IHRoZSBlbmRcbiAgICBnZXRMYXN0T3BlcmF0aW9uOiAoKS0+XG4gICAgICBAZW5kLnByZXZfY2xcblxuICAgICMgc2ltaWxhciB0byB0aGUgYWJvdmVcbiAgICBnZXRGaXJzdE9wZXJhdGlvbjogKCktPlxuICAgICAgQGJlZ2lubmluZy5uZXh0X2NsXG5cbiAgICAjIGdldCB0aGUgbmV4dCBub24tZGVsZXRlZCBvcGVyYXRpb25cbiAgICBnZXROZXh0Tm9uRGVsZXRlZDogKHN0YXJ0KS0+XG4gICAgICBpZiBzdGFydC5pc0RlbGV0ZWQoKSBvciBub3Qgc3RhcnQubm9kZT9cbiAgICAgICAgb3BlcmF0aW9uID0gc3RhcnQubmV4dF9jbFxuICAgICAgICB3aGlsZSBub3QgKChvcGVyYXRpb24gaW5zdGFuY2VvZiBvcHMuRGVsaW1pdGVyKSlcbiAgICAgICAgICBpZiBvcGVyYXRpb24uaXNfZGVsZXRlZFxuICAgICAgICAgICAgb3BlcmF0aW9uID0gb3BlcmF0aW9uLm5leHRfY2xcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVha1xuICAgICAgZWxzZVxuICAgICAgICBvcGVyYXRpb24gPSBzdGFydC5ub2RlLm5leHQubm9kZVxuICAgICAgICBpZiBub3Qgb3BlcmF0aW9uXG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICAgIG9wZXJhdGlvblxuXG4gICAgZ2V0UHJldk5vbkRlbGV0ZWQ6IChzdGFydCkgLT5cbiAgICAgIGlmIHN0YXJ0LmlzRGVsZXRlZCgpIG9yIG5vdCBzdGFydC5ub2RlP1xuICAgICAgICBvcGVyYXRpb24gPSBzdGFydC5wcmV2X2NsXG4gICAgICAgIHdoaWxlIG5vdCAoKG9wZXJhdGlvbiBpbnN0YW5jZW9mIG9wcy5EZWxpbWl0ZXIpKVxuICAgICAgICAgIGlmIG9wZXJhdGlvbi5pc19kZWxldGVkXG4gICAgICAgICAgICBvcGVyYXRpb24gPSBvcGVyYXRpb24ucHJldl9jbFxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICBlbHNlXG4gICAgICAgIG9wZXJhdGlvbiA9IHN0YXJ0Lm5vZGUucHJldi5ub2RlXG4gICAgICAgIGlmIG5vdCBvcGVyYXRpb25cbiAgICAgICAgICByZXR1cm4gZmFsc2VcblxuICAgICAgb3BlcmF0aW9uXG5cblxuICAgICMgVHJhbnNmb3JtcyB0aGUgbGlzdCB0byBhbiBhcnJheVxuICAgICMgRG9lc24ndCByZXR1cm4gbGVmdC1yaWdodCBkZWxpbWl0ZXIuXG4gICAgdG9BcnJheTogKCktPlxuICAgICAgQHNob3J0VHJlZS5tYXAgKG9wZXJhdGlvbikgLT5cbiAgICAgICAgb3BlcmF0aW9uLnZhbCgpXG5cbiAgICBtYXA6IChmdW4pLT5cbiAgICAgIEBzaG9ydFRyZWUubWFwIGZ1blxuXG4gICAgZm9sZDogKGluaXQsIGZ1biktPlxuICAgICAgQHNob3J0VHJlZS5tYXAgKG9wZXJhdGlvbikgLT5cbiAgICAgICAgaW5pdCA9IGZ1bihpbml0LCBvcGVyYXRpb24pXG5cbiAgICB2YWw6IChwb3MpLT5cbiAgICAgIGlmIHBvcz9cbiAgICAgICAgQHNob3J0VHJlZS5maW5kKHBvcykudmFsKClcbiAgICAgIGVsc2VcbiAgICAgICAgQHRvQXJyYXkoKVxuXG4gICAgcmVmOiAocG9zKS0+XG4gICAgICBpZiBwb3M/XG4gICAgICAgIEBzaG9ydFRyZWUuZmluZChwb3MpXG4gICAgICBlbHNlXG4gICAgICAgIEBzaG9ydFRyZWUubWFwIChvcGVyYXRpb24pIC0+XG4gICAgICAgICAgb3BlcmF0aW9uXG5cbiAgICAjXG4gICAgIyBSZXRyaWV2ZXMgdGhlIHgtdGggbm90IGRlbGV0ZWQgZWxlbWVudC5cbiAgICAjIGUuZy4gXCJhYmNcIiA6IHRoZSAxdGggY2hhcmFjdGVyIGlzIFwiYVwiXG4gICAgIyB0aGUgMHRoIGNoYXJhY3RlciBpcyB0aGUgbGVmdCBEZWxpbWl0ZXJcbiAgICAjXG4gICAgZ2V0T3BlcmF0aW9uQnlQb3NpdGlvbjogKHBvc2l0aW9uKS0+XG4gICAgICBpZiBwb3NpdGlvbiA9PSAwXG4gICAgICAgIEBiZWdpbm5pbmdcbiAgICAgIGVsc2UgaWYgcG9zaXRpb24gPT0gQHNob3J0VHJlZS5zaXplICsgMVxuICAgICAgICBAZW5kXG4gICAgICBlbHNlXG4gICAgICAgIEBzaG9ydFRyZWUuZmluZCAocG9zaXRpb24tMSlcblxuICAgIHB1c2g6IChjb250ZW50KS0+XG4gICAgICBAaW5zZXJ0QWZ0ZXIgQGVuZC5wcmV2X2NsLCBbY29udGVudF1cblxuICAgIGluc2VydEFmdGVySGVscGVyOiAocm9vdCwgY29udGVudCktPlxuICAgICAgaWYgIXJvb3QucmlnaHRcbiAgICAgICAgcm9vdC5idC5yaWdodCA9IGNvbnRlbnRcbiAgICAgICAgY29udGVudC5idC5wYXJlbnQgPSByb290XG4gICAgICBlbHNlXG4gICAgICAgIHJpZ2h0ID0gcm9vdC5uZXh0X2NsXG5cblxuICAgIGluc2VydEFmdGVyOiAobGVmdCwgY29udGVudHMpLT5cbiAgICAgIGlmIGxlZnQgaXMgQGJlZ2lubmluZ1xuICAgICAgICBsZWZ0Tm9kZSA9IG51bGxcbiAgICAgICAgcmlnaHROb2RlID0gQHNob3J0VHJlZS5maW5kTm9kZSAwXG4gICAgICAgIHJpZ2h0ID0gaWYgcmlnaHROb2RlIHRoZW4gcmlnaHROb2RlLmRhdGEgZWxzZSBAZW5kXG4gICAgICBlbHNlXG4gICAgICAgICMgbGVmdC5ub2RlIHNob3VsZCBhbHdheXMgZXhpc3QgKGluc2VydCBhZnRlciBhIG5vbi1kZWxldGVkIGVsZW1lbnQpXG4gICAgICAgIHJpZ2h0Tm9kZSA9IGxlZnQubm9kZS5uZXh0XG4gICAgICAgIGxlZnROb2RlID0gbGVmdC5ub2RlXG4gICAgICAgIHJpZ2h0ID0gaWYgcmlnaHROb2RlIHRoZW4gcmlnaHROb2RlLmRhdGEgZWxzZSBAZW5kXG5cbiAgICAgIGxlZnQgPSByaWdodC5wcmV2X2NsXG5cbiAgICAgICMgVE9ETzogYWx3YXlzIGV4cGVjdCBhbiBhcnJheSBhcyBjb250ZW50LiBUaGVuIHlvdSBjYW4gY29tYmluZSB0aGlzIHdpdGggdGhlIG90aGVyIG9wdGlvbiAoZWxzZSlcbiAgICAgIGlmIGNvbnRlbnRzIGluc3RhbmNlb2Ygb3BzLk9wZXJhdGlvblxuICAgICAgICB0bXAgPSBuZXcgb3BzLkluc2VydCBudWxsLCBjb250ZW50LCBudWxsLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbGVmdCwgcmlnaHRcbiAgICAgICAgdG1wLmV4ZWN1dGUoKVxuICAgICAgZWxzZVxuICAgICAgICBmb3IgYyBpbiBjb250ZW50c1xuICAgICAgICAgIGlmIGM/IGFuZCBjLl9uYW1lPyBhbmQgYy5fZ2V0TW9kZWw/XG4gICAgICAgICAgICBjID0gYy5fZ2V0TW9kZWwoQGN1c3RvbV90eXBlcywgQG9wZXJhdGlvbnMpXG4gICAgICAgICAgdG1wID0gbmV3IG9wcy5JbnNlcnQgbnVsbCwgYywgbnVsbCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGxlZnQsIHJpZ2h0XG4gICAgICAgICAgdG1wLmV4ZWN1dGUoKVxuICAgICAgICAgIGxlZnROb2RlID0gdG1wLm5vZGVcblxuICAgICAgICAgIGxlZnQgPSB0bXBcbiAgICAgIEBcblxuICAgICNcbiAgICAjIEluc2VydHMgYW4gYXJyYXkgb2YgY29udGVudCBpbnRvIHRoaXMgbGlzdC5cbiAgICAjIEBOb3RlOiBUaGlzIGV4cGVjdHMgYW4gYXJyYXkgYXMgY29udGVudCFcbiAgICAjXG4gICAgIyBAcmV0dXJuIHtMaXN0TWFuYWdlciBUeXBlfSBUaGlzIFN0cmluZyBvYmplY3QuXG4gICAgI1xuICAgIGluc2VydDogKHBvc2l0aW9uLCBjb250ZW50cyktPlxuICAgICAgaXRoID0gQGdldE9wZXJhdGlvbkJ5UG9zaXRpb24gcG9zaXRpb25cbiAgICAgICMgdGhlIChpLTEpdGggY2hhcmFjdGVyLiBlLmcuIFwiYWJjXCIgdGhlIDF0aCBjaGFyYWN0ZXIgaXMgXCJhXCJcbiAgICAgICMgdGhlIDB0aCBjaGFyYWN0ZXIgaXMgdGhlIGxlZnQgRGVsaW1pdGVyXG4gICAgICBAaW5zZXJ0QWZ0ZXIgaXRoLCBjb250ZW50c1xuXG4gICAgI1xuICAgICMgRGVsZXRlcyBhIHBhcnQgb2YgdGhlIHdvcmQuXG4gICAgI1xuICAgICMgQHJldHVybiB7TGlzdE1hbmFnZXIgVHlwZX0gVGhpcyBTdHJpbmcgb2JqZWN0XG4gICAgI1xuICAgIGRlbGV0ZVJlZjogKG9wZXJhdGlvbiwgbGVuZ3RoID0gMSwgZGlyID0gJ3JpZ2h0JykgLT5cbiAgICAgIG5leHRPcGVyYXRpb24gPSAob3BlcmF0aW9uKSA9PlxuICAgICAgICBpZiBkaXIgPT0gJ3JpZ2h0JyB0aGVuIEBnZXROZXh0Tm9uRGVsZXRlZCBvcGVyYXRpb24gZWxzZSBAZ2V0UHJldk5vbkRlbGV0ZWQgb3BlcmF0aW9uXG5cbiAgICAgIGZvciBpIGluIFswLi4ubGVuZ3RoXVxuICAgICAgICBpZiBvcGVyYXRpb24gaW5zdGFuY2VvZiBvcHMuRGVsaW1pdGVyXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVsZXRlT3BlcmF0aW9uID0gKG5ldyBvcHMuRGVsZXRlIG51bGwsIHVuZGVmaW5lZCwgb3BlcmF0aW9uKS5leGVjdXRlKClcblxuICAgICAgICBvcGVyYXRpb24gPSBuZXh0T3BlcmF0aW9uIG9wZXJhdGlvblxuICAgICAgQFxuXG4gICAgZGVsZXRlOiAocG9zaXRpb24sIGxlbmd0aCA9IDEpLT5cbiAgICAgIG9wZXJhdGlvbiA9IEBnZXRPcGVyYXRpb25CeVBvc2l0aW9uKHBvc2l0aW9uK2xlbmd0aCkgIyBwb3NpdGlvbiAwIGluIHRoaXMgY2FzZSBpcyB0aGUgZGVsZXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlclxuXG4gICAgICBAZGVsZXRlUmVmIG9wZXJhdGlvbiwgbGVuZ3RoLCAnbGVmdCdcblxuXG4gICAgY2FsbE9wZXJhdGlvblNwZWNpZmljSW5zZXJ0RXZlbnRzOiAob3BlcmF0aW9uKS0+XG4gICAgICBwcmV2ID0gKEBnZXRQcmV2Tm9uRGVsZXRlZCBvcGVyYXRpb24pIG9yIEBiZWdpbm5pbmdcbiAgICAgIHByZXZOb2RlID0gaWYgcHJldiB0aGVuIHByZXYubm9kZSBlbHNlIG51bGxcblxuICAgICAgbmV4dCA9IChAZ2V0TmV4dE5vbkRlbGV0ZWQgb3BlcmF0aW9uKSBvciBAZW5kXG4gICAgICBuZXh0Tm9kZSA9IGlmIG5leHQgdGhlbiBuZXh0Lm5vZGUgZWxzZSBudWxsXG4gICAgICBvcGVyYXRpb24ubm9kZSA9IG9wZXJhdGlvbi5ub2RlIG9yIChAc2hvcnRUcmVlLmluc2VydF9iZXR3ZWVuIHByZXZOb2RlLCBuZXh0Tm9kZSwgb3BlcmF0aW9uKVxuICAgICAgb3BlcmF0aW9uLmNvbXBsZXRlTm9kZSA9IG9wZXJhdGlvbi5jb21wbGV0ZU5vZGUgb3IgKEBjb21wbGV0ZVRyZWUuaW5zZXJ0X2JldHdlZW4gb3BlcmF0aW9uLnByZXZfY2wuY29tcGxldGVOb2RlLCBvcGVyYXRpb24ubmV4dF9jbC5jb21wbGV0ZU5vZGUsIG9wZXJhdGlvbilcblxuICAgICAgZ2V0Q29udGVudFR5cGUgPSAoY29udGVudCktPlxuICAgICAgICBpZiBjb250ZW50IGluc3RhbmNlb2Ygb3BzLk9wZXJhdGlvblxuICAgICAgICAgIGNvbnRlbnQuZ2V0Q3VzdG9tVHlwZSgpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBjb250ZW50XG5cbiAgICAgIEBjYWxsRXZlbnQgW1xuICAgICAgICB0eXBlOiBcImluc2VydFwiXG4gICAgICAgIHJlZmVyZW5jZTogb3BlcmF0aW9uXG4gICAgICAgIHBvc2l0aW9uOiBvcGVyYXRpb24ubm9kZS5wb3NpdGlvbigpXG4gICAgICAgIG9iamVjdDogQGdldEN1c3RvbVR5cGUoKVxuICAgICAgICBjaGFuZ2VkQnk6IG9wZXJhdGlvbi51aWQuY3JlYXRvclxuICAgICAgICB2YWx1ZTogZ2V0Q29udGVudFR5cGUgb3BlcmF0aW9uLnZhbCgpXG4gICAgICBdXG5cbiAgICBjYWxsT3BlcmF0aW9uU3BlY2lmaWNEZWxldGVFdmVudHM6IChvcGVyYXRpb24sIGRlbF9vcCktPlxuICAgICAgaWYgb3BlcmF0aW9uLm5vZGVcbiAgICAgICAgcG9zaXRpb24gPSBvcGVyYXRpb24ubm9kZS5wb3NpdGlvbigpXG4gICAgICAgIEBzaG9ydFRyZWUucmVtb3ZlX25vZGUgb3BlcmF0aW9uLm5vZGVcbiAgICAgICAgb3BlcmF0aW9uLm5vZGUgPSBudWxsXG5cbiAgICAgIEBjYWxsRXZlbnQgW1xuICAgICAgICB0eXBlOiBcImRlbGV0ZVwiXG4gICAgICAgIHJlZmVyZW5jZTogb3BlcmF0aW9uXG4gICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICAgICAgICBvYmplY3Q6IEBnZXRDdXN0b21UeXBlKCkgIyBUT0RPOiBZb3UgY2FuIGNvbWJpbmUgZ2V0UG9zaXRpb24gKyBnZXRQYXJlbnQgaW4gYSBtb3JlIGVmZmljaWVudCBtYW5uZXIhIChvbmx5IGxlZnQgRGVsaW1pdGVyIHdpbGwgaG9sZCBAcGFyZW50KVxuICAgICAgICBsZW5ndGg6IDFcbiAgICAgICAgY2hhbmdlZEJ5OiBkZWxfb3AudWlkLmNyZWF0b3JcbiAgICAgICAgb2xkVmFsdWU6IG9wZXJhdGlvbi52YWwoKVxuICAgICAgXVxuXG4gIG9wcy5MaXN0TWFuYWdlci5wYXJzZSA9IChqc29uKS0+XG4gICAge1xuICAgICAgJ3VpZCcgOiB1aWRcbiAgICAgICdjdXN0b21fdHlwZSc6IGN1c3RvbV90eXBlXG4gICAgICAnY29udGVudCcgOiBjb250ZW50XG4gICAgICAnY29udGVudF9vcGVyYXRpb25zJyA6IGNvbnRlbnRfb3BlcmF0aW9uc1xuICAgIH0gPSBqc29uXG4gICAgbmV3IHRoaXMoY3VzdG9tX3R5cGUsIHVpZCwgY29udGVudCwgY29udGVudF9vcGVyYXRpb25zKVxuXG4gIGNsYXNzIG9wcy5Db21wb3NpdGlvbiBleHRlbmRzIG9wcy5MaXN0TWFuYWdlclxuXG4gICAgY29uc3RydWN0b3I6IChjdXN0b21fdHlwZSwgQF9jb21wb3NpdGlvbl92YWx1ZSwgY29tcG9zaXRpb25fdmFsdWVfb3BlcmF0aW9ucywgdWlkLCB0bXBfY29tcG9zaXRpb25fcmVmKS0+XG4gICAgICAjIHdlIGNhbid0IHVzZSBAc2V2ZU9wZXJhdGlvbiAnY29tcG9zaXRpb25fcmVmJywgdG1wX2NvbXBvc2l0aW9uX3JlZiBoZXJlLFxuICAgICAgIyBiZWNhdXNlIHRoZW4gdGhlcmUgaXMgYSBcImxvb3BcIiAoaW5zZXJ0aW9uIHJlZmVycyB0byBwYXJlbnQsIHJlZmVycyB0byBpbnNlcnRpb24uLilcbiAgICAgICMgVGhpcyBpcyB3aHkgd2UgaGF2ZSB0byBjaGVjayBpbiBAY2FsbE9wZXJhdGlvblNwZWNpZmljSW5zZXJ0RXZlbnRzIHVudGlsIHdlIGZpbmQgaXRcbiAgICAgIHN1cGVyIGN1c3RvbV90eXBlLCB1aWRcbiAgICAgIGlmIHRtcF9jb21wb3NpdGlvbl9yZWY/XG4gICAgICAgIEB0bXBfY29tcG9zaXRpb25fcmVmID0gdG1wX2NvbXBvc2l0aW9uX3JlZlxuICAgICAgZWxzZVxuICAgICAgICBAY29tcG9zaXRpb25fcmVmID0gQGVuZC5wcmV2X2NsXG4gICAgICBpZiBjb21wb3NpdGlvbl92YWx1ZV9vcGVyYXRpb25zP1xuICAgICAgICBAY29tcG9zaXRpb25fdmFsdWVfb3BlcmF0aW9ucyA9IHt9XG4gICAgICAgIGZvciBuLG8gb2YgY29tcG9zaXRpb25fdmFsdWVfb3BlcmF0aW9uc1xuICAgICAgICAgIEBzYXZlT3BlcmF0aW9uIG4sIG8sICdfY29tcG9zaXRpb25fdmFsdWUnXG5cbiAgICB0eXBlOiBcIkNvbXBvc2l0aW9uXCJcblxuICAgICNcbiAgICAjIEBwcml2YXRlXG4gICAgIyBAc2VlIE9wZXJhdGlvbi5leGVjdXRlXG4gICAgI1xuICAgIGV4ZWN1dGU6ICgpLT5cbiAgICAgIGlmIEB2YWxpZGF0ZVNhdmVkT3BlcmF0aW9ucygpXG4gICAgICAgIEBnZXRDdXN0b21UeXBlKCkuX3NldENvbXBvc2l0aW9uVmFsdWUgQF9jb21wb3NpdGlvbl92YWx1ZVxuICAgICAgICBkZWxldGUgQF9jb21wb3NpdGlvbl92YWx1ZVxuICAgICAgICAjIGNoZWNrIGlmIHRtcF9jb21wb3NpdGlvbl9yZWYgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgaWYgQHRtcF9jb21wb3NpdGlvbl9yZWZcbiAgICAgICAgICBjb21wb3NpdGlvbl9yZWYgPSBASEIuZ2V0T3BlcmF0aW9uIEB0bXBfY29tcG9zaXRpb25fcmVmXG4gICAgICAgICAgaWYgY29tcG9zaXRpb25fcmVmP1xuICAgICAgICAgICAgZGVsZXRlIEB0bXBfY29tcG9zaXRpb25fcmVmXG4gICAgICAgICAgICBAY29tcG9zaXRpb25fcmVmID0gY29tcG9zaXRpb25fcmVmXG4gICAgICAgIHN1cGVyXG4gICAgICBlbHNlXG4gICAgICAgIGZhbHNlXG5cbiAgICAjXG4gICAgIyBUaGlzIGlzIGNhbGxlZCwgd2hlbiB0aGUgSW5zZXJ0LW9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLlxuICAgICNcbiAgICBjYWxsT3BlcmF0aW9uU3BlY2lmaWNJbnNlcnRFdmVudHM6IChvcGVyYXRpb24pLT5cbiAgICAgIGlmIEB0bXBfY29tcG9zaXRpb25fcmVmP1xuICAgICAgICBpZiBvcGVyYXRpb24udWlkLmNyZWF0b3IgaXMgQHRtcF9jb21wb3NpdGlvbl9yZWYuY3JlYXRvciBhbmQgb3BlcmF0aW9uLnVpZC5vcF9udW1iZXIgaXMgQHRtcF9jb21wb3NpdGlvbl9yZWYub3BfbnVtYmVyXG4gICAgICAgICAgQGNvbXBvc2l0aW9uX3JlZiA9IG9wZXJhdGlvblxuICAgICAgICAgIGRlbGV0ZSBAdG1wX2NvbXBvc2l0aW9uX3JlZlxuICAgICAgICAgIG9wZXJhdGlvbiA9IG9wZXJhdGlvbi5uZXh0X2NsXG4gICAgICAgICAgaWYgb3BlcmF0aW9uIGlzIEBlbmRcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0dXJuXG5cbiAgICAgIG8gPSBAZW5kLnByZXZfY2xcbiAgICAgIHdoaWxlIG8gaXNudCBvcGVyYXRpb25cbiAgICAgICAgQGdldEN1c3RvbVR5cGUoKS5fdW5hcHBseSBvLnVuZG9fZGVsdGFcbiAgICAgICAgbyA9IG8ucHJldl9jbFxuICAgICAgd2hpbGUgbyBpc250IEBlbmRcbiAgICAgICAgby51bmRvX2RlbHRhID0gQGdldEN1c3RvbVR5cGUoKS5fYXBwbHkgby52YWwoKVxuICAgICAgICBvID0gby5uZXh0X2NsXG4gICAgICBAY29tcG9zaXRpb25fcmVmID0gQGVuZC5wcmV2X2NsXG5cbiAgICAgIEBjYWxsRXZlbnQgW1xuICAgICAgICB0eXBlOiBcInVwZGF0ZVwiXG4gICAgICAgIGNoYW5nZWRCeTogb3BlcmF0aW9uLnVpZC5jcmVhdG9yXG4gICAgICAgIG5ld1ZhbHVlOiBAdmFsKClcbiAgICAgIF1cblxuICAgIGNhbGxPcGVyYXRpb25TcGVjaWZpY0RlbGV0ZUV2ZW50czogKG9wZXJhdGlvbiwgZGVsX29wKS0+XG4gICAgICByZXR1cm5cblxuICAgICNcbiAgICAjIENyZWF0ZSBhIG5ldyBEZWx0YVxuICAgICMgLSBpbnNlcnRzIG5ldyBDb250ZW50IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3RcbiAgICAjIC0gdXBkYXRlcyB0aGUgY29tcG9zaXRpb25fdmFsdWVcbiAgICAjIC0gdXBkYXRlcyB0aGUgY29tcG9zaXRpb25fcmVmXG4gICAgI1xuICAgICMgQHBhcmFtIGRlbHRhIFRoZSBkZWx0YSB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIGNvbXBvc2l0aW9uX3ZhbHVlXG4gICAgI1xuICAgIGFwcGx5RGVsdGE6IChkZWx0YSwgb3BlcmF0aW9ucyktPlxuICAgICAgKG5ldyBvcHMuSW5zZXJ0IG51bGwsIGRlbHRhLCBvcGVyYXRpb25zLCBALCBudWxsLCBAZW5kLnByZXZfY2wsIEBlbmQpLmV4ZWN1dGUoKVxuICAgICAgdW5kZWZpbmVkXG5cbiAgICAjXG4gICAgIyBFbmNvZGUgdGhpcyBvcGVyYXRpb24gaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbiBiZSBwYXJzZWQgYnkgcmVtb3RlIHBlZXJzLlxuICAgICNcbiAgICBfZW5jb2RlOiAoanNvbiA9IHt9KS0+XG4gICAgICBjdXN0b20gPSBAZ2V0Q3VzdG9tVHlwZSgpLl9nZXRDb21wb3NpdGlvblZhbHVlKClcbiAgICAgIGpzb24uY29tcG9zaXRpb25fdmFsdWUgPSBjdXN0b20uY29tcG9zaXRpb25fdmFsdWVcbiAgICAgIGlmIGN1c3RvbS5jb21wb3NpdGlvbl92YWx1ZV9vcGVyYXRpb25zP1xuICAgICAgICBqc29uLmNvbXBvc2l0aW9uX3ZhbHVlX29wZXJhdGlvbnMgPSB7fVxuICAgICAgICBmb3IgbixvIG9mIGN1c3RvbS5jb21wb3NpdGlvbl92YWx1ZV9vcGVyYXRpb25zXG4gICAgICAgICAganNvbi5jb21wb3NpdGlvbl92YWx1ZV9vcGVyYXRpb25zW25dID0gby5nZXRVaWQoKVxuICAgICAgaWYgQGNvbXBvc2l0aW9uX3JlZj9cbiAgICAgICAganNvbi5jb21wb3NpdGlvbl9yZWYgPSBAY29tcG9zaXRpb25fcmVmLmdldFVpZCgpXG4gICAgICBlbHNlXG4gICAgICAgIGpzb24uY29tcG9zaXRpb25fcmVmID0gQHRtcF9jb21wb3NpdGlvbl9yZWZcbiAgICAgIHN1cGVyIGpzb25cblxuICBvcHMuQ29tcG9zaXRpb24ucGFyc2UgPSAoanNvbiktPlxuICAgIHtcbiAgICAgICd1aWQnIDogdWlkXG4gICAgICAnY3VzdG9tX3R5cGUnOiBjdXN0b21fdHlwZVxuICAgICAgJ2NvbXBvc2l0aW9uX3ZhbHVlJyA6IGNvbXBvc2l0aW9uX3ZhbHVlXG4gICAgICAnY29tcG9zaXRpb25fdmFsdWVfb3BlcmF0aW9ucycgOiBjb21wb3NpdGlvbl92YWx1ZV9vcGVyYXRpb25zXG4gICAgICAnY29tcG9zaXRpb25fcmVmJyA6IGNvbXBvc2l0aW9uX3JlZlxuICAgIH0gPSBqc29uXG4gICAgbmV3IHRoaXMoY3VzdG9tX3R5cGUsIGNvbXBvc2l0aW9uX3ZhbHVlLCBjb21wb3NpdGlvbl92YWx1ZV9vcGVyYXRpb25zLCB1aWQsIGNvbXBvc2l0aW9uX3JlZilcblxuXG4gICNcbiAgIyBAbm9kb2NcbiAgIyBBZGRzIHN1cHBvcnQgZm9yIHJlcGxhY2UuIFRoZSBSZXBsYWNlTWFuYWdlciBtYW5hZ2VzIFJlcGxhY2VhYmxlIG9wZXJhdGlvbnMuXG4gICMgRWFjaCBSZXBsYWNlYWJsZSBob2xkcyBhIHZhbHVlIHRoYXQgaXMgbm93IHJlcGxhY2VhYmxlLlxuICAjXG4gICMgVGhlIFRleHRUeXBlLXR5cGUgaGFzIGltcGxlbWVudGVkIHN1cHBvcnQgZm9yIHJlcGxhY2VcbiAgIyBAc2VlIFRleHRUeXBlXG4gICNcbiAgY2xhc3Mgb3BzLlJlcGxhY2VNYW5hZ2VyIGV4dGVuZHMgb3BzLkxpc3RNYW5hZ2VyXG4gICAgI1xuICAgICMgQHBhcmFtIHtPYmplY3R9IGV2ZW50X3Byb3BlcnRpZXMgRGVjb3JhdGVzIHRoZSBldmVudCB0aGF0IGlzIHRocm93biBieSB0aGUgUk1cbiAgICAjIEBwYXJhbSB7T2JqZWN0fSBldmVudF90aGlzIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IHNoYWxsIGJlIGV4ZWN1dGVkXG4gICAgIyBAcGFyYW0ge09wZXJhdGlvbn0gaW5pdGlhbF9jb250ZW50IEluaXRpYWxpemUgdGhpcyB3aXRoIGEgUmVwbGFjZWFibGUgdGhhdCBob2xkcyB0aGUgaW5pdGlhbF9jb250ZW50LlxuICAgICMgQHBhcmFtIHtPYmplY3R9IHVpZCBBIHVuaXF1ZSBpZGVudGlmaWVyLiBJZiB1aWQgaXMgdW5kZWZpbmVkLCBhIG5ldyB1aWQgd2lsbCBiZSBjcmVhdGVkLlxuICAgICMgQHBhcmFtIHtEZWxpbWl0ZXJ9IGJlZ2lubmluZyBSZWZlcmVuY2Ugb3IgT2JqZWN0LlxuICAgICMgQHBhcmFtIHtEZWxpbWl0ZXJ9IGVuZCBSZWZlcmVuY2Ugb3IgT2JqZWN0LlxuICAgIGNvbnN0cnVjdG9yOiAoY3VzdG9tX3R5cGUsIEBldmVudF9wcm9wZXJ0aWVzLCBAZXZlbnRfdGhpcywgdWlkKS0+XG4gICAgICBpZiBub3QgQGV2ZW50X3Byb3BlcnRpZXNbJ29iamVjdCddP1xuICAgICAgICBAZXZlbnRfcHJvcGVydGllc1snb2JqZWN0J10gPSBAZXZlbnRfdGhpcy5nZXRDdXN0b21UeXBlKClcbiAgICAgIHN1cGVyIGN1c3RvbV90eXBlLCB1aWRcblxuICAgIHR5cGU6IFwiUmVwbGFjZU1hbmFnZXJcIlxuXG4gICAgI1xuICAgICMgVGhpcyBkb2Vzbid0IHRocm93IHRoZSBzYW1lIGV2ZW50cyBhcyB0aGUgTGlzdE1hbmFnZXIuIFRoZXJlZm9yZSwgdGhlXG4gICAgIyBSZXBsYWNlYWJsZXMgYWxzbyBub3QgdGhyb3cgdGhlIHNhbWUgZXZlbnRzLlxuICAgICMgU28sIFJlcGxhY2VNYW5hZ2VyIGFuZCBMaXN0TWFuYWdlciBib3RoIGltcGxlbWVudFxuICAgICMgdGhlc2UgZnVuY3Rpb25zIHRoYXQgYXJlIGNhbGxlZCB3aGVuIGFuIEluc2VydGlvbiBpcyBleGVjdXRlZCAoYXQgdGhlIGVuZCkuXG4gICAgI1xuICAgICNcbiAgICBjYWxsRXZlbnREZWNvcmF0b3I6IChldmVudHMpLT5cbiAgICAgIGlmIG5vdCBAaXNEZWxldGVkKClcbiAgICAgICAgZm9yIGV2ZW50IGluIGV2ZW50c1xuICAgICAgICAgIGZvciBuYW1lLHByb3Agb2YgQGV2ZW50X3Byb3BlcnRpZXNcbiAgICAgICAgICAgIGV2ZW50W25hbWVdID0gcHJvcFxuICAgICAgICBAZXZlbnRfdGhpcy5jYWxsRXZlbnQgZXZlbnRzXG4gICAgICB1bmRlZmluZWRcblxuICAgICNcbiAgICAjIFRoaXMgaXMgY2FsbGVkLCB3aGVuIHRoZSBJbnNlcnQtdHlwZSB3YXMgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLlxuICAgICMgVE9ETzogY29uc2lkZXIgZG9pbmcgdGhpcyBpbiBhIG1vcmUgY29uc2lzdGVudCBtYW5uZXIuIFRoaXMgY291bGQgYWxzbyBiZVxuICAgICMgZG9uZSB3aXRoIGV4ZWN1dGUuIEJ1dCBjdXJyZW50bHksIHRoZXJlIGFyZSBubyBzcGVjaXRhbCBJbnNlcnQtb3BzIGZvciBMaXN0TWFuYWdlci5cbiAgICAjXG4gICAgY2FsbE9wZXJhdGlvblNwZWNpZmljSW5zZXJ0RXZlbnRzOiAob3BlcmF0aW9uKS0+XG4gICAgICBpZiBvcGVyYXRpb24ubmV4dF9jbC50eXBlIGlzIFwiRGVsaW1pdGVyXCIgYW5kIG9wZXJhdGlvbi5wcmV2X2NsLnR5cGUgaXNudCBcIkRlbGltaXRlclwiXG4gICAgICAgICMgdGhpcyByZXBsYWNlcyBhbm90aGVyIFJlcGxhY2VhYmxlXG4gICAgICAgIGlmIG5vdCBvcGVyYXRpb24uaXNfZGVsZXRlZCAjIFdoZW4gdGhpcyBpcyByZWNlaXZlZCBmcm9tIHRoZSBIQiwgdGhpcyBjb3VsZCBhbHJlYWR5IGJlIGRlbGV0ZWQhXG4gICAgICAgICAgb2xkX3ZhbHVlID0gb3BlcmF0aW9uLnByZXZfY2wudmFsKClcbiAgICAgICAgICBAY2FsbEV2ZW50RGVjb3JhdG9yIFtcbiAgICAgICAgICAgIHR5cGU6IFwidXBkYXRlXCJcbiAgICAgICAgICAgIGNoYW5nZWRCeTogb3BlcmF0aW9uLnVpZC5jcmVhdG9yXG4gICAgICAgICAgICBvbGRWYWx1ZTogb2xkX3ZhbHVlXG4gICAgICAgICAgXVxuICAgICAgICBvcGVyYXRpb24ucHJldl9jbC5hcHBseURlbGV0ZSgpXG4gICAgICBlbHNlIGlmIG9wZXJhdGlvbi5uZXh0X2NsLnR5cGUgaXNudCBcIkRlbGltaXRlclwiXG4gICAgICAgICMgVGhpcyB3b24ndCBiZSByZWNvZ25pemVkIGJ5IHRoZSB1c2VyLCBiZWNhdXNlIGFub3RoZXJcbiAgICAgICAgIyBjb25jdXJyZW50IG9wZXJhdGlvbiBpcyBzZXQgYXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIFJNXG4gICAgICAgIG9wZXJhdGlvbi5hcHBseURlbGV0ZSgpXG4gICAgICBlbHNlICMgcHJldiBfYW5kXyBuZXh0IGFyZSBEZWxpbWl0ZXJzLiBUaGlzIGlzIHRoZSBmaXJzdCBjcmVhdGVkIFJlcGxhY2VhYmxlIGluIHRoZSBSTVxuICAgICAgICBAY2FsbEV2ZW50RGVjb3JhdG9yIFtcbiAgICAgICAgICB0eXBlOiBcImFkZFwiXG4gICAgICAgICAgY2hhbmdlZEJ5OiBvcGVyYXRpb24udWlkLmNyZWF0b3JcbiAgICAgICAgXVxuICAgICAgdW5kZWZpbmVkXG5cbiAgICBjYWxsT3BlcmF0aW9uU3BlY2lmaWNEZWxldGVFdmVudHM6IChvcGVyYXRpb24sIGRlbF9vcCktPlxuICAgICAgaWYgb3BlcmF0aW9uLm5leHRfY2wudHlwZSBpcyBcIkRlbGltaXRlclwiXG4gICAgICAgIEBjYWxsRXZlbnREZWNvcmF0b3IgW1xuICAgICAgICAgIHR5cGU6IFwiZGVsZXRlXCJcbiAgICAgICAgICBjaGFuZ2VkQnk6IGRlbF9vcC51aWQuY3JlYXRvclxuICAgICAgICAgIG9sZFZhbHVlOiBvcGVyYXRpb24udmFsKClcbiAgICAgICAgXVxuXG5cbiAgICAjXG4gICAgIyBSZXBsYWNlIHRoZSBleGlzdGluZyB3b3JkIHdpdGggYSBuZXcgd29yZC5cbiAgICAjXG4gICAgIyBAcGFyYW0gY29udGVudCB7T3BlcmF0aW9ufSBUaGUgbmV3IHZhbHVlIG9mIHRoaXMgUmVwbGFjZU1hbmFnZXIuXG4gICAgIyBAcGFyYW0gcmVwbGFjZWFibGVfdWlkIHtVSUR9IE9wdGlvbmFsOiBVbmlxdWUgaWQgb2YgdGhlIFJlcGxhY2VhYmxlIHRoYXQgaXMgY3JlYXRlZFxuICAgICNcbiAgICByZXBsYWNlOiAoY29udGVudCwgcmVwbGFjZWFibGVfdWlkKS0+XG4gICAgICBvID0gQGdldExhc3RPcGVyYXRpb24oKVxuICAgICAgcmVscCA9IChuZXcgb3BzLkluc2VydCBudWxsLCBjb250ZW50LCBudWxsLCBALCByZXBsYWNlYWJsZV91aWQsIG8sIG8ubmV4dF9jbCkuZXhlY3V0ZSgpXG4gICAgICAjIFRPRE86IGRlbGV0ZSByZXBsIChmb3IgZGVidWdnaW5nKVxuICAgICAgdW5kZWZpbmVkXG5cbiAgICBpc0NvbnRlbnREZWxldGVkOiAoKS0+XG4gICAgICBAZ2V0TGFzdE9wZXJhdGlvbigpLmlzRGVsZXRlZCgpXG5cbiAgICBkZWxldGVDb250ZW50OiAoKS0+XG4gICAgICBsYXN0X29wID0gQGdldExhc3RPcGVyYXRpb24oKVxuICAgICAgaWYgKG5vdCBsYXN0X29wLmlzRGVsZXRlZCgpKSBhbmQgbGFzdF9vcC50eXBlIGlzbnQgXCJEZWxpbWl0ZXJcIlxuICAgICAgICAobmV3IG9wcy5EZWxldGUgbnVsbCwgdW5kZWZpbmVkLCBAZ2V0TGFzdE9wZXJhdGlvbigpLnVpZCkuZXhlY3V0ZSgpXG4gICAgICB1bmRlZmluZWRcblxuICAgICNcbiAgICAjIEdldCB0aGUgdmFsdWUgb2YgdGhpc1xuICAgICMgQHJldHVybiB7U3RyaW5nfVxuICAgICNcbiAgICB2YWw6ICgpLT5cbiAgICAgIG8gPSBAZ2V0TGFzdE9wZXJhdGlvbigpXG4gICAgICAjaWYgbyBpbnN0YW5jZW9mIG9wcy5EZWxpbWl0ZXJcbiAgICAgICAgIyB0aHJvdyBuZXcgRXJyb3IgXCJSZXBsYWNlIE1hbmFnZXIgZG9lc24ndCBjb250YWluIGFueXRoaW5nLlwiXG4gICAgICBvLnZhbD8oKSAjID8gLSBmb3IgdGhlIGNhc2UgdGhhdCAoY3VycmVudGx5KSB0aGUgUk0gZG9lcyBub3QgY29udGFpbiBhbnl0aGluZyAodGhlbiBvIGlzIGEgRGVsaW1pdGVyKVxuXG4gIGJhc2ljX29wc1xuIiwiXG5zdHJ1Y3R1cmVkX29wc191bmluaXRpYWxpemVkID0gcmVxdWlyZSBcIi4vT3BlcmF0aW9ucy9TdHJ1Y3R1cmVkXCJcblxuSGlzdG9yeUJ1ZmZlciA9IHJlcXVpcmUgXCIuL0hpc3RvcnlCdWZmZXJcIlxuRW5naW5lID0gcmVxdWlyZSBcIi4vRW5naW5lXCJcbmFkYXB0Q29ubmVjdG9yID0gcmVxdWlyZSBcIi4vQ29ubmVjdG9yQWRhcHRlclwiXG5cbmNyZWF0ZVkgPSAoY29ubmVjdG9yKS0+XG4gIGlmIGNvbm5lY3Rvci51c2VyX2lkP1xuICAgIHVzZXJfaWQgPSBjb25uZWN0b3IudXNlcl9pZCAjIFRPRE86IGNoYW5nZSB0byBnZXRVbmlxdWVJZCgpXG4gIGVsc2VcbiAgICB1c2VyX2lkID0gXCJfdGVtcFwiXG4gICAgY29ubmVjdG9yLndoZW5fcmVjZWl2ZWRfc3RhdGVfdmVjdG9yX2xpc3RlbmVycyA9IFsoc3RhdGVfdmVjdG9yKS0+XG4gICAgICAgIEhCLnNldFVzZXJJZCB0aGlzLnVzZXJfaWQsIHN0YXRlX3ZlY3RvclxuICAgICAgXVxuICBIQiA9IG5ldyBIaXN0b3J5QnVmZmVyIHVzZXJfaWRcbiAgb3BzX21hbmFnZXIgPSBzdHJ1Y3R1cmVkX29wc191bmluaXRpYWxpemVkIEhCLCB0aGlzLmNvbnN0cnVjdG9yXG4gIG9wcyA9IG9wc19tYW5hZ2VyLm9wZXJhdGlvbnNcblxuICBlbmdpbmUgPSBuZXcgRW5naW5lIEhCLCBvcHNcbiAgYWRhcHRDb25uZWN0b3IgY29ubmVjdG9yLCBlbmdpbmUsIEhCLCBvcHNfbWFuYWdlci5leGVjdXRpb25fbGlzdGVuZXJcblxuICBvcHMuT3BlcmF0aW9uLnByb3RvdHlwZS5IQiA9IEhCXG4gIG9wcy5PcGVyYXRpb24ucHJvdG90eXBlLm9wZXJhdGlvbnMgPSBvcHNcbiAgb3BzLk9wZXJhdGlvbi5wcm90b3R5cGUuZW5naW5lID0gZW5naW5lXG4gIG9wcy5PcGVyYXRpb24ucHJvdG90eXBlLmNvbm5lY3RvciA9IGNvbm5lY3RvclxuICBvcHMuT3BlcmF0aW9uLnByb3RvdHlwZS5jdXN0b21fdHlwZXMgPSB0aGlzLmNvbnN0cnVjdG9yXG5cbiAgY3QgPSBuZXcgY3JlYXRlWS5PYmplY3QoKVxuICBtb2RlbCA9IG5ldyBvcHMuTWFwTWFuYWdlcihjdCwgSEIuZ2V0UmVzZXJ2ZWRVbmlxdWVJZGVudGlmaWVyKCkpLmV4ZWN1dGUoKVxuICBjdC5fc2V0TW9kZWwgbW9kZWxcbiAgY3RcblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVZXG5pZiB3aW5kb3c/XG4gIHdpbmRvdy5ZID0gY3JlYXRlWVxuXG5jcmVhdGVZLk9iamVjdCA9IHJlcXVpcmUgXCIuL09iamVjdFR5cGVcIlxuIiwidmFyIFRyZWVCYXNlID0gcmVxdWlyZSgnLi90cmVlYmFzZScpO1xuLyoqIGFsZ29yaXRobSBmcm9tIENvcm1lbiwgTGVpc2Vyc29uIC0gSW50cm9kdWN0aW9uIHRvIGFsZ29yaXRobSAqKi9cblxuZnVuY3Rpb24gUkJUcmVlKGNvbXBhcmF0b3IpIHtcbiAgICB0aGlzLl9yb290ID0gbnVsbDtcbiAgICB0aGlzLl9uaWwgPSBuZXcgTm9kZSgnbmlsJyk7XG4gICAgdGhpcy5fbmlsLnJlZCA9IGZhbHNlO1xuICAgIHRoaXMuX25pbC53ZWlnaHQgPSAwO1xufVxuXG5SQlRyZWUucHJvdG90eXBlID0gbmV3IFRyZWVCYXNlKCk7XG5cblJCVHJlZS5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24ocG9zaXRpb24sIGRhdGEpIHtcbiAgdmFyIG5vZGVUb0luc2VydCA9IG5ldyBOb2RlKGRhdGEpO1xuICBpZiAodGhpcy5pbnNlcnRfbm9kZShwb3NpdGlvbiwgbm9kZVRvSW5zZXJ0KSkge1xuICAgIHJldHVybiBub2RlVG9JbnNlcnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5SQlRyZWUucHJvdG90eXBlLmluc2VydF9ub2RlID0gZnVuY3Rpb24ocG9zaXRpb24sIG5vZGVUb0luc2VydCkge1xuICB2YXIgbm9kZSA9IHRoaXMuX3Jvb3Q7XG4gIHZhciBpbnNlcnRBZnRlcjtcblxuICBpZiAoIW5vZGUpIHtcbiAgICB0aGlzLl9yb290ID0gbm9kZVRvSW5zZXJ0O1xuICAgIHRoaXMuX3Jvb3QucmVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLndlaWdodCA9PT0gcG9zaXRpb24pIHsgLy8gSW5zZXJ0IGFmdGVyIG1heCBvZiBub2RlIHN1YnRyZWVcbiAgICAgIGluc2VydEFmdGVyID0gbm9kZS5tYXhfdHJlZShmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIG5vZGUud2VpZ2h0ICs9IDE7XG4gICAgICB9KTtcbiAgICAgIGluc2VydEFmdGVyLnNldF9jaGlsZCgncmlnaHQnLCBub2RlVG9JbnNlcnQpO1xuICAgICAgbm9kZVRvSW5zZXJ0LnBhcmVudCA9IGluc2VydEFmdGVyO1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlZnQgPSBub2RlLmdldF9jaGlsZCgnbGVmdCcpO1xuICAgICAgcmlnaHQgPSBub2RlLmdldF9jaGlsZCgncmlnaHQnKTtcbiAgICAgIGlmICghbGVmdCAmJiBwb3NpdGlvbiA9PT0gMCkge1xuICAgICAgICBub2RlLndlaWdodCArPSAxO1xuICAgICAgICBub2RlLnNldF9jaGlsZCgnbGVmdCcsIG5vZGVUb0luc2VydCk7XG4gICAgICAgIG5vZGVUb0luc2VydC5wYXJlbnQgPSBub2RlO1xuICAgICAgICBicmVhaztcblxuICAgICAgfSBlbHNlIGlmIChsZWZ0ICYmIGxlZnQud2VpZ2h0ID49IHBvc2l0aW9uKSB7XG4gICAgICAgIG5vZGUud2VpZ2h0ICs9IDE7XG4gICAgICAgIG5vZGUgPSBsZWZ0O1xuXG4gICAgICB9IGVsc2UgaWYgKHJpZ2h0KSB7XG4gICAgICAgIHBvc2l0aW9uIC09IChsZWZ0PyBsZWZ0LndlaWdodDogMCkgKyAxO1xuICAgICAgICBub2RlLndlaWdodCArPSAxO1xuICAgICAgICBub2RlID0gcmlnaHQ7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUud2VpZ2h0ICs9IDE7XG4gICAgICAgIG5vZGUuc2V0X2NoaWxkKCdyaWdodCcsIG5vZGVUb0luc2VydCk7XG4gICAgICAgIG5vZGVUb0luc2VydC5wYXJlbnQgPSBub2RlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0aGlzLmluc2VydF9jb3JyZWN0aW9uKG5vZGVUb0luc2VydCk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuUkJUcmVlLnByb3RvdHlwZS5pbnNlcnRfYmV0d2VlbiA9IGZ1bmN0aW9uKG9uTGVmdCwgb25SaWdodCwgZGF0YSkge1xuICB2YXIgbmV3Tm9kZSA9IG5ldyBOb2RlKGRhdGEpO1xuICAvLyBvbkxlZnQgYW5kIG9uUmlnaHQgYXJlIG5laWdoYm9ycywgc28gdGhleSBjYW4ndCBoYXZlIGFuIGVsZW1lbnQgaW4gYmV0d2Vlbi5cbiAgLy8gRm9yIGV4YW1wbGUsIGlmIG9uTGVmdCBleGlzdHMsIGl0cyByaWdodCBuZWlnaGJvciBpcyBlaXRoZXIgbmlsIG9yIHJpZ2h0LiBJZiBpdCdzIG9uUmlnaHQsXG4gIC8vIHRoZW4gb25SaWdodCBoYXMgbm8gY2hpbGQuIElmIG5laXRoZXIgbGVmdCBhbmQgcmlnaHQgZXhpc3QsIHRoZSB0cmVlIGlzIGVtcHR5LlxuICBpZiAob25MZWZ0ICYmICFvbkxlZnQucmlnaHQpIHtcbiAgICBvbkxlZnQucmlnaHQgPSBuZXdOb2RlO1xuICAgIG5ld05vZGUucGFyZW50ID0gb25MZWZ0O1xuXG4gICAgdGhpcy5pbnNlcnRfY29ycmVjdGlvbihuZXdOb2RlKTtcbiAgfSBlbHNlIGlmIChvblJpZ2h0ICYmICFvblJpZ2h0LmxlZnQpIHtcbiAgICBvblJpZ2h0LmxlZnQgPSBuZXdOb2RlO1xuICAgIG5ld05vZGUucGFyZW50ID0gb25SaWdodDtcblxuICAgIHRoaXMuaW5zZXJ0X2NvcnJlY3Rpb24obmV3Tm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5pbnNlcnRfbm9kZSgwLCBuZXdOb2RlKTtcbiAgfVxuICBuZXdOb2RlLnRyYXZlcnNlX3VwKGZ1bmN0aW9uKG5vZGUsIHBhcmVudCkge1xuICAgIHBhcmVudC53ZWlnaHQgPSAocGFyZW50LmxlZnQgPyBwYXJlbnQubGVmdC53ZWlnaHQgOiAwKSArXG4gICAgICAgIChwYXJlbnQucmlnaHQgPyBwYXJlbnQucmlnaHQud2VpZ2h0IDogMCkgKyAxO1xuICB9KTtcblxuICByZXR1cm4gbmV3Tm9kZTtcbn07XG5cblJCVHJlZS5wcm90b3R5cGUucm90YXRlID0gZnVuY3Rpb24oc2lkZSwgbm9kZSkge1xuICAvLyBhbGwgdGhlIGNvbW1lbnQgYXJlIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCBzaWRlID09PSAnbGVmdCdcbiAgdmFyIG5laWdoYm9yO1xuXG4gIC8vIGdldCByaWdodCBuZWlnaGJvclxuICBuZWlnaGJvciA9IG5vZGUuZ2V0X2NoaWxkKHNpZGUsIHRydWUpO1xuICAvLyBuZWlnaGJvcidzIGxlZnQgdHJlZSBiZWNvbWVzIG5vZGUncyByaWdodCB0cmVlXG4gIG5vZGUuc2V0X2NoaWxkKHNpZGUsIG5laWdoYm9yLmdldF9jaGlsZChzaWRlKSwgdHJ1ZSk7XG5cbiAgLy8gaWYgdGhpcyByaWdodCB0cmVlIHdhcyBub24tZW1wdHlcbiAgaWYgKG5laWdoYm9yLmdldF9jaGlsZChzaWRlKSkge1xuICAgIG5laWdoYm9yLmdldF9jaGlsZChzaWRlKS5wYXJlbnQgPSBub2RlOyAvLyBhdHRhY2ggbmVpZ2hib3IncyBsZWZ0IGNoaWxkIHRvIG5vZGVcbiAgfVxuICBuZWlnaGJvci5wYXJlbnQgPSBub2RlLnBhcmVudDsgLy8gbGluayBuZWlnaGJvcidzIHBhcmVudCB0byBub2RlJ3MgcGFyZW50XG5cbiAgaWYgKCFub2RlLnBhcmVudCkgeyAvLyBubyBwYXJlbnQgPT09IGlzX3Jvb3RcbiAgICB0aGlzLl9yb290ID0gbmVpZ2hib3I7XG4gIH0gZWxzZSBpZiAobm9kZSA9PT0gbm9kZS5wYXJlbnQuZ2V0X2NoaWxkKHNpZGUpKXsgLy8gbm9kZSBpcyBsZWZ0IGNoaWxkXG4gICAgbm9kZS5wYXJlbnQuc2V0X2NoaWxkKHNpZGUsIG5laWdoYm9yKTsgLy8gbm9kZSdzIHBhcmVudCBsZWZ0IGNoaWxkIGlzIG5vdyBuZWlnaGJvclxuICB9IGVsc2Uge1xuICAgIG5vZGUucGFyZW50LnNldF9jaGlsZChzaWRlLCBuZWlnaGJvciwgdHJ1ZSk7IC8vIG5vZGUncyBwYXJlbnQgcmlnaHQgY2hpbGQgaXMgbm93IG5laWdoYm9yXG4gIH1cblxuICBuZWlnaGJvci5zZXRfY2hpbGQoc2lkZSwgbm9kZSk7IC8vIGF0dGFjaCBub2RlIG9uIGxlZnQgb2YgY2hpbGRcbiAgbm9kZS5wYXJlbnQgPSBuZWlnaGJvcjsgLy8gc2V0IG5vZGUncyBwYXJlbnQgdG8gbmVpZ2hib3JcblxuICAvLyB1cGRhdGUgbm9kZSdzIHdlaWdodCBmaXJzdCwgdGhlblxuICBub2RlLndlaWdodCA9IChub2RlLmxlZnQ/IG5vZGUubGVmdC53ZWlnaHQ6IDApICsgKG5vZGUucmlnaHQ/IG5vZGUucmlnaHQud2VpZ2h0OiAwKSArIDE7XG4gIG5laWdoYm9yLndlaWdodCA9IChuZWlnaGJvci5sZWZ0PyBuZWlnaGJvci5sZWZ0LndlaWdodDogMCkgKyAobmVpZ2hib3IucmlnaHQ/IG5laWdoYm9yLnJpZ2h0LndlaWdodDogMCkgKyAxO1xufTtcblxuUkJUcmVlLnByb3RvdHlwZS5pbnNlcnRfY29ycmVjdGlvbiA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBmdW5jdGlvbiBoZWxwZXIoc2lkZSkge1xuICAgIHZhciB1bmNsZTtcbiAgICB1bmNsZSA9IG5vZGUucGFyZW50LnBhcmVudC5nZXRfY2hpbGQoc2lkZSwgdHJ1ZSk7XG5cbiAgICBpZiAodW5jbGUgJiYgdW5jbGUucmVkKSB7IC8vIGlmIHVuY2xlIGlzIHVuZGVmaW5lZCwgaXQncyBhIGxlYWYgc28gaXQncyBibGFja1xuICAgICAgbm9kZS5wYXJlbnQucmVkICAgICAgICA9IGZhbHNlO1xuICAgICAgdW5jbGUucmVkICAgICAgICAgICAgICA9IGZhbHNlO1xuICAgICAgbm9kZS5wYXJlbnQucGFyZW50LnJlZCA9IHRydWU7XG5cbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudC5wYXJlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChub2RlID09PSBub2RlLnBhcmVudC5nZXRfY2hpbGQoc2lkZSwgdHJ1ZSkpIHtcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50O1xuICAgICAgICBzZWxmLnJvdGF0ZShzaWRlLCBub2RlKTtcbiAgICAgIH1cblxuICAgICAgbm9kZS5wYXJlbnQucmVkICAgICAgICA9IGZhbHNlO1xuICAgICAgbm9kZS5wYXJlbnQucGFyZW50LnJlZCA9IHRydWU7XG5cbiAgICAgIHZhciBvcHBvc2l0ZVNpZGUgPSBzaWRlID09PSAnbGVmdCc/ICdyaWdodCc6ICdsZWZ0JztcbiAgICAgIHNlbGYucm90YXRlKG9wcG9zaXRlU2lkZSwgbm9kZS5wYXJlbnQucGFyZW50KTtcbiAgICB9XG4gIH1cblxuXG4gIHdoaWxlIChub2RlLnBhcmVudCAmJiBub2RlLnBhcmVudC5yZWQpIHsgLy8gaXMgdGhlcmUncyBubyBub2RlLnBhcmVudCwgdGhlbiBpdCBtZWFucyB0aGUgcGFyZW50XG4gICAgLy8gaXMgbmlsIHdoaWNoIGlzIGJsYWNrXG5cbiAgICAvLyBpZiBub2RlJ3MgcGFyZW50IGlzIG9uIGxlZnQgb2YgaGlzIHBhcmVudFxuICAgIGlmIChub2RlLnBhcmVudCA9PT0gbm9kZS5wYXJlbnQucGFyZW50LmdldF9jaGlsZCgnbGVmdCcpKSB7IC8vIENoZWNrIHRoYXQgdGhlcmUgaXMgYSBncmFuZHBhcmVudFxuICAgICAgaGVscGVyKCdsZWZ0Jyk7XG4gICAgfSBlbHNlIGlmIChub2RlLnBhcmVudCA9PT0gbm9kZS5wYXJlbnQucGFyZW50LmdldF9jaGlsZCgncmlnaHQnKSl7XG4gICAgICBoZWxwZXIoJ3JpZ2h0Jyk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5fcm9vdC5yZWQgPSBmYWxzZTtcblxufTtcblxuUkJUcmVlLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24oKSB7XG4gIHZhciBub2RlID0gdGhpcy5maW5kTm9kZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICBpZiAobm9kZSkge1xuICAgIHJldHVybiBub2RlLmRhdGE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbi8qKiBGaW5kIHRoZSBub2RlIGF0IHBvc2l0aW9uIEBwb3NpdGlvbiBhbmQgcmV0dXJuIGl0LiBJZiBubyBub2RlIGlzIGZvdW5kLCByZXR1cm5zIG51bGwuXG4gKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHBhc3MgYSBmdW5jdGlvbiBhcyBzZWNvbmQgYXJndW1lbnQuIEl0IHdpbGwgYmUgY2FsbGVkXG4gKiB3aXRoIGVhY2ggbm9kZSB0cmF2ZXJzZWQgZXhjZXB0IGZvciB0aGUgb25lIGZvdW5kLlxuKiovXG5SQlRyZWUucHJvdG90eXBlLmZpbmROb2RlID0gZnVuY3Rpb24ocG9zaXRpb24sIGZ1bikge1xuICAvLyBpZiB0aGUgd2VpZ2h0IGlzICduJywgdGhlIGJpZ2dlc3QgaW5kZXggaXMgbi0xLCBzbyB3ZSBjaGVjayB0aGF0IHBvc2l0aW9uID49IHNpemVcbiAgaWYgKHBvc2l0aW9uID49IHRoaXMuZ2V0X3NpemUoKSB8fCBwb3NpdGlvbiA8IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgbm9kZSA9IHRoaXMuX3Jvb3Q7XG5cbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBGaW5kIG5vZGUgdG8gZGVsZXRlXG4gIHdoaWxlIChwb3NpdGlvbiA+IDAgfHwgKHBvc2l0aW9uID09PSAwICYmIG5vZGUubGVmdCkpIHtcbiAgICBsZWZ0ID0gbm9kZS5sZWZ0O1xuICAgIHJpZ2h0ID0gbm9kZS5yaWdodDtcblxuICAgIGlmIChsZWZ0ICYmIGxlZnQud2VpZ2h0ID4gcG9zaXRpb24pIHtcbiAgICAgIC8vIHdoZW4gdGhlcmUncyBhIGxlZnQgbmVpZ2hib3Igd2l0aCBhIHdlaWdodCA+IHBvc2l0aW9uIHRvIHJlbW92ZSxcbiAgICAgIC8vIGdvIGludG8gdGhpcyBzdWJ0cmVlIGFuZCBkZWNyZWFzZSB0aGUgc3VidHJlZSB3ZWlnaHRcbiAgICAgIGlmIChmdW4pIHtcbiAgICAgICAgZnVuKG5vZGUpO1xuICAgICAgfVxuICAgICAgbm9kZSA9IGxlZnQ7XG5cbiAgICB9IGVsc2UgaWYgKCghbGVmdCAmJiBwb3NpdGlvbiA9PT0gMCkgfHwgKGxlZnQgJiYgbGVmdC53ZWlnaHQgPT09IHBvc2l0aW9uKSkge1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmIChyaWdodCkge1xuICAgICAgLy8gd2hlbiB0aGVyZSdzIGEgcmlnaHQgc3VidGVlLCBnbyBpbnRvIGl0IGFuZCBkZWNyZWFzZSB0aGUgcG9zaXRpb25cbiAgICAgIC8vIGJ5IHRoZSB3ZWlnaHQgb2YgdGhlIGxlZnQgc3VidHJlZSAtIDEgKyAxIChmb3IgdGhlIHByZXZpb3VzIG5vZGUpXG4gICAgICBpZiAoZnVuKSB7XG4gICAgICAgIGZ1bihub2RlKTtcbiAgICAgIH1cbiAgICAgIG5vZGUgPSByaWdodDtcbiAgICAgIHBvc2l0aW9uIC09IChsZWZ0PyBsZWZ0LndlaWdodDogMCkgKyAxO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGV4Y2VwdCBpZiB0aGUgcG9zaXRpb24gaXMgZ3JlYXRlciB0aGFuIHRoZSBzaXplIG9mIHRoZSB0cmVlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgc2hvdWxkIG5vdCBoYXBwZW4nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59O1xuXG5SQlRyZWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG4gIC8vIGlmIHRoZSB3ZWlnaHQgaXMgJ24nLCB0aGUgYmlnZ2VzdCBpbmRleCBpcyBuLTEsIHNvIHdlIGNoZWNrIHRoYXQgcG9zaXRpb24gPj0gc2l6ZVxuICB2YXIgbm9kZVRvUmVtb3ZlO1xuXG4gIG5vZGVUb1JlbW92ZSA9IHRoaXMuZmluZE5vZGUocG9zaXRpb24sIGZ1bmN0aW9uKG5vZGUpIHsgbm9kZS53ZWlnaHQgLS07IH0pO1xuXG4gIHJldHVybiB0aGlzLnJlbW92ZV9oZWxwZXIobm9kZVRvUmVtb3ZlKTtcbn07XG5cblJCVHJlZS5wcm90b3R5cGUucmVtb3ZlX2hlbHBlciA9IGZ1bmN0aW9uKG5vZGVUb1JlbW92ZSkge1xuICB2YXIgbGVmdCwgcmlnaHQsIG5leHROb2RlLCBjaGlsZE5vZGUsIHBhcmVudDtcblxuICAvLyBpZiB0aGVyZSdzIG9ubHkgb25lIGNoaWxkLCByZXBsYWNlIHRoZSBub2RlVG9SZW1vdmUgdG8gZGVsZXRlIGJ5IGl0J3MgY2hpbGQgYW5kIHVwZGF0ZVxuICAvLyB0aGUgcmVmcy5cbiAgLy8gaWYgdGhlcmUncyB0d28gY2hpbGRyZW4sIGZpbmQgaXQncyBzdWNjZXNzb3IgYW5kIHJlcGxhY2UgdGhlIG5vZGVUb1JlbW92ZSB0byBkZWxldGUgYnkgaGlzIHN1Y2Nlc3NvclxuICAvLyBhbmQgdXBkYXRlIHRoZSByZWZzXG5cbiAgaWYgKCFub2RlVG9SZW1vdmUubGVmdCB8fCAhbm9kZVRvUmVtb3ZlLnJpZ2h0KSB7XG4gICAgbmV4dE5vZGUgPSBub2RlVG9SZW1vdmU7XG4gIH0gZWxzZSB7XG4gICAgbmV4dE5vZGUgPSBub2RlVG9SZW1vdmUubmV4dChmdW5jdGlvbihub2RlKSB7XG4gICAgICBub2RlLndlaWdodCAtPSAxO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKG5leHROb2RlLmxlZnQpIHtcbiAgICBjaGlsZE5vZGUgPSBuZXh0Tm9kZS5sZWZ0O1xuICAgIHBhcmVudCA9IG5leHROb2RlLnBhcmVudDtcbiAgfSBlbHNlIHtcbiAgICBjaGlsZE5vZGUgPSBuZXh0Tm9kZS5yaWdodDtcbiAgICBwYXJlbnQgPSBuZXh0Tm9kZS5wYXJlbnQ7XG4gIH1cblxuICBpZiAoY2hpbGROb2RlKSB7XG4gICAgY2hpbGROb2RlLnBhcmVudCA9IG5leHROb2RlLnBhcmVudDtcbiAgfVxuXG5cbiAgaWYgKCFuZXh0Tm9kZS5wYXJlbnQpIHtcbiAgICB0aGlzLl9yb290ID0gY2hpbGROb2RlO1xuICB9IGVsc2Uge1xuICAgIGlmIChuZXh0Tm9kZSA9PT0gbmV4dE5vZGUucGFyZW50LmxlZnQpIHtcbiAgICAgIG5leHROb2RlLnBhcmVudC5sZWZ0ID0gY2hpbGROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0Tm9kZS5wYXJlbnQucmlnaHQgPSBjaGlsZE5vZGU7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVwbGFjZSBub2RlVG9SZW1vdmUncyBkYXRhIGJ5IG5leHROb2RlJ3MgKHNhbWUgYXMgcmVtb3Zpbmcgbm9kZVRvUmVtb3ZlLCB0aGVuIGluc2VydGluZyBuZXh0Tm9kZSBhdCBoaXMgcGxhY2VcbiAgLy8gYnV0IGVhc2llciBhbmQgbW9yZSBlZmZpY2llbnQpXG4gIGlmIChuZXh0Tm9kZSAhPT0gbm9kZVRvUmVtb3ZlKSB7XG4gICAgbm9kZVRvUmVtb3ZlLmRhdGEgPSBuZXh0Tm9kZS5kYXRhO1xuICAgIG5vZGVUb1JlbW92ZS53ZWlnaHQgPSAobm9kZVRvUmVtb3ZlLmxlZnQ/IG5vZGVUb1JlbW92ZS5sZWZ0LndlaWdodDogMCkgK1xuICAgICAgKG5vZGVUb1JlbW92ZS5yaWdodD8gbm9kZVRvUmVtb3ZlLnJpZ2h0LndlaWdodDogMCkgKyAxO1xuICB9XG5cbiAgaWYgKCFuZXh0Tm9kZS5yZWQpIHtcbiAgICB0aGlzLnJlbW92ZV9jb3JyZWN0aW9uKGNoaWxkTm9kZSwgcGFyZW50KTtcbiAgfVxuXG4gIHJldHVybiBuZXh0Tm9kZTtcbn07XG5cblJCVHJlZS5wcm90b3R5cGUucmVtb3ZlX25vZGUgPSBmdW5jdGlvbihub2RlKSB7XG4gIG5vZGUudHJhdmVyc2VfdXAoZnVuY3Rpb24obm9kZSwgcGFyZW50KSB7XG4gICAgcGFyZW50LndlaWdodCAtLTtcbiAgfSk7XG5cbiAgcmV0dXJuIHRoaXMucmVtb3ZlX2hlbHBlcihub2RlKTtcbn07XG5cblJCVHJlZS5wcm90b3R5cGUucmVtb3ZlX2NvcnJlY3Rpb24gPSBmdW5jdGlvbihub2RlLCBwYXJlbnQpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB2YXIgb3Bwb3NpdGVTaWRlO1xuICB2YXIgaGVscGVyID0gZnVuY3Rpb24oc2lkZSkge1xuICAgIHZhciBuZWlnaGJvciA9IHBhcmVudC5nZXRfY2hpbGQoc2lkZSwgdHJ1ZSk7XG5cbiAgICBpZiAobmVpZ2hib3IgJiYgbmVpZ2hib3IucmVkKSB7XG4gICAgICBuZWlnaGJvci5yZWQgPSBmYWxzZTtcbiAgICAgIHBhcmVudC5yZWQgICA9IHRydWU7XG5cbiAgICAgIHNlbGYucm90YXRlKHNpZGUsIHBhcmVudCk7XG4gICAgICBuZWlnaGJvciA9IHBhcmVudC5nZXRfY2hpbGQoc2lkZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKCghbmVpZ2hib3IubGVmdCB8fCAhbmVpZ2hib3IubGVmdC5yZWQpICYmICghbmVpZ2hib3IucmlnaHQgfHwgIW5laWdoYm9yLnJpZ2h0LnJlZCApKSB7XG4gICAgICBuZWlnaGJvci5yZWQgPSB0cnVlO1xuICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgIHBhcmVudCA9IG5vZGUucGFyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIW5laWdoYm9yLmdldF9jaGlsZChzaWRlLCB0cnVlKSB8fCAhbmVpZ2hib3IuZ2V0X2NoaWxkKHNpZGUsIHRydWUpLnJlZCkge1xuICAgICAgICBpZiAobmVpZ2hib3IuZ2V0X2NoaWxkKHNpZGUpKSB7XG4gICAgICAgICAgbmVpZ2hib3IuZ2V0X2NoaWxkKHNpZGUpLnJlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIG5laWdoYm9yLnJlZCA9IHRydWU7XG5cbiAgICAgICAgb3Bwb3NpdGVTaWRlID0gc2lkZSA9PT0gJ2xlZnQnPyAncmlnaHQnOiAnbGVmdCc7XG4gICAgICAgIHNlbGYucm90YXRlKG9wcG9zaXRlU2lkZSwgbmVpZ2hib3IpO1xuICAgICAgICBuZWlnaGJvciA9IHBhcmVudC5nZXRfY2hpbGQoc2lkZSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIG5laWdoYm9yLnJlZCA9IHBhcmVudD8gcGFyZW50LnJlZDogZmFsc2U7XG4gICAgICBwYXJlbnQucmVkICAgPSBmYWxzZTtcbiAgICAgIGlmIChuZWlnaGJvci5nZXRfY2hpbGQoc2lkZSwgdHJ1ZSkpIHtcbiAgICAgICAgbmVpZ2hib3IuZ2V0X2NoaWxkKHNpZGUsIHRydWUpLnJlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBzZWxmLnJvdGF0ZShzaWRlLCBwYXJlbnQpO1xuICAgICAgbm9kZSA9IHNlbGYuX3Jvb3Q7XG4gICAgICBwYXJlbnQgPSBub2RlLnBhcmVudDtcbiAgICB9XG4gIH07XG4gIHdoaWxlIChub2RlICE9PSB0aGlzLl9yb290ICYmICghbm9kZSB8fCAhbm9kZS5yZWQpKSB7XG4gICAgaWYgKG5vZGUgPT09IHBhcmVudC5nZXRfY2hpbGQoJ2xlZnQnKSkge1xuICAgICAgdG1wID0gaGVscGVyKCdsZWZ0Jyk7XG4gICAgfSBlbHNlIGlmIChub2RlID09PSBwYXJlbnQuZ2V0X2NoaWxkKCdyaWdodCcpKSB7XG4gICAgICB0bXAgPSBoZWxwZXIoJ3JpZ2h0Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vZGUpIHtcbiAgICBub2RlLnJlZCA9IGZhbHNlO1xuICB9XG59O1xuXG5SQlRyZWUucHJvdG90eXBlLmdldF9zaXplID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAodGhpcy5fcm9vdD8gdGhpcy5fcm9vdC53ZWlnaHQgOiAwKTtcbn07XG5cbmZ1bmN0aW9uIE5vZGUoZGF0YSkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5sZWZ0ID0gbnVsbDtcbiAgICB0aGlzLnJpZ2h0ID0gbnVsbDtcbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgdGhpcy5yZWQgPSB0cnVlO1xuICAgIHRoaXMud2VpZ2h0ID0gMTtcbn1cblxuTm9kZS5wcm90b3R5cGUuZ2V0X2NoaWxkID0gZnVuY3Rpb24oc2lkZSwgb3Bwb3NpdGUpIHtcbiAgaWYgKG9wcG9zaXRlKSB7XG4gICAgc2lkZSA9IChzaWRlID09PSAnbGVmdCcpPyAncmlnaHQnOiAnbGVmdCc7XG4gIH1cbiAgcmV0dXJuIHNpZGUgPT09ICdsZWZ0Jz8gdGhpcy5sZWZ0OiB0aGlzLnJpZ2h0O1xufTtcblxuTm9kZS5wcm90b3R5cGUuc2V0X2NoaWxkID0gZnVuY3Rpb24oc2lkZSwgbm9kZSwgb3Bwb3NpdGUpIHtcbiAgaWYgKG9wcG9zaXRlKSB7XG4gICAgc2lkZSA9IChzaWRlID09PSAnbGVmdCcpPyAncmlnaHQnOiAnbGVmdCc7XG4gIH1cblxuICBpZiAoc2lkZSA9PT0gJ2xlZnQnKSB7XG4gICAgdGhpcy5sZWZ0ID0gbm9kZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnJpZ2h0ID0gbm9kZTtcbiAgfVxufTtcblxuTm9kZS5wcm90b3R5cGUubWF4X3RyZWUgPSBmdW5jdGlvbihmdW4pIHtcbiAgdmFyIG5vZGUgPSB0aGlzO1xuXG4gIGlmIChmdW4pIHtcbiAgICBmdW4obm9kZSk7XG4gIH1cblxuICB3aGlsZSAobm9kZS5yaWdodCkge1xuICAgIG5vZGUgPSBub2RlLnJpZ2h0O1xuICAgIGlmIChmdW4pIHtcbiAgICAgIGZ1bihub2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn07XG5cbk5vZGUucHJvdG90eXBlLm1pbl90cmVlID0gZnVuY3Rpb24oZnVuKSB7XG4gIHZhciBub2RlID0gdGhpcztcblxuICBpZiAoZnVuKSB7XG4gICAgZnVuKG5vZGUpO1xuICB9XG5cbiAgd2hpbGUgKG5vZGUubGVmdCkge1xuICAgIG5vZGUgPSBub2RlLmxlZnQ7XG4gICAgaWYgKGZ1bikge1xuICAgICAgZnVuKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub2RlO1xufTtcblxuXG5Ob2RlLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oZnVuKSB7XG4gIHZhciBub2RlLCBwYXJlbnQ7XG4gIGlmICh0aGlzLmdldF9jaGlsZCgncmlnaHQnKSkge1xuICAgIHJldHVybiB0aGlzLmdldF9jaGlsZCgncmlnaHQnKS5taW5fdHJlZShmdW4pO1xuICB9XG5cbiAgaWYgKGZ1bikge1xuICAgIGZ1bih0aGlzKTtcbiAgfVxuICBub2RlID0gdGhpcztcbiAgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gIHdoaWxlIChwYXJlbnQgJiYgbm9kZSA9PT0gcGFyZW50LmdldF9jaGlsZCgncmlnaHQnKSkge1xuICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG5cbiAgICBpZiAoZnVuKSB7XG4gICAgICBmdW4ocGFyZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyZW50O1xufTtcblxuTm9kZS5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uKGZ1bikge1xuICB2YXIgbm9kZSwgcGFyZW50O1xuICBpZiAodGhpcy5nZXRfY2hpbGQoJ2xlZnQnKSkge1xuICAgIHJldHVybiB0aGlzLmdldF9jaGlsZCgnbGVmdCcpLm1heF90cmVlKGZ1bik7XG4gIH1cblxuICBpZiAoZnVuKSB7XG4gICAgZnVuKHRoaXMpO1xuICB9XG4gIG5vZGUgPSB0aGlzO1xuICBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgd2hpbGUgKHBhcmVudCAmJiBub2RlID09PSBwYXJlbnQuZ2V0X2NoaWxkKCdsZWZ0JykpIHtcbiAgICBub2RlID0gcGFyZW50O1xuICAgIHBhcmVudCA9IG5vZGUucGFyZW50O1xuXG4gICAgaWYgKGZ1bikge1xuICAgICAgZnVuKHBhcmVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmVudDtcbn07XG5cbi8qKiBUcmF2ZXJzZSB0aGUgdHJlZSB1cHdhcmRzIHVudGlsIGl0IHJlYWNoZXMgdGhlIHRvcC4gRm9yIGVhY2ggbm9kZSB0cmF2ZXJzZWQsXG4gICogY2FsbCB0aGUgZnVuY3Rpb24gcGFzc2VkIGFzIGFyZ3VtZW50IHdpdGggYXJndW1lbnRzIG5vZGUsIHBhcmVudC5cbiAgKiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaC0xIHRpbWVzLCBoIGJlaW5nIHRoZSBoZWlnaHQgb2YgdGhlIGJyYW5jaC5cbiAgKiovXG5Ob2RlLnByb3RvdHlwZS50cmF2ZXJzZV91cCA9IGZ1bmN0aW9uKGZ1bikge1xuICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gIHZhciBub2RlID0gdGhpcztcblxuICB3aGlsZShwYXJlbnQpIHtcbiAgICBmdW4obm9kZSwgcGFyZW50KTtcbiAgICBub2RlID0gcGFyZW50O1xuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gIH1cbn07XG5cbk5vZGUucHJvdG90eXBlLmRlcHRoID0gZnVuY3Rpb24oKSB7XG4gIHZhciBkZXB0aCA9IDA7XG4gIHRoaXMudHJhdmVyc2VfdXAoZnVuY3Rpb24oKSB7XG4gICAgZGVwdGggKys7XG4gIH0pO1xuICByZXR1cm4gZGVwdGg7XG59O1xuXG5Ob2RlLnByb3RvdHlwZS5wb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcG9zaXRpb24gPSB0aGlzLmxlZnQ/IHRoaXMubGVmdC53ZWlnaHQ6IDA7XG4gIHZhciBjb3VudEZ1biA9IGZ1bmN0aW9uKG5vZGUsIHBhcmVudCkge1xuICAgIGlmIChwYXJlbnQucmlnaHQgPT09IG5vZGUpIHtcbiAgICAgIC8vIGZvciB0aGUgbGVmdCBzdWJ0cmVlXG4gICAgICBpZiAocGFyZW50LmxlZnQpIHtcbiAgICAgICAgcG9zaXRpb24gKz0gcGFyZW50LmxlZnQud2VpZ2h0O1xuICAgICAgfVxuICAgICAgcG9zaXRpb24gKz0gMTsgLy8gZm9yIHRoZSBwYXJlbnRcbiAgICB9XG4gIH07XG5cbiAgdGhpcy50cmF2ZXJzZV91cChjb3VudEZ1bik7XG4gIHJldHVybiBwb3NpdGlvbjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUkJUcmVlO1xuIiwiXG5mdW5jdGlvbiBUcmVlQmFzZSgpIHt9XG5cbi8vIHJlbW92ZXMgYWxsIG5vZGVzIGZyb20gdGhlIHRyZWVcblRyZWVCYXNlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3Jvb3QgPSBudWxsO1xuICAgIHRoaXMuc2l6ZSA9IDA7XG59O1xuXG4vLyByZXR1cm5zIG5vZGUgZGF0YSBpZiBmb3VuZCwgbnVsbCBvdGhlcndpc2VcblRyZWVCYXNlLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24oZGF0YSkge1xuICAgIHZhciByZXMgPSB0aGlzLl9yb290O1xuXG4gICAgd2hpbGUocmVzICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBjID0gdGhpcy5fY29tcGFyYXRvcihkYXRhLCByZXMuZGF0YSk7XG4gICAgICAgIGlmKGMgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXMuZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9IHJlcy5nZXRfY2hpbGQoYyA+IDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG4vLyByZXR1cm5zIGl0ZXJhdG9yIHRvIG5vZGUgaWYgZm91bmQsIG51bGwgb3RoZXJ3aXNlXG5UcmVlQmFzZS5wcm90b3R5cGUuZmluZEl0ZXIgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgdmFyIHJlcyA9IHRoaXMuX3Jvb3Q7XG4gICAgdmFyIGl0ZXIgPSB0aGlzLml0ZXJhdG9yKCk7XG5cbiAgICB3aGlsZShyZXMgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIGMgPSB0aGlzLl9jb21wYXJhdG9yKGRhdGEsIHJlcy5kYXRhKTtcbiAgICAgICAgaWYoYyA9PT0gMCkge1xuICAgICAgICAgICAgaXRlci5fY3Vyc29yID0gcmVzO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVyLl9hbmNlc3RvcnMucHVzaChyZXMpO1xuICAgICAgICAgICAgcmVzID0gcmVzLmdldF9jaGlsZChjID4gMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbi8vIFJldHVybnMgYW4gaW50ZXJhdG9yIHRvIHRoZSB0cmVlIG5vZGUgYXQgb3IgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGl0ZW1cblRyZWVCYXNlLnByb3RvdHlwZS5sb3dlckJvdW5kID0gZnVuY3Rpb24oaXRlbSkge1xuICAgIHZhciBjdXIgPSB0aGlzLl9yb290O1xuICAgIHZhciBpdGVyID0gdGhpcy5pdGVyYXRvcigpO1xuICAgIHZhciBjbXAgPSB0aGlzLl9jb21wYXJhdG9yO1xuXG4gICAgd2hpbGUoY3VyICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBjID0gY21wKGl0ZW0sIGN1ci5kYXRhKTtcbiAgICAgICAgaWYoYyA9PT0gMCkge1xuICAgICAgICAgICAgaXRlci5fY3Vyc29yID0gY3VyO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaXRlci5fYW5jZXN0b3JzLnB1c2goY3VyKTtcbiAgICAgICAgY3VyID0gY3VyLmdldF9jaGlsZChjID4gMCk7XG4gICAgfVxuXG4gICAgZm9yKHZhciBpPWl0ZXIuX2FuY2VzdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICBjdXIgPSBpdGVyLl9hbmNlc3RvcnNbaV07XG4gICAgICAgIGlmKGNtcChpdGVtLCBjdXIuZGF0YSkgPCAwKSB7XG4gICAgICAgICAgICBpdGVyLl9jdXJzb3IgPSBjdXI7XG4gICAgICAgICAgICBpdGVyLl9hbmNlc3RvcnMubGVuZ3RoID0gaTtcbiAgICAgICAgICAgIHJldHVybiBpdGVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXRlci5fYW5jZXN0b3JzLmxlbmd0aCA9IDA7XG4gICAgcmV0dXJuIGl0ZXI7XG59O1xuXG4vLyBSZXR1cm5zIGFuIGludGVyYXRvciB0byB0aGUgdHJlZSBub2RlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBpdGVtXG5UcmVlQmFzZS5wcm90b3R5cGUudXBwZXJCb3VuZCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICB2YXIgaXRlciA9IHRoaXMubG93ZXJCb3VuZChpdGVtKTtcbiAgICB2YXIgY21wID0gdGhpcy5fY29tcGFyYXRvcjtcblxuICAgIHdoaWxlKGNtcChpdGVyLmRhdGEoKSwgaXRlbSkgPT09IDApIHtcbiAgICAgICAgaXRlci5uZXh0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZXI7XG59O1xuXG4vLyByZXR1cm5zIG51bGwgaWYgdHJlZSBpcyBlbXB0eVxuVHJlZUJhc2UucHJvdG90eXBlLm1pbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXMgPSB0aGlzLl9yb290O1xuICAgIGlmKHJlcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB3aGlsZShyZXMubGVmdCAhPT0gbnVsbCkge1xuICAgICAgICByZXMgPSByZXMubGVmdDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLmRhdGE7XG59O1xuXG4vLyByZXR1cm5zIG51bGwgaWYgdHJlZSBpcyBlbXB0eVxuVHJlZUJhc2UucHJvdG90eXBlLm1heCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXMgPSB0aGlzLl9yb290O1xuICAgIGlmKHJlcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB3aGlsZShyZXMucmlnaHQgIT09IG51bGwpIHtcbiAgICAgICAgcmVzID0gcmVzLnJpZ2h0O1xuICAgIH1cblxuICAgIHJldHVybiByZXMuZGF0YTtcbn07XG5cbi8vIHJldHVybnMgYSBudWxsIGl0ZXJhdG9yXG4vLyBjYWxsIG5leHQoKSBvciBwcmV2KCkgdG8gcG9pbnQgdG8gYW4gZWxlbWVudFxuVHJlZUJhc2UucHJvdG90eXBlLml0ZXJhdG9yID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBJdGVyYXRvcih0aGlzKTtcbn07XG5cblxuVHJlZUJhc2UucHJvdG90eXBlLmVhY2hOb2RlID0gZnVuY3Rpb24oY2IpIHtcbiAgICB2YXIgaXQ9dGhpcy5pdGVyYXRvcigpLCBub2RlO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgd2hpbGUoKG5vZGUgPSBpdC5uZXh0KCkpICE9PSBudWxsKSB7XG4gICAgICAgIGNiKG5vZGUsIGluZGV4KTtcbiAgICAgICAgaW5kZXgrKztcbiAgICB9XG59O1xuXG4vLyBjYWxscyBjYiBvbiBlYWNoIG5vZGUncyBkYXRhLCBpbiBvcmRlclxuVHJlZUJhc2UucHJvdG90eXBlLmVhY2ggPSBmdW5jdGlvbihjYikge1xuICAgIHRoaXMuZWFjaE5vZGUoZnVuY3Rpb24obm9kZSwgaW5kZXgpIHtcbiAgICAgICAgY2Iobm9kZS5kYXRhLCBpbmRleCk7XG4gICAgfSk7XG59O1xuXG5cblRyZWVCYXNlLnByb3RvdHlwZS5tYXBOb2RlID0gZnVuY3Rpb24oY2IpIHtcbiAgICB2YXIgaXQ9dGhpcy5pdGVyYXRvcigpLCBub2RlO1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB3aGlsZSgobm9kZSA9IGl0Lm5leHQoKSkgIT09IG51bGwpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGNiKG5vZGUsIGluZGV4KSk7XG4gICAgICAgIGluZGV4ICsrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIGNhbGxzIGNiIG9uIGVhY2ggbm9kZS1zIGRhdGEsIHN0b3JlIHRoZSByZXN1bHQgYW5kIHJldHVybiBpdFxuVHJlZUJhc2UucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uKGNiKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwTm9kZShmdW5jdGlvbihub2RlLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gY2Iobm9kZS5kYXRhLCBpbmRleCk7XG4gICAgfSk7XG59O1xuXG5mdW5jdGlvbiBJdGVyYXRvcih0cmVlKSB7XG4gICAgdGhpcy5fdHJlZSA9IHRyZWU7XG4gICAgdGhpcy5fYW5jZXN0b3JzID0gW107XG4gICAgdGhpcy5fY3Vyc29yID0gbnVsbDtcbn1cblxuSXRlcmF0b3IucHJvdG90eXBlLmRhdGEgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fY3Vyc29yICE9PSBudWxsID8gdGhpcy5fY3Vyc29yLmRhdGEgOiBudWxsO1xufTtcblxuLy8gaWYgbnVsbC1pdGVyYXRvciwgcmV0dXJucyBmaXJzdCBub2RlXG4vLyBvdGhlcndpc2UsIHJldHVybnMgbmV4dCBub2RlXG5JdGVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmKHRoaXMuX2N1cnNvciA9PT0gbnVsbCkge1xuICAgICAgICB2YXIgcm9vdCA9IHRoaXMuX3RyZWUuX3Jvb3Q7XG4gICAgICAgIGlmKHJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX21pbk5vZGUocm9vdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmKHRoaXMuX2N1cnNvci5yaWdodCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gbm8gZ3JlYXRlciBub2RlIGluIHN1YnRyZWUsIGdvIHVwIHRvIHBhcmVudFxuICAgICAgICAgICAgLy8gaWYgY29taW5nIGZyb20gYSByaWdodCBjaGlsZCwgY29udGludWUgdXAgdGhlIHN0YWNrXG4gICAgICAgICAgICB2YXIgc2F2ZTtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBzYXZlID0gdGhpcy5fY3Vyc29yO1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuX2FuY2VzdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yID0gdGhpcy5fYW5jZXN0b3JzLnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3Vyc29yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSh0aGlzLl9jdXJzb3IucmlnaHQgPT09IHNhdmUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZ2V0IHRoZSBuZXh0IG5vZGUgZnJvbSB0aGUgc3VidHJlZVxuICAgICAgICAgICAgdGhpcy5fYW5jZXN0b3JzLnB1c2godGhpcy5fY3Vyc29yKTtcbiAgICAgICAgICAgIHRoaXMuX21pbk5vZGUodGhpcy5fY3Vyc29yLnJpZ2h0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3Vyc29yICE9PSBudWxsID8gdGhpcy5fY3Vyc29yIDogbnVsbDtcbn07XG5cbi8vIGlmIG51bGwtaXRlcmF0b3IsIHJldHVybnMgbGFzdCBub2RlXG4vLyBvdGhlcndpc2UsIHJldHVybnMgcHJldmlvdXMgbm9kZVxuSXRlcmF0b3IucHJvdG90eXBlLnByZXYgPSBmdW5jdGlvbigpIHtcbiAgICBpZih0aGlzLl9jdXJzb3IgPT09IG51bGwpIHtcbiAgICAgICAgdmFyIHJvb3QgPSB0aGlzLl90cmVlLl9yb290O1xuICAgICAgICBpZihyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXhOb2RlKHJvb3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZih0aGlzLl9jdXJzb3IubGVmdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHNhdmU7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgc2F2ZSA9IHRoaXMuX2N1cnNvcjtcbiAgICAgICAgICAgICAgICBpZih0aGlzLl9hbmNlc3RvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9IHRoaXMuX2FuY2VzdG9ycy5wb3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnNvciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUodGhpcy5fY3Vyc29yLmxlZnQgPT09IHNhdmUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYW5jZXN0b3JzLnB1c2godGhpcy5fY3Vyc29yKTtcbiAgICAgICAgICAgIHRoaXMuX21heE5vZGUodGhpcy5fY3Vyc29yLmxlZnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jdXJzb3IgIT09IG51bGwgPyB0aGlzLl9jdXJzb3IgOiBudWxsO1xufTtcblxuSXRlcmF0b3IucHJvdG90eXBlLl9taW5Ob2RlID0gZnVuY3Rpb24oc3RhcnQpIHtcbiAgICB3aGlsZShzdGFydC5sZWZ0ICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2FuY2VzdG9ycy5wdXNoKHN0YXJ0KTtcbiAgICAgICAgc3RhcnQgPSBzdGFydC5sZWZ0O1xuICAgIH1cbiAgICB0aGlzLl9jdXJzb3IgPSBzdGFydDtcbn07XG5cbkl0ZXJhdG9yLnByb3RvdHlwZS5fbWF4Tm9kZSA9IGZ1bmN0aW9uKHN0YXJ0KSB7XG4gICAgd2hpbGUoc3RhcnQucmlnaHQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fYW5jZXN0b3JzLnB1c2goc3RhcnQpO1xuICAgICAgICBzdGFydCA9IHN0YXJ0LnJpZ2h0O1xuICAgIH1cbiAgICB0aGlzLl9jdXJzb3IgPSBzdGFydDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gVHJlZUJhc2U7XG4iXX0=