imba-source 0.14.3.1 → 0.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/imba/source/version.rb +1 -1
- data/vendor/imba/dist/imba.dev.js +285 -181
- data/vendor/imba/dist/imba.js +4152 -2
- data/vendor/imba/dist/imba.min.js +2 -0
- data/vendor/imba/dist/imbac.dev.js +676 -425
- data/vendor/imba/dist/imbac.js +9 -9
- metadata +3 -4
- data/vendor/imba/dist/imbac.worker.dev.js +0 -13957
- data/vendor/imba/dist/imbac.worker.js +0 -9
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 3d9c8780d2e342f305d0297a6bbbdd964eedfb2b
         | 
| 4 | 
            +
              data.tar.gz: 2a2ffa1ed3f5d26a82f4fd05828c1fd14c0c80e8
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 373468237ae921e434027e6d52d3433b27c8a02daa08991a50282d934372ef1bded2af1fd108d7a7e4ebc649d8707a52a800c4045a7428d5b61423d6fffa925f
         | 
| 7 | 
            +
              data.tar.gz: 81d9e97f947aec2ff441fc63476bcd77b182dbb1189bd64f3f42d2b14fa410e70ff24dbbfd0df04d472ebdcc734c1be36eac0f77d82b09c43d4e6f490660154a
         | 
    
        data/lib/imba/source/version.rb
    CHANGED
    
    
| @@ -1,41 +1,41 @@ | |
| 1 1 | 
             
            /******/ (function(modules) { // webpackBootstrap
         | 
| 2 2 | 
             
            /******/ 	// The module cache
         | 
| 3 3 | 
             
            /******/ 	var installedModules = {};
         | 
| 4 | 
            -
             | 
| 4 | 
            +
             | 
| 5 5 | 
             
            /******/ 	// The require function
         | 
| 6 6 | 
             
            /******/ 	function __webpack_require__(moduleId) {
         | 
| 7 | 
            -
             | 
| 7 | 
            +
             | 
| 8 8 | 
             
            /******/ 		// Check if module is in cache
         | 
| 9 9 | 
             
            /******/ 		if(installedModules[moduleId])
         | 
| 10 10 | 
             
            /******/ 			return installedModules[moduleId].exports;
         | 
| 11 | 
            -
             | 
| 11 | 
            +
             | 
| 12 12 | 
             
            /******/ 		// Create a new module (and put it into the cache)
         | 
| 13 13 | 
             
            /******/ 		var module = installedModules[moduleId] = {
         | 
| 14 14 | 
             
            /******/ 			exports: {},
         | 
| 15 15 | 
             
            /******/ 			id: moduleId,
         | 
| 16 16 | 
             
            /******/ 			loaded: false
         | 
| 17 17 | 
             
            /******/ 		};
         | 
| 18 | 
            -
             | 
| 18 | 
            +
             | 
| 19 19 | 
             
            /******/ 		// Execute the module function
         | 
| 20 20 | 
             
            /******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
         | 
| 21 | 
            -
             | 
| 21 | 
            +
             | 
| 22 22 | 
             
            /******/ 		// Flag the module as loaded
         | 
| 23 23 | 
             
            /******/ 		module.loaded = true;
         | 
| 24 | 
            -
             | 
| 24 | 
            +
             | 
| 25 25 | 
             
            /******/ 		// Return the exports of the module
         | 
| 26 26 | 
             
            /******/ 		return module.exports;
         | 
| 27 27 | 
             
            /******/ 	}
         | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 28 | 
            +
             | 
| 29 | 
            +
             | 
| 30 30 | 
             
            /******/ 	// expose the modules object (__webpack_modules__)
         | 
| 31 31 | 
             
            /******/ 	__webpack_require__.m = modules;
         | 
| 32 | 
            -
             | 
| 32 | 
            +
             | 
| 33 33 | 
             
            /******/ 	// expose the module cache
         | 
| 34 34 | 
             
            /******/ 	__webpack_require__.c = installedModules;
         | 
| 35 | 
            -
             | 
| 35 | 
            +
             | 
| 36 36 | 
             
            /******/ 	// __webpack_public_path__
         | 
| 37 37 | 
             
            /******/ 	__webpack_require__.p = "";
         | 
| 38 | 
            -
             | 
| 38 | 
            +
             | 
| 39 39 | 
             
            /******/ 	// Load entry module and return exports
         | 
| 40 40 | 
             
            /******/ 	return __webpack_require__(0);
         | 
| 41 41 | 
             
            /******/ })
         | 
| @@ -70,28 +70,29 @@ | |
| 70 70 | 
             
            			return console.warn(("Imba v" + (Imba.VERSION) + " is already loaded"));
         | 
| 71 71 | 
             
            		};
         | 
| 72 72 |  | 
| 73 | 
            -
            	})()
         | 
| 73 | 
            +
            	})();
         | 
| 74 74 |  | 
| 75 75 | 
             
            /***/ },
         | 
| 76 76 | 
             
            /* 1 */
         | 
| 77 77 | 
             
            /***/ function(module, exports, __webpack_require__) {
         | 
| 78 78 |  | 
| 79 | 
            -
            	 | 
| 80 | 
            -
            		 | 
| 79 | 
            +
            	(function(){
         | 
| 80 | 
            +
            		var isClient = (typeof window == 'object' && this == window);
         | 
| 81 | 
            +
            		
         | 
| 82 | 
            +
            		if (isClient) {
         | 
| 81 83 | 
             
            			// should not go there
         | 
| 82 | 
            -
            			global = window;
         | 
| 84 | 
            +
            			window.global || (window.global = window);
         | 
| 83 85 | 
             
            		};
         | 
| 84 86 |  | 
| 85 | 
            -
            		var isClient = (typeof window == 'object' && this == window);
         | 
| 86 87 | 
             
            		/*
         | 
| 87 88 | 
             
            		Imba is the namespace for all runtime related utilities
         | 
| 88 89 | 
             
            		@namespace
         | 
| 89 90 | 
             
            		*/
         | 
| 90 91 |  | 
| 91 92 | 
             
            		Imba = {
         | 
| 92 | 
            -
            			VERSION: '0.14. | 
| 93 | 
            +
            			VERSION: '0.14.4',
         | 
| 93 94 | 
             
            			CLIENT: isClient,
         | 
| 94 | 
            -
            			SERVER: ! | 
| 95 | 
            +
            			SERVER: !isClient,
         | 
| 95 96 | 
             
            			DEBUG: false
         | 
| 96 97 | 
             
            		};
         | 
| 97 98 |  | 
| @@ -209,8 +210,7 @@ | |
| 209 210 | 
             
            			return;
         | 
| 210 211 | 
             
            		};
         | 
| 211 212 |  | 
| 212 | 
            -
            	})()
         | 
| 213 | 
            -
            	/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
         | 
| 213 | 
            +
            	})();
         | 
| 214 214 |  | 
| 215 215 | 
             
            /***/ },
         | 
| 216 216 | 
             
            /* 2 */
         | 
| @@ -263,7 +263,7 @@ | |
| 263 263 | 
             
            		Imba.unlisten = function (obj,event,cb,meth){
         | 
| 264 264 | 
             
            			var node,prev;
         | 
| 265 265 | 
             
            			var meta = obj.__listeners__;
         | 
| 266 | 
            -
            			if (! | 
| 266 | 
            +
            			if (!meta) { return };
         | 
| 267 267 |  | 
| 268 268 | 
             
            			if (node = meta[event]) {
         | 
| 269 269 | 
             
            				while ((prev = node) && (node = node.next)){
         | 
| @@ -297,7 +297,7 @@ | |
| 297 297 | 
             
            			return this;
         | 
| 298 298 | 
             
            		};
         | 
| 299 299 |  | 
| 300 | 
            -
            	})()
         | 
| 300 | 
            +
            	})();
         | 
| 301 301 |  | 
| 302 302 | 
             
            /***/ },
         | 
| 303 303 | 
             
            /* 3 */
         | 
| @@ -449,7 +449,7 @@ | |
| 449 449 | 
             
            		};
         | 
| 450 450 |  | 
| 451 451 | 
             
            		Imba.Scheduler.isDirty = function (){
         | 
| 452 | 
            -
            			return  | 
| 452 | 
            +
            			return !!this._dirty;
         | 
| 453 453 | 
             
            		};
         | 
| 454 454 |  | 
| 455 455 | 
             
            		Imba.Scheduler.willRun = function (){
         | 
| @@ -462,7 +462,7 @@ | |
| 462 462 | 
             
            		};
         | 
| 463 463 |  | 
| 464 464 | 
             
            		Imba.Scheduler.isActive = function (){
         | 
| 465 | 
            -
            			return  | 
| 465 | 
            +
            			return !!this._active;
         | 
| 466 466 | 
             
            		};
         | 
| 467 467 |  | 
| 468 468 | 
             
            		/*
         | 
| @@ -632,8 +632,8 @@ | |
| 632 632 | 
             
            			return this;
         | 
| 633 633 | 
             
            		};
         | 
| 634 634 | 
             
            		return Imba.Scheduler;
         | 
| 635 | 
            -
             | 
| 636 | 
            -
            	})()
         | 
| 635 | 
            +
             | 
| 636 | 
            +
            	})();
         | 
| 637 637 | 
             
            	/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
         | 
| 638 638 |  | 
| 639 639 | 
             
            /***/ },
         | 
| @@ -716,6 +716,7 @@ | |
| 716 716 |  | 
| 717 717 | 
             
            		Imba.Tag.prototype.setId = function (id){
         | 
| 718 718 | 
             
            			this.dom().id = id;
         | 
| 719 | 
            +
            			this;
         | 
| 719 720 | 
             
            			return this;
         | 
| 720 721 | 
             
            		};
         | 
| 721 722 |  | 
| @@ -799,6 +800,7 @@ | |
| 799 800 | 
             
            		Imba.Tag.prototype.setText = function (txt){
         | 
| 800 801 | 
             
            			this._empty = false;
         | 
| 801 802 | 
             
            			this._dom.textContent = txt == null ? (txt = "") : (txt);
         | 
| 803 | 
            +
            			this;
         | 
| 802 804 | 
             
            			return this;
         | 
| 803 805 | 
             
            		};
         | 
| 804 806 |  | 
| @@ -925,8 +927,10 @@ | |
| 925 927 | 
             
            		Imba.Tag.prototype.flag = function (name,toggler){
         | 
| 926 928 | 
             
            			// it is most natural to treat a second undefined argument as a no-switch
         | 
| 927 929 | 
             
            			// so we need to check the arguments-length
         | 
| 928 | 
            -
            			if (arguments.length == 2 | 
| 929 | 
            -
            				this._dom.classList. | 
| 930 | 
            +
            			if (arguments.length == 2) {
         | 
| 931 | 
            +
            				if (this._dom.classList.contains(name) != !!toggler) {
         | 
| 932 | 
            +
            					this._dom.classList.toggle(name);
         | 
| 933 | 
            +
            				};
         | 
| 930 934 | 
             
            			} else {
         | 
| 931 935 | 
             
            				this._dom.classList.add(name);
         | 
| 932 936 | 
             
            			};
         | 
| @@ -1040,8 +1044,14 @@ | |
| 1040 1044 | 
             
            			return this;
         | 
| 1041 1045 | 
             
            		};
         | 
| 1042 1046 |  | 
| 1047 | 
            +
            		Imba.Tag.prototype.trigger = function (event,data){
         | 
| 1048 | 
            +
            			if(data === undefined) data = {};
         | 
| 1049 | 
            +
            			return Imba.Events.trigger(event,this,{data: data});
         | 
| 1050 | 
            +
            		};
         | 
| 1051 | 
            +
            		
         | 
| 1043 1052 | 
             
            		Imba.Tag.prototype.setTransform = function (value){
         | 
| 1044 1053 | 
             
            			this.css('transform',value);
         | 
| 1054 | 
            +
            			this;
         | 
| 1045 1055 | 
             
            			return this;
         | 
| 1046 1056 | 
             
            		};
         | 
| 1047 1057 |  | 
| @@ -1049,6 +1059,20 @@ | |
| 1049 1059 | 
             
            			return this.css('transform');
         | 
| 1050 1060 | 
             
            		};
         | 
| 1051 1061 |  | 
| 1062 | 
            +
            		Imba.Tag.prototype.setStyle = function (style){
         | 
| 1063 | 
            +
            			this.setAttribute('style',style);
         | 
| 1064 | 
            +
            			this;
         | 
| 1065 | 
            +
            			return this;
         | 
| 1066 | 
            +
            		};
         | 
| 1067 | 
            +
            		
         | 
| 1068 | 
            +
            		Imba.Tag.prototype.style = function (){
         | 
| 1069 | 
            +
            			return this.getAttribute('style');
         | 
| 1070 | 
            +
            		};
         | 
| 1071 | 
            +
            		
         | 
| 1072 | 
            +
            		Imba.Tag.prototype.toString = function (){
         | 
| 1073 | 
            +
            			return this.dom().outerHTML;
         | 
| 1074 | 
            +
            		};
         | 
| 1075 | 
            +
            		
         | 
| 1052 1076 |  | 
| 1053 1077 | 
             
            		Imba.Tag.prototype.initialize = Imba.Tag;
         | 
| 1054 1078 |  | 
| @@ -1090,6 +1114,10 @@ | |
| 1090 1114 | 
             
            			return clone;
         | 
| 1091 1115 | 
             
            		};
         | 
| 1092 1116 |  | 
| 1117 | 
            +
            		Imba.Tags.prototype.ns = function (name){
         | 
| 1118 | 
            +
            			return this[name.toUpperCase()] || this.defineNamespace(name);
         | 
| 1119 | 
            +
            		};
         | 
| 1120 | 
            +
            		
         | 
| 1093 1121 | 
             
            		Imba.Tags.prototype.defineNamespace = function (name){
         | 
| 1094 1122 | 
             
            			var clone = Object.create(this);
         | 
| 1095 1123 | 
             
            			clone._parent = this;
         | 
| @@ -1181,13 +1209,13 @@ | |
| 1181 1209 |  | 
| 1182 1210 | 
             
            		Imba.tag = function (name){
         | 
| 1183 1211 | 
             
            			var typ = Imba.TAGS[name];
         | 
| 1184 | 
            -
            			if (! | 
| 1212 | 
            +
            			if (!typ) { throw new Error(("tag " + name + " is not defined")) };
         | 
| 1185 1213 | 
             
            			return new typ(typ.createNode());
         | 
| 1186 1214 | 
             
            		};
         | 
| 1187 1215 |  | 
| 1188 1216 | 
             
            		Imba.tagWithId = function (name,id){
         | 
| 1189 1217 | 
             
            			var typ = Imba.TAGS[name];
         | 
| 1190 | 
            -
            			if (! | 
| 1218 | 
            +
            			if (!typ) { throw new Error(("tag " + name + " is not defined")) };
         | 
| 1191 1219 | 
             
            			var dom = typ.createNode();
         | 
| 1192 1220 | 
             
            			dom.id = id;
         | 
| 1193 1221 | 
             
            			return new typ(dom);
         | 
| @@ -1226,7 +1254,7 @@ | |
| 1226 1254 |  | 
| 1227 1255 | 
             
            		Imba.getTagForDom = function (dom){
         | 
| 1228 1256 | 
             
            			var m;
         | 
| 1229 | 
            -
            			if (! | 
| 1257 | 
            +
            			if (!dom) { return null };
         | 
| 1230 1258 | 
             
            			if (dom._dom) { return dom }; // could use inheritance instead
         | 
| 1231 1259 | 
             
            			if (dom._tag) { return dom._tag };
         | 
| 1232 1260 | 
             
            			if (!dom.nodeName) { return null };
         | 
| @@ -1258,17 +1286,27 @@ | |
| 1258 1286 | 
             
            				// there can be several matches here - should choose the last
         | 
| 1259 1287 | 
             
            				// should fall back to less specific later? - otherwise things may fail
         | 
| 1260 1288 | 
             
            				// TODO rework this
         | 
| 1261 | 
            -
            				 | 
| 1262 | 
            -
             | 
| 1289 | 
            +
            				var flags = cls.split(' ');
         | 
| 1290 | 
            +
            				var nr = flags.length;
         | 
| 1291 | 
            +
            				
         | 
| 1292 | 
            +
            				while (--nr >= 0){
         | 
| 1293 | 
            +
            					var flag = flags[nr];
         | 
| 1294 | 
            +
            					if (flag[0] == '_') {
         | 
| 1295 | 
            +
            						if (spawner = tags[flag.slice(1)]) {
         | 
| 1296 | 
            +
            							break;
         | 
| 1297 | 
            +
            						};
         | 
| 1298 | 
            +
            					};
         | 
| 1263 1299 | 
             
            				};
         | 
| 1264 1300 |  | 
| 1301 | 
            +
            				// if var m = cls.match(/\b_([a-z\-]+)\b(?!\s*_[a-z\-]+)/)
         | 
| 1302 | 
            +
            				// 	type = m[1] # .replace(/-/g,'_')
         | 
| 1303 | 
            +
            				
         | 
| 1265 1304 | 
             
            				if (m = cls.match(/\b([A-Z\-]+)_\b/)) {
         | 
| 1266 1305 | 
             
            					ns = m[1];
         | 
| 1267 1306 | 
             
            				};
         | 
| 1268 1307 | 
             
            			};
         | 
| 1269 1308 |  | 
| 1270 | 
            -
            			
         | 
| 1271 | 
            -
            			spawner = tags[type] || tags[native$];
         | 
| 1309 | 
            +
            			spawner || (spawner = tags[native$]);
         | 
| 1272 1310 | 
             
            			return spawner ? (new spawner(dom).awaken(dom)) : (null);
         | 
| 1273 1311 | 
             
            		};
         | 
| 1274 1312 |  | 
| @@ -1281,7 +1319,7 @@ | |
| 1281 1319 | 
             
            		return tag$wrap = Imba.getTagForDom;
         | 
| 1282 1320 |  | 
| 1283 1321 |  | 
| 1284 | 
            -
            	})()
         | 
| 1322 | 
            +
            	})();
         | 
| 1285 1323 |  | 
| 1286 1324 | 
             
            /***/ },
         | 
| 1287 1325 | 
             
            /* 5 */
         | 
| @@ -1339,14 +1377,24 @@ | |
| 1339 1377 | 
             
            				return this._protoDom || (this._protoDom = this.buildNode());
         | 
| 1340 1378 | 
             
            			};
         | 
| 1341 1379 |  | 
| 1342 | 
            -
            			tag.prototype.id = function(v){ return this.getAttribute('id'); }
         | 
| 1343 | 
            -
            			tag.prototype.setId = function(v){ this.setAttribute('id',v); return this; };
         | 
| 1344 1380 | 
             
            			tag.prototype.tabindex = function(v){ return this.getAttribute('tabindex'); }
         | 
| 1345 1381 | 
             
            			tag.prototype.setTabindex = function(v){ this.setAttribute('tabindex',v); return this; };
         | 
| 1346 1382 | 
             
            			tag.prototype.title = function(v){ return this.getAttribute('title'); }
         | 
| 1347 1383 | 
             
            			tag.prototype.setTitle = function(v){ this.setAttribute('title',v); return this; };
         | 
| 1348 1384 | 
             
            			tag.prototype.role = function(v){ return this.getAttribute('role'); }
         | 
| 1349 1385 | 
             
            			tag.prototype.setRole = function(v){ this.setAttribute('role',v); return this; };
         | 
| 1386 | 
            +
            			tag.prototype.name = function(v){ return this.getAttribute('name'); }
         | 
| 1387 | 
            +
            			tag.prototype.setName = function(v){ this.setAttribute('name',v); return this; };
         | 
| 1388 | 
            +
            			
         | 
| 1389 | 
            +
            			tag.prototype.id = function (){
         | 
| 1390 | 
            +
            				return this.dom().id;
         | 
| 1391 | 
            +
            			};
         | 
| 1392 | 
            +
            			
         | 
| 1393 | 
            +
            			tag.prototype.setId = function (id){
         | 
| 1394 | 
            +
            				this.dom().id = id;
         | 
| 1395 | 
            +
            				this;
         | 
| 1396 | 
            +
            				return this;
         | 
| 1397 | 
            +
            			};
         | 
| 1350 1398 |  | 
| 1351 1399 | 
             
            			tag.prototype.width = function (){
         | 
| 1352 1400 | 
             
            				return this._dom.offsetWidth;
         | 
| @@ -1368,6 +1416,7 @@ | |
| 1368 1416 |  | 
| 1369 1417 | 
             
            			tag.prototype.setHtml = function (html){
         | 
| 1370 1418 | 
             
            				this._dom.innerHTML = html;
         | 
| 1419 | 
            +
            				this;
         | 
| 1371 1420 | 
             
            				return this;
         | 
| 1372 1421 | 
             
            			};
         | 
| 1373 1422 |  | 
| @@ -1430,7 +1479,7 @@ | |
| 1430 1479 |  | 
| 1431 1480 | 
             
            				var dataset = this.dom().dataset;
         | 
| 1432 1481 |  | 
| 1433 | 
            -
            				if (! | 
| 1482 | 
            +
            				if (!dataset) {
         | 
| 1434 1483 | 
             
            					dataset = {};
         | 
| 1435 1484 | 
             
            					for (var i = 0, ary = iter$(this.dom().attributes), len = ary.length, atr; i < len; i++) {
         | 
| 1436 1485 | 
             
            						atr = ary[i];
         | 
| @@ -1514,7 +1563,7 @@ | |
| 1514 1563 | 
             
            				*/
         | 
| 1515 1564 |  | 
| 1516 1565 | 
             
            			tag.prototype.closest = function (sel){
         | 
| 1517 | 
            -
            				if (! | 
| 1566 | 
            +
            				if (!sel) { return this.parent() }; // should return self?!
         | 
| 1518 1567 | 
             
            				var node = this;
         | 
| 1519 1568 | 
             
            				if (sel.query) { sel = sel.query() };
         | 
| 1520 1569 |  | 
| @@ -1533,7 +1582,7 @@ | |
| 1533 1582 | 
             
            				*/
         | 
| 1534 1583 |  | 
| 1535 1584 | 
             
            			tag.prototype.up = function (sel){
         | 
| 1536 | 
            -
            				if (! | 
| 1585 | 
            +
            				if (!sel) { return this.parent() };
         | 
| 1537 1586 | 
             
            				return this.parent() && this.parent().closest(sel);
         | 
| 1538 1587 | 
             
            			};
         | 
| 1539 1588 |  | 
| @@ -1543,7 +1592,7 @@ | |
| 1543 1592 | 
             
            				if (sel && sel.query) { sel = sel.query() };
         | 
| 1544 1593 |  | 
| 1545 1594 | 
             
            				while (node){
         | 
| 1546 | 
            -
            					if (! | 
| 1595 | 
            +
            					if (!sel || node.matches(sel)) { nodes.push(node) };
         | 
| 1547 1596 | 
             
            					node = node.parent();
         | 
| 1548 1597 | 
             
            				};
         | 
| 1549 1598 | 
             
            				return nodes;
         | 
| @@ -1561,7 +1610,7 @@ | |
| 1561 1610 | 
             
            				if (!(par = this.parent())) { return [] }; // FIXME
         | 
| 1562 1611 | 
             
            				var ary = this.dom().parentNode.children;
         | 
| 1563 1612 | 
             
            				var nodes = new Imba.Selector(null,this,ary);
         | 
| 1564 | 
            -
            				return nodes.filter(function(n) { return n != self && (! | 
| 1613 | 
            +
            				return nodes.filter(function(n) { return n != self && (!sel || n.matches(sel)); });
         | 
| 1565 1614 | 
             
            			};
         | 
| 1566 1615 |  | 
| 1567 1616 | 
             
            			/*
         | 
| @@ -1690,7 +1739,7 @@ | |
| 1690 1739 | 
             
            			tag.prototype.append = function (item){
         | 
| 1691 1740 | 
             
            				// possible to append blank
         | 
| 1692 1741 | 
             
            				// possible to simplify on server?
         | 
| 1693 | 
            -
            				if (! | 
| 1742 | 
            +
            				if (!item) { return this };
         | 
| 1694 1743 |  | 
| 1695 1744 | 
             
            				if (item instanceof Array) {
         | 
| 1696 1745 | 
             
            					for (var i = 0, ary = iter$(item), len = ary.length, member; i < len; i++) {
         | 
| @@ -1742,10 +1791,6 @@ | |
| 1742 1791 | 
             
            				return this;
         | 
| 1743 1792 | 
             
            			};
         | 
| 1744 1793 |  | 
| 1745 | 
            -
            			tag.prototype.toString = function (){
         | 
| 1746 | 
            -
            				return this._dom.toString(); // really?
         | 
| 1747 | 
            -
            			};
         | 
| 1748 | 
            -
            			
         | 
| 1749 1794 | 
             
            			/*
         | 
| 1750 1795 | 
             
            				@deprecated
         | 
| 1751 1796 | 
             
            				*/
         | 
| @@ -1757,8 +1802,8 @@ | |
| 1757 1802 | 
             
            		});
         | 
| 1758 1803 |  | 
| 1759 1804 | 
             
            		return tag$.defineTag('svgelement', 'htmlelement');
         | 
| 1760 | 
            -
             | 
| 1761 | 
            -
            	})()
         | 
| 1805 | 
            +
             | 
| 1806 | 
            +
            	})();
         | 
| 1762 1807 |  | 
| 1763 1808 | 
             
            /***/ },
         | 
| 1764 1809 | 
             
            /* 6 */
         | 
| @@ -1799,28 +1844,19 @@ | |
| 1799 1844 | 
             
            			tag.prototype.setAutofocus = function(v){ this.setAttribute('autofocus',v); return this; };
         | 
| 1800 1845 | 
             
            			tag.prototype.type = function(v){ return this.getAttribute('type'); }
         | 
| 1801 1846 | 
             
            			tag.prototype.setType = function(v){ this.setAttribute('type',v); return this; };
         | 
| 1802 | 
            -
            			 | 
| 1803 | 
            -
            			tag.prototype. | 
| 1847 | 
            +
            			
         | 
| 1848 | 
            +
            			tag.prototype.__disabled = {dom: true,name: 'disabled'};
         | 
| 1849 | 
            +
            			tag.prototype.disabled = function(v){ return this.dom().disabled; }
         | 
| 1850 | 
            +
            			tag.prototype.setDisabled = function(v){ if (v != this.dom().disabled) { this.dom().disabled = v }; return this; };
         | 
| 1804 1851 | 
             
            		});
         | 
| 1805 1852 |  | 
| 1806 1853 | 
             
            		tag$.defineTag('canvas', function(tag){
         | 
| 1807 | 
            -
            			tag.prototype. | 
| 1808 | 
            -
             | 
| 1809 | 
            -
             | 
| 1810 | 
            -
            			};
         | 
| 1811 | 
            -
            			
         | 
| 1812 | 
            -
            			tag.prototype.setHeight = function ( | 
| 1813 | 
            -
            				if (this.height() != val) { this.dom().height = val };
         | 
| 1814 | 
            -
            				return this;
         | 
| 1815 | 
            -
            			};
         | 
| 1816 | 
            -
            			
         | 
| 1817 | 
            -
            			tag.prototype.width = function (){
         | 
| 1818 | 
            -
            				return this.dom().width;
         | 
| 1819 | 
            -
            			};
         | 
| 1820 | 
            -
            			
         | 
| 1821 | 
            -
            			tag.prototype.height = function (){
         | 
| 1822 | 
            -
            				return this.dom().height;
         | 
| 1823 | 
            -
            			};
         | 
| 1854 | 
            +
            			tag.prototype.__width = {dom: true,name: 'width'};
         | 
| 1855 | 
            +
            			tag.prototype.width = function(v){ return this.dom().width; }
         | 
| 1856 | 
            +
            			tag.prototype.setWidth = function(v){ if (v != this.dom().width) { this.dom().width = v }; return this; };
         | 
| 1857 | 
            +
            			tag.prototype.__height = {dom: true,name: 'height'};
         | 
| 1858 | 
            +
            			tag.prototype.height = function(v){ return this.dom().height; }
         | 
| 1859 | 
            +
            			tag.prototype.setHeight = function(v){ if (v != this.dom().height) { this.dom().height = v }; return this; };
         | 
| 1824 1860 |  | 
| 1825 1861 | 
             
            			tag.prototype.context = function (type){
         | 
| 1826 1862 | 
             
            				if(type === undefined) type = '2d';
         | 
| @@ -1844,7 +1880,13 @@ | |
| 1844 1880 | 
             
            		tag$.defineTag('dt');
         | 
| 1845 1881 | 
             
            		tag$.defineTag('em');
         | 
| 1846 1882 | 
             
            		tag$.defineTag('embed');
         | 
| 1847 | 
            -
            		 | 
| 1883 | 
            +
            		
         | 
| 1884 | 
            +
            		tag$.defineTag('fieldset', function(tag){
         | 
| 1885 | 
            +
            			tag.prototype.__disabled = {dom: true,name: 'disabled'};
         | 
| 1886 | 
            +
            			tag.prototype.disabled = function(v){ return this.dom().disabled; }
         | 
| 1887 | 
            +
            			tag.prototype.setDisabled = function(v){ if (v != this.dom().disabled) { this.dom().disabled = v }; return this; };
         | 
| 1888 | 
            +
            		});
         | 
| 1889 | 
            +
            		
         | 
| 1848 1890 | 
             
            		tag$.defineTag('figcaption');
         | 
| 1849 1891 | 
             
            		tag$.defineTag('figure');
         | 
| 1850 1892 | 
             
            		tag$.defineTag('footer');
         | 
| @@ -1854,6 +1896,16 @@ | |
| 1854 1896 | 
             
            			tag.prototype.setMethod = function(v){ this.setAttribute('method',v); return this; };
         | 
| 1855 1897 | 
             
            			tag.prototype.action = function(v){ return this.getAttribute('action'); }
         | 
| 1856 1898 | 
             
            			tag.prototype.setAction = function(v){ this.setAttribute('action',v); return this; };
         | 
| 1899 | 
            +
            			tag.prototype.enctype = function(v){ return this.getAttribute('enctype'); }
         | 
| 1900 | 
            +
            			tag.prototype.setEnctype = function(v){ this.setAttribute('enctype',v); return this; };
         | 
| 1901 | 
            +
            			tag.prototype.autocomplete = function(v){ return this.getAttribute('autocomplete'); }
         | 
| 1902 | 
            +
            			tag.prototype.setAutocomplete = function(v){ this.setAttribute('autocomplete',v); return this; };
         | 
| 1903 | 
            +
            			tag.prototype.target = function(v){ return this.getAttribute('target'); }
         | 
| 1904 | 
            +
            			tag.prototype.setTarget = function(v){ this.setAttribute('target',v); return this; };
         | 
| 1905 | 
            +
            			
         | 
| 1906 | 
            +
            			tag.prototype.__novalidate = {dom: true,name: 'novalidate'};
         | 
| 1907 | 
            +
            			tag.prototype.novalidate = function(v){ return this.dom().novalidate; }
         | 
| 1908 | 
            +
            			tag.prototype.setNovalidate = function(v){ if (v != this.dom().novalidate) { this.dom().novalidate = v }; return this; };
         | 
| 1857 1909 | 
             
            		});
         | 
| 1858 1910 |  | 
| 1859 1911 | 
             
            		tag$.defineTag('h1');
         | 
| @@ -1876,12 +1928,11 @@ | |
| 1876 1928 | 
             
            		tag$.defineTag('img', function(tag){
         | 
| 1877 1929 | 
             
            			tag.prototype.src = function(v){ return this.getAttribute('src'); }
         | 
| 1878 1930 | 
             
            			tag.prototype.setSrc = function(v){ this.setAttribute('src',v); return this; };
         | 
| 1931 | 
            +
            			tag.prototype.srcset = function(v){ return this.getAttribute('srcset'); }
         | 
| 1932 | 
            +
            			tag.prototype.setSrcset = function(v){ this.setAttribute('srcset',v); return this; };
         | 
| 1879 1933 | 
             
            		});
         | 
| 1880 1934 |  | 
| 1881 1935 | 
             
            		tag$.defineTag('input', function(tag){
         | 
| 1882 | 
            -
            			// can use attr instead
         | 
| 1883 | 
            -
            			tag.prototype.name = function(v){ return this.getAttribute('name'); }
         | 
| 1884 | 
            -
            			tag.prototype.setName = function(v){ this.setAttribute('name',v); return this; };
         | 
| 1885 1936 | 
             
            			tag.prototype.type = function(v){ return this.getAttribute('type'); }
         | 
| 1886 1937 | 
             
            			tag.prototype.setType = function(v){ this.setAttribute('type',v); return this; };
         | 
| 1887 1938 | 
             
            			tag.prototype.required = function(v){ return this.getAttribute('required'); }
         | 
| @@ -1891,32 +1942,27 @@ | |
| 1891 1942 | 
             
            			tag.prototype.autofocus = function(v){ return this.getAttribute('autofocus'); }
         | 
| 1892 1943 | 
             
            			tag.prototype.setAutofocus = function(v){ this.setAttribute('autofocus',v); return this; };
         | 
| 1893 1944 |  | 
| 1894 | 
            -
            			tag.prototype. | 
| 1895 | 
            -
             | 
| 1896 | 
            -
            			};
         | 
| 1897 | 
            -
            			
         | 
| 1898 | 
            -
            			tag.prototype. | 
| 1899 | 
            -
             | 
| 1900 | 
            -
             | 
| 1901 | 
            -
            			} | 
| 1902 | 
            -
            			
         | 
| 1903 | 
            -
            			tag.prototype. | 
| 1904 | 
            -
             | 
| 1905 | 
            -
             | 
| 1906 | 
            -
            			};
         | 
| 1907 | 
            -
            			
         | 
| 1908 | 
            -
            			tag.prototype. | 
| 1909 | 
            -
             | 
| 1910 | 
            -
            			} | 
| 1911 | 
            -
            			
         | 
| 1912 | 
            -
            			tag.prototype. | 
| 1913 | 
            -
             | 
| 1914 | 
            -
            			};
         | 
| 1915 | 
            -
            			
         | 
| 1916 | 
            -
            			tag.prototype.setChecked = function (bool){
         | 
| 1917 | 
            -
            				if (bool != this.dom().checked) { this.dom().checked = bool };
         | 
| 1918 | 
            -
            				return this;
         | 
| 1919 | 
            -
            			};
         | 
| 1945 | 
            +
            			tag.prototype.__value = {dom: true,name: 'value'};
         | 
| 1946 | 
            +
            			tag.prototype.value = function(v){ return this.dom().value; }
         | 
| 1947 | 
            +
            			tag.prototype.setValue = function(v){ if (v != this.dom().value) { this.dom().value = v }; return this; };
         | 
| 1948 | 
            +
            			tag.prototype.__placeholder = {dom: true,name: 'placeholder'};
         | 
| 1949 | 
            +
            			tag.prototype.placeholder = function(v){ return this.dom().placeholder; }
         | 
| 1950 | 
            +
            			tag.prototype.setPlaceholder = function(v){ if (v != this.dom().placeholder) { this.dom().placeholder = v }; return this; };
         | 
| 1951 | 
            +
            			tag.prototype.__required = {dom: true,name: 'required'};
         | 
| 1952 | 
            +
            			tag.prototype.required = function(v){ return this.dom().required; }
         | 
| 1953 | 
            +
            			tag.prototype.setRequired = function(v){ if (v != this.dom().required) { this.dom().required = v }; return this; };
         | 
| 1954 | 
            +
            			tag.prototype.__disabled = {dom: true,name: 'disabled'};
         | 
| 1955 | 
            +
            			tag.prototype.disabled = function(v){ return this.dom().disabled; }
         | 
| 1956 | 
            +
            			tag.prototype.setDisabled = function(v){ if (v != this.dom().disabled) { this.dom().disabled = v }; return this; };
         | 
| 1957 | 
            +
            			tag.prototype.__multiple = {dom: true,name: 'multiple'};
         | 
| 1958 | 
            +
            			tag.prototype.multiple = function(v){ return this.dom().multiple; }
         | 
| 1959 | 
            +
            			tag.prototype.setMultiple = function(v){ if (v != this.dom().multiple) { this.dom().multiple = v }; return this; };
         | 
| 1960 | 
            +
            			tag.prototype.__checked = {dom: true,name: 'checked'};
         | 
| 1961 | 
            +
            			tag.prototype.checked = function(v){ return this.dom().checked; }
         | 
| 1962 | 
            +
            			tag.prototype.setChecked = function(v){ if (v != this.dom().checked) { this.dom().checked = v }; return this; };
         | 
| 1963 | 
            +
            			tag.prototype.__readOnly = {dom: true,name: 'readOnly'};
         | 
| 1964 | 
            +
            			tag.prototype.readOnly = function(v){ return this.dom().readOnly; }
         | 
| 1965 | 
            +
            			tag.prototype.setReadOnly = function(v){ if (v != this.dom().readOnly) { this.dom().readOnly = v }; return this; };
         | 
| 1920 1966 | 
             
            		});
         | 
| 1921 1967 |  | 
| 1922 1968 | 
             
            		tag$.defineTag('ins');
         | 
| @@ -1944,8 +1990,6 @@ | |
| 1944 1990 | 
             
            		tag$.defineTag('menuitem');
         | 
| 1945 1991 |  | 
| 1946 1992 | 
             
            		tag$.defineTag('meta', function(tag){
         | 
| 1947 | 
            -
            			tag.prototype.name = function(v){ return this.getAttribute('name'); }
         | 
| 1948 | 
            -
            			tag.prototype.setName = function(v){ this.setAttribute('name',v); return this; };
         | 
| 1949 1993 | 
             
            			tag.prototype.content = function(v){ return this.getAttribute('content'); }
         | 
| 1950 1994 | 
             
            			tag.prototype.setContent = function(v){ this.setAttribute('content',v); return this; };
         | 
| 1951 1995 | 
             
            			tag.prototype.charset = function(v){ return this.getAttribute('charset'); }
         | 
| @@ -1955,18 +1999,43 @@ | |
| 1955 1999 | 
             
            		tag$.defineTag('meter');
         | 
| 1956 2000 | 
             
            		tag$.defineTag('nav');
         | 
| 1957 2001 | 
             
            		tag$.defineTag('noscript');
         | 
| 1958 | 
            -
            		 | 
| 2002 | 
            +
            		
         | 
| 1959 2003 | 
             
            		tag$.defineTag('ol');
         | 
| 1960 | 
            -
            		tag$.defineTag('optgroup') | 
| 2004 | 
            +
            		tag$.defineTag('optgroup', function(tag){
         | 
| 2005 | 
            +
            			tag.prototype.__disabled = {dom: true,name: 'disabled'};
         | 
| 2006 | 
            +
            			tag.prototype.disabled = function(v){ return this.dom().disabled; }
         | 
| 2007 | 
            +
            			tag.prototype.setDisabled = function(v){ if (v != this.dom().disabled) { this.dom().disabled = v }; return this; };
         | 
| 2008 | 
            +
            		});
         | 
| 1961 2009 |  | 
| 1962 2010 | 
             
            		tag$.defineTag('option', function(tag){
         | 
| 1963 | 
            -
            			tag.prototype. | 
| 1964 | 
            -
            			tag.prototype. | 
| 2011 | 
            +
            			tag.prototype.__disabled = {dom: true,name: 'disabled'};
         | 
| 2012 | 
            +
            			tag.prototype.disabled = function(v){ return this.dom().disabled; }
         | 
| 2013 | 
            +
            			tag.prototype.setDisabled = function(v){ if (v != this.dom().disabled) { this.dom().disabled = v }; return this; };
         | 
| 2014 | 
            +
            			tag.prototype.__selected = {dom: true,name: 'selected'};
         | 
| 2015 | 
            +
            			tag.prototype.selected = function(v){ return this.dom().selected; }
         | 
| 2016 | 
            +
            			tag.prototype.setSelected = function(v){ if (v != this.dom().selected) { this.dom().selected = v }; return this; };
         | 
| 2017 | 
            +
            			tag.prototype.__value = {dom: true,name: 'value'};
         | 
| 2018 | 
            +
            			tag.prototype.value = function(v){ return this.dom().value; }
         | 
| 2019 | 
            +
            			tag.prototype.setValue = function(v){ if (v != this.dom().value) { this.dom().value = v }; return this; };
         | 
| 1965 2020 | 
             
            		});
         | 
| 1966 2021 |  | 
| 1967 2022 | 
             
            		tag$.defineTag('output');
         | 
| 1968 2023 | 
             
            		tag$.defineTag('p');
         | 
| 1969 | 
            -
            		 | 
| 2024 | 
            +
            		
         | 
| 2025 | 
            +
            		tag$.defineTag('object', function(tag){
         | 
| 2026 | 
            +
            			Imba.attr(tag,'type');
         | 
| 2027 | 
            +
            			Imba.attr(tag,'data');
         | 
| 2028 | 
            +
            			Imba.attr(tag,'width');
         | 
| 2029 | 
            +
            			Imba.attr(tag,'height');
         | 
| 2030 | 
            +
            		});
         | 
| 2031 | 
            +
            		
         | 
| 2032 | 
            +
            		tag$.defineTag('param', function(tag){
         | 
| 2033 | 
            +
            			tag.prototype.name = function(v){ return this.getAttribute('name'); }
         | 
| 2034 | 
            +
            			tag.prototype.setName = function(v){ this.setAttribute('name',v); return this; };
         | 
| 2035 | 
            +
            			tag.prototype.value = function(v){ return this.getAttribute('value'); }
         | 
| 2036 | 
            +
            			tag.prototype.setValue = function(v){ this.setAttribute('value',v); return this; };
         | 
| 2037 | 
            +
            		});
         | 
| 2038 | 
            +
            		
         | 
| 1970 2039 | 
             
            		tag$.defineTag('pre');
         | 
| 1971 2040 | 
             
            		tag$.defineTag('progress');
         | 
| 1972 2041 | 
             
            		tag$.defineTag('q');
         | 
| @@ -1990,23 +2059,21 @@ | |
| 1990 2059 | 
             
            		tag$.defineTag('section');
         | 
| 1991 2060 |  | 
| 1992 2061 | 
             
            		tag$.defineTag('select', function(tag){
         | 
| 1993 | 
            -
            			tag.prototype.name = function(v){ return this.getAttribute('name'); }
         | 
| 1994 | 
            -
            			tag.prototype.setName = function(v){ this.setAttribute('name',v); return this; };
         | 
| 1995 2062 | 
             
            			tag.prototype.multiple = function(v){ return this.getAttribute('multiple'); }
         | 
| 1996 2063 | 
             
            			tag.prototype.setMultiple = function(v){ this.setAttribute('multiple',v); return this; };
         | 
| 1997 | 
            -
            			tag.prototype.required = function(v){ return this.getAttribute('required'); }
         | 
| 1998 | 
            -
            			tag.prototype.setRequired = function(v){ this.setAttribute('required',v); return this; };
         | 
| 1999 | 
            -
            			tag.prototype.disabled = function(v){ return this.getAttribute('disabled'); }
         | 
| 2000 | 
            -
            			tag.prototype.setDisabled = function(v){ this.setAttribute('disabled',v); return this; };
         | 
| 2001 2064 |  | 
| 2002 | 
            -
            			tag.prototype. | 
| 2003 | 
            -
             | 
| 2004 | 
            -
            			};
         | 
| 2005 | 
            -
            			
         | 
| 2006 | 
            -
            			tag.prototype. | 
| 2007 | 
            -
             | 
| 2008 | 
            -
             | 
| 2009 | 
            -
            			} | 
| 2065 | 
            +
            			tag.prototype.__disabled = {dom: true,name: 'disabled'};
         | 
| 2066 | 
            +
            			tag.prototype.disabled = function(v){ return this.dom().disabled; }
         | 
| 2067 | 
            +
            			tag.prototype.setDisabled = function(v){ if (v != this.dom().disabled) { this.dom().disabled = v }; return this; };
         | 
| 2068 | 
            +
            			tag.prototype.__required = {dom: true,name: 'required'};
         | 
| 2069 | 
            +
            			tag.prototype.required = function(v){ return this.dom().required; }
         | 
| 2070 | 
            +
            			tag.prototype.setRequired = function(v){ if (v != this.dom().required) { this.dom().required = v }; return this; };
         | 
| 2071 | 
            +
            			tag.prototype.__readOnly = {dom: true,name: 'readOnly'};
         | 
| 2072 | 
            +
            			tag.prototype.readOnly = function(v){ return this.dom().readOnly; }
         | 
| 2073 | 
            +
            			tag.prototype.setReadOnly = function(v){ if (v != this.dom().readOnly) { this.dom().readOnly = v }; return this; };
         | 
| 2074 | 
            +
            			tag.prototype.__value = {dom: true,name: 'value'};
         | 
| 2075 | 
            +
            			tag.prototype.value = function(v){ return this.dom().value; }
         | 
| 2076 | 
            +
            			tag.prototype.setValue = function(v){ if (v != this.dom().value) { this.dom().value = v }; return this; };
         | 
| 2010 2077 | 
             
            		});
         | 
| 2011 2078 |  | 
| 2012 2079 |  | 
| @@ -2023,12 +2090,6 @@ | |
| 2023 2090 | 
             
            		tag$.defineTag('td');
         | 
| 2024 2091 |  | 
| 2025 2092 | 
             
            		tag$.defineTag('textarea', function(tag){
         | 
| 2026 | 
            -
            			tag.prototype.name = function(v){ return this.getAttribute('name'); }
         | 
| 2027 | 
            -
            			tag.prototype.setName = function(v){ this.setAttribute('name',v); return this; };
         | 
| 2028 | 
            -
            			tag.prototype.disabled = function(v){ return this.getAttribute('disabled'); }
         | 
| 2029 | 
            -
            			tag.prototype.setDisabled = function(v){ this.setAttribute('disabled',v); return this; };
         | 
| 2030 | 
            -
            			tag.prototype.required = function(v){ return this.getAttribute('required'); }
         | 
| 2031 | 
            -
            			tag.prototype.setRequired = function(v){ this.setAttribute('required',v); return this; };
         | 
| 2032 2093 | 
             
            			tag.prototype.rows = function(v){ return this.getAttribute('rows'); }
         | 
| 2033 2094 | 
             
            			tag.prototype.setRows = function(v){ this.setAttribute('rows',v); return this; };
         | 
| 2034 2095 | 
             
            			tag.prototype.cols = function(v){ return this.getAttribute('cols'); }
         | 
| @@ -2036,23 +2097,21 @@ | |
| 2036 2097 | 
             
            			tag.prototype.autofocus = function(v){ return this.getAttribute('autofocus'); }
         | 
| 2037 2098 | 
             
            			tag.prototype.setAutofocus = function(v){ this.setAttribute('autofocus',v); return this; };
         | 
| 2038 2099 |  | 
| 2039 | 
            -
            			tag.prototype. | 
| 2040 | 
            -
             | 
| 2041 | 
            -
            			};
         | 
| 2042 | 
            -
            			
         | 
| 2043 | 
            -
            			tag.prototype. | 
| 2044 | 
            -
             | 
| 2045 | 
            -
             | 
| 2046 | 
            -
            			} | 
| 2047 | 
            -
            			
         | 
| 2048 | 
            -
            			tag.prototype. | 
| 2049 | 
            -
             | 
| 2050 | 
            -
             | 
| 2051 | 
            -
            			};
         | 
| 2052 | 
            -
            			
         | 
| 2053 | 
            -
            			tag.prototype. | 
| 2054 | 
            -
            				return this.dom().placeholder;
         | 
| 2055 | 
            -
            			};
         | 
| 2100 | 
            +
            			tag.prototype.__value = {dom: true,name: 'value'};
         | 
| 2101 | 
            +
            			tag.prototype.value = function(v){ return this.dom().value; }
         | 
| 2102 | 
            +
            			tag.prototype.setValue = function(v){ if (v != this.dom().value) { this.dom().value = v }; return this; };
         | 
| 2103 | 
            +
            			tag.prototype.__disabled = {dom: true,name: 'disabled'};
         | 
| 2104 | 
            +
            			tag.prototype.disabled = function(v){ return this.dom().disabled; }
         | 
| 2105 | 
            +
            			tag.prototype.setDisabled = function(v){ if (v != this.dom().disabled) { this.dom().disabled = v }; return this; };
         | 
| 2106 | 
            +
            			tag.prototype.__required = {dom: true,name: 'required'};
         | 
| 2107 | 
            +
            			tag.prototype.required = function(v){ return this.dom().required; }
         | 
| 2108 | 
            +
            			tag.prototype.setRequired = function(v){ if (v != this.dom().required) { this.dom().required = v }; return this; };
         | 
| 2109 | 
            +
            			tag.prototype.__readOnly = {dom: true,name: 'readOnly'};
         | 
| 2110 | 
            +
            			tag.prototype.readOnly = function(v){ return this.dom().readOnly; }
         | 
| 2111 | 
            +
            			tag.prototype.setReadOnly = function(v){ if (v != this.dom().readOnly) { this.dom().readOnly = v }; return this; };
         | 
| 2112 | 
            +
            			tag.prototype.__placeholder = {dom: true,name: 'placeholder'};
         | 
| 2113 | 
            +
            			tag.prototype.placeholder = function(v){ return this.dom().placeholder; }
         | 
| 2114 | 
            +
            			tag.prototype.setPlaceholder = function(v){ if (v != this.dom().placeholder) { this.dom().placeholder = v }; return this; };
         | 
| 2056 2115 | 
             
            		});
         | 
| 2057 2116 |  | 
| 2058 2117 | 
             
            		tag$.defineTag('tfoot');
         | 
| @@ -2065,9 +2124,41 @@ | |
| 2065 2124 | 
             
            		tag$.defineTag('u');
         | 
| 2066 2125 | 
             
            		tag$.defineTag('ul');
         | 
| 2067 2126 | 
             
            		tag$.defineTag('video');
         | 
| 2068 | 
            -
            		 | 
| 2069 | 
            -
             | 
| 2070 | 
            -
             | 
| 2127 | 
            +
            		tag$.defineTag('wbr');
         | 
| 2128 | 
            +
            		
         | 
| 2129 | 
            +
            		// var idls =
         | 
| 2130 | 
            +
            		// 	name: ['button','form','fieldset','iframe','input','keygen','object','output','select','textarea','map','meta','param']
         | 
| 2131 | 
            +
            		// 	src: ['audio','embed','iframe','img','input','script','source','track','video']
         | 
| 2132 | 
            +
            		// 	disabled: ['button','fieldset','input','keygen','optgroup','option','select','textarea'] # 'command',
         | 
| 2133 | 
            +
            		// 	required: ['input','select','textarea']
         | 
| 2134 | 
            +
            		
         | 
| 2135 | 
            +
            		// for own name,tags of idls
         | 
| 2136 | 
            +
            		// 	idls[name] = tags.map do |name|
         | 
| 2137 | 
            +
            		// 		console.log name
         | 
| 2138 | 
            +
            		// 		Imba.TAGS[name][:prototype]
         | 
| 2139 | 
            +
            		// 
         | 
| 2140 | 
            +
            		// for typ in idls:src
         | 
| 2141 | 
            +
            		// 	def typ.src do dom:src
         | 
| 2142 | 
            +
            		// 	def typ.setSrc val
         | 
| 2143 | 
            +
            		// 		dom:src = val if val != dom:src
         | 
| 2144 | 
            +
            		// 		self
         | 
| 2145 | 
            +
            		// 
         | 
| 2146 | 
            +
            		// for typ in idls:disabled
         | 
| 2147 | 
            +
            		// 	def typ.disabled do dom:disabled
         | 
| 2148 | 
            +
            		// 	def typ.setDisabled val
         | 
| 2149 | 
            +
            		// 		dom:disabled = val if dom:disabled != !!val
         | 
| 2150 | 
            +
            		// 		self
         | 
| 2151 | 
            +
            		// 
         | 
| 2152 | 
            +
            		// for typ in idls:required
         | 
| 2153 | 
            +
            		// 	def typ.required do dom:required
         | 
| 2154 | 
            +
            		// 	def typ.setRequired val
         | 
| 2155 | 
            +
            		// 		dom:required = val if dom:required != !!val
         | 
| 2156 | 
            +
            		// 		self
         | 
| 2157 | 
            +
            		
         | 
| 2158 | 
            +
            		
         | 
| 2159 | 
            +
            		return true;
         | 
| 2160 | 
            +
             | 
| 2161 | 
            +
            	})();
         | 
| 2071 2162 |  | 
| 2072 2163 | 
             
            /***/ },
         | 
| 2073 2164 | 
             
            /* 7 */
         | 
| @@ -2079,7 +2170,7 @@ | |
| 2079 2170 | 
             
            		};
         | 
| 2080 2171 |  | 
| 2081 2172 |  | 
| 2082 | 
            -
            		tag$. | 
| 2173 | 
            +
            		tag$.ns('svg').defineTag('svgelement', function(tag){
         | 
| 2083 2174 |  | 
| 2084 2175 | 
             
            			tag.namespaceURI = function (){
         | 
| 2085 2176 | 
             
            				return "http://www.w3.org/2000/svg";
         | 
| @@ -2118,20 +2209,20 @@ | |
| 2118 2209 | 
             
            			Imba.attr(tag,'stroke-width');
         | 
| 2119 2210 | 
             
            		});
         | 
| 2120 2211 |  | 
| 2121 | 
            -
            		tag$. | 
| 2212 | 
            +
            		tag$.ns('svg').defineTag('svg', function(tag){
         | 
| 2122 2213 | 
             
            			Imba.attr(tag,'viewbox');
         | 
| 2123 2214 | 
             
            		});
         | 
| 2124 2215 |  | 
| 2125 | 
            -
            		tag$. | 
| 2216 | 
            +
            		tag$.ns('svg').defineTag('g');
         | 
| 2126 2217 |  | 
| 2127 | 
            -
            		tag$. | 
| 2218 | 
            +
            		tag$.ns('svg').defineTag('defs');
         | 
| 2128 2219 |  | 
| 2129 | 
            -
            		tag$. | 
| 2220 | 
            +
            		tag$.ns('svg').defineTag('symbol', function(tag){
         | 
| 2130 2221 | 
             
            			Imba.attr(tag,'preserveAspectRatio');
         | 
| 2131 2222 | 
             
            			Imba.attr(tag,'viewBox');
         | 
| 2132 2223 | 
             
            		});
         | 
| 2133 2224 |  | 
| 2134 | 
            -
            		tag$. | 
| 2225 | 
            +
            		tag$.ns('svg').defineTag('marker', function(tag){
         | 
| 2135 2226 | 
             
            			Imba.attr(tag,'markerUnits');
         | 
| 2136 2227 | 
             
            			Imba.attr(tag,'refX');
         | 
| 2137 2228 | 
             
            			Imba.attr(tag,'refY');
         | 
| @@ -2143,45 +2234,45 @@ | |
| 2143 2234 |  | 
| 2144 2235 | 
             
            		// Basic shapes
         | 
| 2145 2236 |  | 
| 2146 | 
            -
            		tag$. | 
| 2237 | 
            +
            		tag$.ns('svg').defineTag('rect', function(tag){
         | 
| 2147 2238 | 
             
            			Imba.attr(tag,'rx');
         | 
| 2148 2239 | 
             
            			Imba.attr(tag,'ry');
         | 
| 2149 2240 | 
             
            		});
         | 
| 2150 2241 |  | 
| 2151 | 
            -
            		tag$. | 
| 2242 | 
            +
            		tag$.ns('svg').defineTag('circle', function(tag){
         | 
| 2152 2243 | 
             
            			Imba.attr(tag,'cx');
         | 
| 2153 2244 | 
             
            			Imba.attr(tag,'cy');
         | 
| 2154 2245 | 
             
            			Imba.attr(tag,'r');
         | 
| 2155 2246 | 
             
            		});
         | 
| 2156 2247 |  | 
| 2157 | 
            -
            		tag$. | 
| 2248 | 
            +
            		tag$.ns('svg').defineTag('ellipse', function(tag){
         | 
| 2158 2249 | 
             
            			Imba.attr(tag,'cx');
         | 
| 2159 2250 | 
             
            			Imba.attr(tag,'cy');
         | 
| 2160 2251 | 
             
            			Imba.attr(tag,'rx');
         | 
| 2161 2252 | 
             
            			Imba.attr(tag,'ry');
         | 
| 2162 2253 | 
             
            		});
         | 
| 2163 2254 |  | 
| 2164 | 
            -
            		tag$. | 
| 2255 | 
            +
            		tag$.ns('svg').defineTag('path', function(tag){
         | 
| 2165 2256 | 
             
            			Imba.attr(tag,'d');
         | 
| 2166 2257 | 
             
            			Imba.attr(tag,'pathLength');
         | 
| 2167 2258 | 
             
            		});
         | 
| 2168 2259 |  | 
| 2169 | 
            -
            		tag$. | 
| 2260 | 
            +
            		tag$.ns('svg').defineTag('line', function(tag){
         | 
| 2170 2261 | 
             
            			Imba.attr(tag,'x1');
         | 
| 2171 2262 | 
             
            			Imba.attr(tag,'x2');
         | 
| 2172 2263 | 
             
            			Imba.attr(tag,'y1');
         | 
| 2173 2264 | 
             
            			Imba.attr(tag,'y2');
         | 
| 2174 2265 | 
             
            		});
         | 
| 2175 2266 |  | 
| 2176 | 
            -
            		tag$. | 
| 2267 | 
            +
            		tag$.ns('svg').defineTag('polyline', function(tag){
         | 
| 2177 2268 | 
             
            			Imba.attr(tag,'points');
         | 
| 2178 2269 | 
             
            		});
         | 
| 2179 2270 |  | 
| 2180 | 
            -
            		tag$. | 
| 2271 | 
            +
            		tag$.ns('svg').defineTag('polygon', function(tag){
         | 
| 2181 2272 | 
             
            			Imba.attr(tag,'points');
         | 
| 2182 2273 | 
             
            		});
         | 
| 2183 2274 |  | 
| 2184 | 
            -
            		tag$. | 
| 2275 | 
            +
            		tag$.ns('svg').defineTag('text', function(tag){
         | 
| 2185 2276 | 
             
            			Imba.attr(tag,'dx');
         | 
| 2186 2277 | 
             
            			Imba.attr(tag,'dy');
         | 
| 2187 2278 | 
             
            			Imba.attr(tag,'text-anchor');
         | 
| @@ -2190,7 +2281,7 @@ | |
| 2190 2281 | 
             
            			Imba.attr(tag,'lengthAdjust');
         | 
| 2191 2282 | 
             
            		});
         | 
| 2192 2283 |  | 
| 2193 | 
            -
            		return tag$. | 
| 2284 | 
            +
            		return tag$.ns('svg').defineTag('tspan', function(tag){
         | 
| 2194 2285 | 
             
            			Imba.attr(tag,'dx');
         | 
| 2195 2286 | 
             
            			Imba.attr(tag,'dy');
         | 
| 2196 2287 | 
             
            			Imba.attr(tag,'rotate');
         | 
| @@ -2198,7 +2289,7 @@ | |
| 2198 2289 | 
             
            			Imba.attr(tag,'lengthAdjust');
         | 
| 2199 2290 | 
             
            		});
         | 
| 2200 2291 |  | 
| 2201 | 
            -
            	})()
         | 
| 2292 | 
            +
            	})();
         | 
| 2202 2293 |  | 
| 2203 2294 | 
             
            /***/ },
         | 
| 2204 2295 | 
             
            /* 8 */
         | 
| @@ -2283,7 +2374,7 @@ | |
| 2283 2374 | 
             
            					};
         | 
| 2284 2375 |  | 
| 2285 2376 | 
             
            					tag.prototype.flag = function (ref,bool){
         | 
| 2286 | 
            -
            						if (arguments.length == 2 &&  | 
| 2377 | 
            +
            						if (arguments.length == 2 && !!bool === false) {
         | 
| 2287 2378 | 
             
            							return this.unflag(ref);
         | 
| 2288 2379 | 
             
            						};
         | 
| 2289 2380 | 
             
            						return this.addFlag(ref);
         | 
| @@ -2293,7 +2384,7 @@ | |
| 2293 2384 | 
             
            			};
         | 
| 2294 2385 | 
             
            		};
         | 
| 2295 2386 |  | 
| 2296 | 
            -
            	})()
         | 
| 2387 | 
            +
            	})();
         | 
| 2297 2388 |  | 
| 2298 2389 | 
             
            /***/ },
         | 
| 2299 2390 | 
             
            /* 9 */
         | 
| @@ -2568,7 +2659,7 @@ | |
| 2568 2659 | 
             
            		};
         | 
| 2569 2660 |  | 
| 2570 2661 | 
             
            		Imba.Touch.prototype.isCaptured = function (){
         | 
| 2571 | 
            -
            			return  | 
| 2662 | 
            +
            			return !!this._captured;
         | 
| 2572 2663 | 
             
            		};
         | 
| 2573 2664 |  | 
| 2574 2665 | 
             
            		/*
         | 
| @@ -2610,6 +2701,7 @@ | |
| 2610 2701 | 
             
            		Imba.Touch.prototype.setSuppress = function (value){
         | 
| 2611 2702 | 
             
            			console.warn('Imba.Touch#suppress= is deprecated');
         | 
| 2612 2703 | 
             
            			this._supress = value;
         | 
| 2704 | 
            +
            			this;
         | 
| 2613 2705 | 
             
            			return this;
         | 
| 2614 2706 | 
             
            		};
         | 
| 2615 2707 |  | 
| @@ -3015,6 +3107,7 @@ | |
| 3015 3107 |  | 
| 3016 3108 | 
             
            		Imba.Event.prototype.setType = function (type){
         | 
| 3017 3109 | 
             
            			this._type = type;
         | 
| 3110 | 
            +
            			this;
         | 
| 3018 3111 | 
             
            			return this;
         | 
| 3019 3112 | 
             
            		};
         | 
| 3020 3113 |  | 
| @@ -3067,7 +3160,7 @@ | |
| 3067 3160 | 
             
            		};
         | 
| 3068 3161 |  | 
| 3069 3162 | 
             
            		Imba.Event.prototype.isSilenced = function (){
         | 
| 3070 | 
            -
            			return  | 
| 3163 | 
            +
            			return !!this._silenced;
         | 
| 3071 3164 | 
             
            		};
         | 
| 3072 3165 |  | 
| 3073 3166 | 
             
            		/*
         | 
| @@ -3115,7 +3208,7 @@ | |
| 3115 3208 | 
             
            				var ki = this.event().keyIdentifier;
         | 
| 3116 3209 | 
             
            				var sym = Imba.KEYMAP[this.event().keyCode];
         | 
| 3117 3210 |  | 
| 3118 | 
            -
            				if (! | 
| 3211 | 
            +
            				if (!sym && ki.substr(0,2) == "U+") {
         | 
| 3119 3212 | 
             
            					sym = String.fromCharCode(parseInt(ki.substr(2),16));
         | 
| 3120 3213 | 
             
            				};
         | 
| 3121 3214 | 
             
            				return sym;
         | 
| @@ -3324,6 +3417,12 @@ | |
| 3324 3417 | 
             
            			return this;
         | 
| 3325 3418 | 
             
            		};
         | 
| 3326 3419 |  | 
| 3420 | 
            +
            		/*
         | 
| 3421 | 
            +
            		
         | 
| 3422 | 
            +
            			Create a new Imba.Event
         | 
| 3423 | 
            +
            		
         | 
| 3424 | 
            +
            			*/
         | 
| 3425 | 
            +
            		
         | 
| 3327 3426 | 
             
            		Imba.EventManager.prototype.create = function (type,target,pars){
         | 
| 3328 3427 | 
             
            			if(!pars||pars.constructor !== Object) pars = {};
         | 
| 3329 3428 | 
             
            			var data = pars.data !== undefined ? pars.data : null;
         | 
| @@ -3334,7 +3433,12 @@ | |
| 3334 3433 | 
             
            			return event;
         | 
| 3335 3434 | 
             
            		};
         | 
| 3336 3435 |  | 
| 3337 | 
            -
            		 | 
| 3436 | 
            +
            		/*
         | 
| 3437 | 
            +
            		
         | 
| 3438 | 
            +
            			Trigger / process an Imba.Event.
         | 
| 3439 | 
            +
            		
         | 
| 3440 | 
            +
            			*/
         | 
| 3441 | 
            +
            		
         | 
| 3338 3442 | 
             
            		Imba.EventManager.prototype.trigger = function (){
         | 
| 3339 3443 | 
             
            			return this.create.apply(this,arguments).process();
         | 
| 3340 3444 | 
             
            		};
         | 
| @@ -3434,8 +3538,8 @@ | |
| 3434 3538 |  | 
| 3435 3539 | 
             
            		Imba.Events.register(['mousedown','mouseup']);
         | 
| 3436 3540 | 
             
            		return (Imba.Events.setEnabled(true),true);
         | 
| 3437 | 
            -
             | 
| 3438 | 
            -
            	})()
         | 
| 3541 | 
            +
             | 
| 3542 | 
            +
            	})();
         | 
| 3439 3543 |  | 
| 3440 3544 | 
             
            /***/ },
         | 
| 3441 3545 | 
             
            /* 10 */
         | 
| @@ -3455,7 +3559,7 @@ | |
| 3455 3559 | 
             
            				for (var i = 0, ary = iter$(node), len = ary.length; i < len; i++) {
         | 
| 3456 3560 | 
             
            					removeNested(root,ary[i],caret);
         | 
| 3457 3561 | 
             
            				};
         | 
| 3458 | 
            -
            			} else {
         | 
| 3562 | 
            +
            			} else if (node != null) {
         | 
| 3459 3563 | 
             
            				// what if this is not null?!?!?
         | 
| 3460 3564 | 
             
            				// take a chance and remove a text-elementng
         | 
| 3461 3565 | 
             
            				var next = caret ? (caret.nextSibling) : (root._dom.firstChild);
         | 
| @@ -3682,7 +3786,7 @@ | |
| 3682 3786 | 
             
            					};
         | 
| 3683 3787 | 
             
            				} else if (old instanceof ImbaTag) {
         | 
| 3684 3788 | 
             
            					root.removeChild(old);
         | 
| 3685 | 
            -
            				} else if (! | 
| 3789 | 
            +
            				} else if (!oldIsNull) {
         | 
| 3686 3790 | 
             
            					// old was a string-like object?
         | 
| 3687 3791 | 
             
            					root.removeChild(caret ? (caret.nextSibling) : (root._dom.firstChild));
         | 
| 3688 3792 | 
             
            				};
         | 
| @@ -3690,11 +3794,11 @@ | |
| 3690 3794 | 
             
            				return insertNestedAfter(root,new$,caret);
         | 
| 3691 3795 | 
             
            				// remove old
         | 
| 3692 3796 | 
             
            			} else if (new$ instanceof ImbaTag) {
         | 
| 3693 | 
            -
            				if (! | 
| 3797 | 
            +
            				if (!oldIsNull) { removeNested(root,old,caret) };
         | 
| 3694 3798 | 
             
            				insertNestedAfter(root,new$,caret);
         | 
| 3695 3799 | 
             
            				return new$;
         | 
| 3696 3800 | 
             
            			} else if (newIsNull) {
         | 
| 3697 | 
            -
            				if (! | 
| 3801 | 
            +
            				if (!oldIsNull) { removeNested(root,old,caret) };
         | 
| 3698 3802 | 
             
            				return caret;
         | 
| 3699 3803 | 
             
            			} else {
         | 
| 3700 3804 | 
             
            				// if old did not exist we need to add a new directly
         | 
| @@ -3704,7 +3808,7 @@ | |
| 3704 3808 | 
             
            					removeNested(root,old,caret);
         | 
| 3705 3809 | 
             
            				} else if (old instanceof ImbaTag) {
         | 
| 3706 3810 | 
             
            					root.removeChild(old);
         | 
| 3707 | 
            -
            				} else if (! | 
| 3811 | 
            +
            				} else if (!oldIsNull) {
         | 
| 3708 3812 | 
             
            					// ...
         | 
| 3709 3813 | 
             
            					nextNode = caret ? (caret.nextSibling) : (root._dom.firstChild);
         | 
| 3710 3814 | 
             
            					if ((nextNode instanceof Text) && nextNode.textContent != new$) {
         | 
| @@ -3728,7 +3832,7 @@ | |
| 3728 3832 | 
             
            					return this;
         | 
| 3729 3833 | 
             
            				};
         | 
| 3730 3834 |  | 
| 3731 | 
            -
            				if (! | 
| 3835 | 
            +
            				if (!old) {
         | 
| 3732 3836 | 
             
            					this.empty();
         | 
| 3733 3837 | 
             
            					appendNested(this,new$);
         | 
| 3734 3838 | 
             
            				} else if (typ == 2) {
         | 
| @@ -3796,11 +3900,12 @@ | |
| 3796 3900 | 
             
            					this._children = text;
         | 
| 3797 3901 | 
             
            					this.dom().textContent = text == null || text === false ? ('') : (text);
         | 
| 3798 3902 | 
             
            				};
         | 
| 3903 | 
            +
            				this;
         | 
| 3799 3904 | 
             
            				return this;
         | 
| 3800 3905 | 
             
            			};
         | 
| 3801 3906 | 
             
            		});
         | 
| 3802 3907 |  | 
| 3803 | 
            -
            	})()
         | 
| 3908 | 
            +
            	})();
         | 
| 3804 3909 |  | 
| 3805 3910 | 
             
            /***/ },
         | 
| 3806 3911 | 
             
            /* 11 */
         | 
| @@ -3826,7 +3931,7 @@ | |
| 3826 3931 | 
             
            				this._nodes = res;
         | 
| 3827 3932 | 
             
            			};
         | 
| 3828 3933 |  | 
| 3829 | 
            -
            			this._lazy = ! | 
| 3934 | 
            +
            			this._lazy = !nodes;
         | 
| 3830 3935 | 
             
            			return this;
         | 
| 3831 3936 | 
             
            		};
         | 
| 3832 3937 |  | 
| @@ -4041,8 +4146,7 @@ | |
| 4041 4146 | 
             
            		});
         | 
| 4042 4147 |  | 
| 4043 4148 |  | 
| 4044 | 
            -
            	})()
         | 
| 4149 | 
            +
            	})();
         | 
| 4045 4150 |  | 
| 4046 4151 | 
             
            /***/ }
         | 
| 4047 | 
            -
            /******/ ]);
         | 
| 4048 | 
            -
            //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgYmNmNDBhNWMzMzRhYzIxOTc1MzEiLCJ3ZWJwYWNrOi8vL3NyYy9pbWJhL2luZGV4LmltYmEiLCJ3ZWJwYWNrOi8vL3NyYy9pbWJhL2ltYmEuaW1iYSIsIndlYnBhY2s6Ly8vc3JjL2ltYmEvY29yZS5ldmVudHMuaW1iYSIsIndlYnBhY2s6Ly8vc3JjL2ltYmEvc2NoZWR1bGVyLmltYmEiLCJ3ZWJwYWNrOi8vL3NyYy9pbWJhL3RhZy5pbWJhIiwid2VicGFjazovLy9zcmMvaW1iYS9kb20uaW1iYSIsIndlYnBhY2s6Ly8vc3JjL2ltYmEvZG9tLmh0bWwuaW1iYSIsIndlYnBhY2s6Ly8vc3JjL2ltYmEvZG9tLnN2Zy5pbWJhIiwid2VicGFjazovLy9zcmMvaW1iYS9kb20uY2xpZW50LmltYmEiLCJ3ZWJwYWNrOi8vL3NyYy9pbWJhL2RvbS5ldmVudHMuaW1iYSIsIndlYnBhY2s6Ly8vc3JjL2ltYmEvZG9tLnN0YXRpYy5pbWJhIiwid2VicGFjazovLy9zcmMvaW1iYS9zZWxlY3Rvci5pbWJhIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1QkFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7RUNyQ0EsV0FBVSxLQUFLO0dBQ2Q7R0FDQTtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0E7O0dBRUEsSUFBRyxLQUFLO0lBQ1A7OztHQUVELElBQUcsSUFBSztJQUNQO0lBQ0E7SUFDQTs7O1VBRUQ7O1VBRUEsUUFBUSxrQkFBYSxLQUFLOzs7Ozs7Ozs7O0VDcEIzQixXQUFVLE9BQU87O0dBRWhCLE9BQU8sRUFBRTs7O01BRU4sU0FBUyxVQUFVLE9BQU8sWUFBWSxRQUFTLEdB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ckM7OztFQUVSLEtBdklVOzs7Ozs7OztFQTZJVixLQTdJVTtlQThJVCw2QkFBZSxFQUFFLEtBQUs7Ozs7Ozs7RUFLdkIsS0FuSlU7ZUFvSlQsNkJBQWUsRUFBRSxPQUFPOzs7OztLQUl2QixtQ0FBaUIsS0FBSyxTQUFhLElBQUs7OztNQUd2QztPQUNDLEdBQUcsR0FBRyxNQUFNLEdBQUcsS0FBSyxZQUFVLGNBQWM7VUFDaEQsR0FBRyxZQUFPLElBQUk7Ozs7OztTQUtSO0dBQ047Z0JBQTBCLEtBQUssaUJBQWlCOztHQUNoRDtnQkFBdUIsS0FBSyxjQUFjOzs7OztHQUkxQztlQUFnQixLQUFLLFNBQWEiLCJmaWxlIjoiLi9kaXN0L2ltYmEuZGV2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGlkOiBtb2R1bGVJZCxcbiBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmxvYWRlZCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiB3ZWJwYWNrL2Jvb3RzdHJhcCBiY2Y0MGE1YzMzNGFjMjE5NzUzMVxuICoqLyIsIlxuaWYgdHlwZW9mIEltYmEgPT09ICd1bmRlZmluZWQnXG5cdHJlcXVpcmUgJy4vaW1iYSdcblx0cmVxdWlyZSAnLi9jb3JlLmV2ZW50cydcblx0cmVxdWlyZSAnLi9zY2hlZHVsZXInXG5cdHJlcXVpcmUgJy4vdGFnJ1xuXHRyZXF1aXJlICcuL2RvbSdcblx0cmVxdWlyZSAnLi9kb20uaHRtbCdcblx0cmVxdWlyZSAnLi9kb20uc3ZnJ1xuXG5cdGlmIEltYmEuU0VSVkVSXG5cdFx0cmVxdWlyZSAnLi9kb20uc2VydmVyJ1xuXHRcblx0aWYgSW1iYS5DTElFTlRcblx0XHRyZXF1aXJlICcuL2RvbS5jbGllbnQnXG5cdFx0cmVxdWlyZSAnLi9kb20uZXZlbnRzJ1xuXHRcdHJlcXVpcmUgJy4vZG9tLnN0YXRpYydcblxuXHRyZXF1aXJlICcuL3NlbGVjdG9yJ1xuZWxzZVxuXHRjb25zb2xlLndhcm4gXCJJbWJhIHZ7SW1iYS5WRVJTSU9OfSBpcyBhbHJlYWR5IGxvYWRlZFwiXG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBzcmMvaW1iYS9pbmRleC5pbWJhXG4gKiovIiwiaWYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcblx0IyBzaG91bGQgbm90IGdvIHRoZXJlXG5cdGdsb2JhbCA9IHdpbmRvd1xuXG52YXIgaXNDbGllbnQgPSAodHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyBhbmQgdGhpcyA9PSB3aW5kb3cpXG4jIyNcbkltYmEgaXMgdGhlIG5hbWVzcGFjZSBmb3IgYWxsIHJ1bnRpbWUgcmVsYXRlZCB1dGlsaXRpZXNcbkBuYW1lc3BhY2VcbiMjI1xuSW1iYSA9IHtcblx0VkVSU0lPTjogJzAuMTQuMydcblx0Q0xJRU5UOiBpc0NsaWVudFxuXHRTRVJWRVI6ICFpc0NsaWVudFxuXHRERUJVRzogbm9cbn1cblxudmFyIHJlZyA9IC8tLi9nXG5cbiMjI1xuVHJ1ZSBpZiBydW5uaW5nIGluIGNsaWVudCBlbnZpcm9ubWVudC5cbkByZXR1cm4ge2Jvb2x9XG4jIyNcbmRlZiBJbWJhLmlzQ2xpZW50XG5cdEltYmEuQ0xJRU5UID09IHllc1xuXG4jIyNcblRydWUgaWYgcnVubmluZyBpbiBzZXJ2ZXIgZW52aXJvbm1lbnQuXG5AcmV0dXJuIHtib29sfVxuIyMjXG5kZWYgSW1iYS5pc1NlcnZlclxuXHRJbWJhLlNFUlZFUiA9PSB5ZXNcblxuZGVmIEltYmEuc3ViY2xhc3Mgb2JqLCBzdXBcblx0Zm9yIGssdiBvZiBzdXBcblx0XHRvYmpba10gPSB2IGlmIHN1cC5oYXNPd25Qcm9wZXJ0eShrKVxuXG5cdG9iajpwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cDpwcm90b3R5cGUpXG5cdG9iajpfX3N1cGVyX18gPSBvYmo6cHJvdG90eXBlOl9fc3VwZXJfXyA9IHN1cDpwcm90b3R5cGVcblx0b2JqOnByb3RvdHlwZTppbml0aWFsaXplID0gb2JqOnByb3RvdHlwZTpjb25zdHJ1Y3RvciA9IG9ialxuXHRyZXR1cm4gb2JqXG5cbiMjI1xuTGlnaHR3ZWlnaHQgbWV0aG9kIGZvciBtYWtpbmcgYW4gb2JqZWN0IGl0ZXJhYmxlIGluIGltYmFzIGZvci9pbiBsb29wcy5cbklmIHRoZSBjb21waWxlciBjYW5ub3Qgc2F5IGZvciBjZXJ0YWluIHRoYXQgYSB0YXJnZXQgaW4gYSBmb3IgbG9vcCBpcyBhblxuYXJyYXksIGl0IHdpbGwgY2FjaGUgdGhlIGl0ZXJhYmxlIHZlcnNpb24gYmVmb3JlIGxvb3BpbmcuXG5cbmBgYGltYmFcbiMgdGhpcyBpcyB0aGUgd2hvbGUgbWV0aG9kXG5kZWYgSW1iYS5pdGVyYWJsZSBvXG5cdHJldHVybiBvID8gKG86dG9BcnJheSA/IG8udG9BcnJheSA6IG8pIDogW11cblxuY2xhc3MgQ3VzdG9tSXRlcmFibGVcblx0ZGVmIHRvQXJyYXlcblx0XHRbMSwyLDNdXG5cbiMgd2lsbCByZXR1cm4gWzIsNCw2XVxuZm9yIHggaW4gQ3VzdG9tSXRlcmFibGUubmV3XG5cdHggKiAyXG5cbmBgYFxuIyMjXG5kZWYgSW1iYS5pdGVyYWJsZSBvXG5cdHJldHVybiBvID8gKG86dG9BcnJheSA/IG8udG9BcnJheSA6IG8pIDogW11cblxuIyMjXG5Db2VyY2VzIGEgdmFsdWUgaW50byBhIHByb21pc2UuIElmIHZhbHVlIGlzIGFycmF5IGl0IHdpbGxcbmNhbGwgYFByb21pc2UuYWxsKHZhbHVlKWAsIG9yIGlmIGl0IGlzIG5vdCBhIHByb21pc2UgaXQgd2lsbFxud3JhcCB0aGUgdmFsdWUgaW4gYFByb21pc2UucmVzb2x2ZSh2YWx1ZSlgLiBVc2VkIGZvciBleHBlcmltZW50YWxcbmF3YWl0IHN5bnRheC5cbkByZXR1cm4ge1Byb21pc2V9XG4jIyNcbmRlZiBJbWJhLmF3YWl0IHZhbHVlXG5cdGlmIHZhbHVlIGlzYSBBcnJheVxuXHRcdFByb21pc2UuYWxsKHZhbHVlKVxuXHRlbGlmIHZhbHVlIGFuZCB2YWx1ZTp0aGVuXG5cdFx0dmFsdWVcblx0ZWxzZVxuXHRcdFByb21pc2UucmVzb2x2ZSh2YWx1ZSlcblxuZGVmIEltYmEudG9DYW1lbENhc2Ugc3RyXG5cdHN0ci5yZXBsYWNlKHJlZykgZG8gfG18IG0uY2hhckF0KDEpLnRvVXBwZXJDYXNlXG5cbmRlZiBJbWJhLnRvQ2FtZWxDYXNlIHN0clxuXHRzdHIucmVwbGFjZShyZWcpIGRvIHxtfCBtLmNoYXJBdCgxKS50b1VwcGVyQ2FzZVxuXG5kZWYgSW1iYS5pbmRleE9mIGEsYlxuXHRyZXR1cm4gKGIgJiYgYjppbmRleE9mKSA/IGIuaW5kZXhPZihhKSA6IFtdOmluZGV4T2YuY2FsbChhLGIpXG5cbmRlZiBJbWJhLnByb3Agc2NvcGUsIG5hbWUsIG9wdHNcblx0aWYgc2NvcGU6ZGVmaW5lUHJvcGVydHlcblx0XHRyZXR1cm4gc2NvcGUuZGVmaW5lUHJvcGVydHkobmFtZSxvcHRzKVxuXHRyZXR1cm5cblxuZGVmIEltYmEuYXR0ciBzY29wZSwgbmFtZSwgb3B0c1xuXHRpZiBzY29wZTpkZWZpbmVBdHRyaWJ1dGVcblx0XHRyZXR1cm4gc2NvcGUuZGVmaW5lQXR0cmlidXRlKG5hbWUsb3B0cylcblxuXHRsZXQgZ2V0TmFtZSA9IEltYmEudG9DYW1lbENhc2UobmFtZSlcblx0bGV0IHNldE5hbWUgPSBJbWJhLnRvQ2FtZWxDYXNlKCdzZXQtJyArIG5hbWUpXG5cblx0c2NvcGU6cHJvdG90eXBlW2dldE5hbWVdID0gZG9cblx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSlcblxuXHRzY29wZTpwcm90b3R5cGVbc2V0TmFtZV0gPSBkbyB8dmFsdWV8XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUobmFtZSx2YWx1ZSlcblx0XHRyZXR1cm4gdGhpc1xuXG5cdHJldHVyblxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogc3JjL2ltYmEvaW1iYS5pbWJhXG4gKiovIiwiXG5cbmRlZiBlbWl0X18gZXZlbnQsIGFyZ3MsIG5vZGVcblx0IyB2YXIgbm9kZSA9IGNic1tldmVudF1cblx0dmFyIHByZXYsIGNiLCByZXRcblxuXHR3aGlsZSAocHJldiA9IG5vZGUpIGFuZCAobm9kZSA9IG5vZGU6bmV4dClcblx0XHRpZiBjYiA9IG5vZGU6bGlzdGVuZXJcblx0XHRcdGlmIG5vZGU6cGF0aCBhbmQgY2Jbbm9kZTpwYXRoXVxuXHRcdFx0XHRyZXQgPSBhcmdzID8gY2Jbbm9kZTpwYXRoXS5hcHBseShjYixhcmdzKSA6IGNiW25vZGU6cGF0aF0oKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHQjIGNoZWNrIGlmIGl0IGlzIGEgbWV0aG9kP1xuXHRcdFx0XHRyZXQgPSBhcmdzID8gY2IuYXBwbHkobm9kZSwgYXJncykgOiBjYi5jYWxsKG5vZGUpXG5cblx0XHRpZiBub2RlOnRpbWVzICYmIC0tbm9kZTp0aW1lcyA8PSAwXG5cdFx0XHRwcmV2Om5leHQgPSBub2RlOm5leHRcblx0XHRcdG5vZGU6bGlzdGVuZXIgPSBudWxsXG5cdHJldHVyblxuXG4jIG1ldGhvZCBmb3IgcmVnaXN0ZXJpbmcgYSBsaXN0ZW5lciBvbiBvYmplY3RcbmRlZiBJbWJhLmxpc3RlbiBvYmosIGV2ZW50LCBsaXN0ZW5lciwgcGF0aFxuXHR2YXIgY2JzLCBsaXN0LCB0YWlsXG5cdGNicyA9IG9iajpfX2xpc3RlbmVyc19fIHx8PSB7fVxuXHRsaXN0ID0gY2JzW2V2ZW50XSB8fD0ge31cblx0dGFpbCA9IGxpc3Q6dGFpbCB8fCAobGlzdDp0YWlsID0gKGxpc3Q6bmV4dCA9IHt9KSlcblx0dGFpbDpsaXN0ZW5lciA9IGxpc3RlbmVyXG5cdHRhaWw6cGF0aCA9IHBhdGhcblx0bGlzdDp0YWlsID0gdGFpbDpuZXh0ID0ge31cblx0cmV0dXJuIHRhaWxcblxuZGVmIEltYmEub25jZSBvYmosIGV2ZW50LCBsaXN0ZW5lclxuXHR2YXIgdGFpbCA9IEltYmEubGlzdGVuKG9iaixldmVudCxsaXN0ZW5lcilcblx0dGFpbDp0aW1lcyA9IDFcblx0cmV0dXJuIHRhaWxcblxuZGVmIEltYmEudW5saXN0ZW4gb2JqLCBldmVudCwgY2IsIG1ldGhcblx0dmFyIG5vZGUsIHByZXZcblx0dmFyIG1ldGEgPSBvYmo6X19saXN0ZW5lcnNfX1xuXHRyZXR1cm4gdW5sZXNzIG1ldGFcblxuXHRpZiBub2RlID0gbWV0YVtldmVudF1cblx0XHR3aGlsZSAocHJldiA9IG5vZGUpIGFuZCAobm9kZSA9IG5vZGU6bmV4dClcblx0XHRcdGlmIG5vZGUgPT0gY2IgfHwgbm9kZTpsaXN0ZW5lciA9PSBjYlxuXHRcdFx0XHRwcmV2Om5leHQgPSBub2RlOm5leHRcblx0XHRcdFx0IyBjaGVjayBmb3IgY29ycmVjdCBwYXRoIGFzIHdlbGw/XG5cdFx0XHRcdG5vZGU6bGlzdGVuZXIgPSBudWxsXG5cdFx0XHRcdGJyZWFrXG5cdHJldHVyblxuXG5kZWYgSW1iYS5lbWl0IG9iaiwgZXZlbnQsIHBhcmFtc1xuXHRpZiB2YXIgY2IgPSBvYmo6X19saXN0ZW5lcnNfX1xuXHRcdGVtaXRfXyhldmVudCxwYXJhbXMsY2JbZXZlbnRdKSBpZiBjYltldmVudF1cblx0XHRlbWl0X18oZXZlbnQsW2V2ZW50LHBhcmFtc10sY2I6YWxsKSBpZiBjYjphbGwgIyBhbmQgZXZlbnQgIT0gJ2FsbCdcblx0cmV0dXJuXG5cbmRlZiBJbWJhLm9ic2VydmVQcm9wZXJ0eSBvYnNlcnZlciwga2V5LCB0cmlnZ2VyLCB0YXJnZXQsIHByZXZcblx0aWYgcHJldiBhbmQgdHlwZW9mIHByZXYgPT0gJ29iamVjdCdcblx0XHRJbWJhLnVubGlzdGVuKHByZXYsJ2FsbCcsb2JzZXJ2ZXIsdHJpZ2dlcilcblx0aWYgdGFyZ2V0IGFuZCB0eXBlb2YgdGFyZ2V0ID09ICdvYmplY3QnXG5cdFx0SW1iYS5saXN0ZW4odGFyZ2V0LCdhbGwnLG9ic2VydmVyLHRyaWdnZXIpXG5cdHNlbGZcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBzcmMvaW1iYS9jb3JlLmV2ZW50cy5pbWJhXG4gKiovIiwiXG52YXIgcmFmICMgdmVyeSBzaW1wbGUgcmFmIHBvbHlmaWxsXG5yYWYgfHw9IGdsb2JhbDpyZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbnJhZiB8fD0gZ2xvYmFsOndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZVxucmFmIHx8PSBnbG9iYWw6bW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lXG5yYWYgfHw9IGRvIHxibGt8IHNldFRpbWVvdXQoYmxrLDEwMDAgLyA2MClcblxuZGVmIEltYmEudGljayBkXG5cdHJhZihJbWJhLnRpY2tlcikgaWYgQHNjaGVkdWxlZFxuXHRJbWJhLlNjaGVkdWxlci53aWxsUnVuXG5cdGVtaXQoc2VsZiwndGljaycsW2RdKVxuXHRJbWJhLlNjaGVkdWxlci5kaWRSdW5cblx0cmV0dXJuXG5cbmRlZiBJbWJhLnRpY2tlclxuXHRAdGlja2VyIHx8PSBkbyB8ZXwgdGljayhlKVxuXG4jIyNcblxuR2xvYmFsIGFsdGVybmF0aXZlIHRvIHJlcXVlc3RBbmltYXRpb25GcmFtZS4gU2NoZWR1bGUgYSB0YXJnZXRcbnRvIHRpY2sgZXZlcnkgZnJhbWUuIFlvdSBjYW4gc3BlY2lmeSB3aGljaCBtZXRob2QgdG8gY2FsbCBvbiB0aGVcbnRhcmdldCAoZGVmYXVsdHMgdG8gdGljaykuXG5cbiMjI1xuZGVmIEltYmEuc2NoZWR1bGUgdGFyZ2V0LCBtZXRob2QgPSAndGljaydcblx0bGlzdGVuKHNlbGYsJ3RpY2snLHRhcmdldCxtZXRob2QpXG5cdCMgc3RhcnQgc2NoZWR1bGluZyBub3cgaWYgdGhpcyB3YXMgdGhlIGZpcnN0IG9uZVxuXHR1bmxlc3MgQHNjaGVkdWxlZFxuXHRcdEBzY2hlZHVsZWQgPSB5ZXNcblx0XHRyYWYoSW1iYS50aWNrZXIpXG5cdHNlbGZcblxuIyMjXG5cblVuc2NoZWR1bGUgYSBwcmV2aW91c2x5IHNjaGVkdWxlZCB0YXJnZXRcblxuIyMjXG5kZWYgSW1iYS51bnNjaGVkdWxlIHRhcmdldCwgbWV0aG9kXG5cdHVubGlzdGVuKHNlbGYsJ3RpY2snLHRhcmdldCxtZXRob2QpXG5cdHZhciBjYnMgPSBzZWxmOl9fbGlzdGVuZXJzX18gfHw9IHt9XG5cdGlmICFjYnM6dGljayBvciAhY2JzOnRpY2s6bmV4dCBvciAhY2JzOnRpY2s6bmV4dDpsaXN0ZW5lclxuXHRcdEBzY2hlZHVsZWQgPSBub1xuXHRzZWxmXG5cbiMjI1xuXG5MaWdodCB3cmFwcGVyIGFyb3VuZCBuYXRpdmUgc2V0VGltZW91dCB0aGF0IGV4cGVjdHMgdGhlIGJsb2NrIC8gZnVuY3Rpb25cbmFzIGxhc3QgYXJndW1lbnQgKGluc3RlYWQgb2YgZmlyc3QpLiBJdCBhbHNvIHRyaWdnZXJzIGFuIGV2ZW50IHRvIEltYmFcbmFmdGVyIHRoZSB0aW1lb3V0IHRvIGxldCBzY2hlZHVsZXJzIHVwZGF0ZSAodG8gcmVyZW5kZXIgZXRjKSBhZnRlcndhcmRzLlxuXG4jIyNcbmRlZiBJbWJhLnNldFRpbWVvdXQgZGVsYXksICZibG9ja1xuXHRzZXRUaW1lb3V0KCYsZGVsYXkpIGRvXG5cdFx0YmxvY2soKVxuXHRcdEltYmEuU2NoZWR1bGVyLm1hcmtEaXJ0eVxuXHRcdCMgSW1iYS5lbWl0KEltYmEsJ3RpbWVvdXQnLFtibG9ja10pXG5cbiMjI1xuXG5MaWdodCB3cmFwcGVyIGFyb3VuZCBuYXRpdmUgc2V0SW50ZXJ2YWwgdGhhdCBleHBlY3RzIHRoZSBibG9jayAvIGZ1bmN0aW9uXG5hcyBsYXN0IGFyZ3VtZW50IChpbnN0ZWFkIG9mIGZpcnN0KS4gSXQgYWxzbyB0cmlnZ2VycyBhbiBldmVudCB0byBJbWJhXG5hZnRlciBldmVyeSBpbnRlcnZhbCB0byBsZXQgc2NoZWR1bGVycyB1cGRhdGUgKHRvIHJlcmVuZGVyIGV0YykgYWZ0ZXJ3YXJkcy5cblxuIyMjXG5kZWYgSW1iYS5zZXRJbnRlcnZhbCBpbnRlcnZhbCwgJmJsb2NrXG5cdHNldEludGVydmFsKCYsaW50ZXJ2YWwpIGRvXG5cdFx0YmxvY2soKVxuXHRcdEltYmEuU2NoZWR1bGVyLm1hcmtEaXJ0eVxuXHRcdCMgSW1iYS5lbWl0KEltYmEsJ2ludGVydmFsJyxbYmxvY2tdKVxuXG4jIyNcbkNsZWFyIGludGVydmFsIHdpdGggc3BlY2lmaWVkIGlkXG4jIyNcbmRlZiBJbWJhLmNsZWFySW50ZXJ2YWwgaW50ZXJ2YWxcblx0Y2xlYXJJbnRlcnZhbChpbnRlcnZhbClcblxuIyMjXG5DbGVhciB0aW1lb3V0IHdpdGggc3BlY2lmaWVkIGlkXG4jIyNcbmRlZiBJbWJhLmNsZWFyVGltZW91dCB0aW1lb3V0XG5cdGNsZWFyVGltZW91dCh0aW1lb3V0KVxuXG4jIHNob3VsZCBhZGQgYW4gSW1iYS5ydW4gLyBzZXRJbW1lZGlhdGUgdGhhdFxuIyBwdXNoZXMgbGlzdGVuZXIgb250byB0aGUgdGljay1xdWV1ZSB3aXRoIHRpbWVzIC0gb25jZVxuXG5cbiMjI1xuXG5JbnN0YW5jZXMgb2YgSW1iYS5TY2hlZHVsZXIgbWFuYWdlcyB3aGVuIHRvIGNhbGwgYHRpY2soKWAgb24gdGhlaXIgdGFyZ2V0LFxuYXQgYSBzcGVjaWZpZWQgZnJhbWVyYXRlIG9yIHdoZW4gY2VydGFpbiBldmVudHMgb2NjdXIuIFJvb3Qtbm9kZXMgaW4geW91clxuYXBwbGljYXRpb25zIHdpbGwgdXN1YWxseSBoYXZlIGEgc2NoZWR1bGVyIHRvIG1ha2Ugc3VyZSB0aGV5IHJlcmVuZGVyIHdoZW5cbnNvbWV0aGluZyBjaGFuZ2VzLiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG1ha2UgaW5uZXIgY29tcG9uZW50cyB1c2UgdGhlaXJcbm93biBzY2hlZHVsZXJzIHRvIGNvbnRyb2wgd2hlbiB0aGV5IHJlbmRlci5cblxuQGluYW1lIHNjaGVkdWxlclxuXG4jIyNcbmNsYXNzIEltYmEuU2NoZWR1bGVyXG5cblx0ZGVmIHNlbGYubWFya0RpcnR5XG5cdFx0QGRpcnR5ID0geWVzXG5cdFx0c2VsZlxuXG5cdGRlZiBzZWxmLmlzRGlydHlcblx0XHQhIUBkaXJ0eVxuXG5cdGRlZiBzZWxmLndpbGxSdW5cblx0XHRAYWN0aXZlID0geWVzXG5cblx0ZGVmIHNlbGYuZGlkUnVuXG5cdFx0QGFjdGl2ZSA9IG5vXG5cdFx0QGRpcnR5ID0gbm9cblxuXHRkZWYgc2VsZi5pc0FjdGl2ZVxuXHRcdCEhQGFjdGl2ZVxuXG5cdCMjI1xuXHRDcmVhdGUgYSBuZXcgSW1iYS5TY2hlZHVsZXIgZm9yIHNwZWNpZmllZCB0YXJnZXRcblx0QHJldHVybiB7SW1iYS5TY2hlZHVsZXJ9XG5cdCMjI1xuXHRkZWYgaW5pdGlhbGl6ZSB0YXJnZXRcblx0XHRAdGFyZ2V0ID0gdGFyZ2V0XG5cdFx0QG1hcmtlZCA9IG5vXG5cdFx0QGFjdGl2ZSA9IG5vXG5cdFx0QG1hcmtlciA9IGRvIG1hcmtcblx0XHRAdGlja2VyID0gZG8gfGV8IHRpY2soZSlcblx0XHRcblx0XHRAZXZlbnRzID0geWVzXG5cdFx0QGZwcyA9IDFcblxuXHRcdEBkdCA9IDBcblx0XHRAdGltZXN0YW1wID0gMFxuXHRcdEB0aWNrcyA9IDBcblx0XHRAZmx1c2hlcyA9IDBcblxuXHQjIyNcblx0Q2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBzY2hlZHVsZXIgaXMgYWN0aXZlIG9yIG5vdFxuXHRAcmV0dXJuIHtib29sfVxuXHQjIyNcblx0ZGVmIGFjdGl2ZVxuXHRcdEBhY3RpdmVcblxuXHQjIyNcblx0RGVsdGEgdGltZSBiZXR3ZWVuIHRoZSB0d28gbGFzdCB0aWNrc1xuXHRAcmV0dXJuIHtOdW1iZXJ9XG5cdCMjI1xuXHRkZWYgZHRcblx0XHRAZHRcblxuXHQjIyNcblx0Q29uZmlndXJlIHRoZSBzY2hlZHVsZXJcblx0QHJldHVybiB7c2VsZn1cblx0IyMjXG5cdGRlZiBjb25maWd1cmUgZnBzOiAxLCBldmVudHM6IHllc1xuXHRcdEBldmVudHMgPSBldmVudHMgaWYgZXZlbnRzICE9IG51bGxcblx0XHRAZnBzID0gZnBzIGlmIGZwcyAhPSBudWxsXG5cdFx0c2VsZlxuXG5cdCMjI1xuXHRNYXJrIHRoZSBzY2hlZHVsZXIgYXMgZGlydHkuIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdFxuXHR0aGUgc2NoZWR1bGVyIGNhbGxzIGB0YXJnZXQudGlja2Agb24gdGhlIG5leHQgZnJhbWVcblx0QHJldHVybiB7c2VsZn1cblx0IyMjXG5cdGRlZiBtYXJrXG5cdFx0QG1hcmtlZCA9IHllc1xuXHRcdHNlbGZcblxuXHQjIyNcblx0SW5zdGFudGx5IHRyaWdnZXIgdGFyZ2V0LnRpY2sgYW5kIG1hcmsgc2NoZWR1bGVyIGFzIGNsZWFuIChub3QgZGlydHkvbWFya2VkKS5cblx0VGhpcyBpcyBjYWxsZWQgaW1wbGljaXRseSBmcm9tIHRpY2ssIGJ1dCBjYW4gYWxzbyBiZSBjYWxsZWQgbWFudWFsbHkgaWYgeW91XG5cdHJlYWxseSB3YW50IHRvIGZvcmNlIGEgdGljayB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBuZXh0IGZyYW1lLlxuXHRAcmV0dXJuIHtzZWxmfVxuXHQjIyNcblx0ZGVmIGZsdXNoXG5cdFx0QG1hcmtlZCA9IG5vXG5cdFx0QGZsdXNoZXMrK1xuXHRcdEB0YXJnZXQudGlja1xuXHRcdHNlbGZcblxuXHQjIyNcblx0QGZpeG1lIHRoaXMgZXhwZWN0cyByYWYgdG8gcnVuIGF0IDYwIGZwcyBcblxuXHRDYWxsZWQgYXV0b21hdGljYWxseSBvbiBldmVyeSBmcmFtZSB3aGlsZSB0aGUgc2NoZWR1bGVyIGlzIGFjdGl2ZS5cblx0SXQgd2lsbCBvbmx5IGNhbGwgYHRhcmdldC50aWNrYCBpZiB0aGUgc2NoZWR1bGVyIGlzIG1hcmtlZCBkaXJ0eSxcblx0b3Igd2hlbiBhY2NvcmRpbmcgdG8gQGZwcyBzZXR0aW5nLlxuXG5cdElmIHlvdSBoYXZlIHNldCB1cCBhIHNjaGVkdWxlciB3aXRoIGFuIGZwcyBvZiAxLCB0aWNrIHdpbGwgc3RpbGwgYmVcblx0Y2FsbGVkIGV2ZXJ5IGZyYW1lLCBidXQgYHRhcmdldC50aWNrYCB3aWxsIG9ubHkgYmUgY2FsbGVkIG9uY2UgZXZlcnlcblx0c2Vjb25kLCBhbmQgaXQgd2lsbCAqbWFrZSBzdXJlKiBlYWNoIGB0YXJnZXQudGlja2AgaGFwcGVucyBpbiBzZXBhcmF0ZVxuXHRzZWNvbmRzIGFjY29yZGluZyB0byBEYXRlLiBTbyBpZiB5b3UgaGF2ZSBhIG5vZGUgdGhhdCByZW5kZXJzIGEgY2xvY2tcblx0YmFzZWQgb24gRGF0ZS5ub3cgKG9yIHNvbWV0aGluZyBzaW1pbGFyKSwgeW91IGNhbiBzY2hlZHVsZSBpdCB3aXRoIDFmcHMsXG5cdG5ldmVyIG5lZWRpbmcgdG8gd29ycnkgYWJvdXQgdHdvIHRpY2tzIGhhcHBlbmluZyB3aXRoaW4gdGhlIHNhbWUgc2Vjb25kLlxuXHRUaGUgc2FtZSBnb2VzIGZvciA0ZnBzLCAxMGZwcyBldGMuXG5cblx0QHByb3RlY3RlZFxuXHRAcmV0dXJuIHtzZWxmfVxuXHQjIyNcblx0ZGVmIHRpY2sgZGVsdGFcblx0XHRAdGlja3MrK1xuXHRcdEBkdCA9IGRlbHRhXG5cblx0XHRsZXQgZnBzID0gQGZwc1xuXHRcdFxuXHRcdGlmIGZwcyA9PSA2MFxuXHRcdFx0QG1hcmtlZCA9IHllc1xuXHRcdGVsaWYgZnBzID09IDMwXG5cdFx0XHRAbWFya2VkID0geWVzIGlmIEB0aWNrcyAlIDJcblx0XHRlbGlmIGZwc1xuXHRcdFx0IyBpZiBpdCBpcyBsZXNzIHJvdW5kIC0gd2UgdHJpZ2dlciBiYXNlZFxuXHRcdFx0IyBvbiBkYXRlLCBmb3IgY29uc2lzdGVudCByZW5kZXJpbmcuXG5cdFx0XHQjIGllLCBpZiB5b3Ugd2FudCB0byByZW5kZXIgZXZlcnkgc2Vjb25kXG5cdFx0XHQjIGl0IGlzIGltcG9ydGFudCB0aGF0IG5vIHR3byByZW5kZXJzXG5cdFx0XHQjIGhhcHBlbiBkdXJpbmcgdGhlIHNhbWUgc2Vjb25kIChhY2NvcmRpbmcgdG8gRGF0ZSlcblx0XHRcdGxldCBwZXJpb2QgPSAoKDYwIC8gZnBzKSAvIDYwKSAqIDEwMDBcblx0XHRcdGxldCBiZWF0ID0gTWF0aC5mbG9vcihEYXRlLm5vdyAvIHBlcmlvZClcblxuXHRcdFx0aWYgQGJlYXQgIT0gYmVhdFxuXHRcdFx0XHRAYmVhdCA9IGJlYXRcblx0XHRcdFx0QG1hcmtlZCA9IHllc1xuXG5cdFx0Zmx1c2ggaWYgQG1hcmtlZCBvciAoQGV2ZW50cyBhbmQgSW1iYS5TY2hlZHVsZXIuaXNEaXJ0eSlcblx0XHQjIHJlc2NoZWR1bGUgaWYgQGFjdGl2ZVxuXHRcdHNlbGZcblxuXHQjIyNcblx0U3RhcnQgdGhlIHNjaGVkdWxlciBpZiBpdCBpcyBub3QgYWxyZWFkeSBhY3RpdmUuXG5cdCoqV2hpbGUgYWN0aXZlKiosIHRoZSBzY2hlZHVsZXIgd2lsbCBvdmVycmlkZSBgdGFyZ2V0LmNvbW1pdGBcblx0dG8gZG8gbm90aGluZy4gQnkgZGVmYXVsdCBJbWJhLnRhZyNjb21taXQgY2FsbHMgcmVuZGVyLCBzb1xuXHR0aGF0IHJlbmRlcmluZyBpcyBjYXNjYWRlZCB0aHJvdWdoIHRvIGNoaWxkcmVuIHdoZW4gcmVuZGVyaW5nXG5cdGEgbm9kZS4gV2hlbiBhIHNjaGVkdWxlciBpcyBhY3RpdmUgKGZvciBhIG5vZGUpLCBJbWJhIGRpc2FibGVzXG5cdHRoaXMgYXV0b21hdGljIHJlbmRlcmluZy5cblx0IyMjXG5cdGRlZiBhY3RpdmF0ZVxuXHRcdHVubGVzcyBAYWN0aXZlXG5cdFx0XHRAYWN0aXZlID0geWVzXG5cdFx0XHQjIG92ZXJyaWRlIHRhcmdldCNjb21taXQgd2hpbGUgdGhpcyBpcyBhY3RpdmVcblx0XHRcdEBjb21taXQgPSBAdGFyZ2V0OmNvbW1pdFxuXHRcdFx0QHRhcmdldDpjb21taXQgPSBkbyB0aGlzXG5cdFx0XHRJbWJhLnNjaGVkdWxlKHNlbGYpXG5cdFx0XHRJbWJhLmxpc3RlbihJbWJhLCdldmVudCcsc2VsZiwnb25ldmVudCcpIGlmIEBldmVudHNcblx0XHRcdEB0YXJnZXQ/LmZsYWcoJ3NjaGVkdWxlZF8nKVxuXHRcdFx0dGljaygwKSAjIHN0YXJ0IHRpY2tpbmdcblx0XHRyZXR1cm4gc2VsZlxuXG5cdCMjI1xuXHRTdG9wIHRoZSBzY2hlZHVsZXIgaWYgaXQgaXMgYWN0aXZlLlxuXHQjIyNcblx0ZGVmIGRlYWN0aXZhdGVcblx0XHRpZiBAYWN0aXZlXG5cdFx0XHRAYWN0aXZlID0gbm9cblx0XHRcdEB0YXJnZXQ6Y29tbWl0ID0gQGNvbW1pdFxuXHRcdFx0SW1iYS51bnNjaGVkdWxlKHNlbGYpXG5cdFx0XHRJbWJhLnVubGlzdGVuKEltYmEsJ2V2ZW50JyxzZWxmKVxuXHRcdFx0QHRhcmdldD8udW5mbGFnKCdzY2hlZHVsZWRfJylcblx0XHRyZXR1cm4gc2VsZlxuXG5cdGRlZiB0cmFja1xuXHRcdEBtYXJrZXJcblxuXHRkZWYgb25ldmVudCBldmVudFxuXHRcdHJldHVybiBzZWxmIGlmIEBtYXJrZWRcblxuXHRcdGlmIEBldmVudHMgaXNhIEZ1bmN0aW9uXG5cdFx0XHRtYXJrIGlmIEBldmVudHMoZXZlbnQpXHRcblx0XHRlbGlmIEBldmVudHMgaXNhIEFycmF5XG5cdFx0XHRtYXJrIGlmIGV2ZW50Py50eXBlIGluIEBldmVudHNcblx0XHRlbGlmIEBldmVudHNcblx0XHRcdG1hcmsgaWYgZXZlbnQuQHJlc3BvbmRlclxuXHRcdHNlbGZcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHNyYy9pbWJhL3NjaGVkdWxlci5pbWJhXG4gKiovIiwiZGVmIEltYmEuc3RhdGljIGl0ZW1zLCBuclxuXHRpdGVtczpzdGF0aWMgPSBuclxuXHRyZXR1cm4gaXRlbXNcblxuIyMjXG5UaGlzIGlzIHRoZSBiYXNlY2xhc3MgdGhhdCBhbGwgdGFncyBpbiBpbWJhIGluaGVyaXQgZnJvbS5cbkBpbmFtZSBub2RlXG4jIyNcbmNsYXNzIEltYmEuVGFnXG5cblx0ZGVmIHNlbGYuY3JlYXRlTm9kZVxuXHRcdHRocm93IFwiTm90IGltcGxlbWVudGVkXCJcblxuXHRkZWYgc2VsZi5idWlsZFxuXHRcdHNlbGYubmV3KHNlbGYuY3JlYXRlTm9kZSlcblxuXHRwcm9wIG9iamVjdFxuXG5cdGRlZiBkb21cblx0XHRAZG9tXG5cblx0ZGVmIGluaXRpYWxpemUgZG9tXG5cdFx0c2VsZi5kb20gPSBkb21cblx0XHRcblx0ZGVmIHNldERvbSBkb21cblx0XHRkb20uQHRhZyA9IHNlbGZcblx0XHRAZG9tID0gZG9tXG5cdFx0c2VsZlxuXG5cdCMjI1xuXHRTZXR0aW5nIHJlZmVyZW5jZXMgZm9yIHRhZ3MgbGlrZVxuXHRgPGRpdkBoZWFkZXI+YCB3aWxsIGNvbXBpbGUgdG8gYHRhZygnZGl2Jykuc2V0UmVmKCdoZWFkZXInLHRoaXMpLmVuZCgpYFxuXHRCeSBkZWZhdWx0IGl0IGFkZHMgdGhlIHJlZmVyZW5jZSBhcyBhIGNsYXNzTmFtZSB0byB0aGUgdGFnLlxuXHRAcmV0dXJuIHtzZWxmfVxuXHQjIyNcblx0ZGVmIHNldFJlZiByZWYsIGN0eFxuXHRcdGZsYWcoQHJlZiA9IHJlZilcblx0XHRzZWxmXG5cblx0IyMjXG5cdE1ldGhvZCB0aGF0IGlzIGNhbGxlZCBieSB0aGUgY29tcGlsZWQgdGFnLWNoYWlucywgZm9yXG5cdGJpbmRpbmcgZXZlbnRzIG9uIHRhZ3MgdG8gbWV0aG9kcyBldGMuXG5cdGA8YSA6dGFwPWZuPmAgY29tcGlsZXMgdG8gYHRhZygnYScpLnNldEhhbmRsZXIoJ3RhcCcsZm4sdGhpcykuZW5kKClgXG5cdHdoZXJlIHRoaXMgcmVmZXJzIHRvIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0YWcgaXMgY3JlYXRlZC5cblx0QHJldHVybiB7c2VsZn1cblx0IyMjXG5cdGRlZiBzZXRIYW5kbGVyIGV2ZW50LCBoYW5kbGVyLCBjdHhcblx0XHR2YXIga2V5ID0gJ29uJyArIGV2ZW50XG5cblx0XHRpZiBoYW5kbGVyIGlzYSBGdW5jdGlvblxuXHRcdFx0c2VsZltrZXldID0gaGFuZGxlclxuXHRcdGVsaWYgaGFuZGxlciBpc2EgQXJyYXlcblx0XHRcdHZhciBmbiA9IGhhbmRsZXIuc2hpZnRcblx0XHRcdHNlbGZba2V5XSA9IGRvIHxlfCBjdHhbZm5dLmFwcGx5KGN0eCxoYW5kbGVyLmNvbmNhdChlKSlcblx0XHRlbHNlXG5cdFx0XHRzZWxmW2tleV0gPSBkbyB8ZXwgY3R4W2hhbmRsZXJdKGUpXG5cdFx0c2VsZlxuXG5cdGRlZiBpZD0gaWRcblx0XHRkb206aWQgPSBpZFxuXHRcdHNlbGZcblxuXHRkZWYgaWRcblx0XHRkb206aWRcblxuXHQjIyNcblx0QWRkcyBhIG5ldyBhdHRyaWJ1dGUgb3IgY2hhbmdlcyB0aGUgdmFsdWUgb2YgYW4gZXhpc3RpbmcgYXR0cmlidXRlXG5cdG9uIHRoZSBzcGVjaWZpZWQgdGFnLiBJZiB0aGUgdmFsdWUgaXMgbnVsbCBvciBmYWxzZSwgdGhlIGF0dHJpYnV0ZVxuXHR3aWxsIGJlIHJlbW92ZWQuXG5cdEByZXR1cm4ge3NlbGZ9XG5cdCMjI1xuXHRkZWYgc2V0QXR0cmlidXRlIG5hbWUsIHZhbHVlXG5cdFx0IyBzaG91bGQgdGhpcyBub3QgcmV0dXJuIHNlbGY/XG5cdFx0dmFyIG9sZCA9IGRvbS5nZXRBdHRyaWJ1dGUobmFtZSlcblxuXHRcdGlmIG9sZCA9PSB2YWx1ZVxuXHRcdFx0dmFsdWVcblx0XHRlbGlmIHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT09IGZhbHNlXG5cdFx0XHRkb20uc2V0QXR0cmlidXRlKG5hbWUsdmFsdWUpXG5cdFx0ZWxzZVxuXHRcdFx0ZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKVxuXG5cdCMjI1xuXHRyZW1vdmVzIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgdGFnXG5cdCMjI1xuXHRkZWYgcmVtb3ZlQXR0cmlidXRlIG5hbWVcblx0XHRkb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpXG5cblx0IyMjXG5cdHJldHVybnMgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBvbiB0aGUgdGFnLlxuXHRJZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIGRvZXMgbm90IGV4aXN0LCB0aGUgdmFsdWUgcmV0dXJuZWRcblx0d2lsbCBlaXRoZXIgYmUgbnVsbCBvciBcIlwiICh0aGUgZW1wdHkgc3RyaW5nKVxuXHQjIyNcblx0ZGVmIGdldEF0dHJpYnV0ZSBuYW1lXG5cdFx0ZG9tLmdldEF0dHJpYnV0ZShuYW1lKVxuXG5cdCMjI1xuXHRPdmVycmlkZSB0aGlzIHRvIHByb3ZpZGUgc3BlY2lhbCB3cmFwcGluZyBldGMuXG5cdEByZXR1cm4ge3NlbGZ9XG5cdCMjI1xuXHRkZWYgc2V0Q29udGVudCBjb250ZW50LCB0eXBlXG5cdFx0c2V0Q2hpbGRyZW4gY29udGVudCwgdHlwZVxuXHRcdHNlbGZcblxuXHQjIyNcblx0U2V0IHRoZSBjaGlsZHJlbiBvZiBub2RlLiB0eXBlIHBhcmFtIGlzIG9wdGlvbmFsLFxuXHRhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBJbWJhIHdoZW4gY29tcGlsaW5nIHRhZyB0cmVlcy4gXG5cdEByZXR1cm4ge3NlbGZ9XG5cdCMjI1xuXHRkZWYgc2V0Q2hpbGRyZW4gbm9kZXMsIHR5cGVcblx0XHR0aHJvdyBcIk5vdCBpbXBsZW1lbnRlZFwiXG5cblx0IyMjXG5cdEdldCB0ZXh0IG9mIG5vZGUuIFVzZXMgdGV4dENvbnRlbnQgYmVoaW5kIHRoZSBzY2VuZXMgKG5vdCBpbm5lclRleHQpXG5cdFtodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS90ZXh0Q29udGVudF0oKVxuXHRAcmV0dXJuIHtzdHJpbmd9IGlubmVyIHRleHQgb2Ygbm9kZVxuXHQjIyNcblx0ZGVmIHRleHQgdlxuXHRcdEBkb206dGV4dENvbnRlbnRcblxuXHQjIyNcblx0U2V0IHRleHQgb2Ygbm9kZS4gVXNlcyB0ZXh0Q29udGVudCBiZWhpbmQgdGhlIHNjZW5lcyAobm90IGlubmVyVGV4dClcblx0W2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlL3RleHRDb250ZW50XSgpXG5cdCMjI1xuXHRkZWYgdGV4dD0gdHh0XG5cdFx0QGVtcHR5ID0gbm9cblx0XHRAZG9tOnRleHRDb250ZW50ID0gdHh0ID89IFwiXCJcblx0XHRzZWxmXG5cblxuXHQjIyNcblx0TWV0aG9kIGZvciBnZXR0aW5nIGFuZCBzZXR0aW5nIGRhdGEtYXR0cmlidXRlcy4gV2hlbiBjYWxsZWQgd2l0aCB6ZXJvXG5cdGFyZ3VtZW50cyBpdCB3aWxsIHJldHVybiB0aGUgYWN0dWFsIGRhdGFzZXQgZm9yIHRoZSB0YWcuXG5cblx0XHR2YXIgbm9kZSA9IDxkaXYgZGF0YS1uYW1lPSdoZWxsbyc+XG5cdFx0IyBnZXQgdGhlIHdob2xlIGRhdGFzZXRcblx0XHRub2RlLmRhdGFzZXQgIyB7bmFtZTogJ2hlbGxvJ31cblx0XHQjIGdldCBhIHNpbmdsZSB2YWx1ZVxuXHRcdG5vZGUuZGF0YXNldCgnbmFtZScpICMgJ2hlbGxvJ1xuXHRcdCMgc2V0IGEgc2luZ2xlIHZhbHVlXG5cdFx0bm9kZS5kYXRhc2V0KCduYW1lJywnbmV3bmFtZScpICMgc2VsZlxuXG5cblx0IyMjXG5cdGRlZiBkYXRhc2V0IGtleSwgdmFsXG5cdFx0dGhyb3cgXCJOb3QgaW1wbGVtZW50ZWRcIlxuXG5cdCMjI1xuXHRFbXB0eSBwbGFjZWhvbGRlci4gT3ZlcnJpZGUgdG8gaW1wbGVtZW50IGN1c3RvbSByZW5kZXIgYmVoYXZpb3VyLlxuXHRXb3JrcyBtdWNoIGxpa2UgdGhlIGZhbWlsaWFyIHJlbmRlci1tZXRob2QgaW4gUmVhY3QuXG5cdEByZXR1cm4ge3NlbGZ9XG5cdCMjI1xuXHRkZWYgcmVuZGVyXG5cdFx0c2VsZlxuXG5cdCMjI1xuXHRDYWxsZWQgaW1wbGljaXRseSB0aHJvdWdoIEltYmEuVGFnI2VuZCwgdXBvbiBjcmVhdGluZyBhIHRhZy4gQWxsXG5cdHByb3BlcnRpZXMgd2lsbCBoYXZlIGJlZW4gc2V0IGJlZm9yZSBidWlsZCBpcyBjYWxsZWQsIGluY2x1ZGluZ1xuXHRzZXRDb250ZW50LlxuXHRAcmV0dXJuIHtzZWxmfVxuXHQjIyNcblx0ZGVmIGJ1aWxkXG5cdFx0cmVuZGVyXG5cdFx0c2VsZlxuXG5cdCMjI1xuXHRDYWxsZWQgaW1wbGljaXRseSB0aHJvdWdoIEltYmEuVGFnI2VuZCwgZm9yIHRhZ3MgdGhhdCBhcmUgcGFydCBvZlxuXHRhIHRhZyB0cmVlICh0aGF0IGFyZSByZW5kZXJlZCBzZXZlcmFsIHRpbWVzKS5cblx0QHJldHVybiB7c2VsZn1cblx0IyMjXG5cdGRlZiBjb21taXRcblx0XHRyZW5kZXJcblx0XHRzZWxmXG5cblx0IyMjXG5cblx0Q2FsbGVkIGJ5IHRoZSB0YWctc2NoZWR1bGVyIChpZiB0aGlzIHRhZyBpcyBzY2hlZHVsZWQpXG5cdEJ5IGRlZmF1bHQgaXQgd2lsbCBjYWxsIHRoaXMucmVuZGVyLiBEbyBub3Qgb3ZlcnJpZGUgdW5sZXNzXG5cdHlvdSByZWFsbHkgdW5kZXJzdGFuZCBpdC5cblxuXHQjIyNcblx0ZGVmIHRpY2tcblx0XHRyZW5kZXJcblx0XHRzZWxmXG5cblx0IyMjXG5cdFxuXHRBIHZlcnkgaW1wb3J0YW50IG1ldGhvZCB0aGF0IHlvdSB3aWxsIHByYWN0aWNhbGx5IG5ldmVyIG1hbnVhbGx5LlxuXHRUaGUgdGFnIHN5bnRheCBvZiBJbWJhIGNvbXBpbGVzIHRvIGEgY2hhaW4gb2Ygc2V0dGVycywgd2hpY2ggYWx3YXlzXG5cdGVuZHMgd2l0aCAuZW5kLiBgPGEubGFyZ2U+YCBjb21waWxlcyB0byBgdGFnKCdhJykuZmxhZygnbGFyZ2UnKS5lbmQoKWBcblx0XG5cdFlvdSBhcmUgaGlnaGx5IGFkdmljZWQgdG8gbm90IG92ZXJyaWRlIGl0cyBiZWhhdmlvdXIuIFRoZSBmaXJzdCB0aW1lXG5cdGVuZCBpcyBjYWxsZWQgaXQgd2lsbCBtYXJrIHRoZSB0YWcgYXMgYnVpbHQgYW5kIGNhbGwgSW1iYS5UYWcjYnVpbGQsXG5cdGFuZCBjYWxsIEltYmEuVGFnI2NvbW1pdCBvbiBzdWJzZXF1ZW50IGNhbGxzLlxuXHRAcmV0dXJuIHtzZWxmfVxuXHQjIyNcblx0ZGVmIGVuZFxuXHRcdGlmIEBidWlsdFxuXHRcdFx0Y29tbWl0XG5cdFx0ZWxzZVxuXHRcdFx0QGJ1aWx0ID0geWVzXG5cdFx0XHRidWlsZFxuXHRcdHNlbGZcblxuXHQjIyNcblx0VGhpcyBpcyBjYWxsZWQgaW5zdGVhZCBvZiBJbWJhLlRhZyNlbmQgZm9yIGA8c2VsZj5gIHRhZyBjaGFpbnMuXG5cdERlZmF1bHRzIHRvIG5vb3Bcblx0QHJldHVybiB7c2VsZn1cblx0IyMjXG5cdGRlZiBzeW5jZWRcblx0XHRzZWxmXG5cblx0IyBjYWxsZWQgd2hlbiB0aGUgbm9kZSBpcyBhd2FrZW5lZCBpbiB0aGUgZG9tIC0gZWl0aGVyIGF1dG9tYXRpY2FsbHlcblx0IyB1cG9uIGF0dGFjaG1lbnQgdG8gdGhlIGRvbS10cmVlLCBvciB0aGUgZmlyc3QgdGltZSBpbWJhIG5lZWRzIHRoZVxuXHQjIHRhZyBmb3IgYSBkb21ub2RlIHRoYXQgaGFzIGJlZW4gcmVuZGVyZWQgb24gdGhlIHNlcnZlclxuXHRkZWYgYXdha2VuXG5cdFx0c2VsZlxuXG5cdCMjI1xuXHRMaXN0IG9mIGZsYWdzIGZvciB0aGlzIG5vZGUuIFxuXHQjIyNcblx0ZGVmIGZsYWdzXG5cdFx0QGRvbTpjbGFzc0xpc3RcblxuXHQjIyNcblx0QWRkIHNwZWZpY2llZCBmbGFnIHRvIGN1cnJlbnQgbm9kZS5cblx0SWYgYSBzZWNvbmQgYXJndW1lbnQgaXMgc3VwcGxpZWQsIGl0IHdpbGwgYmUgY29lcmNlZCBpbnRvIGEgQm9vbGVhbixcblx0YW5kIHVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBzaG91bGQgcmVtb3ZlIHRoZSBmbGFnIGluc3RlYWQuXG5cdEByZXR1cm4ge3NlbGZ9XG5cdCMjI1xuXHRkZWYgZmxhZyBuYW1lLCB0b2dnbGVyXG5cdFx0IyBpdCBpcyBtb3N0IG5hdHVyYWwgdG8gdHJlYXQgYSBzZWNvbmQgdW5kZWZpbmVkIGFyZ3VtZW50IGFzIGEgbm8tc3dpdGNoXG5cdFx0IyBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBhcmd1bWVudHMtbGVuZ3RoXG5cdFx0aWYgYXJndW1lbnRzOmxlbmd0aCA9PSAyIGFuZCAhdG9nZ2xlclxuXHRcdFx0QGRvbTpjbGFzc0xpc3QucmVtb3ZlKG5hbWUpXG5cdFx0ZWxzZVxuXHRcdFx0QGRvbTpjbGFzc0xpc3QuYWRkKG5hbWUpXG5cdFx0cmV0dXJuIHNlbGZcblxuXHQjIyNcblx0UmVtb3ZlIHNwZWNpZmllZCBmbGFnIGZyb20gbm9kZVxuXHRAcmV0dXJuIHtzZWxmfVxuXHQjIyNcblx0ZGVmIHVuZmxhZyBuYW1lXG5cdFx0QGRvbTpjbGFzc0xpc3QucmVtb3ZlKG5hbWUpXG5cdFx0c2VsZlxuXG5cdCMjI1xuXHRUb2dnbGUgc3BlY2lmaWVkIGZsYWcgb24gbm9kZVxuXHRAcmV0dXJuIHtzZWxmfVxuXHQjIyNcblx0ZGVmIHRvZ2dsZUZsYWcgbmFtZVxuXHRcdEBkb206Y2xhc3NMaXN0LnRvZ2dsZShuYW1lKVxuXHRcdHNlbGZcblxuXHQjIyNcblx0Q2hlY2sgd2hldGhlciBjdXJyZW50IG5vZGUgaGFzIHNwZWNpZmllZCBmbGFnXG5cdEByZXR1cm4ge2Jvb2x9XG5cdCMjI1xuXHRkZWYgaGFzRmxhZyBuYW1lXG5cdFx0QGRvbTpjbGFzc0xpc3QuY29udGFpbnMobmFtZSlcblxuXHQjIyNcblx0R2V0IHRoZSBzY2hlZHVsZXIgZm9yIHRoaXMgbm9kZS4gQSBuZXcgc2NoZWR1bGVyIHdpbGwgYmUgY3JlYXRlZFxuXHRpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlxuXG5cdEByZXR1cm4ge0ltYmEuU2NoZWR1bGVyfVxuXHQjIyNcblx0ZGVmIHNjaGVkdWxlclxuXHRcdEBzY2hlZHVsZXIgPz0gSW1iYS5TY2hlZHVsZXIubmV3KHNlbGYpXG5cblx0IyMjXG5cblx0U2hvcnRoYW5kIHRvIHN0YXJ0IHNjaGVkdWxpbmcgYSBub2RlLiBUaGUgbWV0aG9kIHdpbGwgYmFzaWNhbGx5XG5cdHByb3h5IHRoZSBhcmd1bWVudHMgdGhyb3VnaCB0byBzY2hlZHVsZXIuY29uZmlndXJlLCBhbmQgdGhlblxuXHRhY3RpdmF0ZSB0aGUgc2NoZWR1bGVyLlxuXHRcblx0QHJldHVybiB7c2VsZn1cblx0IyMjXG5cdGRlZiBzY2hlZHVsZSBvcHRpb25zID0ge31cblx0XHRzY2hlZHVsZXIuY29uZmlndXJlKG9wdGlvbnMpLmFjdGl2YXRlXG5cdFx0c2VsZlxuXG5cdCMjI1xuXHRTaG9ydGhhbmQgZm9yIGRlYWN0aXZhdGluZyBzY2hlZHVsZXIgKGlmIHRhZyBoYXMgb25lKS5cblx0QGRlcHJlY2F0ZWRcblx0IyMjXG5cdGRlZiB1bnNjaGVkdWxlXG5cdFx0c2NoZWR1bGVyLmRlYWN0aXZhdGUgaWYgQHNjaGVkdWxlclxuXHRcdHNlbGZcblxuXG5cdCMjI1xuXHRHZXQgdGhlIHBhcmVudCBvZiBjdXJyZW50IG5vZGVcblx0QHJldHVybiB7SW1iYS5UYWd9IFxuXHQjIyNcblx0ZGVmIHBhcmVudFxuXHRcdHRhZyhkb206cGFyZW50Tm9kZSlcblxuXHQjIyNcblx0U2hvcnRoYW5kIGZvciBjb25zb2xlLmxvZyBvbiBlbGVtZW50c1xuXHRAcmV0dXJuIHtzZWxmfVxuXHQjIyNcblx0ZGVmIGxvZyAqYXJnc1xuXHRcdGFyZ3MudW5zaGlmdChjb25zb2xlKVxuXHRcdEZ1bmN0aW9uOnByb3RvdHlwZTpjYWxsLmFwcGx5KGNvbnNvbGU6bG9nLCBhcmdzKVxuXHRcdHNlbGZcblxuXHRkZWYgY3NzIGtleSwgdmFsXG5cdFx0aWYga2V5IGlzYSBPYmplY3Rcblx0XHRcdGNzcyhrLHYpIGZvciBvd24gayx2IG9mIGtleVxuXHRcdGVsaWYgdmFsID09IG51bGxcblx0XHRcdGRvbTpzdHlsZS5yZW1vdmVQcm9wZXJ0eShrZXkpXG5cdFx0ZWxpZiB2YWwgPT0gdW5kZWZpbmVkXG5cdFx0XHRyZXR1cm4gZG9tOnN0eWxlW2tleV1cblx0XHRlbHNlXG5cdFx0XHRpZiB2YWwgaXNhIE51bWJlciBhbmQga2V5Lm1hdGNoKC93aWR0aHxoZWlnaHR8bGVmdHxyaWdodHx0b3B8Ym90dG9tLylcblx0XHRcdFx0dmFsID0gdmFsICsgXCJweFwiXG5cdFx0XHRkb206c3R5bGVba2V5XSA9IHZhbFxuXHRcdHNlbGZcblxuXHRkZWYgdHJhbnNmb3JtPSB2YWx1ZVxuXHRcdGNzcyg6dHJhbnNmb3JtLCB2YWx1ZSlcblx0XHRzZWxmXG5cblx0ZGVmIHRyYW5zZm9ybVxuXHRcdGNzcyg6dHJhbnNmb3JtKVxuXG5cbkltYmEuVGFnOnByb3RvdHlwZTppbml0aWFsaXplID0gSW1iYS5UYWdcblxuSFRNTF9UQUdTID0gXCJhIGFiYnIgYWRkcmVzcyBhcmVhIGFydGljbGUgYXNpZGUgYXVkaW8gYiBiYXNlIGJkaSBiZG8gYmlnIGJsb2NrcXVvdGUgYm9keSBiciBidXR0b24gY2FudmFzIGNhcHRpb24gY2l0ZSBjb2RlIGNvbCBjb2xncm91cCBkYXRhIGRhdGFsaXN0IGRkIGRlbCBkZXRhaWxzIGRmbiBkaXYgZGwgZHQgZW0gZW1iZWQgZmllbGRzZXQgZmlnY2FwdGlvbiBmaWd1cmUgZm9vdGVyIGZvcm0gaDEgaDIgaDMgaDQgaDUgaDYgaGVhZCBoZWFkZXIgaHIgaHRtbCBpIGlmcmFtZSBpbWcgaW5wdXQgaW5zIGtiZCBrZXlnZW4gbGFiZWwgbGVnZW5kIGxpIGxpbmsgbWFpbiBtYXAgbWFyayBtZW51IG1lbnVpdGVtIG1ldGEgbWV0ZXIgbmF2IG5vc2NyaXB0IG9iamVjdCBvbCBvcHRncm91cCBvcHRpb24gb3V0cHV0IHAgcGFyYW0gcHJlIHByb2dyZXNzIHEgcnAgcnQgcnVieSBzIHNhbXAgc2NyaXB0IHNlY3Rpb24gc2VsZWN0IHNtYWxsIHNvdXJjZSBzcGFuIHN0cm9uZyBzdHlsZSBzdWIgc3VtbWFyeSBzdXAgdGFibGUgdGJvZHkgdGQgdGV4dGFyZWEgdGZvb3QgdGggdGhlYWQgdGltZSB0aXRsZSB0ciB0cmFjayB1IHVsIHZhciB2aWRlbyB3YnJcIi5zcGxpdChcIiBcIilcbkhUTUxfVEFHU19VTlNBRkUgPSBcImFydGljbGUgYXNpZGUgaGVhZGVyIHNlY3Rpb25cIi5zcGxpdChcIiBcIilcblNWR19UQUdTID0gXCJjaXJjbGUgZGVmcyBlbGxpcHNlIGcgbGluZSBsaW5lYXJHcmFkaWVudCBtYXNrIHBhdGggcGF0dGVybiBwb2x5Z29uIHBvbHlsaW5lIHJhZGlhbEdyYWRpZW50IHJlY3Qgc3RvcCBzdmcgdGV4dCB0c3BhblwiLnNwbGl0KFwiIFwiKVxuXG5cbmRlZiBleHRlbmRlciBvYmosIHN1cFxuXHRmb3Igb3duIGssdiBvZiBzdXBcblx0XHRvYmpba10gPz0gdlxuXG5cdG9iajpwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cDpwcm90b3R5cGUpXG5cdG9iajpfX3N1cGVyX18gPSBvYmo6cHJvdG90eXBlOl9fc3VwZXJfXyA9IHN1cDpwcm90b3R5cGVcblx0b2JqOnByb3RvdHlwZTppbml0aWFsaXplID0gb2JqOnByb3RvdHlwZTpjb25zdHJ1Y3RvciA9IG9ialxuXHRzdXAuaW5oZXJpdChvYmopIGlmIHN1cDppbmhlcml0XG5cdHJldHVybiBvYmpcblxuZGVmIFRhZ1xuXHRyZXR1cm4gZG8gfGRvbXxcblx0XHR0aGlzLnNldERvbShkb20pXG5cdFx0cmV0dXJuIHRoaXNcblxuZGVmIFRhZ1NwYXduZXIgdHlwZVxuXHRyZXR1cm4gZG8gdHlwZS5idWlsZFxuXG5jbGFzcyBJbWJhLlRhZ3NcblxuXHRkZWYgaW5pdGlhbGl6ZVxuXHRcdHNlbGZcblxuXHRkZWYgX19jbG9uZSBuc1xuXHRcdHZhciBjbG9uZSA9IE9iamVjdC5jcmVhdGUoc2VsZilcblx0XHRjbG9uZS5AcGFyZW50ID0gc2VsZlxuXHRcdHJldHVybiBjbG9uZVxuXG5cdGRlZiBkZWZpbmVOYW1lc3BhY2UgbmFtZVxuXHRcdHZhciBjbG9uZSA9IE9iamVjdC5jcmVhdGUoc2VsZilcblx0XHRjbG9uZS5AcGFyZW50ID0gc2VsZlxuXHRcdGNsb25lLkBucyA9IG5hbWVcblx0XHRzZWxmW25hbWUudG9VcHBlckNhc2VdID0gY2xvbmVcblx0XHRyZXR1cm4gY2xvbmVcblxuXHRkZWYgYmFzZVR5cGUgbmFtZVxuXHRcdG5hbWUgaW4gSFRNTF9UQUdTID8gJ2h0bWxlbGVtZW50JyA6ICdkaXYnXG5cblx0ZGVmIGRlZmluZVRhZyBuYW1lLCBzdXByID0gJycsICZib2R5XG5cdFx0c3VwciB8fD0gYmFzZVR5cGUobmFtZSlcblx0XHRsZXQgc3VwZXJ0eXBlID0gc2VsZltzdXByXVxuXHRcdGxldCB0YWd0eXBlID0gVGFnKClcblx0XHRsZXQgbm9ybSA9IG5hbWUucmVwbGFjZSgvXFwtL2csJ18nKVxuXG5cblx0XHR0YWd0eXBlLkBuYW1lID0gbmFtZVxuXHRcdGV4dGVuZGVyKHRhZ3R5cGUsc3VwZXJ0eXBlKVxuXG5cdFx0aWYgbmFtZVswXSA9PSAnIydcblx0XHRcdHNlbGZbbmFtZV0gPSB0YWd0eXBlXG5cdFx0XHRJbWJhLlNJTkdMRVRPTlNbbmFtZS5zbGljZSgxKV0gPSB0YWd0eXBlXG5cdFx0ZWxzZVxuXHRcdFx0c2VsZltuYW1lXSA9IHRhZ3R5cGVcblx0XHRcdHNlbGZbJyQnK25vcm1dID0gVGFnU3Bhd25lcih0YWd0eXBlKVxuXG5cdFx0aWYgYm9keVxuXHRcdFx0aWYgYm9keTpsZW5ndGggPT0gMlxuXHRcdFx0XHQjIGNyZWF0ZSBjbG9uZVxuXHRcdFx0XHR1bmxlc3MgdGFndHlwZS5oYXNPd25Qcm9wZXJ0eSgnVEFHUycpXG5cdFx0XHRcdFx0dGFndHlwZS5UQUdTID0gKHN1cGVydHlwZS5UQUdTIG9yIHNlbGYpLl9fY2xvbmVcblxuXHRcdFx0Ym9keS5jYWxsKHRhZ3R5cGUsdGFndHlwZSwgdGFndHlwZS5UQUdTIG9yIHNlbGYpXG5cblx0XHRyZXR1cm4gdGFndHlwZVxuXG5cdGRlZiBkZWZpbmVTaW5nbGV0b24gbmFtZSwgc3VwciwgJmJvZHlcblx0XHRkZWZpbmVUYWcobmFtZSxzdXByLGJvZHkpXG5cblx0ZGVmIGV4dGVuZFRhZyBuYW1lLCBzdXByID0gJycsICZib2R5XG5cdFx0dmFyIGtsYXNzID0gKG5hbWUgaXNhIFN0cmluZyA/IHNlbGZbbmFtZV0gOiBuYW1lKVxuXHRcdCMgYWxsb3cgZm9yIHByaXZhdGUgdGFncyBoZXJlIGFzIHdlbGw/XG5cdFx0Ym9keSBhbmQgYm9keS5jYWxsKGtsYXNzLGtsYXNzLGtsYXNzOnByb3RvdHlwZSkgaWYgYm9keVxuXHRcdHJldHVybiBrbGFzc1xuXG5cbkltYmEuVEFHUyA9IEltYmEuVGFncy5uZXdcbkltYmEuVEFHU1s6ZWxlbWVudF0gPSBJbWJhLlRhZ1xuXG52YXIgc3ZnID0gSW1iYS5UQUdTLmRlZmluZU5hbWVzcGFjZSgnc3ZnJylcblxuZGVmIHN2Zy5iYXNlVHlwZSBuYW1lXG5cdCdzdmdlbGVtZW50J1xuXG5cbkltYmEuU0lOR0xFVE9OUyA9IHt9XG5cblxuZGVmIEltYmEuZGVmaW5lVGFnIG5hbWUsIHN1cHIgPSAnJywgJmJvZHlcblx0cmV0dXJuIEltYmEuVEFHUy5kZWZpbmVUYWcobmFtZSxzdXByLGJvZHkpXG5cbmRlZiBJbWJhLmRlZmluZVNpbmdsZXRvblRhZyBpZCwgc3VwciA9ICdkaXYnLCAmYm9keVxuXHRyZXR1cm4gSW1iYS5UQUdTLmRlZmluZVRhZyhuYW1lLHN1cHIsYm9keSlcblxuZGVmIEltYmEuZXh0ZW5kVGFnIG5hbWUsIGJvZHlcblx0cmV0dXJuIEltYmEuVEFHUy5leHRlbmRUYWcobmFtZSxib2R5KVxuXG5kZWYgSW1iYS50YWcgbmFtZVxuXHR2YXIgdHlwID0gSW1iYS5UQUdTW25hbWVdXG5cdHRocm93IEVycm9yLm5ldyhcInRhZyB7bmFtZX0gaXMgbm90IGRlZmluZWRcIikgaWYgIXR5cFxuXHRyZXR1cm4gdHlwLm5ldyh0eXAuY3JlYXRlTm9kZSlcblxuZGVmIEltYmEudGFnV2l0aElkIG5hbWUsIGlkXG5cdHZhciB0eXAgPSBJbWJhLlRBR1NbbmFtZV1cblx0dGhyb3cgRXJyb3IubmV3KFwidGFnIHtuYW1lfSBpcyBub3QgZGVmaW5lZFwiKSBpZiAhdHlwXG5cdHZhciBkb20gPSB0eXAuY3JlYXRlTm9kZVxuXHRkb206aWQgPSBpZFxuXHRyZXR1cm4gdHlwLm5ldyhkb20pXG5cbiMgVE9ETzogQ2FuIHdlIG1vdmUgdGhlc2Ugb3V0IGFuZCBpbnRvIGRvbS5pbWJhIGluIGEgY2xlYW4gd2F5P1xuIyBUaGVzZSBtZXRob2RzIGRlcGVuZHMgb24gSW1iYS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZFxuXG5kZWYgSW1iYS5nZXRUYWdTaW5nbGV0b24gaWRcdFxuXHR2YXIgZG9tLCBub2RlXG5cblx0aWYgdmFyIGtsYXNzID0gSW1iYS5TSU5HTEVUT05TW2lkXVxuXHRcdHJldHVybiBrbGFzcy5JbnN0YW5jZSBpZiBrbGFzcyBhbmQga2xhc3MuSW5zdGFuY2UgXG5cblx0XHQjIG5vIGluc3RhbmNlIC0gY2hlY2sgZm9yIGVsZW1lbnRcblx0XHRpZiBkb20gPSBJbWJhLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuXHRcdFx0IyB3ZSBoYXZlIGEgbGl2ZSBpbnN0YW5jZSAtIHdoZW4gZmluZGluZyBpdCB0aHJvdWdoIGEgc2VsZWN0b3Igd2Ugc2hvdWxkIGF3YWtlIGl0LCBubz9cblx0XHRcdCMgY29uc29sZS5sb2coJ2NyZWF0aW5nIHRoZSBzaW5nbGV0b24gZnJvbSBleGlzdGluZyBub2RlIGluIGRvbT8nLGlkLHR5cGUpXG5cdFx0XHRub2RlID0ga2xhc3MuSW5zdGFuY2UgPSBrbGFzcy5uZXcoZG9tKVxuXHRcdFx0bm9kZS5hd2FrZW4oZG9tKSAjIHNob3VsZCBvbmx5IGF3YWtlblxuXHRcdFx0cmV0dXJuIG5vZGVcblxuXHRcdGRvbSA9IGtsYXNzLmNyZWF0ZU5vZGVcblx0XHRkb206aWQgPSBpZFxuXHRcdG5vZGUgPSBrbGFzcy5JbnN0YW5jZSA9IGtsYXNzLm5ldyhkb20pXG5cdFx0bm9kZS5lbmQuYXdha2VuKGRvbSlcblx0XHRyZXR1cm4gbm9kZVxuXHRlbGlmIGRvbSA9IEltYmEuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG5cdFx0cmV0dXJuIEltYmEuZ2V0VGFnRm9yRG9tKGRvbSlcblxudmFyIHN2Z1N1cHBvcnQgPSB0eXBlb2YgU1ZHRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCdcblxuZGVmIEltYmEuZ2V0VGFnRm9yRG9tIGRvbVxuXHRyZXR1cm4gbnVsbCB1bmxlc3MgZG9tXG5cdHJldHVybiBkb20gaWYgZG9tLkBkb20gIyBjb3VsZCB1c2UgaW5oZXJpdGFuY2UgaW5zdGVhZFxuXHRyZXR1cm4gZG9tLkB0YWcgaWYgZG9tLkB0YWdcblx0cmV0dXJuIG51bGwgdW5sZXNzIGRvbTpub2RlTmFtZVxuXG5cdHZhciBucyAgID0gbnVsbFxuXHR2YXIgaWQgICA9IGRvbTppZFxuXHR2YXIgdHlwZSA9IGRvbTpub2RlTmFtZS50b0xvd2VyQ2FzZVxuXHR2YXIgdGFncyA9IEltYmEuVEFHU1xuXHR2YXIgbmF0aXZlID0gdHlwZVxuXHR2YXIgY2xzICA9IGRvbTpjbGFzc05hbWVcblxuXHRpZiBpZCBhbmQgSW1iYS5TSU5HTEVUT05TW2lkXVxuXHRcdCMgRklYTUUgY29udHJvbCB0aGF0IGl0IGlzIHRoZSBzYW1lIHNpbmdsZXRvbj9cblx0XHQjIG1pZ2h0IGNvbGxpZGUgLS0gbm90IGdvb2Q/XG5cdFx0cmV0dXJuIEltYmEuZ2V0VGFnU2luZ2xldG9uKGlkKVxuXHQjIGxvb2sgZm9yIGlkIC0gc2luZ2xldG9uXG5cblx0IyBuZWVkIGJldHRlciB0ZXN0IGhlcmVcblx0aWYgc3ZnU3VwcG9ydCBhbmQgZG9tIGlzYSBTVkdFbGVtZW50XG5cdFx0bnMgPSBcInN2Z1wiIFxuXHRcdGNscyA9IGRvbTpjbGFzc05hbWU6YmFzZVZhbFxuXHRcdHRhZ3MgPSB0YWdzLlNWR1xuXG5cdHZhciBzcGF3bmVyXG5cblx0aWYgY2xzXG5cdFx0IyB0aGVyZSBjYW4gYmUgc2V2ZXJhbCBtYXRjaGVzIGhlcmUgLSBzaG91bGQgY2hvb3NlIHRoZSBsYXN0XG5cdFx0IyBzaG91bGQgZmFsbCBiYWNrIHRvIGxlc3Mgc3BlY2lmaWMgbGF0ZXI/IC0gb3RoZXJ3aXNlIHRoaW5ncyBtYXkgZmFpbFxuXHRcdCMgVE9ETyByZXdvcmsgdGhpc1xuXHRcdGlmIHZhciBtID0gY2xzLm1hdGNoKC9cXGJfKFthLXpcXC1dKylcXGIoPyFcXHMqX1thLXpcXC1dKykvKVxuXHRcdFx0dHlwZSA9IG1bMV0gIyAucmVwbGFjZSgvLS9nLCdfJylcblxuXHRcdGlmIG0gPSBjbHMubWF0Y2goL1xcYihbQS1aXFwtXSspX1xcYi8pXG5cdFx0XHRucyA9IG1bMV1cblxuXG5cdHNwYXduZXIgPSB0YWdzW3R5cGVdIG9yIHRhZ3NbbmF0aXZlXVxuXHRzcGF3bmVyID8gc3Bhd25lci5uZXcoZG9tKS5hd2FrZW4oZG9tKSA6IG51bGxcblxudGFnJCA9IEltYmEuVEFHU1xudCQgPSBJbWJhOnRhZ1xudGMkID0gSW1iYTp0YWdXaXRoRmxhZ3NcbnRpJCA9IEltYmE6dGFnV2l0aElkXG50aWMkID0gSW1iYTp0YWdXaXRoSWRBbmRGbGFnc1xuaWQkID0gSW1iYTpnZXRUYWdTaW5nbGV0b25cbnRhZyR3cmFwID0gSW1iYTpnZXRUYWdGb3JEb21cblxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogc3JjL2ltYmEvdGFnLmltYmFcbiAqKi8iLCJcbmRlZiBJbWJhLmRvY3VtZW50XG5cdHdpbmRvdzpkb2N1bWVudFxuXG4jIyNcblJldHVybnMgdGhlIGJvZHkgZWxlbWVudCB3cmFwcGVkIGluIGFuIEltYmEuVGFnXG4jIyNcbmRlZiBJbWJhLnJvb3Rcblx0dGFnKEltYmEuZG9jdW1lbnQ6Ym9keSlcblxudGFnIGh0bWxlbGVtZW50IDwgZWxlbWVudFxuXG5cdCMjI1xuXHRDYWxsZWQgd2hlbiBhIHRhZyB0eXBlIGlzIGJlaW5nIHN1YmNsYXNzZWQuXG5cdCMjI1xuXHRkZWYgc2VsZi5pbmhlcml0IGNoaWxkXG5cdFx0Y2hpbGQ6cHJvdG90eXBlLkBlbXB0eSA9IHllc1xuXHRcdGNoaWxkLkBwcm90b0RvbSA9IG51bGxcblxuXHRcdGlmIEBub2RlVHlwZVxuXHRcdFx0Y2hpbGQuQG5vZGVUeXBlID0gQG5vZGVUeXBlXG5cblx0XHRcdHZhciBjbGFzc05hbWUgPSBcIl9cIiArIGNoaWxkLkBuYW1lLnJlcGxhY2UoL18vZywgJy0nKVxuXHRcdFx0Y2hpbGQuQGNsYXNzZXMgPSBAY2xhc3Nlcy5jb25jYXQoY2xhc3NOYW1lKSB1bmxlc3MgY2hpbGQuQG5hbWVbMF0gPT0gJyMnXG5cdFx0ZWxzZVxuXHRcdFx0Y2hpbGQuQG5vZGVUeXBlID0gY2hpbGQuQG5hbWVcblx0XHRcdGNoaWxkLkBjbGFzc2VzID0gW11cblxuXHRkZWYgc2VsZi5idWlsZE5vZGVcblx0XHR2YXIgZG9tID0gSW1iYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KEBub2RlVHlwZSlcblx0XHR2YXIgY2xzID0gQGNsYXNzZXMuam9pbihcIiBcIilcblx0XHRkb206Y2xhc3NOYW1lID0gY2xzIGlmIGNsc1xuXHRcdGRvbVxuXG5cdGRlZiBzZWxmLmNyZWF0ZU5vZGVcblx0XHR2YXIgcHJvdG8gPSAoQHByb3RvRG9tIHx8PSBidWlsZE5vZGUpXG5cdFx0cHJvdG8uY2xvbmVOb2RlKGZhbHNlKVxuXG5cdGRlZiBzZWxmLmRvbVxuXHRcdEBwcm90b0RvbSB8fD0gYnVpbGROb2RlXG5cblx0YXR0ciBpZFxuXHRhdHRyIHRhYmluZGV4XG5cdGF0dHIgdGl0bGVcblx0YXR0ciByb2xlXG5cblx0ZGVmIHdpZHRoXG5cdFx0QGRvbTpvZmZzZXRXaWR0aFxuXG5cdGRlZiBoZWlnaHRcblx0XHRAZG9tOm9mZnNldEhlaWdodFxuXG5cdGRlZiBzZXRDaGlsZHJlbiBub2RlcywgdHlwZVxuXHRcdEBlbXB0eSA/IGFwcGVuZChub2RlcykgOiBlbXB0eS5hcHBlbmQobm9kZXMpXG5cdFx0QGNoaWxkcmVuID0gbnVsbFxuXHRcdHNlbGZcblxuXHQjIyNcblx0U2V0IGlubmVyIGh0bWwgb2Ygbm9kZVxuXHQjIyNcblx0ZGVmIGh0bWw9IGh0bWxcblx0XHRAZG9tOmlubmVySFRNTCA9IGh0bWxcblx0XHRzZWxmXG5cblx0IyMjXG5cdEdldCBpbm5lciBodG1sIG9mIG5vZGVcblx0IyMjXG5cdGRlZiBodG1sXG5cdFx0QGRvbTppbm5lckhUTUxcblxuXHQjIyNcblx0UmVtb3ZlIGFsbCBjb250ZW50IGluc2lkZSBub2RlXG5cdCMjI1xuXHRkZWYgZW1wdHlcblx0XHRAZG9tLnJlbW92ZUNoaWxkKEBkb206Zmlyc3RDaGlsZCkgd2hpbGUgQGRvbTpmaXJzdENoaWxkXG5cdFx0QGNoaWxkcmVuID0gbnVsbFxuXHRcdEBlbXB0eSA9IHllc1xuXHRcdHNlbGZcblxuXHQjIyNcblx0UmVtb3ZlIHNwZWNpZmllZCBjaGlsZCBmcm9tIGN1cnJlbnQgbm9kZS5cblx0IyMjXG5cdGRlZiByZW1vdmUgY2hpbGRcblx0XHR2YXIgcGFyID0gZG9tXG5cdFx0dmFyIGVsID0gY2hpbGQgYW5kIGNoaWxkLmRvbVxuXHRcdHBhci5yZW1vdmVDaGlsZChlbCkgaWYgZWwgYW5kIGVsOnBhcmVudE5vZGUgPT0gcGFyXG5cdFx0c2VsZlxuXHRcdFxuXHRkZWYgZW1pdCBuYW1lLCBkYXRhOiBudWxsLCBidWJibGU6IHllc1xuXHRcdEltYmEuRXZlbnRzLnRyaWdnZXIgbmFtZSwgc2VsZiwgZGF0YTogZGF0YSwgYnViYmxlOiBidWJibGVcblx0XHRyZXR1cm4gc2VsZlxuXG5cdGRlZiBkYXRhc2V0IGtleSwgdmFsXG5cdFx0aWYga2V5IGlzYSBPYmplY3Rcblx0XHRcdGRhdGFzZXQoayx2KSBmb3Igb3duIGssdiBvZiBrZXlcblx0XHRcdHJldHVybiBzZWxmXG5cblx0XHRpZiBhcmd1bWVudHM6bGVuZ3RoID09IDJcblx0XHRcdHNldEF0dHJpYnV0ZShcImRhdGEte2tleX1cIix2YWwpXG5cdFx0XHRyZXR1cm4gc2VsZlxuXG5cdFx0aWYga2V5XG5cdFx0XHRyZXR1cm4gZ2V0QXR0cmlidXRlKFwiZGF0YS17a2V5fVwiKVxuXG5cdFx0dmFyIGRhdGFzZXQgPSBkb206ZGF0YXNldFxuXG5cdFx0dW5sZXNzIGRhdGFzZXRcblx0XHRcdGRhdGFzZXQgPSB7fVxuXHRcdFx0Zm9yIGF0cixpIGluIGRvbTphdHRyaWJ1dGVzXG5cdFx0XHRcdGlmIGF0cjpuYW1lLnN1YnN0cigwLDUpID09ICdkYXRhLSdcblx0XHRcdFx0XHRkYXRhc2V0W0ltYmEudG9DYW1lbENhc2UoYXRyOm5hbWUuc2xpY2UoNSkpXSA9IGF0cjp2YWx1ZVxuXG5cdFx0cmV0dXJuIGRhdGFzZXRcblxuXHQjIyNcblx0R2V0IGRlc2NlbmRhbnRzIG9mIGN1cnJlbnQgbm9kZSwgb3B0aW9uYWxseSBtYXRjaGluZyBzZWxlY3RvclxuXHRAcmV0dXJuIHtJbWJhLlNlbGVjdG9yfVxuXHQjIyNcblx0ZGVmIGZpbmQgc2VsXG5cdFx0SW1iYS5TZWxlY3Rvci5uZXcoc2VsLHNlbGYpXG5cblx0IyMjXG5cdEdldCB0aGUgZmlyc3QgbWF0Y2hpbmcgY2hpbGQgb2Ygbm9kZVxuXG5cdEByZXR1cm4ge0ltYmEuVGFnfVxuXHQjIyNcblx0ZGVmIGZpcnN0IHNlbFxuXHRcdHNlbCA/IGZpbmQoc2VsKS5maXJzdCA6IHRhZyhkb206Zmlyc3RFbGVtZW50Q2hpbGQpXG5cblx0IyMjXG5cdEdldCB0aGUgbGFzdCBtYXRjaGluZyBjaGlsZCBvZiBub2RlXG5cblx0XHRub2RlLmxhc3QgIyByZXR1cm5zIHRoZSBsYXN0IGNoaWxkIG9mIG5vZGVcblx0XHRub2RlLmxhc3QgJXNwYW4gIyByZXR1cm5zIHRoZSBsYXN0IHNwYW4gaW5zaWRlIG5vZGVcblx0XHRub2RlLmxhc3QgZG8gfGVsfCBlbC50ZXh0ID09ICdIaScgIyByZXR1cm4gbGFzdCBub2RlIHdpdGggdGV4dCBIaVxuXG5cdEByZXR1cm4ge0ltYmEuVGFnfVxuXHQjIyNcblx0ZGVmIGxhc3Qgc2VsXG5cdFx0c2VsID8gZmluZChzZWwpLmxhc3QgOiB0YWcoZG9tOmxhc3RFbGVtZW50Q2hpbGQpXG5cblx0IyMjXG5cdEdldCB0aGUgY2hpbGQgYXQgaW5kZXhcblx0IyMjXG5cdGRlZiBjaGlsZCBpXG5cdFx0dGFnKGRvbTpjaGlsZHJlbltpIG9yIDBdKVxuXG5cdGRlZiBjaGlsZHJlbiBzZWxcblx0XHR2YXIgbm9kZXMgPSBJbWJhLlNlbGVjdG9yLm5ldyhudWxsLCBzZWxmLCBAZG9tOmNoaWxkcmVuKVxuXHRcdHNlbCA/IG5vZGVzLmZpbHRlcihzZWwpIDogbm9kZXNcblx0XG5cdGRlZiBvcnBoYW5pemVcblx0XHRwYXIucmVtb3ZlQ2hpbGQoQGRvbSkgaWYgbGV0IHBhciA9IGRvbTpwYXJlbnROb2RlXG5cdFx0cmV0dXJuIHNlbGZcblx0XG5cdGRlZiBtYXRjaGVzIHNlbFxuXHRcdGlmIHNlbCBpc2EgRnVuY3Rpb25cblx0XHRcdHJldHVybiBzZWwoc2VsZilcblxuXHRcdHNlbCA9IHNlbC5xdWVyeSBpZiBzZWw6cXVlcnlcblx0XHRpZiB2YXIgZm4gPSAoQGRvbTptYXRjaGVzIG9yIEBkb206bWF0Y2hlc1NlbGVjdG9yIG9yIEBkb206d2Via2l0TWF0Y2hlc1NlbGVjdG9yIG9yIEBkb206bXNNYXRjaGVzU2VsZWN0b3Igb3IgQGRvbTptb3pNYXRjaGVzU2VsZWN0b3IpXG5cdFx0XHRyZXR1cm4gZm4uY2FsbChAZG9tLHNlbClcblxuXHQjIyNcblx0R2V0IHRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIHN1cHBsaWVkIHNlbGVjdG9yIC8gZmlsdGVyXG5cdHRyYXZlcnNpbmcgdXB3YXJkcywgYnV0IGluY2x1ZGluZyB0aGUgbm9kZSBpdHNlbGYuXG5cdEByZXR1cm4ge0ltYmEuVGFnfVxuXHQjIyNcblx0ZGVmIGNsb3Nlc3Qgc2VsXG5cdFx0cmV0dXJuIHBhcmVudCB1bmxlc3Mgc2VsICMgc2hvdWxkIHJldHVybiBzZWxmPyFcblx0XHR2YXIgbm9kZSA9IHNlbGZcblx0XHRzZWwgPSBzZWwucXVlcnkgaWYgc2VsOnF1ZXJ5XG5cblx0XHR3aGlsZSBub2RlXG5cdFx0XHRyZXR1cm4gbm9kZSBpZiBub2RlLm1hdGNoZXMoc2VsKVxuXHRcdFx0bm9kZSA9IG5vZGUucGFyZW50XG5cdFx0cmV0dXJuIG51bGxcblxuXHQjIyNcblx0R2V0IHRoZSBjbG9zZXN0IGFuY2VzdG9yIG9mIG5vZGUgdGhhdCBtYXRjaGVzXG5cdHNwZWNpZmllZCBzZWxlY3RvciAvIG1hdGNoZXIuXG5cblx0QHJldHVybiB7SW1iYS5UYWd9XG5cdCMjI1xuXHRkZWYgdXAgc2VsXG5cdFx0cmV0dXJuIHBhcmVudCB1bmxlc3Mgc2VsXG5cdFx0cGFyZW50IGFuZCBwYXJlbnQuY2xvc2VzdChzZWwpXG5cblx0ZGVmIHBhdGggc2VsXG5cdFx0dmFyIG5vZGUgPSBzZWxmXG5cdFx0dmFyIG5vZGVzID0gW11cblx0XHRzZWwgPSBzZWwucXVlcnkgaWYgc2VsIGFuZCBzZWw6cXVlcnlcblxuXHRcdHdoaWxlIG5vZGVcblx0XHRcdG5vZGVzLnB1c2gobm9kZSkgaWYgIXNlbCBvciBub2RlLm1hdGNoZXMoc2VsKVxuXHRcdFx0bm9kZSA9IG5vZGUucGFyZW50XG5cdFx0cmV0dXJuIG5vZGVzXG5cblx0ZGVmIHBhcmVudHMgc2VsXG5cdFx0dmFyIHBhciA9IHBhcmVudFxuXHRcdHBhciA/IHBhci5wYXRoKHNlbCkgOiBbXVxuXG5cdFxuXG5cdGRlZiBzaWJsaW5ncyBzZWxcblx0XHRyZXR1cm4gW10gdW5sZXNzIHZhciBwYXIgPSBwYXJlbnQgIyBGSVhNRVxuXHRcdHZhciBhcnkgPSBkb206cGFyZW50Tm9kZTpjaGlsZHJlblxuXHRcdHZhciBub2RlcyA9IEltYmEuU2VsZWN0b3IubmV3KG51bGwsIHNlbGYsIGFyeSlcblx0XHRub2Rlcy5maWx0ZXIofG58IG4gIT0gc2VsZiAmJiAoIXNlbCB8fCBuLm1hdGNoZXMoc2VsKSkpXG5cblx0IyMjXG5cdEdldCB0aGUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHNpYmxpbmcgb2Ygbm9kZS5cblx0IyMjXG5cdGRlZiBuZXh0IHNlbFxuXHRcdGlmIHNlbFxuXHRcdFx0dmFyIGVsID0gc2VsZlxuXHRcdFx0d2hpbGUgZWwgPSBlbC5uZXh0XG5cdFx0XHRcdHJldHVybiBlbCBpZiBlbC5tYXRjaGVzKHNlbClcblx0XHRcdHJldHVybiBudWxsXG5cdFx0dGFnKGRvbTpuZXh0RWxlbWVudFNpYmxpbmcpXG5cblx0IyMjXG5cdEdldCB0aGUgaW1tZWRpYXRlbHkgcHJlY2VlZGluZyBzaWJsaW5nIG9mIG5vZGUuXG5cdCMjI1xuXHRkZWYgcHJldiBzZWxcblx0XHRpZiBzZWxcblx0XHRcdHZhciBlbCA9IHNlbGZcblx0XHRcdHdoaWxlIGVsID0gZWwucHJldlxuXHRcdFx0XHRyZXR1cm4gZWwgaWYgZWwubWF0Y2hlcyhzZWwpXG5cdFx0XHRyZXR1cm4gbnVsbFxuXHRcdHRhZyhkb206cHJldmlvdXNFbGVtZW50U2libGluZylcblxuXHRkZWYgY29udGFpbnMgbm9kZVxuXHRcdGRvbS5jb250YWlucyhub2RlIGFuZCBub2RlLkBkb20gb3Igbm9kZSlcblxuXHRkZWYgaW5kZXhcblx0XHR2YXIgaSA9IDBcblx0XHR2YXIgZWwgPSBkb21cblx0XHR3aGlsZSBlbDpwcmV2aW91c1NpYmxpbmdcblx0XHRcdGVsID0gZWw6cHJldmlvdXNTaWJsaW5nXG5cdFx0XHRpKytcblx0XHRyZXR1cm4gaVxuXG5cblx0IyMjXG5cdFxuXHRAZGVwcmVjYXRlZFxuXHQjIyNcblx0ZGVmIGluc2VydCBub2RlLCBiZWZvcmU6IG51bGwsIGFmdGVyOiBudWxsXG5cdFx0YmVmb3JlID0gYWZ0ZXIubmV4dCBpZiBhZnRlclxuXHRcdGlmIG5vZGUgaXNhIEFycmF5XG5cdFx0XHRub2RlID0gKDxmcmFnbWVudD4gbm9kZSlcblx0XHRpZiBiZWZvcmVcblx0XHRcdGRvbS5pbnNlcnRCZWZvcmUobm9kZS5kb20sYmVmb3JlLmRvbSlcblx0XHRlbHNlXG5cdFx0XHRhcHBlbmQobm9kZSlcblx0XHRzZWxmXHRcblxuXHQjIyNcblx0Rm9jdXMgb24gY3VycmVudCBub2RlXG5cdEByZXR1cm4ge3NlbGZ9XG5cdCMjI1xuXHRkZWYgZm9jdXNcblx0XHRkb20uZm9jdXNcblx0XHRzZWxmXG5cblx0IyMjXG5cdFJlbW92ZSBmb2N1cyBmcm9tIGN1cnJlbnQgbm9kZVxuXHRAcmV0dXJuIHtzZWxmfVxuXHQjIyNcblx0ZGVmIGJsdXJcblx0XHRkb20uYmx1clxuXHRcdHNlbGZcblxuXHRkZWYgdGVtcGxhdGVcblx0XHRudWxsXG5cblx0IyMjXG5cdEB0b2RvIFNob3VsZCBzdXBwb3J0IG11bHRpcGxlIGFyZ3VtZW50cyBsaWtlIGFwcGVuZFxuXG5cdFRoZSAucHJlcGVuZCBtZXRob2QgaW5zZXJ0cyB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgYXMgdGhlIGZpcnN0XG5cdGNoaWxkIG9mIHRoZSB0YXJnZXQgbm9kZS4gSWYgdGhlIGNvbnRlbnQgaXMgYWxyZWFkeSBhIGNoaWxkIG9mIFxuXHRub2RlIGl0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIHN0YXJ0LlxuXHRcbiAgICBcdG5vZGUucHJlcGVuZCA8ZGl2LnRvcD4gIyBwcmVwZW5kIG5vZGVcbiAgICBcdG5vZGUucHJlcGVuZCBcInNvbWUgdGV4dFwiICMgcHJlcGVuZCB0ZXh0XG4gICAgXHRub2RlLnByZXBlbmQgWzx1bD4sPHVsPl0gIyBwcmVwZW5kIGFycmF5XG5cblx0IyMjXG5cdGRlZiBwcmVwZW5kIGl0ZW1cblx0XHR2YXIgZmlyc3QgPSBAZG9tOmNoaWxkTm9kZXNbMF1cblx0XHRmaXJzdCA/IGluc2VydEJlZm9yZShpdGVtLCBmaXJzdCkgOiBhcHBlbmRDaGlsZChpdGVtKVxuXHRcdHNlbGZcblxuXHQjIyNcblx0VGhlIC5hcHBlbmQgbWV0aG9kIGluc2VydHMgdGhlIHNwZWNpZmllZCBjb250ZW50IGFzIHRoZSBsYXN0IGNoaWxkXG5cdG9mIHRoZSB0YXJnZXQgbm9kZS4gSWYgdGhlIGNvbnRlbnQgaXMgYWxyZWFkeSBhIGNoaWxkIG9mIG5vZGUgaXRcblx0d2lsbCBiZSBtb3ZlZCB0byB0aGUgZW5kLlxuXHRcblx0IyBleGFtcGxlXG5cdCAgICB2YXIgcm9vdCA9IDxkaXYucm9vdD5cblx0ICAgIHZhciBpdGVtID0gPGRpdi5pdGVtPiBcIlRoaXMgaXMgYW4gaXRlbVwiXG5cdCAgICByb290LmFwcGVuZCBpdGVtICMgYXBwZW5kcyBpdGVtIHRvIHRoZSBlbmQgb2Ygcm9vdFxuXG5cdCAgICByb290LnByZXBlbmQgXCJzb21lIHRleHRcIiAjIGFwcGVuZCB0ZXh0XG5cdCAgICByb290LnByZXBlbmQgWzx1bD4sPHVsPl0gIyBhcHBlbmQgYXJyYXlcblx0IyMjXG5cdGRlZiBhcHBlbmQgaXRlbVxuXHRcdCMgcG9zc2libGUgdG8gYXBwZW5kIGJsYW5rXG5cdFx0IyBwb3NzaWJsZSB0byBzaW1wbGlmeSBvbiBzZXJ2ZXI/XG5cdFx0cmV0dXJuIHNlbGYgdW5sZXNzIGl0ZW1cblxuXHRcdGlmIGl0ZW0gaXNhIEFycmF5XG5cdFx0XHRtZW1iZXIgJiYgYXBwZW5kKG1lbWJlcikgZm9yIG1lbWJlciBpbiBpdGVtXG5cblx0XHRlbGlmIGl0ZW0gaXNhIFN0cmluZyBvciBpdGVtIGlzYSBOdW1iZXJcblx0XHRcdHZhciBub2RlID0gSW1iYS5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShpdGVtKVxuXHRcdFx0QGRvbS5hcHBlbmRDaGlsZChub2RlKVxuXHRcdFx0QGVtcHR5ID0gbm8gaWYgQGVtcHR5XHRcdFx0XG5cdFx0ZWxzZVxuXHRcdFx0QGRvbS5hcHBlbmRDaGlsZChpdGVtLkBkb20gb3IgaXRlbSlcblx0XHRcdEBlbXB0eSA9IG5vIGlmIEBlbXB0eVxuXG5cdFx0cmV0dXJuIHNlbGZcblxuXHQjIyNcblx0SW5zZXJ0IGEgbm9kZSBpbnRvIHRoZSBjdXJyZW50IG5vZGUgKHNlbGYpLCBiZWZvcmUgYW5vdGhlci5cblx0VGhlIHJlbGF0aXZlIG5vZGUgbXVzdCBiZSBhIGNoaWxkIG9mIGN1cnJlbnQgbm9kZS4gXG5cdCMjI1xuXHRkZWYgaW5zZXJ0QmVmb3JlIG5vZGUsIHJlbFxuXHRcdG5vZGUgPSBJbWJhLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5vZGUpIGlmIG5vZGUgaXNhIFN0cmluZyBcblx0XHRkb20uaW5zZXJ0QmVmb3JlKCAobm9kZS5AZG9tIG9yIG5vZGUpLCAocmVsLkBkb20gb3IgcmVsKSApIGlmIG5vZGUgYW5kIHJlbFxuXHRcdHNlbGZcblxuXHQjIyNcblx0QXBwZW5kIGEgc2luZ2xlIGl0ZW0gKG5vZGUgb3Igc3RyaW5nKSB0byB0aGUgY3VycmVudCBub2RlLlxuXHRJZiBzdXBwbGllZCBpdGVtIGlzIGEgc3RyaW5nIGl0IHdpbGwgYXV0b21hdGljYWxseS4gVGhpcyBpcyB1c2VkXG5cdGJ5IEltYmEgaW50ZXJuYWxseSwgYnV0IHdpbGwgcHJhY3RpY2FsbHkgbmV2ZXIgYmUgdXNlZCBleHBsaWNpdGx5LlxuXHQjIyNcblx0ZGVmIGFwcGVuZENoaWxkIG5vZGVcblx0XHRub2RlID0gSW1iYS5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShub2RlKSBpZiBub2RlIGlzYSBTdHJpbmdcblx0XHRkb20uYXBwZW5kQ2hpbGQobm9kZS5AZG9tIG9yIG5vZGUpIGlmIG5vZGVcblx0XHRzZWxmXG5cblx0IyMjXG5cdFJlbW92ZSBhIHNpbmdsZSBjaGlsZCBmcm9tIHRoZSBjdXJyZW50IG5vZGUuXG5cdFVzZWQgYnkgSW1iYSBpbnRlcm5hbGx5LlxuXHQjIyNcblx0ZGVmIHJlbW92ZUNoaWxkIG5vZGVcblx0XHRkb20ucmVtb3ZlQ2hpbGQobm9kZS5AZG9tIG9yIG5vZGUpIGlmIG5vZGVcblx0XHRzZWxmXG5cblx0ZGVmIHRvU3RyaW5nXG5cdFx0QGRvbS50b1N0cmluZyAjIHJlYWxseT9cblxuXHQjIyNcblx0QGRlcHJlY2F0ZWRcblx0IyMjXG5cdGRlZiBjbGFzc2VzXG5cdFx0Y29uc29sZS5sb2cgJ0ltYmEuVGFnI2NsYXNzZXMgaXMgZGVwcmVjYXRlZCdcblx0XHRAZG9tOmNsYXNzTGlzdFxuXG50YWcgc3ZnZWxlbWVudCA8IGh0bWxlbGVtZW50XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBzcmMvaW1iYS9kb20uaW1iYVxuICoqLyIsIlxuIyBwcmVkZWZpbmUgYWxsIHN1cHBvcnRlZCBodG1sIHRhZ3NcbnRhZyBmcmFnbWVudCA8IGh0bWxlbGVtZW50XG5cdFxuXHRkZWYgc2VsZi5jcmVhdGVOb2RlXG5cdFx0SW1iYS5kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50XG5cbnRhZyBhXG5cdGF0dHIgaHJlZlxuXG50YWcgYWJiclxudGFnIGFkZHJlc3NcbnRhZyBhcmVhXG50YWcgYXJ0aWNsZVxudGFnIGFzaWRlXG50YWcgYXVkaW9cbnRhZyBiXG50YWcgYmFzZVxudGFnIGJkaVxudGFnIGJkb1xudGFnIGJpZ1xudGFnIGJsb2NrcXVvdGVcbnRhZyBib2R5XG50YWcgYnJcblxudGFnIGJ1dHRvblxuXHRhdHRyIGF1dG9mb2N1c1xuXHRhdHRyIHR5cGVcblx0YXR0ciBkaXNhYmxlZFxuXG50YWcgY2FudmFzXG5cdGRlZiB3aWR0aD0gdmFsXG5cdFx0ZG9tOndpZHRoID0gdmFsIHVubGVzcyB3aWR0aCA9PSB2YWxcblx0XHRzZWxmXG5cblx0ZGVmIGhlaWdodD0gdmFsXG5cdFx0ZG9tOmhlaWdodCA9IHZhbCB1bmxlc3MgaGVpZ2h0ID09IHZhbFxuXHRcdHNlbGZcblxuXHRkZWYgd2lkdGhcblx0XHRkb206d2lkdGhcblxuXHRkZWYgaGVpZ2h0XG5cdFx0ZG9tOmhlaWdodFxuXG5cdGRlZiBjb250ZXh0IHR5cGUgPSAnMmQnXG5cdFx0ZG9tLmdldENvbnRleHQodHlwZSlcblxudGFnIGNhcHRpb25cbnRhZyBjaXRlXG50YWcgY29kZVxudGFnIGNvbFxudGFnIGNvbGdyb3VwXG50YWcgZGF0YVxudGFnIGRhdGFsaXN0XG50YWcgZGRcbnRhZyBkZWxcbnRhZyBkZXRhaWxzXG50YWcgZGZuXG50YWcgZGl2XG50YWcgZGxcbnRhZyBkdFxudGFnIGVtXG50YWcgZW1iZWRcbnRhZyBmaWVsZHNldFxudGFnIGZpZ2NhcHRpb25cbnRhZyBmaWd1cmVcbnRhZyBmb290ZXJcblxudGFnIGZvcm1cblx0YXR0ciBtZXRob2Rcblx0YXR0ciBhY3Rpb25cblxudGFnIGgxXG50YWcgaDJcbnRhZyBoM1xudGFnIGg0XG50YWcgaDVcbnRhZyBoNlxudGFnIGhlYWRcbnRhZyBoZWFkZXJcbnRhZyBoclxudGFnIGh0bWxcbnRhZyBpXG5cbnRhZyBpZnJhbWVcblx0YXR0ciBzcmNcblxudGFnIGltZ1xuXHRhdHRyIHNyY1xuXG50YWcgaW5wdXRcblx0IyBjYW4gdXNlIGF0dHIgaW5zdGVhZFxuXHRhdHRyIG5hbWVcblx0YXR0ciB0eXBlXG5cdGF0dHIgcmVxdWlyZWRcblx0YXR0ciBkaXNhYmxlZFxuXHRhdHRyIGF1dG9mb2N1c1xuXG5cdGRlZiB2YWx1ZVxuXHRcdGRvbTp2YWx1ZVxuXG5cdGRlZiB2YWx1ZT0gdlxuXHRcdGRvbTp2YWx1ZSA9IHYgdW5sZXNzIHYgPT0gZG9tOnZhbHVlXG5cdFx0c2VsZlxuXG5cdGRlZiBwbGFjZWhvbGRlcj0gdlxuXHRcdGRvbTpwbGFjZWhvbGRlciA9IHYgdW5sZXNzIHYgPT0gZG9tOnBsYWNlaG9sZGVyXG5cdFx0c2VsZlxuXG5cdGRlZiBwbGFjZWhvbGRlclxuXHRcdGRvbTpwbGFjZWhvbGRlclxuXG5cdGRlZiBjaGVja2VkXG5cdFx0ZG9tOmNoZWNrZWRcblxuXHRkZWYgY2hlY2tlZD0gYm9vbFxuXHRcdGRvbTpjaGVja2VkID0gYm9vbCB1bmxlc3MgYm9vbCA9PSBkb206Y2hlY2tlZFxuXHRcdHNlbGZcblxudGFnIGluc1xudGFnIGtiZFxudGFnIGtleWdlblxudGFnIGxhYmVsXG50YWcgbGVnZW5kXG50YWcgbGlcblxudGFnIGxpbmtcblx0YXR0ciByZWxcblx0YXR0ciB0eXBlXG5cdGF0dHIgaHJlZlxuXHRhdHRyIG1lZGlhXG5cbnRhZyBtYWluXG50YWcgbWFwXG50YWcgbWFya1xudGFnIG1lbnVcbnRhZyBtZW51aXRlbVxuXG50YWcgbWV0YVxuXHRhdHRyIG5hbWVcblx0YXR0ciBjb250ZW50XG5cdGF0dHIgY2hhcnNldFxuXG50YWcgbWV0ZXJcbnRhZyBuYXZcbnRhZyBub3NjcmlwdFxudGFnIG9iamVjdFxudGFnIG9sXG50YWcgb3B0Z3JvdXBcblxudGFnIG9wdGlvblxuXHRhdHRyIHZhbHVlXG5cbnRhZyBvdXRwdXRcbnRhZyBwXG50YWcgcGFyYW1cbnRhZyBwcmVcbnRhZyBwcm9ncmVzc1xudGFnIHFcbnRhZyBycFxudGFnIHJ0XG50YWcgcnVieVxudGFnIHNcbnRhZyBzYW1wXG5cbnRhZyBzY3JpcHRcblx0YXR0ciBzcmNcblx0YXR0ciB0eXBlXG5cdGF0dHIgYXN5bmNcblx0YXR0ciBkZWZlclxuXG50YWcgc2VjdGlvblxuXG50YWcgc2VsZWN0XG5cdGF0dHIgbmFtZVxuXHRhdHRyIG11bHRpcGxlXG5cdGF0dHIgcmVxdWlyZWRcblx0YXR0ciBkaXNhYmxlZFxuXHRcblx0ZGVmIHZhbHVlXG5cdFx0ZG9tOnZhbHVlXG5cblx0ZGVmIHZhbHVlPSB2XG5cdFx0ZG9tOnZhbHVlID0gdiB1bmxlc3MgdiA9PSBkb206dmFsdWVcblx0XHRzZWxmXG5cblxudGFnIHNtYWxsXG50YWcgc291cmNlXG50YWcgc3BhblxudGFnIHN0cm9uZ1xudGFnIHN0eWxlXG50YWcgc3ViXG50YWcgc3VtbWFyeVxudGFnIHN1cFxudGFnIHRhYmxlXG50YWcgdGJvZHlcbnRhZyB0ZFxuXG50YWcgdGV4dGFyZWFcblx0YXR0ciBuYW1lXG5cdGF0dHIgZGlzYWJsZWRcblx0YXR0ciByZXF1aXJlZFxuXHRhdHRyIHJvd3Ncblx0YXR0ciBjb2xzXG5cdGF0dHIgYXV0b2ZvY3VzXG5cblx0ZGVmIHZhbHVlXG5cdFx0ZG9tOnZhbHVlXG5cblx0ZGVmIHZhbHVlPSB2XG5cdFx0ZG9tOnZhbHVlID0gdiB1bmxlc3MgdiA9PSBkb206dmFsdWVcblx0XHRzZWxmXG5cblx0ZGVmIHBsYWNlaG9sZGVyPSB2XG5cdFx0ZG9tOnBsYWNlaG9sZGVyID0gdiB1bmxlc3MgdiA9PSBkb206cGxhY2Vob2xkZXJcblx0XHRzZWxmXG5cblx0ZGVmIHBsYWNlaG9sZGVyXG5cdFx0ZG9tOnBsYWNlaG9sZGVyXG5cbnRhZyB0Zm9vdFxudGFnIHRoXG50YWcgdGhlYWRcbnRhZyB0aW1lXG50YWcgdGl0bGVcbnRhZyB0clxudGFnIHRyYWNrXG50YWcgdVxudGFnIHVsXG50YWcgdmlkZW9cbnRhZyB3YnJcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHNyYy9pbWJhL2RvbS5odG1sLmltYmFcbiAqKi8iLCJcbnRhZyBzdmc6c3ZnZWxlbWVudFxuXG5cdGRlZiBzZWxmLm5hbWVzcGFjZVVSSVxuXHRcdFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuXG5cdGxldCB0eXBlcyA9IFwiY2lyY2xlIGRlZnMgZWxsaXBzZSBnIGxpbmUgbGluZWFyR3JhZGllbnQgbWFzayBwYXRoIHBhdHRlcm4gcG9seWdvbiBwb2x5bGluZSByYWRpYWxHcmFkaWVudCByZWN0IHN0b3Agc3ZnIHRleHQgdHNwYW5cIi5zcGxpdChcIiBcIilcblxuXHRkZWYgc2VsZi5idWlsZE5vZGVcblx0XHR2YXIgZG9tID0gSW1iYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLEBub2RlVHlwZSlcblx0XHR2YXIgY2xzID0gQGNsYXNzZXMuam9pbihcIiBcIilcblx0XHRkb206Y2xhc3NOYW1lOmJhc2VWYWwgPSBjbHMgaWYgY2xzXG5cdFx0ZG9tXG5cblx0ZGVmIHNlbGYuaW5oZXJpdCBjaGlsZFxuXHRcdGNoaWxkLkBwcm90b0RvbSA9IG51bGxcblxuXHRcdGlmIGNoaWxkLkBuYW1lIGluIHR5cGVzXG5cdFx0XHRjaGlsZC5Abm9kZVR5cGUgPSBjaGlsZC5AbmFtZVxuXHRcdFx0Y2hpbGQuQGNsYXNzZXMgPSBbXVxuXHRcdGVsc2Vcblx0XHRcdGNoaWxkLkBub2RlVHlwZSA9IEBub2RlVHlwZVxuXHRcdFx0dmFyIGNsYXNzTmFtZSA9IFwiX1wiICsgY2hpbGQuQG5hbWUucmVwbGFjZSgvXy9nLCAnLScpXG5cdFx0XHRjaGlsZC5AY2xhc3NlcyA9IEBjbGFzc2VzLmNvbmNhdChjbGFzc05hbWUpXG5cblxuXHRhdHRyIHggaW5saW5lOiBub1xuXHRhdHRyIHkgaW5saW5lOiBub1xuXG5cdGF0dHIgd2lkdGggaW5saW5lOiBub1xuXHRhdHRyIGhlaWdodCBpbmxpbmU6IG5vXG5cblx0YXR0ciBzdHJva2UgaW5saW5lOiBub1xuXHRhdHRyIHN0cm9rZS13aWR0aCBpbmxpbmU6IG5vXG5cbnRhZyBzdmc6c3ZnXG5cdGF0dHIgdmlld2JveCBpbmxpbmU6IG5vXG5cbnRhZyBzdmc6Z1xuXG50YWcgc3ZnOmRlZnNcblxudGFnIHN2ZzpzeW1ib2xcblx0YXR0ciBwcmVzZXJ2ZUFzcGVjdFJhdGlvIGlubGluZTogbm9cblx0YXR0ciB2aWV3Qm94IGlubGluZTogbm9cblxudGFnIHN2ZzptYXJrZXJcblx0YXR0ciBtYXJrZXJVbml0cyBpbmxpbmU6IG5vXG5cdGF0dHIgcmVmWCBpbmxpbmU6IG5vXG5cdGF0dHIgcmVmWSBpbmxpbmU6IG5vXG5cdGF0dHIgbWFya2VyV2lkdGggaW5saW5lOiBub1xuXHRhdHRyIG1hcmtlckhlaWdodCBpbmxpbmU6IG5vXG5cdGF0dHIgb3JpZW50IGlubGluZTogbm9cblxuXG4jIEJhc2ljIHNoYXBlc1xuXG50YWcgc3ZnOnJlY3Rcblx0YXR0ciByeCBpbmxpbmU6IG5vXG5cdGF0dHIgcnkgaW5saW5lOiBub1xuXG50YWcgc3ZnOmNpcmNsZVxuXHRhdHRyIGN4IGlubGluZTogbm9cblx0YXR0ciBjeSBpbmxpbmU6IG5vXG5cdGF0dHIgciBpbmxpbmU6IG5vXG5cbnRhZyBzdmc6ZWxsaXBzZVxuXHRhdHRyIGN4IGlubGluZTogbm9cblx0YXR0ciBjeSBpbmxpbmU6IG5vXG5cdGF0dHIgcnggaW5saW5lOiBub1xuXHRhdHRyIHJ5IGlubGluZTogbm9cblxudGFnIHN2ZzpwYXRoXG5cdGF0dHIgZCBpbmxpbmU6IG5vXG5cdGF0dHIgcGF0aExlbmd0aCBpbmxpbmU6IG5vXG5cbnRhZyBzdmc6bGluZVxuXHRhdHRyIHgxIGlubGluZTogbm9cblx0YXR0ciB4MiBpbmxpbmU6IG5vXG5cdGF0dHIgeTEgaW5saW5lOiBub1xuXHRhdHRyIHkyIGlubGluZTogbm9cblxudGFnIHN2Zzpwb2x5bGluZVxuXHRhdHRyIHBvaW50cyBpbmxpbmU6IG5vXG5cbnRhZyBzdmc6cG9seWdvblxuXHRhdHRyIHBvaW50cyBpbmxpbmU6IG5vXG5cbnRhZyBzdmc6dGV4dFxuXHRhdHRyIGR4IGlubGluZTogbm9cblx0YXR0ciBkeSBpbmxpbmU6IG5vXG5cdGF0dHIgdGV4dC1hbmNob3IgaW5saW5lOiBub1xuXHRhdHRyIHJvdGF0ZSBpbmxpbmU6IG5vXG5cdGF0dHIgdGV4dExlbmd0aCBpbmxpbmU6IG5vXG5cdGF0dHIgbGVuZ3RoQWRqdXN0IGlubGluZTogbm9cblxudGFnIHN2Zzp0c3BhblxuXHRhdHRyIGR4IGlubGluZTogbm9cblx0YXR0ciBkeSBpbmxpbmU6IG5vXG5cdGF0dHIgcm90YXRlIGlubGluZTogbm9cblx0YXR0ciB0ZXh0TGVuZ3RoIGlubGluZTogbm9cblx0YXR0ciBsZW5ndGhBZGp1c3QgaW5saW5lOiBub1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHNyYy9pbWJhL2RvbS5zdmcuaW1iYVxuICoqLyIsIiMgRXh0ZW5kaW5nIEltYmEuVGFnI2NzcyB0byB3b3JrIHdpdGhvdXQgcHJlZml4ZXMgYnkgaW5zcGVjdGluZ1xuIyB0aGUgcHJvcGVydGllcyBvZiBhIENTU1N0eWxlRGVjbGFyYXRpb24gYW5kIGNyZWF0aW5nIGEgbWFwXG5cbiMgdmFyIHByZWZpeGVzID0gWyctd2Via2l0LScsJy1tcy0nLCctbW96LScsJy1vLScsJy1ibGluay0nXVxuIyB2YXIgcHJvcHMgPSBbJ3RyYW5zZm9ybScsJ3RyYW5zaXRpb24nLCdhbmltYXRpb24nXVxuXG5pZiBJbWJhLkNMSUVOVFxuXHR2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQ6ZG9jdW1lbnRFbGVtZW50LCAnJylcblxuXHRJbWJhLkNTU0tleU1hcCA9IHt9XG5cblx0Zm9yIHByZWZpeGVkIGluIHN0eWxlc1xuXHRcdHZhciB1bnByZWZpeGVkID0gcHJlZml4ZWQucmVwbGFjZSgvXi0od2Via2l0fG1zfG1venxvfGJsaW5rKS0vLCcnKVxuXHRcdHZhciBjYW1lbENhc2UgPSB1bnByZWZpeGVkLnJlcGxhY2UoLy0oXFx3KS9nKSBkbyB8bSxhfCBhLnRvVXBwZXJDYXNlXG5cblx0XHQjIGlmIHRoZXJlIGV4aXN0cyBhbiB1bnByZWZpeGVkIHZlcnNpb24gLS0gYWx3YXlzIHVzZSB0aGlzXG5cdFx0aWYgcHJlZml4ZWQgIT0gdW5wcmVmaXhlZFxuXHRcdFx0Y29udGludWUgaWYgc3R5bGVzLmhhc093blByb3BlcnR5KHVucHJlZml4ZWQpXG5cblx0XHQjIHJlZ2lzdGVyIHRoZSBwcmVmaXhlc1xuXHRcdEltYmEuQ1NTS2V5TWFwW3VucHJlZml4ZWRdID0gSW1iYS5DU1NLZXlNYXBbY2FtZWxDYXNlXSA9IHByZWZpeGVkXG5cblx0ZXh0ZW5kIHRhZyBlbGVtZW50XG5cblx0XHQjIG92ZXJyaWRlIHRoZSBvcmlnaW5hbCBjc3MgbWV0aG9kXG5cdFx0ZGVmIGNzcyBrZXksIHZhbFxuXHRcdFx0aWYga2V5IGlzYSBPYmplY3Rcblx0XHRcdFx0Y3NzKGssdikgZm9yIG93biBrLHYgb2Yga2V5XG5cdFx0XHRcdHJldHVybiBzZWxmXG5cblx0XHRcdGtleSA9IEltYmEuQ1NTS2V5TWFwW2tleV0gb3Iga2V5XG5cblx0XHRcdGlmIHZhbCA9PSBudWxsXG5cdFx0XHRcdGRvbTpzdHlsZS5yZW1vdmVQcm9wZXJ0eShrZXkpXG5cdFx0XHRlbGlmIHZhbCA9PSB1bmRlZmluZWRcblx0XHRcdFx0cmV0dXJuIGRvbTpzdHlsZVtrZXldXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGlmIHZhbCBpc2EgTnVtYmVyIGFuZCBrZXkubWF0Y2goL3dpZHRofGhlaWdodHxsZWZ0fHJpZ2h0fHRvcHxib3R0b20vKVxuXHRcdFx0XHRcdHZhbCA9IHZhbCArIFwicHhcIlxuXHRcdFx0XHRkb206c3R5bGVba2V5XSA9IHZhbFxuXHRcdFx0c2VsZlxuXHRcdFx0XG5cdHVubGVzcyBkb2N1bWVudDpkb2N1bWVudEVsZW1lbnQ6Y2xhc3NMaXN0XG5cdFx0ZXh0ZW5kIHRhZyBlbGVtZW50XG5cblx0XHRcdGRlZiBoYXNGbGFnIHJlZlxuXHRcdFx0XHRyZXR1cm4gUmVnRXhwLm5ldygnKF58XFxcXHMpJyArIHJlZiArICcoXFxcXHN8JCknKS50ZXN0KEBkb206Y2xhc3NOYW1lKVxuXG5cdFx0XHRkZWYgYWRkRmxhZyByZWZcblx0XHRcdFx0cmV0dXJuIHNlbGYgaWYgaGFzRmxhZyhyZWYpXG5cdFx0XHRcdEBkb206Y2xhc3NOYW1lICs9IChAZG9tOmNsYXNzTmFtZSA/ICcgJyA6ICcnKSArIHJlZlxuXHRcdFx0XHRyZXR1cm4gc2VsZlxuXG5cdFx0XHRkZWYgdW5mbGFnIHJlZlxuXHRcdFx0XHRyZXR1cm4gc2VsZiB1bmxlc3MgaGFzRmxhZyhyZWYpXG5cdFx0XHRcdHZhciByZWdleCA9IFJlZ0V4cC5uZXcoJyhefFxcXFxzKSonICsgcmVmICsgJyhcXFxcc3wkKSonLCAnZycpXG5cdFx0XHRcdEBkb206Y2xhc3NOYW1lID0gQGRvbTpjbGFzc05hbWUucmVwbGFjZShyZWdleCwgJycpXG5cdFx0XHRcdHJldHVybiBzZWxmXG5cblx0XHRcdGRlZiB0b2dnbGVGbGFnIHJlZlxuXHRcdFx0XHRoYXNGbGFnKHJlZikgPyB1bmZsYWcocmVmKSA6IGZsYWcocmVmKVxuXG5cdFx0XHRkZWYgZmxhZyByZWYsIGJvb2xcblx0XHRcdFx0aWYgYXJndW1lbnRzOmxlbmd0aCA9PSAyIGFuZCAhIWJvb2wgPT09IG5vXG5cdFx0XHRcdFx0cmV0dXJuIHVuZmxhZyhyZWYpXG5cdFx0XHRcdHJldHVybiBhZGRGbGFnKHJlZilcblx0XHR0cnVlXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogc3JjL2ltYmEvZG9tLmNsaWVudC5pbWJhXG4gKiovIiwidmFyIGRvYyA9IGRvY3VtZW50XG52YXIgd2luID0gd2luZG93XG5cbnZhciBoYXNUb3VjaEV2ZW50cyA9IHdpbmRvdyAmJiB3aW5kb3c6b250b3VjaHN0YXJ0ICE9PSB1bmRlZmluZWRcblxuY2xhc3MgSW1iYS5Qb2ludGVyXG5cblx0IyBiZWdhbiwgbW92ZWQsIHN0YXRpb25hcnksIGVuZGVkLCBjYW5jZWxsZWRcblxuXHRwcm9wIHBoYXNlXG5cdHByb3AgcHJldkV2ZW50XG5cdHByb3AgYnV0dG9uXG5cdHByb3AgZXZlbnRcblx0cHJvcCBkaXJ0eVxuXHRwcm9wIGV2ZW50c1xuXHRwcm9wIHRvdWNoXG5cblx0ZGVmIGluaXRpYWxpemVcblx0XHRidXR0b24gPSAtMVxuXHRcdGV2ZW50ID0ge3g6IDAsIHk6IDAsIHR5cGU6ICd1bmluaXRpYWxpemVkJ31cblx0XHRyZXR1cm4gc2VsZlxuXG5cdGRlZiB1cGRhdGUgZVxuXHRcdGV2ZW50ID0gZVxuXHRcdGRpcnR5ID0geWVzXG5cdFx0c2VsZlxuXG5cdCMgdGhpcyBpcyBqdXN0IGZvciByZWd1bGFyIG1vdXNlIG5vd1xuXHRkZWYgcHJvY2Vzc1xuXHRcdHZhciBlMSA9IGV2ZW50XG5cblx0XHRpZiBkaXJ0eVxuXHRcdFx0cHJldkV2ZW50ID0gZTFcblx0XHRcdGRpcnR5ID0gbm9cblxuXHRcdFx0IyBidXR0b24gc2hvdWxkIG9ubHkgY2hhbmdlIG9uIG1vdXNlZG93biBldGNcblx0XHRcdGlmIGUxOnR5cGUgPT0gJ21vdXNlZG93bidcblx0XHRcdFx0YnV0dG9uID0gZTE6YnV0dG9uXG5cblx0XHRcdFx0IyBkbyBub3QgY3JlYXRlIHRvdWNoIGZvciByaWdodCBjbGlja1xuXHRcdFx0XHRpZiBidXR0b24gPT0gMiBvciAodG91Y2ggYW5kIGJ1dHRvbiAhPSAwKVxuXHRcdFx0XHRcdHJldHVyblxuXG5cdFx0XHRcdCMgY2FuY2VsIHRoZSBwcmV2aW91cyB0b3VjaFxuXHRcdFx0XHR0b3VjaC5jYW5jZWwgaWYgdG91Y2hcblx0XHRcdFx0dG91Y2ggPSBJbWJhLlRvdWNoLm5ldyhlMSxzZWxmKVxuXHRcdFx0XHR0b3VjaC5tb3VzZWRvd24oZTEsZTEpXG5cblx0XHRcdGVsaWYgZTE6dHlwZSA9PSAnbW91c2Vtb3ZlJ1xuXHRcdFx0XHR0b3VjaC5tb3VzZW1vdmUoZTEsZTEpIGlmIHRvdWNoXG5cblx0XHRcdGVsaWYgZTE6dHlwZSA9PSAnbW91c2V1cCdcblx0XHRcdFx0YnV0dG9uID0gLTFcblxuXHRcdFx0XHRpZiB0b3VjaCBhbmQgdG91Y2guYnV0dG9uID09IGUxOmJ1dHRvblxuXHRcdFx0XHRcdHRvdWNoLm1vdXNldXAoZTEsZTEpXG5cdFx0XHRcdFx0dG91Y2ggPSBudWxsXG5cdFx0XHRcdCMgdHJpZ2dlciBwb2ludGVydXBcblx0XHRlbHNlXG5cdFx0XHR0b3VjaC5pZGxlIGlmIHRvdWNoXG5cdFx0c2VsZlxuXHRcdFxuXHRkZWYgY2xlYW51cFxuXHRcdEltYmEuUE9JTlRFUlNcblxuXHRkZWYgeCBkbyBldmVudDp4XG5cdGRlZiB5IGRvIGV2ZW50OnlcblxuXHQjIGRlcHJlY2F0ZWQgLS0gc2hvdWxkIHJlbW92ZVxuXHRkZWYgc2VsZi51cGRhdGUgXG5cdFx0IyBjb25zb2xlLmxvZygndXBkYXRlIHRvdWNoJylcblx0XHRmb3IgcHRyLGkgaW4gSW1iYS5QT0lOVEVSU1xuXHRcdFx0cHRyLnByb2Nlc3Ncblx0XHQjIG5lZWQgdG8gYmUgYWJsZSB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiB0b3VjaCwgbm8/XG5cdFx0d2luLnJlcXVlc3RBbmltYXRpb25GcmFtZShJbWJhLlBvaW50ZXI6dXBkYXRlKVxuXHRcdHNlbGZcblxudmFyIGxhc3ROYXRpdmVUb3VjaFRpbWVTdGFtcCA9IDBcbnZhciBsYXN0TmF0aXZlVG91Y2hUaW1lb3V0ID0gNTBcblxuIyBJbWJhLlRvdWNoXG4jIEJlZ2FuXHRBIGZpbmdlciB0b3VjaGVkIHRoZSBzY3JlZW4uXG4jIE1vdmVkXHRBIGZpbmdlciBtb3ZlZCBvbiB0aGUgc2NyZWVuLlxuIyBTdGF0aW9uYXJ5XHRBIGZpbmdlciBpcyB0b3VjaGluZyB0aGUgc2NyZWVuIGJ1dCBoYXNuJ3QgbW92ZWQuXG4jIEVuZGVkXHRBIGZpbmdlciB3YXMgbGlmdGVkIGZyb20gdGhlIHNjcmVlbi4gVGhpcyBpcyB0aGUgZmluYWwgcGhhc2Ugb2YgYSB0b3VjaC5cbiMgQ2FuY2VsZWQgVGhlIHN5c3RlbSBjYW5jZWxsZWQgdHJhY2tpbmcgZm9yIHRoZSB0b3VjaC5cblxuIyMjXG5Db25zb2xpZGF0ZXMgbW91c2UgYW5kIHRvdWNoIGV2ZW50cy4gVG91Y2ggb2JqZWN0cyBwZXJzaXN0IGFjcm9zcyBhIHRvdWNoLFxuZnJvbSB0b3VjaHN0YXJ0IHVudGlsIGVuZC9jYW5jZWwuIFdoZW4gYSB0b3VjaCBzdGFydHMsIGl0IHdpbGwgdHJhdmVyc2VcbmRvd24gZnJvbSB0aGUgaW5uZXJtb3N0IHRhcmdldCwgdW50aWwgaXQgZmluZHMgYSBub2RlIHRoYXQgcmVzcG9uZHMgdG9cbm9udG91Y2hzdGFydC4gVW5sZXNzIHRoZSB0b3VjaCBpcyBleHBsaWNpdGx5IHJlZGlyZWN0ZWQsIHRoZSB0b3VjaCB3aWxsXG5jYWxsIG9udG91Y2htb3ZlIGFuZCBvbnRvdWNoZW5kIC8gb250b3VjaGNhbmNlbCBvbiB0aGUgcmVzcG9uZGVyIHdoZW4gYXBwcm9wcmlhdGUuXG5cblx0dGFnIGRyYWdnYWJsZVxuXHRcdCMgY2FsbGVkIHdoZW4gYSB0b3VjaCBzdGFydHNcblx0XHRkZWYgb250b3VjaHN0YXJ0IHRvdWNoXG5cdFx0XHRmbGFnICdkcmFnZ2luZydcblx0XHRcdHNlbGZcblx0XHRcblx0XHQjIGNhbGxlZCB3aGVuIHRvdWNoIG1vdmVzIC0gc2FtZSB0b3VjaCBvYmplY3Rcblx0XHRkZWYgb250b3VjaG1vdmUgdG91Y2hcblx0XHRcdCMgbW92ZSB0aGUgbm9kZSB3aXRoIHRvdWNoXG5cdFx0XHRjc3MgdG9wOiB0b3VjaC5keSwgbGVmdDogdG91Y2guZHhcblx0XHRcblx0XHQjIGNhbGxlZCB3aGVuIHRvdWNoIGVuZHNcblx0XHRkZWYgb250b3VjaGVuZCB0b3VjaFxuXHRcdFx0dW5mbGFnICdkcmFnZ2luZydcblxuQGluYW1lIHRvdWNoXG4jIyNcbmNsYXNzIEltYmEuVG91Y2hcblxuXHR2YXIgdG91Y2hlcyA9IFtdXG5cdHZhciBjb3VudCA9IDBcblx0dmFyIGlkZW50aWZpZXJzID0ge31cblxuXHRkZWYgc2VsZi5jb3VudFxuXHRcdGNvdW50XG5cblx0ZGVmIHNlbGYubG9va3VwIGl0ZW1cblx0XHRyZXR1cm4gaXRlbSBhbmQgKGl0ZW06X190b3VjaF9fIG9yIGlkZW50aWZpZXJzW2l0ZW06aWRlbnRpZmllcl0pXG5cblx0ZGVmIHNlbGYucmVsZWFzZSBpdGVtLHRvdWNoXG5cdFx0ZGVsZXRlIGlkZW50aWZpZXJzW2l0ZW06aWRlbnRpZmllcl1cblx0XHRkZWxldGUgaXRlbTpfX3RvdWNoX19cblx0XHRyZXR1cm5cblxuXHRkZWYgc2VsZi5vbnRvdWNoc3RhcnQgZVxuXHRcdGZvciB0IGluIGU6Y2hhbmdlZFRvdWNoZXNcblx0XHRcdGNvbnRpbnVlIGlmIGxvb2t1cCh0KVxuXHRcdFx0dmFyIHRvdWNoID0gaWRlbnRpZmllcnNbdDppZGVudGlmaWVyXSA9IHNlbGYubmV3KGUpICMgKGUpXG5cdFx0XHR0Ol9fdG91Y2hfXyA9IHRvdWNoXG5cdFx0XHR0b3VjaGVzLnB1c2godG91Y2gpXG5cdFx0XHRjb3VudCsrXG5cdFx0XHR0b3VjaC50b3VjaHN0YXJ0KGUsdClcblx0XHRzZWxmXG5cblx0ZGVmIHNlbGYub250b3VjaG1vdmUgZVxuXHRcdGZvciB0IGluIGU6Y2hhbmdlZFRvdWNoZXNcblx0XHRcdGlmIHZhciB0b3VjaCA9IGxvb2t1cCh0KVxuXHRcdFx0XHR0b3VjaC50b3VjaG1vdmUoZSx0KVxuXG5cdFx0c2VsZlxuXG5cdGRlZiBzZWxmLm9udG91Y2hlbmQgZVxuXHRcdGZvciB0IGluIGU6Y2hhbmdlZFRvdWNoZXNcblx0XHRcdGlmIHZhciB0b3VjaCA9IGxvb2t1cCh0KVxuXHRcdFx0XHR0b3VjaC50b3VjaGVuZChlLHQpXG5cdFx0XHRcdHJlbGVhc2UodCx0b3VjaClcblx0XHRcdFx0Y291bnQtLVxuXG5cdFx0IyBlLnByZXZlbnREZWZhdWx0XG5cdFx0IyBub3QgYWx3YXlzIHN1cHBvcnRlZCFcblx0XHQjIHRvdWNoZXMgPSB0b3VjaGVzLmZpbHRlcih8fClcblx0XHRzZWxmXG5cblx0ZGVmIHNlbGYub250b3VjaGNhbmNlbCBlXG5cdFx0Zm9yIHQgaW4gZTpjaGFuZ2VkVG91Y2hlc1xuXHRcdFx0aWYgdmFyIHRvdWNoID0gbG9va3VwKHQpXG5cdFx0XHRcdHRvdWNoLnRvdWNoY2FuY2VsKGUsdClcblx0XHRcdFx0cmVsZWFzZSh0LHRvdWNoKVxuXHRcdFx0XHRjb3VudC0tXG5cdFx0c2VsZlxuXG5cdGRlZiBzZWxmLm9ubW91c2Vkb3duIGVcblx0XHRzZWxmXG5cblx0ZGVmIHNlbGYub25tb3VzZW1vdmUgZVxuXHRcdHNlbGZcblxuXHRkZWYgc2VsZi5vbm1vdXNldXAgZVxuXHRcdHNlbGZcblxuXG5cdHByb3AgcGhhc2Vcblx0cHJvcCBhY3RpdmVcblx0cHJvcCBldmVudFxuXHRwcm9wIHBvaW50ZXJcblx0cHJvcCB0YXJnZXRcblx0cHJvcCBoYW5kbGVyXG5cdHByb3AgdXBkYXRlc1xuXHRwcm9wIHN1cHByZXNzXG5cdHByb3AgZGF0YVxuXHRwcm9wIGJ1YmJsZSBjaGFpbmFibGU6IHllc1xuXG5cdHByb3AgZ2VzdHVyZXNcblxuXHQjIyNcblx0XG5cblx0QGludGVybmFsXG5cdEBjb25zdHJ1Y3RvclxuXHQjIyNcblx0ZGVmIGluaXRpYWxpemUgZXZlbnQsIHBvaW50ZXJcblx0XHQjIEBuYXRpdmUgID0gZmFsc2Vcblx0XHRzZWxmLmV2ZW50ID0gZXZlbnRcblx0XHRkYXRhID0ge31cblx0XHRhY3RpdmUgPSB5ZXNcblx0XHRAYnV0dG9uID0gZXZlbnQgYW5kIGV2ZW50OmJ1dHRvbiBvciAwXG5cdFx0QHN1cHByZXNzID0gbm8gIyBkZXByZWNhdGVkXG5cdFx0QGNhcHR1cmVkID0gbm9cblx0XHRidWJibGUgPSBub1xuXHRcdHBvaW50ZXIgPSBwb2ludGVyXG5cdFx0dXBkYXRlcyA9IDBcblx0XHRyZXR1cm4gc2VsZlxuXG5cdGRlZiBjYXB0dXJlXG5cdFx0QGNhcHR1cmVkID0geWVzXG5cdFx0QGV2ZW50IGFuZCBAZXZlbnQucHJldmVudERlZmF1bHRcblx0XHRzZWxmXG5cblx0ZGVmIGlzQ2FwdHVyZWRcblx0XHQhIUBjYXB0dXJlZFxuXG5cdCMjI1xuXHRFeHRlbmQgdGhlIHRvdWNoIHdpdGggYSBwbHVnaW4gLyBnZXN0dXJlLiBcblx0QWxsIGV2ZW50cyAodG91Y2hzdGFydCxtb3ZlIGV0YykgZm9yIHRoZSB0b3VjaFxuXHR3aWxsIGJlIHRyaWdnZXJlZCBvbiB0aGUgcGx1Z2lucyBpbiB0aGUgb3JkZXIgdGhleVxuXHRhcmUgYWRkZWQuXG5cdCMjI1xuXHRkZWYgZXh0ZW5kIHBsdWdpblxuXHRcdCMgY29uc29sZS5sb2cgXCJhZGRlZCBnZXN0dXJlISEhXCJcblx0XHRAZ2VzdHVyZXMgfHw9IFtdXG5cdFx0QGdlc3R1cmVzLnB1c2gocGx1Z2luKVxuXHRcdHNlbGZcblxuXHQjIyNcblx0UmVkaXJlY3QgdG91Y2ggdG8gc3BlY2lmaWVkIHRhcmdldC4gb250b3VjaHN0YXJ0IHdpbGwgYWx3YXlzIGJlXG5cdGNhbGxlZCBvbiB0aGUgbmV3IHRhcmdldC5cblx0QHJldHVybiB7TnVtYmVyfVxuXHQjIyNcblx0ZGVmIHJlZGlyZWN0IHRhcmdldFxuXHRcdEByZWRpcmVjdCA9IHRhcmdldFxuXHRcdHNlbGZcblxuXHQjIyNcblx0U3VwcHJlc3MgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLiBXaWxsIGNhbGwgcHJldmVudERlZmF1bHQgZm9yXG5cdGFsbCBuYXRpdmUgZXZlbnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHRvdWNoLlxuXHQjIyNcblx0ZGVmIHN1cHByZXNzXG5cdFx0IyBjb2xsaXNpb24gd2l0aCB0aGUgc3VwcHJlc3MgcHJvcGVydHlcblx0XHRAYWN0aXZlID0gbm9cblx0XHRzZWxmXG5cblx0ZGVmIHN1cHByZXNzPSB2YWx1ZVxuXHRcdGNvbnNvbGUud2FybiAnSW1iYS5Ub3VjaCNzdXBwcmVzcz0gaXMgZGVwcmVjYXRlZCdcblx0XHRAc3VwcmVzcyA9IHZhbHVlXG5cdFx0c2VsZlxuXG5cdGRlZiB0b3VjaHN0YXJ0IGUsdFxuXHRcdEBldmVudCA9IGVcblx0XHRAdG91Y2ggPSB0XG5cdFx0QGJ1dHRvbiA9IDBcblx0XHRAeCA9IHQ6Y2xpZW50WFxuXHRcdEB5ID0gdDpjbGllbnRZXG5cdFx0YmVnYW5cblx0XHRlLnByZXZlbnREZWZhdWx0IGlmIGUgYW5kIGlzQ2FwdHVyZWRcblx0XHRzZWxmXG5cblx0ZGVmIHRvdWNobW92ZSBlLHRcblx0XHRAZXZlbnQgPSBlXG5cdFx0QHggPSB0OmNsaWVudFhcblx0XHRAeSA9IHQ6Y2xpZW50WVxuXHRcdHVwZGF0ZVxuXHRcdGUucHJldmVudERlZmF1bHQgaWYgZSBhbmQgaXNDYXB0dXJlZFxuXHRcdHNlbGZcblxuXHRkZWYgdG91Y2hlbmQgZSx0XG5cdFx0QGV2ZW50ID0gZVxuXHRcdEB4ID0gdDpjbGllbnRYXG5cdFx0QHkgPSB0OmNsaWVudFlcblx0XHRlbmRlZFxuXG5cdFx0bGFzdE5hdGl2ZVRvdWNoVGltZVN0YW1wID0gZTp0aW1lU3RhbXBcblxuXHRcdGlmIEBtYXhkciA8IDIwXG5cdFx0XHR2YXIgdGFwID0gSW1iYS5FdmVudC5uZXcoZSlcblx0XHRcdHRhcC50eXBlID0gJ3RhcCdcblx0XHRcdHRhcC5wcm9jZXNzXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0IGlmIHRhcC5AcmVzcG9uZGVyXHRcblxuXHRcdGlmIGUgYW5kIGlzQ2FwdHVyZWRcblx0XHRcdGUucHJldmVudERlZmF1bHRcblxuXHRcdHNlbGZcblxuXHRkZWYgdG91Y2hjYW5jZWwgZSx0XG5cdFx0Y2FuY2VsXG5cblx0ZGVmIG1vdXNlZG93biBlLHRcblx0XHRAZXZlbnQgPSBlXG5cdFx0QGJ1dHRvbiA9IGU6YnV0dG9uXG5cdFx0QHggPSB0OmNsaWVudFhcblx0XHRAeSA9IHQ6Y2xpZW50WVxuXHRcdGJlZ2FuXG5cblx0XHRAbW91c2Vtb3ZlID0gKHxlfCBtb3VzZW1vdmUoZSxlKSApXG5cdFx0ZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsQG1vdXNlbW92ZSx5ZXMpXG5cdFx0c2VsZlxuXG5cdGRlZiBtb3VzZW1vdmUgZSx0XG5cdFx0QHggPSB0OmNsaWVudFhcblx0XHRAeSA9IHQ6Y2xpZW50WVxuXHRcdEBldmVudCA9IGVcblx0XHRlLnByZXZlbnREZWZhdWx0IGlmIGlzQ2FwdHVyZWRcblx0XHR1cGRhdGVcblx0XHRtb3ZlXG5cdFx0c2VsZlxuXG5cdGRlZiBtb3VzZXVwIGUsdFxuXHRcdEB4ID0gdDpjbGllbnRYXG5cdFx0QHkgPSB0OmNsaWVudFlcblx0XHRlbmRlZFxuXHRcdGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLEBtb3VzZW1vdmUseWVzKVxuXHRcdEBtb3VzZW1vdmUgPSBudWxsXG5cdFx0c2VsZlxuXG5cdGRlZiBpZGxlXG5cdFx0dXBkYXRlXG5cblx0ZGVmIGJlZ2FuXG5cdFx0QG1heGRyID0gQGRyID0gMFxuXHRcdEB4MCA9IEB4XG5cdFx0QHkwID0gQHlcblxuXHRcdHZhciBkb20gPSBldmVudDp0YXJnZXRcblx0XHR2YXIgbm9kZSA9IG51bGxcblxuXHRcdEBzb3VyY2VUYXJnZXQgPSBkb20gYW5kIHRhZyhkb20pXG5cblx0XHR3aGlsZSBkb21cblx0XHRcdG5vZGUgPSB0YWcoZG9tKVxuXHRcdFx0aWYgbm9kZSAmJiBub2RlOm9udG91Y2hzdGFydFxuXHRcdFx0XHRAYnViYmxlID0gbm9cblx0XHRcdFx0dGFyZ2V0ID0gbm9kZVxuXHRcdFx0XHR0YXJnZXQub250b3VjaHN0YXJ0KHNlbGYpXG5cdFx0XHRcdGJyZWFrIHVubGVzcyBAYnViYmxlXG5cdFx0XHRkb20gPSBkb206cGFyZW50Tm9kZVxuXG5cdFx0QHVwZGF0ZXMrK1xuXHRcdHNlbGZcblxuXHRkZWYgdXBkYXRlXG5cdFx0cmV0dXJuIHNlbGYgdW5sZXNzIEBhY3RpdmVcblxuXHRcdHZhciBkciA9IE1hdGguc3FydChkeCpkeCArIGR5KmR5KVxuXHRcdEBtYXhkciA9IGRyIGlmIGRyID4gQGRyXG5cdFx0QGRyID0gZHJcblxuXHRcdCMgY2F0Y2hpbmcgYSB0b3VjaC1yZWRpcmVjdD8hP1xuXHRcdGlmIEByZWRpcmVjdFxuXHRcdFx0aWYgQHRhcmdldCBhbmQgQHRhcmdldDpvbnRvdWNoY2FuY2VsXG5cdFx0XHRcdEB0YXJnZXQub250b3VjaGNhbmNlbChzZWxmKVxuXHRcdFx0dGFyZ2V0ID0gQHJlZGlyZWN0XG5cdFx0XHRAcmVkaXJlY3QgPSBudWxsXG5cdFx0XHR0YXJnZXQub250b3VjaHN0YXJ0KHNlbGYpIGlmIHRhcmdldDpvbnRvdWNoc3RhcnRcblxuXG5cdFx0QHVwZGF0ZXMrK1xuXHRcdGlmIEBnZXN0dXJlc1xuXHRcdFx0Zy5vbnRvdWNodXBkYXRlKHNlbGYpIGZvciBnIGluIEBnZXN0dXJlc1xuXG5cdFx0dGFyZ2V0Py5vbnRvdWNodXBkYXRlKHNlbGYpXG5cdFx0c2VsZlxuXG5cdGRlZiBtb3ZlXG5cdFx0cmV0dXJuIHNlbGYgdW5sZXNzIEBhY3RpdmVcblxuXHRcdGlmIEBnZXN0dXJlc1xuXHRcdFx0Zm9yIGcgaW4gQGdlc3R1cmVzXG5cdFx0XHRcdGcub250b3VjaG1vdmUoc2VsZixAZXZlbnQpIGlmIGc6b250b3VjaG1vdmVcblxuXHRcdHRhcmdldD8ub250b3VjaG1vdmUoc2VsZixAZXZlbnQpXG5cdFx0c2VsZlxuXG5cdGRlZiBlbmRlZFxuXHRcdHJldHVybiBzZWxmIHVubGVzcyBAYWN0aXZlXG5cblx0XHRAdXBkYXRlcysrXG5cblx0XHRpZiBAZ2VzdHVyZXNcblx0XHRcdGcub250b3VjaGVuZChzZWxmKSBmb3IgZyBpbiBAZ2VzdHVyZXNcblxuXHRcdHRhcmdldD8ub250b3VjaGVuZChzZWxmKVxuXG5cdFx0c2VsZlxuXG5cdGRlZiBjYW5jZWxcblx0XHR1bmxlc3MgQGNhbmNlbGxlZFxuXHRcdFx0QGNhbmNlbGxlZCA9IHllc1xuXHRcdFx0Y2FuY2VsbGVkXG5cdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJyxAbW91c2Vtb3ZlLHllcykgaWYgQG1vdXNlbW92ZVxuXHRcdHNlbGZcblxuXHRkZWYgY2FuY2VsbGVkXG5cdFx0cmV0dXJuIHNlbGYgdW5sZXNzIEBhY3RpdmVcblxuXHRcdEBjYW5jZWxsZWQgPSB5ZXNcblx0XHRAdXBkYXRlcysrXG5cblx0XHRpZiBAZ2VzdHVyZXNcblx0XHRcdGZvciBnIGluIEBnZXN0dXJlc1xuXHRcdFx0XHRnLm9udG91Y2hjYW5jZWwoc2VsZikgaWYgZzpvbnRvdWNoY2FuY2VsXG5cblx0XHR0YXJnZXQ/Lm9udG91Y2hjYW5jZWwoc2VsZilcblx0XHRzZWxmXG5cblx0IyMjXG5cdFRoZSBhYnNvbHV0ZSBkaXN0YW5jZSB0aGUgdG91Y2ggaGFzIG1vdmVkIGZyb20gc3RhcnRpbmcgcG9zaXRpb24gXG5cdEByZXR1cm4ge051bWJlcn1cblx0IyMjXG5cdGRlZiBkciBkbyBAZHJcblxuXHQjIyNcblx0VGhlIGRpc3RhbmNlIHRoZSB0b3VjaCBoYXMgbW92ZWQgaG9yaXpvbnRhbGx5XG5cdEByZXR1cm4ge051bWJlcn1cblx0IyMjXG5cdGRlZiBkeCBkbyBAeCAtIEB4MFxuXG5cdCMjI1xuXHRUaGUgZGlzdGFuY2UgdGhlIHRvdWNoIGhhcyBtb3ZlZCB2ZXJ0aWNhbGx5XG5cdEByZXR1cm4ge051bWJlcn1cblx0IyMjXG5cdGRlZiBkeSBkbyBAeSAtIEB5MFxuXG5cdCMjI1xuXHRJbml0aWFsIGhvcml6b250YWwgcG9zaXRpb24gb2YgdG91Y2hcblx0QHJldHVybiB7TnVtYmVyfVxuXHQjIyNcblx0ZGVmIHgwIGRvIEB4MFxuXG5cdCMjI1xuXHRJbml0aWFsIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRvdWNoXG5cdEByZXR1cm4ge051bWJlcn1cblx0IyMjXG5cdGRlZiB5MCBkbyBAeTBcblxuXHQjIyNcblx0SG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0b3VjaFxuXHRAcmV0dXJuIHtOdW1iZXJ9XG5cdCMjI1xuXHRkZWYgeCBkbyBAeFxuXG5cdCMjI1xuXHRWZXJ0aWNhbCBwb3NpdGlvbiBvZiB0b3VjaFxuXHRAcmV0dXJuIHtOdW1iZXJ9XG5cdCMjI1xuXHRkZWYgeSBkbyBAeVxuXG5cdCMjI1xuXHRIb3Jpem9udGFsIHBvc2l0aW9uIG9mIHRvdWNoIHJlbGF0aXZlIHRvIHRhcmdldFxuXHRAcmV0dXJuIHtOdW1iZXJ9XG5cdCMjI1xuXHRkZWYgdHggZG9cblx0XHRAdGFyZ2V0Qm94IHx8PSBAdGFyZ2V0LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3Rcblx0XHRAeCAtIEB0YXJnZXRCb3g6bGVmdFxuXG5cdCMjI1xuXHRWZXJ0aWNhbCBwb3NpdGlvbiBvZiB0b3VjaCByZWxhdGl2ZSB0byB0YXJnZXRcblx0QHJldHVybiB7TnVtYmVyfVxuXHQjIyNcblx0ZGVmIHR5XG5cdFx0QHRhcmdldEJveCB8fD0gQHRhcmdldC5kb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0XG5cdFx0QHkgLSBAdGFyZ2V0Qm94OnRvcFxuXG5cdCMjI1xuXHRCdXR0b24gcHJlc3NlZCBpbiB0aGlzIHRvdWNoLiBOYXRpdmUgdG91Y2hlcyBkZWZhdWx0cyB0byBsZWZ0LWNsaWNrICgwKVxuXHRAcmV0dXJuIHtOdW1iZXJ9XG5cdCMjI1xuXHRkZWYgYnV0dG9uIGRvIEBidXR0b24gIyBAcG9pbnRlciA/IEBwb2ludGVyLmJ1dHRvbiA6IDBcblxuXHRkZWYgc291cmNlVGFyZ2V0XG5cdFx0QHNvdXJjZVRhcmdldFxuXG5cbmNsYXNzIEltYmEuVG91Y2hHZXN0dXJlXG5cblx0cHJvcCBhY3RpdmUgZGVmYXVsdDogbm9cblxuXHRkZWYgb250b3VjaHN0YXJ0IGVcblx0XHRzZWxmXG5cblx0ZGVmIG9udG91Y2h1cGRhdGUgZVxuXHRcdHNlbGZcblxuXHRkZWYgb250b3VjaGVuZCBlXG5cdFx0c2VsZlxuXG5cbiMgQSBUb3VjaC1ldmVudCBpcyBjcmVhdGVkIG9uIG1vdXNlZG93biAoYWx3YXlzKVxuIyBhbmQgd2hpbGUgaXQgZXhpc3RzLCBtb3VzZW1vdmUgYW5kIG1vdXNldXAgd2lsbFxuIyBiZSBkZWxlZ2F0ZWQgdG8gdGhpcyBhY3RpdmUgZXZlbnQuXG5JbWJhLlBPSU5URVIgPSBJbWJhLlBvaW50ZXIubmV3XG5JbWJhLlBPSU5URVJTID0gW0ltYmEuUE9JTlRFUl1cblxuXG4jIHJlZ3VsYXIgZXZlbnQgc3R1ZmZcbkltYmEuS0VZTUFQID0ge1xuXHRcIjhcIjogJ2JhY2tzcGFjZSdcblx0XCI5XCI6ICd0YWInXG5cdFwiMTNcIjogJ2VudGVyJ1xuXHRcIjE2XCI6ICdzaGlmdCdcblx0XCIxN1wiOiAnY3RybCdcblx0XCIxOFwiOiAnYWx0J1xuXHRcIjE5XCI6ICdicmVhaydcblx0XCIyMFwiOiAnY2Fwcydcblx0XCIyN1wiOiAnZXNjJ1xuXHRcIjMyXCI6ICdzcGFjZSdcblx0XCIzNVwiOiAnZW5kJ1xuXHRcIjM2XCI6ICdob21lJ1xuXHRcIjM3XCI6ICdsYXJyJ1xuXHRcIjM4XCI6ICd1YXJyJ1xuXHRcIjM5XCI6ICdyYXJyJ1xuXHRcIjQwXCI6ICdkYXJyJ1xuXHRcIjQ1XCI6ICdpbnNlcnQnXG5cdFwiNDZcIjogJ2RlbGV0ZSdcblx0XCIxMDdcIjogJ3BsdXMnXG5cdFwiMTA2XCI6ICdtdWx0J1xuXHRcIjkxXCI6ICdtZXRhJ1xufVxuXG5JbWJhLkNIQVJNQVAgPSB7XG5cdFwiJVwiOiAnbW9kdWxvJ1xuXHRcIipcIjogJ211bHRpcGx5J1xuXHRcIitcIjogJ2FkZCdcblx0XCItXCI6ICdzdWInXG5cdFwiL1wiOiAnZGl2aWRlJ1xuXHRcIi5cIjogJ2RvdCdcbn1cblxuIyMjXG5JbWJhIGhhbmRsZXMgYWxsIGV2ZW50cyBpbiB0aGUgZG9tIHRocm91Z2ggYSBzaW5nbGUgbWFuYWdlcixcbmxpc3RlbmluZyBhdCB0aGUgcm9vdCBvZiB5b3VyIGRvY3VtZW50LiBJZiBJbWJhIGZpbmRzIGEgdGFnXG50aGF0IGxpc3RlbnMgdG8gYSBjZXJ0YWluIGV2ZW50LCB0aGUgZXZlbnQgd2lsbCBiZSB3cmFwcGVkIFxuaW4gYW4gYEltYmEuRXZlbnRgLCB3aGljaCBub3JtYWxpemVzIHNvbWUgb2YgdGhlIHF1aXJrcyBhbmQgXG5icm93c2VyIGRpZmZlcmVuY2VzLlxuXG5AaW5hbWUgZXZlbnRcbiMjI1xuY2xhc3MgSW1iYS5FdmVudFxuXG5cdCMjIyByZWZlcmVuY2UgdG8gdGhlIG5hdGl2ZSBldmVudCAjIyNcblx0cHJvcCBldmVudFxuXG5cdCMjIyByZWZlcmVuY2UgdG8gdGhlIG5hdGl2ZSBldmVudCAjIyNcblx0cHJvcCBwcmVmaXhcblxuXHRwcm9wIGRhdGFcblxuXHQjIyNcblx0c2hvdWxkIHJlbW92ZSB0aGlzIGFsbHRvZ2V0aGVyP1xuXHRAZGVwcmVjYXRlZFxuXHQjIyNcblx0cHJvcCBzb3VyY2VcblxuXHQjIyMgQSB7Qm9vbGVhbn0gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBldmVudCBidWJibGVzIHVwIG9yIG5vdCAjIyNcblx0cHJvcCBidWJibGUgdHlwZTogQm9vbGVhbiwgY2hhaW5hYmxlOiB5ZXNcblxuXHRkZWYgc2VsZi53cmFwIGVcblx0XHRzZWxmLm5ldyhlKVxuXHRcblx0ZGVmIGluaXRpYWxpemUgZVxuXHRcdGV2ZW50ID0gZVxuXHRcdGJ1YmJsZSA9IHllc1xuXG5cdGRlZiB0eXBlPSB0eXBlXG5cdFx0QHR5cGUgPSB0eXBlXG5cdFx0c2VsZlxuXG5cdCMjI1xuXHRAcmV0dXJuIHtTdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBldmVudCAoY2FzZS1pbnNlbnNpdGl2ZSlcblx0IyMjXG5cdGRlZiB0eXBlXG5cdFx0QHR5cGUgfHwgZXZlbnQ6dHlwZVxuXG5cdGRlZiBuYW1lXG5cdFx0QG5hbWUgfHw9IHR5cGUudG9Mb3dlckNhc2UucmVwbGFjZSgvXFw6L2csJycpXG5cblx0IyBtaW1jIGdldHNldFxuXHRkZWYgYnViYmxlIHZcblx0XHRpZiB2ICE9IHVuZGVmaW5lZFxuXHRcdFx0c2VsZi5idWJibGUgPSB2XG5cdFx0XHRyZXR1cm4gc2VsZlxuXHRcdHJldHVybiBAYnViYmxlXG5cblx0IyMjXG5cdFByZXZlbnRzIGZ1cnRoZXIgcHJvcGFnYXRpb24gb2YgdGhlIGN1cnJlbnQgZXZlbnQuXG5cdEByZXR1cm4ge3NlbGZ9XG5cdCMjI1xuXHRkZWYgaGFsdFxuXHRcdGJ1YmJsZSA9IG5vXG5cdFx0c2VsZlxuXG5cdCMjI1xuXHRDYW5jZWwgdGhlIGV2ZW50IChpZiBjYW5jZWxhYmxlKS4gSW4gdGhlIGNhc2Ugb2YgbmF0aXZlIGV2ZW50cyBpdFxuXHR3aWxsIGNhbGwgYHByZXZlbnREZWZhdWx0YCBvbiB0aGUgd3JhcHBlZCBldmVudCBvYmplY3QuXG5cdEByZXR1cm4ge3NlbGZ9XG5cdCMjI1xuXHRkZWYgY2FuY2VsXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQgaWYgZXZlbnQ6cHJldmVudERlZmF1bHRcblx0XHRAY2FuY2VsID0geWVzXG5cdFx0c2VsZlxuXG5cdGRlZiBzaWxlbmNlXG5cdFx0QHNpbGVuY2VkID0geWVzXG5cdFx0c2VsZlxuXG5cdGRlZiBpc1NpbGVuY2VkXG5cdFx0ISFAc2lsZW5jZWRcblxuXHQjIyNcblx0SW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGV2ZW50LmNhbmNlbCBoYXMgYmVlbiBjYWxsZWQuXG5cblx0QHJldHVybiB7Qm9vbGVhbn1cblx0IyMjXG5cdGRlZiBpc1ByZXZlbnRlZFxuXHRcdGV2ZW50IGFuZCBldmVudDpkZWZhdWx0UHJldmVudGVkIG9yIEBjYW5jZWxcblxuXHQjIyNcblx0QSByZWZlcmVuY2UgdG8gdGhlIGluaXRpYWwgdGFyZ2V0IG9mIHRoZSBldmVudC5cblx0IyMjXG5cdGRlZiB0YXJnZXRcblx0XHR0YWcoZXZlbnQ6X3RhcmdldCBvciBldmVudDp0YXJnZXQpXG5cblx0IyMjXG5cdEEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgcmVzcG9uZGluZyB0byB0aGUgZXZlbnQuXG5cdCMjI1xuXHRkZWYgcmVzcG9uZGVyXG5cdFx0QHJlc3BvbmRlclxuXG5cdCMjI1xuXHRSZWRpcmVjdCB0aGUgZXZlbnQgdG8gbmV3IHRhcmdldFxuXHQjIyNcblx0ZGVmIHJlZGlyZWN0IG5vZGVcblx0XHRAcmVkaXJlY3QgPSBub2RlXG5cdFx0c2VsZlxuXG5cdCMjI1xuXHRHZXQgdGhlIG5vcm1hbGl6ZWQgY2hhcmFjdGVyIGZvciBLZXlib2FyZEV2ZW50L1RleHRFdmVudFxuXHRAcmV0dXJuIHtTdHJpbmd9XG5cdCMjI1xuXHRkZWYga2V5Y2hhclxuXHRcdGlmIGV2ZW50IGlzYSBLZXlib2FyZEV2ZW50XG5cdFx0XHR2YXIga2kgPSBldmVudDprZXlJZGVudGlmaWVyXG5cdFx0XHR2YXIgc3ltID0gSW1iYS5LRVlNQVBbZXZlbnQ6a2V5Q29kZV1cblxuXHRcdFx0aWYgIXN5bSBhbmQga2kuc3Vic3RyKDAsMikgPT0gXCJVK1wiXG5cdFx0XHRcdHN5bSA9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoa2kuc3Vic3RyKDIpLCAxNikpXG5cdFx0XHRyZXR1cm4gc3ltXG5cblx0XHRlbGlmIGV2ZW50IGlzYSAod2luZG93LlRleHRFdmVudCBvciB3aW5kb3cuSW5wdXRFdmVudClcblx0XHRcdHJldHVybiBldmVudDpkYXRhXG5cblx0XHRyZXR1cm4gbnVsbFxuXG5cdCMjI1xuXHRAZGVwcmVjYXRlZFxuXHQjIyNcblx0ZGVmIGtleWNvbWJvXG5cdFx0cmV0dXJuIHVubGVzcyB2YXIgc3ltID0ga2V5Y2hhclxuXHRcdHN5bSA9IEltYmEuQ0hBUk1BUFtzeW1dIG9yIHN5bVxuXHRcdHZhciBjb21ibyA9IFtdLCBlID0gZXZlbnRcblx0XHRjb21iby5wdXNoKDpjdHJsKSBpZiBlOmN0cmxLZXlcblx0XHRjb21iby5wdXNoKDpzaGlmdCkgaWYgZTpzaGlmdEtleVxuXHRcdGNvbWJvLnB1c2goOmFsdCkgaWYgZTphbHRLZXlcblx0XHRjb21iby5wdXNoKDpjbWQpIGlmIGU6bWV0YUtleVxuXHRcdGNvbWJvLnB1c2goc3ltKVxuXHRcdGNvbWJvLmpvaW4oXCJfXCIpLnRvTG93ZXJDYXNlXG5cblxuXHRkZWYgcHJvY2Vzc1xuXHRcdHZhciBtZXRoID0gXCJvbntAcHJlZml4IG9yICcnfXtuYW1lfVwiXG5cdFx0dmFyIGFyZ3MgPSBudWxsXG5cdFx0dmFyIGRvbXRhcmdldCA9IGV2ZW50Ol90YXJnZXQgb3IgZXZlbnQ6dGFyZ2V0XHRcdFxuXHRcdCMgdmFyIG5vZGUgPSA8e2RvbXRhcmdldDpfcmVzcG9uZGVyIG9yIGRvbXRhcmdldH0+XG5cdFx0IyBuZWVkIHRvIGNsZWFuIHVwIGFuZCBkb2N1bWVudCB0aGlzIGJlaGF2aW91clxuXG5cdFx0dmFyIGRvbW5vZGUgPSBkb210YXJnZXQ6X3Jlc3BvbmRlciBvciBkb210YXJnZXRcblx0XHQjIEB0b2RvIG5lZWQgdG8gc3RvcCBpbmZpbml0ZSByZWRpcmVjdC1ydWxlcyBoZXJlXG5cblx0XHR3aGlsZSBkb21ub2RlXG5cdFx0XHRAcmVkaXJlY3QgPSBudWxsXG5cdFx0XHRpZiB2YXIgbm9kZSA9IHRhZyhkb21ub2RlKSAjIG5vdCBvbmx5IHRhZyBcblxuXHRcdFx0XHRpZiBub2RlW21ldGhdIGlzYSBTdHJpbmdcblx0XHRcdFx0XHQjIHNob3VsZCByZW1lbWJlciB0aGUgcmVjZWl2ZXIgb2YgdGhlIGV2ZW50XG5cdFx0XHRcdFx0bWV0aCA9IG5vZGVbbWV0aF1cblx0XHRcdFx0XHRjb250aW51ZSAjIHNob3VsZCBub3QgY29udGludWU/XG5cblx0XHRcdFx0aWYgbm9kZVttZXRoXSBpc2EgQXJyYXlcblx0XHRcdFx0XHRhcmdzID0gbm9kZVttZXRoXS5jb25jYXQobm9kZSlcblx0XHRcdFx0XHRtZXRoID0gYXJncy5zaGlmdFxuXHRcdFx0XHRcdGNvbnRpbnVlICMgc2hvdWxkIG5vdCBjb250aW51ZT9cblxuXHRcdFx0XHRpZiBub2RlW21ldGhdIGlzYSBGdW5jdGlvblxuXHRcdFx0XHRcdEByZXNwb25kZXIgfHw9IG5vZGVcblx0XHRcdFx0XHQjIHNob3VsZCBhdXRvc3RvcCBidWJibGUgaGVyZT9cblx0XHRcdFx0XHRhcmdzID8gbm9kZVttZXRoXS5hcHBseShub2RlLGFyZ3MpIDogbm9kZVttZXRoXShzZWxmLGRhdGEpXG5cdFx0XHRcdFx0XG5cdFx0XHQjIGFkZCBub2RlLm5leHRFdmVudFJlc3BvbmRlciBhcyBhIHNlcGFyYXRlIG1ldGhvZCBoZXJlP1xuXHRcdFx0dW5sZXNzIGJ1YmJsZSBhbmQgZG9tbm9kZSA9IChAcmVkaXJlY3Qgb3IgKG5vZGUgPyBub2RlLnBhcmVudCA6IGRvbW5vZGU6cGFyZW50Tm9kZSkpXG5cdFx0XHRcdGJyZWFrXG5cblx0XHRwcm9jZXNzZWRcblx0XHRyZXR1cm4gc2VsZlxuXG5cblx0ZGVmIHByb2Nlc3NlZFxuXHRcdEltYmEuZW1pdChJbWJhLCdldmVudCcsW3NlbGZdKSB1bmxlc3MgQHNpbGVuY2VkXG5cdFx0c2VsZlxuXG5cdCMjI1xuXHRSZXR1cm4gdGhlIHgvbGVmdCBjb29yZGluYXRlIG9mIHRoZSBtb3VzZSAvIHBvaW50ZXIgZm9yIHRoaXMgZXZlbnRcblx0QHJldHVybiB7TnVtYmVyfSB4IGNvb3JkaW5hdGUgb2YgbW91c2UgLyBwb2ludGVyIGZvciBldmVudFxuXHQjIyNcblx0ZGVmIHggZG8gZXZlbnQ6eFxuXG5cdCMjI1xuXHRSZXR1cm4gdGhlIHkvdG9wIGNvb3JkaW5hdGUgb2YgdGhlIG1vdXNlIC8gcG9pbnRlciBmb3IgdGhpcyBldmVudFxuXHRAcmV0dXJuIHtOdW1iZXJ9IHkgY29vcmRpbmF0ZSBvZiBtb3VzZSAvIHBvaW50ZXIgZm9yIGV2ZW50XG5cdCMjI1xuXHRkZWYgeSBkbyBldmVudDp5XG5cblx0IyMjXG5cdFJldHVybnMgYSBOdW1iZXIgcmVwcmVzZW50aW5nIGEgc3lzdGVtIGFuZCBpbXBsZW1lbnRhdGlvblxuXHRkZXBlbmRlbnQgbnVtZXJpYyBjb2RlIGlkZW50aWZ5aW5nIHRoZSB1bm1vZGlmaWVkIHZhbHVlIG9mIHRoZVxuXHRwcmVzc2VkIGtleTsgdGhpcyBpcyB1c3VhbGx5IHRoZSBzYW1lIGFzIGtleUNvZGUuXG5cblx0Rm9yIG1vdXNlLWV2ZW50cywgdGhlIHJldHVybmVkIHZhbHVlIGluZGljYXRlcyB3aGljaCBidXR0b24gd2FzXG5cdHByZXNzZWQgb24gdGhlIG1vdXNlIHRvIHRyaWdnZXIgdGhlIGV2ZW50LlxuXG5cdEByZXR1cm4ge051bWJlcn1cblx0IyMjXG5cdGRlZiB3aGljaCBkbyBldmVudDp3aGljaFxuXG5cbiMjI1xuXG5NYW5hZ2VyIGZvciBsaXN0ZW5pbmcgdG8gYW5kIGRlbGVnYXRpbmcgZXZlbnRzIGluIEltYmEuIEEgc2luZ2xlIGluc3RhbmNlXG5pcyBhbHdheXMgY3JlYXRlZCBieSBJbWJhIChhcyBgSW1iYS5FdmVudHNgKSwgd2hpY2ggaGFuZGxlcyBhbmQgZGVsZWdhdGVzIGFsbFxuZXZlbnRzIGF0IHRoZSB2ZXJ5IHJvb3Qgb2YgdGhlIGRvY3VtZW50LiBJbWJhIGRvZXMgbm90IGNhcHR1cmUgYWxsIGV2ZW50c1xuYnkgZGVmYXVsdCwgc28gaWYgeW91IHdhbnQgdG8gbWFrZSBzdXJlIGV4b3RpYyBvciBjdXN0b20gRE9NRXZlbnRzIGFyZSBkZWxlZ2F0ZWRcbmluIEltYmEgeW91IHdpbGwgbmVlZCB0byByZWdpc3RlciB0aGVtIGluIGBJbWJhLkV2ZW50cy5yZWdpc3RlcihteUN1c3RvbUV2ZW50TmFtZSlgXG5cbkBpbmFtZSBtYW5hZ2VyXG5cbiMjI1xuY2xhc3MgSW1iYS5FdmVudE1hbmFnZXJcblxuXHRwcm9wIHJvb3Rcblx0cHJvcCBjb3VudFxuXHRwcm9wIGVuYWJsZWQgZGVmYXVsdDogbm8sIHdhdGNoOiB5ZXNcblx0cHJvcCBsaXN0ZW5lcnNcblx0cHJvcCBkZWxlZ2F0b3JzXG5cdHByb3AgZGVsZWdhdG9yXG5cblx0ZGVmIGVuYWJsZWQtZGlkLXNldCBib29sXG5cdFx0Ym9vbCA/IG9uZW5hYmxlIDogb25kaXNhYmxlXG5cdFx0c2VsZlxuXG5cdGRlZiBpbml0aWFsaXplIG5vZGUsIGV2ZW50czogW11cblx0XHRyb290ID0gbm9kZVxuXHRcdGNvdW50ID0gMFxuXHRcdGxpc3RlbmVycyA9IFtdXG5cdFx0ZGVsZWdhdG9ycyA9IHt9XG5cdFx0ZGVsZWdhdG9yID0gZG8gfGV8IFxuXHRcdFx0IyBjb25zb2xlLmxvZyBcImRlbGVnYXRpbmcgZXZlbnQ/ISB7ZX1cIlxuXHRcdFx0ZGVsZWdhdGUoZSlcblx0XHRcdHJldHVybiB0cnVlXG5cblx0XHRmb3IgZXZlbnQgaW4gZXZlbnRzXG5cdFx0XHRyZWdpc3RlcihldmVudClcblxuXHRcdHJldHVybiBzZWxmXG5cblx0IyMjXG5cblx0VGVsbCB0aGUgY3VycmVudCBFdmVudE1hbmFnZXIgdG8gaW50ZXJjZXB0IGFuZCBoYW5kbGUgZXZlbnQgb2YgYSBjZXJ0YWluIG5hbWUuXG5cdEJ5IGRlZmF1bHQsIEltYmEuRXZlbnRzIHdpbGwgcmVnaXN0ZXIgaW50ZXJjZXB0b3JzIGZvcjogKmtleWRvd24qLCAqa2V5dXAqLCBcblx0KmtleXByZXNzKiwgKnRleHRJbnB1dCosICppbnB1dCosICpjaGFuZ2UqLCAqc3VibWl0KiwgKmZvY3VzaW4qLCAqZm9jdXNvdXQqLCBcblx0KmJsdXIqLCAqY29udGV4dG1lbnUqLCAqZGJsY2xpY2sqLCAqbW91c2V3aGVlbCosICp3aGVlbCpcblxuXHQjIyNcblx0ZGVmIHJlZ2lzdGVyIG5hbWUsIGhhbmRsZXIgPSB0cnVlXG5cdFx0aWYgbmFtZSBpc2EgQXJyYXlcblx0XHRcdHJlZ2lzdGVyKHYsaGFuZGxlcikgZm9yIHYgaW4gbmFtZVxuXHRcdFx0cmV0dXJuIHNlbGZcblxuXHRcdHJldHVybiBzZWxmIGlmIGRlbGVnYXRvcnNbbmFtZV1cblx0XHQjIGNvbnNvbGUubG9nKFwicmVnaXN0ZXIgZm9yIGV2ZW50IHtuYW1lfVwiKVxuXHRcdHZhciBmbiA9IGRlbGVnYXRvcnNbbmFtZV0gPSBoYW5kbGVyIGlzYSBGdW5jdGlvbiA/IGhhbmRsZXIgOiBkZWxlZ2F0b3Jcblx0XHRyb290LmFkZEV2ZW50TGlzdGVuZXIobmFtZSxmbix5ZXMpIGlmIGVuYWJsZWRcblxuXHRkZWYgbGlzdGVuIG5hbWUsIGhhbmRsZXIsIGNhcHR1cmUgPSB5ZXNcblx0XHRsaXN0ZW5lcnMucHVzaChbbmFtZSxoYW5kbGVyLGNhcHR1cmVdKVxuXHRcdHJvb3QuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLGhhbmRsZXIsY2FwdHVyZSkgaWYgZW5hYmxlZFxuXHRcdHNlbGZcblxuXHRkZWYgZGVsZWdhdGUgZVxuXHRcdGNvdW50ICs9IDFcblx0XHR2YXIgZXZlbnQgPSBJbWJhLkV2ZW50LndyYXAoZSlcblx0XHRldmVudC5wcm9jZXNzXG5cdFx0c2VsZlxuXG5cdGRlZiBjcmVhdGUgdHlwZSwgdGFyZ2V0LCBkYXRhOiBudWxsLCBzb3VyY2U6IG51bGxcblx0XHR2YXIgZXZlbnQgPSBJbWJhLkV2ZW50LndyYXAgdHlwZTogdHlwZSwgdGFyZ2V0OiB0YXJnZXRcblx0XHRldmVudC5kYXRhID0gZGF0YSBpZiBkYXRhXG5cdFx0ZXZlbnQuc291cmNlID0gc291cmNlIGlmIHNvdXJjZVxuXHRcdGV2ZW50XG5cblx0IyB1c2UgY3JlYXRlIGluc3RlYWQ/XG5cdGRlZiB0cmlnZ2VyXG5cdFx0Y3JlYXRlKCphcmd1bWVudHMpLnByb2Nlc3NcblxuXHRkZWYgb25lbmFibGVcblx0XHRmb3Igb3duIG5hbWUsaGFuZGxlciBvZiBkZWxlZ2F0b3JzXG5cdFx0XHRyb290LmFkZEV2ZW50TGlzdGVuZXIobmFtZSxoYW5kbGVyLHllcylcblxuXHRcdGZvciBpdGVtIGluIGxpc3RlbmVyc1xuXHRcdFx0cm9vdC5hZGRFdmVudExpc3RlbmVyKGl0ZW1bMF0saXRlbVsxXSxpdGVtWzJdKVxuXHRcdHNlbGZcblxuXHRkZWYgb25kaXNhYmxlXG5cdFx0Zm9yIG93biBuYW1lLGhhbmRsZXIgb2YgZGVsZWdhdG9yc1xuXHRcdFx0cm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsaGFuZGxlcix5ZXMpXG5cblx0XHRmb3IgaXRlbSBpbiBsaXN0ZW5lcnNcblx0XHRcdHJvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihpdGVtWzBdLGl0ZW1bMV0saXRlbVsyXSlcblx0XHRzZWxmXG5cdFx0XG5cbkVEID0gSW1iYS5FdmVudHMgPSBJbWJhLkV2ZW50TWFuYWdlci5uZXcoZG9jdW1lbnQsIGV2ZW50czogW1xuXHQ6a2V5ZG93biw6a2V5dXAsOmtleXByZXNzLDp0ZXh0SW5wdXQsOmlucHV0LDpjaGFuZ2UsOnN1Ym1pdCxcblx0OmZvY3VzaW4sOmZvY3Vzb3V0LDpibHVyLDpjb250ZXh0bWVudSw6ZGJsY2xpY2ssXG5cdDptb3VzZXdoZWVsLDp3aGVlbCw6c2Nyb2xsXG5dKVxuXG4jIHNob3VsZCBzZXQgdGhlc2UgdXAgaW5zaWRlIHRoZSBJbWJhLkV2ZW50cyBvYmplY3QgaXRzZWxmXG4jIHNvIHRoYXQgd2UgY2FuIGhhdmUgZGlmZmVyZW50IEV2ZW50TWFuYWdlciBmb3IgZGlmZmVyZW50IHJvb3RzXG5cbmlmIGhhc1RvdWNoRXZlbnRzXG5cdEltYmEuRXZlbnRzLmxpc3Rlbig6dG91Y2hzdGFydCkgZG8gfGV8XG5cdFx0SW1iYS5FdmVudHMuY291bnQrK1xuXHRcdEltYmEuVG91Y2gub250b3VjaHN0YXJ0KGUpXG5cblx0SW1iYS5FdmVudHMubGlzdGVuKDp0b3VjaG1vdmUpIGRvIHxlfFxuXHRcdEltYmEuRXZlbnRzLmNvdW50Kytcblx0XHRJbWJhLlRvdWNoLm9udG91Y2htb3ZlKGUpXG5cblx0SW1iYS5FdmVudHMubGlzdGVuKDp0b3VjaGVuZCkgZG8gfGV8XG5cdFx0SW1iYS5FdmVudHMuY291bnQrK1xuXHRcdEltYmEuVG91Y2gub250b3VjaGVuZChlKVxuXG5cdEltYmEuRXZlbnRzLmxpc3Rlbig6dG91Y2hjYW5jZWwpIGRvIHxlfFxuXHRcdEltYmEuRXZlbnRzLmNvdW50Kytcblx0XHRJbWJhLlRvdWNoLm9udG91Y2hjYW5jZWwoZSlcblxuSW1iYS5FdmVudHMucmVnaXN0ZXIoOmNsaWNrKSBkbyB8ZXxcblx0IyBPbmx5IGZvciBtYWluIG1vdXNlYnV0dG9uLCBubz9cblx0aWYgKGU6dGltZVN0YW1wIC0gbGFzdE5hdGl2ZVRvdWNoVGltZVN0YW1wKSA+IGxhc3ROYXRpdmVUb3VjaFRpbWVvdXRcblx0XHR2YXIgdGFwID0gSW1iYS5FdmVudC5uZXcoZSlcblx0XHR0YXAudHlwZSA9ICd0YXAnXG5cdFx0dGFwLnByb2Nlc3Ncblx0XHRpZiB0YXAuQHJlc3BvbmRlclxuXHRcdFx0cmV0dXJuIGUucHJldmVudERlZmF1bHRcblx0IyBkZWxlZ2F0ZSB0aGUgcmVhbCBjbGljayBldmVudFxuXHRJbWJhLkV2ZW50cy5kZWxlZ2F0ZShlKVxuXG5JbWJhLkV2ZW50cy5saXN0ZW4oOm1vdXNlZG93bikgZG8gfGV8XG5cdGlmIChlOnRpbWVTdGFtcCAtIGxhc3ROYXRpdmVUb3VjaFRpbWVTdGFtcCkgPiBsYXN0TmF0aXZlVG91Y2hUaW1lb3V0XG5cdFx0SW1iYS5QT0lOVEVSLnVwZGF0ZShlKS5wcm9jZXNzIGlmIEltYmEuUE9JTlRFUlxuXG4jIEltYmEuRXZlbnRzLmxpc3Rlbig6bW91c2Vtb3ZlKSBkbyB8ZXxcbiMgXHQjIGNvbnNvbGUubG9nICdtb3VzZW1vdmUnLGU6dGltZVN0YW1wXG4jIFx0aWYgKGU6dGltZVN0YW1wIC0gbGFzdE5hdGl2ZVRvdWNoVGltZVN0YW1wKSA+IGxhc3ROYXRpdmVUb3VjaFRpbWVvdXRcbiMgXHRcdEltYmEuUE9JTlRFUi51cGRhdGUoZSkucHJvY2VzcyBpZiBJbWJhLlBPSU5URVIgIyAucHJvY2VzcyBpZiB0b3VjaCAjIHNob3VsZCBub3QgaGFwcGVuPyBXZSBwcm9jZXNzIHRocm91Z2ggXG5cbkltYmEuRXZlbnRzLmxpc3Rlbig6bW91c2V1cCkgZG8gfGV8XG5cdCMgY29uc29sZS5sb2cgJ21vdXNldXAnLGU6dGltZVN0YW1wXG5cdGlmIChlOnRpbWVTdGFtcCAtIGxhc3ROYXRpdmVUb3VjaFRpbWVTdGFtcCkgPiBsYXN0TmF0aXZlVG91Y2hUaW1lb3V0XG5cdFx0SW1iYS5QT0lOVEVSLnVwZGF0ZShlKS5wcm9jZXNzIGlmIEltYmEuUE9JTlRFUlxuXG5cbkltYmEuRXZlbnRzLnJlZ2lzdGVyKFs6bW91c2Vkb3duLDptb3VzZXVwXSlcbkltYmEuRXZlbnRzLmVuYWJsZWQgPSB5ZXNcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBzcmMvaW1iYS9kb20uZXZlbnRzLmltYmFcbiAqKi8iLCJ2YXIgSW1iYVRhZyA9IEltYmEuVEFHUzplbGVtZW50XG5cbmRlZiByZW1vdmVOZXN0ZWQgcm9vdCwgbm9kZSwgY2FyZXRcblx0IyBpZiBub2RlL25vZGVzIGlzYSBTdHJpbmdcblx0IyBcdHdlIG5lZWQgdG8gdXNlIHRoZSBjYXJldCB0byByZW1vdmUgZWxlbWVudHNcblx0IyBcdGZvciBub3cgd2Ugd2lsbCBzaW1wbHkgbm90IHN1cHBvcnQgdGhpc1xuXHRpZiBub2RlIGlzYSBJbWJhVGFnXG5cdFx0cm9vdC5yZW1vdmVDaGlsZChub2RlKVxuXHRlbGlmIG5vZGUgaXNhIEFycmF5XG5cdFx0cmVtb3ZlTmVzdGVkKHJvb3QsbWVtYmVyLGNhcmV0KSBmb3IgbWVtYmVyIGluIG5vZGVcblx0ZWxzZVxuXHRcdCMgd2hhdCBpZiB0aGlzIGlzIG5vdCBudWxsPyE/IT9cblx0XHQjIHRha2UgYSBjaGFuY2UgYW5kIHJlbW92ZSBhIHRleHQtZWxlbWVudG5nXG5cdFx0bGV0IG5leHQgPSBjYXJldCA/IGNhcmV0Om5leHRTaWJsaW5nIDogcm9vdC5AZG9tOmZpcnN0Q2hpbGRcblx0XHRpZiBuZXh0IGlzYSBUZXh0IGFuZCBuZXh0OnRleHRDb250ZW50ID09IG5vZGVcblx0XHRcdHJvb3QucmVtb3ZlQ2hpbGQobmV4dClcblx0XHRlbHNlXG5cdFx0XHR0aHJvdyAnY2Fubm90IHJlbW92ZSBzdHJpbmcnXG5cblx0cmV0dXJuIGNhcmV0XG5cbmRlZiBhcHBlbmROZXN0ZWQgcm9vdCwgbm9kZVxuXHRpZiBub2RlIGlzYSBJbWJhVGFnXG5cdFx0cm9vdC5hcHBlbmRDaGlsZChub2RlKVxuXG5cdGVsaWYgbm9kZSBpc2EgQXJyYXlcblx0XHRhcHBlbmROZXN0ZWQocm9vdCxtZW1iZXIpIGZvciBtZW1iZXIgaW4gbm9kZVxuXG5cdGVsaWYgbm9kZSAhPSBudWxsIGFuZCBub2RlICE9PSBmYWxzZVxuXHRcdHJvb3QuYXBwZW5kQ2hpbGQgSW1iYS5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShub2RlKVxuXG5cdHJldHVyblxuXG5cbiMgaW5zZXJ0IG5vZGVzIGJlZm9yZSBhIGNlcnRhaW4gbm9kZVxuIyBkb2VzIG5vdCBuZWVkIHRvIHJldHVybiBhbnkgdGFpbCwgYXMgYmVmb3JlXG4jIHdpbGwgc3RpbGwgYmUgY29ycmVjdCB0aGVyZVxuIyBiZWZvcmUgbXVzdCBiZSBhbiBhY3R1YWwgZG9tbm9kZVxuZGVmIGluc2VydE5lc3RlZEJlZm9yZSByb290LCBub2RlLCBiZWZvcmVcblx0aWYgbm9kZSBpc2EgSW1iYVRhZ1xuXHRcdHJvb3QuaW5zZXJ0QmVmb3JlKG5vZGUsYmVmb3JlKVxuXHRlbGlmIG5vZGUgaXNhIEFycmF5XG5cdFx0aW5zZXJ0TmVzdGVkQmVmb3JlKHJvb3QsbWVtYmVyLGJlZm9yZSkgZm9yIG1lbWJlciBpbiBub2RlXG5cdGVsaWYgbm9kZSAhPSBudWxsIGFuZCBub2RlICE9PSBmYWxzZVxuXHRcdHJvb3QuaW5zZXJ0QmVmb3JlKEltYmEuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobm9kZSksYmVmb3JlKVxuXG5cdHJldHVybiBiZWZvcmVcblxuIyBhZnRlciBtdXN0IGJlIGFuIGFjdHVhbCBkb21ub2RlXG5kZWYgaW5zZXJ0TmVzdGVkQWZ0ZXIgcm9vdCwgbm9kZSwgYWZ0ZXJcblx0dmFyIGJlZm9yZSA9IGFmdGVyID8gYWZ0ZXI6bmV4dFNpYmxpbmcgOiByb290LkBkb206Zmlyc3RDaGlsZFxuXG5cdGlmIGJlZm9yZVxuXHRcdGluc2VydE5lc3RlZEJlZm9yZShyb290LG5vZGUsYmVmb3JlKVxuXHRcdHJldHVybiBiZWZvcmU6cHJldmlvdXNTaWJsaW5nXG5cdGVsc2Vcblx0XHRhcHBlbmROZXN0ZWQocm9vdCxub2RlKVxuXHRcdHJldHVybiByb290LkBkb206bGFzdENoaWxkXG5cbmRlZiByZWNvbmNpbGVDb2xsZWN0aW9uQ2hhbmdlcyByb290LCBuZXcsIG9sZCwgY2FyZXRcblxuXHR2YXIgbmV3TGVuID0gbmV3Omxlbmd0aFxuXHR2YXIgbGFzdE5ldyA9IG5ld1tuZXdMZW4gLSAxXVxuXG5cdCMgVGhpcyByZS1vcmRlciBhbGdvcml0aG0gaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBwcmluY2lwbGU6XG5cdCMgXG5cdCMgV2UgYnVpbGQgYSBcImNoYWluXCIgd2hpY2ggc2hvd3Mgd2hpY2ggaXRlbXMgYXJlIGFscmVhZHkgc29ydGVkLlxuXHQjIElmIHdlJ3JlIGdvaW5nIGZyb20gWzEsIDIsIDNdIC0+IFsyLCAxLCAzXSwgdGhlIHRyZWUgbG9va3MgbGlrZTpcblx0I1xuXHQjIFx0MyAtPiAgMCAoaWR4KVxuXHQjIFx0MiAtPiAtMSAoaWR4KVxuXHQjIFx0MSAtPiAtMSAoaWR4KVxuXHQjXG5cdCMgVGhpcyB0ZWxscyB1cyB0aGF0IHdlIGhhdmUgdHdvIGNoYWlucyBvZiBvcmRlcmVkIGl0ZW1zOlxuXHQjIFxuXHQjIFx0KDEsIDMpIGFuZCAoMilcblx0IyBcblx0IyBUaGUgb3B0aW1hbCByZS1vcmRlcmluZyB0aGVuIGJlY29tZXMgdHdvIGtlZXAgdGhlIGxvbmdlc3QgY2hhaW4gaW50YWN0LFxuXHQjIGFuZCBtb3ZlIGFsbCB0aGUgb3RoZXIgaXRlbXMuXG5cblx0dmFyIG5ld1Bvc2l0aW9uID0gW11cblxuXHQjIFRoZSB0cmVlL2dyYXBoIGl0c2VsZlxuXHR2YXIgcHJldkNoYWluID0gW11cblx0IyBUaGUgbGVuZ3RoIG9mIHRoZSBjaGFpblxuXHR2YXIgbGVuZ3RoQ2hhaW4gPSBbXVxuXG5cdCMgS2VlcCB0cmFjayBvZiB0aGUgbG9uZ2VzdCBjaGFpblxuXHR2YXIgbWF4Q2hhaW5MZW5ndGggPSAwXG5cdHZhciBtYXhDaGFpbkVuZCA9IDBcblxuXHRmb3Igbm9kZSwgaWR4IGluIG9sZFxuXHRcdHZhciBuZXdQb3MgPSBuZXcuaW5kZXhPZihub2RlKVxuXHRcdG5ld1Bvc2l0aW9uLnB1c2gobmV3UG9zKVxuXG5cdFx0aWYgbmV3UG9zID09IC0xXG5cdFx0XHRyb290LnJlbW92ZUNoaWxkKG5vZGUpXG5cdFx0XHRwcmV2Q2hhaW4ucHVzaCgtMSlcblx0XHRcdGxlbmd0aENoYWluLnB1c2goLTEpXG5cdFx0XHRjb250aW51ZVxuXG5cdFx0dmFyIHByZXZJZHggPSBuZXdQb3NpdGlvbjpsZW5ndGggLSAyXG5cblx0XHQjIEJ1aWxkIHRoZSBjaGFpbjpcblx0XHR3aGlsZSBwcmV2SWR4ID49IDBcblx0XHRcdGlmIG5ld1Bvc2l0aW9uW3ByZXZJZHhdID09IC0xXG5cdFx0XHRcdHByZXZJZHgtLVxuXHRcdFx0ZWxpZiBuZXdQb3MgPiBuZXdQb3NpdGlvbltwcmV2SWR4XVxuXHRcdFx0XHQjIFlheSwgd2UncmUgYmlnZ2VyIHRoYW4gdGhlIHByZXZpb3VzIVxuXHRcdFx0XHRicmVha1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHQjIE5vcGUsIGxldCdzIHdhbGsgYmFjayB0aGUgY2hhaW5cblx0XHRcdFx0cHJldklkeCA9IHByZXZDaGFpbltwcmV2SWR4XVxuXG5cdFx0cHJldkNoYWluLnB1c2gocHJldklkeClcblxuXHRcdHZhciBjdXJyTGVuZ3RoID0gKHByZXZJZHggPT0gLTEpID8gMCA6IGxlbmd0aENoYWluW3ByZXZJZHhdKzFcblxuXHRcdGlmIGN1cnJMZW5ndGggPiBtYXhDaGFpbkxlbmd0aFxuXHRcdFx0bWF4Q2hhaW5MZW5ndGggPSBjdXJyTGVuZ3RoXG5cdFx0XHRtYXhDaGFpbkVuZCA9IGlkeFxuXG5cdFx0bGVuZ3RoQ2hhaW4ucHVzaChjdXJyTGVuZ3RoKVxuXG5cdHZhciBzdGlja3lOb2RlcyA9IFtdXG5cblx0IyBOb3cgd2UgY2FuIHdhbGsgdGhlIGxvbmdlc3QgY2hhaW4gYmFja3dhcmRzIGFuZCBtYXJrIHRoZW0gYXMgXCJzdGlja3lcIixcblx0IyB3aGljaCBpbXBsaWVzIHRoYXQgdGhleSBzaG91bGQgbm90IGJlIG1vdmVkXG5cdHZhciBjdXJzb3IgPSBuZXdQb3NpdGlvbjpsZW5ndGggLSAxXG5cdHdoaWxlIGN1cnNvciA+PSAwXG5cdFx0aWYgY3Vyc29yID09IG1heENoYWluRW5kIGFuZCBuZXdQb3NpdGlvbltjdXJzb3JdICE9IC0xXG5cdFx0XHRzdGlja3lOb2Rlc1tuZXdQb3NpdGlvbltjdXJzb3JdXSA9IHRydWVcblx0XHRcdG1heENoYWluRW5kID0gcHJldkNoYWluW21heENoYWluRW5kXVxuXHRcdFxuXHRcdGN1cnNvciAtPSAxXG5cblx0IyBBbmQgbGV0J3MgaXRlcmF0ZSBmb3J3YXJkLCBidXQgb25seSBtb3ZlIG5vbi1zdGlja3kgbm9kZXNcblx0Zm9yIG5vZGUsIGlkeCBpbiBuZXdcblx0XHRpZiAhc3RpY2t5Tm9kZXNbaWR4XVxuXHRcdFx0dmFyIGFmdGVyID0gbmV3W2lkeCAtIDFdXG5cdFx0XHRpbnNlcnROZXN0ZWRBZnRlcihyb290LCBub2RlLCAoYWZ0ZXIgYW5kIGFmdGVyLkBkb20pIG9yIGNhcmV0KVxuXG5cdCMgc2hvdWxkIHRydXN0IHRoYXQgdGhlIGxhc3QgaXRlbSBpbiBuZXcgbGlzdCBpcyB0aGUgY2FyZXRcblx0cmV0dXJuIGxhc3ROZXcgYW5kIGxhc3ROZXcuQGRvbSBvciBjYXJldFxuXG5cbiMgZXhwZWN0cyBhIGZsYXQgbm9uLXNwYXJzZSBhcnJheSBvZiBub2RlcyBpbiBib3RoIG5ldyBhbmQgb2xkLCBhbHdheXNcbmRlZiByZWNvbmNpbGVDb2xsZWN0aW9uIHJvb3QsIG5ldywgb2xkLCBjYXJldFxuXHR2YXIgayA9IG5ldzpsZW5ndGhcblx0dmFyIGkgPSBrXG5cdHZhciBsYXN0ID0gbmV3W2sgLSAxXVxuXG5cblx0aWYgayA9PSBvbGQ6bGVuZ3RoIGFuZCBuZXdbMF0gPT09IG9sZFswXVxuXHRcdCMgcnVubmluZyB0aHJvdWdoIHRvIGNvbXBhcmVcblx0XHR3aGlsZSBpLS1cblx0XHRcdGJyZWFrIGlmIG5ld1tpXSAhPT0gb2xkW2ldXG5cblx0aWYgaSA9PSAtMVxuXHRcdHJldHVybiBsYXN0IGFuZCBsYXN0LkBkb20gb3IgY2FyZXRcblx0ZWxzZVxuXHRcdHJldHVybiByZWNvbmNpbGVDb2xsZWN0aW9uQ2hhbmdlcyhyb290LG5ldyxvbGQsY2FyZXQpXG5cbiMgdGhlIGdlbmVyYWwgcmVjb25jaWxlciB0aGF0IHJlc3BlY3RzIGNvbmRpdGlvbnMgZXRjXG4jIGNhcmV0IGlzIHRoZSBjdXJyZW50IG5vZGUgd2Ugd2FudCB0byBpbnNlcnQgdGhpbmdzIGFmdGVyXG5kZWYgcmVjb25jaWxlTmVzdGVkIHJvb3QsIG5ldywgb2xkLCBjYXJldFxuXG5cdCMgaWYgbmV3ID09IG51bGwgb3IgbmV3ID09PSBmYWxzZSBvciBuZXcgPT09IHRydWVcblx0IyBcdGlmIG5ldyA9PT0gb2xkXG5cdCMgXHRcdHJldHVybiBjYXJldFxuXHQjIFx0aWYgb2xkICYmIG5ldyAhPSBvbGRcblx0IyBcdFx0cmVtb3ZlTmVzdGVkKHJvb3Qsb2xkLGNhcmV0KSBpZiBvbGRcblx0IyBcblx0IyBcdHJldHVybiBjYXJldFxuXG5cdCMgdmFyIHNraXBuZXcgPSBuZXcgPT0gbnVsbCBvciBuZXcgPT09IGZhbHNlIG9yIG5ldyA9PT0gdHJ1ZVxuXHR2YXIgbmV3SXNOdWxsID0gbmV3ID09IG51bGwgb3IgbmV3ID09PSBmYWxzZVxuXHR2YXIgb2xkSXNOdWxsID0gb2xkID09IG51bGwgb3Igb2xkID09PSBmYWxzZVxuXG5cblx0aWYgbmV3ID09PSBvbGRcblx0XHQjIHJlbWVtYmVyIHRoYXQgdGhlIGNhcmV0IG11c3QgYmUgYW4gYWN0dWFsIGRvbSBlbGVtZW50XG5cdFx0IyB3ZSBzaG91bGQgaW5zdGVhZCBtb3ZlIHRoZSBhY3R1YWwgY2FyZXQ/IC0gdHJ1c3Rcblx0XHRpZiBuZXdJc051bGxcblx0XHRcdHJldHVybiBjYXJldFxuXHRcdGVsaWYgbmV3IGFuZCBuZXcuQGRvbVxuXHRcdFx0cmV0dXJuIG5ldy5AZG9tXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIGNhcmV0ID8gY2FyZXQ6bmV4dFNpYmxpbmcgOiByb290LkBkb206Zmlyc3RDaGlsZFxuXG5cdGVsaWYgbmV3IGlzYSBBcnJheVxuXHRcdGlmIG9sZCBpc2EgQXJyYXlcblx0XHRcdGlmIG5ldzpzdGF0aWMgb3Igb2xkOnN0YXRpY1xuXHRcdFx0XHQjIGlmIHRoZSBzdGF0aWMgaXMgbm90IG5lc3RlZCAtIHdlIGNvdWxkIGdldCBhIGhpbnQgZnJvbSBjb21waWxlclxuXHRcdFx0XHQjIGFuZCBqdXN0IHNraXAgaXRcblx0XHRcdFx0aWYgbmV3OnN0YXRpYyA9PSBvbGQ6c3RhdGljXG5cdFx0XHRcdFx0Zm9yIGl0ZW0saSBpbiBuZXdcblx0XHRcdFx0XHRcdCMgdGhpcyBpcyB3aGVyZSB3ZSBjb3VsZCBkbyB0aGUgdHJpcGxlIGVxdWFsIGRpcmVjdGx5XG5cdFx0XHRcdFx0XHRjYXJldCA9IHJlY29uY2lsZU5lc3RlZChyb290LGl0ZW0sb2xkW2ldLGNhcmV0KVxuXHRcdFx0XHRcdHJldHVybiBjYXJldFxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0cmVtb3ZlTmVzdGVkKHJvb3Qsb2xkLGNhcmV0KVxuXHRcdFx0XHRcdFxuXHRcdFx0XHQjIGlmIHRoZXkgYXJlIG5vdCB0aGUgc2FtZSB3ZSBjb250aW51ZSB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiByZWNvbmNpbGVDb2xsZWN0aW9uKHJvb3QsbmV3LG9sZCxjYXJldClcblxuXHRcdGVsaWYgb2xkIGlzYSBJbWJhVGFnXG5cdFx0XHRyb290LnJlbW92ZUNoaWxkKG9sZClcblx0XHRlbGlmICFvbGRJc051bGxcblx0XHRcdCMgb2xkIHdhcyBhIHN0cmluZy1saWtlIG9iamVjdD9cblx0XHRcdHJvb3QucmVtb3ZlQ2hpbGQoY2FyZXQgPyBjYXJldDpuZXh0U2libGluZyA6IHJvb3QuQGRvbTpmaXJzdENoaWxkKVx0XHRcdFxuXG5cdFx0cmV0dXJuIGluc2VydE5lc3RlZEFmdGVyKHJvb3QsbmV3LGNhcmV0KVxuXHRcdCMgcmVtb3ZlIG9sZFxuXG5cdGVsaWYgbmV3IGlzYSBJbWJhVGFnXG5cdFx0cmVtb3ZlTmVzdGVkKHJvb3Qsb2xkLGNhcmV0KSB1bmxlc3Mgb2xkSXNOdWxsXG5cdFx0aW5zZXJ0TmVzdGVkQWZ0ZXIocm9vdCxuZXcsY2FyZXQpXG5cdFx0cmV0dXJuIG5ld1xuXG5cdGVsaWYgbmV3SXNOdWxsXG5cdFx0cmVtb3ZlTmVzdGVkKHJvb3Qsb2xkLGNhcmV0KSB1bmxlc3Mgb2xkSXNOdWxsXG5cdFx0cmV0dXJuIGNhcmV0XG5cdGVsc2Vcblx0XHQjIGlmIG9sZCBkaWQgbm90IGV4aXN0IHdlIG5lZWQgdG8gYWRkIGEgbmV3IGRpcmVjdGx5XG5cdFx0bGV0IG5leHROb2RlXG5cdFx0IyBpZiBvbGQgd2FzIGFycmF5IG9yIGltYmF0YWcgd2UgbmVlZCB0byByZW1vdmUgaXQgYW5kIHRoZW4gYWRkXG5cdFx0aWYgb2xkIGlzYSBBcnJheVxuXHRcdFx0cmVtb3ZlTmVzdGVkKHJvb3Qsb2xkLGNhcmV0KVxuXHRcdGVsaWYgb2xkIGlzYSBJbWJhVGFnXG5cdFx0XHRyb290LnJlbW92ZUNoaWxkKG9sZClcblx0XHRlbGlmICFvbGRJc051bGxcblx0XHRcdCMgLi4uXG5cdFx0XHRuZXh0Tm9kZSA9IGNhcmV0ID8gY2FyZXQ6bmV4dFNpYmxpbmcgOiByb290LkBkb206Zmlyc3RDaGlsZFxuXHRcdFx0aWYgbmV4dE5vZGUgaXNhIFRleHQgYW5kIG5leHROb2RlOnRleHRDb250ZW50ICE9IG5ld1xuXHRcdFx0XHRuZXh0Tm9kZTp0ZXh0Q29udGVudCA9IG5ld1xuXHRcdFx0XHRyZXR1cm4gbmV4dE5vZGVcblxuXHRcdCMgbm93IGFkZCB0aGUgdGV4dG5vZGVcblx0XHRyZXR1cm4gaW5zZXJ0TmVzdGVkQWZ0ZXIocm9vdCxuZXcsY2FyZXQpXG5cblxuZXh0ZW5kIHRhZyBodG1sZWxlbWVudFxuXHRcblx0ZGVmIHNldENoaWxkcmVuIG5ldywgdHlwXG5cdFx0dmFyIG9sZCA9IEBjaGlsZHJlblxuXHRcdCMgdmFyIGlzQXJyYXkgPSBub2RlcyBpc2EgQXJyYXlcblx0XHRpZiBuZXcgPT09IG9sZFxuXHRcdFx0cmV0dXJuIHNlbGZcblxuXHRcdGlmICFvbGRcblx0XHRcdGVtcHR5XG5cdFx0XHRhcHBlbmROZXN0ZWQoc2VsZixuZXcpXG5cblx0XHRlbGlmIHR5cCA9PSAyXG5cdFx0XHRyZXR1cm4gc2VsZlxuXG5cdFx0ZWxpZiB0eXAgPT0gMVxuXHRcdFx0IyBoZXJlIHdlIF9rbm93IF90aGF0IGl0IGlzIGFuIGFycmF5IHdpdGggdGhlIHNhbWUgc2hhcGVcblx0XHRcdCMgZXZlcnkgdGltZVxuXHRcdFx0bGV0IGNhcmV0ID0gbnVsbFxuXHRcdFx0Zm9yIGl0ZW0saSBpbiBuZXdcblx0XHRcdFx0IyBwcmV2ID0gb2xkW2ldXG5cdFx0XHRcdGNhcmV0ID0gcmVjb25jaWxlTmVzdGVkKHNlbGYsaXRlbSxvbGRbaV0sY2FyZXQpXG5cblx0XHRlbGlmIHR5cCA9PSAzXG5cdFx0XHQjIHRoaXMgaXMgcG9zc2libHkgZnVsbHkgZHluYW1pYy4gSXQgb2Z0ZW4gaXNcblx0XHRcdCMgYnV0IHRoZSBvbGQgb3IgbmV3IGNvdWxkIGJlIHN0YXRpYyB3aGlsZSB0aGUgb3RoZXIgaXMgbm90XG5cdFx0XHQjIHRoaXMgaXMgbm90IGhhbmRsZWQgbm93XG5cdFx0XHQjIHdoYXQgaWYgaXQgd2FzIHByZXZpb3VzbHkgYSBzdGF0aWMgYXJyYXk/IGVkZ2VjYXNlIC0gYnV0IG11c3Qgd29ya1xuXHRcdFx0aWYgbmV3IGlzYSBJbWJhVGFnXG5cdFx0XHRcdGVtcHR5XG5cdFx0XHRcdGFwcGVuZENoaWxkKG5ldylcblxuXHRcdFx0IyBjaGVjayBpZiBvbGQgYW5kIG5ldyBpc2EgYXJyYXlcblx0XHRcdGVsaWYgbmV3IGlzYSBBcnJheVxuXHRcdFx0XHRpZiBvbGQgaXNhIEFycmF5XG5cdFx0XHRcdFx0IyBpcyB0aGlzIG5vdCB0aGUgc2FtZSBhcyBzZXR0aW5nIHN0YXRpY0NoaWxkcmVuIG5vdyBidXQgd2l0aCB0aGVcblx0XHRcdFx0XHRyZWNvbmNpbGVDb2xsZWN0aW9uKHNlbGYsbmV3LG9sZCxudWxsKVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ZW1wdHlcblx0XHRcdFx0XHRhcHBlbmROZXN0ZWQoc2VsZixuZXcpXG5cdFx0XHRcdFxuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0ZXh0ID0gbmV3XG5cdFx0XHRcdHJldHVybiBzZWxmXG5cblx0XHRlbGlmIG5ldyBpc2EgQXJyYXkgYW5kIG9sZCBpc2EgQXJyYXlcblx0XHRcdHJlY29uY2lsZUNvbGxlY3Rpb24oc2VsZixuZXcsb2xkLG51bGwpXG5cdFx0ZWxzZVxuXHRcdFx0ZW1wdHlcblx0XHRcdGFwcGVuZE5lc3RlZChzZWxmLG5ldylcblxuXHRcdEBjaGlsZHJlbiA9IG5ld1xuXHRcdHJldHVybiBzZWxmXG5cblxuXHQjIG9ubHkgZXZlciBjYWxsZWQgd2l0aCBhcnJheSBhcyBhcmd1bWVudFxuXHRkZWYgc2V0U3RhdGljQ2hpbGRyZW4gbmV3XG5cdFx0dmFyIG9sZCA9IEBjaGlsZHJlblxuXG5cdFx0bGV0IGNhcmV0ID0gbnVsbFxuXHRcdGZvciBpdGVtLGkgaW4gbmV3XG5cdFx0XHQjIHByZXYgPSBvbGRbaV1cblx0XHRcdGNhcmV0ID0gcmVjb25jaWxlTmVzdGVkKHNlbGYsaXRlbSxvbGRbaV0sY2FyZXQpXG5cblx0XHRAY2hpbGRyZW4gPSBuZXdcblx0XHRyZXR1cm4gc2VsZlxuXG5cdGRlZiBjb250ZW50XG5cdFx0QGNvbnRlbnQgb3IgY2hpbGRyZW4udG9BcnJheVxuXG5cdGRlZiB0ZXh0PSB0ZXh0XG5cdFx0aWYgdGV4dCAhPSBAY2hpbGRyZW5cblx0XHRcdEBjaGlsZHJlbiA9IHRleHRcblx0XHRcdGRvbTp0ZXh0Q29udGVudCA9IHRleHQgPT0gbnVsbCBvciB0ZXh0ID09PSBmYWxzZSA/ICcnIDogdGV4dFxuXHRcdHNlbGZcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBzcmMvaW1iYS9kb20uc3RhdGljLmltYmFcbiAqKi8iLCJcbiMjI1xuVGhlIHNwZWNpYWwgc3ludGF4IGZvciBzZWxlY3RvcnMgaW4gSW1iYSBjcmVhdGVzIEltYmEuU2VsZWN0b3Jcbmluc3RhbmNlcy5cbiMjI1xuY2xhc3MgSW1iYS5TZWxlY3RvclxuXHRcblx0ZGVmIHNlbGYub25lIHNlbCwgc2NvcGVcblx0XHR2YXIgZWwgPSAoc2NvcGUgfHwgSW1iYS5kb2N1bWVudCkucXVlcnlTZWxlY3RvcihzZWwpXG5cdFx0ZWwgJiYgdGFnKGVsKSB8fCBudWxsXG5cblx0ZGVmIHNlbGYuYWxsIHNlbCwgc2NvcGVcblx0XHRJbWJhLlNlbGVjdG9yLm5ldyhzZWwsc2NvcGUpXG5cblx0cHJvcCBxdWVyeVxuXG5cdGRlZiBpbml0aWFsaXplIHNlbCwgc2NvcGUsIG5vZGVzXG5cblx0XHRAcXVlcnkgPSBzZWwgaXNhIEltYmEuU2VsZWN0b3IgPyBzZWwucXVlcnkgOiBzZWxcblx0XHRAY29udGV4dCA9IHNjb3BlXG5cblx0XHRpZiBub2Rlc1xuXHRcdFx0QG5vZGVzID0gKHRhZyhub2RlKSBmb3Igbm9kZSBpbiBub2RlcylcblxuXHRcdEBsYXp5ID0gIW5vZGVzXG5cdFx0cmV0dXJuIHNlbGZcblxuXHRkZWYgcmVsb2FkXG5cdFx0QG5vZGVzID0gbnVsbFxuXHRcdHNlbGZcblxuXHRkZWYgc2NvcGVcblx0XHRyZXR1cm4gQHNjb3BlIGlmIEBzY29wZVxuXHRcdHJldHVybiBJbWJhLmRvY3VtZW50IHVubGVzcyB2YXIgY3R4ID0gQGNvbnRleHRcblx0XHRAc2NvcGUgPSBjdHg6dG9TY29wZSA/IGN0eC50b1Njb3BlIDogY3R4XG5cblx0IyMjXG5cdEByZXR1cm5zIHtJbWJhLlRhZ30gZmlyc3Qgbm9kZSBtYXRjaGluZyB0aGlzIHNlbGVjdG9yXG5cdCMjI1xuXHRkZWYgZmlyc3Rcblx0XHRpZiBAbGF6eSB0aGVuIHRhZyhAZmlyc3QgfHw9IHNjb3BlLnF1ZXJ5U2VsZWN0b3IocXVlcnkpKVxuXHRcdGVsc2Ugbm9kZXNbMF1cblxuXHQjIyNcblx0QHJldHVybnMge0ltYmEuVGFnfSBsYXN0IG5vZGUgbWF0Y2hpbmcgdGhpcyBzZWxlY3RvclxuXHQjIyNcblx0ZGVmIGxhc3Rcblx0XHRub2Rlc1tAbm9kZXM6bGVuZ3RoIC0gMV1cblxuXHQjIyNcblx0QHJldHVybnMgW0ltYmEuVGFnXSBhbGwgbm9kZXMgbWF0Y2hpbmcgdGhpcyBzZWxlY3RvclxuXHQjIyNcblx0ZGVmIG5vZGVzXG5cdFx0cmV0dXJuIEBub2RlcyBpZiBAbm9kZXNcblx0XHR2YXIgaXRlbXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KVxuXHRcdEBub2RlcyA9ICh0YWcobm9kZSkgZm9yIG5vZGUgaW4gaXRlbXMpXG5cdFx0QGxhenkgPSBub1xuXHRcdEBub2Rlc1xuXHRcblx0IyMjXG5cdFRoZSBudW1iZXIgb2Ygbm9kZXMgbWF0Y2hpbmcgdGhpcyBzZWxlY3RvclxuXHQjIyNcblx0ZGVmIGNvdW50IGRvIG5vZGVzOmxlbmd0aFxuXG5cdGRlZiBsZW4gZG8gbm9kZXM6bGVuZ3RoXG5cblx0IyMjXG5cdEB0b2RvIEFkZCBzdXBwb3J0IGZvciBibG9jayBvciBzZWxlY3Rvcj9cblx0IyMjXG5cdGRlZiBzb21lXG5cdFx0Y291bnQgPj0gMVxuXHRcblx0IyMjXG5cdEdldCBub2RlIGF0IGluZGV4XG5cdCMjI1xuXHRkZWYgYXQgaWR4XG5cdFx0bm9kZXNbaWR4XVxuXG5cdCMjI1xuXHRMb29wIHRocm91Z2ggbm9kZXNcblx0IyMjXG5cdGRlZiBmb3JFYWNoIGJsb2NrXG5cdFx0bm9kZXMuZm9yRWFjaChibG9jaylcblx0XHRzZWxmXG5cblx0IyMjXG5cdE1hcCBub2Rlc1xuXHQjIyNcblx0ZGVmIG1hcCBibG9ja1xuXHRcdG5vZGVzLm1hcChibG9jaylcblxuXHQjIyNcblx0UmV0dXJucyBhIHBsYWluIGFycmF5IGNvbnRhaW5pbmcgbm9kZXMuIEltcGxpY2l0bHkgY2FsbGVkXG5cdHdoZW4gaXRlcmF0aW5nIG92ZXIgYSBzZWxlY3RvciBpbiBJbWJhIGAobm9kZSBmb3Igbm9kZSBpbiAkKHNlbGVjdG9yKSlgXG5cdCMjI1xuXHRkZWYgdG9BcnJheVxuXHRcdG5vZGVzXG5cdFxuXHQjIEdldCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLCBcblx0IyBiZWdpbm5pbmcgYXQgdGhlIGN1cnJlbnQgZWxlbWVudCBhbmQgcHJvZ3Jlc3NpbmcgdXAgdGhyb3VnaCB0aGUgRE9NIHRyZWVcblx0ZGVmIGNsb3Nlc3Qgc2VsXG5cdFx0IyBzZWVtcyBzdHJhbmdlIHRoYXQgd2UgYWx0ZXIgdGhpcyBzZWxlY3Rvcj9cblx0XHRAbm9kZXMgPSBtYXAgZG8gfG5vZGV8IG5vZGUuY2xvc2VzdChzZWwpXG5cdFx0c2VsZlxuXG5cdCMgR2V0IHRoZSBzaWJsaW5ncyBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCBvZiBtYXRjaGVkIGVsZW1lbnRzLCBcblx0IyBvcHRpb25hbGx5IGZpbHRlcmVkIGJ5IGEgc2VsZWN0b3IuXG5cdCMgVE9ETyByZW1vdmUgZHVwbGljYXRlcz9cblx0ZGVmIHNpYmxpbmdzIHNlbFxuXHRcdEBub2RlcyA9IG1hcCBkbyB8bm9kZXwgbm9kZS5zaWJsaW5ncyhzZWwpXG5cdFx0c2VsZlxuXG5cdCMgR2V0IHRoZSBkZXNjZW5kYW50cyBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgc2V0IG9mIG1hdGNoZWQgXG5cdCMgZWxlbWVudHMsIGZpbHRlcmVkIGJ5IGEgc2VsZWN0b3IuXG5cdGRlZiBmaW5kIHNlbFxuXHRcdEBub2RlcyA9IF9fcXVlcnlfXyhzZWwucXVlcnksIG5vZGVzKVxuXHRcdHNlbGZcblxuXHRkZWYgcmVqZWN0IGJsa1xuXHRcdGZpbHRlcihibGssbm8pXG5cblx0IyMjXG5cdEZpbHRlciB0aGUgbm9kZXMgaW4gc2VsZWN0b3IgYnkgYSBmdW5jdGlvbiBvciBvdGhlciBzZWxlY3RvclxuXHQjIyNcblx0ZGVmIGZpbHRlciBibGssIGJvb2wgPSB5ZXNcblx0XHR2YXIgZm4gPSBibGsgaXNhIEZ1bmN0aW9uIGFuZCBibGsgb3IgKHxufCBuLm1hdGNoZXMoYmxrKSApXG5cdFx0dmFyIGFyeSA9IG5vZGVzLmZpbHRlcih8bnwgZm4obikgPT0gYm9vbClcblx0XHQjIGlmIHdlIHdhbnQgdG8gcmV0dXJuIGEgbmV3IHNlbGVjdG9yIGZvciB0aGlzLCB3ZSBzaG91bGQgZG8gdGhhdCBmb3Jcblx0XHQjIG90aGVycyBhcyB3ZWxsXG5cdFx0SW1iYS5TZWxlY3Rvci5uZXcoXCJcIiwgQHNjb3BlLCBhcnkpXG5cblx0ZGVmIF9fcXVlcnlfXyBxdWVyeSwgY29udGV4dHNcblx0XHR2YXIgbm9kZXMgPSBbXVxuXHRcdHZhciBpID0gMFxuXHRcdHZhciBsID0gY29udGV4dHM6bGVuZ3RoXG5cblx0XHR3aGlsZSBpIDwgbFxuXHRcdFx0bm9kZXMucHVzaCgqY29udGV4dHNbaSsrXS5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSlcblx0XHRyZXR1cm4gbm9kZXNcblxuXHRkZWYgX19tYXRjaGVzX19cblx0XHRyZXR1cm4geWVzXG5cblx0IyMjXG5cdEFkZCBzcGVjaWZpZWQgZmxhZyB0byBhbGwgbm9kZXMgaW4gc2VsZWN0b3Jcblx0IyMjXG5cdGRlZiBmbGFnIGZsYWdcblx0XHRmb3JFYWNoIGRvIHxufCBuLmZsYWcoZmxhZylcblxuXHQjIyNcblx0UmVtb3ZlIHNwZWNpZmllZCBmbGFnIGZyb20gYWxsIG5vZGVzIGluIHNlbGVjdG9yXG5cdCMjI1xuXHRkZWYgdW5mbGFnIGZsYWdcblx0XHRmb3JFYWNoIGRvIHxufCBuLnVuZmxhZyhmbGFnKVxuXG5cbiMgZGVmIEltYmEucXVlcnlTZWxlY3RvckFsbFxucSQgPSBkbyB8c2VsLHNjb3BlfCBJbWJhLlNlbGVjdG9yLm5ldyhzZWwsIHNjb3BlKVxuXG4jIGRlZiBJbWJhLlNlbGVjdG9yLm9uZVxucSQkID0gZG8gfHNlbCxzY29wZXwgXG5cdHZhciBlbCA9IChzY29wZSB8fCBJbWJhLmRvY3VtZW50KS5xdWVyeVNlbGVjdG9yKHNlbClcblx0ZWwgJiYgdGFnKGVsKSB8fCBuaWxcblxuXG4jIGV4dGVuZGluZyB0YWdzIHdpdGggcXVlcnktbWV0aG9kc1xuIyBtdXN0IGJlIGEgYmV0dGVyIHdheSB0byByZW9wZW4gY2xhc3Nlc1xuZXh0ZW5kIHRhZyBlbGVtZW50XG5cdGRlZiBxdWVyeVNlbGVjdG9yQWxsIHEgZG8gQGRvbS5xdWVyeVNlbGVjdG9yQWxsIHFcblx0ZGVmIHF1ZXJ5U2VsZWN0b3IgcSBkbyBAZG9tLnF1ZXJ5U2VsZWN0b3IgcVxuXG5cdCMgc2hvdWxkIGJlIG1vdmVkIHRvIEltYmEuVGFnIGluc3RlYWQ/XG5cdCMgb3Igd2Ugc2hvdWxkIGltcGxlbWVudCBhbGwgb2YgdGhlbSBoZXJlXG5cdGRlZiBmaW5kIHNlbCBkbyBJbWJhLlNlbGVjdG9yLm5ldyhzZWwsc2VsZilcblxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogc3JjL2ltYmEvc2VsZWN0b3IuaW1iYVxuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=
         | 
| 4152 | 
            +
            /******/ ]);
         |